libgdiplus-2.11/0000775000175000017500000000000012225470636010605 500000000000000libgdiplus-2.11/INSTALL0000664000175000017500000002243212225470167011560 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Here is a another example: /bin/bash ./configure CONFIG_SHELL=/bin/bash Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent configuration-related scripts to be executed by `/bin/bash'. `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. libgdiplus-2.11/README0000664000175000017500000000144412225470167011407 00000000000000libgdiplus: An Open Source implementation of the GDI+ API. This is part of the Mono project - http://mono-project.com Requirements: This requires the libraries used by the Cairo vector graphics library to build (freetype2, fontconfig, Xft2 and libpng, basically). See cairo/README. Note that libpixman is included in this package already. If the system cairo is newer than the bundled version (1.6.4) provided by libgdiplus then the newer version will be used To build: ./configure --prefix=YOUPREFIX make To install: make install Optional build options [UNSUPPORTED] --with-pango This build libgdiplus using Pango to render (measure and draw) all of it's text. This can only be enabled if libgdiplus is built with the *system* cairo and requires Pango version 1.10 (or later). libgdiplus-2.11/TODO0000664000175000017500000000430212225470167011213 00000000000000This file has a list of functionality not yet implemented or issues that have to be fixed in libgdiplus. ---- Functionality not implemented * Image formats - WMF and EMF. We have limited support metafiles. ---- Not implemented / partially implemented functions * Handle functions Functions that use or create Win32 handles and are not yet implemented (except for window and device needed in System.Windows.Forms.) GdipCreateBitmapFromResource GdipCreateFontFromDC GdipCreateFromHWND * Generic functions GdipBeginContainer2 GdipBeginContainerI GdipGetPixelOffsetMode [2] GdipGetTextContrast [2] GdipSetPixelOffsetMode [2] GdipSetTextContrast [2] GdipTransformPoints GdipTransformPointsI * Image handeling GdipSetImageAttributesThreshold GdipSetImageAttributesOutputChannelColorProfile GdipGetImageAttributesAdjustedPalette GdipSetImageAttributesOutputChannel GdipLoadImageFromStream GdipSaveImageToStream GdipSaveAdd GdipSaveAddImage * Pens and brushes GdipSetPenDashCap197819 [2] GdipGetPenDashCap197819 [2] GdipSetPenCustomStartCap [3] GdipGetPenCustomStartCap [3] GdipSetPenCustomEndCap [3] GdipGetPenCustomEndCap [3] * Functions related to paths GdipAddString [1] GdipAddStringI [1] GdipIsOutlineVisiblePathPoint [4] GdipIsOutlineVisiblePathPointI [4] GdipIsVisiblePathPoint [4] GdipIsVisiblePathPointI [4] GdipWindingModeOutline GdipWidenPath GdipWarpPath Notes [1] Partially implemented. LayoutRect and StringFormat are ignored. [2] Function exists (return Ok) but doesn't do anything (visually or not) [3] Function exists (return Ok) but only display a warning on the console [4] Partially implemented. GpGraphics is ignored. ---- Known Limitations * Maximum of 32bpp GDI+ supports bitmaps with more than 32bpp. http://bugzilla.ximian.com/show_bug.cgi?id=80693 * Coordinates limitations GDI+ supports 32bips of precision (Cairo is limited to 15bits) http://bugzilla.ximian.com/show_bug.cgi?id=79729 * Cairo doesn't support 8-bit pseudocolor visuals http://bugzilla.ximian.com/show_bug.cgi?id=77937 * Cairo doesn't implement cairo_stroke_to_path GdipWidenPath implementation depends on this feature. http://bugzilla.ximian.com/show_bug.cgi?id=78110 ---- last updated: August 9th, 2007 libgdiplus-2.11/Makefile.in0000664000175000017500000006575112225470350012601 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/libgdiplus.pc.in $(srcdir)/libgdiplus0.spec.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ TODO config.guess config.sub depcomp install-sh ltmain.sh \ missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = libgdiplus.pc libgdiplus0.spec CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(pkgconfigdir)" DATA = $(pkgconfig_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPENDENCIES_CFLAGS = @BASE_DEPENDENCIES_CFLAGS@ BASE_DEPENDENCIES_LIBS = @BASE_DEPENDENCIES_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_DIR = @CAIRO_DIR@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ FONTCONFIG_CONFIG = @FONTCONFIG_CONFIG@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ FREETYPE2_LIBS = @FREETYPE2_LIBS@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@ GDIPLUS_LIBS = @GDIPLUS_LIBS@ GDIPLUS_PKG_CFLAGS = @GDIPLUS_PKG_CFLAGS@ GDIPLUS_PKG_LIBS = @GDIPLUS_PKG_LIBS@ GDIPLUS_PKG_REQ = @GDIPLUS_PKG_REQ@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBEXIF_CFLAGS = @LIBEXIF_CFLAGS@ LIBEXIF_LIBS = @LIBEXIF_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = @CAIRO_DIR@ src tests DIST_SUBDIRS = pixman cairo src tests pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libgdiplus.pc DISTCLEANFILES = libgdiplus.pc EXTRA_DIST = libgdiplus.pc.in LICENSE MPL-1.1.html all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 libgdiplus.pc: $(top_builddir)/config.status $(srcdir)/libgdiplus.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libgdiplus0.spec: $(top_builddir)/config.status $(srcdir)/libgdiplus0.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(pkgconfigdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-pkgconfigDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-pkgconfigDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-pkgconfigDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/pixman/0000775000175000017500000000000012225470634012077 500000000000000libgdiplus-2.11/pixman/INSTALL0000664000175000017500000002231012225470167013047 00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. libgdiplus-2.11/pixman/README0000664000175000017500000000133212225470167012677 00000000000000pixman is a library that provides low-level pixel manipulation features such as image compositing and trapezoid rasterization. Please submit bugs & patches to the libpixman bugzilla: https://bugs.freedesktop.org/enter_bug.cgi?product=libpixman All questions regarding this software should be directed to either the Xorg mailing list: http://lists.freedesktop.org/mailman/listinfo/xorg or the cairo mailing list: http://lists.freedesktop.org/mailman/listinfo/cairo The master development code repository can be found at: git://anongit.freedesktop.org/git/pixman http://gitweb.freedesktop.org/?p=pixman;a=summary For more information on the git code manager, see: http://wiki.x.org/wiki/GitPage libgdiplus-2.11/pixman/TODO0000664000175000017500000001575712225470167012527 00000000000000 - Update the RLEASING file - Things to keep in mind if breaking ABI: - There should be a guard #ifndef I_AM_EITHER_CAIRO_OR_THE_X_SERVER - X server will require 16.16 essentially forever. Can we get the required precision by simply adding offset_x/y to the relevant rendering API? - pixman_image_set_indexed() should copy its argument, and X should be ported over to use a pixman_image as the representation of a Picture, rather than creating one on each operation. - We should get rid of pixman_set_static_pointers() - We should get rid of the various trapezoid helper functions(). (They only exist because they are theoretically available to drivers). - Regions should become 32 bit - There should only be one trap rasterization API. - The PIXMAN_g8/c8/etc formats should use the A channel to indicate the actual depth. That way PIXMAN_x4c4 and PIXMAN_c8 won't collide. - Make pixman_region_point_in() survive a NULL box, then fix up pixman-compose.c - Test suite - Add a general way of dealing with architecture specific fast-paths. The current idea is to have each operation that can be optimized is called through a function pointer that is initially set to an initialization function that is responsible for setting the function pointer to the appropriate fast-path. - Go through things marked FIXME - Add calls to prepare and finish access where necessary. grep for ACCESS_MEM, and make sure they are correctly wrapped in prepare and finish. - restore READ/WRITE in the fbcompose combiners since they sometimes store directly to destination drawables. - It probably makes sense to move the more strange X region API into pixman as well, but guarded with PIXMAN_XORG_COMPATIBILITY - Reinstate the FbBits typedef? At the moment we don't even have the FbBits type; we just use uint32_t everywhere. Keith says in bug 2335: The 64-bit code in fb (pixman) is probably broken; it hasn't been used in quite some time as PCI (and AGP) is 32-bits wide, so doing things 64-bits at a time is a net loss. To quickly fix this, I suggest just using 32-bit datatypes by setting IC_SHIFT to 5 for all machines. - Consider whether calling regions region16 is really such a great idea. Vlad wants 32 bit regions for Cairo. This will break X server ABI, but should otherwise be mostly harmless, though a pixman_region_get_boxes16() may be useful. - Consider optimizing the 8/16 bit solid fills in pixman-util.c by storing more than one value at a time. - Add an image cache to prevent excessive malloc/free. Note that pixman needs to be thread safe when used from cairo. - Moving to 24.8 coordinates. This is tricky because X is still defined as 16.16 and will be basically forever. It's possible we could do this by adding extra offset_x/y parameters to the trapezoid calls. The X server could then just call the API with (0, 0). Cairo would have to make sure that the delta *within* a batch of trapezoids does not exceed 16 bit. - Review the pixman_format_code_t enum to make sure it will support future formats. Some formats we will probably need: ARGB/ABGR with 16/32/64 bit integer/floating channels YUV2, YV12 Also we may need the ability to distinguish between PICT_c8 and PICT_x4c4. (This could be done by interpreting the A channel as the depth for TYPE_COLOR and TYPE_GRAY formats). A possibility may be to reserve the two top bits and make them encode "number of places to shift the channel widths given" Since these bits are 00 at the moment everything will continue to work, but these additional widths will be allowed: All even widths between 18-32 All multiples of four widths between 33 and 64 All multiples of eight between 64 and 128 This means things like r21g22b21 won't work - is that worth worrying about? I don't think so. And of course the bpp field can't handle a depth of over 256, so > 64 bit channels arent' really all that useful. We could reserve one extra bit to indicate floating point, but we may also just add PIXMAN_TYPE_ARGB_FLOAT PIXMAN_TYPE_BGRA_FLOAT PIXMAN_TYPE_A_FLOAT image types. With five bits we can support up to 32 different format types, which should be enough for everybody, even if we decide to support all the various video formats here: http://www.fourcc.org/yuv.php It may make sense to have a PIXMAN_TYPE_YUV, and then use the channel bits to specify the exact subtype. Another possibility is to add PIXMAN_TYPE_ARGB_W PIXMAN_TYPE_ARGB_WW where the channel widths would get 16 and 32 added to them, respectively. What about color spaces such a linear vs. srGB etc.? done: - Get rid of the switch-of-doom; replace it with a big table describing the various fast paths. - Make source clipping optional. - done: source clipping happens through an indirection. still needs to make the indirection settable. (And call it from X) - Run cairo test suite; fix bugs - one bug in source-scale-clip - Remove the warning suppression in the ACCESS_MEM macro and fix the warnings that are real - irrelevant now. - make the wrapper functions global instead of image specific - this won't work since pixman is linked to both fb and wfb - Add non-mmx solid fill - Make sure the endian-ness macros are defined correctly. - The rectangles in a region probably shouldn't be returned const as the X server will be changing them. - Right now we _always_ have a clip region, which is empty by default. Why does this work at all? It probably doesn't. The server distinguishes two cases, one where nothing is clipped (CT_NONE), and one where there is a clip region (CT_REGION). - Default clip region should be the full image - Test if pseudo color still works. It does, but it also shows that copying a pixman_indexed_t on every composite operation is not going to fly. So, for now set_indexed() does not copy the indexed table. Also just the malloc() to allocate a pixman image shows up pretty high. Options include - Make all the setters not copy their arguments - Possibly combined with going back to the stack allocated approach that we already use for regions. - Keep a cached pixman_image_t around for every picture. It would have to be kept uptodate every time something changes about the picture. - Break the X server ABI and simply have the relevant parameter stored in the pixman image. This would have the additional benefits that: - We can get rid of the annoying repeat field which is duplicated elsewhere. - We can use pixman_color_t and pixman_gradient_stop_t etc. instead of the types that are defined in renderproto.h libgdiplus-2.11/pixman/Makefile.in0000664000175000017500000007035412225470236014073 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(srcdir)/pixman-1.pc.in $(top_srcdir)/configure AUTHORS \ COPYING ChangeLog INSTALL NEWS TODO config.guess config.sub \ depcomp install-sh ltmain.sh missing ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = pixman-1.pc CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(noinst_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEP_CFLAGS = @DEP_CFLAGS@ DEP_LIBS = @DEP_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_INFO = @LT_VERSION_INFO@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MMX_CFLAGS = @MMX_CFLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PIXMAN_VERSION_MAJOR = @PIXMAN_VERSION_MAJOR@ PIXMAN_VERSION_MICRO = @PIXMAN_VERSION_MICRO@ PIXMAN_VERSION_MINOR = @PIXMAN_VERSION_MINOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE_CFLAGS = @SSE_CFLAGS@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = pixman #pkgconfigdir=$(libdir)/pkgconfig noinst_DATA = pixman-1.pc USERNAME = $$USER RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) RELEASE_CAIRO_HOST = $(USERNAME)@cairographics.org RELEASE_CAIRO_DIR = /srv/cairo.freedesktop.org/www/releases RELEASE_CAIRO_URL = http://cairographics.org/releases RELEASE_XORG_URL = http://xorg.freedesktop.org/archive/individual/lib RELEASE_XORG_HOST = $(USERNAME)@xorg.freedesktop.org RELEASE_XORG_DIR = /srv/xorg.freedesktop.org/archive/individual/lib RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org, xorg-announce@lists.freedesktop.org tar_gz = $(PACKAGE)-$(VERSION).tar.gz tar_bz2 = $(PACKAGE)-$(VERSION).tar.bz2 sha1_tgz = $(tar_gz).sha1 md5_tgz = $(tar_gz).md5 sha1_tbz2 = $(tar_bz2).sha1 md5_tbz2 = $(tar_bz2).md5 gpg_file = $(sha1_tgz).asc all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 pixman-1.pc: $(top_builddir)/config.status $(srcdir)/pixman-1.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ dist-xz \ dist-zip distcheck distclean distclean-generic distclean-hdr \ distclean-libtool distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-recursive uninstall uninstall-am $(pkgconfig_DATA): pixman-1.pc.in snapshot: distdir="$(distdir)-`date '+%Y%m%d'`"; \ test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git-rev-parse HEAD | cut -c 1-6`; \ $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" dist $(sha1_tgz): $(tar_gz) sha1sum $^ > $@ $(md5_tgz): $(tar_gz) md5sum $^ > $@ $(sha1_tbz2): $(tar_bz2) sha1sum $^ > $@ $(md5_tbz2): $(tar_bz2) md5sum $^ > $@ $(gpg_file): $(sha1_tgz) @echo "Please enter your GPG password to sign the checksum." gpg --armor --sign $^ release-verify-newer: @echo -n "Checking that no $(VERSION) release already exists at $(RELEASE_XORG_HOST)..." @ssh $(RELEASE_XORG_HOST) test ! -e $(RELEASE_XORG_DIR)/$(tar_gz) \ || (echo "Ouch." && echo "Found: $(RELEASE_XORG_HOST):$(RELEASE_XORG_DIR)/$(tar_gz)" \ && echo "Refusing to try to generate a new release of the same name." \ && false) @ssh $(RELEASE_CAIRO_HOST) test ! -e $(RELEASE_CAIRO_DIR)/$(tar_gz) \ || (echo "Ouch." && echo "Found: $(RELEASE_CAIRO_HOST):$(RELEASE_CAIRO_DIR)/$(tar_gz)" \ && echo "Refusing to try to generate a new release of the same name." \ && false) @echo "Good." release-remove-old: $(RM) $(tar_gz) $(tar_bz2) $(sha1_tgz) $(gpg_file) ensure-prev: @if [[ "$(PREV)" == "" ]]; then \ echo "" && \ echo "You must set the PREV variable on the make command line to" && \ echo "the git tag of the last release." && \ echo "" && \ echo "For example:" && \ echo " make PREV=pixman-0.7.3" && \ echo "" && \ false; \ fi release-check: ensure-prev release-verify-newer release-remove-old distcheck release-upload: release-check $(tar_gz) $(tar_bz2) $(sha1_tgz) $(gpg_file) mkdir -p releases scp $(tar_gz) $(sha1_tgz) $(gpg_file) $(RELEASE_CAIRO_HOST):$(RELEASE_CAIRO_DIR) scp $(tar_gz) $(tar_bz2) $(RELEASE_XORG_HOST):$(RELEASE_XORG_DIR) ssh $(RELEASE_CAIRO_HOST) "rm -f $(RELEASE_CAIRO_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_gz) $(RELEASE_CAIRO_DIR)/LATEST-$(PACKAGE)-$(VERSION)" git-tag -s -m "$(PACKAGE) $(VERSION) release" $(PACKAGE)-$(VERSION) release-publish-message: $(sha1_tgz) $(md5_tgz) $(sha1_tbz2) $(md5_tbz2) ensure-prev @echo "Please follow the instructions in RELEASING to push stuff out and" @echo "send out the announcement mails. Here is the excerpt you need:" @echo "" @echo "Lists: $(RELEASE_ANNOUNCE_LIST)" @echo "Subject: [ANNOUNCE] $(PACKAGE) release $(VERSION) now available" @echo "============================== CUT HERE ==============================" @echo "A new $(PACKAGE) release $(VERSION) is now available" @echo "" @echo "tar.gz:" @echo " $(RELEASE_CAIRO_URL)/$(tar_gz)" @echo " $(RELEASE_XORG_URL)/$(tar_gz)" @echo "" @echo "tar.bz2:" @echo " $(RELEASE_XORG_URL)/$(tar_bz2)" @echo "" @echo "Hashes:" @echo -n " MD5: " @cat $(md5_tgz) @echo -n " MD5: " @cat $(md5_tbz2) @echo -n " SHA1: " @cat $(sha1_tgz) @echo -n " SHA1: " @cat $(sha1_tbz2) @echo "" @echo "GPG signature:" @echo " $(RELEASE_CAIRO_URL)/$(gpg_file)" @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" @echo "" @echo "Git:" @echo " git://git.freedesktop.org/git/pixman" @echo " tag: $(PACKAGE)-$(VERSION)" @echo "" @echo "Log:" @git-log --no-merges "$(PACKAGE)-$(PREV)".."$(PACKAGE)-$(VERSION)" | git shortlog | awk '{ printf "\t"; print ; }' | cut -b0-80 @echo "============================== CUT HERE ==============================" @echo "" release-publish: release-upload release-publish-message .PHONY: release-upload release-publish release-publish-message # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/pixman/pixman/0000775000175000017500000000000012225470635013374 500000000000000libgdiplus-2.11/pixman/pixman/pixman-edge-accessors.c0000664000175000017500000000006712225470167017644 00000000000000 #define PIXMAN_FB_ACCESSORS #include "pixman-edge.c" libgdiplus-2.11/pixman/pixman/pixman-access.c0000664000175000017500000014360012225470167016217 00000000000000/* * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * 2005 Lars Knoll & Zack Rusin, Trolltech * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" #ifdef PIXMAN_FB_ACCESSORS #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture_accessors #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture_accessors #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture_accessors #else #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture #endif /* * YV12 setup and access macros */ #define YV12_SETUP(pict) \ uint32_t *bits = pict->bits; \ int stride = pict->rowstride; \ int offset0 = stride < 0 ? \ ((-stride) >> 1) * ((pict->height - 1) >> 1) - stride : \ stride * pict->height; \ int offset1 = stride < 0 ? \ offset0 + ((-stride) >> 1) * ((pict->height) >> 1) : \ offset0 + (offset0 >> 2) /* Note n trailing semicolon on the above macro; if it's there, then * the typical usage of YV12_SETUP(pict); will have an extra trailing ; * that some compilers will interpret as a statement -- and then any further * variable declarations will cause an error. */ #define YV12_Y(line) \ ((uint8_t *) ((bits) + (stride) * (line))) #define YV12_U(line) \ ((uint8_t *) ((bits) + offset1 + \ ((stride) >> 1) * ((line) >> 1))) #define YV12_V(line) \ ((uint8_t *) ((bits) + offset0 + \ ((stride) >> 1) * ((line) >> 1))) /*********************************** Fetch ************************************/ static FASTCALL void fbFetch_a8r8g8b8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; MEMCPY_WRAPPED(pict, buffer, (const uint32_t *)bits + x, width*sizeof(uint32_t)); } static FASTCALL void fbFetch_x8r8g8b8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint32_t *pixel = (const uint32_t *)bits + x; const uint32_t *end = pixel + width; while (pixel < end) { *buffer++ = READ(pict, pixel++) | 0xff000000; } } static FASTCALL void fbFetch_a8b8g8r8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint32_t *pixel = (uint32_t *)bits + x; const uint32_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); *buffer++ = (p & 0xff00ff00) | ((p >> 16) & 0xff) | ((p & 0xff) << 16); } } static FASTCALL void fbFetch_x8b8g8r8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint32_t *pixel = (uint32_t *)bits + x; const uint32_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); *buffer++ = 0xff000000 | (p & 0x0000ff00) | ((p >> 16) & 0xff) | ((p & 0xff) << 16); } } static FASTCALL void fbFetch_r8g8b8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + 3*x; const uint8_t *end = pixel + 3*width; while (pixel < end) { uint32_t b = Fetch24(pict, pixel) | 0xff000000; pixel += 3; *buffer++ = b; } } static FASTCALL void fbFetch_b8g8r8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + 3*x; const uint8_t *end = pixel + 3*width; while (pixel < end) { uint32_t b = 0xff000000; #if IMAGE_BYTE_ORDER == MSBFirst b |= (READ(pict, pixel++)); b |= (READ(pict, pixel++) << 8); b |= (READ(pict, pixel++) << 16); #else b |= (READ(pict, pixel++) << 16); b |= (READ(pict, pixel++) << 8); b |= (READ(pict, pixel++)); #endif *buffer++ = b; } } static FASTCALL void fbFetch_r5g6b5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); uint32_t r = (((p) << 3) & 0xf8) | (((p) << 5) & 0xfc00) | (((p) << 8) & 0xf80000); r |= (r >> 5) & 0x70007; r |= (r >> 6) & 0x300; *buffer++ = 0xff000000 | r; } } static FASTCALL void fbFetch_b5g6r5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); b = ((p & 0xf800) | ((p & 0xe000) >> 5)) >> 8; g = ((p & 0x07e0) | ((p & 0x0600) >> 6)) << 5; r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14; *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a1r5g5b5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b, a; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = (uint32_t) ((uint8_t) (0 - ((p & 0x8000) >> 15))) << 24; r = ((p & 0x7c00) | ((p & 0x7000) >> 5)) << 9; g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6; b = ((p & 0x001c) | ((p & 0x001f) << 5)) >> 2; *buffer++ = a | r | g | b; } } static FASTCALL void fbFetch_x1r5g5b5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); r = ((p & 0x7c00) | ((p & 0x7000) >> 5)) << 9; g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6; b = ((p & 0x001c) | ((p & 0x001f) << 5)) >> 2; *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a1b5g5r5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b, a; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = (uint32_t) ((uint8_t) (0 - ((p & 0x8000) >> 15))) << 24; b = ((p & 0x7c00) | ((p & 0x7000) >> 5)) >> 7; g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6; r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14; *buffer++ = a | r | g | b; } } static FASTCALL void fbFetch_x1b5g5r5 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); b = ((p & 0x7c00) | ((p & 0x7000) >> 5)) >> 7; g = ((p & 0x03e0) | ((p & 0x0380) >> 5)) << 6; r = ((p & 0x001c) | ((p & 0x001f) << 5)) << 14; *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a4r4g4b4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b, a; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = ((p & 0xf000) | ((p & 0xf000) >> 4)) << 16; r = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) << 12; g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8; b = ((p & 0x000f) | ((p & 0x000f) << 4)); *buffer++ = a | r | g | b; } } static FASTCALL void fbFetch_x4r4g4b4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); r = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) << 12; g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8; b = ((p & 0x000f) | ((p & 0x000f) << 4)); *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a4b4g4r4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b, a; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = ((p & 0xf000) | ((p & 0xf000) >> 4)) << 16; b = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) >> 4; g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8; r = ((p & 0x000f) | ((p & 0x000f) << 4)) << 16; *buffer++ = a | r | g | b; } } static FASTCALL void fbFetch_x4b4g4r4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint16_t *pixel = (const uint16_t *)bits + x; const uint16_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); b = ((p & 0x0f00) | ((p & 0x0f00) >> 4)) >> 4; g = ((p & 0x00f0) | ((p & 0x00f0) >> 4)) << 8; r = ((p & 0x000f) | ((p & 0x000f) << 4)) << 16; *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { *buffer++ = READ(pict, pixel++) << 24; } } static FASTCALL void fbFetch_r3g3b2 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); r = ((p & 0xe0) | ((p & 0xe0) >> 3) | ((p & 0xc0) >> 6)) << 16; g = ((p & 0x1c) | ((p & 0x18) >> 3) | ((p & 0x1c) << 3)) << 8; b = (((p & 0x03) ) | ((p & 0x03) << 2) | ((p & 0x03) << 4) | ((p & 0x03) << 6)); *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_b2g3r3 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); b = (((p & 0xc0) ) | ((p & 0xc0) >> 2) | ((p & 0xc0) >> 4) | ((p & 0xc0) >> 6)); g = ((p & 0x38) | ((p & 0x38) >> 3) | ((p & 0x30) << 2)) << 8; r = (((p & 0x07) ) | ((p & 0x07) << 3) | ((p & 0x06) << 6)) << 16; *buffer++ = 0xff000000 | r | g | b; } } static FASTCALL void fbFetch_a2r2g2b2 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t a,r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = ((p & 0xc0) * 0x55) << 18; r = ((p & 0x30) * 0x55) << 12; g = ((p & 0x0c) * 0x55) << 6; b = ((p & 0x03) * 0x55); *buffer++ = a|r|g|b; } } static FASTCALL void fbFetch_a2b2g2r2 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t a,r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); a = ((p & 0xc0) * 0x55) << 18; b = ((p & 0x30) * 0x55) >> 6; g = ((p & 0x0c) * 0x55) << 6; r = ((p & 0x03) * 0x55) << 16; *buffer++ = a|r|g|b; } } static FASTCALL void fbFetch_c8 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const pixman_indexed_t * indexed = pict->indexed; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint32_t p = READ(pict, pixel++); *buffer++ = indexed->rgba[p]; } } static FASTCALL void fbFetch_x4a4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const uint8_t *pixel = (const uint8_t *)bits + x; const uint8_t *end = pixel + width; while (pixel < end) { uint8_t p = READ(pict, pixel++) & 0xf; *buffer++ = (p | (p << 4)) << 24; } } #define Fetch8(img,l,o) (READ(img, (uint8_t *)(l) + ((o) >> 2))) #if IMAGE_BYTE_ORDER == MSBFirst #define Fetch4(img,l,o) ((o) & 2 ? Fetch8(img,l,o) & 0xf : Fetch8(img,l,o) >> 4) #else #define Fetch4(img,l,o) ((o) & 2 ? Fetch8(img,l,o) >> 4 : Fetch8(img,l,o) & 0xf) #endif static FASTCALL void fbFetch_a4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); p |= p << 4; *buffer++ = p << 24; } } static FASTCALL void fbFetch_r1g2b1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); r = ((p & 0x8) * 0xff) << 13; g = ((p & 0x6) * 0x55) << 7; b = ((p & 0x1) * 0xff); *buffer++ = 0xff000000|r|g|b; } } static FASTCALL void fbFetch_b1g2r1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); b = ((p & 0x8) * 0xff) >> 3; g = ((p & 0x6) * 0x55) << 7; r = ((p & 0x1) * 0xff) << 16; *buffer++ = 0xff000000|r|g|b; } } static FASTCALL void fbFetch_a1r1g1b1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t a,r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); a = ((p & 0x8) * 0xff) << 21; r = ((p & 0x4) * 0xff) << 14; g = ((p & 0x2) * 0xff) << 7; b = ((p & 0x1) * 0xff); *buffer++ = a|r|g|b; } } static FASTCALL void fbFetch_a1b1g1r1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { uint32_t a,r,g,b; const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); a = ((p & 0x8) * 0xff) << 21; r = ((p & 0x4) * 0xff) >> 3; g = ((p & 0x2) * 0xff) << 7; b = ((p & 0x1) * 0xff) << 16; *buffer++ = a|r|g|b; } } static FASTCALL void fbFetch_c4 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const pixman_indexed_t * indexed = pict->indexed; int i; for (i = 0; i < width; ++i) { uint32_t p = Fetch4(pict, bits, i + x); *buffer++ = indexed->rgba[p]; } } static FASTCALL void fbFetch_a1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; int i; for (i = 0; i < width; ++i) { uint32_t p = READ(pict, bits + ((i + x) >> 5)); uint32_t a; #if BITMAP_BIT_ORDER == MSBFirst a = p >> (0x1f - ((i+x) & 0x1f)); #else a = p >> ((i+x) & 0x1f); #endif a = a & 1; a |= a << 1; a |= a << 2; a |= a << 4; *buffer++ = a << 24; } } static FASTCALL void fbFetch_g1 (bits_image_t *pict, int x, int y, int width, uint32_t *buffer) { const uint32_t *bits = pict->bits + y*pict->rowstride; const pixman_indexed_t * indexed = pict->indexed; int i; for (i = 0; i < width; ++i) { uint32_t p = READ(pict, bits + ((i+x) >> 5)); uint32_t a; #if BITMAP_BIT_ORDER == MSBFirst a = p >> (0x1f - ((i+x) & 0x1f)); #else a = p >> ((i+x) & 0x1f); #endif a = a & 1; *buffer++ = indexed->rgba[a]; } } static FASTCALL void fbFetch_yuy2 (bits_image_t *pict, int x, int line, int width, uint32_t *buffer) { int16_t y, u, v; int32_t r, g, b; int i; const uint32_t *bits = pict->bits + pict->rowstride * line; for (i = 0; i < width; i++) { y = ((uint8_t *) bits)[(x + i) << 1] - 16; u = ((uint8_t *) bits)[(((x + i) << 1) & -4) + 1] - 128; v = ((uint8_t *) bits)[(((x + i) << 1) & -4) + 3] - 128; /* R = 1.164(Y - 16) + 1.596(V - 128) */ r = 0x012b27 * y + 0x019a2e * v; /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; /* B = 1.164(Y - 16) + 2.018(U - 128) */ b = 0x012b27 * y + 0x0206a2 * u; WRITE(pict, buffer++, 0xff000000 | (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0)); } } static FASTCALL void fbFetch_yv12 (bits_image_t *pict, int x, int line, int width, uint32_t *buffer) { YV12_SETUP(pict); uint8_t *pY = YV12_Y (line); uint8_t *pU = YV12_U (line); uint8_t *pV = YV12_V (line); int16_t y, u, v; int32_t r, g, b; int i; for (i = 0; i < width; i++) { y = pY[x + i] - 16; u = pU[(x + i) >> 1] - 128; v = pV[(x + i) >> 1] - 128; /* R = 1.164(Y - 16) + 1.596(V - 128) */ r = 0x012b27 * y + 0x019a2e * v; /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; /* B = 1.164(Y - 16) + 2.018(U - 128) */ b = 0x012b27 * y + 0x0206a2 * u; WRITE(pict, buffer++, 0xff000000 | (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0)); } } fetchProc FETCH_PROC_FOR_PICTURE (bits_image_t * pict) { switch(pict->format) { case PIXMAN_a8r8g8b8: return fbFetch_a8r8g8b8; case PIXMAN_x8r8g8b8: return fbFetch_x8r8g8b8; case PIXMAN_a8b8g8r8: return fbFetch_a8b8g8r8; case PIXMAN_x8b8g8r8: return fbFetch_x8b8g8r8; /* 24bpp formats */ case PIXMAN_r8g8b8: return fbFetch_r8g8b8; case PIXMAN_b8g8r8: return fbFetch_b8g8r8; /* 16bpp formats */ case PIXMAN_r5g6b5: return fbFetch_r5g6b5; case PIXMAN_b5g6r5: return fbFetch_b5g6r5; case PIXMAN_a1r5g5b5: return fbFetch_a1r5g5b5; case PIXMAN_x1r5g5b5: return fbFetch_x1r5g5b5; case PIXMAN_a1b5g5r5: return fbFetch_a1b5g5r5; case PIXMAN_x1b5g5r5: return fbFetch_x1b5g5r5; case PIXMAN_a4r4g4b4: return fbFetch_a4r4g4b4; case PIXMAN_x4r4g4b4: return fbFetch_x4r4g4b4; case PIXMAN_a4b4g4r4: return fbFetch_a4b4g4r4; case PIXMAN_x4b4g4r4: return fbFetch_x4b4g4r4; /* 8bpp formats */ case PIXMAN_a8: return fbFetch_a8; case PIXMAN_r3g3b2: return fbFetch_r3g3b2; case PIXMAN_b2g3r3: return fbFetch_b2g3r3; case PIXMAN_a2r2g2b2: return fbFetch_a2r2g2b2; case PIXMAN_a2b2g2r2: return fbFetch_a2b2g2r2; case PIXMAN_c8: return fbFetch_c8; case PIXMAN_g8: return fbFetch_c8; case PIXMAN_x4a4: return fbFetch_x4a4; /* 4bpp formats */ case PIXMAN_a4: return fbFetch_a4; case PIXMAN_r1g2b1: return fbFetch_r1g2b1; case PIXMAN_b1g2r1: return fbFetch_b1g2r1; case PIXMAN_a1r1g1b1: return fbFetch_a1r1g1b1; case PIXMAN_a1b1g1r1: return fbFetch_a1b1g1r1; case PIXMAN_c4: return fbFetch_c4; case PIXMAN_g4: return fbFetch_c4; /* 1bpp formats */ case PIXMAN_a1: return fbFetch_a1; case PIXMAN_g1: return fbFetch_g1; /* YUV formats */ case PIXMAN_yuy2: return fbFetch_yuy2; case PIXMAN_yv12: return fbFetch_yv12; } return NULL; } /**************************** Pixel wise fetching *****************************/ static FASTCALL uint32_t fbFetchPixel_a8r8g8b8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; return READ(pict, (uint32_t *)bits + offset); } static FASTCALL uint32_t fbFetchPixel_x8r8g8b8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; return READ(pict, (uint32_t *)bits + offset) | 0xff000000; } static FASTCALL uint32_t fbFetchPixel_a8b8g8r8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint32_t *)bits + offset); return ((pixel & 0xff000000) | ((pixel >> 16) & 0xff) | (pixel & 0x0000ff00) | ((pixel & 0xff) << 16)); } static FASTCALL uint32_t fbFetchPixel_x8b8g8r8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint32_t *)bits + offset); return ((0xff000000) | ((pixel >> 16) & 0xff) | (pixel & 0x0000ff00) | ((pixel & 0xff) << 16)); } static FASTCALL uint32_t fbFetchPixel_r8g8b8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint8_t *pixel = ((uint8_t *) bits) + (offset*3); #if IMAGE_BYTE_ORDER == MSBFirst return (0xff000000 | (READ(pict, pixel + 0) << 16) | (READ(pict, pixel + 1) << 8) | (READ(pict, pixel + 2))); #else return (0xff000000 | (READ(pict, pixel + 2) << 16) | (READ(pict, pixel + 1) << 8) | (READ(pict, pixel + 0))); #endif } static FASTCALL uint32_t fbFetchPixel_b8g8r8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint8_t *pixel = ((uint8_t *) bits) + (offset*3); #if IMAGE_BYTE_ORDER == MSBFirst return (0xff000000 | (READ(pict, pixel + 2) << 16) | (READ(pict, pixel + 1) << 8) | (READ(pict, pixel + 0))); #else return (0xff000000 | (READ(pict, pixel + 0) << 16) | (READ(pict, pixel + 1) << 8) | (READ(pict, pixel + 2))); #endif } static FASTCALL uint32_t fbFetchPixel_r5g6b5 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); r = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) << 8; g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5; b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_b5g6r5 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); b = ((pixel & 0xf800) | ((pixel & 0xe000) >> 5)) >> 8; g = ((pixel & 0x07e0) | ((pixel & 0x0600) >> 6)) << 5; r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a1r5g5b5 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); a = (uint32_t) ((uint8_t) (0 - ((pixel & 0x8000) >> 15))) << 24; r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9; g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; return (a | r | g | b); } static FASTCALL uint32_t fbFetchPixel_x1r5g5b5 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); r = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) << 9; g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; b = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) >> 2; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a1b5g5r5 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); a = (uint32_t) ((uint8_t) (0 - ((pixel & 0x8000) >> 15))) << 24; b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7; g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; return (a | r | g | b); } static FASTCALL uint32_t fbFetchPixel_x1b5g5r5 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); b = ((pixel & 0x7c00) | ((pixel & 0x7000) >> 5)) >> 7; g = ((pixel & 0x03e0) | ((pixel & 0x0380) >> 5)) << 6; r = ((pixel & 0x001c) | ((pixel & 0x001f) << 5)) << 14; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a4r4g4b4 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16; r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); return (a | r | g | b); } static FASTCALL uint32_t fbFetchPixel_x4r4g4b4 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); r = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) << 12; g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; b = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)); return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a4b4g4r4 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); a = ((pixel & 0xf000) | ((pixel & 0xf000) >> 4)) << 16; b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) >> 4; g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)) << 16; return (a | r | g | b); } static FASTCALL uint32_t fbFetchPixel_x4b4g4r4 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint16_t *) bits + offset); b = ((pixel & 0x0f00) | ((pixel & 0x0f00) >> 4)) >> 4; g = ((pixel & 0x00f0) | ((pixel & 0x00f0) >> 4)) << 8; r = ((pixel & 0x000f) | ((pixel & 0x000f) << 4)) << 16; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); return pixel << 24; } static FASTCALL uint32_t fbFetchPixel_r3g3b2 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); r = ((pixel & 0xe0) | ((pixel & 0xe0) >> 3) | ((pixel & 0xc0) >> 6)) << 16; g = ((pixel & 0x1c) | ((pixel & 0x18) >> 3) | ((pixel & 0x1c) << 3)) << 8; b = (((pixel & 0x03) ) | ((pixel & 0x03) << 2) | ((pixel & 0x03) << 4) | ((pixel & 0x03) << 6)); return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_b2g3r3 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); b = (((pixel & 0xc0) ) | ((pixel & 0xc0) >> 2) | ((pixel & 0xc0) >> 4) | ((pixel & 0xc0) >> 6)); g = ((pixel & 0x38) | ((pixel & 0x38) >> 3) | ((pixel & 0x30) << 2)) << 8; r = (((pixel & 0x07) ) | ((pixel & 0x07) << 3) | ((pixel & 0x06) << 6)) << 16; return (0xff000000 | r | g | b); } static FASTCALL uint32_t fbFetchPixel_a2r2g2b2 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); a = ((pixel & 0xc0) * 0x55) << 18; r = ((pixel & 0x30) * 0x55) << 12; g = ((pixel & 0x0c) * 0x55) << 6; b = ((pixel & 0x03) * 0x55); return a|r|g|b; } static FASTCALL uint32_t fbFetchPixel_a2b2g2r2 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); a = ((pixel & 0xc0) * 0x55) << 18; b = ((pixel & 0x30) * 0x55) >> 6; g = ((pixel & 0x0c) * 0x55) << 6; r = ((pixel & 0x03) * 0x55) << 16; return a|r|g|b; } static FASTCALL uint32_t fbFetchPixel_c8 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); const pixman_indexed_t * indexed = pict->indexed; return indexed->rgba[pixel]; } static FASTCALL uint32_t fbFetchPixel_x4a4 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, (uint8_t *) bits + offset); return ((pixel & 0xf) | ((pixel & 0xf) << 4)) << 24; } static FASTCALL uint32_t fbFetchPixel_a4 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); pixel |= pixel << 4; return pixel << 24; } static FASTCALL uint32_t fbFetchPixel_r1g2b1 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); r = ((pixel & 0x8) * 0xff) << 13; g = ((pixel & 0x6) * 0x55) << 7; b = ((pixel & 0x1) * 0xff); return 0xff000000|r|g|b; } static FASTCALL uint32_t fbFetchPixel_b1g2r1 (bits_image_t *pict, int offset, int line) { uint32_t r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); b = ((pixel & 0x8) * 0xff) >> 3; g = ((pixel & 0x6) * 0x55) << 7; r = ((pixel & 0x1) * 0xff) << 16; return 0xff000000|r|g|b; } static FASTCALL uint32_t fbFetchPixel_a1r1g1b1 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); a = ((pixel & 0x8) * 0xff) << 21; r = ((pixel & 0x4) * 0xff) << 14; g = ((pixel & 0x2) * 0xff) << 7; b = ((pixel & 0x1) * 0xff); return a|r|g|b; } static FASTCALL uint32_t fbFetchPixel_a1b1g1r1 (bits_image_t *pict, int offset, int line) { uint32_t a,r,g,b; uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); a = ((pixel & 0x8) * 0xff) << 21; r = ((pixel & 0x4) * 0xff) >> 3; g = ((pixel & 0x2) * 0xff) << 7; b = ((pixel & 0x1) * 0xff) << 16; return a|r|g|b; } static FASTCALL uint32_t fbFetchPixel_c4 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = Fetch4(pict, bits, offset); const pixman_indexed_t * indexed = pict->indexed; return indexed->rgba[pixel]; } static FASTCALL uint32_t fbFetchPixel_a1 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, bits + (offset >> 5)); uint32_t a; #if BITMAP_BIT_ORDER == MSBFirst a = pixel >> (0x1f - (offset & 0x1f)); #else a = pixel >> (offset & 0x1f); #endif a = a & 1; a |= a << 1; a |= a << 2; a |= a << 4; return a << 24; } static FASTCALL uint32_t fbFetchPixel_g1 (bits_image_t *pict, int offset, int line) { uint32_t *bits = pict->bits + line*pict->rowstride; uint32_t pixel = READ(pict, bits + (offset >> 5)); const pixman_indexed_t * indexed = pict->indexed; uint32_t a; #if BITMAP_BIT_ORDER == MSBFirst a = pixel >> (0x1f - (offset & 0x1f)); #else a = pixel >> (offset & 0x1f); #endif a = a & 1; return indexed->rgba[a]; } static FASTCALL uint32_t fbFetchPixel_yuy2 (bits_image_t *pict, int offset, int line) { int16_t y, u, v; int32_t r, g, b; const uint32_t *bits = pict->bits + pict->rowstride * line; y = ((uint8_t *) bits)[offset << 1] - 16; u = ((uint8_t *) bits)[((offset << 1) & -4) + 1] - 128; v = ((uint8_t *) bits)[((offset << 1) & -4) + 3] - 128; /* R = 1.164(Y - 16) + 1.596(V - 128) */ r = 0x012b27 * y + 0x019a2e * v; /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; /* B = 1.164(Y - 16) + 2.018(U - 128) */ b = 0x012b27 * y + 0x0206a2 * u; return 0xff000000 | (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0); } static FASTCALL uint32_t fbFetchPixel_yv12 (bits_image_t *pict, int offset, int line) { YV12_SETUP(pict); int16_t y = YV12_Y (line)[offset] - 16; int16_t u = YV12_U (line)[offset >> 1] - 128; int16_t v = YV12_V (line)[offset >> 1] - 128; int32_t r, g, b; /* R = 1.164(Y - 16) + 1.596(V - 128) */ r = 0x012b27 * y + 0x019a2e * v; /* G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) */ g = 0x012b27 * y - 0x00d0f2 * v - 0x00647e * u; /* B = 1.164(Y - 16) + 2.018(U - 128) */ b = 0x012b27 * y + 0x0206a2 * u; return 0xff000000 | (r >= 0 ? r < 0x1000000 ? r & 0xff0000 : 0xff0000 : 0) | (g >= 0 ? g < 0x1000000 ? (g >> 8) & 0x00ff00 : 0x00ff00 : 0) | (b >= 0 ? b < 0x1000000 ? (b >> 16) & 0x0000ff : 0x0000ff : 0); } fetchPixelProc FETCH_PIXEL_PROC_FOR_PICTURE (bits_image_t * pict) { switch(pict->format) { case PIXMAN_a8r8g8b8: return fbFetchPixel_a8r8g8b8; case PIXMAN_x8r8g8b8: return fbFetchPixel_x8r8g8b8; case PIXMAN_a8b8g8r8: return fbFetchPixel_a8b8g8r8; case PIXMAN_x8b8g8r8: return fbFetchPixel_x8b8g8r8; /* 24bpp formats */ case PIXMAN_r8g8b8: return fbFetchPixel_r8g8b8; case PIXMAN_b8g8r8: return fbFetchPixel_b8g8r8; /* 16bpp formats */ case PIXMAN_r5g6b5: return fbFetchPixel_r5g6b5; case PIXMAN_b5g6r5: return fbFetchPixel_b5g6r5; case PIXMAN_a1r5g5b5: return fbFetchPixel_a1r5g5b5; case PIXMAN_x1r5g5b5: return fbFetchPixel_x1r5g5b5; case PIXMAN_a1b5g5r5: return fbFetchPixel_a1b5g5r5; case PIXMAN_x1b5g5r5: return fbFetchPixel_x1b5g5r5; case PIXMAN_a4r4g4b4: return fbFetchPixel_a4r4g4b4; case PIXMAN_x4r4g4b4: return fbFetchPixel_x4r4g4b4; case PIXMAN_a4b4g4r4: return fbFetchPixel_a4b4g4r4; case PIXMAN_x4b4g4r4: return fbFetchPixel_x4b4g4r4; /* 8bpp formats */ case PIXMAN_a8: return fbFetchPixel_a8; case PIXMAN_r3g3b2: return fbFetchPixel_r3g3b2; case PIXMAN_b2g3r3: return fbFetchPixel_b2g3r3; case PIXMAN_a2r2g2b2: return fbFetchPixel_a2r2g2b2; case PIXMAN_a2b2g2r2: return fbFetchPixel_a2b2g2r2; case PIXMAN_c8: return fbFetchPixel_c8; case PIXMAN_g8: return fbFetchPixel_c8; case PIXMAN_x4a4: return fbFetchPixel_x4a4; /* 4bpp formats */ case PIXMAN_a4: return fbFetchPixel_a4; case PIXMAN_r1g2b1: return fbFetchPixel_r1g2b1; case PIXMAN_b1g2r1: return fbFetchPixel_b1g2r1; case PIXMAN_a1r1g1b1: return fbFetchPixel_a1r1g1b1; case PIXMAN_a1b1g1r1: return fbFetchPixel_a1b1g1r1; case PIXMAN_c4: return fbFetchPixel_c4; case PIXMAN_g4: return fbFetchPixel_c4; /* 1bpp formats */ case PIXMAN_a1: return fbFetchPixel_a1; case PIXMAN_g1: return fbFetchPixel_g1; /* YUV formats */ case PIXMAN_yuy2: return fbFetchPixel_yuy2; case PIXMAN_yv12: return fbFetchPixel_yv12; } return NULL; } /*********************************** Store ************************************/ #define Splita(v) uint32_t a = ((v) >> 24), r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff #define Split(v) uint32_t r = ((v) >> 16) & 0xff, g = ((v) >> 8) & 0xff, b = (v) & 0xff static FASTCALL void fbStore_a8r8g8b8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { MEMCPY_WRAPPED(image, ((uint32_t *)bits) + x, values, width*sizeof(uint32_t)); } static FASTCALL void fbStore_x8r8g8b8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint32_t *pixel = (uint32_t *)bits + x; for (i = 0; i < width; ++i) WRITE(image, pixel++, values[i] & 0xffffff); } static FASTCALL void fbStore_a8b8g8r8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint32_t *pixel = (uint32_t *)bits + x; for (i = 0; i < width; ++i) WRITE(image, pixel++, (values[i] & 0xff00ff00) | ((values[i] >> 16) & 0xff) | ((values[i] & 0xff) << 16)); } static FASTCALL void fbStore_x8b8g8r8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint32_t *pixel = (uint32_t *)bits + x; for (i = 0; i < width; ++i) WRITE(image, pixel++, (values[i] & 0x0000ff00) | ((values[i] >> 16) & 0xff) | ((values[i] & 0xff) << 16)); } static FASTCALL void fbStore_r8g8b8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + 3*x; for (i = 0; i < width; ++i) { Store24(image, pixel, values[i]); pixel += 3; } } static FASTCALL void fbStore_b8g8r8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + 3*x; for (i = 0; i < width; ++i) { uint32_t val = values[i]; #if IMAGE_BYTE_ORDER == MSBFirst WRITE(image, pixel++, Blue(val)); WRITE(image, pixel++, Green(val)); WRITE(image, pixel++, Red(val)); #else WRITE(image, pixel++, Red(val)); WRITE(image, pixel++, Green(val)); WRITE(image, pixel++, Blue(val)); #endif } } static FASTCALL void fbStore_r5g6b5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { uint32_t s = values[i]; WRITE(image, pixel++, ((s >> 3) & 0x001f) | ((s >> 5) & 0x07e0) | ((s >> 8) & 0xf800)); } } static FASTCALL void fbStore_b5g6r5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((b << 8) & 0xf800) | ((g << 3) & 0x07e0) | ((r >> 3) )); } } static FASTCALL void fbStore_a1r5g5b5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Splita(values[i]); WRITE(image, pixel++, ((a << 8) & 0x8000) | ((r << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((b >> 3) )); } } static FASTCALL void fbStore_x1r5g5b5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((r << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((b >> 3) )); } } static FASTCALL void fbStore_a1b5g5r5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Splita(values[i]); WRITE(image, pixel++, ((a << 8) & 0x8000) | ((b << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((r >> 3) )); } } static FASTCALL void fbStore_x1b5g5r5 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((b << 7) & 0x7c00) | ((g << 2) & 0x03e0) | ((r >> 3) )); } } static FASTCALL void fbStore_a4r4g4b4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Splita(values[i]); WRITE(image, pixel++, ((a << 8) & 0xf000) | ((r << 4) & 0x0f00) | ((g ) & 0x00f0) | ((b >> 4) )); } } static FASTCALL void fbStore_x4r4g4b4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((r << 4) & 0x0f00) | ((g ) & 0x00f0) | ((b >> 4) )); } } static FASTCALL void fbStore_a4b4g4r4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Splita(values[i]); WRITE(image, pixel++, ((a << 8) & 0xf000) | ((b << 4) & 0x0f00) | ((g ) & 0x00f0) | ((r >> 4) )); } } static FASTCALL void fbStore_x4b4g4r4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint16_t *pixel = ((uint16_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((b << 4) & 0x0f00) | ((g ) & 0x00f0) | ((r >> 4) )); } } static FASTCALL void fbStore_a8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { WRITE(image, pixel++, values[i] >> 24); } } static FASTCALL void fbStore_r3g3b2 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((r ) & 0xe0) | ((g >> 3) & 0x1c) | ((b >> 6) )); } } static FASTCALL void fbStore_b2g3r3 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { Split(values[i]); WRITE(image, pixel++, ((b ) & 0xc0) | ((g >> 2) & 0x1c) | ((r >> 5) )); } } static FASTCALL void fbStore_a2r2g2b2 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { Splita(values[i]); WRITE(image, pixel++, ((a ) & 0xc0) | ((r >> 2) & 0x30) | ((g >> 4) & 0x0c) | ((b >> 6) )); } } static FASTCALL void fbStore_c8 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { WRITE(image, pixel++, miIndexToEnt24(indexed,values[i])); } } static FASTCALL void fbStore_x4a4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; uint8_t *pixel = ((uint8_t *) bits) + x; for (i = 0; i < width; ++i) { WRITE(image, pixel++, values[i] >> 28); } } #define Store8(img,l,o,v) (WRITE(img, (uint8_t *)(l) + ((o) >> 3), (v))) #if IMAGE_BYTE_ORDER == MSBFirst #define Store4(img,l,o,v) Store8(img,l,o,((o) & 4 ? \ (Fetch8(img,l,o) & 0xf0) | (v) : \ (Fetch8(img,l,o) & 0x0f) | ((v) << 4))) #else #define Store4(img,l,o,v) Store8(img,l,o,((o) & 4 ? \ (Fetch8(img,l,o) & 0x0f) | ((v) << 4) : \ (Fetch8(img,l,o) & 0xf0) | (v))) #endif static FASTCALL void fbStore_a4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { Store4(image, bits, i + x, values[i]>>28); } } static FASTCALL void fbStore_r1g2b1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t pixel; Split(values[i]); pixel = (((r >> 4) & 0x8) | ((g >> 5) & 0x6) | ((b >> 7) )); Store4(image, bits, i + x, pixel); } } static FASTCALL void fbStore_b1g2r1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t pixel; Split(values[i]); pixel = (((b >> 4) & 0x8) | ((g >> 5) & 0x6) | ((r >> 7) )); Store4(image, bits, i + x, pixel); } } static FASTCALL void fbStore_a1r1g1b1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t pixel; Splita(values[i]); pixel = (((a >> 4) & 0x8) | ((r >> 5) & 0x4) | ((g >> 6) & 0x2) | ((b >> 7) )); Store4(image, bits, i + x, pixel); } } static FASTCALL void fbStore_a1b1g1r1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t pixel; Splita(values[i]); pixel = (((a >> 4) & 0x8) | ((b >> 5) & 0x4) | ((g >> 6) & 0x2) | ((r >> 7) )); Store4(image, bits, i + x, pixel); } } static FASTCALL void fbStore_c4 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t pixel; pixel = miIndexToEnt24(indexed, values[i]); Store4(image, bits, i + x, pixel); } } static FASTCALL void fbStore_a1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t *pixel = ((uint32_t *) bits) + ((i+x) >> 5); uint32_t mask = FbStipMask((i+x) & 0x1f, 1); uint32_t v = values[i] & 0x80000000 ? mask : 0; WRITE(image, pixel, (READ(image, pixel) & ~mask) | v); } } static FASTCALL void fbStore_g1 (pixman_image_t *image, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t * indexed) { int i; for (i = 0; i < width; ++i) { uint32_t *pixel = ((uint32_t *) bits) + ((i+x) >> 5); uint32_t mask = FbStipMask((i+x) & 0x1f, 1); uint32_t v = miIndexToEntY24(indexed,values[i]) ? mask : 0; WRITE(image, pixel, (READ(image, pixel) & ~mask) | v); } } storeProc STORE_PROC_FOR_PICTURE (bits_image_t * pict) { switch(pict->format) { case PIXMAN_a8r8g8b8: return fbStore_a8r8g8b8; case PIXMAN_x8r8g8b8: return fbStore_x8r8g8b8; case PIXMAN_a8b8g8r8: return fbStore_a8b8g8r8; case PIXMAN_x8b8g8r8: return fbStore_x8b8g8r8; /* 24bpp formats */ case PIXMAN_r8g8b8: return fbStore_r8g8b8; case PIXMAN_b8g8r8: return fbStore_b8g8r8; /* 16bpp formats */ case PIXMAN_r5g6b5: return fbStore_r5g6b5; case PIXMAN_b5g6r5: return fbStore_b5g6r5; case PIXMAN_a1r5g5b5: return fbStore_a1r5g5b5; case PIXMAN_x1r5g5b5: return fbStore_x1r5g5b5; case PIXMAN_a1b5g5r5: return fbStore_a1b5g5r5; case PIXMAN_x1b5g5r5: return fbStore_x1b5g5r5; case PIXMAN_a4r4g4b4: return fbStore_a4r4g4b4; case PIXMAN_x4r4g4b4: return fbStore_x4r4g4b4; case PIXMAN_a4b4g4r4: return fbStore_a4b4g4r4; case PIXMAN_x4b4g4r4: return fbStore_x4b4g4r4; /* 8bpp formats */ case PIXMAN_a8: return fbStore_a8; case PIXMAN_r3g3b2: return fbStore_r3g3b2; case PIXMAN_b2g3r3: return fbStore_b2g3r3; case PIXMAN_a2r2g2b2: return fbStore_a2r2g2b2; case PIXMAN_c8: return fbStore_c8; case PIXMAN_g8: return fbStore_c8; case PIXMAN_x4a4: return fbStore_x4a4; /* 4bpp formats */ case PIXMAN_a4: return fbStore_a4; case PIXMAN_r1g2b1: return fbStore_r1g2b1; case PIXMAN_b1g2r1: return fbStore_b1g2r1; case PIXMAN_a1r1g1b1: return fbStore_a1r1g1b1; case PIXMAN_a1b1g1r1: return fbStore_a1b1g1r1; case PIXMAN_c4: return fbStore_c4; case PIXMAN_g4: return fbStore_c4; /* 1bpp formats */ case PIXMAN_a1: return fbStore_a1; case PIXMAN_g1: return fbStore_g1; default: return NULL; } } libgdiplus-2.11/pixman/pixman/pixman-compose.c0000664000175000017500000003141312225470167016421 00000000000000/* * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * 2005 Lars Knoll & Zack Rusin, Trolltech * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include "pixman-private.h" #ifdef PIXMAN_FB_ACCESSORS #define PIXMAN_COMPOSITE_RECT_GENERAL pixman_composite_rect_general_accessors #define PIXMAN_COMPOSE_FUNCTIONS pixman_composeFunctions_accessors #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture_accessors #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture_accessors #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture_accessors #define FB_FETCH_TRANSFORMED fbFetchTransformed_accessors #define FB_FETCH_EXTERNAL_ALPHA fbFetchExternalAlpha_accessors #define FB_STORE_EXTERNAL_ALPHA fbStoreExternalAlpha_accessors #else #define PIXMAN_COMPOSITE_RECT_GENERAL pixman_composite_rect_general_no_accessors #define PIXMAN_COMPOSE_FUNCTIONS pixman_composeFunctions #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture #define FB_FETCH_TRANSFORMED fbFetchTransformed #define FB_FETCH_EXTERNAL_ALPHA fbFetchExternalAlpha #define FB_STORE_EXTERNAL_ALPHA fbStoreExternalAlpha #endif static unsigned int SourcePictureClassify (source_image_t *pict, int x, int y, int width, int height) { if (pict->common.type == SOLID) { pict->class = SOURCE_IMAGE_CLASS_HORIZONTAL; } else if (pict->common.type == LINEAR) { linear_gradient_t *linear = (linear_gradient_t *)pict; pixman_vector_t v; pixman_fixed_32_32_t l; pixman_fixed_48_16_t dx, dy, a, b, off; pixman_fixed_48_16_t factors[4]; int i; dx = linear->p2.x - linear->p1.x; dy = linear->p2.y - linear->p1.y; l = dx * dx + dy * dy; if (l) { a = (dx << 32) / l; b = (dy << 32) / l; } else { a = b = 0; } off = (-a * linear->p1.x -b * linear->p1.y) >> 16; for (i = 0; i < 3; i++) { v.vector[0] = pixman_int_to_fixed ((i % 2) * (width - 1) + x); v.vector[1] = pixman_int_to_fixed ((i / 2) * (height - 1) + y); v.vector[2] = pixman_fixed_1; if (pict->common.transform) { if (!pixman_transform_point_3d (pict->common.transform, &v)) return SOURCE_IMAGE_CLASS_UNKNOWN; } factors[i] = ((a * v.vector[0] + b * v.vector[1]) >> 16) + off; } if (factors[2] == factors[0]) pict->class = SOURCE_IMAGE_CLASS_HORIZONTAL; else if (factors[1] == factors[0]) pict->class = SOURCE_IMAGE_CLASS_VERTICAL; } return pict->class; } static void fbFetchSolid(bits_image_t * pict, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits) { uint32_t color; uint32_t *end; fetchPixelProc fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); color = fetch(pict, 0, 0); end = buffer + width; while (buffer < end) *(buffer++) = color; } static void fbFetch(bits_image_t * pict, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits) { fetchProc fetch = FETCH_PROC_FOR_PICTURE(pict); fetch(pict, x, y, width, buffer); } #ifdef PIXMAN_FB_ACCESSORS /* The accessor version can't be parameterized from outside */ static const #endif FbComposeFunctions PIXMAN_COMPOSE_FUNCTIONS = { pixman_fbCombineFuncU, pixman_fbCombineFuncC, pixman_fbCombineMaskU }; static void fbStore(bits_image_t * pict, int x, int y, int width, uint32_t *buffer) { uint32_t *bits; int32_t stride; storeProc store = STORE_PROC_FOR_PICTURE(pict); const pixman_indexed_t * indexed = pict->indexed; bits = pict->bits; stride = pict->rowstride; bits += y*stride; store((pixman_image_t *)pict, bits, buffer, x, width, indexed); } typedef void (*scanStoreProc)(pixman_image_t *, int, int, int, uint32_t *); typedef void (*scanFetchProc)(pixman_image_t *, int, int, int, uint32_t *, uint32_t *, uint32_t); #ifndef PIXMAN_FB_ACCESSORS static #endif void PIXMAN_COMPOSITE_RECT_GENERAL (const FbComposeData *data, uint32_t *scanline_buffer) { uint32_t *src_buffer = scanline_buffer; uint32_t *dest_buffer = src_buffer + data->width; int i; scanStoreProc store; scanFetchProc fetchSrc = NULL, fetchMask = NULL, fetchDest = NULL; unsigned int srcClass = SOURCE_IMAGE_CLASS_UNKNOWN; unsigned int maskClass = SOURCE_IMAGE_CLASS_UNKNOWN; uint32_t *bits; int32_t stride; int xoff, yoff; if (data->op == PIXMAN_OP_CLEAR) fetchSrc = NULL; else if (IS_SOURCE_IMAGE (data->src)) { fetchSrc = (scanFetchProc)pixmanFetchSourcePict; srcClass = SourcePictureClassify ((source_image_t *)data->src, data->xSrc, data->ySrc, data->width, data->height); } else { bits_image_t *bits = (bits_image_t *)data->src; if (bits->common.alpha_map) { fetchSrc = (scanFetchProc)FB_FETCH_EXTERNAL_ALPHA; } else if ((bits->common.repeat == PIXMAN_REPEAT_NORMAL || bits->common.repeat == PIXMAN_REPEAT_PAD) && bits->width == 1 && bits->height == 1) { fetchSrc = (scanFetchProc)fbFetchSolid; srcClass = SOURCE_IMAGE_CLASS_HORIZONTAL; } else if (!bits->common.transform && bits->common.filter != PIXMAN_FILTER_CONVOLUTION && bits->common.repeat != PIXMAN_REPEAT_PAD) { fetchSrc = (scanFetchProc)fbFetch; } else { fetchSrc = (scanFetchProc)FB_FETCH_TRANSFORMED; } } if (!data->mask || data->op == PIXMAN_OP_CLEAR) { fetchMask = NULL; } else { if (IS_SOURCE_IMAGE (data->mask)) { fetchMask = (scanFetchProc)pixmanFetchSourcePict; maskClass = SourcePictureClassify ((source_image_t *)data->mask, data->xMask, data->yMask, data->width, data->height); } else { bits_image_t *bits = (bits_image_t *)data->mask; if (bits->common.alpha_map) { fetchMask = (scanFetchProc)FB_FETCH_EXTERNAL_ALPHA; } else if ((bits->common.repeat == PIXMAN_REPEAT_NORMAL || bits->common.repeat == PIXMAN_REPEAT_PAD) && bits->width == 1 && bits->height == 1) { fetchMask = (scanFetchProc)fbFetchSolid; maskClass = SOURCE_IMAGE_CLASS_HORIZONTAL; } else if (!bits->common.transform && bits->common.filter != PIXMAN_FILTER_CONVOLUTION && bits->common.repeat != PIXMAN_REPEAT_PAD) fetchMask = (scanFetchProc)fbFetch; else fetchMask = (scanFetchProc)FB_FETCH_TRANSFORMED; } } if (data->dest->common.alpha_map) { fetchDest = (scanFetchProc)FB_FETCH_EXTERNAL_ALPHA; store = (scanStoreProc)FB_STORE_EXTERNAL_ALPHA; if (data->op == PIXMAN_OP_CLEAR || data->op == PIXMAN_OP_SRC) fetchDest = NULL; } else { fetchDest = (scanFetchProc)fbFetch; store = (scanStoreProc)fbStore; switch (data->op) { case PIXMAN_OP_CLEAR: case PIXMAN_OP_SRC: fetchDest = NULL; #ifndef PIXMAN_FB_ACCESSORS /* fall-through */ case PIXMAN_OP_ADD: case PIXMAN_OP_OVER: switch (data->dest->bits.format) { case PIXMAN_a8r8g8b8: case PIXMAN_x8r8g8b8: store = NULL; break; default: break; } #endif break; } } if (!store) { bits = data->dest->bits.bits; stride = data->dest->bits.rowstride; xoff = yoff = 0; } else { bits = NULL; stride = 0; xoff = yoff = 0; } if (fetchSrc && fetchMask && data->mask && data->mask->common.type == BITS && data->mask->common.component_alpha && PIXMAN_FORMAT_RGB (data->mask->bits.format)) { uint32_t *mask_buffer = dest_buffer + data->width; CombineFuncC compose = PIXMAN_COMPOSE_FUNCTIONS.combineC[data->op]; if (!compose) return; for (i = 0; i < data->height; ++i) { /* fill first half of scanline with source */ if (fetchSrc) { if (fetchMask) { /* fetch mask before source so that fetching of source can be optimized */ fetchMask (data->mask, data->xMask, data->yMask + i, data->width, mask_buffer, 0, 0); if (maskClass == SOURCE_IMAGE_CLASS_HORIZONTAL) fetchMask = NULL; } if (srcClass == SOURCE_IMAGE_CLASS_HORIZONTAL) { fetchSrc (data->src, data->xSrc, data->ySrc + i, data->width, src_buffer, 0, 0); fetchSrc = NULL; } else { fetchSrc (data->src, data->xSrc, data->ySrc + i, data->width, src_buffer, mask_buffer, 0xffffffff); } } else if (fetchMask) { fetchMask (data->mask, data->xMask, data->yMask + i, data->width, mask_buffer, 0, 0); } if (store) { /* fill dest into second half of scanline */ if (fetchDest) fetchDest (data->dest, data->xDest, data->yDest + i, data->width, dest_buffer, 0, 0); /* blend */ compose (dest_buffer, src_buffer, mask_buffer, data->width); /* write back */ store (data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); } else { /* blend */ compose (bits + (data->yDest + i+ yoff) * stride + data->xDest + xoff, src_buffer, mask_buffer, data->width); } } } else { uint32_t *src_mask_buffer = 0, *mask_buffer = 0; CombineFuncU compose = PIXMAN_COMPOSE_FUNCTIONS.combineU[data->op]; if (!compose) return; if (fetchMask) mask_buffer = dest_buffer + data->width; for (i = 0; i < data->height; ++i) { /* fill first half of scanline with source */ if (fetchSrc) { if (fetchMask) { /* fetch mask before source so that fetching of source can be optimized */ fetchMask (data->mask, data->xMask, data->yMask + i, data->width, mask_buffer, 0, 0); if (maskClass == SOURCE_IMAGE_CLASS_HORIZONTAL) fetchMask = NULL; } if (srcClass == SOURCE_IMAGE_CLASS_HORIZONTAL) { fetchSrc (data->src, data->xSrc, data->ySrc + i, data->width, src_buffer, 0, 0); if (mask_buffer) { PIXMAN_COMPOSE_FUNCTIONS.combineU[PIXMAN_OP_IN] (mask_buffer, src_buffer, data->width); src_mask_buffer = mask_buffer; } else src_mask_buffer = src_buffer; fetchSrc = NULL; } else { fetchSrc (data->src, data->xSrc, data->ySrc + i, data->width, src_buffer, mask_buffer, 0xff000000); if (mask_buffer) PIXMAN_COMPOSE_FUNCTIONS.combineMaskU (src_buffer, mask_buffer, data->width); src_mask_buffer = src_buffer; } } else if (fetchMask) { fetchMask (data->mask, data->xMask, data->yMask + i, data->width, mask_buffer, 0, 0); PIXMAN_COMPOSE_FUNCTIONS.combineU[PIXMAN_OP_IN] (mask_buffer, src_buffer, data->width); src_mask_buffer = mask_buffer; } if (store) { /* fill dest into second half of scanline */ if (fetchDest) fetchDest (data->dest, data->xDest, data->yDest + i, data->width, dest_buffer, 0, 0); /* blend */ compose (dest_buffer, src_mask_buffer, data->width); /* write back */ store (data->dest, data->xDest, data->yDest + i, data->width, dest_buffer); } else { /* blend */ compose (bits + (data->yDest + i+ yoff) * stride + data->xDest + xoff, src_mask_buffer, data->width); } } } } #ifndef PIXMAN_FB_ACCESSORS void pixman_composite_rect_general (const FbComposeData *data, uint32_t *scanline_buffer) { if (data->src->common.read_func || data->src->common.write_func || (data->mask && data->mask->common.read_func) || (data->mask && data->mask->common.write_func) || data->dest->common.read_func || data->dest->common.write_func) { pixman_composite_rect_general_accessors (data, scanline_buffer); } else { pixman_composite_rect_general_no_accessors (data, scanline_buffer); } } #endif libgdiplus-2.11/pixman/pixman/Makefile.in0000664000175000017500000005416312225470236015367 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ # mmx code @USE_MMX_TRUE@am__append_1 = libpixman-mmx.la @USE_MMX_TRUE@am__append_2 = libpixman-mmx.la # sse2 code @USE_SSE2_TRUE@am__append_3 = libpixman-sse.la @USE_SSE2_TRUE@am__append_4 = libpixman-sse.la subdir = pixman DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/pixman-version.h.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = pixman-version.h CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libpixman_1_la_DEPENDENCIES = $(am__append_2) $(am__append_4) am_libpixman_1_la_OBJECTS = pixman-access.lo \ pixman-access-accessors.lo pixman-region.lo pixman-image.lo \ pixman-combine.lo pixman-compose.lo \ pixman-compose-accessors.lo pixman-pict.lo pixman-source.lo \ pixman-transformed.lo pixman-transformed-accessors.lo \ pixman-utils.lo pixman-edge.lo pixman-edge-accessors.lo \ pixman-trap.lo pixman-compute-region.lo pixman-timer.lo libpixman_1_la_OBJECTS = $(am_libpixman_1_la_OBJECTS) libpixman_1_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libpixman_1_la_LDFLAGS) $(LDFLAGS) -o $@ am__DEPENDENCIES_1 = @USE_MMX_TRUE@libpixman_mmx_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libpixman_mmx_la_SOURCES_DIST = pixman-mmx.c pixman-mmx.h @USE_MMX_TRUE@am_libpixman_mmx_la_OBJECTS = \ @USE_MMX_TRUE@ libpixman_mmx_la-pixman-mmx.lo libpixman_mmx_la_OBJECTS = $(am_libpixman_mmx_la_OBJECTS) libpixman_mmx_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpixman_mmx_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @USE_MMX_TRUE@am_libpixman_mmx_la_rpath = @USE_SSE2_TRUE@libpixman_sse_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libpixman_sse_la_SOURCES_DIST = pixman-sse.c pixman-sse.h @USE_SSE2_TRUE@am_libpixman_sse_la_OBJECTS = \ @USE_SSE2_TRUE@ libpixman_sse_la-pixman-sse.lo libpixman_sse_la_OBJECTS = $(am_libpixman_sse_la_OBJECTS) libpixman_sse_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libpixman_sse_la_CFLAGS) \ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ @USE_SSE2_TRUE@am_libpixman_sse_la_rpath = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libpixman_1_la_SOURCES) $(libpixman_mmx_la_SOURCES) \ $(libpixman_sse_la_SOURCES) DIST_SOURCES = $(libpixman_1_la_SOURCES) \ $(am__libpixman_mmx_la_SOURCES_DIST) \ $(am__libpixman_sse_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DEP_CFLAGS = @DEP_CFLAGS@ DEP_LIBS = @DEP_LIBS@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ GTK_CFLAGS = @GTK_CFLAGS@ GTK_LIBS = @GTK_LIBS@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_VERSION_INFO = @LT_VERSION_INFO@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MMX_CFLAGS = @MMX_CFLAGS@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PIXMAN_VERSION_MAJOR = @PIXMAN_VERSION_MAJOR@ PIXMAN_VERSION_MICRO = @PIXMAN_VERSION_MICRO@ PIXMAN_VERSION_MINOR = @PIXMAN_VERSION_MINOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SSE_CFLAGS = @SSE_CFLAGS@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LTLIBRARIES = libpixman-1.la $(am__append_1) $(am__append_3) libpixman_1_la_LDFLAGS = -version-info $(LT_VERSION_INFO) libpixman_1_la_LIBADD = @DEP_LIBS@ -lm $(am__append_2) $(am__append_4) libpixman_1_la_SOURCES = \ pixman.h \ pixman-access.c \ pixman-access-accessors.c \ pixman-embed.h \ pixman-region.c \ pixman-private.h \ pixman-image.c \ pixman-combine.c \ pixman-compose.c \ pixman-compose-accessors.c \ pixman-pict.c \ pixman-source.c \ pixman-transformed.c \ pixman-transformed-accessors.c \ pixman-utils.c \ pixman-edge.c \ pixman-edge-accessors.c \ pixman-edge-imp.h \ pixman-trap.c \ pixman-compute-region.c \ pixman-timer.c #libpixmanincludedir = $(includedir)/pixman-1/ noinst_HEADERS = pixman.h pixman-version.h EXTRA_DIST = Makefile.win32 @USE_MMX_TRUE@libpixman_mmx_la_SOURCES = \ @USE_MMX_TRUE@ pixman-mmx.c \ @USE_MMX_TRUE@ pixman-mmx.h @USE_MMX_TRUE@libpixman_mmx_la_CFLAGS = $(DEP_CFLAGS) $(MMX_CFLAGS) @USE_MMX_TRUE@libpixman_mmx_la_LIBADD = $(DEP_LIBS) @USE_SSE2_TRUE@libpixman_sse_la_SOURCES = \ @USE_SSE2_TRUE@ pixman-sse.c \ @USE_SSE2_TRUE@ pixman-sse.h @USE_SSE2_TRUE@libpixman_sse_la_CFLAGS = $(DEP_CFLAGS) $(SSE_CFLAGS) @USE_SSE2_TRUE@libpixman_sse_la_LIBADD = $(DEP_LIBS) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pixman/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu pixman/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): pixman-version.h: $(top_builddir)/config.status $(srcdir)/pixman-version.h.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libpixman-1.la: $(libpixman_1_la_OBJECTS) $(libpixman_1_la_DEPENDENCIES) $(EXTRA_libpixman_1_la_DEPENDENCIES) $(libpixman_1_la_LINK) $(libpixman_1_la_OBJECTS) $(libpixman_1_la_LIBADD) $(LIBS) libpixman-mmx.la: $(libpixman_mmx_la_OBJECTS) $(libpixman_mmx_la_DEPENDENCIES) $(EXTRA_libpixman_mmx_la_DEPENDENCIES) $(libpixman_mmx_la_LINK) $(am_libpixman_mmx_la_rpath) $(libpixman_mmx_la_OBJECTS) $(libpixman_mmx_la_LIBADD) $(LIBS) libpixman-sse.la: $(libpixman_sse_la_OBJECTS) $(libpixman_sse_la_DEPENDENCIES) $(EXTRA_libpixman_sse_la_DEPENDENCIES) $(libpixman_sse_la_LINK) $(am_libpixman_sse_la_rpath) $(libpixman_sse_la_OBJECTS) $(libpixman_sse_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpixman_mmx_la-pixman-mmx.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpixman_sse_la-pixman-sse.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-access-accessors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-access.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-combine.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-compose-accessors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-compose.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-compute-region.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-edge-accessors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-edge.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-image.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-pict.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-region.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-source.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-timer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-transformed-accessors.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-transformed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-trap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pixman-utils.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libpixman_mmx_la-pixman-mmx.lo: pixman-mmx.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpixman_mmx_la_CFLAGS) $(CFLAGS) -MT libpixman_mmx_la-pixman-mmx.lo -MD -MP -MF $(DEPDIR)/libpixman_mmx_la-pixman-mmx.Tpo -c -o libpixman_mmx_la-pixman-mmx.lo `test -f 'pixman-mmx.c' || echo '$(srcdir)/'`pixman-mmx.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libpixman_mmx_la-pixman-mmx.Tpo $(DEPDIR)/libpixman_mmx_la-pixman-mmx.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pixman-mmx.c' object='libpixman_mmx_la-pixman-mmx.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpixman_mmx_la_CFLAGS) $(CFLAGS) -c -o libpixman_mmx_la-pixman-mmx.lo `test -f 'pixman-mmx.c' || echo '$(srcdir)/'`pixman-mmx.c libpixman_sse_la-pixman-sse.lo: pixman-sse.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpixman_sse_la_CFLAGS) $(CFLAGS) -MT libpixman_sse_la-pixman-sse.lo -MD -MP -MF $(DEPDIR)/libpixman_sse_la-pixman-sse.Tpo -c -o libpixman_sse_la-pixman-sse.lo `test -f 'pixman-sse.c' || echo '$(srcdir)/'`pixman-sse.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libpixman_sse_la-pixman-sse.Tpo $(DEPDIR)/libpixman_sse_la-pixman-sse.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='pixman-sse.c' object='libpixman_sse_la-pixman-sse.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpixman_sse_la_CFLAGS) $(CFLAGS) -c -o libpixman_sse_la-pixman-sse.lo `test -f 'pixman-sse.c' || echo '$(srcdir)/'`pixman-sse.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstLTLIBRARIES ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/pixman/pixman/pixman-combine.c0000664000175000017500000007457112225470167016404 00000000000000#ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" /* * There are two ways of handling alpha -- either as a single unified value or * a separate value for each component, hence each macro must have two * versions. The unified alpha version has a 'U' at the end of the name, * the component version has a 'C'. Similarly, functions which deal with * this difference will have two versions using the same convention. */ /* * Combine src and mask */ FASTCALL void pixman_fbCombineMaskU (uint32_t *src, const uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t a = *(mask + i) >> 24; uint32_t s = *(src + i); FbByteMul(s, a); *(src + i) = s; } } /* * All of the composing functions */ FASTCALL static void fbCombineClear (uint32_t *dest, const uint32_t *src, int width) { memset(dest, 0, width*sizeof(uint32_t)); } FASTCALL static void fbCombineSrcU (uint32_t *dest, const uint32_t *src, int width) { memcpy(dest, src, width*sizeof(uint32_t)); } /* if the Src is opaque, call fbCombineSrcU */ FASTCALL static void fbCombineOverU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t ia = Alpha(~s); FbByteMulAdd(d, ia, s); *(dest + i) = d; } } /* if the Dst is opaque, this is a noop */ FASTCALL static void fbCombineOverReverseU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t ia = Alpha(~*(dest + i)); FbByteMulAdd(s, ia, d); *(dest + i) = s; } } /* if the Dst is opaque, call fbCombineSrcU */ FASTCALL static void fbCombineInU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t a = Alpha(*(dest + i)); FbByteMul(s, a); *(dest + i) = s; } } /* if the Src is opaque, this is a noop */ FASTCALL static void fbCombineInReverseU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t a = Alpha(*(src + i)); FbByteMul(d, a); *(dest + i) = d; } } /* if the Dst is opaque, call fbCombineClear */ FASTCALL static void fbCombineOutU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t a = Alpha(~*(dest + i)); FbByteMul(s, a); *(dest + i) = s; } } /* if the Src is opaque, call fbCombineClear */ FASTCALL static void fbCombineOutReverseU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t a = Alpha(~*(src + i)); FbByteMul(d, a); *(dest + i) = d; } } /* if the Src is opaque, call fbCombineInU */ /* if the Dst is opaque, call fbCombineOverU */ /* if both the Src and Dst are opaque, call fbCombineSrcU */ FASTCALL static void fbCombineAtopU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t dest_a = Alpha(d); uint32_t src_ia = Alpha(~s); FbByteAddMul(s, dest_a, d, src_ia); *(dest + i) = s; } } /* if the Src is opaque, call fbCombineOverReverseU */ /* if the Dst is opaque, call fbCombineInReverseU */ /* if both the Src and Dst are opaque, call fbCombineDstU */ FASTCALL static void fbCombineAtopReverseU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t src_a = Alpha(s); uint32_t dest_ia = Alpha(~d); FbByteAddMul(s, dest_ia, d, src_a); *(dest + i) = s; } } /* if the Src is opaque, call fbCombineOverU */ /* if the Dst is opaque, call fbCombineOverReverseU */ /* if both the Src and Dst are opaque, call fbCombineClear */ FASTCALL static void fbCombineXorU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t src_ia = Alpha(~s); uint32_t dest_ia = Alpha(~d); FbByteAddMul(s, dest_ia, d, src_ia); *(dest + i) = s; } } FASTCALL static void fbCombineAddU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); FbByteAdd(d, s); *(dest + i) = d; } } /* if the Src is opaque, call fbCombineAddU */ /* if the Dst is opaque, call fbCombineAddU */ /* if both the Src and Dst are opaque, call fbCombineAddU */ FASTCALL static void fbCombineSaturateU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint16_t sa, da; sa = s >> 24; da = ~d >> 24; if (sa > da) { sa = FbIntDiv(da, sa); FbByteMul(s, sa); }; FbByteAdd(d, s); *(dest + i) = d; } } /* * All of the disjoint composing functions The four entries in the first column indicate what source contributions come from each of the four areas of the picture -- areas covered by neither A nor B, areas covered only by A, areas covered only by B and finally areas covered by both A and B. Disjoint Conjoint Fa Fb Fa Fb (0,0,0,0) 0 0 0 0 (0,A,0,A) 1 0 1 0 (0,0,B,B) 0 1 0 1 (0,A,B,A) 1 min((1-a)/b,1) 1 max(1-a/b,0) (0,A,B,B) min((1-b)/a,1) 1 max(1-b/a,0) 1 (0,0,0,A) max(1-(1-b)/a,0) 0 min(1,b/a) 0 (0,0,0,B) 0 max(1-(1-a)/b,0) 0 min(a/b,1) (0,A,0,0) min(1,(1-b)/a) 0 max(1-b/a,0) 0 (0,0,B,0) 0 min(1,(1-a)/b) 0 max(1-a/b,0) (0,0,B,A) max(1-(1-b)/a,0) min(1,(1-a)/b) min(1,b/a) max(1-a/b,0) (0,A,0,B) min(1,(1-b)/a) max(1-(1-a)/b,0) max(1-b/a,0) min(1,a/b) (0,A,B,0) min(1,(1-b)/a) min(1,(1-a)/b) max(1-b/a,0) max(1-a/b,0) */ #define CombineAOut 1 #define CombineAIn 2 #define CombineBOut 4 #define CombineBIn 8 #define CombineClear 0 #define CombineA (CombineAOut|CombineAIn) #define CombineB (CombineBOut|CombineBIn) #define CombineAOver (CombineAOut|CombineBOut|CombineAIn) #define CombineBOver (CombineAOut|CombineBOut|CombineBIn) #define CombineAAtop (CombineBOut|CombineAIn) #define CombineBAtop (CombineAOut|CombineBIn) #define CombineXor (CombineAOut|CombineBOut) /* portion covered by a but not b */ FASTCALL static uint8_t fbCombineDisjointOutPart (uint8_t a, uint8_t b) { /* min (1, (1-b) / a) */ b = ~b; /* 1 - b */ if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ return 0xff; /* 1 */ return FbIntDiv(b,a); /* (1-b) / a */ } /* portion covered by both a and b */ FASTCALL static uint8_t fbCombineDisjointInPart (uint8_t a, uint8_t b) { /* max (1-(1-b)/a,0) */ /* = - min ((1-b)/a - 1, 0) */ /* = 1 - min (1, (1-b)/a) */ b = ~b; /* 1 - b */ if (b >= a) /* 1 - b >= a -> (1-b)/a >= 1 */ return 0; /* 1 - 1 */ return ~FbIntDiv(b,a); /* 1 - (1-b) / a */ } /* portion covered by a but not b */ FASTCALL static uint8_t fbCombineConjointOutPart (uint8_t a, uint8_t b) { /* max (1-b/a,0) */ /* = 1-min(b/a,1) */ /* min (1, (1-b) / a) */ if (b >= a) /* b >= a -> b/a >= 1 */ return 0x00; /* 0 */ return ~FbIntDiv(b,a); /* 1 - b/a */ } /* portion covered by both a and b */ FASTCALL static uint8_t fbCombineConjointInPart (uint8_t a, uint8_t b) { /* min (1,b/a) */ if (b >= a) /* b >= a -> b/a >= 1 */ return 0xff; /* 1 */ return FbIntDiv(b,a); /* b/a */ } FASTCALL static void fbCombineDisjointGeneralU (uint32_t *dest, const uint32_t *src, int width, uint8_t combine) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t m,n,o,p; uint16_t Fa, Fb, t, u, v; uint8_t sa = s >> 24; uint8_t da = d >> 24; switch (combine & CombineA) { default: Fa = 0; break; case CombineAOut: Fa = fbCombineDisjointOutPart (sa, da); break; case CombineAIn: Fa = fbCombineDisjointInPart (sa, da); break; case CombineA: Fa = 0xff; break; } switch (combine & CombineB) { default: Fb = 0; break; case CombineBOut: Fb = fbCombineDisjointOutPart (da, sa); break; case CombineBIn: Fb = fbCombineDisjointInPart (da, sa); break; case CombineB: Fb = 0xff; break; } m = FbGen (s,d,0,Fa,Fb,t, u, v); n = FbGen (s,d,8,Fa,Fb,t, u, v); o = FbGen (s,d,16,Fa,Fb,t, u, v); p = FbGen (s,d,24,Fa,Fb,t, u, v); s = m|n|o|p; *(dest + i) = s; } } FASTCALL static void fbCombineDisjointOverU (uint32_t *dest, const uint32_t *src, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint16_t a = s >> 24; if (a != 0x00) { if (a != 0xff) { uint32_t d = *(dest + i); a = fbCombineDisjointOutPart (d >> 24, a); FbByteMulAdd(d, a, s); s = d; } *(dest + i) = s; } } } FASTCALL static void fbCombineDisjointInU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineAIn); } FASTCALL static void fbCombineDisjointInReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineBIn); } FASTCALL static void fbCombineDisjointOutU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineAOut); } FASTCALL static void fbCombineDisjointOutReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineBOut); } FASTCALL static void fbCombineDisjointAtopU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineAAtop); } FASTCALL static void fbCombineDisjointAtopReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineBAtop); } FASTCALL static void fbCombineDisjointXorU (uint32_t *dest, const uint32_t *src, int width) { fbCombineDisjointGeneralU (dest, src, width, CombineXor); } FASTCALL static void fbCombineConjointGeneralU (uint32_t *dest, const uint32_t *src, int width, uint8_t combine) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t d = *(dest + i); uint32_t m,n,o,p; uint16_t Fa, Fb, t, u, v; uint8_t sa = s >> 24; uint8_t da = d >> 24; switch (combine & CombineA) { default: Fa = 0; break; case CombineAOut: Fa = fbCombineConjointOutPart (sa, da); break; case CombineAIn: Fa = fbCombineConjointInPart (sa, da); break; case CombineA: Fa = 0xff; break; } switch (combine & CombineB) { default: Fb = 0; break; case CombineBOut: Fb = fbCombineConjointOutPart (da, sa); break; case CombineBIn: Fb = fbCombineConjointInPart (da, sa); break; case CombineB: Fb = 0xff; break; } m = FbGen (s,d,0,Fa,Fb,t, u, v); n = FbGen (s,d,8,Fa,Fb,t, u, v); o = FbGen (s,d,16,Fa,Fb,t, u, v); p = FbGen (s,d,24,Fa,Fb,t, u, v); s = m|n|o|p; *(dest + i) = s; } } FASTCALL static void fbCombineConjointOverU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineAOver); } FASTCALL static void fbCombineConjointOverReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineBOver); } FASTCALL static void fbCombineConjointInU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineAIn); } FASTCALL static void fbCombineConjointInReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineBIn); } FASTCALL static void fbCombineConjointOutU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineAOut); } FASTCALL static void fbCombineConjointOutReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineBOut); } FASTCALL static void fbCombineConjointAtopU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineAAtop); } FASTCALL static void fbCombineConjointAtopReverseU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineBAtop); } FASTCALL static void fbCombineConjointXorU (uint32_t *dest, const uint32_t *src, int width) { fbCombineConjointGeneralU (dest, src, width, CombineXor); } /********************************************************************************/ /*************************** Per Channel functions ******************************/ /********************************************************************************/ FASTCALL static void fbCombineMaskC (uint32_t *src, uint32_t *mask) { uint32_t a = *mask; uint32_t x; uint16_t xa; if (!a) { *(src) = 0; return; } x = *(src); if (a == 0xffffffff) { x = x >> 24; x |= x << 8; x |= x << 16; *(mask) = x; return; } xa = x >> 24; FbByteMulC(x, a); *(src) = x; FbByteMul(a, xa); *(mask) = a; } FASTCALL static void fbCombineMaskValueC (uint32_t *src, const uint32_t *mask) { uint32_t a = *mask; uint32_t x; if (!a) { *(src) = 0; return; } if (a == 0xffffffff) return; x = *(src); FbByteMulC(x, a); *(src) =x; } FASTCALL static void fbCombineMaskAlphaC (const uint32_t *src, uint32_t *mask) { uint32_t a = *(mask); uint32_t x; if (!a) return; x = *(src) >> 24; if (x == 0xff) return; if (a == 0xffffffff) { x = x >> 24; x |= x << 8; x |= x << 16; *(mask) = x; return; } FbByteMul(a, x); *(mask) = a; } FASTCALL static void fbCombineClearC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { memset(dest, 0, width*sizeof(uint32_t)); } FASTCALL static void fbCombineSrcC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t m = *(mask + i); fbCombineMaskValueC (&s, &m); *(dest) = s; } } FASTCALL static void fbCombineOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t a; fbCombineMaskC (&s, &m); a = ~m; if (a != 0xffffffff) { if (a) { uint32_t d = *(dest + i); FbByteMulAddC(d, a, s); s = d; } *(dest + i) = s; } } } FASTCALL static void fbCombineOverReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t a = ~d >> 24; if (a) { uint32_t s = *(src + i); uint32_t m = *(mask + i); fbCombineMaskValueC (&s, &m); if (a != 0xff) { FbByteMulAdd(s, a, d); } *(dest + i) = s; } } } FASTCALL static void fbCombineInC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint16_t a = d >> 24; uint32_t s = 0; if (a) { uint32_t m = *(mask + i); s = *(src + i); fbCombineMaskValueC (&s, &m); if (a != 0xff) { FbByteMul(s, a); } } *(dest + i) = s; } } FASTCALL static void fbCombineInReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t a; fbCombineMaskAlphaC (&s, &m); a = m; if (a != 0xffffffff) { uint32_t d = 0; if (a) { d = *(dest + i); FbByteMulC(d, a); } *(dest + i) = d; } } } FASTCALL static void fbCombineOutC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint16_t a = ~d >> 24; uint32_t s = 0; if (a) { uint32_t m = *(mask + i); s = *(src + i); fbCombineMaskValueC (&s, &m); if (a != 0xff) { FbByteMul(s, a); } } *(dest + i) = s; } } FASTCALL static void fbCombineOutReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t a; fbCombineMaskAlphaC (&s, &m); a = ~m; if (a != 0xffffffff) { uint32_t d = 0; if (a) { d = *(dest + i); FbByteMulC(d, a); } *(dest + i) = d; } } } FASTCALL static void fbCombineAtopC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t ad; uint16_t as = d >> 24; fbCombineMaskC (&s, &m); ad = ~m; FbByteAddMulC(d, ad, s, as); *(dest + i) = d; } } FASTCALL static void fbCombineAtopReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t ad; uint16_t as = ~d >> 24; fbCombineMaskC (&s, &m); ad = m; FbByteAddMulC(d, ad, s, as); *(dest + i) = d; } } FASTCALL static void fbCombineXorC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t d = *(dest + i); uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t ad; uint16_t as = ~d >> 24; fbCombineMaskC (&s, &m); ad = ~m; FbByteAddMulC(d, ad, s, as); *(dest + i) = d; } } FASTCALL static void fbCombineAddC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s = *(src + i); uint32_t m = *(mask + i); uint32_t d = *(dest + i); fbCombineMaskValueC (&s, &m); FbByteAdd(d, s); *(dest + i) = d; } } FASTCALL static void fbCombineSaturateC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { int i; for (i = 0; i < width; ++i) { uint32_t s, d; uint16_t sa, sr, sg, sb, da; uint16_t t, u, v; uint32_t m,n,o,p; d = *(dest + i); s = *(src + i); m = *(mask + i); fbCombineMaskC (&s, &m); sa = (m >> 24); sr = (m >> 16) & 0xff; sg = (m >> 8) & 0xff; sb = (m ) & 0xff; da = ~d >> 24; if (sb <= da) m = FbAdd(s,d,0,t); else m = FbGen (s, d, 0, (da << 8) / sb, 0xff, t, u, v); if (sg <= da) n = FbAdd(s,d,8,t); else n = FbGen (s, d, 8, (da << 8) / sg, 0xff, t, u, v); if (sr <= da) o = FbAdd(s,d,16,t); else o = FbGen (s, d, 16, (da << 8) / sr, 0xff, t, u, v); if (sa <= da) p = FbAdd(s,d,24,t); else p = FbGen (s, d, 24, (da << 8) / sa, 0xff, t, u, v); *(dest + i) = m|n|o|p; } } FASTCALL static void fbCombineDisjointGeneralC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width, uint8_t combine) { int i; for (i = 0; i < width; ++i) { uint32_t s, d; uint32_t m,n,o,p; uint32_t Fa, Fb; uint16_t t, u, v; uint32_t sa; uint8_t da; s = *(src + i); m = *(mask + i); d = *(dest + i); da = d >> 24; fbCombineMaskC (&s, &m); sa = m; switch (combine & CombineA) { default: Fa = 0; break; case CombineAOut: m = fbCombineDisjointOutPart ((uint8_t) (sa >> 0), da); n = fbCombineDisjointOutPart ((uint8_t) (sa >> 8), da) << 8; o = fbCombineDisjointOutPart ((uint8_t) (sa >> 16), da) << 16; p = fbCombineDisjointOutPart ((uint8_t) (sa >> 24), da) << 24; Fa = m|n|o|p; break; case CombineAIn: m = fbCombineDisjointInPart ((uint8_t) (sa >> 0), da); n = fbCombineDisjointInPart ((uint8_t) (sa >> 8), da) << 8; o = fbCombineDisjointInPart ((uint8_t) (sa >> 16), da) << 16; p = fbCombineDisjointInPart ((uint8_t) (sa >> 24), da) << 24; Fa = m|n|o|p; break; case CombineA: Fa = 0xffffffff; break; } switch (combine & CombineB) { default: Fb = 0; break; case CombineBOut: m = fbCombineDisjointOutPart (da, (uint8_t) (sa >> 0)); n = fbCombineDisjointOutPart (da, (uint8_t) (sa >> 8)) << 8; o = fbCombineDisjointOutPart (da, (uint8_t) (sa >> 16)) << 16; p = fbCombineDisjointOutPart (da, (uint8_t) (sa >> 24)) << 24; Fb = m|n|o|p; break; case CombineBIn: m = fbCombineDisjointInPart (da, (uint8_t) (sa >> 0)); n = fbCombineDisjointInPart (da, (uint8_t) (sa >> 8)) << 8; o = fbCombineDisjointInPart (da, (uint8_t) (sa >> 16)) << 16; p = fbCombineDisjointInPart (da, (uint8_t) (sa >> 24)) << 24; Fb = m|n|o|p; break; case CombineB: Fb = 0xffffffff; break; } m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t, u, v); n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t, u, v); o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t, u, v); p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t, u, v); s = m|n|o|p; *(dest + i) = s; } } FASTCALL static void fbCombineDisjointOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineAOver); } FASTCALL static void fbCombineDisjointInC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineAIn); } FASTCALL static void fbCombineDisjointInReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineBIn); } FASTCALL static void fbCombineDisjointOutC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineAOut); } FASTCALL static void fbCombineDisjointOutReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineBOut); } FASTCALL static void fbCombineDisjointAtopC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineAAtop); } FASTCALL static void fbCombineDisjointAtopReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineBAtop); } FASTCALL static void fbCombineDisjointXorC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineDisjointGeneralC (dest, src, mask, width, CombineXor); } FASTCALL static void fbCombineConjointGeneralC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width, uint8_t combine) { int i; for (i = 0; i < width; ++i) { uint32_t s, d; uint32_t m,n,o,p; uint32_t Fa, Fb; uint16_t t, u, v; uint32_t sa; uint8_t da; s = *(src + i); m = *(mask + i); d = *(dest + i); da = d >> 24; fbCombineMaskC (&s, &m); sa = m; switch (combine & CombineA) { default: Fa = 0; break; case CombineAOut: m = fbCombineConjointOutPart ((uint8_t) (sa >> 0), da); n = fbCombineConjointOutPart ((uint8_t) (sa >> 8), da) << 8; o = fbCombineConjointOutPart ((uint8_t) (sa >> 16), da) << 16; p = fbCombineConjointOutPart ((uint8_t) (sa >> 24), da) << 24; Fa = m|n|o|p; break; case CombineAIn: m = fbCombineConjointInPart ((uint8_t) (sa >> 0), da); n = fbCombineConjointInPart ((uint8_t) (sa >> 8), da) << 8; o = fbCombineConjointInPart ((uint8_t) (sa >> 16), da) << 16; p = fbCombineConjointInPart ((uint8_t) (sa >> 24), da) << 24; Fa = m|n|o|p; break; case CombineA: Fa = 0xffffffff; break; } switch (combine & CombineB) { default: Fb = 0; break; case CombineBOut: m = fbCombineConjointOutPart (da, (uint8_t) (sa >> 0)); n = fbCombineConjointOutPart (da, (uint8_t) (sa >> 8)) << 8; o = fbCombineConjointOutPart (da, (uint8_t) (sa >> 16)) << 16; p = fbCombineConjointOutPart (da, (uint8_t) (sa >> 24)) << 24; Fb = m|n|o|p; break; case CombineBIn: m = fbCombineConjointInPart (da, (uint8_t) (sa >> 0)); n = fbCombineConjointInPart (da, (uint8_t) (sa >> 8)) << 8; o = fbCombineConjointInPart (da, (uint8_t) (sa >> 16)) << 16; p = fbCombineConjointInPart (da, (uint8_t) (sa >> 24)) << 24; Fb = m|n|o|p; break; case CombineB: Fb = 0xffffffff; break; } m = FbGen (s,d,0,FbGet8(Fa,0),FbGet8(Fb,0),t, u, v); n = FbGen (s,d,8,FbGet8(Fa,8),FbGet8(Fb,8),t, u, v); o = FbGen (s,d,16,FbGet8(Fa,16),FbGet8(Fb,16),t, u, v); p = FbGen (s,d,24,FbGet8(Fa,24),FbGet8(Fb,24),t, u, v); s = m|n|o|p; *(dest + i) = s; } } FASTCALL static void fbCombineConjointOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineAOver); } FASTCALL static void fbCombineConjointOverReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineBOver); } FASTCALL static void fbCombineConjointInC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineAIn); } FASTCALL static void fbCombineConjointInReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineBIn); } FASTCALL static void fbCombineConjointOutC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineAOut); } FASTCALL static void fbCombineConjointOutReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineBOut); } FASTCALL static void fbCombineConjointAtopC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineAAtop); } FASTCALL static void fbCombineConjointAtopReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineBAtop); } FASTCALL static void fbCombineConjointXorC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { fbCombineConjointGeneralC (dest, src, mask, width, CombineXor); } CombineFuncU pixman_fbCombineFuncU[] = { fbCombineClear, fbCombineSrcU, NULL, /* CombineDst */ fbCombineOverU, fbCombineOverReverseU, fbCombineInU, fbCombineInReverseU, fbCombineOutU, fbCombineOutReverseU, fbCombineAtopU, fbCombineAtopReverseU, fbCombineXorU, fbCombineAddU, fbCombineSaturateU, NULL, NULL, fbCombineClear, fbCombineSrcU, NULL, /* CombineDst */ fbCombineDisjointOverU, fbCombineSaturateU, /* DisjointOverReverse */ fbCombineDisjointInU, fbCombineDisjointInReverseU, fbCombineDisjointOutU, fbCombineDisjointOutReverseU, fbCombineDisjointAtopU, fbCombineDisjointAtopReverseU, fbCombineDisjointXorU, NULL, NULL, NULL, NULL, fbCombineClear, fbCombineSrcU, NULL, /* CombineDst */ fbCombineConjointOverU, fbCombineConjointOverReverseU, fbCombineConjointInU, fbCombineConjointInReverseU, fbCombineConjointOutU, fbCombineConjointOutReverseU, fbCombineConjointAtopU, fbCombineConjointAtopReverseU, fbCombineConjointXorU, }; CombineFuncC pixman_fbCombineFuncC[] = { fbCombineClearC, fbCombineSrcC, NULL, /* Dest */ fbCombineOverC, fbCombineOverReverseC, fbCombineInC, fbCombineInReverseC, fbCombineOutC, fbCombineOutReverseC, fbCombineAtopC, fbCombineAtopReverseC, fbCombineXorC, fbCombineAddC, fbCombineSaturateC, NULL, NULL, fbCombineClearC, /* 0x10 */ fbCombineSrcC, NULL, /* Dest */ fbCombineDisjointOverC, fbCombineSaturateC, /* DisjointOverReverse */ fbCombineDisjointInC, fbCombineDisjointInReverseC, fbCombineDisjointOutC, fbCombineDisjointOutReverseC, fbCombineDisjointAtopC, fbCombineDisjointAtopReverseC, fbCombineDisjointXorC, /* 0x1b */ NULL, NULL, NULL, NULL, fbCombineClearC, fbCombineSrcC, NULL, /* Dest */ fbCombineConjointOverC, fbCombineConjointOverReverseC, fbCombineConjointInC, fbCombineConjointInReverseC, fbCombineConjointOutC, fbCombineConjointOutReverseC, fbCombineConjointAtopC, fbCombineConjointAtopReverseC, fbCombineConjointXorC, }; libgdiplus-2.11/pixman/pixman/pixman.h0000664000175000017500000006115312225470167014767 00000000000000/*********************************************************** Copyright 1987, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* * Copyright © 1998, 2004 Keith Packard * Copyright 2007 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef PIXMAN_H__ #define PIXMAN_H__ #include #include "pixman-embed.h" /* * Standard integers */ #if defined (__SVR4) && defined (__sun) # include # include #elif defined (__OpenBSD__) # include #elif defined (_MSC_VER) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else # include #endif /* GCC visibility */ #if defined(__GNUC__) && __GNUC__ >= 4 #define PIXMAN_EXPORT __attribute__ ((visibility("default"))) #else #define PIXMAN_EXPORT #endif /* * Boolean */ typedef int pixman_bool_t; /* * Fixpoint numbers */ typedef int64_t pixman_fixed_32_32_t; typedef pixman_fixed_32_32_t pixman_fixed_48_16_t; typedef uint32_t pixman_fixed_1_31_t; typedef uint32_t pixman_fixed_1_16_t; typedef int32_t pixman_fixed_16_16_t; typedef pixman_fixed_16_16_t pixman_fixed_t; #define pixman_fixed_e ((pixman_fixed_t) 1) #define pixman_fixed_1 (pixman_int_to_fixed(1)) #define pixman_fixed_1_minus_e (pixman_fixed_1 - pixman_fixed_e) #define pixman_fixed_to_int(f) ((int) ((f) >> 16)) #define pixman_int_to_fixed(i) ((pixman_fixed_t) ((i) << 16)) #define pixman_fixed_to_double(f) (double) ((f) / (double) pixman_fixed_1) #define pixman_double_to_fixed(d) ((pixman_fixed_t) ((d) * 65536.0)) #define pixman_fixed_frac(f) ((f) & pixman_fixed_1_minus_e) #define pixman_fixed_floor(f) ((f) & ~pixman_fixed_1_minus_e) #define pixman_fixed_ceil(f) pixman_fixed_floor ((f) + pixman_fixed_1_minus_e) #define pixman_fixed_fraction(f) ((f) & pixman_fixed_1_minus_e) #define pixman_fixed_mod_2(f) ((f) & (pixman_fixed1 | pixman_fixed_1_minus_e)) #define pixman_max_fixed_48_16 ((pixman_fixed_48_16_t) 0x7fffffff) #define pixman_min_fixed_48_16 (-((pixman_fixed_48_16_t) 1 << 31)) /* * Misc structs */ typedef struct pixman_color pixman_color_t; typedef struct pixman_point_fixed pixman_point_fixed_t; typedef struct pixman_line_fixed pixman_line_fixed_t; typedef struct pixman_vector pixman_vector_t; typedef struct pixman_transform pixman_transform_t; struct pixman_color { uint16_t red; uint16_t green; uint16_t blue; uint16_t alpha; }; struct pixman_point_fixed { pixman_fixed_t x; pixman_fixed_t y; }; struct pixman_line_fixed { pixman_point_fixed_t p1, p2; }; struct pixman_vector { pixman_fixed_t vector[3]; }; struct pixman_transform { pixman_fixed_t matrix[3][3]; }; PIXMAN_EXPORT pixman_bool_t pixman_transform_point_3d (pixman_transform_t *transform, pixman_vector_t *vector); /* Don't blame me, blame XRender */ typedef enum { PIXMAN_REPEAT_NONE, PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_PAD, PIXMAN_REPEAT_REFLECT } pixman_repeat_t; typedef enum { PIXMAN_FILTER_FAST, PIXMAN_FILTER_GOOD, PIXMAN_FILTER_BEST, PIXMAN_FILTER_NEAREST, PIXMAN_FILTER_BILINEAR, PIXMAN_FILTER_CONVOLUTION } pixman_filter_t; typedef enum { PIXMAN_OP_CLEAR = 0x00, PIXMAN_OP_SRC = 0x01, PIXMAN_OP_DST = 0x02, PIXMAN_OP_OVER = 0x03, PIXMAN_OP_OVER_REVERSE = 0x04, PIXMAN_OP_IN = 0x05, PIXMAN_OP_IN_REVERSE = 0x06, PIXMAN_OP_OUT = 0x07, PIXMAN_OP_OUT_REVERSE = 0x08, PIXMAN_OP_ATOP = 0x09, PIXMAN_OP_ATOP_REVERSE = 0x0a, PIXMAN_OP_XOR = 0x0b, PIXMAN_OP_ADD = 0x0c, PIXMAN_OP_SATURATE = 0x0d, PIXMAN_OP_DISJOINT_CLEAR = 0x10, PIXMAN_OP_DISJOINT_SRC = 0x11, PIXMAN_OP_DISJOINT_DST = 0x12, PIXMAN_OP_DISJOINT_OVER = 0x13, PIXMAN_OP_DISJOINT_OVER_REVERSE = 0x14, PIXMAN_OP_DISJOINT_IN = 0x15, PIXMAN_OP_DISJOINT_IN_REVERSE = 0x16, PIXMAN_OP_DISJOINT_OUT = 0x17, PIXMAN_OP_DISJOINT_OUT_REVERSE = 0x18, PIXMAN_OP_DISJOINT_ATOP = 0x19, PIXMAN_OP_DISJOINT_ATOP_REVERSE = 0x1a, PIXMAN_OP_DISJOINT_XOR = 0x1b, PIXMAN_OP_CONJOINT_CLEAR = 0x20, PIXMAN_OP_CONJOINT_SRC = 0x21, PIXMAN_OP_CONJOINT_DST = 0x22, PIXMAN_OP_CONJOINT_OVER = 0x23, PIXMAN_OP_CONJOINT_OVER_REVERSE = 0x24, PIXMAN_OP_CONJOINT_IN = 0x25, PIXMAN_OP_CONJOINT_IN_REVERSE = 0x26, PIXMAN_OP_CONJOINT_OUT = 0x27, PIXMAN_OP_CONJOINT_OUT_REVERSE = 0x28, PIXMAN_OP_CONJOINT_ATOP = 0x29, PIXMAN_OP_CONJOINT_ATOP_REVERSE = 0x2a, PIXMAN_OP_CONJOINT_XOR = 0x2b, PIXMAN_OP_NONE } pixman_op_t; /* * Regions */ typedef struct pixman_region16_data pixman_region16_data_t; typedef struct pixman_box16 pixman_box16_t; typedef struct pixman_rectangle16 pixman_rectangle16_t; typedef struct pixman_region16 pixman_region16_t; struct pixman_region16_data { long size; long numRects; /* pixman_box16_t rects[size]; in memory but not explicitly declared */ }; struct pixman_rectangle16 { int16_t x, y; uint16_t width, height; }; struct pixman_box16 { int16_t x1, y1, x2, y2; }; struct pixman_region16 { pixman_box16_t extents; pixman_region16_data_t *data; }; typedef enum { PIXMAN_REGION_OUT, PIXMAN_REGION_IN, PIXMAN_REGION_PART } pixman_region_overlap_t; PIXMAN_EXPORT int pixman_version (void); PIXMAN_EXPORT const char* pixman_version_string (void); /* This function exists only to make it possible to preserve the X ABI - it should * go away at first opportunity. */ PIXMAN_EXPORT void pixman_region_set_static_pointers (pixman_box16_t *empty_box, pixman_region16_data_t *empty_data, pixman_region16_data_t *broken_data); /* creation/destruction */ PIXMAN_EXPORT void pixman_region_init (pixman_region16_t *region); PIXMAN_EXPORT void pixman_region_init_rect (pixman_region16_t *region, int x, int y, unsigned int width, unsigned int height); PIXMAN_EXPORT void pixman_region_init_with_extents (pixman_region16_t *region, pixman_box16_t *extents); PIXMAN_EXPORT void pixman_region_fini (pixman_region16_t *region); /* manipulation */ PIXMAN_EXPORT void pixman_region_translate (pixman_region16_t *region, int x, int y); PIXMAN_EXPORT pixman_bool_t pixman_region_copy (pixman_region16_t *dest, pixman_region16_t *source); PIXMAN_EXPORT pixman_bool_t pixman_region_intersect (pixman_region16_t *newReg, pixman_region16_t *reg1, pixman_region16_t *reg2); PIXMAN_EXPORT pixman_bool_t pixman_region_union (pixman_region16_t *newReg, pixman_region16_t *reg1, pixman_region16_t *reg2); PIXMAN_EXPORT pixman_bool_t pixman_region_union_rect (pixman_region16_t *dest, pixman_region16_t *source, int x, int y, unsigned int width, unsigned int height); PIXMAN_EXPORT pixman_bool_t pixman_region_subtract (pixman_region16_t *regD, pixman_region16_t *regM, pixman_region16_t *regS); PIXMAN_EXPORT pixman_bool_t pixman_region_inverse (pixman_region16_t *newReg, pixman_region16_t *reg1, pixman_box16_t *invRect); PIXMAN_EXPORT pixman_bool_t pixman_region_contains_point (pixman_region16_t *region, int x, int y, pixman_box16_t *box); PIXMAN_EXPORT pixman_region_overlap_t pixman_region_contains_rectangle (pixman_region16_t *pixman_region16_t, pixman_box16_t *prect); PIXMAN_EXPORT pixman_bool_t pixman_region_not_empty (pixman_region16_t *region); PIXMAN_EXPORT pixman_box16_t * pixman_region_extents (pixman_region16_t *region); PIXMAN_EXPORT int pixman_region_n_rects (pixman_region16_t *region); PIXMAN_EXPORT pixman_box16_t * pixman_region_rectangles (pixman_region16_t *region, int *n_rects); PIXMAN_EXPORT pixman_bool_t pixman_region_equal (pixman_region16_t *region1, pixman_region16_t *region2); PIXMAN_EXPORT pixman_bool_t pixman_region_selfcheck (pixman_region16_t *region); PIXMAN_EXPORT void pixman_region_reset (pixman_region16_t *region, pixman_box16_t *box); PIXMAN_EXPORT pixman_bool_t pixman_region_init_rects (pixman_region16_t *region, pixman_box16_t *boxes, int count); /* Copy / Fill */ PIXMAN_EXPORT pixman_bool_t pixman_blt (uint32_t *src_bits, uint32_t *dst_bits, int src_stride, int dst_stride, int src_bpp, int dst_bpp, int src_x, int src_y, int dst_x, int dst_y, int width, int height); PIXMAN_EXPORT pixman_bool_t pixman_fill (uint32_t *bits, int stride, int bpp, int x, int y, int width, int height, uint32_t _xor); /* * Images */ typedef union pixman_image pixman_image_t; typedef struct pixman_indexed pixman_indexed_t; typedef struct pixman_gradient_stop pixman_gradient_stop_t; typedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size); typedef void (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size); struct pixman_gradient_stop { pixman_fixed_t x; pixman_color_t color; }; #define PIXMAN_MAX_INDEXED 256 /* XXX depth must be <= 8 */ #if PIXMAN_MAX_INDEXED <= 256 typedef uint8_t pixman_index_type; #endif struct pixman_indexed { pixman_bool_t color; uint32_t rgba[PIXMAN_MAX_INDEXED]; pixman_index_type ent[32768]; }; /* * While the protocol is generous in format support, the * sample implementation allows only packed RGB and GBR * representations for data to simplify software rendering, */ #define PIXMAN_FORMAT(bpp,type,a,r,g,b) (((bpp) << 24) | \ ((type) << 16) | \ ((a) << 12) | \ ((r) << 8) | \ ((g) << 4) | \ ((b))) #define PIXMAN_FORMAT_BPP(f) (((f) >> 24) ) #define PIXMAN_FORMAT_TYPE(f) (((f) >> 16) & 0xff) #define PIXMAN_FORMAT_A(f) (((f) >> 12) & 0x0f) #define PIXMAN_FORMAT_R(f) (((f) >> 8) & 0x0f) #define PIXMAN_FORMAT_G(f) (((f) >> 4) & 0x0f) #define PIXMAN_FORMAT_B(f) (((f) ) & 0x0f) #define PIXMAN_FORMAT_RGB(f) (((f) ) & 0xfff) #define PIXMAN_FORMAT_VIS(f) (((f) ) & 0xffff) #define PIXMAN_FORMAT_DEPTH(f) (PIXMAN_FORMAT_A(f) + \ PIXMAN_FORMAT_R(f) + \ PIXMAN_FORMAT_G(f) + \ PIXMAN_FORMAT_B(f)) #define PIXMAN_TYPE_OTHER 0 #define PIXMAN_TYPE_A 1 #define PIXMAN_TYPE_ARGB 2 #define PIXMAN_TYPE_ABGR 3 #define PIXMAN_TYPE_COLOR 4 #define PIXMAN_TYPE_GRAY 5 #define PIXMAN_TYPE_YUY2 6 #define PIXMAN_TYPE_YV12 7 #define PIXMAN_FORMAT_COLOR(f) (PIXMAN_FORMAT_TYPE(f) & 2) /* 32bpp formats */ typedef enum { PIXMAN_a8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8), PIXMAN_x8r8g8b8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8), PIXMAN_a8b8g8r8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8), PIXMAN_x8b8g8r8 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8), /* 24bpp formats */ PIXMAN_r8g8b8 = PIXMAN_FORMAT(24,PIXMAN_TYPE_ARGB,0,8,8,8), PIXMAN_b8g8r8 = PIXMAN_FORMAT(24,PIXMAN_TYPE_ABGR,0,8,8,8), /* 16bpp formats */ PIXMAN_r5g6b5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,6,5), PIXMAN_b5g6r5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,6,5), PIXMAN_a1r5g5b5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,1,5,5,5), PIXMAN_x1r5g5b5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,5,5), PIXMAN_a1b5g5r5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,1,5,5,5), PIXMAN_x1b5g5r5 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,5,5), PIXMAN_a4r4g4b4 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,4,4,4,4), PIXMAN_x4r4g4b4 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,4,4,4), PIXMAN_a4b4g4r4 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,4,4,4,4), PIXMAN_x4b4g4r4 = PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,4,4,4), /* 8bpp formats */ PIXMAN_a8 = PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0), PIXMAN_r3g3b2 = PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,0,3,3,2), PIXMAN_b2g3r3 = PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,0,3,3,2), PIXMAN_a2r2g2b2 = PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,2,2,2,2), PIXMAN_a2b2g2r2 = PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,2,2,2,2), PIXMAN_c8 = PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0), PIXMAN_g8 = PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0), PIXMAN_x4a4 = PIXMAN_FORMAT(8,PIXMAN_TYPE_A,4,0,0,0), PIXMAN_x4c4 = PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0), PIXMAN_x4g4 = PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0), /* 4bpp formats */ PIXMAN_a4 = PIXMAN_FORMAT(4,PIXMAN_TYPE_A,4,0,0,0), PIXMAN_r1g2b1 = PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,0,1,2,1), PIXMAN_b1g2r1 = PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,0,1,2,1), PIXMAN_a1r1g1b1 = PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,1,1,1,1), PIXMAN_a1b1g1r1 = PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,1,1,1,1), PIXMAN_c4 = PIXMAN_FORMAT(4,PIXMAN_TYPE_COLOR,0,0,0,0), PIXMAN_g4 = PIXMAN_FORMAT(4,PIXMAN_TYPE_GRAY,0,0,0,0), /* 1bpp formats */ PIXMAN_a1 = PIXMAN_FORMAT(1,PIXMAN_TYPE_A,1,0,0,0), PIXMAN_g1 = PIXMAN_FORMAT(1,PIXMAN_TYPE_GRAY,0,0,0,0), /* YUV formats */ PIXMAN_yuy2 = PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0), PIXMAN_yv12 = PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0), } pixman_format_code_t; /* Querying supported format values. */ PIXMAN_EXPORT pixman_bool_t pixman_format_supported_destination (pixman_format_code_t format); PIXMAN_EXPORT pixman_bool_t pixman_format_supported_source (pixman_format_code_t format); /* Constructors */ PIXMAN_EXPORT pixman_image_t *pixman_image_create_solid_fill (pixman_color_t *color); PIXMAN_EXPORT pixman_image_t *pixman_image_create_linear_gradient (pixman_point_fixed_t *p1, pixman_point_fixed_t *p2, const pixman_gradient_stop_t *stops, int n_stops); PIXMAN_EXPORT pixman_image_t *pixman_image_create_radial_gradient (pixman_point_fixed_t *inner, pixman_point_fixed_t *outer, pixman_fixed_t inner_radius, pixman_fixed_t outer_radius, const pixman_gradient_stop_t *stops, int n_stops); PIXMAN_EXPORT pixman_image_t *pixman_image_create_conical_gradient (pixman_point_fixed_t *center, pixman_fixed_t angle, const pixman_gradient_stop_t *stops, int n_stops); PIXMAN_EXPORT pixman_image_t *pixman_image_create_bits (pixman_format_code_t format, int width, int height, uint32_t *bits, int rowstride_bytes); /* Destructor */ PIXMAN_EXPORT pixman_image_t *pixman_image_ref (pixman_image_t *image); PIXMAN_EXPORT pixman_bool_t pixman_image_unref (pixman_image_t *image); /* Set properties */ PIXMAN_EXPORT pixman_bool_t pixman_image_set_clip_region (pixman_image_t *image, pixman_region16_t *region); PIXMAN_EXPORT void pixman_image_set_has_client_clip (pixman_image_t *image, pixman_bool_t clien_clip); PIXMAN_EXPORT pixman_bool_t pixman_image_set_transform (pixman_image_t *image, const pixman_transform_t *transform); PIXMAN_EXPORT void pixman_image_set_repeat (pixman_image_t *image, pixman_repeat_t repeat); PIXMAN_EXPORT pixman_bool_t pixman_image_set_filter (pixman_image_t *image, pixman_filter_t filter, const pixman_fixed_t *filter_params, int n_filter_params); PIXMAN_EXPORT void pixman_image_set_filter_params (pixman_image_t *image, pixman_fixed_t *params, int n_params); PIXMAN_EXPORT void pixman_image_set_source_clipping (pixman_image_t *image, pixman_bool_t source_clipping); PIXMAN_EXPORT void pixman_image_set_alpha_map (pixman_image_t *image, pixman_image_t *alpha_map, int16_t x, int16_t y); PIXMAN_EXPORT void pixman_image_set_component_alpha (pixman_image_t *image, pixman_bool_t component_alpha); PIXMAN_EXPORT void pixman_image_set_accessors (pixman_image_t *image, pixman_read_memory_func_t read_func, pixman_write_memory_func_t write_func); PIXMAN_EXPORT void pixman_image_set_indexed (pixman_image_t *image, const pixman_indexed_t *indexed); PIXMAN_EXPORT uint32_t *pixman_image_get_data (pixman_image_t *image); PIXMAN_EXPORT int pixman_image_get_width (pixman_image_t *image); PIXMAN_EXPORT int pixman_image_get_height (pixman_image_t *image); PIXMAN_EXPORT int pixman_image_get_stride (pixman_image_t *image); PIXMAN_EXPORT int pixman_image_get_depth (pixman_image_t *image); PIXMAN_EXPORT pixman_bool_t pixman_image_fill_rectangles (pixman_op_t op, pixman_image_t *image, pixman_color_t *color, int n_rects, const pixman_rectangle16_t *rects); /* Composite */ PIXMAN_EXPORT pixman_bool_t pixman_compute_composite_region (pixman_region16_t * pRegion, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); PIXMAN_EXPORT void pixman_image_composite (pixman_op_t op, pixman_image_t *src, pixman_image_t *mask, pixman_image_t *dest, int16_t src_x, int16_t src_y, int16_t mask_x, int16_t mask_y, int16_t dest_x, int16_t dest_y, uint16_t width, uint16_t height); /* * Trapezoids */ typedef struct pixman_edge pixman_edge_t; typedef struct pixman_trapezoid pixman_trapezoid_t; typedef struct pixman_trap pixman_trap_t; typedef struct pixman_span_fix pixman_span_fix_t; /* * An edge structure. This represents a single polygon edge * and can be quickly stepped across small or large gaps in the * sample grid */ struct pixman_edge { pixman_fixed_t x; pixman_fixed_t e; pixman_fixed_t stepx; pixman_fixed_t signdx; pixman_fixed_t dy; pixman_fixed_t dx; pixman_fixed_t stepx_small; pixman_fixed_t stepx_big; pixman_fixed_t dx_small; pixman_fixed_t dx_big; }; struct pixman_trapezoid { pixman_fixed_t top, bottom; pixman_line_fixed_t left, right; }; /* whether 't' is a well defined not obviously empty trapezoid */ #define pixman_trapezoid_valid(t) \ ((t)->left.p1.y != (t)->left.p2.y && \ (t)->right.p1.y != (t)->right.p2.y && \ (int) ((t)->bottom - (t)->top) > 0) struct pixman_span_fix { pixman_fixed_t l, r, y; }; struct pixman_trap { pixman_span_fix_t top, bot; }; PIXMAN_EXPORT pixman_fixed_t pixman_sample_ceil_y (pixman_fixed_t y, int bpp); PIXMAN_EXPORT pixman_fixed_t pixman_sample_floor_y (pixman_fixed_t y, int bpp); PIXMAN_EXPORT void pixman_edge_step (pixman_edge_t *e, int n); PIXMAN_EXPORT void pixman_edge_init (pixman_edge_t *e, int bpp, pixman_fixed_t y_start, pixman_fixed_t x_top, pixman_fixed_t y_top, pixman_fixed_t x_bot, pixman_fixed_t y_bot); PIXMAN_EXPORT void pixman_line_fixed_edge_init (pixman_edge_t *e, int bpp, pixman_fixed_t y, const pixman_line_fixed_t *line, int x_off, int y_off); PIXMAN_EXPORT void pixman_rasterize_edges (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b); PIXMAN_EXPORT void pixman_add_traps (pixman_image_t *image, int16_t x_off, int16_t y_off, int ntrap, pixman_trap_t *traps); PIXMAN_EXPORT void pixman_add_trapezoids (pixman_image_t *image, int16_t x_off, int y_off, int ntraps, const pixman_trapezoid_t *traps); PIXMAN_EXPORT void pixman_rasterize_trapezoid (pixman_image_t *image, const pixman_trapezoid_t *trap, int x_off, int y_off); #endif /* PIXMAN_H__ */ libgdiplus-2.11/pixman/pixman/pixman-transformed-accessors.c0000664000175000017500000000007512225470167021263 00000000000000#define PIXMAN_FB_ACCESSORS #include "pixman-transformed.c" libgdiplus-2.11/pixman/pixman/pixman-sse.c0000664000175000017500000000306012225470167015543 00000000000000/* * Copyright © 2008 Rodrigo Kumpera * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Red Hat not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Red Hat makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Rodrigo Kumpera (kumpera@gmail.com) * */ #ifdef HAVE_CONFIG_H #include #endif #include "pixman-sse.h" #ifdef USE_SSE2 void fbComposeSetupSSE(void) { static pixman_bool_t initialized = FALSE; if (initialized) return; /* check if we have SSE2 support and initialize accordingly */ if (pixman_have_sse()) { } initialized = TRUE; } #endif /* USE_SSE2 */ libgdiplus-2.11/pixman/pixman/pixman-version.h.in0000664000175000017500000000350712225470167017056 00000000000000/* * Copyright © 2008 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Author: Carl D. Worth */ #ifndef PIXMAN_VERSION_H__ #define PIXMAN_VERSION_H__ #ifndef PIXMAN_H__ # error pixman-version.h should only be included by pixman.h #endif #define PIXMAN_VERSION_MAJOR @PIXMAN_VERSION_MAJOR@ #define PIXMAN_VERSION_MINOR @PIXMAN_VERSION_MINOR@ #define PIXMAN_VERSION_MICRO @PIXMAN_VERSION_MICRO@ #define PIXMAN_VERSION_STRING "@PIXMAN_VERSION_MAJOR@.@PIXMAN_VERSION_MINOR@.@PIXMAN_VERSION_MICRO@" #define PIXMAN_VERSION_ENCODE(major, minor, micro) ( \ ((major) * 10000) \ + ((minor) * 100) \ + ((micro) * 1)) #define PIXMAN_VERSION PIXMAN_VERSION_ENCODE( \ PIXMAN_VERSION_MAJOR, \ PIXMAN_VERSION_MINOR, \ PIXMAN_VERSION_MICRO) #endif /* PIXMAN_VERSION_H__ */ libgdiplus-2.11/pixman/pixman/pixman-edge-imp.h0000664000175000017500000000727412225470167016460 00000000000000/* * Copyright © 2004 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifndef rasterizeSpan #endif static void rasterizeEdges (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b) { pixman_fixed_t y = t; uint32_t *line; uint32_t *buf = (image)->bits.bits; int stride = (image)->bits.rowstride; int width = (image)->bits.width; line = buf + pixman_fixed_to_int (y) * stride; for (;;) { pixman_fixed_t lx; pixman_fixed_t rx; int lxi; int rxi; lx = l->x; rx = r->x; #if N_BITS == 1 /* For the non-antialiased case, round the coordinates up, in effect * sampling the center of the pixel. (The AA case does a similar * adjustment in RenderSamplesX) */ lx += X_FRAC_FIRST(1); rx += X_FRAC_FIRST(1); #endif /* clip X */ if (lx < 0) lx = 0; if (pixman_fixed_to_int (rx) >= width) #if N_BITS == 1 rx = pixman_int_to_fixed (width); #else /* Use the last pixel of the scanline, covered 100%. * We can't use the first pixel following the scanline, * because accessing it could result in a buffer overrun. */ rx = pixman_int_to_fixed (width) - 1; #endif /* Skip empty (or backwards) sections */ if (rx > lx) { /* Find pixel bounds for span */ lxi = pixman_fixed_to_int (lx); rxi = pixman_fixed_to_int (rx); #if N_BITS == 1 { uint32_t *a = line; uint32_t startmask; uint32_t endmask; int nmiddle; int width = rxi - lxi; int x = lxi; a += x >> FB_SHIFT; x &= FB_MASK; FbMaskBits (x, width, startmask, nmiddle, endmask); if (startmask) { WRITE(image, a, READ(image, a) | startmask); a++; } while (nmiddle--) WRITE(image, a++, FB_ALLONES); if (endmask) WRITE(image, a, READ(image, a) | endmask); } #else { DefineAlpha(line,lxi); int lxs; int rxs; /* Sample coverage for edge pixels */ lxs = RenderSamplesX (lx, N_BITS); rxs = RenderSamplesX (rx, N_BITS); /* Add coverage across row */ if (lxi == rxi) { AddAlpha (rxs - lxs); } else { int xi; AddAlpha (N_X_FRAC(N_BITS) - lxs); StepAlpha; for (xi = lxi + 1; xi < rxi; xi++) { AddAlpha (N_X_FRAC(N_BITS)); StepAlpha; } AddAlpha (rxs); } } #endif } if (y == b) break; #if N_BITS > 1 if (pixman_fixed_frac (y) != Y_FRAC_LAST(N_BITS)) { RenderEdgeStepSmall (l); RenderEdgeStepSmall (r); y += STEP_Y_SMALL(N_BITS); } else #endif { RenderEdgeStepBig (l); RenderEdgeStepBig (r); y += STEP_Y_BIG(N_BITS); line += stride; } } } #undef rasterizeSpan libgdiplus-2.11/pixman/pixman/pixman-image.c0000664000175000017500000003761112225470167016044 00000000000000/* * Copyright © 2000 SuSE, Inc. * Copyright © 2007 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "pixman-private.h" static void init_source_image (source_image_t *image) { image->class = SOURCE_IMAGE_CLASS_UNKNOWN; } static pixman_bool_t init_gradient (gradient_t *gradient, const pixman_gradient_stop_t *stops, int n_stops) { return_val_if_fail (n_stops > 0, FALSE); init_source_image (&gradient->common); gradient->stops = pixman_malloc_ab (n_stops, sizeof (pixman_gradient_stop_t)); if (!gradient->stops) return FALSE; memcpy (gradient->stops, stops, n_stops * sizeof (pixman_gradient_stop_t)); gradient->n_stops = n_stops; gradient->stop_range = 0xffff; gradient->color_table = NULL; gradient->color_table_size = 0; return TRUE; } static uint32_t color_to_uint32 (const pixman_color_t *color) { return (color->alpha >> 8 << 24) | (color->red >> 8 << 16) | (color->green & 0xff00) | (color->blue >> 8); } static pixman_image_t * allocate_image (void) { pixman_image_t *image = malloc (sizeof (pixman_image_t)); if (image) { image_common_t *common = &image->common; pixman_region_init (&common->full_region); pixman_region_init (&common->clip_region); common->src_clip = &common->full_region; common->has_client_clip = FALSE; common->transform = NULL; common->repeat = PIXMAN_REPEAT_NONE; common->filter = PIXMAN_FILTER_NEAREST; common->filter_params = NULL; common->n_filter_params = 0; common->alpha_map = NULL; common->component_alpha = FALSE; common->ref_count = 1; common->read_func = NULL; common->write_func = NULL; } return image; } /* Ref Counting */ pixman_image_t * pixman_image_ref (pixman_image_t *image) { image->common.ref_count++; return image; } /* returns TRUE when the image is freed */ pixman_bool_t pixman_image_unref (pixman_image_t *image) { image_common_t *common = (image_common_t *)image; common->ref_count--; if (common->ref_count == 0) { pixman_region_fini (&common->clip_region); pixman_region_fini (&common->full_region); if (common->transform) free (common->transform); if (common->filter_params) free (common->filter_params); if (common->alpha_map) pixman_image_unref ((pixman_image_t *)common->alpha_map); #if 0 if (image->type == BITS && image->bits.indexed) free (image->bits.indexed); #endif #if 0 memset (image, 0xaa, sizeof (pixman_image_t)); #endif if (image->type == LINEAR || image->type == RADIAL || image->type == CONICAL) { if (image->gradient.stops) free (image->gradient.stops); } if (image->type == BITS && image->bits.free_me) free (image->bits.free_me); free (image); return TRUE; } return FALSE; } /* Constructors */ pixman_image_t * pixman_image_create_solid_fill (pixman_color_t *color) { pixman_image_t *img = allocate_image(); if (!img) return NULL; init_source_image (&img->solid.common); img->type = SOLID; img->solid.color = color_to_uint32 (color); return img; } pixman_image_t * pixman_image_create_linear_gradient (pixman_point_fixed_t *p1, pixman_point_fixed_t *p2, const pixman_gradient_stop_t *stops, int n_stops) { pixman_image_t *image; linear_gradient_t *linear; return_val_if_fail (n_stops >= 2, NULL); image = allocate_image(); if (!image) return NULL; linear = &image->linear; if (!init_gradient (&linear->common, stops, n_stops)) { free (image); return NULL; } linear->p1 = *p1; linear->p2 = *p2; image->type = LINEAR; return image; } pixman_image_t * pixman_image_create_radial_gradient (pixman_point_fixed_t *inner, pixman_point_fixed_t *outer, pixman_fixed_t inner_radius, pixman_fixed_t outer_radius, const pixman_gradient_stop_t *stops, int n_stops) { pixman_image_t *image; radial_gradient_t *radial; return_val_if_fail (n_stops >= 2, NULL); image = allocate_image(); if (!image) return NULL; radial = &image->radial; if (!init_gradient (&radial->common, stops, n_stops)) { free (image); return NULL; } image->type = RADIAL; radial->c1.x = inner->x; radial->c1.y = inner->y; radial->c1.radius = inner_radius; radial->c2.x = outer->x; radial->c2.y = outer->y; radial->c2.radius = outer_radius; radial->cdx = pixman_fixed_to_double (radial->c2.x - radial->c1.x); radial->cdy = pixman_fixed_to_double (radial->c2.y - radial->c1.y); radial->dr = pixman_fixed_to_double (radial->c2.radius - radial->c1.radius); radial->A = (radial->cdx * radial->cdx + radial->cdy * radial->cdy - radial->dr * radial->dr); return image; } pixman_image_t * pixman_image_create_conical_gradient (pixman_point_fixed_t *center, pixman_fixed_t angle, const pixman_gradient_stop_t *stops, int n_stops) { pixman_image_t *image = allocate_image(); conical_gradient_t *conical; if (!image) return NULL; conical = &image->conical; if (!init_gradient (&conical->common, stops, n_stops)) { free (image); return NULL; } image->type = CONICAL; conical->center = *center; conical->angle = angle; return image; } static uint32_t * create_bits (pixman_format_code_t format, int width, int height, int *rowstride_bytes) { int stride; int buf_size; int bpp; /* what follows is a long-winded way, avoiding any possibility of integer * overflows, of saying: * stride = ((width * bpp + FB_MASK) >> FB_SHIFT) * sizeof (uint32_t); */ bpp = PIXMAN_FORMAT_BPP (format); if (pixman_multiply_overflows_int (width, bpp)) return NULL; stride = width * bpp; if (pixman_addition_overflows_int (stride, FB_MASK)) return NULL; stride += FB_MASK; stride >>= FB_SHIFT; #if FB_SHIFT < 2 if (pixman_multiply_overflows_int (stride, sizeof (uint32_t))) return NULL; #endif stride *= sizeof (uint32_t); if (pixman_multiply_overflows_int (height, stride)) return NULL; buf_size = height * stride; if (rowstride_bytes) *rowstride_bytes = stride; return calloc (buf_size, 1); } static void reset_clip_region (pixman_image_t *image) { pixman_region_fini (&image->common.clip_region); if (image->type == BITS) { pixman_region_init_rect (&image->common.clip_region, 0, 0, image->bits.width, image->bits.height); } else { pixman_region_init (&image->common.clip_region); } } pixman_image_t * pixman_image_create_bits (pixman_format_code_t format, int width, int height, uint32_t *bits, int rowstride_bytes) { pixman_image_t *image; uint32_t *free_me = NULL; /* must be a whole number of uint32_t's */ return_val_if_fail (bits == NULL || (rowstride_bytes % sizeof (uint32_t)) == 0, NULL); if (!bits && width && height) { free_me = bits = create_bits (format, width, height, &rowstride_bytes); if (!bits) return NULL; } image = allocate_image(); if (!image) { if (free_me) free (free_me); return NULL; } image->type = BITS; image->bits.format = format; image->bits.width = width; image->bits.height = height; image->bits.bits = bits; image->bits.free_me = free_me; image->bits.rowstride = rowstride_bytes / (int) sizeof (uint32_t); /* we store it in number * of uint32_t's */ image->bits.indexed = NULL; pixman_region_fini (&image->common.full_region); pixman_region_init_rect (&image->common.full_region, 0, 0, image->bits.width, image->bits.height); reset_clip_region (image); return image; } pixman_bool_t pixman_image_set_clip_region (pixman_image_t *image, pixman_region16_t *region) { image_common_t *common = (image_common_t *)image; if (region) { return pixman_region_copy (&common->clip_region, region); } else { reset_clip_region (image); return TRUE; } } /* Sets whether the clip region includes a clip region set by the client */ void pixman_image_set_has_client_clip (pixman_image_t *image, pixman_bool_t client_clip) { image->common.has_client_clip = client_clip; } pixman_bool_t pixman_image_set_transform (pixman_image_t *image, const pixman_transform_t *transform) { static const pixman_transform_t id = { { { pixman_fixed_1, 0, 0 }, { 0, pixman_fixed_1, 0 }, { 0, 0, pixman_fixed_1 } } }; image_common_t *common = (image_common_t *)image; if (common->transform == transform) return TRUE; if (memcmp (&id, transform, sizeof (pixman_transform_t)) == 0) { free(common->transform); common->transform = NULL; return TRUE; } if (common->transform == NULL) common->transform = malloc (sizeof (pixman_transform_t)); if (common->transform == NULL) return FALSE; memcpy(common->transform, transform, sizeof(pixman_transform_t)); return TRUE; } void pixman_image_set_repeat (pixman_image_t *image, pixman_repeat_t repeat) { image->common.repeat = repeat; } pixman_bool_t pixman_image_set_filter (pixman_image_t *image, pixman_filter_t filter, const pixman_fixed_t *params, int n_params) { image_common_t *common = (image_common_t *)image; pixman_fixed_t *new_params; if (params == common->filter_params && filter == common->filter) return TRUE; new_params = NULL; if (params) { new_params = pixman_malloc_ab (n_params, sizeof (pixman_fixed_t)); if (!new_params) return FALSE; memcpy (new_params, params, n_params * sizeof (pixman_fixed_t)); } common->filter = filter; if (common->filter_params) free (common->filter_params); common->filter_params = new_params; common->n_filter_params = n_params; return TRUE; } void pixman_image_set_source_clipping (pixman_image_t *image, pixman_bool_t source_clipping) { image_common_t *common = &image->common; if (source_clipping) common->src_clip = &common->clip_region; else common->src_clip = &common->full_region; } /* Unlike all the other property setters, this function does not * copy the content of indexed. Doing this copying is simply * way, way too expensive. */ void pixman_image_set_indexed (pixman_image_t *image, const pixman_indexed_t *indexed) { bits_image_t *bits = (bits_image_t *)image; bits->indexed = indexed; } void pixman_image_set_alpha_map (pixman_image_t *image, pixman_image_t *alpha_map, int16_t x, int16_t y) { image_common_t *common = (image_common_t *)image; return_if_fail (!alpha_map || alpha_map->type == BITS); if (common->alpha_map != (bits_image_t *)alpha_map) { if (common->alpha_map) pixman_image_unref ((pixman_image_t *)common->alpha_map); if (alpha_map) common->alpha_map = (bits_image_t *)pixman_image_ref (alpha_map); else common->alpha_map = NULL; } common->alpha_origin.x = x; common->alpha_origin.y = y; } void pixman_image_set_component_alpha (pixman_image_t *image, pixman_bool_t component_alpha) { image->common.component_alpha = component_alpha; } void pixman_image_set_accessors (pixman_image_t *image, pixman_read_memory_func_t read_func, pixman_write_memory_func_t write_func) { return_if_fail (image != NULL); image->common.read_func = read_func; image->common.write_func = write_func; } uint32_t * pixman_image_get_data (pixman_image_t *image) { if (image->type == BITS) return image->bits.bits; return NULL; } int pixman_image_get_width (pixman_image_t *image) { if (image->type == BITS) return image->bits.width; return 0; } int pixman_image_get_height (pixman_image_t *image) { if (image->type == BITS) return image->bits.height; return 0; } int pixman_image_get_stride (pixman_image_t *image) { if (image->type == BITS) return image->bits.rowstride * (int) sizeof (uint32_t); return 0; } int pixman_image_get_depth (pixman_image_t *image) { if (image->type == BITS) return PIXMAN_FORMAT_DEPTH (image->bits.format); return 0; } pixman_bool_t color_to_pixel (pixman_color_t *color, uint32_t *pixel, pixman_format_code_t format) { uint32_t c = color_to_uint32 (color); if (!(format == PIXMAN_a8r8g8b8 || format == PIXMAN_x8r8g8b8 || format == PIXMAN_a8b8g8r8 || format == PIXMAN_x8b8g8r8 || format == PIXMAN_r5g6b5 || format == PIXMAN_b5g6r5 || format == PIXMAN_a8)) { return FALSE; } if (PIXMAN_FORMAT_TYPE (format) == PIXMAN_TYPE_ABGR) { c = ((c & 0xff000000) >> 0) | ((c & 0x00ff0000) >> 16) | ((c & 0x0000ff00) >> 0) | ((c & 0x000000ff) << 16); } if (format == PIXMAN_a8) c = c >> 24; else if (format == PIXMAN_r5g6b5 || format == PIXMAN_b5g6r5) c = cvt8888to0565 (c); #if 0 printf ("color: %x %x %x %x\n", color->alpha, color->red, color->green, color->blue); printf ("pixel: %x\n", c); #endif *pixel = c; return TRUE; } pixman_bool_t pixman_image_fill_rectangles (pixman_op_t op, pixman_image_t *dest, pixman_color_t *color, int n_rects, const pixman_rectangle16_t *rects) { pixman_image_t *solid; pixman_color_t c; int i; if (color->alpha == 0xffff) { if (op == PIXMAN_OP_OVER) op = PIXMAN_OP_SRC; } if (op == PIXMAN_OP_CLEAR) { c.red = 0; c.green = 0; c.blue = 0; c.alpha = 0; color = &c; op = PIXMAN_OP_SRC; } if (op == PIXMAN_OP_SRC) { uint32_t pixel; if (color_to_pixel (color, &pixel, dest->bits.format)) { for (i = 0; i < n_rects; ++i) { pixman_region16_t fill_region; int n_boxes, j; pixman_box16_t *boxes; pixman_region_init_rect (&fill_region, rects[i].x, rects[i].y, rects[i].width, rects[i].height); pixman_region_intersect (&fill_region, &fill_region, &dest->common.clip_region); boxes = pixman_region_rectangles (&fill_region, &n_boxes); for (j = 0; j < n_boxes; ++j) { const pixman_box16_t *box = &(boxes[j]); pixman_fill (dest->bits.bits, dest->bits.rowstride, PIXMAN_FORMAT_BPP (dest->bits.format), box->x1, box->y1, box->x2 - box->x1, box->y2 - box->y1, pixel); } pixman_region_fini (&fill_region); } return TRUE; } } solid = pixman_image_create_solid_fill (color); if (!solid) return FALSE; for (i = 0; i < n_rects; ++i) { const pixman_rectangle16_t *rect = &(rects[i]); pixman_image_composite (op, solid, NULL, dest, 0, 0, 0, 0, rect->x, rect->y, rect->width, rect->height); } pixman_image_unref (solid); return TRUE; } libgdiplus-2.11/pixman/pixman/pixman-compute-region.c0000664000175000017500000001357212225470167017717 00000000000000/* * * Copyright © 1999 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "pixman-private.h" #define BOUND(v) (int16_t) ((v) < INT16_MIN ? INT16_MIN : (v) > INT16_MAX ? INT16_MAX : (v)) static inline pixman_bool_t miClipPictureReg (pixman_region16_t * pRegion, pixman_region16_t * pClip, int dx, int dy) { if (pixman_region_n_rects(pRegion) == 1 && pixman_region_n_rects(pClip) == 1) { pixman_box16_t * pRbox = pixman_region_rectangles(pRegion, NULL); pixman_box16_t * pCbox = pixman_region_rectangles(pClip, NULL); int v; if (pRbox->x1 < (v = pCbox->x1 + dx)) pRbox->x1 = BOUND(v); if (pRbox->x2 > (v = pCbox->x2 + dx)) pRbox->x2 = BOUND(v); if (pRbox->y1 < (v = pCbox->y1 + dy)) pRbox->y1 = BOUND(v); if (pRbox->y2 > (v = pCbox->y2 + dy)) pRbox->y2 = BOUND(v); if (pRbox->x1 >= pRbox->x2 || pRbox->y1 >= pRbox->y2) { pixman_region_init (pRegion); } } else if (!pixman_region_not_empty (pClip)) return FALSE; else { if (dx || dy) pixman_region_translate (pRegion, -dx, -dy); if (!pixman_region_intersect (pRegion, pRegion, pClip)) return FALSE; if (dx || dy) pixman_region_translate(pRegion, dx, dy); } return pixman_region_not_empty(pRegion); } static inline pixman_bool_t miClipPictureSrc (pixman_region16_t * pRegion, pixman_image_t * pPicture, int dx, int dy) { /* XXX what to do with clipping from transformed pictures? */ if (pPicture->common.transform || pPicture->type != BITS) return TRUE; if (pPicture->common.repeat) { /* If the clip region was set by a client, then it should be intersected * with the composite region since it's interpreted as happening * after the repeat algorithm. * * If the clip region was not set by a client, then it was imposed by * boundaries of the pixmap, or by sibling or child windows, which means * it should in theory be repeated along. FIXME: we ignore that case. * It is only relevant for windows that are (a) clipped by siblings/children * and (b) used as source. However this case is not useful anyway due * to lack of GraphicsExpose events. */ if (pPicture->common.has_client_clip) { pixman_region_translate ( pRegion, dx, dy); if (!pixman_region_intersect (pRegion, pRegion, (pixman_region16_t *) pPicture->common.src_clip)) return FALSE; pixman_region_translate ( pRegion, -dx, -dy); } return TRUE; } else { return miClipPictureReg (pRegion, pPicture->common.src_clip, dx, dy); } } /* * returns FALSE if the final region is empty. Indistinguishable from * an allocation failure, but rendering ignores those anyways. */ pixman_bool_t pixman_compute_composite_region (pixman_region16_t * pRegion, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { int v; pRegion->extents.x1 = xDst; v = xDst + width; pRegion->extents.x2 = BOUND(v); pRegion->extents.y1 = yDst; v = yDst + height; pRegion->extents.y2 = BOUND(v); pRegion->data = 0; /* Check for empty operation */ if (pRegion->extents.x1 >= pRegion->extents.x2 || pRegion->extents.y1 >= pRegion->extents.y2) { pixman_region_init (pRegion); return FALSE; } /* clip against dst */ if (!miClipPictureReg (pRegion, &pDst->common.clip_region, 0, 0)) { pixman_region_fini (pRegion); return FALSE; } if (pDst->common.alpha_map) { if (!miClipPictureReg (pRegion, &pDst->common.alpha_map->common.clip_region, -pDst->common.alpha_origin.x, -pDst->common.alpha_origin.y)) { pixman_region_fini (pRegion); return FALSE; } } /* clip against src */ if (!miClipPictureSrc (pRegion, pSrc, xDst - xSrc, yDst - ySrc)) { pixman_region_fini (pRegion); return FALSE; } if (pSrc->common.alpha_map) { if (!miClipPictureSrc (pRegion, (pixman_image_t *)pSrc->common.alpha_map, xDst - (xSrc + pSrc->common.alpha_origin.x), yDst - (ySrc + pSrc->common.alpha_origin.y))) { pixman_region_fini (pRegion); return FALSE; } } /* clip against mask */ if (pMask) { if (!miClipPictureSrc (pRegion, pMask, xDst - xMask, yDst - yMask)) { pixman_region_fini (pRegion); return FALSE; } if (pMask->common.alpha_map) { if (!miClipPictureSrc (pRegion, (pixman_image_t *)pMask->common.alpha_map, xDst - (xMask + pMask->common.alpha_origin.x), yDst - (yMask + pMask->common.alpha_origin.y))) { pixman_region_fini (pRegion); return FALSE; } } } return TRUE; } libgdiplus-2.11/pixman/pixman/pixman-timer.c0000664000175000017500000000345712225470167016103 00000000000000/* * Copyright © 2007 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Red Hat not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Red Hat makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL RED HAT * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include "pixman-private.h" #ifdef PIXMAN_TIMER static PixmanTimer *timers; static void dump_timers (void) { PixmanTimer *timer; for (timer = timers; timer != NULL; timer = timer->next) { printf ("%s: total: %llu n: %llu avg: %f\n", timer->name, timer->total, timer->n_times, timer->total / (double)timer->n_times); } } void pixman_timer_register (PixmanTimer *timer) { static int initialized; int atexit(void (*function)(void)); if (!initialized) { atexit (dump_timers); initialized = 1; } timer->next = timers; timers = timer; } #endif libgdiplus-2.11/pixman/pixman/pixman-edge.c0000664000175000017500000001735112225470167015665 00000000000000/* * Copyright © 2004 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" #ifdef PIXMAN_FB_ACCESSORS #define PIXMAN_RASTERIZE_EDGES pixman_rasterize_edges_accessors #else #define PIXMAN_RASTERIZE_EDGES pixman_rasterize_edges_no_accessors #endif /* * 4 bit alpha */ #define N_BITS 4 #define rasterizeEdges fbRasterizeEdges4 #if BITMAP_BIT_ORDER == LSBFirst #define Shift4(o) ((o) << 2) #else #define Shift4(o) ((1-(o)) << 2) #endif #define Get4(x,o) (((x) >> Shift4(o)) & 0xf) #define Put4(x,o,v) (((x) & ~(0xf << Shift4(o))) | (((v) & 0xf) << Shift4(o))) #define DefineAlpha(line,x) \ uint8_t *__ap = (uint8_t *) line + ((x) >> 1); \ int __ao = (x) & 1 #define StepAlpha ((__ap += __ao), (__ao ^= 1)) #define AddAlpha(a) { \ uint8_t __o = READ(image, __ap); \ uint8_t __a = (a) + Get4(__o, __ao); \ WRITE(image, __ap, Put4 (__o, __ao, __a | (0 - ((__a) >> 4)))); \ } #include "pixman-edge-imp.h" #undef AddAlpha #undef StepAlpha #undef DefineAlpha #undef rasterizeEdges #undef N_BITS /* * 1 bit alpha */ #define N_BITS 1 #define rasterizeEdges fbRasterizeEdges1 #include "pixman-edge-imp.h" #undef rasterizeEdges #undef N_BITS /* * 8 bit alpha */ static inline uint8_t clip255 (int x) { if (x > 255) return 255; return x; } #define add_saturate_8(buf,val,length) \ do { \ int i__ = (length); \ uint8_t *buf__ = (buf); \ int val__ = (val); \ \ while (i__--) \ { \ WRITE(image, (buf__), clip255 (READ(image, (buf__)) + (val__))); \ (buf__)++; \ } \ } while (0) /* * We want to detect the case where we add the same value to a long * span of pixels. The triangles on the end are filled in while we * count how many sub-pixel scanlines contribute to the middle section. * * +--------------------------+ * fill_height =| \ / * +------------------+ * |================| * fill_start fill_end */ static void fbRasterizeEdges8 (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b) { pixman_fixed_t y = t; uint32_t *line; int fill_start = -1, fill_end = -1; int fill_size = 0; uint32_t *buf = (image)->bits.bits; int stride = (image)->bits.rowstride; int width = (image)->bits.width; line = buf + pixman_fixed_to_int (y) * stride; for (;;) { uint8_t *ap = (uint8_t *) line; pixman_fixed_t lx, rx; int lxi, rxi; /* clip X */ lx = l->x; if (lx < 0) lx = 0; rx = r->x; if (pixman_fixed_to_int (rx) >= width) /* Use the last pixel of the scanline, covered 100%. * We can't use the first pixel following the scanline, * because accessing it could result in a buffer overrun. */ rx = pixman_int_to_fixed (width) - 1; /* Skip empty (or backwards) sections */ if (rx > lx) { int lxs, rxs; /* Find pixel bounds for span. */ lxi = pixman_fixed_to_int (lx); rxi = pixman_fixed_to_int (rx); /* Sample coverage for edge pixels */ lxs = RenderSamplesX (lx, 8); rxs = RenderSamplesX (rx, 8); /* Add coverage across row */ if (lxi == rxi) { WRITE(image, ap +lxi, clip255 (READ(image, ap + lxi) + rxs - lxs)); } else { WRITE(image, ap + lxi, clip255 (READ(image, ap + lxi) + N_X_FRAC(8) - lxs)); /* Move forward so that lxi/rxi is the pixel span */ lxi++; /* Don't bother trying to optimize the fill unless * the span is longer than 4 pixels. */ if (rxi - lxi > 4) { if (fill_start < 0) { fill_start = lxi; fill_end = rxi; fill_size++; } else { if (lxi >= fill_end || rxi < fill_start) { /* We're beyond what we saved, just fill it */ add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8), fill_end - fill_start); fill_start = lxi; fill_end = rxi; fill_size = 1; } else { /* Update fill_start */ if (lxi > fill_start) { add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8), lxi - fill_start); fill_start = lxi; } else if (lxi < fill_start) { add_saturate_8 (ap + lxi, N_X_FRAC(8), fill_start - lxi); } /* Update fill_end */ if (rxi < fill_end) { add_saturate_8 (ap + rxi, fill_size * N_X_FRAC(8), fill_end - rxi); fill_end = rxi; } else if (fill_end < rxi) { add_saturate_8 (ap + fill_end, N_X_FRAC(8), rxi - fill_end); } fill_size++; } } } else { add_saturate_8 (ap + lxi, N_X_FRAC(8), rxi - lxi); } WRITE(image, ap + rxi, clip255 (READ(image, ap + rxi) + rxs)); } } if (y == b) { /* We're done, make sure we clean up any remaining fill. */ if (fill_start != fill_end) { if (fill_size == N_Y_FRAC(8)) { MEMSET_WRAPPED (image, ap + fill_start, 0xff, fill_end - fill_start); } else { add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8), fill_end - fill_start); } } break; } if (pixman_fixed_frac (y) != Y_FRAC_LAST(8)) { RenderEdgeStepSmall (l); RenderEdgeStepSmall (r); y += STEP_Y_SMALL(8); } else { RenderEdgeStepBig (l); RenderEdgeStepBig (r); y += STEP_Y_BIG(8); if (fill_start != fill_end) { if (fill_size == N_Y_FRAC(8)) { MEMSET_WRAPPED (image, ap + fill_start, 0xff, fill_end - fill_start); } else { add_saturate_8 (ap + fill_start, fill_size * N_X_FRAC(8), fill_end - fill_start); } fill_start = fill_end = -1; fill_size = 0; } line += stride; } } } #ifndef PIXMAN_FB_ACCESSORS static #endif void PIXMAN_RASTERIZE_EDGES (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b) { switch (PIXMAN_FORMAT_BPP (image->bits.format)) { case 1: fbRasterizeEdges1 (image, l, r, t, b); break; case 4: fbRasterizeEdges4 (image, l, r, t, b); break; case 8: fbRasterizeEdges8 (image, l, r, t, b); break; } } #ifndef PIXMAN_FB_ACCESSORS void pixman_rasterize_edges (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b) { if (image->common.read_func || image->common.write_func) pixman_rasterize_edges_accessors (image, l, r, t, b); else pixman_rasterize_edges_no_accessors (image, l, r, t, b); } #endif libgdiplus-2.11/pixman/pixman/Makefile.am0000664000175000017500000000237412225470167015356 00000000000000noinst_LTLIBRARIES = libpixman-1.la libpixman_1_la_LDFLAGS = -version-info $(LT_VERSION_INFO) libpixman_1_la_LIBADD = @DEP_LIBS@ -lm libpixman_1_la_SOURCES = \ pixman.h \ pixman-access.c \ pixman-access-accessors.c \ pixman-embed.h \ pixman-region.c \ pixman-private.h \ pixman-image.c \ pixman-combine.c \ pixman-compose.c \ pixman-compose-accessors.c \ pixman-pict.c \ pixman-source.c \ pixman-transformed.c \ pixman-transformed-accessors.c \ pixman-utils.c \ pixman-edge.c \ pixman-edge-accessors.c \ pixman-edge-imp.h \ pixman-trap.c \ pixman-compute-region.c \ pixman-timer.c #libpixmanincludedir = $(includedir)/pixman-1/ noinst_HEADERS = pixman.h pixman-version.h EXTRA_DIST = Makefile.win32 # mmx code if USE_MMX noinst_LTLIBRARIES += libpixman-mmx.la libpixman_mmx_la_SOURCES = \ pixman-mmx.c \ pixman-mmx.h libpixman_mmx_la_CFLAGS = $(DEP_CFLAGS) $(MMX_CFLAGS) libpixman_mmx_la_LIBADD = $(DEP_LIBS) libpixman_1_la_LIBADD += libpixman-mmx.la endif # sse2 code if USE_SSE2 noinst_LTLIBRARIES += libpixman-sse.la libpixman_sse_la_SOURCES = \ pixman-sse.c \ pixman-sse.h libpixman_sse_la_CFLAGS = $(DEP_CFLAGS) $(SSE_CFLAGS) libpixman_sse_la_LIBADD = $(DEP_LIBS) libpixman_1_la_LIBADD += libpixman-sse.la endif libgdiplus-2.11/pixman/pixman/pixman-private.h0000664000175000017500000006671512225470167016450 00000000000000#ifndef PACKAGE # error config.h must be included before pixman-private.h #endif #ifndef PIXMAN_PRIVATE_H #define PIXMAN_PRIVATE_H #include "pixman.h" #include #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #define MSBFirst 0 #define LSBFirst 1 #ifdef WORDS_BIGENDIAN # define IMAGE_BYTE_ORDER MSBFirst # define BITMAP_BIT_ORDER MSBFirst #else # define IMAGE_BYTE_ORDER LSBFirst # define BITMAP_BIT_ORDER LSBFirst #endif #undef DEBUG #define DEBUG 0 #if defined (__GNUC__) # define FUNC ((const char*) (__PRETTY_FUNCTION__)) #elif defined (__sun) || (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) # define FUNC ((const char*) (__func__)) #else # define FUNC ((const char*) ("???")) #endif #ifndef INT16_MIN # define INT16_MIN (-32767-1) #endif #ifndef INT16_MAX # define INT16_MAX (32767) #endif #ifndef INT32_MIN # define INT32_MIN (-2147483647-1) #endif #ifndef INT32_MAX # define INT32_MAX (2147483647) #endif #ifndef UINT32_MIN # define UINT32_MIN (0) #endif #ifndef UINT32_MAX # define UINT32_MAX (4294967295U) #endif #ifndef M_PI # define M_PI 3.14159265358979323846 #endif #ifdef _MSC_VER #define inline __inline #endif #define FB_SHIFT 5 #define FB_UNIT (1 << FB_SHIFT) #define FB_HALFUNIT (1 << (FB_SHIFT-1)) #define FB_MASK (FB_UNIT - 1) #define FB_ALLONES ((uint32_t) -1) /* Memory allocation helpers */ void *pixman_malloc_ab (unsigned int n, unsigned int b); void *pixman_malloc_abc (unsigned int a, unsigned int b, unsigned int c); pixman_bool_t pixman_multiply_overflows_int (unsigned int a, unsigned int b); pixman_bool_t pixman_addition_overflows_int (unsigned int a, unsigned int b); #if DEBUG #define return_if_fail(expr) \ do \ { \ if (!(expr)) \ { \ fprintf(stderr, "In %s: %s failed\n", FUNC, #expr); \ return; \ } \ } \ while (0) #define return_val_if_fail(expr, retval) \ do \ { \ if (!(expr)) \ { \ fprintf(stderr, "In %s: %s failed\n", FUNC, #expr); \ return (retval); \ } \ } \ while (0) #else #define return_if_fail(expr) \ do \ { \ if (!(expr)) \ return; \ } \ while (0) #define return_val_if_fail(expr, retval) \ do \ { \ if (!(expr)) \ return (retval); \ } \ while (0) #endif typedef struct image_common image_common_t; typedef struct source_image source_image_t; typedef struct solid_fill solid_fill_t; typedef struct gradient gradient_t; typedef struct linear_gradient linear_gradient_t; typedef struct horizontal_gradient horizontal_gradient_t; typedef struct vertical_gradient vertical_gradient_t; typedef struct conical_gradient conical_gradient_t; typedef struct radial_gradient radial_gradient_t; typedef struct bits_image bits_image_t; typedef struct circle circle_t; typedef struct point point_t; /* FIXME - the types and structures below should be give proper names */ #define FASTCALL typedef FASTCALL void (*CombineMaskU) (uint32_t *src, const uint32_t *mask, int width); typedef FASTCALL void (*CombineFuncU) (uint32_t *dest, const uint32_t *src, int width); typedef FASTCALL void (*CombineFuncC) (uint32_t *dest, uint32_t *src, uint32_t *mask, int width); typedef FASTCALL void (*fetchProc)(bits_image_t *pict, int x, int y, int width, uint32_t *buffer); typedef FASTCALL uint32_t (*fetchPixelProc)(bits_image_t *pict, int offset, int line); typedef FASTCALL void (*storeProc)(pixman_image_t *, uint32_t *bits, const uint32_t *values, int x, int width, const pixman_indexed_t *); typedef struct _FbComposeData { uint8_t op; pixman_image_t *src; pixman_image_t *mask; pixman_image_t *dest; int16_t xSrc; int16_t ySrc; int16_t xMask; int16_t yMask; int16_t xDest; int16_t yDest; uint16_t width; uint16_t height; } FbComposeData; typedef struct _FbComposeFunctions { CombineFuncU *combineU; CombineFuncC *combineC; CombineMaskU combineMaskU; } FbComposeFunctions; extern FbComposeFunctions pixman_composeFunctions; void pixman_composite_rect_general_accessors (const FbComposeData *data, uint32_t *scanline_buffer); void pixman_composite_rect_general (const FbComposeData *data, uint32_t *scanline_buffer); fetchProc pixman_fetchProcForPicture (bits_image_t *); fetchPixelProc pixman_fetchPixelProcForPicture (bits_image_t *); storeProc pixman_storeProcForPicture (bits_image_t *); fetchProc pixman_fetchProcForPicture_accessors (bits_image_t *); fetchPixelProc pixman_fetchPixelProcForPicture_accessors (bits_image_t *); storeProc pixman_storeProcForPicture_accessors (bits_image_t *); void pixmanFetchSourcePict(source_image_t *, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits); void fbFetchTransformed(bits_image_t *, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits); void fbStoreExternalAlpha(bits_image_t *, int x, int y, int width, uint32_t *buffer); void fbFetchExternalAlpha(bits_image_t *, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits); void fbFetchTransformed_accessors(bits_image_t *, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits); void fbStoreExternalAlpha_accessors(bits_image_t *, int x, int y, int width, uint32_t *buffer); void fbFetchExternalAlpha_accessors(bits_image_t *, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits); /* end */ typedef enum { BITS, LINEAR, CONICAL, RADIAL, SOLID } image_type_t; #define IS_SOURCE_IMAGE(img) (((image_common_t *)img)->type > BITS) typedef enum { SOURCE_IMAGE_CLASS_UNKNOWN, SOURCE_IMAGE_CLASS_HORIZONTAL, SOURCE_IMAGE_CLASS_VERTICAL } source_pict_class_t; struct point { int16_t x, y; }; struct image_common { image_type_t type; int32_t ref_count; pixman_region16_t full_region; pixman_region16_t clip_region; pixman_region16_t *src_clip; pixman_bool_t has_client_clip; pixman_transform_t *transform; pixman_repeat_t repeat; pixman_filter_t filter; pixman_fixed_t *filter_params; int n_filter_params; bits_image_t *alpha_map; point_t alpha_origin; pixman_bool_t component_alpha; pixman_read_memory_func_t read_func; pixman_write_memory_func_t write_func; }; struct source_image { image_common_t common; source_pict_class_t class; }; struct solid_fill { source_image_t common; uint32_t color; /* FIXME: shouldn't this be a pixman_color_t? */ }; struct gradient { source_image_t common; int n_stops; pixman_gradient_stop_t * stops; int stop_range; uint32_t * color_table; int color_table_size; }; struct linear_gradient { gradient_t common; pixman_point_fixed_t p1; pixman_point_fixed_t p2; }; struct circle { pixman_fixed_t x; pixman_fixed_t y; pixman_fixed_t radius; }; struct radial_gradient { gradient_t common; circle_t c1; circle_t c2; double cdx; double cdy; double dr; double A; }; struct conical_gradient { gradient_t common; pixman_point_fixed_t center; pixman_fixed_t angle; }; struct bits_image { image_common_t common; pixman_format_code_t format; const pixman_indexed_t *indexed; int width; int height; uint32_t * bits; uint32_t * free_me; int rowstride; /* in number of uint32_t's */ }; union pixman_image { image_type_t type; image_common_t common; bits_image_t bits; gradient_t gradient; linear_gradient_t linear; conical_gradient_t conical; radial_gradient_t radial; solid_fill_t solid; }; extern CombineFuncU pixman_fbCombineFuncU[]; extern CombineFuncC pixman_fbCombineFuncC[]; FASTCALL void pixman_fbCombineMaskU (uint32_t *src, const uint32_t *mask, int width); #define LOG2_BITMAP_PAD 5 #define FB_STIP_SHIFT LOG2_BITMAP_PAD #define FB_STIP_UNIT (1 << FB_STIP_SHIFT) #define FB_STIP_MASK (FB_STIP_UNIT - 1) #define FB_STIP_ALLONES ((uint32_t) -1) #if BITMAP_BIT_ORDER == LSBFirst #define FbScrLeft(x,n) ((x) >> (n)) #define FbScrRight(x,n) ((x) << (n)) #define FbLeftStipBits(x,n) ((x) & ((((uint32_t) 1) << (n)) - 1)) #else #define FbScrLeft(x,n) ((x) << (n)) #define FbScrRight(x,n) ((x) >> (n)) #define FbLeftStipBits(x,n) ((x) >> (FB_STIP_UNIT - (n))) #endif #define FbStipLeft(x,n) FbScrLeft(x,n) #define FbStipRight(x,n) FbScrRight(x,n) #define FbStipMask(x,w) (FbStipRight(FB_STIP_ALLONES,(x) & FB_STIP_MASK) & \ FbStipLeft(FB_STIP_ALLONES,(FB_STIP_UNIT - ((x)+(w))) & FB_STIP_MASK)) #define FbLeftMask(x) ( ((x) & FB_MASK) ? \ FbScrRight(FB_ALLONES,(x) & FB_MASK) : 0) #define FbRightMask(x) ( ((FB_UNIT - (x)) & FB_MASK) ? \ FbScrLeft(FB_ALLONES,(FB_UNIT - (x)) & FB_MASK) : 0) #define FbMaskBits(x,w,l,n,r) { \ n = (w); \ r = FbRightMask((x)+n); \ l = FbLeftMask(x); \ if (l) { \ n -= FB_UNIT - ((x) & FB_MASK); \ if (n < 0) { \ n = 0; \ l &= r; \ r = 0; \ } \ } \ n >>= FB_SHIFT; \ } #if IMAGE_BYTE_ORDER == MSBFirst #define Fetch24(img, a) ((unsigned long) (a) & 1 ? \ ((READ(img, a) << 16) | READ(img, (uint16_t *) ((a)+1))) : \ ((READ(img, (uint16_t *) (a)) << 8) | READ(img, (a)+2))) #define Store24(img,a,v) ((unsigned long) (a) & 1 ? \ (WRITE(img, a, (uint8_t) ((v) >> 16)), \ WRITE(img, (uint16_t *) ((a)+1), (uint16_t) (v))) : \ (WRITE(img, (uint16_t *) (a), (uint16_t) ((v) >> 8)), \ WRITE(img, (a)+2, (uint8_t) (v)))) #else #define Fetch24(img,a) ((unsigned long) (a) & 1 ? \ (READ(img, a) | (READ(img, (uint16_t *) ((a)+1)) << 8)) : \ (READ(img, (uint16_t *) (a)) | (READ(img, (a)+2) << 16))) #define Store24(img,a,v) ((unsigned long) (a) & 1 ? \ (WRITE(img, a, (uint8_t) (v)), \ WRITE(img, (uint16_t *) ((a)+1), (uint16_t) ((v) >> 8))) : \ (WRITE(img, (uint16_t *) (a), (uint16_t) (v)), \ WRITE(img, (a)+2, (uint8_t) ((v) >> 16)))) #endif #define Alpha(x) ((x) >> 24) #define Red(x) (((x) >> 16) & 0xff) #define Green(x) (((x) >> 8) & 0xff) #define Blue(x) ((x) & 0xff) #define CvtR8G8B8toY15(s) (((((s) >> 16) & 0xff) * 153 + \ (((s) >> 8) & 0xff) * 301 + \ (((s) ) & 0xff) * 58) >> 2) #define miCvtR8G8B8to15(s) ((((s) >> 3) & 0x001f) | \ (((s) >> 6) & 0x03e0) | \ (((s) >> 9) & 0x7c00)) #define miIndexToEnt15(mif,rgb15) ((mif)->ent[rgb15]) #define miIndexToEnt24(mif,rgb24) miIndexToEnt15(mif,miCvtR8G8B8to15(rgb24)) #define miIndexToEntY24(mif,rgb24) ((mif)->ent[CvtR8G8B8toY15(rgb24)]) #define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) #define FbIntDiv(a,b) (((uint16_t) (a) * 255) / (b)) #define FbGet8(v,i) ((uint16_t) (uint8_t) ((v) >> i)) #define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ (((s) >> 5) & 0x07e0) | \ (((s) >> 8) & 0xf800)) #define cvt0565to0888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) /* * There are two ways of handling alpha -- either as a single unified value or * a separate value for each component, hence each macro must have two * versions. The unified alpha version has a 'U' at the end of the name, * the component version has a 'C'. Similarly, functions which deal with * this difference will have two versions using the same convention. */ #define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i), \ (uint32_t) ((uint8_t) ((t) | (0 - ((t) >> 8)))) << (i)) #define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i), \ (uint32_t) ((uint8_t) ((t) | (0 - ((t) >> 8)))) << (i)) #define FbInU(x,i,a,t) ((uint32_t) FbIntMult(FbGet8(x,i),(a),(t)) << (i)) #define FbInC(x,i,a,t) ((uint32_t) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i)) #define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \ FbIntMult(FbGet8(x,i),ax,(v))), \ (uint32_t) ((uint8_t) ((t) | \ (0 - ((t) >> 8)))) << (i)) #define FbAdd(x,y,i,t) ((t) = FbGet8(x,i) + FbGet8(y,i), \ (uint32_t) ((uint8_t) ((t) | (0 - ((t) >> 8)))) << (i)) /* The methods below use some tricks to be able to do two color components at the same time. */ /* x_c = (x_c * a) / 255 */ #define FbByteMul(x, a) do { \ uint32_t t = ((x & 0xff00ff) * a) + 0x800080; \ t = (t + ((t >> 8) & 0xff00ff)) >> 8; \ t &= 0xff00ff; \ \ x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \ x = (x + ((x >> 8) & 0xff00ff)); \ x &= 0xff00ff00; \ x += t; \ } while (0) /* x_c = (x_c * a) / 255 + y */ #define FbByteMulAdd(x, a, y) do { \ uint32_t t = ((x & 0xff00ff) * a) + 0x800080; \ t = (t + ((t >> 8) & 0xff00ff)) >> 8; \ t &= 0xff00ff; \ t += y & 0xff00ff; \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t &= 0xff00ff; \ \ x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \ x = (x + ((x >> 8) & 0xff00ff)) >> 8; \ x &= 0xff00ff; \ x += (y >> 8) & 0xff00ff; \ x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ x &= 0xff00ff; \ x <<= 8; \ x += t; \ } while (0) /* x_c = (x_c * a + y_c * b) / 255 */ #define FbByteAddMul(x, a, y, b) do { \ uint32_t t; \ uint32_t r = (x >> 24) * a + (y >> 24) * b + 0x80; \ r += (r >> 8); \ r >>= 8; \ \ t = (x & 0xff00) * a + (y & 0xff00) * b; \ t += (t >> 8) + 0x8000; \ t >>= 16; \ \ t |= r << 16; \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t &= 0xff00ff; \ t <<= 8; \ \ r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80; \ r += (r >> 8); \ r >>= 8; \ \ x = (x & 0xff) * a + (y & 0xff) * b + 0x80; \ x += (x >> 8); \ x >>= 8; \ x |= r << 16; \ x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ x &= 0xff00ff; \ x |= t; \ } while (0) /* x_c = (x_c * a + y_c *b) / 256 */ #define FbByteAddMul_256(x, a, y, b) do { \ uint32_t t = (x & 0xff00ff) * a + (y & 0xff00ff) * b; \ t >>= 8; \ t &= 0xff00ff; \ \ x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b; \ x &= 0xff00ff00; \ x += t; \ } while (0) /* x_c = (x_c * a_c) / 255 */ #define FbByteMulC(x, a) do { \ uint32_t t; \ uint32_t r = (x & 0xff) * (a & 0xff); \ r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ r += 0x800080; \ r = (r + ((r >> 8) & 0xff00ff)) >> 8; \ r &= 0xff00ff; \ \ x >>= 8; \ t = (x & 0xff) * ((a >> 8) & 0xff); \ t |= (x & 0xff0000) * (a >> 24); \ t += 0x800080; \ t = t + ((t >> 8) & 0xff00ff); \ x = r | (t & 0xff00ff00); \ \ } while (0) /* x_c = (x_c * a) / 255 + y */ #define FbByteMulAddC(x, a, y) do { \ uint32_t t; \ uint32_t r = (x & 0xff) * (a & 0xff); \ r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ r += 0x800080; \ r = (r + ((r >> 8) & 0xff00ff)) >> 8; \ r &= 0xff00ff; \ r += y & 0xff00ff; \ r |= 0x1000100 - ((r >> 8) & 0xff00ff); \ r &= 0xff00ff; \ \ x >>= 8; \ t = (x & 0xff) * ((a >> 8) & 0xff); \ t |= (x & 0xff0000) * (a >> 24); \ t += 0x800080; \ t = (t + ((t >> 8) & 0xff00ff)) >> 8; \ t &= 0xff00ff; \ t += (y >> 8) & 0xff00ff; \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t &= 0xff00ff; \ x = r | (t << 8); \ } while (0) /* x_c = (x_c * a_c + y_c * b) / 255 */ #define FbByteAddMulC(x, a, y, b) do { \ uint32_t t; \ uint32_t r = (x >> 24) * (a >> 24) + (y >> 24) * b; \ r += (r >> 8) + 0x80; \ r >>= 8; \ \ t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b; \ t += (t >> 8) + 0x8000; \ t >>= 16; \ \ t |= r << 16; \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t &= 0xff00ff; \ t <<= 8; \ \ r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \ r += (r >> 8); \ r >>= 8; \ \ x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80; \ x += (x >> 8); \ x >>= 8; \ x |= r << 16; \ x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ x &= 0xff00ff; \ x |= t; \ } while (0) /* x_c = min(x_c + y_c, 255) */ #define FbByteAdd(x, y) do { \ uint32_t t; \ uint32_t r = (x & 0xff00ff) + (y & 0xff00ff); \ r |= 0x1000100 - ((r >> 8) & 0xff00ff); \ r &= 0xff00ff; \ \ t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff); \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ r |= (t & 0xff00ff) << 8; \ x = r; \ } while (0) #define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8) #define MOD(a,b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b)) #define DIV(a,b) ((((a) < 0) == ((b) < 0)) ? (a) / (b) : \ ((a) - (b) + 1 - (((b) < 0) << 1)) / (b)) #define CLIP(a,b,c) ((a) < (b) ? (b) : ((a) > (c) ? (c) : (a))) #if 0 /* FIXME: the MOD macro above is equivalent, but faster I think */ #define mod(a,b) ((b) == 1 ? 0 : (a) >= 0 ? (a) % (b) : (b) - (-a) % (b)) #endif /* FIXME: the (void)__read_func hides lots of warnings (which is what they * are supposed to do), but some of them are real. For example the one * where Fetch4 doesn't have a READ */ #if 0 /* Framebuffer access support macros */ #define ACCESS_MEM(code) \ do { \ const image_common_t *const com__ = \ (image_common_t *)image; \ \ if (!com__->read_func && !com__->write_func) \ { \ const int do_access__ = 0; \ const pixman_read_memory_func_t read_func__ = NULL; \ const pixman_write_memory_func_t write_func__ = NULL; \ (void)read_func__; \ (void)write_func__; \ (void)do_access__; \ \ {code} \ } \ else \ { \ const int do_access__ = 1; \ const pixman_read_memory_func_t read_func__ = \ com__->read_func; \ const pixman_write_memory_func_t write_func__ = \ com__->write_func; \ (void)read_func__; \ (void)write_func__; \ (void)do_access__; \ \ {code} \ } \ } while (0) #endif #ifdef PIXMAN_FB_ACCESSORS #define READ(img, ptr) \ ((img)->common.read_func ((ptr), sizeof(*(ptr)))) #define WRITE(img, ptr,val) \ ((img)->common.write_func ((ptr), (val), sizeof (*(ptr)))) #define MEMCPY_WRAPPED(img, dst, src, size) \ do { \ size_t _i; \ uint8_t *_dst = (uint8_t*)(dst), *_src = (uint8_t*)(src); \ for(_i = 0; _i < size; _i++) { \ WRITE((img), _dst +_i, READ((img), _src + _i)); \ } \ } while (0) #define MEMSET_WRAPPED(img, dst, val, size) \ do { \ size_t _i; \ uint8_t *_dst = (uint8_t*)(dst); \ for(_i = 0; _i < (size_t) size; _i++) { \ WRITE((img), _dst +_i, (val)); \ } \ } while (0) #else #define READ(img, ptr) (*(ptr)) #define WRITE(img, ptr, val) (*(ptr) = (val)) #define MEMCPY_WRAPPED(img, dst, src, size) \ memcpy(dst, src, size) #define MEMSET_WRAPPED(img, dst, val, size) \ memset(dst, val, size) #endif #define fbComposeGetSolid(img, res, fmt) \ do \ { \ pixman_format_code_t format__; \ if (img->type == SOLID) \ { \ format__ = PIXMAN_a8r8g8b8; \ (res) = img->solid.color; \ } \ else \ { \ uint32_t *bits__ = (img)->bits.bits; \ format__ = (img)->bits.format; \ \ switch (PIXMAN_FORMAT_BPP((img)->bits.format)) \ { \ case 32: \ (res) = READ(img, (uint32_t *)bits__); \ break; \ case 24: \ (res) = Fetch24(img, (uint8_t *) bits__); \ break; \ case 16: \ (res) = READ(img, (uint16_t *) bits__); \ (res) = cvt0565to0888(res); \ break; \ case 8: \ (res) = READ(img, (uint8_t *) bits__); \ (res) = (res) << 24; \ break; \ case 1: \ (res) = READ(img, (uint32_t *) bits__); \ (res) = FbLeftStipBits((res),1) ? 0xff000000 : 0x00000000; \ break; \ default: \ return; \ } \ /* manage missing src alpha */ \ if (!PIXMAN_FORMAT_A((img)->bits.format)) \ (res) |= 0xff000000; \ } \ \ /* If necessary, convert RGB <--> BGR. */ \ if (PIXMAN_FORMAT_TYPE (format__) != PIXMAN_FORMAT_TYPE(fmt)) \ { \ (res) = ((((res) & 0xff000000) >> 0) | \ (((res) & 0x00ff0000) >> 16) | \ (((res) & 0x0000ff00) >> 0) | \ (((res) & 0x000000ff) << 16)); \ } \ } \ while (0) #define fbComposeGetStart(pict,x,y,type,out_stride,line,mul) do { \ uint32_t *__bits__; \ int __stride__; \ int __bpp__; \ \ __bits__ = pict->bits.bits; \ __stride__ = pict->bits.rowstride; \ __bpp__ = PIXMAN_FORMAT_BPP(pict->bits.format); \ (out_stride) = __stride__ * (int) sizeof (uint32_t) / (int) sizeof (type); \ (line) = ((type *) __bits__) + \ (out_stride) * (y) + (mul) * (x); \ } while (0) /* * Edges */ #define MAX_ALPHA(n) ((1 << (n)) - 1) #define N_Y_FRAC(n) ((n) == 1 ? 1 : (1 << ((n)/2)) - 1) #define N_X_FRAC(n) ((n) == 1 ? 1 : (1 << ((n)/2)) + 1) #define STEP_Y_SMALL(n) (pixman_fixed_1 / N_Y_FRAC(n)) #define STEP_Y_BIG(n) (pixman_fixed_1 - (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n)) #define Y_FRAC_FIRST(n) (STEP_Y_SMALL(n) / 2) #define Y_FRAC_LAST(n) (Y_FRAC_FIRST(n) + (N_Y_FRAC(n) - 1) * STEP_Y_SMALL(n)) #define STEP_X_SMALL(n) (pixman_fixed_1 / N_X_FRAC(n)) #define STEP_X_BIG(n) (pixman_fixed_1 - (N_X_FRAC(n) - 1) * STEP_X_SMALL(n)) #define X_FRAC_FIRST(n) (STEP_X_SMALL(n) / 2) #define X_FRAC_LAST(n) (X_FRAC_FIRST(n) + (N_X_FRAC(n) - 1) * STEP_X_SMALL(n)) #define RenderSamplesX(x,n) ((n) == 1 ? 0 : (pixman_fixed_frac (x) + X_FRAC_FIRST(n)) / STEP_X_SMALL(n)) /* * Step across a small sample grid gap */ #define RenderEdgeStepSmall(edge) { \ edge->x += edge->stepx_small; \ edge->e += edge->dx_small; \ if (edge->e > 0) \ { \ edge->e -= edge->dy; \ edge->x += edge->signdx; \ } \ } /* * Step across a large sample grid gap */ #define RenderEdgeStepBig(edge) { \ edge->x += edge->stepx_big; \ edge->e += edge->dx_big; \ if (edge->e > 0) \ { \ edge->e -= edge->dy; \ edge->x += edge->signdx; \ } \ } void pixman_rasterize_edges_accessors (pixman_image_t *image, pixman_edge_t *l, pixman_edge_t *r, pixman_fixed_t t, pixman_fixed_t b); #ifdef PIXMAN_TIMING /* Timing */ static inline uint64_t oil_profile_stamp_rdtsc (void) { uint64_t ts; __asm__ __volatile__("rdtsc\n" : "=A" (ts)); return ts; } #define OIL_STAMP oil_profile_stamp_rdtsc typedef struct PixmanTimer PixmanTimer; struct PixmanTimer { int initialized; const char *name; uint64_t n_times; uint64_t total; PixmanTimer *next; }; extern int timer_defined; void pixman_timer_register (PixmanTimer *timer); #define TIMER_BEGIN(tname) \ { \ static PixmanTimer timer##tname; \ uint64_t begin##tname; \ \ if (!timer##tname.initialized) \ { \ timer##tname.initialized = 1; \ timer##tname.name = #tname; \ pixman_timer_register (&timer##tname); \ } \ \ timer##tname.n_times++; \ begin##tname = OIL_STAMP(); #define TIMER_END(tname) \ timer##tname.total += OIL_STAMP() - begin##tname; \ } #endif /* PIXMAN_TIMING */ #endif /* PIXMAN_PRIVATE_H */ libgdiplus-2.11/pixman/pixman/pixman-trap.c0000664000175000017500000001532612225470167015727 00000000000000/* * Copyright © 2004 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" typedef uint32_t FbBits; void pixman_add_traps (pixman_image_t * image, int16_t x_off, int16_t y_off, int ntrap, pixman_trap_t *traps) { int bpp; int width; int height; pixman_fixed_t x_off_fixed; pixman_fixed_t y_off_fixed; pixman_edge_t l, r; pixman_fixed_t t, b; width = image->bits.width; height = image->bits.height; bpp = PIXMAN_FORMAT_BPP (image->bits.format); x_off_fixed = pixman_int_to_fixed(x_off); y_off_fixed = pixman_int_to_fixed(y_off); while (ntrap--) { t = traps->top.y + y_off_fixed; if (t < 0) t = 0; t = pixman_sample_ceil_y (t, bpp); b = traps->bot.y + y_off_fixed; if (pixman_fixed_to_int (b) >= height) b = pixman_int_to_fixed (height) - 1; b = pixman_sample_floor_y (b, bpp); if (b >= t) { /* initialize edge walkers */ pixman_edge_init (&l, bpp, t, traps->top.l + x_off_fixed, traps->top.y + y_off_fixed, traps->bot.l + x_off_fixed, traps->bot.y + y_off_fixed); pixman_edge_init (&r, bpp, t, traps->top.r + x_off_fixed, traps->top.y + y_off_fixed, traps->bot.r + x_off_fixed, traps->bot.y + y_off_fixed); pixman_rasterize_edges (image, &l, &r, t, b); } traps++; } } static void dump_image (pixman_image_t *image, const char *title) { int i, j; if (!image->type == BITS) { printf ("%s is not a regular image\n", title); } if (!image->bits.format == PIXMAN_a8) { printf ("%s is not an alpha mask\n", title); } printf ("\n\n\n%s: \n", title); for (i = 0; i < image->bits.height; ++i) { uint8_t *line = (uint8_t *)&(image->bits.bits[i * image->bits.rowstride]); for (j = 0; j < image->bits.width; ++j) printf ("%c", line[j]? '#' : ' '); printf ("\n"); } } void pixman_add_trapezoids (pixman_image_t *image, int16_t x_off, int y_off, int ntraps, const pixman_trapezoid_t *traps) { int i; #if 0 dump_image (image, "before"); #endif for (i = 0; i < ntraps; ++i) { const pixman_trapezoid_t *trap = &(traps[i]); if (!pixman_trapezoid_valid (trap)) continue; pixman_rasterize_trapezoid (image, trap, x_off, y_off); } #if 0 dump_image (image, "after"); #endif } void pixman_rasterize_trapezoid (pixman_image_t * image, const pixman_trapezoid_t *trap, int x_off, int y_off) { int bpp; int width; int height; pixman_fixed_t x_off_fixed; pixman_fixed_t y_off_fixed; pixman_edge_t l, r; pixman_fixed_t t, b; return_if_fail (image->type == BITS); if (!pixman_trapezoid_valid (trap)) return; width = image->bits.width; height = image->bits.height; bpp = PIXMAN_FORMAT_BPP (image->bits.format); x_off_fixed = pixman_int_to_fixed(x_off); y_off_fixed = pixman_int_to_fixed(y_off); t = trap->top + y_off_fixed; if (t < 0) t = 0; t = pixman_sample_ceil_y (t, bpp); b = trap->bottom + y_off_fixed; if (pixman_fixed_to_int (b) >= height) b = pixman_int_to_fixed (height) - 1; b = pixman_sample_floor_y (b, bpp); if (b >= t) { /* initialize edge walkers */ pixman_line_fixed_edge_init (&l, bpp, t, &trap->left, x_off, y_off); pixman_line_fixed_edge_init (&r, bpp, t, &trap->right, x_off, y_off); pixman_rasterize_edges (image, &l, &r, t, b); } } #if 0 static int _GreaterY (pixman_point_fixed_t *a, pixman_point_fixed_t *b) { if (a->y == b->y) return a->x > b->x; return a->y > b->y; } /* * Note that the definition of this function is a bit odd because * of the X coordinate space (y increasing downwards). */ static int _Clockwise (pixman_point_fixed_t *ref, pixman_point_fixed_t *a, pixman_point_fixed_t *b) { pixman_point_fixed_t ad, bd; ad.x = a->x - ref->x; ad.y = a->y - ref->y; bd.x = b->x - ref->x; bd.y = b->y - ref->y; return ((pixman_fixed_32_32_t) bd.y * ad.x - (pixman_fixed_32_32_t) ad.y * bd.x) < 0; } /* FIXME -- this could be made more efficient */ void fbAddTriangles (pixman_image_t * pPicture, int16_t x_off, int16_t y_off, int ntri, xTriangle *tris) { pixman_point_fixed_t *top, *left, *right, *tmp; xTrapezoid trap; for (; ntri; ntri--, tris++) { top = &tris->p1; left = &tris->p2; right = &tris->p3; if (_GreaterY (top, left)) { tmp = left; left = top; top = tmp; } if (_GreaterY (top, right)) { tmp = right; right = top; top = tmp; } if (_Clockwise (top, right, left)) { tmp = right; right = left; left = tmp; } /* * Two cases: * * + + * / \ / \ * / \ / \ * / + + \ * / -- -- \ * / -- -- \ * / --- --- \ * +-- --+ */ trap.top = top->y; trap.left.p1 = *top; trap.left.p2 = *left; trap.right.p1 = *top; trap.right.p2 = *right; if (right->y < left->y) trap.bottom = right->y; else trap.bottom = left->y; fbRasterizeTrapezoid (pPicture, &trap, x_off, y_off); if (right->y < left->y) { trap.top = right->y; trap.bottom = left->y; trap.right.p1 = *right; trap.right.p2 = *left; } else { trap.top = left->y; trap.bottom = right->y; trap.left.p1 = *left; trap.left.p2 = *right; } fbRasterizeTrapezoid (pPicture, &trap, x_off, y_off); } } #endif libgdiplus-2.11/pixman/pixman/pixman-pict.c0000664000175000017500000015330412225470167015717 00000000000000/* -*- Mode: c; c-basic-offset: 4; tab-width: 8; indent-tabs-mode: t; -*- */ /* * Copyright © 2000 SuSE, Inc. * Copyright © 2007 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, SuSE, Inc. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include "pixman-private.h" #include "pixman-mmx.h" #include "pixman-sse.h" #define FbFullMask(n) ((n) == 32 ? (uint32_t)-1 : ((((uint32_t) 1) << n) - 1)) #undef READ #undef WRITE #define READ(img,x) (*(x)) #define WRITE(img,ptr,v) ((*(ptr)) = (v)) typedef void (* CompositeFunc) (pixman_op_t, pixman_image_t *, pixman_image_t *, pixman_image_t *, int16_t, int16_t, int16_t, int16_t, int16_t, int16_t, uint16_t, uint16_t); uint32_t fbOver (uint32_t x, uint32_t y) { uint16_t a = ~x >> 24; uint16_t t; uint32_t m,n,o,p; m = FbOverU(x,y,0,a,t); n = FbOverU(x,y,8,a,t); o = FbOverU(x,y,16,a,t); p = FbOverU(x,y,24,a,t); return m|n|o|p; } uint32_t fbOver24 (uint32_t x, uint32_t y) { uint16_t a = ~x >> 24; uint16_t t; uint32_t m,n,o; m = FbOverU(x,y,0,a,t); n = FbOverU(x,y,8,a,t); o = FbOverU(x,y,16,a,t); return m|n|o; } uint32_t fbIn (uint32_t x, uint8_t y) { uint16_t a = y; uint16_t t; uint32_t m,n,o,p; m = FbInU(x,0,a,t); n = FbInU(x,8,a,t); o = FbInU(x,16,a,t); p = FbInU(x,24,a,t); return m|n|o|p; } /* * Naming convention: * * opSRCxMASKxDST */ static void fbCompositeOver_x888x8x8888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *src, *srcLine; uint32_t *dst, *dstLine; uint8_t *mask, *maskLine; int srcStride, maskStride, dstStride; uint8_t m; uint32_t s, d; uint16_t w; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); while (height--) { src = srcLine; srcLine += srcStride; dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = READ(pMask, mask++); if (m) { s = READ(pSrc, src) | 0xff000000; if (m == 0xff) WRITE(pDst, dst, s); else { d = fbIn (s, m); WRITE(pDst, dst, fbOver (d, READ(pDst, dst))); } } src++; dst++; } } } static void fbCompositeSolidMaskIn_nx8x8 (pixman_op_t op, pixman_image_t *iSrc, pixman_image_t *iMask, pixman_image_t *iDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint8_t *dstLine, *dst, dstMask; uint8_t *maskLine, *mask, m; int dstStride, maskStride; uint16_t w; uint16_t t; fbComposeGetSolid(iSrc, src, iDst->bits.format); dstMask = FbFullMask (PIXMAN_FORMAT_DEPTH (iDst->bits.format)); srca = src >> 24; fbComposeGetStart (iDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); fbComposeGetStart (iMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); if (srca == 0xff) { while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = *mask++; if (m == 0) { *dst = 0; } else if (m != 0xff) { *dst = FbIntMult(m, *dst, t); } dst++; } } } else { while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = *mask++; m = FbIntMult(m, srca, t); if (m == 0) { *dst = 0; } else if (m != 0xff) { *dst = FbIntMult(m, *dst, t); } dst++; } } } } static void fbCompositeSrcIn_8x8 (pixman_op_t op, pixman_image_t *iSrc, pixman_image_t *iMask, pixman_image_t *iDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *srcLine, *src; int dstStride, srcStride; uint16_t w; uint8_t s; uint16_t t; fbComposeGetStart (iSrc, xSrc, ySrc, uint8_t, srcStride, srcLine, 1); fbComposeGetStart (iDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = *src++; if (s == 0) { *dst = 0; } else if (s != 0xff) { *dst = FbIntMult(s, *dst, t); } dst++; } } } void fbCompositeSolidMask_nx8x8888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint32_t *dstLine, *dst, d, dstMask; uint8_t *maskLine, *mask, m; int dstStride, maskStride; uint16_t w; fbComposeGetSolid(pSrc, src, pDst->bits.format); dstMask = FbFullMask (PIXMAN_FORMAT_DEPTH (pDst->bits.format)); srca = src >> 24; if (src == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = READ(pMask, mask++); if (m == 0xff) { if (srca == 0xff) WRITE(pDst, dst, src & dstMask); else WRITE(pDst, dst, fbOver (src, READ(pDst, dst)) & dstMask); } else if (m) { d = fbIn (src, m); WRITE(pDst, dst, fbOver (d, READ(pDst, dst)) & dstMask); } dst++; } } } void fbCompositeSolidMask_nx8888x8888C (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint32_t *dstLine, *dst, d, dstMask; uint32_t *maskLine, *mask, ma; int dstStride, maskStride; uint16_t w; uint32_t m, n, o, p; fbComposeGetSolid(pSrc, src, pDst->bits.format); dstMask = FbFullMask (PIXMAN_FORMAT_DEPTH (pDst->bits.format)); srca = src >> 24; if (src == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { ma = READ(pMask, mask++); if (ma == 0xffffffff) { if (srca == 0xff) WRITE(pDst, dst, src & dstMask); else WRITE(pDst, dst, fbOver (src, READ(pDst, dst)) & dstMask); } else if (ma) { d = READ(pDst, dst); #define FbInOverC(src,srca,msk,dst,i,result) { \ uint16_t __a = FbGet8(msk,i); \ uint32_t __t, __ta; \ uint32_t __i; \ __t = FbIntMult (FbGet8(src,i), __a,__i); \ __ta = (uint8_t) ~FbIntMult (srca, __a,__i); \ __t = __t + FbIntMult(FbGet8(dst,i),__ta,__i); \ __t = (uint32_t) (uint8_t) (__t | (-(__t >> 8))); \ result = __t << (i); \ } FbInOverC (src, srca, ma, d, 0, m); FbInOverC (src, srca, ma, d, 8, n); FbInOverC (src, srca, ma, d, 16, o); FbInOverC (src, srca, ma, d, 24, p); WRITE(pDst, dst, m|n|o|p); } dst++; } } } void fbCompositeSolidMask_nx8x0888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint8_t *dstLine, *dst; uint32_t d; uint8_t *maskLine, *mask, m; int dstStride, maskStride; uint16_t w; fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (src == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 3); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = READ(pMask, mask++); if (m == 0xff) { if (srca == 0xff) d = src; else { d = Fetch24(pDst, dst); d = fbOver24 (src, d); } Store24(pDst, dst,d); } else if (m) { d = fbOver24 (fbIn(src,m), Fetch24(pDst, dst)); Store24(pDst, dst, d); } dst += 3; } } } void fbCompositeSolidMask_nx8x0565 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint16_t *dstLine, *dst; uint32_t d; uint8_t *maskLine, *mask, m; int dstStride, maskStride; uint16_t w; fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (src == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { m = READ(pMask, mask++); if (m == 0xff) { if (srca == 0xff) d = src; else { d = READ(pDst, dst); d = fbOver24 (src, cvt0565to0888(d)); } WRITE(pDst, dst, cvt8888to0565(d)); } else if (m) { d = READ(pDst, dst); d = fbOver24 (fbIn(src,m), cvt0565to0888(d)); WRITE(pDst, dst, cvt8888to0565(d)); } dst++; } } } void fbCompositeSolidMask_nx8888x0565C (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint16_t src16; uint16_t *dstLine, *dst; uint32_t d; uint32_t *maskLine, *mask, ma; int dstStride, maskStride; uint16_t w; uint32_t m, n, o; fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (src == 0) return; src16 = cvt8888to0565(src); fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { ma = READ(pMask, mask++); if (ma == 0xffffffff) { if (srca == 0xff) { WRITE(pDst, dst, src16); } else { d = READ(pDst, dst); d = fbOver24 (src, cvt0565to0888(d)); WRITE(pDst, dst, cvt8888to0565(d)); } } else if (ma) { d = READ(pDst, dst); d = cvt0565to0888(d); FbInOverC (src, srca, ma, d, 0, m); FbInOverC (src, srca, ma, d, 8, n); FbInOverC (src, srca, ma, d, 16, o); d = m|n|o; WRITE(pDst, dst, cvt8888to0565(d)); } dst++; } } } void fbCompositeSrc_8888x8888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst, dstMask; uint32_t *srcLine, *src, s; int dstStride, srcStride; uint8_t a; uint16_t w; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); dstMask = FbFullMask (PIXMAN_FORMAT_DEPTH (pDst->bits.format)); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = READ(pSrc, src++); a = s >> 24; if (a == 0xff) WRITE(pDst, dst, s & dstMask); else if (a) WRITE(pDst, dst, fbOver (s, READ(pDst, dst)) & dstMask); dst++; } } } void fbCompositeSrc_8888x0888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint32_t d; uint32_t *srcLine, *src, s; uint8_t a; int dstStride, srcStride; uint16_t w; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 3); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = READ(pSrc, src++); a = s >> 24; if (a) { if (a == 0xff) d = s; else d = fbOver24 (s, Fetch24(pDst, dst)); Store24(pDst, dst, d); } dst += 3; } } } void fbCompositeSrc_8888x0565 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint16_t *dstLine, *dst; uint32_t d; uint32_t *srcLine, *src, s; uint8_t a; int dstStride, srcStride; uint16_t w; fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = READ(pSrc, src++); a = s >> 24; if (a) { if (a == 0xff) d = s; else { d = READ(pDst, dst); d = fbOver24 (s, cvt0565to0888(d)); } WRITE(pDst, dst, cvt8888to0565(d)); } dst++; } } } void fbCompositeSrcAdd_8000x8000 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *srcLine, *src; int dstStride, srcStride; uint16_t w; uint8_t s, d; uint16_t t; fbComposeGetStart (pSrc, xSrc, ySrc, uint8_t, srcStride, srcLine, 1); fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = READ(pSrc, src++); if (s) { if (s != 0xff) { d = READ(pDst, dst); t = d + s; s = t | (0 - (t >> 8)); } WRITE(pDst, dst, s); } dst++; } } } void fbCompositeSrcAdd_8888x8888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst; uint32_t *srcLine, *src; int dstStride, srcStride; uint16_t w; uint32_t s, d; uint16_t t; uint32_t m,n,o,p; fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = READ(pSrc, src++); if (s) { if (s != 0xffffffff) { d = READ(pDst, dst); if (d) { m = FbAdd(s,d,0,t); n = FbAdd(s,d,8,t); o = FbAdd(s,d,16,t); p = FbAdd(s,d,24,t); s = m|n|o|p; } } WRITE(pDst, dst, s); } dst++; } } } static void fbCompositeSrcAdd_8888x8x8 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; uint32_t src; uint8_t sa; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); fbComposeGetSolid (pSrc, src, pDst->bits.format); sa = (src >> 24); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { uint16_t tmp; uint16_t a; uint32_t m, d; uint32_t r; a = READ(pMask, mask++); d = READ(pDst, dst); m = FbInU (sa, 0, a, tmp); r = FbAdd (m, d, 0, tmp); WRITE(pDst, dst++, r); } } } void fbCompositeSrcAdd_1000x1000 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { /* FIXME */ #if 0 uint32_t *dstBits, *srcBits; int dstStride, srcStride; int dstBpp, srcBpp; int dstXoff, dstYoff; int srcXoff, srcYoff; fbGetDrawable(pSrc->pDrawable, srcBits, srcStride, srcBpp, srcXoff, srcYoff); fbGetDrawable(pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff); fbBlt (srcBits + srcStride * (ySrc + srcYoff), srcStride, xSrc + srcXoff, dstBits + dstStride * (yDst + dstYoff), dstStride, xDst + dstXoff, width, height, GXor, FB_ALLONES, srcBpp, FALSE, FALSE); #endif } void fbCompositeSolidMask_nx1xn (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { /* FIXME */ #if 0 uint32_t *dstBits; uint32_t *maskBits; int dstStride, maskStride; int dstBpp, maskBpp; int dstXoff, dstYoff; int maskXoff, maskYoff; uint32_t src; fbComposeGetSolid(pSrc, src, pDst->bits.format); fbGetStipDrawable (pMask->pDrawable, maskBits, maskStride, maskBpp, maskXoff, maskYoff); fbGetDrawable (pDst->pDrawable, dstBits, dstStride, dstBpp, dstXoff, dstYoff); switch (dstBpp) { case 32: break; case 24: break; case 16: src = cvt8888to0565(src); break; } src = fbReplicatePixel (src, dstBpp); fbBltOne (maskBits + maskStride * (yMask + maskYoff), maskStride, xMask + maskXoff, dstBits + dstStride * (yDst + dstYoff), dstStride, (xDst + dstXoff) * dstBpp, dstBpp, width * dstBpp, height, 0x0, src, FB_ALLONES, 0x0); #endif } /* * Apply a constant alpha value in an over computation */ static void fbCompositeSrcSrc_nxn (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); /* * Simple bitblt */ static void fbCompositeSrcSrc_nxn (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { /* FIXME */ #if 0 uint32_t *dst; uint32_t *src; int dstStride, srcStride; int srcXoff, srcYoff; int dstXoff, dstYoff; int srcBpp; int dstBpp; pixman_bool_t reverse = FALSE; pixman_bool_t upsidedown = FALSE; fbGetDrawable(pSrc->pDrawable,src,srcStride,srcBpp,srcXoff,srcYoff); fbGetDrawable(pDst->pDrawable,dst,dstStride,dstBpp,dstXoff,dstYoff); fbBlt (src + (ySrc + srcYoff) * srcStride, srcStride, (xSrc + srcXoff) * srcBpp, dst + (yDst + dstYoff) * dstStride, dstStride, (xDst + dstXoff) * dstBpp, (width) * dstBpp, (height), GXcopy, FB_ALLONES, dstBpp, reverse, upsidedown); #endif } static void pixman_image_composite_rect (pixman_op_t op, pixman_image_t *src, pixman_image_t *mask, pixman_image_t *dest, int16_t src_x, int16_t src_y, int16_t mask_x, int16_t mask_y, int16_t dest_x, int16_t dest_y, uint16_t width, uint16_t height); void fbCompositeSolidFill (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src; fbComposeGetSolid(pSrc, src, pDst->bits.format); if (pDst->bits.format == PIXMAN_a8) src = src >> 24; else if (pDst->bits.format == PIXMAN_r5g6b5 || pDst->bits.format == PIXMAN_b5g6r5) src = cvt8888to0565 (src); pixman_fill (pDst->bits.bits, pDst->bits.rowstride, PIXMAN_FORMAT_BPP (pDst->bits.format), xDst, yDst, width, height, src); } static void fbCompositeSrc_8888xx888 (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dst; uint32_t *src; int dstStride, srcStride; uint32_t n_bytes = width * sizeof (uint32_t); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, src, 1); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dst, 1); while (height--) { memcpy (dst, src, n_bytes); dst += dstStride; src += srcStride; } } static void pixman_walk_composite_region (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height, pixman_bool_t srcRepeat, pixman_bool_t maskRepeat, CompositeFunc compositeRect) { int n; const pixman_box16_t *pbox; int w, h, w_this, h_this; int x_msk, y_msk, x_src, y_src, x_dst, y_dst; pixman_region16_t reg; pixman_region16_t *region; pixman_region_init (®); if (!pixman_compute_composite_region (®, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height)) { return; } region = ® pbox = pixman_region_rectangles (region, &n); while (n--) { h = pbox->y2 - pbox->y1; y_src = pbox->y1 - yDst + ySrc; y_msk = pbox->y1 - yDst + yMask; y_dst = pbox->y1; while (h) { h_this = h; w = pbox->x2 - pbox->x1; x_src = pbox->x1 - xDst + xSrc; x_msk = pbox->x1 - xDst + xMask; x_dst = pbox->x1; if (maskRepeat) { y_msk = MOD (y_msk, pMask->bits.height); if (h_this > pMask->bits.height - y_msk) h_this = pMask->bits.height - y_msk; } if (srcRepeat) { y_src = MOD (y_src, pSrc->bits.height); if (h_this > pSrc->bits.height - y_src) h_this = pSrc->bits.height - y_src; } while (w) { w_this = w; if (maskRepeat) { x_msk = MOD (x_msk, pMask->bits.width); if (w_this > pMask->bits.width - x_msk) w_this = pMask->bits.width - x_msk; } if (srcRepeat) { x_src = MOD (x_src, pSrc->bits.width); if (w_this > pSrc->bits.width - x_src) w_this = pSrc->bits.width - x_src; } (*compositeRect) (op, pSrc, pMask, pDst, x_src, y_src, x_msk, y_msk, x_dst, y_dst, w_this, h_this); w -= w_this; x_src += w_this; x_msk += w_this; x_dst += w_this; } h -= h_this; y_src += h_this; y_msk += h_this; y_dst += h_this; } pbox++; } pixman_region_fini (®); } static pixman_bool_t can_get_solid (pixman_image_t *image) { if (image->type == SOLID) return TRUE; if (image->type != BITS || image->bits.width != 1 || image->bits.height != 1) { return FALSE; } if (image->common.repeat != PIXMAN_REPEAT_NORMAL) return FALSE; switch (image->bits.format) { case PIXMAN_a8r8g8b8: case PIXMAN_x8r8g8b8: case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_r5g6b5: case PIXMAN_b5g6r5: return TRUE; default: return FALSE; } } #define SCANLINE_BUFFER_LENGTH 2048 static void pixman_image_composite_rect (pixman_op_t op, pixman_image_t *src, pixman_image_t *mask, pixman_image_t *dest, int16_t src_x, int16_t src_y, int16_t mask_x, int16_t mask_y, int16_t dest_x, int16_t dest_y, uint16_t width, uint16_t height) { FbComposeData compose_data; uint32_t _scanline_buffer[SCANLINE_BUFFER_LENGTH * 3]; uint32_t *scanline_buffer = _scanline_buffer; return_if_fail (src != NULL); return_if_fail (dest != NULL); if (width > SCANLINE_BUFFER_LENGTH) { scanline_buffer = (uint32_t *)pixman_malloc_abc (width, 3, sizeof (uint32_t)); if (!scanline_buffer) return; } compose_data.op = op; compose_data.src = src; compose_data.mask = mask; compose_data.dest = dest; compose_data.xSrc = src_x; compose_data.ySrc = src_y; compose_data.xMask = mask_x; compose_data.yMask = mask_y; compose_data.xDest = dest_x; compose_data.yDest = dest_y; compose_data.width = width; compose_data.height = height; pixman_composite_rect_general (&compose_data, scanline_buffer); if (scanline_buffer != _scanline_buffer) free (scanline_buffer); } /* These "formats" both have depth 0, so they * will never clash with any real ones */ #define PIXMAN_null PIXMAN_FORMAT(0,0,0,0,0,0) #define PIXMAN_solid PIXMAN_FORMAT(0,1,0,0,0,0) #define NEED_COMPONENT_ALPHA (1 << 0) #define NEED_PIXBUF (1 << 1) #define NEED_SOLID_MASK (1 << 2) typedef struct { pixman_op_t op; pixman_format_code_t src_format; pixman_format_code_t mask_format; pixman_format_code_t dest_format; CompositeFunc func; uint32_t flags; } FastPathInfo; #ifdef USE_MMX static const FastPathInfo mmx_fast_paths[] = { { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_r5g6b5, fbCompositeSolidMask_nx8x0565mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_b5g6r5, fbCompositeSolidMask_nx8x0565mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5, fbCompositeSolidMask_nx8888x0565Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8888x8888Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5, fbCompositeSolidMask_nx8888x0565Cmmx, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5, fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8b8g8r8, PIXMAN_r5g6b5, fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888RevNPx8888mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8r8g8b8, PIXMAN_b5g6r5, fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5, fbCompositeSrc_8888RevNPx0565mmx, NEED_PIXBUF }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSrc_x888xnx8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSrc_x888xnx8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8, PIXMAN_a8b8g8r8, fbCompositeSrc_x888xnx8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeSrc_x888xnx8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8x8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8x8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8, PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8x8888mmx, NEED_SOLID_MASK }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8x8888mmx, NEED_SOLID_MASK }, #if 0 /* FIXME: This code is commented out since it's apparently not actually faster than the generic code. */ { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeOver_x888x8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeOver_x888x8x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888mmx, 0 }, #endif { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSolid_nx8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSolid_nx8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeSolid_nx0565mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeSrc_8888x0565mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8888mmx, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeSrc_8888x0565mmx, 0 }, { PIXMAN_OP_ADD, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrcAdd_8888x8888mmx, 0 }, { PIXMAN_OP_ADD, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSrcAdd_8888x8888mmx, 0 }, { PIXMAN_OP_ADD, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeSrcAdd_8000x8000mmx, 0 }, { PIXMAN_OP_ADD, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8, fbCompositeSrcAdd_8888x8x8mmx, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8b8g8r8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeSolidMaskSrc_nx8x8888mmx, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_r5g6b5, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_SRC, PIXMAN_b5g6r5, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeCopyAreammx, 0 }, { PIXMAN_OP_IN, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeIn_8x8mmx, 0 }, { PIXMAN_OP_IN, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8, fbCompositeIn_nx8x8mmx, 0 }, { PIXMAN_OP_NONE }, }; #endif #ifdef USE_SSE2 static const FastPathInfo sse_fast_paths[] = { { PIXMAN_OP_NONE }, }; #endif static const FastPathInfo c_fast_paths[] = { { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_r5g6b5, fbCompositeSolidMask_nx8x0565, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_b5g6r5, fbCompositeSolidMask_nx8x0565, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_r8g8b8, fbCompositeSolidMask_nx8x0888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_b8g8r8, fbCompositeSolidMask_nx8x0888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8r8g8b8, PIXMAN_r5g6b5, fbCompositeSolidMask_nx8888x0565C, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx8888x8888C, NEED_COMPONENT_ALPHA }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a8b8g8r8, PIXMAN_b5g6r5, fbCompositeSolidMask_nx8888x0565C, NEED_COMPONENT_ALPHA }, #if 0 /* FIXME: This code is commented out since it's apparently not actually faster than the generic code */ { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_x8r8g8b8, fbCompositeOver_x888x8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8r8g8b8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8, PIXMAN_x8b8g8r8, fbCompositeOver_x888x8x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_x8b8r8g8, PIXMAN_a8, PIXMAN_a8r8g8b8, fbCompositeOver_x888x8x8888, 0 }, #endif { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrc_8888x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSrc_8888x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeSrc_8888x0565, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSrc_8888x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSrc_8888x8888, 0 }, { PIXMAN_OP_OVER, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeSrc_8888x0565, 0 }, #if 0 /* FIXME */ { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_r5g6b5, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_b5g6r5, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_r8g8b8, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_b8g8r8, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_a8r8g8b8, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_a8b8g8r8, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_x8r8g8b8, fbCompositeSolidMask_nx1xn, 0 }, { PIXMAN_OP_OVER, PIXMAN_solid, PIXMAN_a1, PIXMAN_x8b8g8r8, fbCompositeSolidMask_nx1xn, 0 }, #endif { PIXMAN_OP_ADD, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrcAdd_8888x8888, 0 }, { PIXMAN_OP_ADD, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSrcAdd_8888x8888, 0 }, { PIXMAN_OP_ADD, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeSrcAdd_8000x8000, 0 }, #if 0 /* FIXME */ { PIXMAN_OP_ADD, PIXMAN_a1, PIXMAN_null, PIXMAN_a1, fbCompositeSrcAdd_1000x1000, 0 }, #endif { PIXMAN_OP_ADD, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8, fbCompositeSrcAdd_8888x8x8, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_a8, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_solid, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeSolidFill, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSrc_8888xx888, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSrc_8888xx888, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSrc_8888xx888, 0 }, #if 0 /* FIXME */ { PIXMAN_OP_SRC, PIXMAN_a8r8g8b8, PIXMAN_null, PIXMAN_a8r8g8b8, fbCompositeSrcSrc_nxn, 0 }, { PIXMAN_OP_SRC, PIXMAN_a8b8g8r8, PIXMAN_null, PIXMAN_a8b8g8r8, fbCompositeSrcSrc_nxn, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8r8g8b8, PIXMAN_null, PIXMAN_x8r8g8b8, fbCompositeSrcSrc_nxn, 0 }, { PIXMAN_OP_SRC, PIXMAN_x8b8g8r8, PIXMAN_null, PIXMAN_x8b8g8r8, fbCompositeSrcSrc_nxn, 0 }, { PIXMAN_OP_SRC, PIXMAN_r5g6b5, PIXMAN_null, PIXMAN_r5g6b5, fbCompositeSrcSrc_nxn, 0 }, { PIXMAN_OP_SRC, PIXMAN_b5g6r5, PIXMAN_null, PIXMAN_b5g6r5, fbCompositeSrcSrc_nxn, 0 }, #endif { PIXMAN_OP_IN, PIXMAN_a8, PIXMAN_null, PIXMAN_a8, fbCompositeSrcIn_8x8, 0 }, { PIXMAN_OP_IN, PIXMAN_solid, PIXMAN_a8, PIXMAN_a8, fbCompositeSolidMaskIn_nx8x8, 0 }, { PIXMAN_OP_NONE }, }; static pixman_bool_t mask_is_solid (pixman_image_t *mask) { if (mask->type == SOLID) return TRUE; if (mask->type == BITS && mask->common.repeat == PIXMAN_REPEAT_NORMAL && mask->bits.width == 1 && mask->bits.height == 1) { return TRUE; } return FALSE; } static const FastPathInfo * get_fast_path (const FastPathInfo *fast_paths, pixman_op_t op, pixman_image_t *pSrc, pixman_image_t *pMask, pixman_image_t *pDst, pixman_bool_t is_pixbuf) { const FastPathInfo *info; for (info = fast_paths; info->op != PIXMAN_OP_NONE; info++) { pixman_bool_t valid_src = FALSE; pixman_bool_t valid_mask = FALSE; if (info->op != op) continue; if ((info->src_format == PIXMAN_solid && can_get_solid (pSrc)) || (pSrc->type == BITS && info->src_format == pSrc->bits.format)) { valid_src = TRUE; } if (!valid_src) continue; if ((info->mask_format == PIXMAN_null && !pMask) || (pMask && pMask->type == BITS && info->mask_format == pMask->bits.format)) { valid_mask = TRUE; if (info->flags & NEED_SOLID_MASK) { if (!pMask || !mask_is_solid (pMask)) valid_mask = FALSE; } if (info->flags & NEED_COMPONENT_ALPHA) { if (!pMask || !pMask->common.component_alpha) valid_mask = FALSE; } } if (!valid_mask) continue; if (info->dest_format != pDst->bits.format) continue; if ((info->flags & NEED_PIXBUF) && !is_pixbuf) continue; return info; } return NULL; } void pixman_image_composite (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { pixman_bool_t srcRepeat = pSrc->type == BITS && pSrc->common.repeat == PIXMAN_REPEAT_NORMAL; pixman_bool_t maskRepeat = FALSE; pixman_bool_t srcTransform = pSrc->common.transform != NULL; pixman_bool_t maskTransform = FALSE; pixman_bool_t srcAlphaMap = pSrc->common.alpha_map != NULL; pixman_bool_t maskAlphaMap = FALSE; pixman_bool_t dstAlphaMap = pDst->common.alpha_map != NULL; CompositeFunc func = NULL; #ifdef USE_SSE2 fbComposeSetupSSE(); #endif #ifdef USE_MMX fbComposeSetupMMX(); #endif if (srcRepeat && srcTransform && pSrc->bits.width == 1 && pSrc->bits.height == 1) { srcTransform = FALSE; } if (pMask && pMask->type == BITS) { maskRepeat = pMask->common.repeat == PIXMAN_REPEAT_NORMAL; maskTransform = pMask->common.transform != 0; if (pMask->common.filter == PIXMAN_FILTER_CONVOLUTION) maskTransform = TRUE; maskAlphaMap = pMask->common.alpha_map != 0; if (maskRepeat && maskTransform && pMask->bits.width == 1 && pMask->bits.height == 1) { maskTransform = FALSE; } } if ((pSrc->type == BITS || can_get_solid (pSrc)) && (!pMask || pMask->type == BITS) && !srcTransform && !maskTransform && !maskAlphaMap && !srcAlphaMap && !dstAlphaMap && (pSrc->common.filter != PIXMAN_FILTER_CONVOLUTION) && (pSrc->common.repeat != PIXMAN_REPEAT_PAD) && (!pMask || (pMask->common.filter != PIXMAN_FILTER_CONVOLUTION && pMask->common.repeat != PIXMAN_REPEAT_PAD)) && !pSrc->common.read_func && !pSrc->common.write_func && !(pMask && pMask->common.read_func) && !(pMask && pMask->common.write_func) && !pDst->common.read_func && !pDst->common.write_func) { const FastPathInfo *info; pixman_bool_t pixbuf; pixbuf = pSrc && pSrc->type == BITS && pMask && pMask->type == BITS && pSrc->bits.bits == pMask->bits.bits && xSrc == xMask && ySrc == yMask && !pMask->common.component_alpha && !maskRepeat; info = NULL; #ifdef USE_SSE2 if (pixman_have_sse ()) info = get_fast_path (sse_fast_paths, op, pSrc, pMask, pDst, pixbuf); if (!info) #endif #ifdef USE_MMX if (pixman_have_mmx()) info = get_fast_path (mmx_fast_paths, op, pSrc, pMask, pDst, pixbuf); if (!info) #endif info = get_fast_path (c_fast_paths, op, pSrc, pMask, pDst, pixbuf); if (info) { func = info->func; if (info->src_format == PIXMAN_solid) srcRepeat = FALSE; if (info->mask_format == PIXMAN_solid || info->flags & NEED_SOLID_MASK) { maskRepeat = FALSE; } } } if ((srcRepeat && pSrc->bits.width == 1 && pSrc->bits.height == 1) || (maskRepeat && pMask->bits.width == 1 && pMask->bits.height == 1)) { /* If src or mask are repeating 1x1 images and srcRepeat or * maskRepeat are still TRUE, it means the fast path we * selected does not actually handle repeating images. * * So rather than call the "fast path" with a zillion * 1x1 requests, we just use the general code (which does * do something sensible with 1x1 repeating images). */ func = NULL; } if (!func) { func = pixman_image_composite_rect; /* CompositeGeneral optimizes 1x1 repeating images itself */ if (pSrc->type == BITS && pSrc->bits.width == 1 && pSrc->bits.height == 1) { srcRepeat = FALSE; } if (pMask && pMask->type == BITS && pMask->bits.width == 1 && pMask->bits.height == 1) { maskRepeat = FALSE; } /* if we are transforming, repeats are handled in fbFetchTransformed */ if (srcTransform) srcRepeat = FALSE; if (maskTransform) maskRepeat = FALSE; } pixman_walk_composite_region (op, pSrc, pMask, pDst, xSrc, ySrc, xMask, yMask, xDst, yDst, width, height, srcRepeat, maskRepeat, func); } #ifdef USE_MMX /* The CPU detection code needs to be in a file not compiled with * "-mmmx -msse", as gcc would generate CMOV instructions otherwise * that would lead to SIGILL instructions on old CPUs that don't have * it. */ #if !defined(__amd64__) && !defined(__x86_64__) #ifdef HAVE_GETISAX #include #endif enum CPUFeatures { NoFeatures = 0, MMX = 0x1, MMX_Extensions = 0x2, SSE = 0x6, SSE2 = 0x8, CMOV = 0x10 }; static unsigned int detectCPUFeatures(void) { unsigned int features = 0; unsigned int result = 0; #ifdef HAVE_GETISAX if (getisax(&result, 1)) { if (result & AV_386_CMOV) features |= CMOV; if (result & AV_386_MMX) features |= MMX; if (result & AV_386_AMD_MMX) features |= MMX_Extensions; if (result & AV_386_SSE) features |= SSE; if (result & AV_386_SSE2) features |= SSE2; } #else char vendor[13]; #ifdef _MSC_VER int vendor0 = 0, vendor1, vendor2; #endif vendor[0] = 0; vendor[12] = 0; #ifdef __GNUC__ /* see p. 118 of amd64 instruction set manual Vol3 */ /* We need to be careful about the handling of %ebx and * %esp here. We can't declare either one as clobbered * since they are special registers (%ebx is the "PIC * register" holding an offset to global data, %esp the * stack pointer), so we need to make sure they have their * original values when we access the output operands. */ __asm__ ("pushf\n" "pop %%eax\n" "mov %%eax, %%ecx\n" "xor $0x00200000, %%eax\n" "push %%eax\n" "popf\n" "pushf\n" "pop %%eax\n" "mov $0x0, %%edx\n" "xor %%ecx, %%eax\n" "jz 1f\n" "mov $0x00000000, %%eax\n" "push %%ebx\n" "cpuid\n" "mov %%ebx, %%eax\n" "pop %%ebx\n" "mov %%eax, %1\n" "mov %%edx, %2\n" "mov %%ecx, %3\n" "mov $0x00000001, %%eax\n" "push %%ebx\n" "cpuid\n" "pop %%ebx\n" "1:\n" "mov %%edx, %0\n" : "=r" (result), "=m" (vendor[0]), "=m" (vendor[4]), "=m" (vendor[8]) : : "%eax", "%ecx", "%edx" ); #elif defined (_MSC_VER) _asm { pushfd pop eax mov ecx, eax xor eax, 00200000h push eax popfd pushfd pop eax mov edx, 0 xor eax, ecx jz nocpuid mov eax, 0 push ebx cpuid mov eax, ebx pop ebx mov vendor0, eax mov vendor1, edx mov vendor2, ecx mov eax, 1 push ebx cpuid pop ebx nocpuid: mov result, edx } memmove (vendor+0, &vendor0, 4); memmove (vendor+4, &vendor1, 4); memmove (vendor+8, &vendor2, 4); #else # error unsupported compiler #endif features = 0; if (result) { /* result now contains the standard feature bits */ if (result & (1 << 15)) features |= CMOV; if (result & (1 << 23)) features |= MMX; if (result & (1 << 25)) features |= SSE; if (result & (1 << 26)) features |= SSE2; if ((features & MMX) && !(features & SSE) && (strcmp(vendor, "AuthenticAMD") == 0 || strcmp(vendor, "Geode by NSC") == 0)) { /* check for AMD MMX extensions */ #ifdef __GNUC__ __asm__("push %%ebx\n" "mov $0x80000000, %%eax\n" "cpuid\n" "xor %%edx, %%edx\n" "cmp $0x1, %%eax\n" "jge 2f\n" "mov $0x80000001, %%eax\n" "cpuid\n" "2:\n" "pop %%ebx\n" "mov %%edx, %0\n" : "=r" (result) : : "%eax", "%ecx", "%edx" ); #elif defined _MSC_VER _asm { push ebx mov eax, 80000000h cpuid xor edx, edx cmp eax, 1 jge notamd mov eax, 80000001h cpuid notamd: pop ebx mov result, edx } #endif if (result & (1<<22)) features |= MMX_Extensions; } } #endif /* HAVE_GETISAX */ return features; } pixman_bool_t pixman_have_mmx (void) { static pixman_bool_t initialized = FALSE; static pixman_bool_t mmx_present; if (!initialized) { unsigned int features = detectCPUFeatures(); mmx_present = (features & (MMX|MMX_Extensions)) == (MMX|MMX_Extensions); initialized = TRUE; } return mmx_present; } #ifdef USE_SSE2 pixman_bool_t pixman_have_sse (void) { static pixman_bool_t initialized = FALSE; static pixman_bool_t sse_present; if (!initialized) { unsigned int features = detectCPUFeatures(); sse_present = (features & (MMX|MMX_Extensions|SSE|SSE2)) == (MMX|MMX_Extensions|SSE|SSE2); initialized = TRUE; } return sse_present; } #endif #endif /* __amd64__ */ #endif libgdiplus-2.11/pixman/pixman/pixman-embed.h0000664000175000017500000001711212225470167016035 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Larry Ewing (via script) * */ #ifndef _PIXMAN_EMBED_H_ #define _PIXMAN_EMBED_H_ #define _pixman_brokendata _mono_pixman_brokendata #define _pixman_edge_tMultiInit _mono_pixman_edge_tMultiInit #define _pixman_region_emptyBox _mono_pixman_region_emptyBox #define _pixman_region_emptyData _mono_pixman_region_emptyData #define pixmanFetchSourcePict mono_pixmanFetchSourcePict #define pixman_add_trapezoids mono_pixman_add_trapezoids #define pixman_add_traps mono_pixman_add_traps #define pixman_addition_overflows_int mono_pixman_addition_overflows_int #define pixman_blt mono_pixman_blt #define pixman_blt_mmx mono_pixman_blt_mmx #define pixman_break mono_pixman_break #define pixman_brokendata mono_pixman_brokendata #define pixman_composeFunctions mono_pixman_composeFunctions #define pixman_composite_rect_general mono_pixman_composite_rect_general #define pixman_composite_rect_general_accessors mono_pixman_composite_rect_general_accessors #define pixman_compute_composite_region mono_pixman_compute_composite_region #define pixman_edge_init mono_pixman_edge_init #define pixman_edge_step mono_pixman_edge_step #define pixman_fbCombineFuncC mono_pixman_fbCombineFuncC #define pixman_fbCombineFuncU mono_pixman_fbCombineFuncU #define pixman_fbCombineMaskU mono_pixman_fbCombineMaskU #define pixman_fetchPixelProcForPicture mono_pixman_fetchPixelProcForPicture #define pixman_fetchPixelProcForPicture_accessors mono_pixman_fetchPixelProcForPicture_accessors #define pixman_fetchProcForPicture mono_pixman_fetchProcForPicture #define pixman_fetchProcForPicture_accessors mono_pixman_fetchProcForPicture_accessors #define pixman_fill mono_pixman_fill #define pixman_fill_mmx mono_pixman_fill_mmx #define pixman_format_supported_destination mono_pixman_format_supported_destination #define pixman_format_supported_source mono_pixman_format_supported_source #define pixman_have_mmx mono_pixman_have_mmx #define pixman_have_sse mono_pixman_have_sse #define pixman_image_composite mono_pixman_image_composite #define pixman_image_composite_rect mono_pixman_image_composite_rect #define pixman_image_create_bits mono_pixman_image_create_bits #define pixman_image_create_conical_gradient mono_pixman_image_create_conical_gradient #define pixman_image_create_linear_gradient mono_pixman_image_create_linear_gradient #define pixman_image_create_radial_gradient mono_pixman_image_create_radial_gradient #define pixman_image_create_solid_fill mono_pixman_image_create_solid_fill #define pixman_image_fill_rectangles mono_pixman_image_fill_rectangles #define pixman_image_get_data mono_pixman_image_get_data #define pixman_image_get_depth mono_pixman_image_get_depth #define pixman_image_get_height mono_pixman_image_get_height #define pixman_image_get_stride mono_pixman_image_get_stride #define pixman_image_get_width mono_pixman_image_get_width #define pixman_image_ref mono_pixman_image_ref #define pixman_image_set_accessors mono_pixman_image_set_accessors #define pixman_image_set_alpha_map mono_pixman_image_set_alpha_map #define pixman_image_set_clip_region mono_pixman_image_set_clip_region #define pixman_image_set_component_alpha mono_pixman_image_set_component_alpha #define pixman_image_set_filter mono_pixman_image_set_filter #define pixman_image_set_has_client_clip mono_pixman_image_set_has_client_clip #define pixman_image_set_indexed mono_pixman_image_set_indexed #define pixman_image_set_repeat mono_pixman_image_set_repeat #define pixman_image_set_source_clipping mono_pixman_image_set_source_clipping #define pixman_image_set_transform mono_pixman_image_set_transform #define pixman_image_unref mono_pixman_image_unref #define pixman_line_fixed_edge_init mono_pixman_line_fixed_edge_init #define pixman_malloc_ab mono_pixman_malloc_ab #define pixman_malloc_abc mono_pixman_malloc_abc #define pixman_multiply_overflows_int mono_pixman_multiply_overflows_int #define pixman_op mono_pixman_op #define pixman_rasterize_edges mono_pixman_rasterize_edges #define pixman_rasterize_edges_accessors mono_pixman_rasterize_edges_accessors #define pixman_rasterize_trapezoid mono_pixman_rasterize_trapezoid #define pixman_rect_alloc mono_pixman_rect_alloc #define pixman_region16_print mono_pixman_region16_print #define pixman_region_append mono_pixman_region_append #define pixman_region_contains_point mono_pixman_region_contains_point #define pixman_region_contains_rectangle mono_pixman_region_contains_rectangle #define pixman_region_copy mono_pixman_region_copy #define pixman_region_empty mono_pixman_region_empty #define pixman_region_emptyBox mono_pixman_region_emptyBox #define pixman_region_emptyData mono_pixman_region_emptyData #define pixman_region_equal mono_pixman_region_equal #define pixman_region_extents mono_pixman_region_extents #define pixman_region_fini mono_pixman_region_fini #define pixman_region_init mono_pixman_region_init #define pixman_region_init_rect mono_pixman_region_init_rect #define pixman_region_init_rects mono_pixman_region_init_rects #define pixman_region_init_with_extents mono_pixman_region_init_with_extents #define pixman_region_intersect mono_pixman_region_intersect #define pixman_region_intersectO mono_pixman_region_intersectO #define pixman_region_inverse mono_pixman_region_inverse #define pixman_region_n_rects mono_pixman_region_n_rects #define pixman_region_not_empty mono_pixman_region_not_empty #define pixman_region_rectangles mono_pixman_region_rectangles #define pixman_region_rects mono_pixman_region_rects #define pixman_region_reset mono_pixman_region_reset #define pixman_region_selfcheck mono_pixman_region_selfcheck #define pixman_region_set_static_pointers mono_pixman_region_set_static_pointers #define pixman_region_subtract mono_pixman_region_subtract #define pixman_region_subtractO mono_pixman_region_subtractO #define pixman_region_translate mono_pixman_region_translate #define pixman_region_union mono_pixman_region_union #define pixman_region_unionO mono_pixman_region_unionO #define pixman_region_union_rect mono_pixman_region_union_rect #define pixman_region_validate mono_pixman_region_validate #define pixman_sample_ceil_y mono_pixman_sample_ceil_y #define pixman_sample_floor_y mono_pixman_sample_floor_y #define pixman_set_extents mono_pixman_set_extents #define pixman_storeProcForPicture mono_pixman_storeProcForPicture #define pixman_storeProcForPicture_accessors mono_pixman_storeProcForPicture_accessors #define pixman_transform_point_3d mono_pixman_transform_point_3d #define pixman_version mono_pixman_version #define pixman_version_string mono_pixman_version_string #endif libgdiplus-2.11/pixman/pixman/Makefile.win320000664000175000017500000000343712225470167015724 00000000000000LIBRARY = pixman-1 CC = cl LINK = link ifeq ($(CFG),) CFG=release endif ifeq ($(MMX),) MMX=1 endif CFLAGS = -MD -nologo -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -I../pixman/src -I. -DPACKAGE=$(LIBRARY) -DPACKAGE_VERSION="" -DPACKAGE_BUGREPORT="" MMX_CFLAGS = -DUSE_MMX -w14710 -w14714 # optimization flags ifeq ($(CFG),debug) CFLAGS += -Od -Zi else CFLAGS += -O2 endif SOURCES = \ pixman-region.c \ pixman-image.c \ pixman-access.c \ pixman-access-accessors.c \ pixman-combine.c \ pixman-compose.c \ pixman-compose-accessors.c \ pixman-pict.c \ pixman-source.c \ pixman-transformed.c \ pixman-transformed-accessors.c \ pixman-utils.c \ pixman-edge.c \ pixman-edge-accessors.c \ pixman-trap.c \ pixman-compute-region.c \ pixman-timer.c \ $(NULL) # MMX compilation flags ifeq ($(MMX),1) CFLAGS += $(MMX_CFLAGS) SOURCES += pixman-mmx.c endif OBJECTS = $(patsubst %.c, $(CFG)/%.obj, $(SOURCES)) # targets all: inform informMMX $(CFG)/$(LIBRARY).lib @exit 0 clean: inform clean_r @exit 0 pixman: inform informMMX $(CFG)/$(LIBRARY).lib @exit 0 inform: ifneq ($(CFG),release) ifneq ($(CFG),debug) @echo "Invalid specified configuration option : "$(CFG)"." @echo @echo -n "Possible choices for configuration are " @echo "'release' and 'debug'" @echo "" @exit 1 endif endif informMMX: ifneq ($(MMX),0) ifneq ($(MMX),1) @echo "Invalid specified MMX option : "$(MMX)"." @echo @echo -n "Possible choices for MMX are 0 or 1" @echo "" @exit 1 endif endif # pixman compilation and linking $(CFG)/%.obj: %.c @mkdir -p $(CFG) @$(CC) -c $(CFLAGS) -Fo"$@" $< $(CFG)/$(LIBRARY).lib: $(OBJECTS) lib -NOLOGO -OUT:$@ $(OBJECTS) || exit 0 clean_r: @rm -f $(CFG)/*.obj $(CFG)/*.lib $(CFG)/*.pdb $(CFG)/*.ilk || exit 0 libgdiplus-2.11/pixman/pixman/pixman-mmx.h0000664000175000017500000002222712225470167015565 00000000000000/* * Copyright © 2004 Red Hat, Inc. * Copyright © 2005 Trolltech AS * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Red Hat not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Red Hat makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Søren Sandmann (sandmann@redhat.com) * Lars Knoll (lars@trolltech.com) * * Based on work by Owen Taylor */ #ifndef _PIXMAN_MMX_H_ #define _PIXMAN_MMX_H_ #ifdef HAVE_DIX_CONFIG_H #include #endif #include "pixman-private.h" #ifdef USE_MMX #if !defined(__amd64__) && !defined(__x86_64__) pixman_bool_t pixman_have_mmx(void); #else #define pixman_have_mmx() TRUE #endif #else #define pixman_have_mmx() FALSE #endif #ifdef USE_MMX pixman_bool_t pixman_blt_mmx (uint32_t *src_bits, uint32_t *dst_bits, int src_stride, int dst_stride, int src_bpp, int dst_bpp, int src_x, int src_y, int dst_x, int dst_y, int width, int height); pixman_bool_t pixman_fill_mmx (uint32_t *bits, int stride, int bpp, int x, int y, int width, int height, uint32_t xor); void fbComposeSetupMMX(void); void fbCompositeSolidMask_nx8888x0565Cmmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrcAdd_8888x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_8888x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolidMaskSrc_nx8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_x888xnx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolidMask_nx8888x8888Cmmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolidMask_nx8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeIn_nx8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeIn_8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrcAdd_8888x8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrcAdd_8000x8000mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_8888RevNPx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_8888x0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_8888RevNPx0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolid_nx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolid_nx0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeSrc_8888x8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeCopyAreammx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); void fbCompositeOver_x888x8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height); #endif /* USE_MMX */ #endif /* _PIXMAN_MMX_H_ */ libgdiplus-2.11/pixman/pixman/pixman-access-accessors.c0000664000175000017500000000007012225470167020173 00000000000000#define PIXMAN_FB_ACCESSORS #include "pixman-access.c" libgdiplus-2.11/pixman/pixman/pixman-utils.c0000664000175000017500000003075712225470167016126 00000000000000/* * Copyright © 2000 SuSE, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, SuSE, Inc. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" #include "pixman-mmx.h" pixman_bool_t pixman_transform_point_3d (pixman_transform_t *transform, pixman_vector_t *vector) { pixman_vector_t result; int i, j; pixman_fixed_32_32_t partial; pixman_fixed_48_16_t v; for (j = 0; j < 3; j++) { v = 0; for (i = 0; i < 3; i++) { partial = ((pixman_fixed_48_16_t) transform->matrix[j][i] * (pixman_fixed_48_16_t) vector->vector[i]); v += partial >> 16; } if (v > pixman_max_fixed_48_16 || v < pixman_min_fixed_48_16) return FALSE; result.vector[j] = (pixman_fixed_48_16_t) v; } if (!result.vector[2]) return FALSE; *vector = result; return TRUE; } pixman_bool_t pixman_blt (uint32_t *src_bits, uint32_t *dst_bits, int src_stride, int dst_stride, int src_bpp, int dst_bpp, int src_x, int src_y, int dst_x, int dst_y, int width, int height) { #ifdef USE_MMX if (pixman_have_mmx()) { return pixman_blt_mmx (src_bits, dst_bits, src_stride, dst_stride, src_bpp, dst_bpp, src_x, src_y, dst_x, dst_y, width, height); } else #endif return FALSE; } static void pixman_fill8 (uint32_t *bits, int stride, int x, int y, int width, int height, uint32_t xor) { int byte_stride = stride * (int) sizeof (uint32_t); uint8_t *dst = (uint8_t *) bits; uint8_t v = xor & 0xff; int i; dst = dst + y * byte_stride + x; while (height--) { for (i = 0; i < width; ++i) dst[i] = v; dst += byte_stride; } } static void pixman_fill16 (uint32_t *bits, int stride, int x, int y, int width, int height, uint32_t xor) { int short_stride = (stride * (int) sizeof (uint32_t)) / (int) sizeof (uint16_t); uint16_t *dst = (uint16_t *)bits; uint16_t v = xor & 0xffff; int i; dst = dst + y * short_stride + x; while (height--) { for (i = 0; i < width; ++i) dst[i] = v; dst += short_stride; } } static void pixman_fill32 (uint32_t *bits, int stride, int x, int y, int width, int height, uint32_t xor) { int i; bits = bits + y * stride + x; while (height--) { for (i = 0; i < width; ++i) bits[i] = xor; bits += stride; } } pixman_bool_t pixman_fill (uint32_t *bits, int stride, int bpp, int x, int y, int width, int height, uint32_t xor) { #if 0 printf ("filling: %d %d %d %d (stride: %d, bpp: %d) pixel: %x\n", x, y, width, height, stride, bpp, xor); #endif #ifdef USE_MMX if (!pixman_have_mmx() || !pixman_fill_mmx (bits, stride, bpp, x, y, width, height, xor)) #endif { switch (bpp) { case 8: pixman_fill8 (bits, stride, x, y, width, height, xor); break; case 16: pixman_fill16 (bits, stride, x, y, width, height, xor); break; case 32: pixman_fill32 (bits, stride, x, y, width, height, xor); break; default: return FALSE; break; } } return TRUE; } /* * Compute the smallest value no less than y which is on a * grid row */ pixman_fixed_t pixman_sample_ceil_y (pixman_fixed_t y, int n) { pixman_fixed_t f = pixman_fixed_frac(y); pixman_fixed_t i = pixman_fixed_floor(y); f = ((f + Y_FRAC_FIRST(n)) / STEP_Y_SMALL(n)) * STEP_Y_SMALL(n) + Y_FRAC_FIRST(n); if (f > Y_FRAC_LAST(n)) { f = Y_FRAC_FIRST(n); i += pixman_fixed_1; } return (i | f); } #define _div(a,b) ((a) >= 0 ? (a) / (b) : -((-(a) + (b) - 1) / (b))) /* * Compute the largest value no greater than y which is on a * grid row */ pixman_fixed_t pixman_sample_floor_y (pixman_fixed_t y, int n) { pixman_fixed_t f = pixman_fixed_frac(y); pixman_fixed_t i = pixman_fixed_floor (y); f = _div(f - Y_FRAC_FIRST(n), STEP_Y_SMALL(n)) * STEP_Y_SMALL(n) + Y_FRAC_FIRST(n); if (f < Y_FRAC_FIRST(n)) { f = Y_FRAC_LAST(n); i -= pixman_fixed_1; } return (i | f); } /* * Step an edge by any amount (including negative values) */ void pixman_edge_step (pixman_edge_t *e, int n) { pixman_fixed_48_16_t ne; e->x += n * e->stepx; ne = e->e + n * (pixman_fixed_48_16_t) e->dx; if (n >= 0) { if (ne > 0) { int nx = (ne + e->dy - 1) / e->dy; e->e = ne - nx * (pixman_fixed_48_16_t) e->dy; e->x += nx * e->signdx; } } else { if (ne <= -e->dy) { int nx = (-ne) / e->dy; e->e = ne + nx * (pixman_fixed_48_16_t) e->dy; e->x -= nx * e->signdx; } } } /* * A private routine to initialize the multi-step * elements of an edge structure */ static void _pixman_edge_tMultiInit (pixman_edge_t *e, int n, pixman_fixed_t *stepx_p, pixman_fixed_t *dx_p) { pixman_fixed_t stepx; pixman_fixed_48_16_t ne; ne = n * (pixman_fixed_48_16_t) e->dx; stepx = n * e->stepx; if (ne > 0) { int nx = ne / e->dy; ne -= nx * e->dy; stepx += nx * e->signdx; } *dx_p = ne; *stepx_p = stepx; } /* * Initialize one edge structure given the line endpoints and a * starting y value */ void pixman_edge_init (pixman_edge_t *e, int n, pixman_fixed_t y_start, pixman_fixed_t x_top, pixman_fixed_t y_top, pixman_fixed_t x_bot, pixman_fixed_t y_bot) { pixman_fixed_t dx, dy; e->x = x_top; e->e = 0; dx = x_bot - x_top; dy = y_bot - y_top; e->dy = dy; e->dx = 0; if (dy) { if (dx >= 0) { e->signdx = 1; e->stepx = dx / dy; e->dx = dx % dy; e->e = -dy; } else { e->signdx = -1; e->stepx = -(-dx / dy); e->dx = -dx % dy; e->e = 0; } _pixman_edge_tMultiInit (e, STEP_Y_SMALL(n), &e->stepx_small, &e->dx_small); _pixman_edge_tMultiInit (e, STEP_Y_BIG(n), &e->stepx_big, &e->dx_big); } pixman_edge_step (e, y_start - y_top); } /* * Initialize one edge structure given a line, starting y value * and a pixel offset for the line */ void pixman_line_fixed_edge_init (pixman_edge_t *e, int n, pixman_fixed_t y, const pixman_line_fixed_t *line, int x_off, int y_off) { pixman_fixed_t x_off_fixed = pixman_int_to_fixed(x_off); pixman_fixed_t y_off_fixed = pixman_int_to_fixed(y_off); const pixman_point_fixed_t *top, *bot; if (line->p1.y <= line->p2.y) { top = &line->p1; bot = &line->p2; } else { top = &line->p2; bot = &line->p1; } pixman_edge_init (e, n, y, top->x + x_off_fixed, top->y + y_off_fixed, bot->x + x_off_fixed, bot->y + y_off_fixed); } pixman_bool_t pixman_multiply_overflows_int (unsigned int a, unsigned int b) { return a >= INT32_MAX / b; } pixman_bool_t pixman_addition_overflows_int (unsigned int a, unsigned int b) { return a > INT32_MAX - b; } void * pixman_malloc_ab(unsigned int a, unsigned int b) { if (a >= INT32_MAX / b) return NULL; return malloc (a * b); } void * pixman_malloc_abc (unsigned int a, unsigned int b, unsigned int c) { if (a >= INT32_MAX / b) return NULL; else if (a * b >= INT32_MAX / c) return NULL; else return malloc (a * b * c); } /** * pixman_version: * * Returns the version of the pixman library encoded in a single * integer as per %PIXMAN_VERSION_ENCODE. The encoding ensures that * later versions compare greater than earlier versions. * * A run-time comparison to check that pixman's version is greater than * or equal to version X.Y.Z could be performed as follows: * * * if (pixman_version() >= PIXMAN_VERSION_ENCODE(X,Y,Z)) {...} * * * See also pixman_version_string() as well as the compile-time * equivalents %PIXMAN_VERSION and %PIXMAN_VERSION_STRING. * * Return value: the encoded version. **/ int pixman_version (void) { return PIXMAN_VERSION; } /** * pixman_version_string: * * Returns the version of the pixman library as a human-readable string * of the form "X.Y.Z". * * See also pixman_version() as well as the compile-time equivalents * %PIXMAN_VERSION_STRING and %PIXMAN_VERSION. * * Return value: a string containing the version. **/ const char* pixman_version_string (void) { return PIXMAN_VERSION_STRING; } /** * pixman_format_supported_destination: * @format: A pixman_format_code_t format * * Return value: whether the provided format code is a supported * format for a pixman surface used as a destination in * rendering. * * Currently, all pixman_format_code_t values are supported * except for the YUV formats. **/ pixman_bool_t pixman_format_supported_destination (pixman_format_code_t format) { switch (format) { /* 32 bpp formats */ case PIXMAN_a8r8g8b8: case PIXMAN_x8r8g8b8: case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_r5g6b5: case PIXMAN_b5g6r5: /* 16 bpp formats */ case PIXMAN_a1r5g5b5: case PIXMAN_x1r5g5b5: case PIXMAN_a1b5g5r5: case PIXMAN_x1b5g5r5: case PIXMAN_a4r4g4b4: case PIXMAN_x4r4g4b4: case PIXMAN_a4b4g4r4: case PIXMAN_x4b4g4r4: /* 8bpp formats */ case PIXMAN_a8: case PIXMAN_r3g3b2: case PIXMAN_b2g3r3: case PIXMAN_a2r2g2b2: case PIXMAN_a2b2g2r2: case PIXMAN_c8: case PIXMAN_g8: case PIXMAN_x4a4: /* Collides with PIXMAN_c8 case PIXMAN_x4c4: */ /* Collides with PIXMAN_g8 case PIXMAN_x4g4: */ /* 4bpp formats */ case PIXMAN_a4: case PIXMAN_r1g2b1: case PIXMAN_b1g2r1: case PIXMAN_a1r1g1b1: case PIXMAN_a1b1g1r1: case PIXMAN_c4: case PIXMAN_g4: /* 1bpp formats */ case PIXMAN_a1: case PIXMAN_g1: return TRUE; /* YUV formats */ case PIXMAN_yuy2: case PIXMAN_yv12: default: return FALSE; } } /** * pixman_format_supported_source: * @format: A pixman_format_code_t format * * Return value: whether the provided format code is a supported * format for a pixman surface used as a source in * rendering. * * Currently, all pixman_format_code_t values are supported. **/ pixman_bool_t pixman_format_supported_source (pixman_format_code_t format) { switch (format) { /* 32 bpp formats */ case PIXMAN_a8r8g8b8: case PIXMAN_x8r8g8b8: case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_r5g6b5: case PIXMAN_b5g6r5: /* 16 bpp formats */ case PIXMAN_a1r5g5b5: case PIXMAN_x1r5g5b5: case PIXMAN_a1b5g5r5: case PIXMAN_x1b5g5r5: case PIXMAN_a4r4g4b4: case PIXMAN_x4r4g4b4: case PIXMAN_a4b4g4r4: case PIXMAN_x4b4g4r4: /* 8bpp formats */ case PIXMAN_a8: case PIXMAN_r3g3b2: case PIXMAN_b2g3r3: case PIXMAN_a2r2g2b2: case PIXMAN_a2b2g2r2: case PIXMAN_c8: case PIXMAN_g8: case PIXMAN_x4a4: /* Collides with PIXMAN_c8 case PIXMAN_x4c4: */ /* Collides with PIXMAN_g8 case PIXMAN_x4g4: */ /* 4bpp formats */ case PIXMAN_a4: case PIXMAN_r1g2b1: case PIXMAN_b1g2r1: case PIXMAN_a1r1g1b1: case PIXMAN_a1b1g1r1: case PIXMAN_c4: case PIXMAN_g4: /* 1bpp formats */ case PIXMAN_a1: case PIXMAN_g1: /* YUV formats */ case PIXMAN_yuy2: case PIXMAN_yv12: return TRUE; default: return FALSE; } } libgdiplus-2.11/pixman/pixman/pixman-mmx.c0000664000175000017500000017431612225470167015567 00000000000000/* * Copyright © 2004, 2005 Red Hat, Inc. * Copyright © 2004 Nicholas Miell * Copyright © 2005 Trolltech AS * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Red Hat not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Red Hat makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Søren Sandmann (sandmann@redhat.com) * Minor Improvements: Nicholas Miell (nmiell@gmail.com) * MMX code paths for fbcompose.c by Lars Knoll (lars@trolltech.com) * * Based on work by Owen Taylor */ #ifdef HAVE_CONFIG_H #include #endif #ifdef USE_MMX #include #ifdef USE_SSE #include /* for _mm_shuffle_pi16 and _MM_SHUFFLE */ #endif #include "pixman-mmx.h" #undef READ #undef WRITE #define READ(img,x) *(x) #define WRITE(img,ptr,v) (*(ptr) = (v)); #define noVERBOSE #ifdef VERBOSE #define CHECKPOINT() ErrorF ("at %s %d\n", __FUNCTION__, __LINE__) #else #define CHECKPOINT() #endif /* Notes about writing mmx code * * give memory operands as the second operand. If you give it as the * first, gcc will first load it into a register, then use that * register * * ie. use * * _mm_mullo_pi16 (x, mmx_constant); * * not * * _mm_mullo_pi16 (mmx_constant, x); * * Also try to minimize dependencies. i.e. when you need a value, try * to calculate it from a value that was calculated as early as * possible. */ /* --------------- MMX primitivess ------------------------------------ */ #ifdef __GNUC__ typedef unsigned long long ullong; typedef ullong mmxdatafield; #endif #ifdef _MSC_VER typedef unsigned __int64 ullong; typedef __m64 mmxdatafield; #endif typedef struct { mmxdatafield mmx_4x00ff; mmxdatafield mmx_4x0080; mmxdatafield mmx_565_rgb; mmxdatafield mmx_565_unpack_multiplier; mmxdatafield mmx_565_r; mmxdatafield mmx_565_g; mmxdatafield mmx_565_b; mmxdatafield mmx_mask_0; mmxdatafield mmx_mask_1; mmxdatafield mmx_mask_2; mmxdatafield mmx_mask_3; mmxdatafield mmx_full_alpha; mmxdatafield mmx_ffff0000ffff0000; mmxdatafield mmx_0000ffff00000000; mmxdatafield mmx_000000000000ffff; } MMXData; static const MMXData c = { #ifdef __GNUC__ .mmx_4x00ff = 0x00ff00ff00ff00ffULL, .mmx_4x0080 = 0x0080008000800080ULL, .mmx_565_rgb = 0x000001f0003f001fULL, .mmx_565_unpack_multiplier = 0x0000008404100840ULL, .mmx_565_r = 0x000000f800000000ULL, .mmx_565_g = 0x0000000000fc0000ULL, .mmx_565_b = 0x00000000000000f8ULL, .mmx_mask_0 = 0xffffffffffff0000ULL, .mmx_mask_1 = 0xffffffff0000ffffULL, .mmx_mask_2 = 0xffff0000ffffffffULL, .mmx_mask_3 = 0x0000ffffffffffffULL, .mmx_full_alpha = 0x00ff000000000000ULL, .mmx_ffff0000ffff0000 = 0xffff0000ffff0000ULL, .mmx_0000ffff00000000 = 0x0000ffff00000000ULL, .mmx_000000000000ffff = 0x000000000000ffffULL, #endif #ifdef _MSC_VER { 0x00ff00ff00ff00ffUI64 }, { 0x0080008000800080UI64 }, { 0x000001f0003f001fUI64 }, { 0x0000008404100840UI64 }, { 0x000000f800000000UI64 }, { 0x0000000000fc0000UI64 }, { 0x00000000000000f8UI64 }, { 0xffffffffffff0000UI64 }, { 0xffffffff0000ffffUI64 }, { 0xffff0000ffffffffUI64 }, { 0x0000ffffffffffffUI64 }, { 0x00ff000000000000UI64 }, { 0xffff0000ffff0000UI64 }, { 0x0000ffff00000000UI64 }, { 0x000000000000ffffUI64 }, #endif }; #ifdef _MSC_VER #undef inline #define inline __forceinline #endif #ifdef __GNUC__ #define MC(x) ((__m64) c.mmx_##x) #endif #ifdef _MSC_VER #define MC(x) c.mmx_##x #endif static inline __m64 M64 (ullong x) { #ifdef __GNUC__ return (__m64)x; #endif #ifdef _MSC_VER __m64 res; res.m64_u64 = x; return res; #endif } static inline ullong ULLONG (__m64 x) { #ifdef __GNUC__ return (ullong)x; #endif #ifdef _MSC_VER ullong res; res = x.m64_u64; return res; #endif } static inline __m64 shift (__m64 v, int s) { if (s > 0) return _mm_slli_si64 (v, s); else if (s < 0) return _mm_srli_si64 (v, -s); else return v; } static inline __m64 negate (__m64 mask) { return _mm_xor_si64 (mask, MC(4x00ff)); } static inline __m64 pix_multiply (__m64 a, __m64 b) { __m64 res; res = _mm_mullo_pi16 (a, b); res = _mm_adds_pu16 (res, MC(4x0080)); res = _mm_adds_pu16 (res, _mm_srli_pi16 (res, 8)); res = _mm_srli_pi16 (res, 8); return res; } static inline __m64 pix_add (__m64 a, __m64 b) { return _mm_adds_pu8 (a, b); } #ifdef USE_SSE static inline __m64 expand_alpha (__m64 pixel) { return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(3, 3, 3, 3)); } static inline __m64 expand_alpha_rev (__m64 pixel) { return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(0, 0, 0, 0)); } static inline __m64 invert_colors (__m64 pixel) { return _mm_shuffle_pi16 (pixel, _MM_SHUFFLE(3, 0, 1, 2)); } #else static inline __m64 expand_alpha (__m64 pixel) { __m64 t1, t2; t1 = shift (pixel, -48); t2 = shift (t1, 16); t1 = _mm_or_si64 (t1, t2); t2 = shift (t1, 32); t1 = _mm_or_si64 (t1, t2); return t1; } static inline __m64 expand_alpha_rev (__m64 pixel) { __m64 t1, t2; /* move alpha to low 16 bits and zero the rest */ t1 = shift (pixel, 48); t1 = shift (t1, -48); t2 = shift (t1, 16); t1 = _mm_or_si64 (t1, t2); t2 = shift (t1, 32); t1 = _mm_or_si64 (t1, t2); return t1; } static inline __m64 invert_colors (__m64 pixel) { __m64 x, y, z; x = y = z = pixel; x = _mm_and_si64 (x, MC(ffff0000ffff0000)); y = _mm_and_si64 (y, MC(000000000000ffff)); z = _mm_and_si64 (z, MC(0000ffff00000000)); y = shift (y, 32); z = shift (z, -32); x = _mm_or_si64 (x, y); x = _mm_or_si64 (x, z); return x; } #endif static inline __m64 over (__m64 src, __m64 srca, __m64 dest) { return _mm_adds_pu8 (src, pix_multiply(dest, negate(srca))); } static inline __m64 over_rev_non_pre (__m64 src, __m64 dest) { __m64 srca = expand_alpha (src); __m64 srcfaaa = _mm_or_si64 (srca, MC(full_alpha)); return over(pix_multiply(invert_colors(src), srcfaaa), srca, dest); } static inline __m64 in (__m64 src, __m64 mask) { return pix_multiply (src, mask); } static inline __m64 in_over_full_src_alpha (__m64 src, __m64 mask, __m64 dest) { src = _mm_or_si64 (src, MC(full_alpha)); return over(in (src, mask), mask, dest); } #ifndef _MSC_VER static inline __m64 in_over (__m64 src, __m64 srca, __m64 mask, __m64 dest) { return over(in(src, mask), pix_multiply(srca, mask), dest); } #else #define in_over(src, srca, mask, dest) over(in(src, mask), pix_multiply(srca, mask), dest) #endif static inline __m64 load8888 (uint32_t v) { return _mm_unpacklo_pi8 (_mm_cvtsi32_si64 (v), _mm_setzero_si64()); } static inline __m64 pack8888 (__m64 lo, __m64 hi) { return _mm_packs_pu16 (lo, hi); } static inline uint32_t store8888 (__m64 v) { return _mm_cvtsi64_si32(pack8888(v, _mm_setzero_si64())); } /* Expand 16 bits positioned at @pos (0-3) of a mmx register into * * 00RR00GG00BB * * --- Expanding 565 in the low word --- * * m = (m << (32 - 3)) | (m << (16 - 5)) | m; * m = m & (01f0003f001f); * m = m * (008404100840); * m = m >> 8; * * Note the trick here - the top word is shifted by another nibble to * avoid it bumping into the middle word */ static inline __m64 expand565 (__m64 pixel, int pos) { __m64 p = pixel; __m64 t1, t2; /* move pixel to low 16 bit and zero the rest */ p = shift (shift (p, (3 - pos) * 16), -48); t1 = shift (p, 36 - 11); t2 = shift (p, 16 - 5); p = _mm_or_si64 (t1, p); p = _mm_or_si64 (t2, p); p = _mm_and_si64 (p, MC(565_rgb)); pixel = _mm_mullo_pi16 (p, MC(565_unpack_multiplier)); return _mm_srli_pi16 (pixel, 8); } static inline __m64 expand8888 (__m64 in, int pos) { if (pos == 0) return _mm_unpacklo_pi8 (in, _mm_setzero_si64()); else return _mm_unpackhi_pi8 (in, _mm_setzero_si64()); } static inline __m64 pack565 (__m64 pixel, __m64 target, int pos) { __m64 p = pixel; __m64 t = target; __m64 r, g, b; r = _mm_and_si64 (p, MC(565_r)); g = _mm_and_si64 (p, MC(565_g)); b = _mm_and_si64 (p, MC(565_b)); r = shift (r, - (32 - 8) + pos * 16); g = shift (g, - (16 - 3) + pos * 16); b = shift (b, - (0 + 3) + pos * 16); if (pos == 0) t = _mm_and_si64 (t, MC(mask_0)); else if (pos == 1) t = _mm_and_si64 (t, MC(mask_1)); else if (pos == 2) t = _mm_and_si64 (t, MC(mask_2)); else if (pos == 3) t = _mm_and_si64 (t, MC(mask_3)); p = _mm_or_si64 (r, t); p = _mm_or_si64 (g, p); return _mm_or_si64 (b, p); } #ifndef _MSC_VER static inline __m64 pix_add_mul (__m64 x, __m64 a, __m64 y, __m64 b) { x = _mm_mullo_pi16 (x, a); y = _mm_mullo_pi16 (y, b); x = _mm_adds_pu16 (x, MC(4x0080)); x = _mm_adds_pu16 (x, y); x = _mm_adds_pu16 (x, _mm_srli_pi16 (x, 8)); x = _mm_srli_pi16 (x, 8); return x; } #else #define pix_add_mul(x, a, y, b) \ ( x = _mm_mullo_pi16 (x, a), \ y = _mm_mullo_pi16 (y, b), \ x = _mm_adds_pu16 (x, MC(4x0080)), \ x = _mm_adds_pu16 (x, y), \ x = _mm_adds_pu16 (x, _mm_srli_pi16 (x, 8)), \ _mm_srli_pi16 (x, 8) ) #endif /* --------------- MMX code patch for fbcompose.c --------------------- */ static FASTCALL void mmxCombineMaskU (uint32_t *src, const uint32_t *mask, int width) { const uint32_t *end = mask + width; while (mask < end) { uint32_t mmask = *mask; uint32_t maska = mmask >> 24; if (maska == 0) { *src = 0; } else if (maska != 0xff) { __m64 a = load8888(mmask); __m64 s = load8888(*src); a = expand_alpha(a); s = pix_multiply(s, a); *src = store8888(s); } ++src; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineOverU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { uint32_t ssrc = *src; uint32_t a = ssrc >> 24; if (a == 0xff) { *dest = ssrc; } else if (a) { __m64 s, sa; s = load8888(ssrc); sa = expand_alpha(s); *dest = store8888(over(s, sa, load8888(*dest))); } ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineOverReverseU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 d, da; d = load8888(*dest); da = expand_alpha(d); *dest = store8888(over (d, da, load8888(*src))); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineInU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 x, a; x = load8888(*src); a = load8888(*dest); a = expand_alpha(a); x = pix_multiply(x, a); *dest = store8888(x); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineInReverseU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 x, a; x = load8888(*dest); a = load8888(*src); a = expand_alpha(a); x = pix_multiply(x, a); *dest = store8888(x); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineOutU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 x, a; x = load8888(*src); a = load8888(*dest); a = expand_alpha(a); a = negate(a); x = pix_multiply(x, a); *dest = store8888(x); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineOutReverseU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 x, a; x = load8888(*dest); a = load8888(*src); a = expand_alpha(a); a = negate(a); x = pix_multiply(x, a); *dest = store8888(x); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineAtopU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 s, da, d, sia; s = load8888(*src); d = load8888(*dest); sia = expand_alpha(s); sia = negate(sia); da = expand_alpha(d); s = pix_add_mul (s, da, d, sia); *dest = store8888(s); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineAtopReverseU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end; end = dest + width; while (dest < end) { __m64 s, dia, d, sa; s = load8888(*src); d = load8888(*dest); sa = expand_alpha(s); dia = expand_alpha(d); dia = negate(dia); s = pix_add_mul (s, dia, d, sa); *dest = store8888(s); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineXorU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 s, dia, d, sia; s = load8888(*src); d = load8888(*dest); sia = expand_alpha(s); dia = expand_alpha(d); sia = negate(sia); dia = negate(dia); s = pix_add_mul (s, dia, d, sia); *dest = store8888(s); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineAddU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { __m64 s, d; s = load8888(*src); d = load8888(*dest); s = pix_add(s, d); *dest = store8888(s); ++dest; ++src; } _mm_empty(); } static FASTCALL void mmxCombineSaturateU (uint32_t *dest, const uint32_t *src, int width) { const uint32_t *end = dest + width; while (dest < end) { uint32_t s = *src; uint32_t d = *dest; __m64 ms = load8888(s); __m64 md = load8888(d); uint32_t sa = s >> 24; uint32_t da = ~d >> 24; if (sa > da) { __m64 msa = load8888(FbIntDiv(da, sa) << 24); msa = expand_alpha(msa); ms = pix_multiply(ms, msa); } md = pix_add(md, ms); *dest = store8888(md); ++src; ++dest; } _mm_empty(); } static FASTCALL void mmxCombineSrcC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); s = pix_multiply(s, a); *dest = store8888(s); ++src; ++mask; ++dest; } _mm_empty(); } static FASTCALL void mmxCombineOverC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); *dest = store8888(in_over (s, sa, a, d)); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineOverReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); *dest = store8888(over (d, da, in (s, a))); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineInC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineInReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineOutC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); da = negate(da); s = pix_multiply(s, a); s = pix_multiply(s, da); *dest = store8888(s); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineOutReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 sa = expand_alpha(s); a = pix_multiply(a, sa); a = negate(a); d = pix_multiply(d, a); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineAtopC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineAtopReverseC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineXorC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); __m64 da = expand_alpha(d); __m64 sa = expand_alpha(s); s = pix_multiply(s, a); a = pix_multiply(a, sa); da = negate(da); a = negate(a); d = pix_add_mul (d, a, s, da); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } static FASTCALL void mmxCombineAddC (uint32_t *dest, uint32_t *src, uint32_t *mask, int width) { const uint32_t *end = src + width; while (src < end) { __m64 a = load8888(*mask); __m64 s = load8888(*src); __m64 d = load8888(*dest); s = pix_multiply(s, a); d = pix_add(s, d); *dest = store8888(d); ++src; ++dest; ++mask; } _mm_empty(); } void fbComposeSetupMMX(void) { static pixman_bool_t initialized = FALSE; if (initialized) return; /* check if we have MMX support and initialize accordingly */ if (pixman_have_mmx()) { pixman_composeFunctions.combineU[PIXMAN_OP_OVER] = mmxCombineOverU; pixman_composeFunctions.combineU[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_IN] = mmxCombineInU; pixman_composeFunctions.combineU[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_OUT] = mmxCombineOutU; pixman_composeFunctions.combineU[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_ATOP] = mmxCombineAtopU; pixman_composeFunctions.combineU[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseU; pixman_composeFunctions.combineU[PIXMAN_OP_XOR] = mmxCombineXorU; pixman_composeFunctions.combineU[PIXMAN_OP_ADD] = mmxCombineAddU; pixman_composeFunctions.combineU[PIXMAN_OP_SATURATE] = mmxCombineSaturateU; pixman_composeFunctions.combineC[PIXMAN_OP_SRC] = mmxCombineSrcC; pixman_composeFunctions.combineC[PIXMAN_OP_OVER] = mmxCombineOverC; pixman_composeFunctions.combineC[PIXMAN_OP_OVER_REVERSE] = mmxCombineOverReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_IN] = mmxCombineInC; pixman_composeFunctions.combineC[PIXMAN_OP_IN_REVERSE] = mmxCombineInReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_OUT] = mmxCombineOutC; pixman_composeFunctions.combineC[PIXMAN_OP_OUT_REVERSE] = mmxCombineOutReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_ATOP] = mmxCombineAtopC; pixman_composeFunctions.combineC[PIXMAN_OP_ATOP_REVERSE] = mmxCombineAtopReverseC; pixman_composeFunctions.combineC[PIXMAN_OP_XOR] = mmxCombineXorC; pixman_composeFunctions.combineC[PIXMAN_OP_ADD] = mmxCombineAddC; pixman_composeFunctions.combineMaskU = mmxCombineMaskU; } initialized = TRUE; } /* ------------------ MMX code paths called from fbpict.c ----------------------- */ void fbCompositeSolid_nx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src; uint32_t *dstLine, *dst; uint16_t w; int dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } while (w >= 2) { __m64 vdest; __m64 dest0, dest1; vdest = *(__m64 *)dst; dest0 = over(vsrc, vsrca, expand8888(vdest, 0)); dest1 = over(vsrc, vsrca, expand8888(vdest, 1)); *(__m64 *)dst = pack8888(dest0, dest1); dst += 2; w -= 2; } CHECKPOINT(); while (w) { *dst = store8888(over(vsrc, vsrca, load8888(*dst))); w--; dst++; } } _mm_empty(); } void fbCompositeSolid_nx0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src; uint16_t *dstLine, *dst; uint16_t w; int dstStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); if (src >> 24 == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; } while (w >= 4) { __m64 vdest; vdest = *(__m64 *)dst; vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 0)), vdest, 0); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 1)), vdest, 1); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 2)), vdest, 2); vdest = pack565 (over(vsrc, vsrca, expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; dst += 4; w -= 4; } CHECKPOINT(); while (w) { ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, vsrca, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; } } _mm_empty(); } void fbCompositeSolidMask_nx8888x8888Cmmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint32_t *dstLine; uint32_t *maskLine; int dstStride, maskStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1); vsrc = load8888(src); vsrca = expand_alpha(vsrc); while (height--) { int twidth = width; uint32_t *p = (uint32_t *)maskLine; uint32_t *q = (uint32_t *)dstLine; while (twidth && (unsigned long)q & 7) { uint32_t m = *(uint32_t *)p; if (m) { __m64 vdest = load8888(*q); vdest = in_over(vsrc, vsrca, load8888(m), vdest); *q = store8888(vdest); } twidth--; p++; q++; } while (twidth >= 2) { uint32_t m0, m1; m0 = *p; m1 = *(p + 1); if (m0 | m1) { __m64 dest0, dest1; __m64 vdest = *(__m64 *)q; dest0 = in_over(vsrc, vsrca, load8888(m0), expand8888 (vdest, 0)); dest1 = in_over(vsrc, vsrca, load8888(m1), expand8888 (vdest, 1)); *(__m64 *)q = pack8888(dest0, dest1); } p += 2; q += 2; twidth -= 2; } while (twidth) { uint32_t m = *(uint32_t *)p; if (m) { __m64 vdest = load8888(*q); vdest = in_over(vsrc, vsrca, load8888(m), vdest); *q = store8888(vdest); } twidth--; p++; q++; } dstLine += dstStride; maskLine += maskStride; } _mm_empty(); } void fbCompositeSrc_8888x8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst; uint32_t *srcLine, *src; uint32_t mask; __m64 vmask; int dstStride, srcStride; uint16_t w; __m64 srca; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); fbComposeGetSolid (pMask, mask, pDst->bits.format); mask = mask | mask >> 8 | mask >> 16 | mask >> 24; vmask = load8888 (mask); srca = MC(4x00ff); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (in_over (s, expand_alpha (s), vmask, d)); w--; dst++; src++; } while (w >= 2) { __m64 vs = *(__m64 *)src; __m64 vd = *(__m64 *)dst; __m64 vsrc0 = expand8888 (vs, 0); __m64 vsrc1 = expand8888 (vs, 1); *(__m64 *)dst = pack8888 ( in_over (vsrc0, expand_alpha (vsrc0), vmask, expand8888 (vd, 0)), in_over (vsrc1, expand_alpha (vsrc1), vmask, expand8888 (vd, 1))); w -= 2; dst += 2; src += 2; } while (w) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (in_over (s, expand_alpha (s), vmask, d)); w--; dst++; src++; } } _mm_empty(); } void fbCompositeSrc_x888xnx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst; uint32_t *srcLine, *src; uint32_t mask; __m64 vmask; int dstStride, srcStride; uint16_t w; __m64 srca; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); fbComposeGetSolid (pMask, mask, pDst->bits.format); mask = mask | mask >> 8 | mask >> 16 | mask >> 24; vmask = load8888 (mask); srca = MC(4x00ff); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { __m64 s = load8888 (*src | 0xff000000); __m64 d = load8888 (*dst); *dst = store8888 (in_over (s, srca, vmask, d)); w--; dst++; src++; } while (w >= 16) { __m64 vd0 = *(__m64 *)(dst + 0); __m64 vd1 = *(__m64 *)(dst + 2); __m64 vd2 = *(__m64 *)(dst + 4); __m64 vd3 = *(__m64 *)(dst + 6); __m64 vd4 = *(__m64 *)(dst + 8); __m64 vd5 = *(__m64 *)(dst + 10); __m64 vd6 = *(__m64 *)(dst + 12); __m64 vd7 = *(__m64 *)(dst + 14); __m64 vs0 = *(__m64 *)(src + 0); __m64 vs1 = *(__m64 *)(src + 2); __m64 vs2 = *(__m64 *)(src + 4); __m64 vs3 = *(__m64 *)(src + 6); __m64 vs4 = *(__m64 *)(src + 8); __m64 vs5 = *(__m64 *)(src + 10); __m64 vs6 = *(__m64 *)(src + 12); __m64 vs7 = *(__m64 *)(src + 14); vd0 = pack8888 ( in_over (expand8888 (vs0, 0), srca, vmask, expand8888 (vd0, 0)), in_over (expand8888 (vs0, 1), srca, vmask, expand8888 (vd0, 1))); vd1 = pack8888 ( in_over (expand8888 (vs1, 0), srca, vmask, expand8888 (vd1, 0)), in_over (expand8888 (vs1, 1), srca, vmask, expand8888 (vd1, 1))); vd2 = pack8888 ( in_over (expand8888 (vs2, 0), srca, vmask, expand8888 (vd2, 0)), in_over (expand8888 (vs2, 1), srca, vmask, expand8888 (vd2, 1))); vd3 = pack8888 ( in_over (expand8888 (vs3, 0), srca, vmask, expand8888 (vd3, 0)), in_over (expand8888 (vs3, 1), srca, vmask, expand8888 (vd3, 1))); vd4 = pack8888 ( in_over (expand8888 (vs4, 0), srca, vmask, expand8888 (vd4, 0)), in_over (expand8888 (vs4, 1), srca, vmask, expand8888 (vd4, 1))); vd5 = pack8888 ( in_over (expand8888 (vs5, 0), srca, vmask, expand8888 (vd5, 0)), in_over (expand8888 (vs5, 1), srca, vmask, expand8888 (vd5, 1))); vd6 = pack8888 ( in_over (expand8888 (vs6, 0), srca, vmask, expand8888 (vd6, 0)), in_over (expand8888 (vs6, 1), srca, vmask, expand8888 (vd6, 1))); vd7 = pack8888 ( in_over (expand8888 (vs7, 0), srca, vmask, expand8888 (vd7, 0)), in_over (expand8888 (vs7, 1), srca, vmask, expand8888 (vd7, 1))); *(__m64 *)(dst + 0) = vd0; *(__m64 *)(dst + 2) = vd1; *(__m64 *)(dst + 4) = vd2; *(__m64 *)(dst + 6) = vd3; *(__m64 *)(dst + 8) = vd4; *(__m64 *)(dst + 10) = vd5; *(__m64 *)(dst + 12) = vd6; *(__m64 *)(dst + 14) = vd7; w -= 16; dst += 16; src += 16; } while (w) { __m64 s = load8888 (*src | 0xff000000); __m64 d = load8888 (*dst); *dst = store8888 (in_over (s, srca, vmask, d)); w--; dst++; src++; } } _mm_empty(); } void fbCompositeSrc_8888x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst; uint32_t *srcLine, *src; uint32_t s; int dstStride, srcStride; uint8_t a; uint16_t w; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w--) { s = *src++; a = s >> 24; if (a == 0xff) *dst = s; else if (a) { __m64 ms, sa; ms = load8888(s); sa = expand_alpha(ms); *dst = store8888(over(ms, sa, load8888(*dst))); } dst++; } } _mm_empty(); } void fbCompositeSrc_8888x0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint16_t *dstLine, *dst; uint32_t *srcLine, *src; int dstStride, srcStride; uint16_t w; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); #if 0 /* FIXME */ assert (pSrc->pDrawable == pMask->pDrawable); #endif while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { __m64 vsrc = load8888 (*src); ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; src++; } CHECKPOINT(); while (w >= 4) { __m64 vsrc0, vsrc1, vsrc2, vsrc3; __m64 vdest; vsrc0 = load8888(*(src + 0)); vsrc1 = load8888(*(src + 1)); vsrc2 = load8888(*(src + 2)); vsrc3 = load8888(*(src + 3)); vdest = *(__m64 *)dst; vdest = pack565(over(vsrc0, expand_alpha(vsrc0), expand565(vdest, 0)), vdest, 0); vdest = pack565(over(vsrc1, expand_alpha(vsrc1), expand565(vdest, 1)), vdest, 1); vdest = pack565(over(vsrc2, expand_alpha(vsrc2), expand565(vdest, 2)), vdest, 2); vdest = pack565(over(vsrc3, expand_alpha(vsrc3), expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; w -= 4; dst += 4; src += 4; } CHECKPOINT(); while (w) { __m64 vsrc = load8888 (*src); ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over(vsrc, expand_alpha(vsrc), vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; src++; } } _mm_empty(); } void fbCompositeSolidMask_nx8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint32_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; __m64 vsrc, vsrca; ullong srcsrc; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) return; srcsrc = (ullong)src << 32 | src; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong m = *mask; if (m) { __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), load8888(*dst)); *dst = store8888(vdest); } w--; mask++; dst++; } CHECKPOINT(); while (w >= 2) { ullong m0, m1; m0 = *mask; m1 = *(mask + 1); if (srca == 0xff && (m0 & m1) == 0xff) { *(ullong *)dst = srcsrc; } else if (m0 | m1) { __m64 vdest; __m64 dest0, dest1; vdest = *(__m64 *)dst; dest0 = in_over(vsrc, vsrca, expand_alpha_rev (M64(m0)), expand8888(vdest, 0)); dest1 = in_over(vsrc, vsrca, expand_alpha_rev (M64(m1)), expand8888(vdest, 1)); *(__m64 *)dst = pack8888(dest0, dest1); } mask += 2; dst += 2; w -= 2; } CHECKPOINT(); while (w) { ullong m = *mask; if (m) { __m64 vdest = load8888(*dst); vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), vdest); *dst = store8888(vdest); } w--; mask++; dst++; } } _mm_empty(); } pixman_bool_t pixman_fill_mmx (uint32_t *bits, int stride, int bpp, int x, int y, int width, int height, uint32_t xor) { ullong fill; __m64 vfill; uint32_t byte_width; uint8_t *byte_line; #ifdef __GNUC__ __m64 v1, v2, v3, v4, v5, v6, v7; #endif if (bpp == 16 && (xor >> 16 != (xor & 0xffff))) return FALSE; if (bpp != 16 && bpp != 32) return FALSE; if (bpp == 16) { stride = stride * (int) sizeof (uint32_t) / 2; byte_line = (uint8_t *)(((uint16_t *)bits) + stride * y + x); byte_width = 2 * width; stride *= 2; } else { stride = stride * (int) sizeof (uint32_t) / 4; byte_line = (uint8_t *)(((uint32_t *)bits) + stride * y + x); byte_width = 4 * width; stride *= 4; } fill = ((ullong)xor << 32) | xor; vfill = M64(fill); #ifdef __GNUC__ __asm__ ( "movq %7, %0\n" "movq %7, %1\n" "movq %7, %2\n" "movq %7, %3\n" "movq %7, %4\n" "movq %7, %5\n" "movq %7, %6\n" : "=y" (v1), "=y" (v2), "=y" (v3), "=y" (v4), "=y" (v5), "=y" (v6), "=y" (v7) : "y" (vfill)); #endif while (height--) { int w; uint8_t *d = byte_line; byte_line += stride; w = byte_width; while (w >= 2 && ((unsigned long)d & 3)) { *(uint16_t *)d = xor; w -= 2; d += 2; } while (w >= 4 && ((unsigned long)d & 7)) { *(uint32_t *)d = xor; w -= 4; d += 4; } while (w >= 64) { #ifdef __GNUC__ __asm__ ( "movq %1, (%0)\n" "movq %2, 8(%0)\n" "movq %3, 16(%0)\n" "movq %4, 24(%0)\n" "movq %5, 32(%0)\n" "movq %6, 40(%0)\n" "movq %7, 48(%0)\n" "movq %8, 56(%0)\n" : : "r" (d), "y" (vfill), "y" (v1), "y" (v2), "y" (v3), "y" (v4), "y" (v5), "y" (v6), "y" (v7) : "memory"); #else *(__m64*) (d + 0) = vfill; *(__m64*) (d + 8) = vfill; *(__m64*) (d + 16) = vfill; *(__m64*) (d + 24) = vfill; *(__m64*) (d + 32) = vfill; *(__m64*) (d + 40) = vfill; *(__m64*) (d + 48) = vfill; *(__m64*) (d + 56) = vfill; #endif w -= 64; d += 64; } while (w >= 4) { *(uint32_t *)d = xor; w -= 4; d += 4; } if (w >= 2) { *(uint16_t *)d = xor; w -= 2; d += 2; } } _mm_empty(); return TRUE; } void fbCompositeSolidMaskSrc_nx8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint32_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; __m64 vsrc, vsrca; ullong srcsrc; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) { pixman_fill_mmx (pDst->bits.bits, pDst->bits.rowstride, PIXMAN_FORMAT_BPP (pDst->bits.format), xDst, yDst, width, height, 0); return; } srcsrc = (ullong)src << 32 | src; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong m = *mask; if (m) { __m64 vdest = in(vsrc, expand_alpha_rev (M64(m))); *dst = store8888(vdest); } else { *dst = 0; } w--; mask++; dst++; } CHECKPOINT(); while (w >= 2) { ullong m0, m1; m0 = *mask; m1 = *(mask + 1); if (srca == 0xff && (m0 & m1) == 0xff) { *(ullong *)dst = srcsrc; } else if (m0 | m1) { __m64 vdest; __m64 dest0, dest1; vdest = *(__m64 *)dst; dest0 = in(vsrc, expand_alpha_rev (M64(m0))); dest1 = in(vsrc, expand_alpha_rev (M64(m1))); *(__m64 *)dst = pack8888(dest0, dest1); } else { *(ullong *)dst = 0; } mask += 2; dst += 2; w -= 2; } CHECKPOINT(); while (w) { ullong m = *mask; if (m) { __m64 vdest = load8888(*dst); vdest = in(vsrc, expand_alpha_rev (M64(m))); *dst = store8888(vdest); } else { *dst = 0; } w--; mask++; dst++; } } _mm_empty(); } void fbCompositeSolidMask_nx8x0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint16_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; __m64 vsrc, vsrca, tmp; ullong srcsrcsrcsrc, src16; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); tmp = pack565(vsrc, _mm_setzero_si64(), 0); src16 = ULLONG(tmp); srcsrcsrcsrc = (ullong)src16 << 48 | (ullong)src16 << 32 | (ullong)src16 << 16 | (ullong)src16; while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { ullong m = *mask; if (m) { ullong d = *dst; __m64 vd = M64(d); __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64 (m)), expand565(vd, 0)); vd = pack565(vdest, _mm_setzero_si64(), 0); *dst = ULLONG(vd); } w--; mask++; dst++; } CHECKPOINT(); while (w >= 4) { ullong m0, m1, m2, m3; m0 = *mask; m1 = *(mask + 1); m2 = *(mask + 2); m3 = *(mask + 3); if (srca == 0xff && (m0 & m1 & m2 & m3) == 0xff) { *(ullong *)dst = srcsrcsrcsrc; } else if (m0 | m1 | m2 | m3) { __m64 vdest; __m64 vm0, vm1, vm2, vm3; vdest = *(__m64 *)dst; vm0 = M64(m0); vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm0), expand565(vdest, 0)), vdest, 0); vm1 = M64(m1); vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm1), expand565(vdest, 1)), vdest, 1); vm2 = M64(m2); vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm2), expand565(vdest, 2)), vdest, 2); vm3 = M64(m3); vdest = pack565(in_over(vsrc, vsrca, expand_alpha_rev(vm3), expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; } w -= 4; mask += 4; dst += 4; } CHECKPOINT(); while (w) { ullong m = *mask; if (m) { ullong d = *dst; __m64 vd = M64(d); __m64 vdest = in_over(vsrc, vsrca, expand_alpha_rev (M64(m)), expand565(vd, 0)); vd = pack565(vdest, _mm_setzero_si64(), 0); *dst = ULLONG(vd); } w--; mask++; dst++; } } _mm_empty(); } void fbCompositeSrc_8888RevNPx0565mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint16_t *dstLine, *dst; uint32_t *srcLine, *src; int dstStride, srcStride; uint16_t w; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); #if 0 /* FIXME */ assert (pSrc->pDrawable == pMask->pDrawable); #endif while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; CHECKPOINT(); while (w && (unsigned long)dst & 7) { __m64 vsrc = load8888 (*src); ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; src++; } CHECKPOINT(); while (w >= 4) { uint32_t s0, s1, s2, s3; unsigned char a0, a1, a2, a3; s0 = *src; s1 = *(src + 1); s2 = *(src + 2); s3 = *(src + 3); a0 = (s0 >> 24); a1 = (s1 >> 24); a2 = (s2 >> 24); a3 = (s3 >> 24); if ((a0 & a1 & a2 & a3) == 0xFF) { __m64 vdest; vdest = pack565(invert_colors(load8888(s0)), _mm_setzero_si64(), 0); vdest = pack565(invert_colors(load8888(s1)), vdest, 1); vdest = pack565(invert_colors(load8888(s2)), vdest, 2); vdest = pack565(invert_colors(load8888(s3)), vdest, 3); *(__m64 *)dst = vdest; } else if (a0 | a1 | a2 | a3) { __m64 vdest = *(__m64 *)dst; vdest = pack565(over_rev_non_pre(load8888(s0), expand565(vdest, 0)), vdest, 0); vdest = pack565(over_rev_non_pre(load8888(s1), expand565(vdest, 1)), vdest, 1); vdest = pack565(over_rev_non_pre(load8888(s2), expand565(vdest, 2)), vdest, 2); vdest = pack565(over_rev_non_pre(load8888(s3), expand565(vdest, 3)), vdest, 3); *(__m64 *)dst = vdest; } w -= 4; dst += 4; src += 4; } CHECKPOINT(); while (w) { __m64 vsrc = load8888 (*src); ullong d = *dst; __m64 vdest = expand565 (M64(d), 0); vdest = pack565(over_rev_non_pre(vsrc, vdest), vdest, 0); *dst = ULLONG(vdest); w--; dst++; src++; } } _mm_empty(); } /* "8888RevNP" is GdkPixbuf's format: ABGR, non premultiplied */ void fbCompositeSrc_8888RevNPx8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *dstLine, *dst; uint32_t *srcLine, *src; int dstStride, srcStride; uint16_t w; CHECKPOINT(); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); #if 0 /* FIXME */ assert (pSrc->pDrawable == pMask->pDrawable); #endif while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (over_rev_non_pre (s, d)); w--; dst++; src++; } while (w >= 2) { ullong s0, s1; unsigned char a0, a1; __m64 d0, d1; s0 = *src; s1 = *(src + 1); a0 = (s0 >> 24); a1 = (s1 >> 24); if ((a0 & a1) == 0xFF) { d0 = invert_colors(load8888(s0)); d1 = invert_colors(load8888(s1)); *(__m64 *)dst = pack8888 (d0, d1); } else if (a0 | a1) { __m64 vdest = *(__m64 *)dst; d0 = over_rev_non_pre (load8888(s0), expand8888 (vdest, 0)); d1 = over_rev_non_pre (load8888(s1), expand8888 (vdest, 1)); *(__m64 *)dst = pack8888 (d0, d1); } w -= 2; dst += 2; src += 2; } while (w) { __m64 s = load8888 (*src); __m64 d = load8888 (*dst); *dst = store8888 (over_rev_non_pre (s, d)); w--; dst++; src++; } } _mm_empty(); } void fbCompositeSolidMask_nx8888x0565Cmmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t src, srca; uint16_t *dstLine; uint32_t *maskLine; int dstStride, maskStride; __m64 vsrc, vsrca; CHECKPOINT(); fbComposeGetSolid(pSrc, src, pDst->bits.format); srca = src >> 24; if (srca == 0) return; fbComposeGetStart (pDst, xDst, yDst, uint16_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint32_t, maskStride, maskLine, 1); vsrc = load8888 (src); vsrca = expand_alpha (vsrc); while (height--) { int twidth = width; uint32_t *p = (uint32_t *)maskLine; uint16_t *q = (uint16_t *)dstLine; while (twidth && ((unsigned long)q & 7)) { uint32_t m = *(uint32_t *)p; if (m) { ullong d = *q; __m64 vdest = expand565 (M64(d), 0); vdest = pack565 (in_over (vsrc, vsrca, load8888 (m), vdest), vdest, 0); *q = ULLONG(vdest); } twidth--; p++; q++; } while (twidth >= 4) { uint32_t m0, m1, m2, m3; m0 = *p; m1 = *(p + 1); m2 = *(p + 2); m3 = *(p + 3); if ((m0 | m1 | m2 | m3)) { __m64 vdest = *(__m64 *)q; vdest = pack565(in_over(vsrc, vsrca, load8888(m0), expand565(vdest, 0)), vdest, 0); vdest = pack565(in_over(vsrc, vsrca, load8888(m1), expand565(vdest, 1)), vdest, 1); vdest = pack565(in_over(vsrc, vsrca, load8888(m2), expand565(vdest, 2)), vdest, 2); vdest = pack565(in_over(vsrc, vsrca, load8888(m3), expand565(vdest, 3)), vdest, 3); *(__m64 *)q = vdest; } twidth -= 4; p += 4; q += 4; } while (twidth) { uint32_t m; m = *(uint32_t *)p; if (m) { ullong d = *q; __m64 vdest = expand565(M64(d), 0); vdest = pack565 (in_over(vsrc, vsrca, load8888(m), vdest), vdest, 0); *q = ULLONG(vdest); } twidth--; p++; q++; } maskLine += maskStride; dstLine += dstStride; } _mm_empty (); } void fbCompositeIn_nx8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; uint32_t src; uint8_t sa; __m64 vsrc, vsrca; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); fbComposeGetSolid(pSrc, src, pDst->bits.format); sa = src >> 24; if (sa == 0) return; vsrc = load8888(src); vsrca = expand_alpha(vsrc); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; if ((((unsigned long)pDst & 3) == 0) && (((unsigned long)pSrc & 3) == 0)) { while (w >= 4) { uint32_t m; __m64 vmask; __m64 vdest; m = 0; vmask = load8888 (*(uint32_t *)mask); vdest = load8888 (*(uint32_t *)dst); *(uint32_t *)dst = store8888 (in (in (vsrca, vmask), vdest)); dst += 4; mask += 4; w -= 4; } } while (w--) { uint16_t tmp; uint8_t a; uint32_t m, d; uint32_t r; a = *mask++; d = *dst; m = FbInU (sa, 0, a, tmp); r = FbInU (m, 0, d, tmp); *dst++ = r; } } _mm_empty(); } void fbCompositeIn_8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *srcLine, *src; int srcStride, dstStride; uint16_t w; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint8_t, srcStride, srcLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; if ((((unsigned long)pDst & 3) == 0) && (((unsigned long)pSrc & 3) == 0)) { while (w >= 4) { uint32_t *s = (uint32_t *)src; uint32_t *d = (uint32_t *)dst; *d = store8888 (in (load8888 (*s), load8888 (*d))); w -= 4; dst += 4; src += 4; } } while (w--) { uint8_t s, d; uint16_t tmp; s = *src; d = *dst; *dst = FbInU (s, 0, d, tmp); src++; dst++; } } _mm_empty (); } void fbCompositeSrcAdd_8888x8x8mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *maskLine, *mask; int dstStride, maskStride; uint16_t w; uint32_t src; uint8_t sa; __m64 vsrc, vsrca; fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); fbComposeGetSolid(pSrc, src, pDst->bits.format); sa = src >> 24; if (sa == 0) return; vsrc = load8888(src); vsrca = expand_alpha(vsrc); while (height--) { dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; if ((((unsigned long)pMask & 3) == 0) && (((unsigned long)pDst & 3) == 0)) { while (w >= 4) { __m64 vmask = load8888 (*(uint32_t *)mask); __m64 vdest = load8888 (*(uint32_t *)dst); *(uint32_t *)dst = store8888 (_mm_adds_pu8 (in (vsrca, vmask), vdest)); w -= 4; dst += 4; mask += 4; } } while (w--) { uint16_t tmp; uint16_t a; uint32_t m, d; uint32_t r; a = *mask++; d = *dst; m = FbInU (sa, 0, a, tmp); r = FbAdd (m, d, 0, tmp); *dst++ = r; } } _mm_empty(); } void fbCompositeSrcAdd_8000x8000mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint8_t *dstLine, *dst; uint8_t *srcLine, *src; int dstStride, srcStride; uint16_t w; uint8_t s, d; uint16_t t; CHECKPOINT(); fbComposeGetStart (pSrc, xSrc, ySrc, uint8_t, srcStride, srcLine, 1); fbComposeGetStart (pDst, xDst, yDst, uint8_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { s = *src; d = *dst; t = d + s; s = t | (0 - (t >> 8)); *dst = s; dst++; src++; w--; } while (w >= 8) { *(__m64*)dst = _mm_adds_pu8(*(__m64*)src, *(__m64*)dst); dst += 8; src += 8; w -= 8; } while (w) { s = *src; d = *dst; t = d + s; s = t | (0 - (t >> 8)); *dst = s; dst++; src++; w--; } } _mm_empty(); } void fbCompositeSrcAdd_8888x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { __m64 dst64; uint32_t *dstLine, *dst; uint32_t *srcLine, *src; int dstStride, srcStride; uint16_t w; CHECKPOINT(); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); while (height--) { dst = dstLine; dstLine += dstStride; src = srcLine; srcLine += srcStride; w = width; while (w && (unsigned long)dst & 7) { *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src), _mm_cvtsi32_si64(*dst))); dst++; src++; w--; } while (w >= 2) { dst64 = _mm_adds_pu8(*(__m64*)src, *(__m64*)dst); *(ullong*)dst = ULLONG(dst64); dst += 2; src += 2; w -= 2; } if (w) { *dst = _mm_cvtsi64_si32(_mm_adds_pu8(_mm_cvtsi32_si64(*src), _mm_cvtsi32_si64(*dst))); } } _mm_empty(); } pixman_bool_t pixman_blt_mmx (uint32_t *src_bits, uint32_t *dst_bits, int src_stride, int dst_stride, int src_bpp, int dst_bpp, int src_x, int src_y, int dst_x, int dst_y, int width, int height) { uint8_t * src_bytes; uint8_t * dst_bytes; int byte_width; if (src_bpp != dst_bpp) return FALSE; if (src_bpp == 16) { src_stride = src_stride * (int) sizeof (uint32_t) / 2; dst_stride = dst_stride * (int) sizeof (uint32_t) / 2; src_bytes = (uint8_t *)(((uint16_t *)src_bits) + src_stride * (src_y) + (src_x)); dst_bytes = (uint8_t *)(((uint16_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); byte_width = 2 * width; src_stride *= 2; dst_stride *= 2; } else if (src_bpp == 32) { src_stride = src_stride * (int) sizeof (uint32_t) / 4; dst_stride = dst_stride * (int) sizeof (uint32_t) / 4; src_bytes = (uint8_t *)(((uint32_t *)src_bits) + src_stride * (src_y) + (src_x)); dst_bytes = (uint8_t *)(((uint32_t *)dst_bits) + dst_stride * (dst_y) + (dst_x)); byte_width = 4 * width; src_stride *= 4; dst_stride *= 4; } else { return FALSE; } while (height--) { int w; uint8_t *s = src_bytes; uint8_t *d = dst_bytes; src_bytes += src_stride; dst_bytes += dst_stride; w = byte_width; while (w >= 2 && ((unsigned long)d & 3)) { *(uint16_t *)d = *(uint16_t *)s; w -= 2; s += 2; d += 2; } while (w >= 4 && ((unsigned long)d & 7)) { *(uint32_t *)d = *(uint32_t *)s; w -= 4; s += 4; d += 4; } while (w >= 64) { #ifdef __GNUC__ __asm__ ( "movq (%1), %%mm0\n" "movq 8(%1), %%mm1\n" "movq 16(%1), %%mm2\n" "movq 24(%1), %%mm3\n" "movq 32(%1), %%mm4\n" "movq 40(%1), %%mm5\n" "movq 48(%1), %%mm6\n" "movq 56(%1), %%mm7\n" "movq %%mm0, (%0)\n" "movq %%mm1, 8(%0)\n" "movq %%mm2, 16(%0)\n" "movq %%mm3, 24(%0)\n" "movq %%mm4, 32(%0)\n" "movq %%mm5, 40(%0)\n" "movq %%mm6, 48(%0)\n" "movq %%mm7, 56(%0)\n" : : "r" (d), "r" (s) : "memory", "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7"); #else __m64 v0 = *(__m64 *)(s + 0); __m64 v1 = *(__m64 *)(s + 8); __m64 v2 = *(__m64 *)(s + 16); __m64 v3 = *(__m64 *)(s + 24); __m64 v4 = *(__m64 *)(s + 32); __m64 v5 = *(__m64 *)(s + 40); __m64 v6 = *(__m64 *)(s + 48); __m64 v7 = *(__m64 *)(s + 56); *(__m64 *)(d + 0) = v0; *(__m64 *)(d + 8) = v1; *(__m64 *)(d + 16) = v2; *(__m64 *)(d + 24) = v3; *(__m64 *)(d + 32) = v4; *(__m64 *)(d + 40) = v5; *(__m64 *)(d + 48) = v6; *(__m64 *)(d + 56) = v7; #endif w -= 64; s += 64; d += 64; } while (w >= 4) { *(uint32_t *)d = *(uint32_t *)s; w -= 4; s += 4; d += 4; } if (w >= 2) { *(uint16_t *)d = *(uint16_t *)s; w -= 2; s += 2; d += 2; } } _mm_empty(); return TRUE; } void fbCompositeCopyAreammx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { pixman_blt_mmx (pSrc->bits.bits, pDst->bits.bits, pSrc->bits.rowstride, pDst->bits.rowstride, PIXMAN_FORMAT_BPP (pSrc->bits.format), PIXMAN_FORMAT_BPP (pDst->bits.format), xSrc, ySrc, xDst, yDst, width, height); } void fbCompositeOver_x888x8x8888mmx (pixman_op_t op, pixman_image_t * pSrc, pixman_image_t * pMask, pixman_image_t * pDst, int16_t xSrc, int16_t ySrc, int16_t xMask, int16_t yMask, int16_t xDst, int16_t yDst, uint16_t width, uint16_t height) { uint32_t *src, *srcLine; uint32_t *dst, *dstLine; uint8_t *mask, *maskLine; int srcStride, maskStride, dstStride; uint16_t w; fbComposeGetStart (pDst, xDst, yDst, uint32_t, dstStride, dstLine, 1); fbComposeGetStart (pMask, xMask, yMask, uint8_t, maskStride, maskLine, 1); fbComposeGetStart (pSrc, xSrc, ySrc, uint32_t, srcStride, srcLine, 1); while (height--) { src = srcLine; srcLine += srcStride; dst = dstLine; dstLine += dstStride; mask = maskLine; maskLine += maskStride; w = width; while (w--) { ullong m = *mask; if (m) { __m64 s = load8888 (*src | 0xff000000); if (m == 0xff) *dst = store8888 (s); else { __m64 sa = expand_alpha (s); __m64 vm = expand_alpha_rev (M64(m)); __m64 vdest = in_over(s, sa, vm, load8888 (*dst)); *dst = store8888 (vdest); } } mask++; dst++; src++; } } _mm_empty(); } #endif /* USE_MMX */ libgdiplus-2.11/pixman/pixman/pixman-sse.h0000664000175000017500000000316012225470167015551 00000000000000/* * Copyright © 2008 Rodrigo Kumpera * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Red Hat not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. Red Hat makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. * * Author: Rodrigo Kumpera (kumpera@gmail.com) * */ #ifndef _PIXMAN_SSE_H_ #define _PIXMAN_SSE_H_ #ifdef HAVE_DIX_CONFIG_H #include #endif #include "pixman-private.h" #ifdef USE_SSE2 #if !defined(__amd64__) && !defined(__x86_64__) pixman_bool_t pixman_have_sse(void); #else #define pixman_have_sse() TRUE #endif #else #define pixman_have_sse() FALSE #endif #ifdef USE_SSE2 void fbComposeSetupSSE(void); #endif /* USE_SSE2 */ #endif /* _PIXMAN_SSE_H_ */ libgdiplus-2.11/pixman/pixman/pixman-source.c0000664000175000017500000004553712225470167016270 00000000000000/* * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * 2005 Lars Knoll & Zack Rusin, Trolltech * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" typedef struct { uint32_t left_ag; uint32_t left_rb; uint32_t right_ag; uint32_t right_rb; int32_t left_x; int32_t right_x; int32_t stepper; pixman_gradient_stop_t *stops; int num_stops; unsigned int spread; int need_reset; } GradientWalker; static void _gradient_walker_init (GradientWalker *walker, gradient_t *gradient, unsigned int spread) { walker->num_stops = gradient->n_stops; walker->stops = gradient->stops; walker->left_x = 0; walker->right_x = 0x10000; walker->stepper = 0; walker->left_ag = 0; walker->left_rb = 0; walker->right_ag = 0; walker->right_rb = 0; walker->spread = spread; walker->need_reset = TRUE; } static void _gradient_walker_reset (GradientWalker *walker, pixman_fixed_32_32_t pos) { int32_t x, left_x, right_x; pixman_color_t *left_c, *right_c; int n, count = walker->num_stops; pixman_gradient_stop_t * stops = walker->stops; static const pixman_color_t transparent_black = { 0, 0, 0, 0 }; switch (walker->spread) { case PIXMAN_REPEAT_NORMAL: x = (int32_t)pos & 0xFFFF; for (n = 0; n < count; n++) if (x < stops[n].x) break; if (n == 0) { left_x = stops[count-1].x - 0x10000; left_c = &stops[count-1].color; } else { left_x = stops[n-1].x; left_c = &stops[n-1].color; } if (n == count) { right_x = stops[0].x + 0x10000; right_c = &stops[0].color; } else { right_x = stops[n].x; right_c = &stops[n].color; } left_x += (pos - x); right_x += (pos - x); break; case PIXMAN_REPEAT_PAD: for (n = 0; n < count; n++) if (pos < stops[n].x) break; if (n == 0) { left_x = INT32_MIN; left_c = &stops[0].color; } else { left_x = stops[n-1].x; left_c = &stops[n-1].color; } if (n == count) { right_x = INT32_MAX; right_c = &stops[n-1].color; } else { right_x = stops[n].x; right_c = &stops[n].color; } break; case PIXMAN_REPEAT_REFLECT: x = (int32_t)pos & 0xFFFF; if ((int32_t)pos & 0x10000) x = 0x10000 - x; for (n = 0; n < count; n++) if (x < stops[n].x) break; if (n == 0) { left_x = -stops[0].x; left_c = &stops[0].color; } else { left_x = stops[n-1].x; left_c = &stops[n-1].color; } if (n == count) { right_x = 0x20000 - stops[n-1].x; right_c = &stops[n-1].color; } else { right_x = stops[n].x; right_c = &stops[n].color; } if ((int32_t)pos & 0x10000) { pixman_color_t *tmp_c; int32_t tmp_x; tmp_x = 0x10000 - right_x; right_x = 0x10000 - left_x; left_x = tmp_x; tmp_c = right_c; right_c = left_c; left_c = tmp_c; x = 0x10000 - x; } left_x += (pos - x); right_x += (pos - x); break; default: /* RepeatNone */ for (n = 0; n < count; n++) if (pos < stops[n].x) break; if (n == 0) { left_x = INT32_MIN; right_x = stops[0].x; left_c = right_c = (pixman_color_t*) &transparent_black; } else if (n == count) { left_x = stops[n-1].x; right_x = INT32_MAX; left_c = right_c = (pixman_color_t*) &transparent_black; } else { left_x = stops[n-1].x; right_x = stops[n].x; left_c = &stops[n-1].color; right_c = &stops[n].color; } } walker->left_x = left_x; walker->right_x = right_x; walker->left_ag = ((left_c->alpha >> 8) << 16) | (left_c->green >> 8); walker->left_rb = ((left_c->red & 0xff00) << 8) | (left_c->blue >> 8); walker->right_ag = ((right_c->alpha >> 8) << 16) | (right_c->green >> 8); walker->right_rb = ((right_c->red & 0xff00) << 8) | (right_c->blue >> 8); if ( walker->left_x == walker->right_x || ( walker->left_ag == walker->right_ag && walker->left_rb == walker->right_rb ) ) { walker->stepper = 0; } else { int32_t width = right_x - left_x; walker->stepper = ((1 << 24) + width/2)/width; } walker->need_reset = FALSE; } #define GRADIENT_WALKER_NEED_RESET(w,x) \ ( (w)->need_reset || (x) < (w)->left_x || (x) >= (w)->right_x) /* the following assumes that GRADIENT_WALKER_NEED_RESET(w,x) is FALSE */ static uint32_t _gradient_walker_pixel (GradientWalker *walker, pixman_fixed_32_32_t x) { int dist, idist; uint32_t t1, t2, a, color; if (GRADIENT_WALKER_NEED_RESET (walker, x)) _gradient_walker_reset (walker, x); dist = ((int)(x - walker->left_x)*walker->stepper) >> 16; idist = 256 - dist; /* combined INTERPOLATE and premultiply */ t1 = walker->left_rb*idist + walker->right_rb*dist; t1 = (t1 >> 8) & 0xff00ff; t2 = walker->left_ag*idist + walker->right_ag*dist; t2 &= 0xff00ff00; color = t2 & 0xff000000; a = t2 >> 24; t1 = t1*a + 0x800080; t1 = (t1 + ((t1 >> 8) & 0xff00ff)) >> 8; t2 = (t2 >> 8)*a + 0x800080; t2 = (t2 + ((t2 >> 8) & 0xff00ff)); return (color | (t1 & 0xff00ff) | (t2 & 0xff00)); } void pixmanFetchSourcePict(source_image_t * pict, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits) { #if 0 SourcePictPtr pGradient = pict->pSourcePict; #endif GradientWalker walker; uint32_t *end = buffer + width; gradient_t *gradient; if (pict->common.type == SOLID) { register uint32_t color = ((solid_fill_t *)pict)->color; while (buffer < end) *(buffer++) = color; return; } gradient = (gradient_t *)pict; _gradient_walker_init (&walker, gradient, pict->common.repeat); if (pict->common.type == LINEAR) { pixman_vector_t v, unit; pixman_fixed_32_32_t l; pixman_fixed_48_16_t dx, dy, a, b, off; linear_gradient_t *linear = (linear_gradient_t *)pict; /* reference point is the center of the pixel */ v.vector[0] = pixman_int_to_fixed(x) + pixman_fixed_1/2; v.vector[1] = pixman_int_to_fixed(y) + pixman_fixed_1/2; v.vector[2] = pixman_fixed_1; if (pict->common.transform) { if (!pixman_transform_point_3d (pict->common.transform, &v)) return; unit.vector[0] = pict->common.transform->matrix[0][0]; unit.vector[1] = pict->common.transform->matrix[1][0]; unit.vector[2] = pict->common.transform->matrix[2][0]; } else { unit.vector[0] = pixman_fixed_1; unit.vector[1] = 0; unit.vector[2] = 0; } dx = linear->p2.x - linear->p1.x; dy = linear->p2.y - linear->p1.y; l = dx*dx + dy*dy; if (l != 0) { a = (dx << 32) / l; b = (dy << 32) / l; off = (-a*linear->p1.x - b*linear->p1.y)>>16; } if (l == 0 || (unit.vector[2] == 0 && v.vector[2] == pixman_fixed_1)) { pixman_fixed_48_16_t inc, t; /* affine transformation only */ if (l == 0) { t = 0; inc = 0; } else { t = ((a*v.vector[0] + b*v.vector[1]) >> 16) + off; inc = (a * unit.vector[0] + b * unit.vector[1]) >> 16; } if (pict->class == SOURCE_IMAGE_CLASS_VERTICAL) { register uint32_t color; color = _gradient_walker_pixel( &walker, t ); while (buffer < end) *(buffer++) = color; } else { if (!mask) { while (buffer < end) { *(buffer) = _gradient_walker_pixel (&walker, t); buffer += 1; t += inc; } } else { while (buffer < end) { if (*mask++ & maskBits) { *(buffer) = _gradient_walker_pixel (&walker, t); } buffer += 1; t += inc; } } } } else /* projective transformation */ { pixman_fixed_48_16_t t; if (pict->class == SOURCE_IMAGE_CLASS_VERTICAL) { register uint32_t color; if (v.vector[2] == 0) { t = 0; } else { pixman_fixed_48_16_t x, y; x = ((pixman_fixed_48_16_t) v.vector[0] << 16) / v.vector[2]; y = ((pixman_fixed_48_16_t) v.vector[1] << 16) / v.vector[2]; t = ((a * x + b * y) >> 16) + off; } color = _gradient_walker_pixel( &walker, t ); while (buffer < end) *(buffer++) = color; } else { while (buffer < end) { if (!mask || *mask++ & maskBits) { if (v.vector[2] == 0) { t = 0; } else { pixman_fixed_48_16_t x, y; x = ((pixman_fixed_48_16_t)v.vector[0] << 16) / v.vector[2]; y = ((pixman_fixed_48_16_t)v.vector[1] << 16) / v.vector[2]; t = ((a*x + b*y) >> 16) + off; } *(buffer) = _gradient_walker_pixel (&walker, t); } ++buffer; v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } } } else { /* * In the radial gradient problem we are given two circles (câ‚,râ‚) and * (câ‚‚,râ‚‚) that define the gradient itself. Then, for any point p, we * must compute the value(s) of t within [0.0, 1.0] representing the * circle(s) that would color the point. * * There are potentially two values of t since the point p can be * colored by both sides of the circle, (which happens whenever one * circle is not entirely contained within the other). * * If we solve for a value of t that is outside of [0.0, 1.0] then we * use the extend mode (NONE, REPEAT, REFLECT, or PAD) to map to a * value within [0.0, 1.0]. * * Here is an illustration of the problem: * * pâ‚‚ * p • * • ╲ * · ╲râ‚‚ * p₠· ╲ * • θ╲ * ╲ ╌╌• * ╲r₠· câ‚‚ * θ╲ · * ╌╌• * câ‚ * * Given (câ‚,râ‚), (câ‚‚,râ‚‚) and p, we must find an angle θ such that two * points pâ‚ and pâ‚‚ on the two circles are collinear with p. Then, the * desired value of t is the ratio of the length of pâ‚p to the length * of pâ‚pâ‚‚. * * So, we have six unknown values: (pâ‚x, pâ‚y), (pâ‚‚x, pâ‚‚y), θ and t. * We can also write six equations that constrain the problem: * * Point pâ‚ is a distance râ‚ from câ‚ at an angle of θ: * * 1. pâ‚x = câ‚x + râ‚·cos θ * 2. pâ‚y = câ‚y + râ‚·sin θ * * Point pâ‚‚ is a distance râ‚‚ from câ‚‚ at an angle of θ: * * 3. pâ‚‚x = câ‚‚x + r2·cos θ * 4. pâ‚‚y = câ‚‚y + r2·sin θ * * Point p lies at a fraction t along the line segment pâ‚pâ‚‚: * * 5. px = t·pâ‚‚x + (1-t)·pâ‚x * 6. py = t·pâ‚‚y + (1-t)·pâ‚y * * To solve, first subtitute 1-4 into 5 and 6: * * px = t·(câ‚‚x + r₂·cos θ) + (1-t)·(câ‚x + râ‚·cos θ) * py = t·(câ‚‚y + r₂·sin θ) + (1-t)·(câ‚y + râ‚·sin θ) * * Then solve each for cos θ and sin θ expressed as a function of t: * * cos θ = (-(câ‚‚x - câ‚x)·t + (px - câ‚x)) / ((râ‚‚-râ‚)·t + râ‚) * sin θ = (-(câ‚‚y - câ‚y)·t + (py - câ‚y)) / ((râ‚‚-râ‚)·t + râ‚) * * To simplify this a bit, we define new variables for several of the * common terms as shown below: * * pâ‚‚ * p • * • ╲ * · ┆ ╲râ‚‚ * p₠· ┆ ╲ * • pdy┆ ╲ * ╲ ┆ •câ‚‚ * ╲r₠┆ · ┆ * ╲ ·┆ ┆cdy * •╌╌╌╌┴╌╌╌╌╌╌╌┘ * câ‚ pdx cdx * * cdx = (câ‚‚x - câ‚x) * cdy = (câ‚‚y - câ‚y) * dr = râ‚‚-râ‚ * pdx = px - câ‚x * pdy = py - câ‚y * * Note that cdx, cdy, and dr do not depend on point p at all, so can * be pre-computed for the entire gradient. The simplifed equations * are now: * * cos θ = (-cdx·t + pdx) / (dr·t + râ‚) * sin θ = (-cdy·t + pdy) / (dr·t + râ‚) * * Finally, to get a single function of t and eliminate the last * unknown θ, we use the identity sin²θ + cos²θ = 1. First, square * each equation, (we knew a quadratic was coming since it must be * possible to obtain two solutions in some cases): * * cos²θ = (cdx²t² - 2·cdx·pdx·t + pdx²) / (dr²·t² + 2·râ‚·dr·t + r₲) * sin²θ = (cdy²t² - 2·cdy·pdy·t + pdy²) / (dr²·t² + 2·râ‚·dr·t + r₲) * * Then add both together, set the result equal to 1, and express as a * standard quadratic equation in t of the form At² + Bt + C = 0 * * (cdx² + cdy² - dr²)·t² - 2·(cdx·pdx + cdy·pdy + râ‚·dr)·t + (pdx² + pdy² - r₲) = 0 * * In other words: * * A = cdx² + cdy² - dr² * B = -2·(pdx·cdx + pdy·cdy + râ‚·dr) * C = pdx² + pdy² - r₲ * * And again, notice that A does not depend on p, so can be * precomputed. From here we just use the quadratic formula to solve * for t: * * t = (-2·B ± ⎷(B² - 4·A·C)) / 2·A */ /* radial or conical */ pixman_bool_t affine = TRUE; double cx = 1.; double cy = 0.; double cz = 0.; double rx = x + 0.5; double ry = y + 0.5; double rz = 1.; if (pict->common.transform) { pixman_vector_t v; /* reference point is the center of the pixel */ v.vector[0] = pixman_int_to_fixed(x) + pixman_fixed_1/2; v.vector[1] = pixman_int_to_fixed(y) + pixman_fixed_1/2; v.vector[2] = pixman_fixed_1; if (!pixman_transform_point_3d (pict->common.transform, &v)) return; cx = pict->common.transform->matrix[0][0]/65536.; cy = pict->common.transform->matrix[1][0]/65536.; cz = pict->common.transform->matrix[2][0]/65536.; rx = v.vector[0]/65536.; ry = v.vector[1]/65536.; rz = v.vector[2]/65536.; affine = pict->common.transform->matrix[2][0] == 0 && v.vector[2] == pixman_fixed_1; } if (pict->common.type == RADIAL) { radial_gradient_t *radial = (radial_gradient_t *)pict; if (affine) { while (buffer < end) { if (!mask || *mask++ & maskBits) { double pdx, pdy; double B, C; double det; double c1x = radial->c1.x / 65536.0; double c1y = radial->c1.y / 65536.0; double r1 = radial->c1.radius / 65536.0; pixman_fixed_48_16_t t; pdx = rx - c1x; pdy = ry - c1y; B = -2 * ( pdx * radial->cdx + pdy * radial->cdy + r1 * radial->dr); C = (pdx * pdx + pdy * pdy - r1 * r1); det = (B * B) - (4 * radial->A * C); if (det < 0.0) det = 0.0; if (radial->A < 0) t = (pixman_fixed_48_16_t) ((- B - sqrt(det)) / (2.0 * radial->A) * 65536); else t = (pixman_fixed_48_16_t) ((- B + sqrt(det)) / (2.0 * radial->A) * 65536); *(buffer) = _gradient_walker_pixel (&walker, t); } ++buffer; rx += cx; ry += cy; } } else { /* projective */ while (buffer < end) { if (!mask || *mask++ & maskBits) { double pdx, pdy; double B, C; double det; double c1x = radial->c1.x / 65536.0; double c1y = radial->c1.y / 65536.0; double r1 = radial->c1.radius / 65536.0; pixman_fixed_48_16_t t; double x, y; if (rz != 0) { x = rx/rz; y = ry/rz; } else { x = y = 0.; } pdx = x - c1x; pdy = y - c1y; B = -2 * ( pdx * radial->cdx + pdy * radial->cdy + r1 * radial->dr); C = (pdx * pdx + pdy * pdy - r1 * r1); det = (B * B) - (4 * radial->A * C); if (det < 0.0) det = 0.0; if (radial->A < 0) t = (pixman_fixed_48_16_t) ((- B - sqrt(det)) / (2.0 * radial->A) * 65536); else t = (pixman_fixed_48_16_t) ((- B + sqrt(det)) / (2.0 * radial->A) * 65536); *(buffer) = _gradient_walker_pixel (&walker, t); } ++buffer; rx += cx; ry += cy; rz += cz; } } } else /* SourcePictTypeConical */ { conical_gradient_t *conical = (conical_gradient_t *)pict; double a = conical->angle/(180.*65536); if (affine) { rx -= conical->center.x/65536.; ry -= conical->center.y/65536.; while (buffer < end) { double angle; if (!mask || *mask++ & maskBits) { pixman_fixed_48_16_t t; angle = atan2(ry, rx) + a; t = (pixman_fixed_48_16_t) (angle * (65536. / (2*M_PI))); *(buffer) = _gradient_walker_pixel (&walker, t); } ++buffer; rx += cx; ry += cy; } } else { while (buffer < end) { double x, y; double angle; if (!mask || *mask++ & maskBits) { pixman_fixed_48_16_t t; if (rz != 0) { x = rx/rz; y = ry/rz; } else { x = y = 0.; } x -= conical->center.x/65536.; y -= conical->center.y/65536.; angle = atan2(y, x) + a; t = (pixman_fixed_48_16_t) (angle * (65536. / (2*M_PI))); *(buffer) = _gradient_walker_pixel (&walker, t); } ++buffer; rx += cx; ry += cy; rz += cz; } } } } } libgdiplus-2.11/pixman/pixman/pixman-version.h0000664000175000017500000000331312225470526016443 00000000000000/* * Copyright © 2008 Red Hat, Inc. * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation * files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies * of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Author: Carl D. Worth */ #ifndef PIXMAN_VERSION_H__ #define PIXMAN_VERSION_H__ #ifndef PIXMAN_H__ # error pixman-version.h should only be included by pixman.h #endif #define PIXMAN_VERSION_MAJOR 0 #define PIXMAN_VERSION_MINOR 10 #define PIXMAN_VERSION_MICRO 0 #define PIXMAN_VERSION_STRING "0.10.0" #define PIXMAN_VERSION_ENCODE(major, minor, micro) ( \ ((major) * 10000) \ + ((minor) * 100) \ + ((micro) * 1)) #define PIXMAN_VERSION PIXMAN_VERSION_ENCODE( \ PIXMAN_VERSION_MAJOR, \ PIXMAN_VERSION_MINOR, \ PIXMAN_VERSION_MICRO) #endif /* PIXMAN_VERSION_H__ */ libgdiplus-2.11/pixman/pixman/pixman-transformed.c0000664000175000017500000006334312225470167017307 00000000000000/* * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * 2005 Lars Knoll & Zack Rusin, Trolltech * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS * SOFTWARE. */ #ifdef HAVE_CONFIG_H #include #endif #include #include "pixman-private.h" #ifdef PIXMAN_FB_ACCESSORS #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture_accessors #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture_accessors #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture_accessors #define FB_FETCH_TRANSFORMED fbFetchTransformed_accessors #define FB_FETCH_EXTERNAL_ALPHA fbFetchExternalAlpha_accessors #define FB_STORE_EXTERNAL_ALPHA fbStoreExternalAlpha_accessors #else #define FETCH_PROC_FOR_PICTURE pixman_fetchProcForPicture #define FETCH_PIXEL_PROC_FOR_PICTURE pixman_fetchPixelProcForPicture #define STORE_PROC_FOR_PICTURE pixman_storeProcForPicture #define FB_FETCH_TRANSFORMED fbFetchTransformed #define FB_FETCH_EXTERNAL_ALPHA fbFetchExternalAlpha #define FB_STORE_EXTERNAL_ALPHA fbStoreExternalAlpha #endif /* * Fetch from region strategies */ typedef FASTCALL uint32_t (*fetchFromRegionProc)(bits_image_t *pict, int x, int y, uint32_t *buffer, fetchPixelProc fetch, pixman_box16_t *box); static inline uint32_t fbFetchFromNoRegion(bits_image_t *pict, int x, int y, uint32_t *buffer, fetchPixelProc fetch, pixman_box16_t *box) { return fetch (pict, x, y); } static uint32_t fbFetchFromNRectangles(bits_image_t *pict, int x, int y, uint32_t *buffer, fetchPixelProc fetch, pixman_box16_t *box) { pixman_box16_t box2; if (pixman_region_contains_point (pict->common.src_clip, x, y, &box2)) return fbFetchFromNoRegion(pict, x, y, buffer, fetch, box); else return 0; } static uint32_t fbFetchFromOneRectangle(bits_image_t *pict, int x, int y, uint32_t *buffer, fetchPixelProc fetch, pixman_box16_t *box) { pixman_box16_t box2 = *box; return ((x < box2.x1) | (x >= box2.x2) | (y < box2.y1) | (y >= box2.y2)) ? 0 : fbFetchFromNoRegion(pict, x, y, buffer, fetch, box); } /* * Fetching Algorithms */ static void fbFetchTransformed_Nearest_Normal(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t* box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int x, y, i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) fetchFromRegion = fbFetchFromNoRegion; else fetchFromRegion = fbFetchFromNRectangles; for ( i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { if (!affine) { y = MOD(DIV(v.vector[1],v.vector[2]), pict->height); x = MOD(DIV(v.vector[0],v.vector[2]), pict->width); } else { y = MOD(v.vector[1]>>16, pict->height); x = MOD(v.vector[0]>>16, pict->width); } *(buffer + i) = fetchFromRegion(pict, x, y, buffer, fetch, box); } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Nearest_Pad(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t *box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int x, y, i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) fetchFromRegion = fbFetchFromNoRegion; else fetchFromRegion = fbFetchFromNRectangles; for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { if (!affine) { y = CLIP(DIV(v.vector[1], v.vector[2]), 0, pict->height-1); x = CLIP(DIV(v.vector[0], v.vector[2]), 0, pict->width-1); } else { y = CLIP(v.vector[1]>>16, 0, pict->height-1); x = CLIP(v.vector[0]>>16, 0, pict->width-1); } *(buffer + i) = fetchFromRegion(pict, x, y, buffer, fetch, box); } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Nearest_General(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t *box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int x, y, i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) { box = &(pict->common.src_clip->extents); fetchFromRegion = fbFetchFromOneRectangle; } else { fetchFromRegion = fbFetchFromNRectangles; } for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { if (!affine) { y = DIV(v.vector[1],v.vector[2]); x = DIV(v.vector[0],v.vector[2]); } else { y = v.vector[1]>>16; x = v.vector[0]>>16; } *(buffer + i) = fetchFromRegion(pict, x, y, buffer, fetch, box); } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Bilinear_Normal(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t *box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) fetchFromRegion = fbFetchFromNoRegion; else fetchFromRegion = fbFetchFromNRectangles; for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { int x1, x2, y1, y2, distx, idistx, disty, idisty; uint32_t tl, tr, bl, br, r; uint32_t ft, fb; if (!affine) { pixman_fixed_48_16_t div; div = ((pixman_fixed_48_16_t)v.vector[0] << 16)/v.vector[2]; x1 = div >> 16; distx = ((pixman_fixed_t)div >> 8) & 0xff; div = ((pixman_fixed_48_16_t)v.vector[1] << 16)/v.vector[2]; y1 = div >> 16; disty = ((pixman_fixed_t)div >> 8) & 0xff; } else { x1 = v.vector[0] >> 16; distx = (v.vector[0] >> 8) & 0xff; y1 = v.vector[1] >> 16; disty = (v.vector[1] >> 8) & 0xff; } x2 = x1 + 1; y2 = y1 + 1; idistx = 256 - distx; idisty = 256 - disty; x1 = MOD (x1, pict->width); x2 = MOD (x2, pict->width); y1 = MOD (y1, pict->height); y2 = MOD (y2, pict->height); tl = fetchFromRegion(pict, x1, y1, buffer, fetch, box); tr = fetchFromRegion(pict, x2, y1, buffer, fetch, box); bl = fetchFromRegion(pict, x1, y2, buffer, fetch, box); br = fetchFromRegion(pict, x2, y2, buffer, fetch, box); ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx; r = (((ft * idisty + fb * disty) >> 16) & 0xff); ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx; fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx; r |= (((ft * idisty + fb * disty) >> 8) & 0xff00); ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx; fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx; r |= (((ft * idisty + fb * disty)) & 0xff0000); ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx; fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx; r |= (((ft * idisty + fb * disty) << 8) & 0xff000000); *(buffer + i) = r; } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Bilinear_Pad(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t *box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) fetchFromRegion = fbFetchFromNoRegion; else fetchFromRegion = fbFetchFromNRectangles; for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { int x1, x2, y1, y2, distx, idistx, disty, idisty; uint32_t tl, tr, bl, br, r; uint32_t ft, fb; if (!affine) { pixman_fixed_48_16_t div; div = ((pixman_fixed_48_16_t)v.vector[0] << 16)/v.vector[2]; x1 = div >> 16; distx = ((pixman_fixed_t)div >> 8) & 0xff; div = ((pixman_fixed_48_16_t)v.vector[1] << 16)/v.vector[2]; y1 = div >> 16; disty = ((pixman_fixed_t)div >> 8) & 0xff; } else { x1 = v.vector[0] >> 16; distx = (v.vector[0] >> 8) & 0xff; y1 = v.vector[1] >> 16; disty = (v.vector[1] >> 8) & 0xff; } x2 = x1 + 1; y2 = y1 + 1; idistx = 256 - distx; idisty = 256 - disty; x1 = CLIP (x1, 0, pict->width-1); x2 = CLIP (x2, 0, pict->width-1); y1 = CLIP (y1, 0, pict->height-1); y2 = CLIP (y2, 0, pict->height-1); tl = fetchFromRegion(pict, x1, y1, buffer, fetch, box); tr = fetchFromRegion(pict, x2, y1, buffer, fetch, box); bl = fetchFromRegion(pict, x1, y2, buffer, fetch, box); br = fetchFromRegion(pict, x2, y2, buffer, fetch, box); ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx; r = (((ft * idisty + fb * disty) >> 16) & 0xff); ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx; fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx; r |= (((ft * idisty + fb * disty) >> 8) & 0xff00); ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx; fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx; r |= (((ft * idisty + fb * disty)) & 0xff0000); ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx; fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx; r |= (((ft * idisty + fb * disty) << 8) & 0xff000000); *(buffer + i) = r; } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Bilinear_General(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t *box = NULL; fetchPixelProc fetch; fetchFromRegionProc fetchFromRegion; int i; /* initialize the two function pointers */ fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); if(pixman_region_n_rects (pict->common.src_clip) == 1) { box = &(pict->common.src_clip->extents); fetchFromRegion = fbFetchFromOneRectangle; } else { fetchFromRegion = fbFetchFromNRectangles; } for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { int x1, x2, y1, y2, distx, idistx, disty, idisty; uint32_t tl, tr, bl, br, r; uint32_t ft, fb; if (!affine) { pixman_fixed_48_16_t div; div = ((pixman_fixed_48_16_t)v.vector[0] << 16)/v.vector[2]; x1 = div >> 16; distx = ((pixman_fixed_t)div >> 8) & 0xff; div = ((pixman_fixed_48_16_t)v.vector[1] << 16)/v.vector[2]; y1 = div >> 16; disty = ((pixman_fixed_t)div >> 8) & 0xff; } else { x1 = v.vector[0] >> 16; distx = (v.vector[0] >> 8) & 0xff; y1 = v.vector[1] >> 16; disty = (v.vector[1] >> 8) & 0xff; } x2 = x1 + 1; y2 = y1 + 1; idistx = 256 - distx; idisty = 256 - disty; tl = fetchFromRegion(pict, x1, y1, buffer, fetch, box); tr = fetchFromRegion(pict, x2, y1, buffer, fetch, box); bl = fetchFromRegion(pict, x1, y2, buffer, fetch, box); br = fetchFromRegion(pict, x2, y2, buffer, fetch, box); ft = FbGet8(tl,0) * idistx + FbGet8(tr,0) * distx; fb = FbGet8(bl,0) * idistx + FbGet8(br,0) * distx; r = (((ft * idisty + fb * disty) >> 16) & 0xff); ft = FbGet8(tl,8) * idistx + FbGet8(tr,8) * distx; fb = FbGet8(bl,8) * idistx + FbGet8(br,8) * distx; r |= (((ft * idisty + fb * disty) >> 8) & 0xff00); ft = FbGet8(tl,16) * idistx + FbGet8(tr,16) * distx; fb = FbGet8(bl,16) * idistx + FbGet8(br,16) * distx; r |= (((ft * idisty + fb * disty)) & 0xff0000); ft = FbGet8(tl,24) * idistx + FbGet8(tr,24) * distx; fb = FbGet8(bl,24) * idistx + FbGet8(br,24) * distx; r |= (((ft * idisty + fb * disty) << 8) & 0xff000000); *(buffer + i) = r; } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void fbFetchTransformed_Convolution(bits_image_t * pict, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits, pixman_bool_t affine, pixman_vector_t v, pixman_vector_t unit) { pixman_box16_t dummy; fetchPixelProc fetch; int i; pixman_fixed_t *params = pict->common.filter_params; int32_t cwidth = pixman_fixed_to_int(params[0]); int32_t cheight = pixman_fixed_to_int(params[1]); int xoff = (params[0] - pixman_fixed_1) >> 1; int yoff = (params[1] - pixman_fixed_1) >> 1; fetch = FETCH_PIXEL_PROC_FOR_PICTURE(pict); params += 2; for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { if (!v.vector[2]) { *(buffer + i) = 0; } else { int x1, x2, y1, y2, x, y; int32_t srtot, sgtot, sbtot, satot; pixman_fixed_t *p = params; if (!affine) { pixman_fixed_48_16_t tmp; tmp = ((pixman_fixed_48_16_t)v.vector[0] << 16)/v.vector[2] - xoff; x1 = pixman_fixed_to_int(tmp); tmp = ((pixman_fixed_48_16_t)v.vector[1] << 16)/v.vector[2] - yoff; y1 = pixman_fixed_to_int(tmp); } else { x1 = pixman_fixed_to_int(v.vector[0] - xoff); y1 = pixman_fixed_to_int(v.vector[1] - yoff); } x2 = x1 + cwidth; y2 = y1 + cheight; srtot = sgtot = sbtot = satot = 0; for (y = y1; y < y2; y++) { int ty; switch (pict->common.repeat) { case PIXMAN_REPEAT_NORMAL: ty = MOD (y, pict->height); break; case PIXMAN_REPEAT_PAD: ty = CLIP (y, 0, pict->height-1); break; default: ty = y; } for (x = x1; x < x2; x++) { if (*p) { int tx; switch (pict->common.repeat) { case PIXMAN_REPEAT_NORMAL: tx = MOD (x, pict->width); break; case PIXMAN_REPEAT_PAD: tx = CLIP (x, 0, pict->width-1); break; default: tx = x; } if (pixman_region_contains_point (pict->common.src_clip, tx, ty, &dummy)) { uint32_t c = fetch(pict, tx, ty); srtot += Red(c) * *p; sgtot += Green(c) * *p; sbtot += Blue(c) * *p; satot += Alpha(c) * *p; } } p++; } } satot >>= 16; srtot >>= 16; sgtot >>= 16; sbtot >>= 16; if (satot < 0) satot = 0; else if (satot > 0xff) satot = 0xff; if (srtot < 0) srtot = 0; else if (srtot > 0xff) srtot = 0xff; if (sgtot < 0) sgtot = 0; else if (sgtot > 0xff) sgtot = 0xff; if (sbtot < 0) sbtot = 0; else if (sbtot > 0xff) sbtot = 0xff; *(buffer + i) = ((satot << 24) | (srtot << 16) | (sgtot << 8) | (sbtot )); } } v.vector[0] += unit.vector[0]; v.vector[1] += unit.vector[1]; v.vector[2] += unit.vector[2]; } } static void adjust (pixman_vector_t *v, pixman_vector_t *u, pixman_fixed_t adjustment) { int delta_v = (adjustment * v->vector[2]) >> 16; int delta_u = (adjustment * u->vector[2]) >> 16; v->vector[0] += delta_v; v->vector[1] += delta_v; u->vector[0] += delta_u; u->vector[1] += delta_u; } void FB_FETCH_TRANSFORMED(bits_image_t * pict, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits) { uint32_t *bits; int32_t stride; pixman_vector_t v; pixman_vector_t unit; pixman_bool_t affine = TRUE; bits = pict->bits; stride = pict->rowstride; /* reference point is the center of the pixel */ v.vector[0] = pixman_int_to_fixed(x) + pixman_fixed_1 / 2; v.vector[1] = pixman_int_to_fixed(y) + pixman_fixed_1 / 2; v.vector[2] = pixman_fixed_1; /* when using convolution filters or PIXMAN_REPEAT_PAD one might get here without a transform */ if (pict->common.transform) { if (!pixman_transform_point_3d (pict->common.transform, &v)) return; unit.vector[0] = pict->common.transform->matrix[0][0]; unit.vector[1] = pict->common.transform->matrix[1][0]; unit.vector[2] = pict->common.transform->matrix[2][0]; affine = v.vector[2] == pixman_fixed_1 && unit.vector[2] == 0; } else { unit.vector[0] = pixman_fixed_1; unit.vector[1] = 0; unit.vector[2] = 0; } /* This allows filtering code to pretend that pixels are located at integer coordinates */ adjust (&v, &unit, -(pixman_fixed_1 / 2)); if (pict->common.filter == PIXMAN_FILTER_NEAREST || pict->common.filter == PIXMAN_FILTER_FAST) { /* Round down to closest integer, ensuring that 0.5 rounds to 0, not 1 */ adjust (&v, &unit, pixman_fixed_1 / 2 - pixman_fixed_e); if (pict->common.repeat == PIXMAN_REPEAT_NORMAL) { fbFetchTransformed_Nearest_Normal(pict, width, buffer, mask, maskBits, affine, v, unit); } else if (pict->common.repeat == PIXMAN_REPEAT_PAD) { fbFetchTransformed_Nearest_Pad(pict, width, buffer, mask, maskBits, affine, v, unit); } else { fbFetchTransformed_Nearest_General(pict, width, buffer, mask, maskBits, affine, v, unit); } } else if (pict->common.filter == PIXMAN_FILTER_BILINEAR || pict->common.filter == PIXMAN_FILTER_GOOD || pict->common.filter == PIXMAN_FILTER_BEST) { if (pict->common.repeat == PIXMAN_REPEAT_NORMAL) { fbFetchTransformed_Bilinear_Normal(pict, width, buffer, mask, maskBits, affine, v, unit); } else if (pict->common.repeat == PIXMAN_REPEAT_PAD) { fbFetchTransformed_Bilinear_Pad(pict, width, buffer, mask, maskBits, affine, v, unit); } else { fbFetchTransformed_Bilinear_General(pict, width, buffer, mask, maskBits, affine, v, unit); } } else if (pict->common.filter == PIXMAN_FILTER_CONVOLUTION) { /* Round to closest integer, ensuring that 0.5 rounds to 0, not 1 */ adjust (&v, &unit, pixman_fixed_1 / 2 - pixman_fixed_e); fbFetchTransformed_Convolution(pict, width, buffer, mask, maskBits, affine, v, unit); } } #define SCANLINE_BUFFER_LENGTH 2048 void FB_FETCH_EXTERNAL_ALPHA(bits_image_t * pict, int x, int y, int width, uint32_t *buffer, uint32_t *mask, uint32_t maskBits) { int i; uint32_t _alpha_buffer[SCANLINE_BUFFER_LENGTH]; uint32_t *alpha_buffer = _alpha_buffer; if (!pict->common.alpha_map) { FB_FETCH_TRANSFORMED (pict, x, y, width, buffer, mask, maskBits); return; } if (width > SCANLINE_BUFFER_LENGTH) alpha_buffer = (uint32_t *) pixman_malloc_ab (width, sizeof(uint32_t)); FB_FETCH_TRANSFORMED(pict, x, y, width, buffer, mask, maskBits); FB_FETCH_TRANSFORMED((bits_image_t *)pict->common.alpha_map, x - pict->common.alpha_origin.x, y - pict->common.alpha_origin.y, width, alpha_buffer, mask, maskBits); for (i = 0; i < width; ++i) { if (!mask || mask[i] & maskBits) { int a = alpha_buffer[i]>>24; *(buffer + i) = (a << 24) | (div_255(Red(*(buffer + i)) * a) << 16) | (div_255(Green(*(buffer + i)) * a) << 8) | (div_255(Blue(*(buffer + i)) * a)); } } if (alpha_buffer != _alpha_buffer) free(alpha_buffer); } void FB_STORE_EXTERNAL_ALPHA(bits_image_t * pict, int x, int y, int width, uint32_t *buffer) { uint32_t *bits, *alpha_bits; int32_t stride, astride; int ax, ay; storeProc store; storeProc astore; const pixman_indexed_t * indexed = pict->indexed; const pixman_indexed_t * aindexed; if (!pict->common.alpha_map) { // XXX[AGP]: This should never happen! // fbStore(pict, x, y, width, buffer); abort(); return; } store = STORE_PROC_FOR_PICTURE(pict); astore = STORE_PROC_FOR_PICTURE(pict->common.alpha_map); aindexed = pict->common.alpha_map->indexed; ax = x; ay = y; bits = pict->bits; stride = pict->rowstride; alpha_bits = pict->common.alpha_map->bits; astride = pict->common.alpha_map->rowstride; bits += y*stride; alpha_bits += (ay - pict->common.alpha_origin.y)*astride; store((pixman_image_t *)pict, bits, buffer, x, width, indexed); astore((pixman_image_t *)pict->common.alpha_map, alpha_bits, buffer, ax - pict->common.alpha_origin.x, width, aindexed); } libgdiplus-2.11/pixman/pixman/pixman-compose-accessors.c0000664000175000017500000000007212225470167020401 00000000000000 #define PIXMAN_FB_ACCESSORS #include "pixman-compose.c" libgdiplus-2.11/pixman/pixman/pixman-region.c0000664000175000017500000021225412225470167016243 00000000000000/*********************************************************** Copyright 1987, 1988, 1989, 1998 The Open Group Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is hereby granted without fee, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of The Open Group shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from The Open Group. Copyright 1987, 1988, 1989 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include "pixman-private.h" typedef struct pixman_region16_point { int x, y; } pixman_region16_point_t; #define PIXREGION_NIL(reg) ((reg)->data && !(reg)->data->numRects) /* not a region */ #define PIXREGION_NAR(reg) ((reg)->data == pixman_brokendata) #define PIXREGION_NUM_RECTS(reg) ((reg)->data ? (reg)->data->numRects : 1) #define PIXREGION_SIZE(reg) ((reg)->data ? (reg)->data->size : 0) #define PIXREGION_RECTS(reg) ((reg)->data ? (pixman_box16_t *)((reg)->data + 1) \ : &(reg)->extents) #define PIXREGION_BOXPTR(reg) ((pixman_box16_t *)((reg)->data + 1)) #define PIXREGION_BOX(reg,i) (&PIXREGION_BOXPTR(reg)[i]) #define PIXREGION_TOP(reg) PIXREGION_BOX(reg, (reg)->data->numRects) #define PIXREGION_END(reg) PIXREGION_BOX(reg, (reg)->data->numRects - 1) #undef assert #ifdef DEBUG_PIXREGION #define assert(expr) {if (!(expr)) \ FatalError("Assertion failed file %s, line %d: expr\n", \ __FILE__, __LINE__); } #else #define assert(expr) #endif #define good(reg) assert(pixman_region_selfcheck(reg)) #undef MIN #define MIN(a,b) ((a) < (b) ? (a) : (b)) #undef MAX #define MAX(a,b) ((a) > (b) ? (a) : (b)) static const pixman_box16_t _pixman_region_emptyBox = {0, 0, 0, 0}; static const pixman_region16_data_t _pixman_region_emptyData = {0, 0}; static const pixman_region16_data_t _pixman_brokendata = {0, 0}; static pixman_box16_t *pixman_region_emptyBox = (pixman_box16_t *)&_pixman_region_emptyBox; static pixman_region16_data_t *pixman_region_emptyData = (pixman_region16_data_t *)&_pixman_region_emptyData; static pixman_region16_data_t *pixman_brokendata = (pixman_region16_data_t *)&_pixman_brokendata; /* This function exists only to make it possible to preserve the X ABI - it should * go away at first opportunity. * * The problem is that the X ABI exports the three structs and has used * them through macros. So the X server calls this function with * the addresses of those structs which makes the existing code continue to * work. */ void pixman_region_set_static_pointers (pixman_box16_t *empty_box, pixman_region16_data_t *empty_data, pixman_region16_data_t *broken_data) { pixman_region_emptyBox = empty_box; pixman_region_emptyData = empty_data; pixman_brokendata = broken_data; } static pixman_bool_t pixman_break (pixman_region16_t *pReg); /* * The functions in this file implement the Region abstraction used extensively * throughout the X11 sample server. A Region is simply a set of disjoint * (non-overlapping) rectangles, plus an "extent" rectangle which is the * smallest single rectangle that contains all the non-overlapping rectangles. * * A Region is implemented as a "y-x-banded" array of rectangles. This array * imposes two degrees of order. First, all rectangles are sorted by top side * y coordinate first (y1), and then by left side x coordinate (x1). * * Furthermore, the rectangles are grouped into "bands". Each rectangle in a * band has the same top y coordinate (y1), and each has the same bottom y * coordinate (y2). Thus all rectangles in a band differ only in their left * and right side (x1 and x2). Bands are implicit in the array of rectangles: * there is no separate list of band start pointers. * * The y-x band representation does not minimize rectangles. In particular, * if a rectangle vertically crosses a band (the rectangle has scanlines in * the y1 to y2 area spanned by the band), then the rectangle may be broken * down into two or more smaller rectangles stacked one atop the other. * * ----------- ----------- * | | | | band 0 * | | -------- ----------- -------- * | | | | in y-x banded | | | | band 1 * | | | | form is | | | | * ----------- | | ----------- -------- * | | | | band 2 * -------- -------- * * An added constraint on the rectangles is that they must cover as much * horizontal area as possible: no two rectangles within a band are allowed * to touch. * * Whenever possible, bands will be merged together to cover a greater vertical * distance (and thus reduce the number of rectangles). Two bands can be merged * only if the bottom of one touches the top of the other and they have * rectangles in the same places (of the same width, of course). * * Adam de Boor wrote most of the original region code. Joel McCormack * substantially modified or rewrote most of the core arithmetic routines, and * added pixman_region_validate in order to support several speed improvements to * pixman_region_validateTree. Bob Scheifler changed the representation to be more * compact when empty or a single rectangle, and did a bunch of gratuitous * reformatting. Carl Worth did further gratuitous reformatting while re-merging * the server and client region code into libpixregion. */ /* true iff two Boxes overlap */ #define EXTENTCHECK(r1,r2) \ (!( ((r1)->x2 <= (r2)->x1) || \ ((r1)->x1 >= (r2)->x2) || \ ((r1)->y2 <= (r2)->y1) || \ ((r1)->y1 >= (r2)->y2) ) ) /* true iff (x,y) is in Box */ #define INBOX(r,x,y) \ ( ((r)->x2 > x) && \ ((r)->x1 <= x) && \ ((r)->y2 > y) && \ ((r)->y1 <= y) ) /* true iff Box r1 contains Box r2 */ #define SUBSUMES(r1,r2) \ ( ((r1)->x1 <= (r2)->x1) && \ ((r1)->x2 >= (r2)->x2) && \ ((r1)->y1 <= (r2)->y1) && \ ((r1)->y2 >= (r2)->y2) ) static size_t PIXREGION_SZOF(size_t n) { size_t size = n * sizeof(pixman_box16_t); if (n > UINT32_MAX / sizeof(pixman_box16_t)) return 0; if (sizeof(pixman_region16_data_t) > UINT32_MAX - size) return 0; return size + sizeof(pixman_region16_data_t); } static void * allocData(size_t n) { size_t sz = PIXREGION_SZOF(n); if (!sz) return NULL; return malloc(sz); } #define freeData(reg) if ((reg)->data && (reg)->data->size) free((reg)->data) #define RECTALLOC_BAIL(pReg,n,bail) \ if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \ if (!pixman_rect_alloc(pReg, n)) { goto bail; } #define RECTALLOC(pReg,n) \ if (!(pReg)->data || (((pReg)->data->numRects + (n)) > (pReg)->data->size)) \ if (!pixman_rect_alloc(pReg, n)) { return FALSE; } #define ADDRECT(pNextRect,nx1,ny1,nx2,ny2) \ { \ pNextRect->x1 = nx1; \ pNextRect->y1 = ny1; \ pNextRect->x2 = nx2; \ pNextRect->y2 = ny2; \ pNextRect++; \ } #define NEWRECT(pReg,pNextRect,nx1,ny1,nx2,ny2) \ { \ if (!(pReg)->data || ((pReg)->data->numRects == (pReg)->data->size))\ { \ if (!pixman_rect_alloc(pReg, 1)) \ return FALSE; \ pNextRect = PIXREGION_TOP(pReg); \ } \ ADDRECT(pNextRect,nx1,ny1,nx2,ny2); \ pReg->data->numRects++; \ assert(pReg->data->numRects<=pReg->data->size); \ } #define DOWNSIZE(reg,numRects) \ if (((numRects) < ((reg)->data->size >> 1)) && ((reg)->data->size > 50)) \ { \ pixman_region16_data_t * NewData; \ size_t data_size = PIXREGION_SZOF(numRects); \ if (!data_size) \ NewData = NULL; \ else \ NewData = (pixman_region16_data_t *)realloc((reg)->data, data_size); \ if (NewData) \ { \ NewData->size = (numRects); \ (reg)->data = NewData; \ } \ } pixman_bool_t pixman_region_equal(reg1, reg2) pixman_region16_t * reg1; pixman_region16_t * reg2; { int i; pixman_box16_t *rects1; pixman_box16_t *rects2; if (reg1->extents.x1 != reg2->extents.x1) return FALSE; if (reg1->extents.x2 != reg2->extents.x2) return FALSE; if (reg1->extents.y1 != reg2->extents.y1) return FALSE; if (reg1->extents.y2 != reg2->extents.y2) return FALSE; if (PIXREGION_NUM_RECTS(reg1) != PIXREGION_NUM_RECTS(reg2)) return FALSE; rects1 = PIXREGION_RECTS(reg1); rects2 = PIXREGION_RECTS(reg2); for (i = 0; i != PIXREGION_NUM_RECTS(reg1); i++) { if (rects1[i].x1 != rects2[i].x1) return FALSE; if (rects1[i].x2 != rects2[i].x2) return FALSE; if (rects1[i].y1 != rects2[i].y1) return FALSE; if (rects1[i].y2 != rects2[i].y2) return FALSE; } return TRUE; } int pixman_region16_print(rgn) pixman_region16_t * rgn; { int num, size; int i; pixman_box16_t * rects; num = PIXREGION_NUM_RECTS(rgn); size = PIXREGION_SIZE(rgn); rects = PIXREGION_RECTS(rgn); fprintf(stderr, "num: %d size: %d\n", num, size); fprintf(stderr, "extents: %d %d %d %d\n", rgn->extents.x1, rgn->extents.y1, rgn->extents.x2, rgn->extents.y2); for (i = 0; i < num; i++) fprintf(stderr, "%d %d %d %d \n", rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2); fprintf(stderr, "\n"); return(num); } void pixman_region_init (pixman_region16_t *region) { region->extents = *pixman_region_emptyBox; region->data = pixman_region_emptyData; } void pixman_region_init_rect (pixman_region16_t *region, int x, int y, unsigned int width, unsigned int height) { region->extents.x1 = x; region->extents.y1 = y; region->extents.x2 = x + width; region->extents.y2 = y + height; region->data = NULL; } void pixman_region_init_with_extents (pixman_region16_t *region, pixman_box16_t *extents) { region->extents = *extents; region->data = NULL; } void pixman_region_fini (pixman_region16_t *region) { good (region); freeData (region); } int pixman_region_n_rects (pixman_region16_t *region) { return PIXREGION_NUM_RECTS (region); } pixman_box16_t * pixman_region_rects (pixman_region16_t *region) { return PIXREGION_RECTS (region); } pixman_box16_t * pixman_region_rectangles (pixman_region16_t *region, int *n_rects) { if (n_rects) *n_rects = PIXREGION_NUM_RECTS (region); return PIXREGION_RECTS (region); } static pixman_bool_t pixman_break (pixman_region16_t *region) { freeData (region); region->extents = *pixman_region_emptyBox; region->data = pixman_brokendata; return FALSE; } static pixman_bool_t pixman_rect_alloc (pixman_region16_t * region, int n) { pixman_region16_data_t *data; if (!region->data) { n++; region->data = allocData(n); if (!region->data) return pixman_break (region); region->data->numRects = 1; *PIXREGION_BOXPTR(region) = region->extents; } else if (!region->data->size) { region->data = allocData(n); if (!region->data) return pixman_break (region); region->data->numRects = 0; } else { size_t data_size; if (n == 1) { n = region->data->numRects; if (n > 500) /* XXX pick numbers out of a hat */ n = 250; } n += region->data->numRects; data_size = PIXREGION_SZOF(n); if (!data_size) data = NULL; else data = (pixman_region16_data_t *)realloc(region->data, PIXREGION_SZOF(n)); if (!data) return pixman_break (region); region->data = data; } region->data->size = n; return TRUE; } pixman_bool_t pixman_region_copy (pixman_region16_t *dst, pixman_region16_t *src) { good(dst); good(src); if (dst == src) return TRUE; dst->extents = src->extents; if (!src->data || !src->data->size) { freeData(dst); dst->data = src->data; return TRUE; } if (!dst->data || (dst->data->size < src->data->numRects)) { freeData(dst); dst->data = allocData(src->data->numRects); if (!dst->data) return pixman_break (dst); dst->data->size = src->data->numRects; } dst->data->numRects = src->data->numRects; memmove((char *)PIXREGION_BOXPTR(dst),(char *)PIXREGION_BOXPTR(src), dst->data->numRects * sizeof(pixman_box16_t)); return TRUE; } /*====================================================================== * Generic Region Operator *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_coalesce -- * Attempt to merge the boxes in the current band with those in the * previous one. We are guaranteed that the current band extends to * the end of the rects array. Used only by pixman_op. * * Results: * The new index for the previous band. * * Side Effects: * If coalescing takes place: * - rectangles in the previous band will have their y2 fields * altered. * - region->data->numRects will be decreased. * *----------------------------------------------------------------------- */ static inline int pixman_coalesce ( pixman_region16_t * region, /* Region to coalesce */ int prevStart, /* Index of start of previous band */ int curStart) /* Index of start of current band */ { pixman_box16_t * pPrevBox; /* Current box in previous band */ pixman_box16_t * pCurBox; /* Current box in current band */ int numRects; /* Number rectangles in both bands */ int y2; /* Bottom of current band */ /* * Figure out how many rectangles are in the band. */ numRects = curStart - prevStart; assert(numRects == region->data->numRects - curStart); if (!numRects) return curStart; /* * The bands may only be coalesced if the bottom of the previous * matches the top scanline of the current. */ pPrevBox = PIXREGION_BOX(region, prevStart); pCurBox = PIXREGION_BOX(region, curStart); if (pPrevBox->y2 != pCurBox->y1) return curStart; /* * Make sure the bands have boxes in the same places. This * assumes that boxes have been added in such a way that they * cover the most area possible. I.e. two boxes in a band must * have some horizontal space between them. */ y2 = pCurBox->y2; do { if ((pPrevBox->x1 != pCurBox->x1) || (pPrevBox->x2 != pCurBox->x2)) { return (curStart); } pPrevBox++; pCurBox++; numRects--; } while (numRects); /* * The bands may be merged, so set the bottom y of each box * in the previous band to the bottom y of the current band. */ numRects = curStart - prevStart; region->data->numRects -= numRects; do { pPrevBox--; pPrevBox->y2 = y2; numRects--; } while (numRects); return prevStart; } /* Quicky macro to avoid trivial reject procedure calls to pixman_coalesce */ #define Coalesce(newReg, prevBand, curBand) \ if (curBand - prevBand == newReg->data->numRects - curBand) { \ prevBand = pixman_coalesce(newReg, prevBand, curBand); \ } else { \ prevBand = curBand; \ } /*- *----------------------------------------------------------------------- * pixman_region_appendNonO -- * Handle a non-overlapping band for the union and subtract operations. * Just adds the (top/bottom-clipped) rectangles into the region. * Doesn't have to check for subsumption or anything. * * Results: * None. * * Side Effects: * region->data->numRects is incremented and the rectangles overwritten * with the rectangles we're passed. * *----------------------------------------------------------------------- */ static inline pixman_bool_t pixman_region_appendNonO ( pixman_region16_t * region, pixman_box16_t * r, pixman_box16_t * rEnd, int y1, int y2) { pixman_box16_t * pNextRect; int newRects; newRects = rEnd - r; assert(y1 < y2); assert(newRects != 0); /* Make sure we have enough space for all rectangles to be added */ RECTALLOC(region, newRects); pNextRect = PIXREGION_TOP(region); region->data->numRects += newRects; do { assert(r->x1 < r->x2); ADDRECT(pNextRect, r->x1, y1, r->x2, y2); r++; } while (r != rEnd); return TRUE; } #define FindBand(r, rBandEnd, rEnd, ry1) \ { \ ry1 = r->y1; \ rBandEnd = r+1; \ while ((rBandEnd != rEnd) && (rBandEnd->y1 == ry1)) { \ rBandEnd++; \ } \ } #define AppendRegions(newReg, r, rEnd) \ { \ int newRects; \ if ((newRects = rEnd - r)) { \ RECTALLOC(newReg, newRects); \ memmove((char *)PIXREGION_TOP(newReg),(char *)r, \ newRects * sizeof(pixman_box16_t)); \ newReg->data->numRects += newRects; \ } \ } /*- *----------------------------------------------------------------------- * pixman_op -- * Apply an operation to two regions. Called by pixman_region_union, pixman_region_inverse, * pixman_region_subtract, pixman_region_intersect.... Both regions MUST have at least one * rectangle, and cannot be the same object. * * Results: * TRUE if successful. * * Side Effects: * The new region is overwritten. * pOverlap set to TRUE if overlapFunc ever returns TRUE. * * Notes: * The idea behind this function is to view the two regions as sets. * Together they cover a rectangle of area that this function divides * into horizontal bands where points are covered only by one region * or by both. For the first case, the nonOverlapFunc is called with * each the band and the band's upper and lower extents. For the * second, the overlapFunc is called to process the entire band. It * is responsible for clipping the rectangles in the band, though * this function provides the boundaries. * At the end of each band, the new region is coalesced, if possible, * to reduce the number of rectangles in the region. * *----------------------------------------------------------------------- */ typedef pixman_bool_t (*OverlapProcPtr)( pixman_region16_t *region, pixman_box16_t *r1, pixman_box16_t *r1End, pixman_box16_t *r2, pixman_box16_t *r2End, short y1, short y2, int *pOverlap); static pixman_bool_t pixman_op( pixman_region16_t *newReg, /* Place to store result */ pixman_region16_t * reg1, /* First region in operation */ pixman_region16_t * reg2, /* 2d region in operation */ OverlapProcPtr overlapFunc, /* Function to call for over- * lapping bands */ int appendNon1, /* Append non-overlapping bands */ /* in region 1 ? */ int appendNon2, /* Append non-overlapping bands */ /* in region 2 ? */ int *pOverlap) { pixman_box16_t * r1; /* Pointer into first region */ pixman_box16_t * r2; /* Pointer into 2d region */ pixman_box16_t * r1End; /* End of 1st region */ pixman_box16_t * r2End; /* End of 2d region */ short ybot; /* Bottom of intersection */ short ytop; /* Top of intersection */ pixman_region16_data_t * oldData; /* Old data for newReg */ int prevBand; /* Index of start of * previous band in newReg */ int curBand; /* Index of start of current * band in newReg */ pixman_box16_t * r1BandEnd; /* End of current band in r1 */ pixman_box16_t * r2BandEnd; /* End of current band in r2 */ short top; /* Top of non-overlapping band */ short bot; /* Bottom of non-overlapping band*/ int r1y1; /* Temps for r1->y1 and r2->y1 */ int r2y1; int newSize; int numRects; /* * Break any region computed from a broken region */ if (PIXREGION_NAR (reg1) || PIXREGION_NAR(reg2)) return pixman_break (newReg); /* * Initialization: * set r1, r2, r1End and r2End appropriately, save the rectangles * of the destination region until the end in case it's one of * the two source regions, then mark the "new" region empty, allocating * another array of rectangles for it to use. */ r1 = PIXREGION_RECTS(reg1); newSize = PIXREGION_NUM_RECTS(reg1); r1End = r1 + newSize; numRects = PIXREGION_NUM_RECTS(reg2); r2 = PIXREGION_RECTS(reg2); r2End = r2 + numRects; assert(r1 != r1End); assert(r2 != r2End); oldData = (pixman_region16_data_t *)NULL; if (((newReg == reg1) && (newSize > 1)) || ((newReg == reg2) && (numRects > 1))) { oldData = newReg->data; newReg->data = pixman_region_emptyData; } /* guess at new size */ if (numRects > newSize) newSize = numRects; newSize <<= 1; if (!newReg->data) newReg->data = pixman_region_emptyData; else if (newReg->data->size) newReg->data->numRects = 0; if (newSize > newReg->data->size) { if (!pixman_rect_alloc(newReg, newSize)) { if (oldData) free (oldData); return FALSE; } } /* * Initialize ybot. * In the upcoming loop, ybot and ytop serve different functions depending * on whether the band being handled is an overlapping or non-overlapping * band. * In the case of a non-overlapping band (only one of the regions * has points in the band), ybot is the bottom of the most recent * intersection and thus clips the top of the rectangles in that band. * ytop is the top of the next intersection between the two regions and * serves to clip the bottom of the rectangles in the current band. * For an overlapping band (where the two regions intersect), ytop clips * the top of the rectangles of both regions and ybot clips the bottoms. */ ybot = MIN(r1->y1, r2->y1); /* * prevBand serves to mark the start of the previous band so rectangles * can be coalesced into larger rectangles. qv. pixman_coalesce, above. * In the beginning, there is no previous band, so prevBand == curBand * (curBand is set later on, of course, but the first band will always * start at index 0). prevBand and curBand must be indices because of * the possible expansion, and resultant moving, of the new region's * array of rectangles. */ prevBand = 0; do { /* * This algorithm proceeds one source-band (as opposed to a * destination band, which is determined by where the two regions * intersect) at a time. r1BandEnd and r2BandEnd serve to mark the * rectangle after the last one in the current band for their * respective regions. */ assert(r1 != r1End); assert(r2 != r2End); FindBand(r1, r1BandEnd, r1End, r1y1); FindBand(r2, r2BandEnd, r2End, r2y1); /* * First handle the band that doesn't intersect, if any. * * Note that attention is restricted to one band in the * non-intersecting region at once, so if a region has n * bands between the current position and the next place it overlaps * the other, this entire loop will be passed through n times. */ if (r1y1 < r2y1) { if (appendNon1) { top = MAX(r1y1, ybot); bot = MIN(r1->y2, r2y1); if (top != bot) { curBand = newReg->data->numRects; pixman_region_appendNonO(newReg, r1, r1BandEnd, top, bot); Coalesce(newReg, prevBand, curBand); } } ytop = r2y1; } else if (r2y1 < r1y1) { if (appendNon2) { top = MAX(r2y1, ybot); bot = MIN(r2->y2, r1y1); if (top != bot) { curBand = newReg->data->numRects; pixman_region_appendNonO(newReg, r2, r2BandEnd, top, bot); Coalesce(newReg, prevBand, curBand); } } ytop = r1y1; } else { ytop = r1y1; } /* * Now see if we've hit an intersecting band. The two bands only * intersect if ybot > ytop */ ybot = MIN(r1->y2, r2->y2); if (ybot > ytop) { curBand = newReg->data->numRects; (* overlapFunc)(newReg, r1, r1BandEnd, r2, r2BandEnd, ytop, ybot, pOverlap); Coalesce(newReg, prevBand, curBand); } /* * If we've finished with a band (y2 == ybot) we skip forward * in the region to the next band. */ if (r1->y2 == ybot) r1 = r1BandEnd; if (r2->y2 == ybot) r2 = r2BandEnd; } while (r1 != r1End && r2 != r2End); /* * Deal with whichever region (if any) still has rectangles left. * * We only need to worry about banding and coalescing for the very first * band left. After that, we can just group all remaining boxes, * regardless of how many bands, into one final append to the list. */ if ((r1 != r1End) && appendNon1) { /* Do first nonOverlap1Func call, which may be able to coalesce */ FindBand(r1, r1BandEnd, r1End, r1y1); curBand = newReg->data->numRects; pixman_region_appendNonO(newReg, r1, r1BandEnd, MAX(r1y1, ybot), r1->y2); Coalesce(newReg, prevBand, curBand); /* Just append the rest of the boxes */ AppendRegions(newReg, r1BandEnd, r1End); } else if ((r2 != r2End) && appendNon2) { /* Do first nonOverlap2Func call, which may be able to coalesce */ FindBand(r2, r2BandEnd, r2End, r2y1); curBand = newReg->data->numRects; pixman_region_appendNonO(newReg, r2, r2BandEnd, MAX(r2y1, ybot), r2->y2); Coalesce(newReg, prevBand, curBand); /* Append rest of boxes */ AppendRegions(newReg, r2BandEnd, r2End); } if (oldData) free(oldData); if (!(numRects = newReg->data->numRects)) { freeData(newReg); newReg->data = pixman_region_emptyData; } else if (numRects == 1) { newReg->extents = *PIXREGION_BOXPTR(newReg); freeData(newReg); newReg->data = (pixman_region16_data_t *)NULL; } else { DOWNSIZE(newReg, numRects); } return TRUE; } /*- *----------------------------------------------------------------------- * pixman_set_extents -- * Reset the extents of a region to what they should be. Called by * pixman_region_subtract and pixman_region_intersect as they can't figure it out along the * way or do so easily, as pixman_region_union can. * * Results: * None. * * Side Effects: * The region's 'extents' structure is overwritten. * *----------------------------------------------------------------------- */ static void pixman_set_extents (pixman_region16_t *region) { pixman_box16_t *box, *boxEnd; if (!region->data) return; if (!region->data->size) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; return; } box = PIXREGION_BOXPTR(region); boxEnd = PIXREGION_END(region); /* * Since box is the first rectangle in the region, it must have the * smallest y1 and since boxEnd is the last rectangle in the region, * it must have the largest y2, because of banding. Initialize x1 and * x2 from box and boxEnd, resp., as good things to initialize them * to... */ region->extents.x1 = box->x1; region->extents.y1 = box->y1; region->extents.x2 = boxEnd->x2; region->extents.y2 = boxEnd->y2; assert(region->extents.y1 < region->extents.y2); while (box <= boxEnd) { if (box->x1 < region->extents.x1) region->extents.x1 = box->x1; if (box->x2 > region->extents.x2) region->extents.x2 = box->x2; box++; }; assert(region->extents.x1 < region->extents.x2); } /*====================================================================== * Region Intersection *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_intersectO -- * Handle an overlapping band for pixman_region_intersect. * * Results: * TRUE if successful. * * Side Effects: * Rectangles may be added to the region. * *----------------------------------------------------------------------- */ /*ARGSUSED*/ static pixman_bool_t pixman_region_intersectO (pixman_region16_t *region, pixman_box16_t *r1, pixman_box16_t *r1End, pixman_box16_t *r2, pixman_box16_t *r2End, short y1, short y2, int *pOverlap) { int x1; int x2; pixman_box16_t * pNextRect; pNextRect = PIXREGION_TOP(region); assert(y1 < y2); assert(r1 != r1End && r2 != r2End); do { x1 = MAX(r1->x1, r2->x1); x2 = MIN(r1->x2, r2->x2); /* * If there's any overlap between the two rectangles, add that * overlap to the new region. */ if (x1 < x2) NEWRECT(region, pNextRect, x1, y1, x2, y2); /* * Advance the pointer(s) with the leftmost right side, since the next * rectangle on that list may still overlap the other region's * current rectangle. */ if (r1->x2 == x2) { r1++; } if (r2->x2 == x2) { r2++; } } while ((r1 != r1End) && (r2 != r2End)); return TRUE; } pixman_bool_t pixman_region_intersect (pixman_region16_t * newReg, pixman_region16_t * reg1, pixman_region16_t * reg2) { good(reg1); good(reg2); good(newReg); /* check for trivial reject */ if (PIXREGION_NIL(reg1) || PIXREGION_NIL(reg2) || !EXTENTCHECK(®1->extents, ®2->extents)) { /* Covers about 20% of all cases */ freeData(newReg); newReg->extents.x2 = newReg->extents.x1; newReg->extents.y2 = newReg->extents.y1; if (PIXREGION_NAR(reg1) || PIXREGION_NAR(reg2)) { newReg->data = pixman_brokendata; return FALSE; } else newReg->data = pixman_region_emptyData; } else if (!reg1->data && !reg2->data) { /* Covers about 80% of cases that aren't trivially rejected */ newReg->extents.x1 = MAX(reg1->extents.x1, reg2->extents.x1); newReg->extents.y1 = MAX(reg1->extents.y1, reg2->extents.y1); newReg->extents.x2 = MIN(reg1->extents.x2, reg2->extents.x2); newReg->extents.y2 = MIN(reg1->extents.y2, reg2->extents.y2); freeData(newReg); newReg->data = (pixman_region16_data_t *)NULL; } else if (!reg2->data && SUBSUMES(®2->extents, ®1->extents)) { return pixman_region_copy(newReg, reg1); } else if (!reg1->data && SUBSUMES(®1->extents, ®2->extents)) { return pixman_region_copy(newReg, reg2); } else if (reg1 == reg2) { return pixman_region_copy(newReg, reg1); } else { /* General purpose intersection */ int overlap; /* result ignored */ if (!pixman_op(newReg, reg1, reg2, pixman_region_intersectO, FALSE, FALSE, &overlap)) return FALSE; pixman_set_extents(newReg); } good(newReg); return(TRUE); } #define MERGERECT(r) \ { \ if (r->x1 <= x2) { \ /* Merge with current rectangle */ \ if (r->x1 < x2) *pOverlap = TRUE; \ if (x2 < r->x2) x2 = r->x2; \ } else { \ /* Add current rectangle, start new one */ \ NEWRECT(region, pNextRect, x1, y1, x2, y2); \ x1 = r->x1; \ x2 = r->x2; \ } \ r++; \ } /*====================================================================== * Region Union *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_unionO -- * Handle an overlapping band for the union operation. Picks the * left-most rectangle each time and merges it into the region. * * Results: * TRUE if successful. * * Side Effects: * region is overwritten. * pOverlap is set to TRUE if any boxes overlap. * *----------------------------------------------------------------------- */ static pixman_bool_t pixman_region_unionO ( pixman_region16_t *region, pixman_box16_t *r1, pixman_box16_t *r1End, pixman_box16_t *r2, pixman_box16_t *r2End, short y1, short y2, int *pOverlap) { pixman_box16_t * pNextRect; int x1; /* left and right side of current union */ int x2; assert (y1 < y2); assert(r1 != r1End && r2 != r2End); pNextRect = PIXREGION_TOP(region); /* Start off current rectangle */ if (r1->x1 < r2->x1) { x1 = r1->x1; x2 = r1->x2; r1++; } else { x1 = r2->x1; x2 = r2->x2; r2++; } while (r1 != r1End && r2 != r2End) { if (r1->x1 < r2->x1) MERGERECT(r1) else MERGERECT(r2); } /* Finish off whoever (if any) is left */ if (r1 != r1End) { do { MERGERECT(r1); } while (r1 != r1End); } else if (r2 != r2End) { do { MERGERECT(r2); } while (r2 != r2End); } /* Add current rectangle */ NEWRECT(region, pNextRect, x1, y1, x2, y2); return TRUE; } /* Convenience function for performing union of region with a * single rectangle */ pixman_bool_t pixman_region_union_rect (pixman_region16_t *dest, pixman_region16_t *source, int x, int y, unsigned int width, unsigned int height) { pixman_region16_t region; if (!width || !height) return pixman_region_copy (dest, source); region.data = NULL; region.extents.x1 = x; region.extents.y1 = y; region.extents.x2 = x + width; region.extents.y2 = y + height; return pixman_region_union (dest, source, ®ion); } pixman_bool_t pixman_region_union (pixman_region16_t *newReg, pixman_region16_t *reg1, pixman_region16_t *reg2) { int overlap; /* result ignored */ /* Return TRUE if some overlap * between reg1, reg2 */ good(reg1); good(reg2); good(newReg); /* checks all the simple cases */ /* * Region 1 and 2 are the same */ if (reg1 == reg2) { return pixman_region_copy(newReg, reg1); } /* * Region 1 is empty */ if (PIXREGION_NIL(reg1)) { if (PIXREGION_NAR(reg1)) return pixman_break (newReg); if (newReg != reg2) return pixman_region_copy(newReg, reg2); return TRUE; } /* * Region 2 is empty */ if (PIXREGION_NIL(reg2)) { if (PIXREGION_NAR(reg2)) return pixman_break (newReg); if (newReg != reg1) return pixman_region_copy(newReg, reg1); return TRUE; } /* * Region 1 completely subsumes region 2 */ if (!reg1->data && SUBSUMES(®1->extents, ®2->extents)) { if (newReg != reg1) return pixman_region_copy(newReg, reg1); return TRUE; } /* * Region 2 completely subsumes region 1 */ if (!reg2->data && SUBSUMES(®2->extents, ®1->extents)) { if (newReg != reg2) return pixman_region_copy(newReg, reg2); return TRUE; } if (!pixman_op(newReg, reg1, reg2, pixman_region_unionO, TRUE, TRUE, &overlap)) return FALSE; newReg->extents.x1 = MIN(reg1->extents.x1, reg2->extents.x1); newReg->extents.y1 = MIN(reg1->extents.y1, reg2->extents.y1); newReg->extents.x2 = MAX(reg1->extents.x2, reg2->extents.x2); newReg->extents.y2 = MAX(reg1->extents.y2, reg2->extents.y2); good(newReg); return TRUE; } /*====================================================================== * Batch Rectangle Union *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_append -- * * "Append" the rgn rectangles onto the end of dstrgn, maintaining * knowledge of YX-banding when it's easy. Otherwise, dstrgn just * becomes a non-y-x-banded random collection of rectangles, and not * yet a true region. After a sequence of appends, the caller must * call pixman_region_validate to ensure that a valid region is * constructed. * * Results: * TRUE if successful. * * Side Effects: * dstrgn is modified if rgn has rectangles. * */ pixman_bool_t pixman_region_append (pixman_region16_t * dstrgn, pixman_region16_t * rgn) { int numRects, dnumRects, size; pixman_box16_t *new, *old; int prepend; if (PIXREGION_NAR(rgn)) return pixman_break (dstrgn); if (!rgn->data && (dstrgn->data == pixman_region_emptyData)) { dstrgn->extents = rgn->extents; dstrgn->data = (pixman_region16_data_t *)NULL; return TRUE; } numRects = PIXREGION_NUM_RECTS(rgn); if (!numRects) return TRUE; prepend = FALSE; size = numRects; dnumRects = PIXREGION_NUM_RECTS(dstrgn); if (!dnumRects && (size < 200)) size = 200; /* XXX pick numbers out of a hat */ RECTALLOC(dstrgn, size); old = PIXREGION_RECTS(rgn); if (!dnumRects) dstrgn->extents = rgn->extents; else if (dstrgn->extents.x2 > dstrgn->extents.x1) { pixman_box16_t *first, *last; first = old; last = PIXREGION_BOXPTR(dstrgn) + (dnumRects - 1); if ((first->y1 > last->y2) || ((first->y1 == last->y1) && (first->y2 == last->y2) && (first->x1 > last->x2))) { if (rgn->extents.x1 < dstrgn->extents.x1) dstrgn->extents.x1 = rgn->extents.x1; if (rgn->extents.x2 > dstrgn->extents.x2) dstrgn->extents.x2 = rgn->extents.x2; dstrgn->extents.y2 = rgn->extents.y2; } else { first = PIXREGION_BOXPTR(dstrgn); last = old + (numRects - 1); if ((first->y1 > last->y2) || ((first->y1 == last->y1) && (first->y2 == last->y2) && (first->x1 > last->x2))) { prepend = TRUE; if (rgn->extents.x1 < dstrgn->extents.x1) dstrgn->extents.x1 = rgn->extents.x1; if (rgn->extents.x2 > dstrgn->extents.x2) dstrgn->extents.x2 = rgn->extents.x2; dstrgn->extents.y1 = rgn->extents.y1; } else dstrgn->extents.x2 = dstrgn->extents.x1; } } if (prepend) { new = PIXREGION_BOX(dstrgn, numRects); if (dnumRects == 1) *new = *PIXREGION_BOXPTR(dstrgn); else memmove((char *)new,(char *)PIXREGION_BOXPTR(dstrgn), dnumRects * sizeof(pixman_box16_t)); new = PIXREGION_BOXPTR(dstrgn); } else new = PIXREGION_BOXPTR(dstrgn) + dnumRects; if (numRects == 1) *new = *old; else memmove((char *)new, (char *)old, numRects * sizeof(pixman_box16_t)); dstrgn->data->numRects += numRects; return TRUE; } #define ExchangeRects(a, b) \ { \ pixman_box16_t t; \ t = rects[a]; \ rects[a] = rects[b]; \ rects[b] = t; \ } static void QuickSortRects( pixman_box16_t rects[], int numRects) { int y1; int x1; int i, j; pixman_box16_t *r; /* Always called with numRects > 1 */ do { if (numRects == 2) { if (rects[0].y1 > rects[1].y1 || (rects[0].y1 == rects[1].y1 && rects[0].x1 > rects[1].x1)) ExchangeRects(0, 1); return; } /* Choose partition element, stick in location 0 */ ExchangeRects(0, numRects >> 1); y1 = rects[0].y1; x1 = rects[0].x1; /* Partition array */ i = 0; j = numRects; do { r = &(rects[i]); do { r++; i++; } while (i != numRects && (r->y1 < y1 || (r->y1 == y1 && r->x1 < x1))); r = &(rects[j]); do { r--; j--; } while (y1 < r->y1 || (y1 == r->y1 && x1 < r->x1)); if (i < j) ExchangeRects(i, j); } while (i < j); /* Move partition element back to middle */ ExchangeRects(0, j); /* Recurse */ if (numRects-j-1 > 1) QuickSortRects(&rects[j+1], numRects-j-1); numRects = j; } while (numRects > 1); } /*- *----------------------------------------------------------------------- * pixman_region_validate -- * * Take a ``region'' which is a non-y-x-banded random collection of * rectangles, and compute a nice region which is the union of all the * rectangles. * * Results: * TRUE if successful. * * Side Effects: * The passed-in ``region'' may be modified. * pOverlap set to TRUE if any retangles overlapped, * else FALSE; * * Strategy: * Step 1. Sort the rectangles into ascending order with primary key y1 * and secondary key x1. * * Step 2. Split the rectangles into the minimum number of proper y-x * banded regions. This may require horizontally merging * rectangles, and vertically coalescing bands. With any luck, * this step in an identity transformation (ala the Box widget), * or a coalescing into 1 box (ala Menus). * * Step 3. Merge the separate regions down to a single region by calling * pixman_region_union. Maximize the work each pixman_region_union call does by using * a binary merge. * *----------------------------------------------------------------------- */ pixman_bool_t pixman_region_validate(pixman_region16_t * badreg, int *pOverlap) { /* Descriptor for regions under construction in Step 2. */ typedef struct { pixman_region16_t reg; int prevBand; int curBand; } RegionInfo; int numRects; /* Original numRects for badreg */ RegionInfo *ri; /* Array of current regions */ int numRI; /* Number of entries used in ri */ int sizeRI; /* Number of entries available in ri */ int i; /* Index into rects */ int j; /* Index into ri */ RegionInfo *rit; /* &ri[j] */ pixman_region16_t * reg; /* ri[j].reg */ pixman_box16_t * box; /* Current box in rects */ pixman_box16_t * riBox; /* Last box in ri[j].reg */ pixman_region16_t * hreg; /* ri[j_half].reg */ pixman_bool_t ret = TRUE; *pOverlap = FALSE; if (!badreg->data) { good(badreg); return TRUE; } numRects = badreg->data->numRects; if (!numRects) { if (PIXREGION_NAR(badreg)) return FALSE; good(badreg); return TRUE; } if (badreg->extents.x1 < badreg->extents.x2) { if ((numRects) == 1) { freeData(badreg); badreg->data = (pixman_region16_data_t *) NULL; } else { DOWNSIZE(badreg, numRects); } good(badreg); return TRUE; } /* Step 1: Sort the rects array into ascending (y1, x1) order */ QuickSortRects(PIXREGION_BOXPTR(badreg), numRects); /* Step 2: Scatter the sorted array into the minimum number of regions */ /* Set up the first region to be the first rectangle in badreg */ /* Note that step 2 code will never overflow the ri[0].reg rects array */ ri = (RegionInfo *) pixman_malloc_ab (4, sizeof(RegionInfo)); if (!ri) return pixman_break (badreg); sizeRI = 4; numRI = 1; ri[0].prevBand = 0; ri[0].curBand = 0; ri[0].reg = *badreg; box = PIXREGION_BOXPTR(&ri[0].reg); ri[0].reg.extents = *box; ri[0].reg.data->numRects = 1; badreg->extents = *pixman_region_emptyBox; badreg->data = pixman_region_emptyData; /* Now scatter rectangles into the minimum set of valid regions. If the next rectangle to be added to a region would force an existing rectangle in the region to be split up in order to maintain y-x banding, just forget it. Try the next region. If it doesn't fit cleanly into any region, make a new one. */ for (i = numRects; --i > 0;) { box++; /* Look for a region to append box to */ for (j = numRI, rit = ri; --j >= 0; rit++) { reg = &rit->reg; riBox = PIXREGION_END(reg); if (box->y1 == riBox->y1 && box->y2 == riBox->y2) { /* box is in same band as riBox. Merge or append it */ if (box->x1 <= riBox->x2) { /* Merge it with riBox */ if (box->x1 < riBox->x2) *pOverlap = TRUE; if (box->x2 > riBox->x2) riBox->x2 = box->x2; } else { RECTALLOC_BAIL(reg, 1, bail); *PIXREGION_TOP(reg) = *box; reg->data->numRects++; } goto NextRect; /* So sue me */ } else if (box->y1 >= riBox->y2) { /* Put box into new band */ if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2; if (reg->extents.x1 > box->x1) reg->extents.x1 = box->x1; Coalesce(reg, rit->prevBand, rit->curBand); rit->curBand = reg->data->numRects; RECTALLOC_BAIL(reg, 1, bail); *PIXREGION_TOP(reg) = *box; reg->data->numRects++; goto NextRect; } /* Well, this region was inappropriate. Try the next one. */ } /* for j */ /* Uh-oh. No regions were appropriate. Create a new one. */ if (sizeRI == numRI) { size_t data_size; /* Oops, allocate space for new region information */ sizeRI <<= 1; data_size = sizeRI * sizeof(RegionInfo); if (data_size / sizeRI != sizeof(RegionInfo)) goto bail; rit = (RegionInfo *) realloc(ri, data_size); if (!rit) goto bail; ri = rit; rit = &ri[numRI]; } numRI++; rit->prevBand = 0; rit->curBand = 0; rit->reg.extents = *box; rit->reg.data = (pixman_region16_data_t *)NULL; if (!pixman_rect_alloc(&rit->reg, (i+numRI) / numRI)) /* MUST force allocation */ goto bail; NextRect: ; } /* for i */ /* Make a final pass over each region in order to Coalesce and set extents.x2 and extents.y2 */ for (j = numRI, rit = ri; --j >= 0; rit++) { reg = &rit->reg; riBox = PIXREGION_END(reg); reg->extents.y2 = riBox->y2; if (reg->extents.x2 < riBox->x2) reg->extents.x2 = riBox->x2; Coalesce(reg, rit->prevBand, rit->curBand); if (reg->data->numRects == 1) /* keep unions happy below */ { freeData(reg); reg->data = (pixman_region16_data_t *)NULL; } } /* Step 3: Union all regions into a single region */ while (numRI > 1) { int half = numRI/2; for (j = numRI & 1; j < (half + (numRI & 1)); j++) { reg = &ri[j].reg; hreg = &ri[j+half].reg; if (!pixman_op(reg, reg, hreg, pixman_region_unionO, TRUE, TRUE, pOverlap)) ret = FALSE; if (hreg->extents.x1 < reg->extents.x1) reg->extents.x1 = hreg->extents.x1; if (hreg->extents.y1 < reg->extents.y1) reg->extents.y1 = hreg->extents.y1; if (hreg->extents.x2 > reg->extents.x2) reg->extents.x2 = hreg->extents.x2; if (hreg->extents.y2 > reg->extents.y2) reg->extents.y2 = hreg->extents.y2; freeData(hreg); } numRI -= half; if (!ret) goto bail; } *badreg = ri[0].reg; free(ri); good(badreg); return ret; bail: for (i = 0; i < numRI; i++) freeData(&ri[i].reg); free (ri); return pixman_break (badreg); } /*====================================================================== * Region Subtraction *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_subtractO -- * Overlapping band subtraction. x1 is the left-most point not yet * checked. * * Results: * TRUE if successful. * * Side Effects: * region may have rectangles added to it. * *----------------------------------------------------------------------- */ /*ARGSUSED*/ static pixman_bool_t pixman_region_subtractO ( pixman_region16_t * region, pixman_box16_t * r1, pixman_box16_t * r1End, pixman_box16_t * r2, pixman_box16_t * r2End, short y1, short y2, int *pOverlap) { pixman_box16_t * pNextRect; int x1; x1 = r1->x1; assert(y1x2 <= x1) { /* * Subtrahend entirely to left of minuend: go to next subtrahend. */ r2++; } else if (r2->x1 <= x1) { /* * Subtrahend preceeds minuend: nuke left edge of minuend. */ x1 = r2->x2; if (x1 >= r1->x2) { /* * Minuend completely covered: advance to next minuend and * reset left fence to edge of new minuend. */ r1++; if (r1 != r1End) x1 = r1->x1; } else { /* * Subtrahend now used up since it doesn't extend beyond * minuend */ r2++; } } else if (r2->x1 < r1->x2) { /* * Left part of subtrahend covers part of minuend: add uncovered * part of minuend to region and skip to next subtrahend. */ assert(x1x1); NEWRECT(region, pNextRect, x1, y1, r2->x1, y2); x1 = r2->x2; if (x1 >= r1->x2) { /* * Minuend used up: advance to new... */ r1++; if (r1 != r1End) x1 = r1->x1; } else { /* * Subtrahend used up */ r2++; } } else { /* * Minuend used up: add any remaining piece before advancing. */ if (r1->x2 > x1) NEWRECT(region, pNextRect, x1, y1, r1->x2, y2); r1++; if (r1 != r1End) x1 = r1->x1; } } while ((r1 != r1End) && (r2 != r2End)); /* * Add remaining minuend rectangles to region. */ while (r1 != r1End) { assert(x1x2); NEWRECT(region, pNextRect, x1, y1, r1->x2, y2); r1++; if (r1 != r1End) x1 = r1->x1; } return TRUE; } /*- *----------------------------------------------------------------------- * pixman_region_subtract -- * Subtract regS from regM and leave the result in regD. * S stands for subtrahend, M for minuend and D for difference. * * Results: * TRUE if successful. * * Side Effects: * regD is overwritten. * *----------------------------------------------------------------------- */ pixman_bool_t pixman_region_subtract(pixman_region16_t * regD, pixman_region16_t * regM, pixman_region16_t * regS) { int overlap; /* result ignored */ good(regM); good(regS); good(regD); /* check for trivial rejects */ if (PIXREGION_NIL(regM) || PIXREGION_NIL(regS) || !EXTENTCHECK(®M->extents, ®S->extents)) { if (PIXREGION_NAR (regS)) return pixman_break (regD); return pixman_region_copy(regD, regM); } else if (regM == regS) { freeData(regD); regD->extents.x2 = regD->extents.x1; regD->extents.y2 = regD->extents.y1; regD->data = pixman_region_emptyData; return TRUE; } /* Add those rectangles in region 1 that aren't in region 2, do yucky substraction for overlaps, and just throw away rectangles in region 2 that aren't in region 1 */ if (!pixman_op(regD, regM, regS, pixman_region_subtractO, TRUE, FALSE, &overlap)) return FALSE; /* * Can't alter RegD's extents before we call pixman_op because * it might be one of the source regions and pixman_op depends * on the extents of those regions being unaltered. Besides, this * way there's no checking against rectangles that will be nuked * due to coalescing, so we have to examine fewer rectangles. */ pixman_set_extents(regD); good(regD); return TRUE; } /*====================================================================== * Region Inversion *====================================================================*/ /*- *----------------------------------------------------------------------- * pixman_region_inverse -- * Take a region and a box and return a region that is everything * in the box but not in the region. The careful reader will note * that this is the same as subtracting the region from the box... * * Results: * TRUE. * * Side Effects: * newReg is overwritten. * *----------------------------------------------------------------------- */ pixman_bool_t pixman_region_inverse(pixman_region16_t * newReg, /* Destination region */ pixman_region16_t * reg1, /* Region to invert */ pixman_box16_t * invRect) /* Bounding box for inversion */ { pixman_region16_t invReg; /* Quick and dirty region made from the * bounding box */ int overlap; /* result ignored */ good(reg1); good(newReg); /* check for trivial rejects */ if (PIXREGION_NIL(reg1) || !EXTENTCHECK(invRect, ®1->extents)) { if (PIXREGION_NAR(reg1)) return pixman_break (newReg); newReg->extents = *invRect; freeData(newReg); newReg->data = (pixman_region16_data_t *)NULL; return TRUE; } /* Add those rectangles in region 1 that aren't in region 2, do yucky substraction for overlaps, and just throw away rectangles in region 2 that aren't in region 1 */ invReg.extents = *invRect; invReg.data = (pixman_region16_data_t *)NULL; if (!pixman_op(newReg, &invReg, reg1, pixman_region_subtractO, TRUE, FALSE, &overlap)) return FALSE; /* * Can't alter newReg's extents before we call pixman_op because * it might be one of the source regions and pixman_op depends * on the extents of those regions being unaltered. Besides, this * way there's no checking against rectangles that will be nuked * due to coalescing, so we have to examine fewer rectangles. */ pixman_set_extents(newReg); good(newReg); return TRUE; } /* * RectIn(region, rect) * This routine takes a pointer to a region and a pointer to a box * and determines if the box is outside/inside/partly inside the region. * * The idea is to travel through the list of rectangles trying to cover the * passed box with them. Anytime a piece of the rectangle isn't covered * by a band of rectangles, partOut is set TRUE. Any time a rectangle in * the region covers part of the box, partIn is set TRUE. The process ends * when either the box has been completely covered (we reached a band that * doesn't overlap the box, partIn is TRUE and partOut is false), the * box has been partially covered (partIn == partOut == TRUE -- because of * the banding, the first time this is true we know the box is only * partially in the region) or is outside the region (we reached a band * that doesn't overlap the box at all and partIn is false) */ pixman_region_overlap_t pixman_region_contains_rectangle(pixman_region16_t * region, pixman_box16_t * prect) { int x; int y; pixman_box16_t * pbox; pixman_box16_t * pboxEnd; int partIn, partOut; int numRects; good(region); numRects = PIXREGION_NUM_RECTS(region); /* useful optimization */ if (!numRects || !EXTENTCHECK(®ion->extents, prect)) return(PIXMAN_REGION_OUT); if (numRects == 1) { /* We know that it must be PIXMAN_REGION_IN or PIXMAN_REGION_PART */ if (SUBSUMES(®ion->extents, prect)) return(PIXMAN_REGION_IN); else return(PIXMAN_REGION_PART); } partOut = FALSE; partIn = FALSE; /* (x,y) starts at upper left of rect, moving to the right and down */ x = prect->x1; y = prect->y1; /* can stop when both partOut and partIn are TRUE, or we reach prect->y2 */ for (pbox = PIXREGION_BOXPTR(region), pboxEnd = pbox + numRects; pbox != pboxEnd; pbox++) { if (pbox->y2 <= y) continue; /* getting up to speed or skipping remainder of band */ if (pbox->y1 > y) { partOut = TRUE; /* missed part of rectangle above */ if (partIn || (pbox->y1 >= prect->y2)) break; y = pbox->y1; /* x guaranteed to be == prect->x1 */ } if (pbox->x2 <= x) continue; /* not far enough over yet */ if (pbox->x1 > x) { partOut = TRUE; /* missed part of rectangle to left */ if (partIn) break; } if (pbox->x1 < prect->x2) { partIn = TRUE; /* definitely overlap */ if (partOut) break; } if (pbox->x2 >= prect->x2) { y = pbox->y2; /* finished with this band */ if (y >= prect->y2) break; x = prect->x1; /* reset x out to left again */ } else { /* * Because boxes in a band are maximal width, if the first box * to overlap the rectangle doesn't completely cover it in that * band, the rectangle must be partially out, since some of it * will be uncovered in that band. partIn will have been set true * by now... */ partOut = TRUE; break; } } if (partIn) { if (y < prect->y2) return PIXMAN_REGION_PART; else return PIXMAN_REGION_IN; } else { return PIXMAN_REGION_OUT; } } /* pixman_region_translate (region, x, y) translates in place */ void pixman_region_translate (pixman_region16_t * region, int x, int y) { int x1, x2, y1, y2; int nbox; pixman_box16_t * pbox; good(region); region->extents.x1 = x1 = region->extents.x1 + x; region->extents.y1 = y1 = region->extents.y1 + y; region->extents.x2 = x2 = region->extents.x2 + x; region->extents.y2 = y2 = region->extents.y2 + y; if (((x1 - SHRT_MIN)|(y1 - SHRT_MIN)|(SHRT_MAX - x2)|(SHRT_MAX - y2)) >= 0) { if (region->data && (nbox = region->data->numRects)) { for (pbox = PIXREGION_BOXPTR(region); nbox--; pbox++) { pbox->x1 += x; pbox->y1 += y; pbox->x2 += x; pbox->y2 += y; } } return; } if (((x2 - SHRT_MIN)|(y2 - SHRT_MIN)|(SHRT_MAX - x1)|(SHRT_MAX - y1)) <= 0) { region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; freeData(region); region->data = pixman_region_emptyData; return; } if (x1 < SHRT_MIN) region->extents.x1 = SHRT_MIN; else if (x2 > SHRT_MAX) region->extents.x2 = SHRT_MAX; if (y1 < SHRT_MIN) region->extents.y1 = SHRT_MIN; else if (y2 > SHRT_MAX) region->extents.y2 = SHRT_MAX; if (region->data && (nbox = region->data->numRects)) { pixman_box16_t * pboxout; for (pboxout = pbox = PIXREGION_BOXPTR(region); nbox--; pbox++) { pboxout->x1 = x1 = pbox->x1 + x; pboxout->y1 = y1 = pbox->y1 + y; pboxout->x2 = x2 = pbox->x2 + x; pboxout->y2 = y2 = pbox->y2 + y; if (((x2 - SHRT_MIN)|(y2 - SHRT_MIN)| (SHRT_MAX - x1)|(SHRT_MAX - y1)) <= 0) { region->data->numRects--; continue; } if (x1 < SHRT_MIN) pboxout->x1 = SHRT_MIN; else if (x2 > SHRT_MAX) pboxout->x2 = SHRT_MAX; if (y1 < SHRT_MIN) pboxout->y1 = SHRT_MIN; else if (y2 > SHRT_MAX) pboxout->y2 = SHRT_MAX; pboxout++; } if (pboxout != pbox) { if (region->data->numRects == 1) { region->extents = *PIXREGION_BOXPTR(region); freeData(region); region->data = (pixman_region16_data_t *)NULL; } else pixman_set_extents(region); } } } /* XXX: Do we need this? static pixman_bool_t pixman_region16_data_copy(pixman_region16_t * dst, pixman_region16_t * src) { good(dst); good(src); if (dst->data) return TRUE; if (dst == src) return TRUE; if (!src->data || !src->data->size) { freeData(dst); dst->data = (pixman_region16_data_t *)NULL; return TRUE; } if (!dst->data || (dst->data->size < src->data->numRects)) { freeData(dst); dst->data = allocData(src->data->numRects); if (!dst->data) return pixman_break (dst); } dst->data->size = src->data->size; dst->data->numRects = src->data->numRects; return TRUE; } */ void pixman_region_reset(pixman_region16_t *region, pixman_box16_t *box) { good(region); assert(box->x1<=box->x2); assert(box->y1<=box->y2); region->extents = *box; freeData(region); region->data = (pixman_region16_data_t *)NULL; } /* box is "return" value */ int pixman_region_contains_point(pixman_region16_t * region, int x, int y, pixman_box16_t * box) { pixman_box16_t *pbox, *pboxEnd; int numRects; good(region); numRects = PIXREGION_NUM_RECTS(region); if (!numRects || !INBOX(®ion->extents, x, y)) return(FALSE); if (numRects == 1) { *box = region->extents; return(TRUE); } for (pbox = PIXREGION_BOXPTR(region), pboxEnd = pbox + numRects; pbox != pboxEnd; pbox++) { if (y >= pbox->y2) continue; /* not there yet */ if ((y < pbox->y1) || (x < pbox->x1)) break; /* missed it */ if (x >= pbox->x2) continue; /* not there yet */ *box = *pbox; return(TRUE); } return(FALSE); } int pixman_region_not_empty(pixman_region16_t * region) { good(region); return(!PIXREGION_NIL(region)); } /* XXX: Do we need this? static int pixman_region16_broken(pixman_region16_t * region) { good(region); return (PIXREGION_NAR(region)); } */ void pixman_region_empty(pixman_region16_t * region) { good(region); freeData(region); region->extents.x2 = region->extents.x1; region->extents.y2 = region->extents.y1; region->data = pixman_region_emptyData; } pixman_box16_t * pixman_region_extents(pixman_region16_t * region) { good(region); return(®ion->extents); } #define ExchangeSpans(a, b) \ { \ pixman_region16_point_t tpt; \ int tw; \ \ tpt = spans[a]; spans[a] = spans[b]; spans[b] = tpt; \ tw = widths[a]; widths[a] = widths[b]; widths[b] = tw; \ } /* ||| I should apply the merge sort code to rectangle sorting above, and see if mapping time can be improved. But right now I've been at work 12 hours, so forget it. */ static void QuickSortSpans( pixman_region16_point_t spans[], int widths[], int numSpans) { int y; int i, j, m; pixman_region16_point_t *r; /* Always called with numSpans > 1 */ /* Sorts only by y, doesn't bother to sort by x */ do { if (numSpans < 9) { /* Do insertion sort */ int yprev; yprev = spans[0].y; i = 1; do { /* while i != numSpans */ y = spans[i].y; if (yprev > y) { /* spans[i] is out of order. Move into proper location. */ pixman_region16_point_t tpt; int tw, k; for (j = 0; y >= spans[j].y; j++) {} tpt = spans[i]; tw = widths[i]; for (k = i; k != j; k--) { spans[k] = spans[k-1]; widths[k] = widths[k-1]; } spans[j] = tpt; widths[j] = tw; y = spans[i].y; } /* if out of order */ yprev = y; i++; } while (i != numSpans); return; } /* Choose partition element, stick in location 0 */ m = numSpans / 2; if (spans[m].y > spans[0].y) ExchangeSpans(m, 0); if (spans[m].y > spans[numSpans-1].y) ExchangeSpans(m, numSpans-1); if (spans[m].y > spans[0].y) ExchangeSpans(m, 0); y = spans[0].y; /* Partition array */ i = 0; j = numSpans; do { r = &(spans[i]); do { r++; i++; } while (i != numSpans && r->y < y); r = &(spans[j]); do { r--; j--; } while (y < r->y); if (i < j) ExchangeSpans(i, j); } while (i < j); /* Move partition element back to middle */ ExchangeSpans(0, j); /* Recurse */ if (numSpans-j-1 > 1) QuickSortSpans(&spans[j+1], &widths[j+1], numSpans-j-1); numSpans = j; } while (numSpans > 1); } #define NextBand() \ { \ clipy1 = pboxBandStart->y1; \ clipy2 = pboxBandStart->y2; \ pboxBandEnd = pboxBandStart + 1; \ while (pboxBandEnd != pboxLast && pboxBandEnd->y1 == clipy1) { \ pboxBandEnd++; \ } \ for (; ppt != pptLast && ppt->y < clipy1; ppt++, pwidth++) {} \ } /* Clip a list of scanlines to a region. The caller has allocated the space. FSorted is non-zero if the scanline origins are in ascending order. returns the number of new, clipped scanlines. */ #ifdef XXX_DO_WE_NEED_THIS static int pixman_region16_clip_spans( pixman_region16_t *prgnDst, pixman_region16_point_t *ppt, int *pwidth, int nspans, pixman_region16_point_t *pptNew, int *pwidthNew, int fSorted) { pixman_region16_point_t *pptLast; int *pwidthNewStart; /* the vengeance of Xerox! */ int y, x1, x2; int numRects; good(prgnDst); pptLast = ppt + nspans; pwidthNewStart = pwidthNew; if (!prgnDst->data) { /* Do special fast code with clip boundaries in registers(?) */ /* It doesn't pay much to make use of fSorted in this case, so we lump everything together. */ int clipx1, clipx2, clipy1, clipy2; clipx1 = prgnDst->extents.x1; clipy1 = prgnDst->extents.y1; clipx2 = prgnDst->extents.x2; clipy2 = prgnDst->extents.y2; for (; ppt != pptLast; ppt++, pwidth++) { y = ppt->y; x1 = ppt->x; if (clipy1 <= y && y < clipy2) { x2 = x1 + *pwidth; if (x1 < clipx1) x1 = clipx1; if (x2 > clipx2) x2 = clipx2; if (x1 < x2) { /* part of span in clip rectangle */ pptNew->x = x1; pptNew->y = y; *pwidthNew = x2 - x1; pptNew++; pwidthNew++; } } } /* end for */ } else if ((numRects = prgnDst->data->numRects)) { /* Have to clip against many boxes */ pixman_box16_t *pboxBandStart, *pboxBandEnd; pixman_box16_t *pbox; pixman_box16_t *pboxLast; int clipy1, clipy2; /* In this case, taking advantage of sorted spans gains more than the sorting costs. */ if ((! fSorted) && (nspans > 1)) QuickSortSpans(ppt, pwidth, nspans); pboxBandStart = PIXREGION_BOXPTR(prgnDst); pboxLast = pboxBandStart + numRects; NextBand(); for (; ppt != pptLast; ) { y = ppt->y; if (y < clipy2) { /* span is in the current band */ pbox = pboxBandStart; x1 = ppt->x; x2 = x1 + *pwidth; do { /* For each box in band */ int newx1, newx2; newx1 = x1; newx2 = x2; if (newx1 < pbox->x1) newx1 = pbox->x1; if (newx2 > pbox->x2) newx2 = pbox->x2; if (newx1 < newx2) { /* Part of span in clip rectangle */ pptNew->x = newx1; pptNew->y = y; *pwidthNew = newx2 - newx1; pptNew++; pwidthNew++; } pbox++; } while (pbox != pboxBandEnd); ppt++; pwidth++; } else { /* Move to next band, adjust ppt as needed */ pboxBandStart = pboxBandEnd; if (pboxBandStart == pboxLast) break; /* We're completely done */ NextBand(); } } } return (pwidthNew - pwidthNewStart); } /* find the band in a region with the most rectangles */ static int pixman_region16_find_max_band(pixman_region16_t * prgn) { int nbox; pixman_box16_t * pbox; int nThisBand; int nMaxBand = 0; short yThisBand; good(prgn); nbox = PIXREGION_NUM_RECTS(prgn); pbox = PIXREGION_RECTS(prgn); while(nbox > 0) { yThisBand = pbox->y1; nThisBand = 0; while((nbox > 0) && (pbox->y1 == yThisBand)) { nbox--; pbox++; nThisBand++; } if (nThisBand > nMaxBand) nMaxBand = nThisBand; } return (nMaxBand); } #endif /* XXX_DO_WE_NEED_THIS */ pixman_bool_t pixman_region_selfcheck (reg) pixman_region16_t * reg; { int i, numRects; if ((reg->extents.x1 > reg->extents.x2) || (reg->extents.y1 > reg->extents.y2)) return FALSE; numRects = PIXREGION_NUM_RECTS(reg); if (!numRects) return ((reg->extents.x1 == reg->extents.x2) && (reg->extents.y1 == reg->extents.y2) && (reg->data->size || (reg->data == pixman_region_emptyData))); else if (numRects == 1) return (!reg->data); else { pixman_box16_t * pboxP, * pboxN; pixman_box16_t box; pboxP = PIXREGION_RECTS(reg); box = *pboxP; box.y2 = pboxP[numRects-1].y2; pboxN = pboxP + 1; for (i = numRects; --i > 0; pboxP++, pboxN++) { if ((pboxN->x1 >= pboxN->x2) || (pboxN->y1 >= pboxN->y2)) return FALSE; if (pboxN->x1 < box.x1) box.x1 = pboxN->x1; if (pboxN->x2 > box.x2) box.x2 = pboxN->x2; if ((pboxN->y1 < pboxP->y1) || ((pboxN->y1 == pboxP->y1) && ((pboxN->x1 < pboxP->x2) || (pboxN->y2 != pboxP->y2)))) return FALSE; } return ((box.x1 == reg->extents.x1) && (box.x2 == reg->extents.x2) && (box.y1 == reg->extents.y1) && (box.y2 == reg->extents.y2)); } } pixman_bool_t pixman_region_init_rects (pixman_region16_t *region, pixman_box16_t *boxes, int count) { int overlap; /* if it's 1, then we just want to set the extents, so call * the existing method. */ if (count == 1) { pixman_region_init_rect(region, boxes[0].x1, boxes[0].y1, boxes[0].x2 - boxes[0].x1, boxes[0].y2 - boxes[0].y1); return TRUE; } pixman_region_init(region); /* if it's 0, don't call pixman_rect_alloc -- 0 rectangles is * a special case, and causing pixman_rect_alloc would cause * us to leak memory (because the 0-rect case should be the * static pixman_region_emptyData data). */ if (count == 0) return TRUE; if (!pixman_rect_alloc(region, count)) return FALSE; /* Copy in the rects */ memcpy (PIXREGION_RECTS(region), boxes, sizeof(pixman_box16_t) * count); region->data->numRects = count; /* Validate */ region->extents.x1 = region->extents.x2 = 0; return pixman_region_validate (region, &overlap); } libgdiplus-2.11/pixman/install-sh0000755000175000017500000003325612225470234014026 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libgdiplus-2.11/pixman/configure.ac0000664000175000017500000001574212225470167014317 00000000000000dnl Copyright 2005 Red Hat, Inc. dnl dnl Permission to use, copy, modify, distribute, and sell this software and its dnl documentation for any purpose is hereby granted without fee, provided that dnl the above copyright notice appear in all copies and that both that dnl copyright notice and this permission notice appear in supporting dnl documentation, and that the name of Red Hat not be used in dnl advertising or publicity pertaining to distribution of the software without dnl specific, written prior permission. Red Hat makes no dnl representations about the suitability of this software for any purpose. It dnl is provided "as is" without express or implied warranty. dnl dnl RED HAT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO dnl EVENT SHALL RED HAT BE LIABLE FOR ANY SPECIAL, INDIRECT OR dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR dnl PERFORMANCE OF THIS SOFTWARE. dnl dnl Process this file with autoconf to create configure. AC_PREREQ([2.57]) # Pixman versioning scheme # # - The git version must at all times have an odd MICRO version # number. # # - If you add API, increment the MICRO version to the next largest # odd number. # # - If you release a version that contains new API, then increment # MINOR and set MICRO to 0. # # - If you release a new version that does not contain new API, then # increment MICRO to the next even number. # # - After doing a release, increment MICRO again to make the version # number in git odd. # # - If you break the ABI, then # # - increment MAJOR # # - In the first development release where you break ABI, find # all instances of "pixman-n" and change them to pixman-(n+1) # # This needs to be done at least in # configure.ac # all Makefile.am's # pixman-n.pc.in # # This ensures that binary incompatible versions can be installed # in parallel. See http://www106.pair.com/rhp/parallel.html for # more information m4_define([pixman_major], 0) m4_define([pixman_minor], 10) m4_define([pixman_micro], 0) m4_define([pixman_version],[pixman_major.pixman_minor.pixman_micro]) AC_INIT(pixman, pixman_version, "sandmann@daimi.au.dk", pixman) AM_INIT_AUTOMAKE([dist-bzip2]) AC_CONFIG_HEADERS(config.h) AC_PROG_CC AC_PROG_LIBTOOL AC_CHECK_FUNCS([getisax]) AC_C_BIGENDIAN # # We ignore pixman_major in the version here because the major version should # always be encoded in the actual library name. Ie., the soname is: # # pixman-$(pixman_major).0.minor.micro # m4_define([lt_current], [pixman_minor]) m4_define([lt_revision], [pixman_micro]) m4_define([lt_age], [pixman_minor]) LT_VERSION_INFO="lt_current:lt_revision:lt_age" PIXMAN_VERSION_MAJOR=pixman_major() AC_SUBST(PIXMAN_VERSION_MAJOR) PIXMAN_VERSION_MINOR=pixman_minor() AC_SUBST(PIXMAN_VERSION_MINOR) PIXMAN_VERSION_MICRO=pixman_micro() AC_SUBST(PIXMAN_VERSION_MICRO) AC_SUBST(LT_VERSION_INFO) # Check for dependencies #PKG_CHECK_MODULES(DEP, x11) changequote(,)dnl if test "x$GCC" = "xyes"; then case " $CFLAGS " in *[\ \ ]-Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wall" ;; esac fi changequote([,])dnl dnl ========================================================================= dnl -fvisibility stuff have_gcc4=no AC_MSG_CHECKING(for -fvisibility) AC_COMPILE_IFELSE([ #if defined(__GNUC__) && (__GNUC__ >= 4) #else #error Need GCC 4.0 for visibility #endif int main () { return 0; } ], have_gcc4=yes) if test "x$have_gcc4" = "xyes"; then CFLAGS="$CFLAGS -fvisibility=hidden" fi AC_MSG_RESULT($have_gcc4) dnl =========================================================================== dnl Check for MMX MMX_CFLAGS="-mmmx -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_mmx_intrinsics=no AC_MSG_CHECKING(whether to use MMX intrinsics) xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $MMX_CFLAGS" AC_COMPILE_IFELSE([ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for MMX intrinsics" #endif #include int main () { __m64 v = _mm_cvtsi32_si64 (1); return _mm_cvtsi64_si32 (v); }], have_mmx_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS AC_MSG_RESULT($have_mmx_intrinsics) if test $have_mmx_intrinsics = yes ; then AC_DEFINE(USE_MMX, 1, [use MMX compiler intrinsics]) else MMX_CFLAGS= fi AM_CONDITIONAL(USE_MMX, test $have_mmx_intrinsics = yes) dnl ======================================================= dnl GCC 4.2 when compiling with -msse will generate SSE instructions dnl on its own. This means anything compiled with -mss can only be dnl run after a runtime check for SSE. Unfortunately, since we still dnl need to support MMX-but-not-SSE (such as the OLPC), this means we dnl can only use SSE when compiling for x86-64 (where SSE is always dnl supported). have_sse_intrinsics=no AC_MSG_CHECKING(whether to use SSE intrinsics) xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -msse $MMX_CFLAGS" AC_COMPILE_IFELSE([ #if !defined(__amd64__) && !defined(__x86_64__) #error "Need x86-64 for SSE" #endif #include #include int main () { __m64 v = _mm_cvtsi32_si64 (1); v = _mm_shuffle_pi16 (v, _MM_SHUFFLE(3, 3, 3, 3)); return _mm_cvtsi64_si32 (v); }], have_sse_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS AC_MSG_RESULT($have_sse_intrinsics) if test $have_sse_intrinsics = yes ; then AC_DEFINE(USE_SSE, 1, [use SSE compiler intrinsics]) MMX_CFLAGS="-msse $MMX_CFLAGS" fi AM_CONDITIONAL(USE_SSE, test $have_sse_intrinsics = yes) dnl =========================================================================== dnl Check for SSE2 SSE_CFLAGS="-mmmx -msse2 -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_sse2_intrinsics=no AC_MSG_CHECKING(whether to use SSE2 intrinsics) xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -msse2 $MMX_CFLAGS" AC_COMPILE_IFELSE([ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for SSE2 intrinsics" #endif #include #include int main () { __m128i a, b, c; c = _mm_xor_si128 (a, b); return 0; }], have_sse2_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS AC_MSG_RESULT($have_sse2_intrinsics) if test $have_sse2_intrinsics = yes ; then AC_DEFINE(USE_SSE2, 1, [use SSE compiler intrinsics]) fi AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes) dnl ======================================================== AC_SUBST(MMX_CFLAGS) AC_SUBST(SSE_CFLAGS) PKG_CHECK_MODULES(GTK, [gtk+-2.0], [HAVE_GTK=yes], [HAVE_GTK=no]) AM_CONDITIONAL(HAVE_GTK, [test "x$HAVE_GTK" = xyes]) AC_SUBST(GTK_CFLAGS) AC_SUBST(GTK_LIBS) AC_SUBST(DEP_CFLAGS) AC_SUBST(DEP_LIBS) AC_OUTPUT([pixman-1.pc Makefile pixman/Makefile pixman/pixman-version.h]) libgdiplus-2.11/pixman/aclocal.m40000664000175000017500000125267312225470233013672 00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _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\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _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}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _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}" _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}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _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}" _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}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [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]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _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" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _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' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _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' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _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' else _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' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _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' fi else _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' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _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' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _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~ $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' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _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' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then _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' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _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' ;; *) _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' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _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' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _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' else _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' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $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' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _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' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _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' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _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' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $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~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _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' ;; *) _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _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' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR libgdiplus-2.11/pixman/AUTHORS0000664000175000017500000000000012225470167013056 00000000000000libgdiplus-2.11/pixman/Makefile.am0000664000175000017500000001063212225470167014056 00000000000000SUBDIRS = pixman #pkgconfigdir=$(libdir)/pkgconfig noinst_DATA=pixman-1.pc $(pkgconfig_DATA): pixman-1.pc.in snapshot: distdir="$(distdir)-`date '+%Y%m%d'`"; \ test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git-rev-parse HEAD | cut -c 1-6`; \ $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" dist USERNAME=$$USER RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) RELEASE_CAIRO_HOST = $(USERNAME)@cairographics.org RELEASE_CAIRO_DIR = /srv/cairo.freedesktop.org/www/releases RELEASE_CAIRO_URL = http://cairographics.org/releases RELEASE_XORG_URL = http://xorg.freedesktop.org/archive/individual/lib RELEASE_XORG_HOST = $(USERNAME)@xorg.freedesktop.org RELEASE_XORG_DIR = /srv/xorg.freedesktop.org/archive/individual/lib RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org, xorg-announce@lists.freedesktop.org tar_gz = $(PACKAGE)-$(VERSION).tar.gz tar_bz2 = $(PACKAGE)-$(VERSION).tar.bz2 sha1_tgz = $(tar_gz).sha1 md5_tgz = $(tar_gz).md5 sha1_tbz2 = $(tar_bz2).sha1 md5_tbz2 = $(tar_bz2).md5 gpg_file = $(sha1_tgz).asc $(sha1_tgz): $(tar_gz) sha1sum $^ > $@ $(md5_tgz): $(tar_gz) md5sum $^ > $@ $(sha1_tbz2): $(tar_bz2) sha1sum $^ > $@ $(md5_tbz2): $(tar_bz2) md5sum $^ > $@ $(gpg_file): $(sha1_tgz) @echo "Please enter your GPG password to sign the checksum." gpg --armor --sign $^ release-verify-newer: @echo -n "Checking that no $(VERSION) release already exists at $(RELEASE_XORG_HOST)..." @ssh $(RELEASE_XORG_HOST) test ! -e $(RELEASE_XORG_DIR)/$(tar_gz) \ || (echo "Ouch." && echo "Found: $(RELEASE_XORG_HOST):$(RELEASE_XORG_DIR)/$(tar_gz)" \ && echo "Refusing to try to generate a new release of the same name." \ && false) @ssh $(RELEASE_CAIRO_HOST) test ! -e $(RELEASE_CAIRO_DIR)/$(tar_gz) \ || (echo "Ouch." && echo "Found: $(RELEASE_CAIRO_HOST):$(RELEASE_CAIRO_DIR)/$(tar_gz)" \ && echo "Refusing to try to generate a new release of the same name." \ && false) @echo "Good." release-remove-old: $(RM) $(tar_gz) $(tar_bz2) $(sha1_tgz) $(gpg_file) ensure-prev: @if [[ "$(PREV)" == "" ]]; then \ echo "" && \ echo "You must set the PREV variable on the make command line to" && \ echo "the git tag of the last release." && \ echo "" && \ echo "For example:" && \ echo " make PREV=pixman-0.7.3" && \ echo "" && \ false; \ fi release-check: ensure-prev release-verify-newer release-remove-old distcheck release-upload: release-check $(tar_gz) $(tar_bz2) $(sha1_tgz) $(gpg_file) mkdir -p releases scp $(tar_gz) $(sha1_tgz) $(gpg_file) $(RELEASE_CAIRO_HOST):$(RELEASE_CAIRO_DIR) scp $(tar_gz) $(tar_bz2) $(RELEASE_XORG_HOST):$(RELEASE_XORG_DIR) ssh $(RELEASE_CAIRO_HOST) "rm -f $(RELEASE_CAIRO_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_gz) $(RELEASE_CAIRO_DIR)/LATEST-$(PACKAGE)-$(VERSION)" git-tag -s -m "$(PACKAGE) $(VERSION) release" $(PACKAGE)-$(VERSION) release-publish-message: $(sha1_tgz) $(md5_tgz) $(sha1_tbz2) $(md5_tbz2) ensure-prev @echo "Please follow the instructions in RELEASING to push stuff out and" @echo "send out the announcement mails. Here is the excerpt you need:" @echo "" @echo "Lists: $(RELEASE_ANNOUNCE_LIST)" @echo "Subject: [ANNOUNCE] $(PACKAGE) release $(VERSION) now available" @echo "============================== CUT HERE ==============================" @echo "A new $(PACKAGE) release $(VERSION) is now available" @echo "" @echo "tar.gz:" @echo " $(RELEASE_CAIRO_URL)/$(tar_gz)" @echo " $(RELEASE_XORG_URL)/$(tar_gz)" @echo "" @echo "tar.bz2:" @echo " $(RELEASE_XORG_URL)/$(tar_bz2)" @echo "" @echo "Hashes:" @echo -n " MD5: " @cat $(md5_tgz) @echo -n " MD5: " @cat $(md5_tbz2) @echo -n " SHA1: " @cat $(sha1_tgz) @echo -n " SHA1: " @cat $(sha1_tbz2) @echo "" @echo "GPG signature:" @echo " $(RELEASE_CAIRO_URL)/$(gpg_file)" @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" @echo "" @echo "Git:" @echo " git://git.freedesktop.org/git/pixman" @echo " tag: $(PACKAGE)-$(VERSION)" @echo "" @echo "Log:" @git-log --no-merges "$(PACKAGE)-$(PREV)".."$(PACKAGE)-$(VERSION)" | git shortlog | awk '{ printf "\t"; print ; }' | cut -b0-80 @echo "============================== CUT HERE ==============================" @echo "" release-publish: release-upload release-publish-message .PHONY: release-upload release-publish release-publish-message libgdiplus-2.11/pixman/depcomp0000775000175000017500000004224612225470167013405 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2006-10-15.18 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software # Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test -f "$tmpdepfile"; then : else stripped=`echo "$stripped" | sed 's,^.*/,,'` tmpdepfile="$stripped.u" fi if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then outname="$stripped.o" # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: libgdiplus-2.11/pixman/missing0000775000175000017500000002557712225470167013437 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: libgdiplus-2.11/pixman/ChangeLog0000664000175000017500000000023012225470167013565 000000000000002008-04-23 Sebastien Pouliot * configure.ac: Add same gcc check as MMX to SSE2. Fix build on older bots. Thanks to kangaroo libgdiplus-2.11/pixman/config.guess0000755000175000017500000012743212225470234014342 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 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) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libgdiplus-2.11/pixman/config.h.in0000664000175000017500000000431612225470527014047 00000000000000/* config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `getisax' function. */ #undef HAVE_GETISAX /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* use MMX compiler intrinsics */ #undef USE_MMX /* use SSE compiler intrinsics */ #undef USE_SSE /* use SSE compiler intrinsics */ #undef USE_SSE2 /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif libgdiplus-2.11/pixman/ltmain.sh0000664000175000017500000105162712225470167013654 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION=2.4.2 TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 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)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #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" #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" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -stdlib=* select c++ std lib with clang -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin|-stdlib=*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 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]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 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]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 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]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" 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'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 libgdiplus-2.11/pixman/COPYING0000664000175000017500000000000012225470167013041 00000000000000libgdiplus-2.11/pixman/config.sub0000755000175000017500000010532712225470234014004 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libgdiplus-2.11/pixman/NEWS0000664000175000017500000000000012225470167012505 00000000000000libgdiplus-2.11/pixman/configure0000775000175000017500000146522712225470235013744 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for pixman 0.10.0. # # Report bugs to <"sandmann@daimi.au.dk">. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: "sandmann@daimi.au.dk" about your system, including any $0: error possibly output before this message. Then install $0: a modern shell, or manually run the script under such a $0: shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='pixman' PACKAGE_TARNAME='pixman' PACKAGE_VERSION='0.10.0' PACKAGE_STRING='pixman 0.10.0' PACKAGE_BUGREPORT='"sandmann@daimi.au.dk"' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS DEP_LIBS DEP_CFLAGS HAVE_GTK_FALSE HAVE_GTK_TRUE GTK_LIBS GTK_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG SSE_CFLAGS MMX_CFLAGS USE_SSE2_FALSE USE_SSE2_TRUE USE_SSE_FALSE USE_SSE_TRUE USE_MMX_FALSE USE_MMX_TRUE LT_VERSION_INFO PIXMAN_VERSION_MICRO PIXMAN_VERSION_MINOR PIXMAN_VERSION_MAJOR CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR GTK_CFLAGS GTK_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures pixman 0.10.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/pixman] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of pixman 0.10.0:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path GTK_CFLAGS C compiler flags for GTK, overriding pkg-config GTK_LIBS linker flags for GTK, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to <"sandmann@daimi.au.dk">. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF pixman configure 0.10.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by pixman $as_me 0.10.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='pixman' VERSION='0.10.0' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) 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]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${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' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${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' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$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" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$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" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="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}" module_expsym_cmds="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}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$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' else archive_cmds='$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' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$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' fi else archive_cmds='$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' archive_expsym_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$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' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $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' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: for ac_func in getisax do : ac_fn_c_check_func "$LINENO" "getisax" "ac_cv_func_getisax" if test "x$ac_cv_func_getisax" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_GETISAX 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # # We ignore pixman_major in the version here because the major version should # always be encoded in the actual library name. Ie., the soname is: # # pixman-$(pixman_major).0.minor.micro # LT_VERSION_INFO="10:0:10" PIXMAN_VERSION_MAJOR=0 PIXMAN_VERSION_MINOR=10 PIXMAN_VERSION_MICRO=0 # Check for dependencies #PKG_CHECK_MODULES(DEP, x11) if test "x$GCC" = "xyes"; then case " $CFLAGS " in *[\ \ ]-Wall[\ \ ]*) ;; *) CFLAGS="$CFLAGS -Wall" ;; esac fi have_gcc4=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -fvisibility" >&5 $as_echo_n "checking for -fvisibility... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__GNUC__) && (__GNUC__ >= 4) #else #error Need GCC 4.0 for visibility #endif int main () { return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_gcc4=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test "x$have_gcc4" = "xyes"; then CFLAGS="$CFLAGS -fvisibility=hidden" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_gcc4" >&5 $as_echo "$have_gcc4" >&6; } MMX_CFLAGS="-mmmx -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_mmx_intrinsics=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use MMX intrinsics" >&5 $as_echo_n "checking whether to use MMX intrinsics... " >&6; } xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $MMX_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for MMX intrinsics" #endif #include int main () { __m64 v = _mm_cvtsi32_si64 (1); return _mm_cvtsi64_si32 (v); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_mmx_intrinsics=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$xserver_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_mmx_intrinsics" >&5 $as_echo "$have_mmx_intrinsics" >&6; } if test $have_mmx_intrinsics = yes ; then $as_echo "#define USE_MMX 1" >>confdefs.h else MMX_CFLAGS= fi if test $have_mmx_intrinsics = yes; then USE_MMX_TRUE= USE_MMX_FALSE='#' else USE_MMX_TRUE='#' USE_MMX_FALSE= fi have_sse_intrinsics=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use SSE intrinsics" >&5 $as_echo_n "checking whether to use SSE intrinsics... " >&6; } xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -msse $MMX_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if !defined(__amd64__) && !defined(__x86_64__) #error "Need x86-64 for SSE" #endif #include #include int main () { __m64 v = _mm_cvtsi32_si64 (1); v = _mm_shuffle_pi16 (v, _MM_SHUFFLE(3, 3, 3, 3)); return _mm_cvtsi64_si32 (v); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_sse_intrinsics=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$xserver_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_sse_intrinsics" >&5 $as_echo "$have_sse_intrinsics" >&6; } if test $have_sse_intrinsics = yes ; then $as_echo "#define USE_SSE 1" >>confdefs.h MMX_CFLAGS="-msse $MMX_CFLAGS" fi if test $have_sse_intrinsics = yes; then USE_SSE_TRUE= USE_SSE_FALSE='#' else USE_SSE_TRUE='#' USE_SSE_FALSE= fi SSE_CFLAGS="-mmmx -msse2 -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_sse2_intrinsics=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use SSE2 intrinsics" >&5 $as_echo_n "checking whether to use SSE2 intrinsics... " >&6; } xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -msse2 $MMX_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for SSE2 intrinsics" #endif #include #include int main () { __m128i a, b, c; c = _mm_xor_si128 (a, b); return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_sse2_intrinsics=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$xserver_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_sse2_intrinsics" >&5 $as_echo "$have_sse2_intrinsics" >&6; } if test $have_sse2_intrinsics = yes ; then $as_echo "#define USE_SSE2 1" >>confdefs.h fi if test $have_sse2_intrinsics = yes; then USE_SSE2_TRUE= USE_SSE2_FALSE='#' else USE_SSE2_TRUE='#' USE_SSE2_FALSE= fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5 $as_echo_n "checking for GTK... " >&6; } if test -n "$GTK_CFLAGS"; then pkg_cv_GTK_CFLAGS="$GTK_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GTK_LIBS"; then pkg_cv_GTK_LIBS="$GTK_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "gtk+-2.0" 2>&1` else GTK_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "gtk+-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GTK_PKG_ERRORS" >&5 HAVE_GTK=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } HAVE_GTK=no else GTK_CFLAGS=$pkg_cv_GTK_CFLAGS GTK_LIBS=$pkg_cv_GTK_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } HAVE_GTK=yes fi if test "x$HAVE_GTK" = xyes; then HAVE_GTK_TRUE= HAVE_GTK_FALSE='#' else HAVE_GTK_TRUE='#' HAVE_GTK_FALSE= fi ac_config_files="$ac_config_files pixman-1.pc Makefile pixman/Makefile pixman/pixman-version.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_MMX_TRUE}" && test -z "${USE_MMX_FALSE}"; then as_fn_error $? "conditional \"USE_MMX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SSE_TRUE}" && test -z "${USE_SSE_FALSE}"; then as_fn_error $? "conditional \"USE_SSE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${USE_SSE2_TRUE}" && test -z "${USE_SSE2_FALSE}"; then as_fn_error $? "conditional \"USE_SSE2\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then as_fn_error $? "conditional \"HAVE_GTK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by pixman $as_me 0.10.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to <"sandmann@daimi.au.dk">." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ pixman config.status 0.10.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "pixman-1.pc") CONFIG_FILES="$CONFIG_FILES pixman-1.pc" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "pixman/Makefile") CONFIG_FILES="$CONFIG_FILES pixman/Makefile" ;; "pixman/pixman-version.h") CONFIG_FILES="$CONFIG_FILES pixman/pixman-version.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi libgdiplus-2.11/pixman/pixman-1.pc.in0000664000175000017500000000037612225470167014411 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Pixman Description: The pixman library (version 1) Version: @PACKAGE_VERSION@ Cflags: -I${includedir}/pixman-1 @DEP_CFLAGS@ Libs: -L${libdir} -lpixman-1 @DEP_LIBS@ libgdiplus-2.11/install-sh0000755000175000017500000003325612026454250012531 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2011-01-19.21; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for `test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for `test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libgdiplus-2.11/aclocal.m40000664000175000017500000125622212225470230012365 00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _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\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _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}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _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}" _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}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _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}" _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}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [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]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _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" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _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' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _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' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _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' else _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' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _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' fi else _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' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _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' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _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~ $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' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _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' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then _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' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _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' ;; *) _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' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _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' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _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' else _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' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $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' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _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' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _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' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _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' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $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~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _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' ;; *) _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _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' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2008, # 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless `enable' is passed literally. # For symmetry, `disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [ --][am_maintainer_other][-maintainer-mode am_maintainer_other make rules and dependencies not useful (and sometimes confusing) to the casual installer], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR libgdiplus-2.11/AUTHORS0000664000175000017500000000031312225470167011571 00000000000000The following people made libgdiplus happen: Alexandre Pigolkine Duncan Mak Jordi Mas Mark Steele Miguel de Icaza Ravindra Kumar Vladimir Vukicevic Sanjay Gupta Peter Bartok Hisham Mardam Bey libgdiplus-2.11/tests/0000775000175000017500000000000012225470636011747 500000000000000libgdiplus-2.11/tests/Makefile.in0000664000175000017500000004241612225470350013734 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ noinst_PROGRAMS = testgdi$(EXEEXT) testbits$(EXEEXT) testclip$(EXEEXT) \ testreversepath$(EXEEXT) subdir = tests DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_testbits_OBJECTS = testbits.$(OBJEXT) testbits_OBJECTS = $(am_testbits_OBJECTS) am_testclip_OBJECTS = testclip.$(OBJEXT) testclip_OBJECTS = $(am_testclip_OBJECTS) am_testgdi_OBJECTS = testgdi.$(OBJEXT) testgdi_OBJECTS = $(am_testgdi_OBJECTS) am_testreversepath_OBJECTS = testreversepath.$(OBJEXT) testreversepath_OBJECTS = $(am_testreversepath_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(testbits_SOURCES) $(testclip_SOURCES) $(testgdi_SOURCES) \ $(testreversepath_SOURCES) DIST_SOURCES = $(testbits_SOURCES) $(testclip_SOURCES) \ $(testgdi_SOURCES) $(testreversepath_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPENDENCIES_CFLAGS = @BASE_DEPENDENCIES_CFLAGS@ BASE_DEPENDENCIES_LIBS = @BASE_DEPENDENCIES_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_DIR = @CAIRO_DIR@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ FONTCONFIG_CONFIG = @FONTCONFIG_CONFIG@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ FREETYPE2_LIBS = @FREETYPE2_LIBS@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@ GDIPLUS_LIBS = @GDIPLUS_LIBS@ GDIPLUS_PKG_CFLAGS = @GDIPLUS_PKG_CFLAGS@ GDIPLUS_PKG_LIBS = @GDIPLUS_PKG_LIBS@ GDIPLUS_PKG_REQ = @GDIPLUS_PKG_REQ@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBEXIF_CFLAGS = @LIBEXIF_CFLAGS@ LIBEXIF_LIBS = @LIBEXIF_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = $(GDIPLUS_LIBS) LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = \ -I$(top_srcdir) \ -I$(top_builddir)/src \ -I$(top_srcdir)/src \ $(GDIPLUS_CFLAGS) DEPS = \ $(top_builddir)/src/libgdiplus.la LDADDS = \ $(top_builddir)/src/libgdiplus.la testgdi_DEPENDENCIES = $(TEST_DEPS) testgdi_LDADD = $(LDADDS) testgdi_SOURCES = \ testgdi.c testbits_DEPENDENCIES = $(TEST_DEPS) testbits_LDADD = $(LDADDS) testbits_SOURCES = \ testbits.c testclip_SOURCES = \ testclip.c testclip_DEPENDENCIES = $(TEST_DEPS) testclip_LDADD = $(LDADDS) testreversepath_SOURCES = \ testreversepath.c testreversepath_DEPENDENCIES = $(TEST_DEPS) testreversepath_LDADD = $(LDADDS) EXTRA_DIST = \ $(testgdi_SOURCES) \ $(testbits_SOURCES) \ $(testclip_SOURCES) \ $(testreversepath_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu tests/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list testbits$(EXEEXT): $(testbits_OBJECTS) $(testbits_DEPENDENCIES) $(EXTRA_testbits_DEPENDENCIES) @rm -f testbits$(EXEEXT) $(LINK) $(testbits_OBJECTS) $(testbits_LDADD) $(LIBS) testclip$(EXEEXT): $(testclip_OBJECTS) $(testclip_DEPENDENCIES) $(EXTRA_testclip_DEPENDENCIES) @rm -f testclip$(EXEEXT) $(LINK) $(testclip_OBJECTS) $(testclip_LDADD) $(LIBS) testgdi$(EXEEXT): $(testgdi_OBJECTS) $(testgdi_DEPENDENCIES) $(EXTRA_testgdi_DEPENDENCIES) @rm -f testgdi$(EXEEXT) $(LINK) $(testgdi_OBJECTS) $(testgdi_LDADD) $(LIBS) testreversepath$(EXEEXT): $(testreversepath_OBJECTS) $(testreversepath_DEPENDENCIES) $(EXTRA_testreversepath_DEPENDENCIES) @rm -f testreversepath$(EXEEXT) $(LINK) $(testreversepath_OBJECTS) $(testreversepath_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testbits.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testclip.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testgdi.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testreversepath.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libtool clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am tags uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/tests/testgdi.c0000664000175000017500000001005312225470167013474 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: nil -*- * * testgdi.c : simple test hack * * Authors: * Vladimir Vukicevic * * Based on cairo test code. * * Modify the body of win_draw() to test your own code. */ #include #include #include #include #include "GdiPlusFlat.h" #include typedef struct win { Display *dpy; int scr; Window win; GC gc; int width, height; KeyCode quit_code; } win_t; static void win_init(win_t *win); static void win_deinit(win_t *win); static void win_draw(win_t *win); static void win_handle_events(win_t *win); #define CHECK_GDIP_ST(st) do { if(st != Ok) { g_print("got st: %d expected Ok", st); } } while (0) static void win_draw(win_t *win) { GpGraphics *gp; GpStatus st; GpImage *img; gunichar2 *unis; XClearWindow(win->dpy, win->win); GdipCreateFromXDrawable_linux (win->win, win->dpy, &gp); { GpPen *pen; GpSolidFill *brush; int a = 255; int r = 255; int g = 0; int b = 0; GdipCreatePen1 (a << 24 | r << 16 | g << 8 | b, 10, UnitPixel, &pen); GdipDrawRectangle (gp, pen, 10, 10, 60, 60); GdipDrawLine (gp, pen, 0, 0, 100, 100); GdipCreateSolidFill (a << 24 | r << 16 | g << 8 | b, &brush); printf ("%d\n",GdipFillEllipse (gp, (GpBrush*)brush, 40, 40, 50, 75)); // return; } unis = g_utf8_to_utf16 ("test.jpg", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 0, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("jpg drawn \n"); unis = g_utf8_to_utf16 ("test.tif", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 100, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("tif drawn \n"); unis = g_utf8_to_utf16 ("test.gif", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 200, 0); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("gif drawn \n"); unis = g_utf8_to_utf16 ("test.png", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 0, 100); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("png drawn \n"); unis = g_utf8_to_utf16 ("test.bmp", -1, NULL, NULL, NULL); st = GdipLoadImageFromFile (unis, &img); CHECK_GDIP_ST(st); st = GdipDrawImage (gp, img, 200, 100); CHECK_GDIP_ST(st); g_free (unis); GdipDisposeImage (img); img = NULL; printf("bmp drawn \n"); } int main(int argc, char *argv[]) { win_t win; win.dpy = XOpenDisplay(0); if (win.dpy == NULL) { fprintf(stderr, "Failed to open display\n"); return 1; } win_init(&win); win_draw(&win); win_handle_events(&win); win_deinit(&win); XCloseDisplay(win.dpy); return 0; } static void win_init(win_t *win) { Window root; win->width = 400; win->height = 400; root = DefaultRootWindow(win->dpy); win->scr = DefaultScreen(win->dpy); win->win = XCreateSimpleWindow(win->dpy, root, 0, 0, win->width, win->height, 0, BlackPixel(win->dpy, win->scr), BlackPixel(win->dpy, win->scr)); win->quit_code = XKeysymToKeycode(win->dpy, XStringToKeysym("Q")); XSelectInput(win->dpy, win->win, KeyPressMask |StructureNotifyMask |ExposureMask); XMapWindow(win->dpy, win->win); } static void win_deinit(win_t *win) { XDestroyWindow(win->dpy, win->win); } static void win_handle_events(win_t *win) { XEvent xev; while (1) { XNextEvent(win->dpy, &xev); switch(xev.type) { case KeyPress: { XKeyEvent *kev = &xev.xkey; if (kev->keycode == win->quit_code) { return; } } break; case ConfigureNotify: { XConfigureEvent *cev = &xev.xconfigure; win->width = cev->width; win->height = cev->height; } break; case Expose: { XExposeEvent *eev = &xev.xexpose; if (eev->count == 0) win_draw(win); } break; } } } libgdiplus-2.11/tests/testclip.c0000664000175000017500000000755412225470167013674 00000000000000#ifdef WIN32 #ifndef __cplusplus #error Please compile with a C++ compiler. #endif #include #include #else #include #endif #include #include #include #define C(func) assert(func == Ok) #ifdef WIN32 using namespace Gdiplus; using namespace DllExports; #endif struct bm { BitmapData data; char spoil1[128]; // Space eaten at by the real BitmapData ... }; static void test_gdip_clip() { GpBitmap *bitmap = 0; GpBitmap *other_bitmap = 0; GpGraphics *graphics; GpRegion *clip; GpPath *path; GpPath *other_path; static const int width = 100; static const int height = 100; BYTE *scan0 = (BYTE*) GdipAlloc (width * height * 4); BOOL is_infinite = 0; GpRectF rect; GpRect recti; struct bm bm; struct bm other_bm; rect.X = 0.; rect.Y = 0.; rect.Width = width; rect.Height = height; recti.X = 0; recti.Y = 0; recti.Width = width; recti.Height = height; // Create bitmap C (GdipCreateBitmapFromScan0 (width, height, width * 4, PixelFormat32bppARGB, scan0, &bitmap)); // Get graphics C (GdipGetImageGraphicsContext (bitmap, &graphics)); // Check the clipping region is infinite C (GdipCreateRegion(&clip)); C (GdipGetClip (graphics, clip)); C (GdipIsInfiniteRegion(clip, graphics, &is_infinite)); assert(is_infinite); // Create a path C (GdipCreatePath (FillModeAlternate, &path)); C (GdipAddPathEllipse (path, 0, 0, 3, 2)); C (GdipAddPathBezier (path, 30, 30, 70, 175, 210, 220, 20, 60)); C (GdipAddPathRectangle (path, 200, 200, 60, 60)); C (GdipAddPathArc (path, 0, 0, 150, 120, 30, 120)); C (GdipAddPathEllipse (path, 50, 50, 50, 100)); // Save the infinite clip C (GdipGetClip (graphics, clip)); // Set the path as the clipping region C (GdipSetClipPath (graphics, path, CombineModeReplace)); // Clear the clipped image (foreground) C (GdipGraphicsClear (graphics, 0x8000ff00)); // Reset the clip C (GdipResetClip(graphics)); // Clone the image for future use C (GdipCloneBitmapArea (0., 0., (float)width, (float)height, PixelFormat32bppARGB, bitmap, &other_bitmap)); // Set the path as the clipping region C (GdipSetClipPath (graphics, path, CombineModeExclude)); C (GdipGetClip (graphics, clip)); C (GdipIsInfiniteRegion (clip, graphics, &is_infinite)); assert(!is_infinite); // Clear the clipped image (background) C (GdipGraphicsClear (graphics, 0x80ff0000)); // Now onto the second image // Get the graphics C (GdipGetImageGraphicsContext (other_bitmap, &graphics)); // Get the infinite clip C (GdipGetClip (graphics, clip)); // Dup the path C (GdipClonePath (path, &other_path)); // Add the bounds to it C (GdipGetRegionBounds (clip, graphics, &rect)); C (GdipAddPathRectangles (other_path, &rect, 1)); // Reverse the path C (GdipReversePath (other_path)); // Clip using the reversed path C (GdipSetClipPath (graphics, other_path, CombineModeReplace)); // Clear the clipped image (background) C (GdipGraphicsClear (graphics, 0x80ff0000)); // Compare the two images C (GdipBitmapLockBits (bitmap, &recti, ImageLockModeRead, PixelFormat32bppARGB, &bm.data)); C (GdipBitmapLockBits (other_bitmap, &recti, ImageLockModeRead, PixelFormat32bppARGB, &other_bm.data)); assert (bm.data.Width == other_bm.data.Width); assert (bm.data.Height == other_bm.data.Height); { int *p = (int*)bm.data.Scan0; int *other_p = (int*)other_bm.data.Scan0; int i; for (i = 0; i < width * height; ++i) assert(*p++ == *other_p++); } C (GdipBitmapUnlockBits (bitmap, &bm.data)); C (GdipBitmapUnlockBits (other_bitmap, &other_bm.data)); C (GdipDeleteRegion (clip)); C (GdipDeleteGraphics (graphics)); C (GdipDisposeImage (bitmap)); GdipFree (scan0); } int main(int argc, char**argv) { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); test_gdip_clip(); GdiplusShutdown(gdiplusToken); return 0; } libgdiplus-2.11/tests/Makefile.am0000664000175000017500000000155312225470167013726 00000000000000## Makefile.am for libgdiplus/tests LIBS = $(GDIPLUS_LIBS) INCLUDES = \ -I$(top_srcdir) \ -I$(top_builddir)/src \ -I$(top_srcdir)/src \ $(GDIPLUS_CFLAGS) DEPS = \ $(top_builddir)/src/libgdiplus.la LDADDS = \ $(top_builddir)/src/libgdiplus.la noinst_PROGRAMS = \ testgdi testbits testclip testreversepath testgdi_DEPENDENCIES = $(TEST_DEPS) testgdi_LDADD = $(LDADDS) testgdi_SOURCES = \ testgdi.c testbits_DEPENDENCIES = $(TEST_DEPS) testbits_LDADD = $(LDADDS) testbits_SOURCES = \ testbits.c testclip_SOURCES = \ testclip.c testclip_DEPENDENCIES = $(TEST_DEPS) testclip_LDADD = $(LDADDS) testreversepath_SOURCES = \ testreversepath.c testreversepath_DEPENDENCIES = $(TEST_DEPS) testreversepath_LDADD = $(LDADDS) EXTRA_DIST = \ $(testgdi_SOURCES) \ $(testbits_SOURCES) \ $(testclip_SOURCES) \ $(testreversepath_SOURCES) libgdiplus-2.11/tests/ChangeLog0000664000175000017500000000361512225470167013445 000000000000002007-10-04 Sebastien Pouliot * testgdi.c: Fix segfault. Patch by Yoichi NAKAYAMA. 2007-07-31 Sebastien Pouliot * Makefile.am: Add two new tests; * testclip.c: New test case for #83129 by Yves Bastide. * testreversepath.c: New test case for #81859 by Yves Bastide. 2007-06-21 Sebastien Pouliot * testbits.c, testgdi.c: Fix #81845 to allow using with C++ compilers and -Werror. Patch by Yves Bastide. 2007-06-21 Sebastien Pouliot * testbits.cs: Fix Rgb|Argb definitions. Patch by Yves Bastide. 2007-04-24 Sebastien Pouliot * testbits.cs: Use public header file. Comment stuff that use private API (stuff is not exposed anymore). * testgdi.c: Use public header file and fix warnings. 2007-04-03 Sebastien Pouliot * testgdi.c: Adjust sample as private symbol gdip_graphics_new isn't exported anymore outside libgdiplus. 2006-04-19 Peter Dennis Bartok * testbits.cs: Updated to match new BitmapData and Bitmap structs 2006-02-28 Peter Dennis Bartok * testbits.cs: Fixed bug #144798 (Novell Bugzilla) 2005-10-07 Wade Berrier * testgdi.c: Added missing printf argument 2004-06-11 Sanjay Gupta * test.bmp, test.gif, test.png: Added files to prevent seg fault. * testgdi.c: Minor modification of adding print stmts. 2004-04-23 Vladimir Vukicevic * Makefile.am: removed $(NULL), to deal with older/non-gnu make 2004-04-19 Vladimir Vukicevic * Makefile.am: Added testbits.c * testbits.c: Test LockBits functionality 2004-04-04 Vladimir Vukicevic * testgdi.c: Make the test actually check return values, so that problems can be caught during testing. * testgdi.c: initial commit libgdiplus-2.11/tests/testbits.c0000664000175000017500000001015612225470167013676 00000000000000#include #include #include #include #include "GdiPlusFlat.h" static int status_counter = 0; #define CHECK_STATUS(x) do { if (status != Ok) { printf ("status[%d] == %d!\n", status_counter++, status); if(x) { exit(-1); } } else { printf ("status[%d] == Ok\n", status_counter++); } } while (0) int main (int argc, char **argv) { GpBitmap *bitmap; BitmapData d, q; Rect r; int i, j; unsigned long *lptr; unsigned char *cptr; BYTE *scan0 = (BYTE*) GdipAlloc(10 * 10 * 4); GpStatus status = GdipCreateBitmapFromScan0 (10, 10, 10 * 4, PixelFormat32bppARGB, scan0, &bitmap); CHECK_STATUS(1); printf ("Full rectangle, no format conversion, read only\n"); r.X = 0; r.Y = 0; r.Width = 10; r.Height = 10; status = GdipBitmapLockBits (bitmap, &r, ImageLockModeRead, PixelFormat32bppARGB, &d); CHECK_STATUS(1); printf ("Attempt to re-lock (should fail)\n"); status = GdipBitmapLockBits (bitmap, &r, ImageLockModeRead, PixelFormat32bppARGB, &q); CHECK_STATUS(0); printf ("Unlock\n"); status = GdipBitmapUnlockBits (bitmap, &d); CHECK_STATUS(1); /* lptr = (unsigned long *) bitmap->active_bitmap->scan0; for (j = 0; j < 10; j++) { for (i = 0; i < 10; i++) { *lptr++ = j | j << 8 | i << 16 | i << 24; } } */ memset (&d, 0x00, sizeof (BitmapData)); printf ("\nHalf rectangle, no format conversion, read only\n"); r.X = 5; r.Y = 5; r.Width = 5; r.Height = 5; status = GdipBitmapLockBits (bitmap, &r, ImageLockModeRead, PixelFormat32bppARGB, &d); CHECK_STATUS(1); for (j = 0; j < 5; j++) { lptr = (unsigned long *) d.Scan0 + j * d.Stride; printf ("%d: ", j); for (i = 0; i < 5; i++) { printf ("%08lx ", *lptr++); } printf ("\n"); } printf ("Modifying (setting to 0xff)\n"); memset (d.Scan0, 0xff, d.Stride * d.Height); printf ("Unlocking\n"); status = GdipBitmapUnlockBits (bitmap, &d); CHECK_STATUS(1); /* printf ("Original data after unlock (shouldn't be 0xffffffff): 0x%08x\n", ((unsigned long *)(bitmap->active_bitmap->scan0))[55]); if (((unsigned long *)(bitmap->active_bitmap->scan0))[55] == 0xffffffff) printf ("==> FAIL!\n"); */ memset (&d, 0x00, sizeof (BitmapData)); printf ("\nHalf rectangle, 32bpp ARGB -> 32bpp RGB, read only\n"); r.X = 5; r.Y = 5; r.Width = 5; r.Height = 5; status = GdipBitmapLockBits (bitmap, &r, ImageLockModeRead, PixelFormat32bppRGB, &d); CHECK_STATUS(1); lptr = (unsigned long *) d.Scan0; for (j = 0; j < 5; j++) { printf ("%d: ", j); for (i = 0; i < 5; i++) { printf ("%08lx ", *lptr++); } printf ("\n"); } status = GdipBitmapUnlockBits (bitmap, &d); CHECK_STATUS(1); memset (&d, 0x00, sizeof (BitmapData)); printf ("\nHalf rectangle, 32bpp ARGB -> 24bpp RGB, read/write only\n"); r.X = 5; r.Y = 5; r.Width = 5; r.Height = 5; status = GdipBitmapLockBits (bitmap, &r, ImageLockModeRead | ImageLockModeWrite, PixelFormat24bppRGB, &d); CHECK_STATUS(1); for (j = 0; j < 5; j++) { cptr = (unsigned char *) (d.Scan0 + (j * d.Stride)); printf ("%d: ", j); for (i = 0; i < 5; i++) { printf ("%02x%02x%02x ", cptr[0], cptr[1], cptr[2]); cptr += 3; } printf ("\n"); } printf ("Modifying (setting to 0xaabbcc)\n"); for (j = 0; j < 5; j++) { cptr = (unsigned char *) (d.Scan0 + (j * d.Stride)); for (i = 0; i < 5; i++) { *cptr++ = 0xcc; *cptr++ = 0xbb; *cptr++ = 0xaa; } } status = GdipBitmapUnlockBits (bitmap, &d); CHECK_STATUS(1); /* printf ("Original data after Unlock (should be all 0xffaabbcc):\n"); for (j = 5; j < 10; j++) { lptr = (unsigned long *) (bitmap->active_bitmap->Scan0 + j * bitmap->active_bitmap->Stride) + 5; printf ("%d: ", j); for (i = 5; i < 10; i++) { printf ("%08x ", *lptr++); } printf ("\n"); } */ GdipFree (scan0); return 0; } libgdiplus-2.11/tests/testreversepath.c0000664000175000017500000002036212225470167015265 00000000000000#ifdef WIN32 #ifndef __cplusplus #error Please compile with a C++ compiler. #endif #include #include #else #include #endif #include #include #include #define C(func) assert(func == Ok) #ifdef WIN32 using namespace Gdiplus; using namespace DllExports; #endif static void check_reverse_points(const GpPointF *p1, const GpPointF *p2, int count) { p2 += count; while (count--) { p2--; assert (p1->X == p2->X); assert (p1->Y == p2->Y); p1++; } } static void test_gdip_reversepath() { GpPath *path; int count; int reverse_count; BYTE types[100]; GpPointF points[100]; BYTE reverse_types[100]; GpPointF reverse_points[100]; // Create a path C (GdipCreatePath (FillModeAlternate, &path)); C (GdipGetPointCount (path, &count)); assert (count == 0); // Reverse an empty path C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == 0); // Path with one line C (GdipAddPathLine (path, 0, 10, 1, 11)); C (GdipGetPointCount (path, &count)); assert (count == 2); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == PathPointTypeLine); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == PathPointTypeStart); assert (reverse_types[1] == PathPointTypeLine); GdipResetPath (path); // Closed path with one line C (GdipAddPathLine (path, 0, 10, 1, 11)); C (GdipClosePathFigure (path)); C (GdipGetPointCount (path, &count)); assert (count == 2); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == (PathPointTypeLine | PathPointTypeCloseSubpath)); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == PathPointTypeStart); assert (reverse_types[1] == (PathPointTypeLine | PathPointTypeCloseSubpath)); GdipResetPath (path); // Rectangle C (GdipAddPathRectangle (path, 200, 201, 60, 61)); C (GdipGetPointCount (path, &count)); assert (count == 4); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == PathPointTypeLine); assert (types[2] == PathPointTypeLine); assert (types[3] == (PathPointTypeLine | PathPointTypeCloseSubpath)); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == PathPointTypeStart); assert (reverse_types[1] == PathPointTypeLine); assert (reverse_types[2] == PathPointTypeLine); assert (reverse_types[3] == (PathPointTypeLine | PathPointTypeCloseSubpath)); GdipResetPath (path); // Rectangle, marker C (GdipAddPathRectangle (path, 200, 201, 60, 61)); C (GdipSetPathMarker (path)); C (GdipGetPointCount (path, &count)); assert (count == 4); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == PathPointTypeLine); assert (types[2] == PathPointTypeLine); assert (types[3] == (PathPointTypeLine | PathPointTypeCloseSubpath | PathPointTypePathMarker)); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == PathPointTypeStart); assert (reverse_types[1] == PathPointTypeLine); assert (reverse_types[2] == PathPointTypeLine); assert (reverse_types[3] == (PathPointTypeLine | PathPointTypeCloseSubpath)); GdipResetPath (path); // Elipse and rectangle C (GdipAddPathEllipse (path, 50, 51, 50, 100)); C (GdipAddPathRectangle (path, 200, 201, 60, 61)); C (GdipGetPointCount (path, &count)); assert (count == 17); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[13] == PathPointTypeStart); assert (types[14] == PathPointTypeLine); assert (types[15] == PathPointTypeLine); assert (types[16] == (PathPointTypeLine | PathPointTypeCloseSubpath)); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == types[13]); assert (reverse_types[1] == (types[16] & ~PathPointTypeCloseSubpath)); assert (reverse_types[2] == types[15]); assert (reverse_types[3] == (types[14] | PathPointTypeCloseSubpath)); GdipResetPath (path); // Line, marker, bezier C (GdipAddPathLine (path, 0, 1, 2, 3)); C (GdipSetPathMarker (path)); C (GdipClosePathFigure (path)); C (GdipAddPathBezier (path, 5, 6, 7, 8, 9, 10, 11, 12)); C (GdipClosePathFigure (path)); C (GdipGetPointCount (path, &count)); assert (count == 6); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == (PathPointTypeLine | PathPointTypePathMarker | PathPointTypeCloseSubpath)); assert (types[2] == PathPointTypeStart); assert (types[3] == PathPointTypeBezier); assert (types[4] == PathPointTypeBezier); assert (types[5] == (PathPointTypeBezier | PathPointTypeCloseSubpath)); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == types[2]); assert (reverse_types[1] == types[4]); assert (reverse_types[2] == types[3]); assert (reverse_types[3] == (types[5] | PathPointTypePathMarker)); assert (reverse_types[4] == types[0]); assert (reverse_types[5] == (types[1] & ~PathPointTypePathMarker)); GdipResetPath (path); // Line, marker, line, bezier C (GdipAddPathLine (path, 0, 1, 2, 3)); C (GdipSetPathMarker (path)); C (GdipStartPathFigure (path)); C (GdipAddPathLine (path, 20, 21, 22, 23)); C (GdipAddPathBezier (path, 5, 6, 7, 8, 9, 10, 11, 12)); C (GdipGetPointCount (path, &count)); assert (count == 8); C (GdipGetPathTypes (path, types, count)); C (GdipGetPathPoints (path, points, count)); assert (types[0] == PathPointTypeStart); assert (types[1] == (PathPointTypeLine | PathPointTypePathMarker)); assert (types[2] == PathPointTypeStart); assert (types[3] == PathPointTypeLine); assert (types[4] == PathPointTypeLine); assert (types[5] == PathPointTypeBezier); assert (types[6] == PathPointTypeBezier); assert (types[7] == PathPointTypeBezier); C (GdipReversePath (path)); C (GdipGetPointCount (path, &reverse_count)); assert (reverse_count == count); C (GdipGetPathTypes (path, reverse_types, count)); C (GdipGetPathPoints (path, reverse_points, count)); check_reverse_points (points, reverse_points, count); assert (reverse_types[0] == PathPointTypeStart); assert (reverse_types[1] == PathPointTypeBezier); assert (reverse_types[2] == PathPointTypeBezier); assert (reverse_types[3] == PathPointTypeBezier); assert (reverse_types[4] == PathPointTypeLine); assert (reverse_types[5] == (PathPointTypeLine | PathPointTypePathMarker)); assert (reverse_types[6] == PathPointTypeStart); assert (reverse_types[7] == PathPointTypeLine); C (GdipDeletePath (path)); } int main(int argc, char**argv) { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); test_gdip_reversepath(); GdiplusShutdown(gdiplusToken); return 0; } libgdiplus-2.11/configure.in0000664000175000017500000003376212225470167013050 00000000000000AC_INIT(libgdiplus, [2.11], [https://bugzilla.xamarin.com/enter_bug.cgi?product=Class%20Libraries&component=libgdiplus]) AC_CONFIG_SRCDIR([README]) AC_CANONICAL_SYSTEM AC_CANONICAL_HOST AM_INIT_AUTOMAKE AC_CONFIG_HEADERS([config.h]) AM_MAINTAINER_MODE AM_PROG_LIBTOOL AC_C_BIGENDIAN AC_PATH_PROG(PKG_CONFIG, pkg-config, no) if test "x$PKG_CONFIG" = "xno"; then AC_MSG_ERROR([You need to install pkg-config]) fi GLIB_REQUIRED_VERSION="2.2.3" PKG_CHECK_MODULES(BASE_DEPENDENCIES, glib-2.0 >= $GLIB_REQUIRED_VERSION) GDIPLUS_LIBS="`pkg-config --libs glib-2.0 `" GDIPLUS_CFLAGS="`pkg-config --cflags glib-2.0 `" # libgdiplus bundles its own cairo 1.6.4 but if the system cairo is more recent then we use it instead CAIRO_BUNDLED_VERSION="1.6.4" PKG_CHECK_MODULES(CAIRO, cairo > $CAIRO_BUNDLED_VERSION, [cairo_v=system], [cairo_v=internal]) # Optional use (experimental and unsupported) of Pango's text rendering on top of Cairo AC_ARG_WITH(pango, [ --with-pango],[text_v=pango],[text_v=cairo]) if test $cairo_v = "internal"; then # force subdirectories (cairo, specifically) to build their static # libraries using position independent code. ac_configure_args="$ac_configure_args --with-pic=yes" # disable the PNG, PDF and SVG surface backends of Cairo (unrequired for GDI+) # cairo 1.6.4 bug - we can't disable PDF and keep PS backend - reported at https://bugs.freedesktop.org/show_bug.cgi?id=15532 # ac_configure_args="$ac_configure_args --disable-png --disable-pdf --disable-svg" ac_configure_args="$ac_configure_args --disable-png --disable-svg" # gdiplus mac note; if we have quartz and ft fonts, quartz is the default and gdi+ assumes the latter everywhere, force it out # of the internal build ac_configure_args="$ac_configure_args --disable-quartz-font" AC_CONFIG_SUBDIRS([pixman cairo]) CAIRO_DIR="pixman cairo" CAIRO_LIBS='$(top_builddir)/cairo/src/libcairo.la' CAIRO_CFLAGS='-I$(top_builddir)/pixman/pixman -I$(top_srcdir)/pixman/pixman -I$(top_builddir)/cairo/src -I$(top_srcdir)/cairo/src' cairo_info+="$CAIRO_BUNDLED_VERSION (internal)" AC_DEFINE(USE_INCLUDED_CAIRO,1,[Use Cairo/pixman bundled in libgdiplus]) if test $text_v = "pango"; then AC_MSG_ERROR("Pango text rendering is only possible with --with-cairo=system") fi else CAIRO_DIR="" CAIRO_LIBS="`pkg-config --libs cairo `" CAIRO_CFLAGS="`pkg-config --cflags cairo `" cairo_info="`pkg-config --modversion cairo ` (system)" GDIPLUS_PKG_REQ="cairo" if test $text_v = "pango"; then PANGO_REQUIRED_VERSION="1.10" PKG_CHECK_MODULES(PANGO, pango >= $PANGO_REQUIRED_VERSION) PANGO_LIBS="`pkg-config --libs pangocairo `" PANGO_CFLAGS="`pkg-config --cflags pangocairo `" AC_DEFINE(USE_PANGO_RENDERING,1,[Use Pango to measure and draw text (INCOMPLETE and UNSUPPORTED)]) GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ pangocairo-1.0" fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $CAIRO_LIBS $PANGO_LIBS" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $CAIRO_CFLAGS $PANGO_CFLAGS" # Fall back to using fontconfig/freetype-config if their .pc is not found PKG_CHECK_MODULES(FONTCONFIG, fontconfig, [fontconfig_pkgconfig=yes], [fontconfig_pkgconfig=no]) if test "x$FONTCONFIG" = "xno"; then AC_PATH_PROG(FONTCONFIG_CONFIG, fontconfig-config, no) if test "x$FONTCONFIG_CONFIG" = "xyes"; then FONTCONFIG_CFLAGS="`fontconfig-config --cflags`" FONTCONFIG_LIBS="`fontconfig-config --libs`" fi fi AC_CHECK_LIB(fontconfig, FcInit) AC_CHECK_FUNCS(FcFini) PKG_CHECK_MODULES(FREETYPE2, freetype2, [freetype2_pkgconfig=yes], freetype2_pkgconfig=no]) if test "x$FREETYPE2" = "xno"; then AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) if test "x$FREETYPE_CONFIG" = "xyes"; then FREETYPE2_CFLAGS="`freetype-config --cflags`" FREETYPE2_LIBS="`freetype-config --libs`" fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $FONTCONFIG_LIBS $FREETYPE2_LIBS" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $FONTCONFIG_CFLAGS $FREETYPE2_CFLAGS" AC_CHECK_HEADERS(byteswap.h) AC_MSG_CHECKING([host threading settings]) case "$host" in *-*-mingw*|*-*-cygwin*) AC_DEFINE_UNQUOTED(CYGWIN,1,[Win32]) AC_CHECK_LIB(intl, gettext) ;; *-*-*netbsd*) AC_DEFINE_UNQUOTED(BSDOS,1,[NetBSD]) ;; *-*-*freebsd*) AC_DEFINE_UNQUOTED(BSDOS,1,[FreeBSD]) CFLAGS="-D_THREAD_SAFE $CFLAGS" ;; *-*-*openbsd*) AC_DEFINE_UNQUOTED(BSDOS,1,[OpenBSD]) CFLAGS="$CFLAGS" LIBS="$LIBS" ;; *-*-linux*) AC_DEFINE_UNQUOTED(LINUX,1,[Linux]) AC_CHECK_LIB(pthread, pthread_create) ;; *-*-solaris*) AC_DEFINE_UNQUOTED(SOLARIS,1,[Solaris]) AC_DEFINE_UNQUOTED(_REENTRANT,1,[For libc reentrancy]) CFLAGS="-pthreads $CFLAGS" ;; *-*-darwin*) AC_DEFINE_UNQUOTED(OSX,1,[OS X]) CFLAGS="-no-cpp-precomp $CFLAGS" LDFLAGS="-flat_namespace -undefined suppress $LDFLAGS" no_x=yes ;; *) AC_MSG_RESULT(Unrecognized host $host) AC_DEFINE_UNQUOTED(OTHEROS,1,[Unknown]) ;; esac # Add xrender here so that we don't fail to find glib if we won't have xrender.pc if test "x$no_x" != "xyes"; then GDIPLUS_LIBS="$GDIPLUS_LIBS `pkg-config --libs xrender `" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS `pkg-config --cflags xrender `" fi # Apparently for BSD special handling needs to happen # See http://archives/neohapsis.com/archives/openbsd/2001-11/2142.html # by Miod Vallat AC_CACHE_CHECK( [if compiler recognizes -pthread], myapp_cv_gcc_pthread, ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -pthread" AC_LANG_SAVE AC_LANG_C AC_TRY_LINK([#include ], [void *p = pthread_create;], myapp_cv_gcc_pthread=yes, myapp_cv_gcc_pthread=no) AC_LANG_RESTORE CFLAGS=$ac_save_CFLAGS ) if test $myapp_cv_gcc_pthread = yes then myapp_threads="" CFLAGS="$CFLAGS -pthread" else AC_CHECK_LIB(pthread,pthread_create,myapp_threads=-lpthread, [AC_CHECK_LIB(c_r,pthread_create,myapp_threads=-lc_r)]) fi # sigsetjmp is a macro on some platforms, so can't use AC_CHECK_FUNCS AC_MSG_CHECKING(for sigsetjmp) AC_TRY_LINK([#include ], [ sigjmp_buf env; sigsetjmp(env, 0); ], gdip_ok=yes, gdip_ok=no) AC_MSG_RESULT($gdip_ok) if test "$gdip_ok" = "yes"; then AC_DEFINE(HAVE_SIGSETJMP, 1, sigsetjmp is available) fi # when possible hide stuff we don't want to export AC_MSG_CHECKING(for visibility __attribute__) AC_TRY_COMPILE([], [ void __attribute__ ((visibility ("hidden"))) doit (void) {} void main () { doit (); } ], [ have_visibility_hidden=yes AC_MSG_RESULT(yes) ], [ have_visibility_hidden=no AC_MSG_RESULT(no) ]) case "$host" in i*86-*-*) case $host_os in solaris*) # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. have_visibility_hidden=no esac ;; esac if test "x$have_visibility_hidden" = "xyes"; then AC_DEFINE(HAVE_VISIBILITY_HIDDEN, 1, [Support for the visibility ("hidden") attribute]) fi AC_ARG_WITH(libexif, [AC_HELP_STRING([--without-libexif], [disable EXIF support])]) dnl Test for libjpeg (this needs to be checked before libtiff, since libtiff depends on libjpeg) AC_ARG_WITH([libjpeg], AS_HELP_STRING([--with-libjpeg=PREFIX], [Prefix where libjpeg is installed, or 'no' to disable]), [libjpeg_prefix="$withval"], [libjpeg_prefix="${prefix}"]) if test x$with_libjpeg != xno && test -z "$LIBJPEG"; then JPEG_CFLAGS="-I${libjpeg_prefix}/include" JPEG_LIBS="-L${libjpeg_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$JPEG_CFLAGS save_libs=$LIBS; LIBS=$JPEG_LIBS AC_CHECK_LIB(jpeg, jpeg_destroy_decompress, jpeg_ok=yes, jpeg_ok=no AC_MSG_WARN(*** JPEG loader will not be built (JPEG library not found) ***)) if test "$jpeg_ok" = yes; then AC_MSG_CHECKING([for jpeglib.h]) AC_TRY_CPP( [#include #undef PACKAGE #undef VERSION #undef HAVE_STDLIB_H #include ], jpeg_ok=yes, jpeg_ok=no) AC_MSG_RESULT($jpeg_ok) if test "$jpeg_ok" = yes; then JPEG='jpeg'; LIBJPEG='-L${libjpeg_prefix}/lib -ljpeg' else AC_MSG_WARN(*** JPEG loader will not be built (JPEG header file not found) ***) fi fi CFLAGS=$save_cflags LIBS=$save_libs fi if test x$JPEG != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBJPEG" AC_DEFINE(HAVE_LIBJPEG, 1, Define if jpeg support is available) else jpeg_ok="no (Get it from http://freshmeat.net/projects/libjpeg)" fi dnl Test for libtiff AC_ARG_WITH([libtiff], AS_HELP_STRING([--with-libtiff=PREFIX], [Prefix where libtiff is installed, or 'no' to disable]), [libtiff_prefix="$withval"], [libtiff_prefix="${prefix}"]) if test x$with_libtiff != xno && test -z "$LIBTIFF"; then TIFF_CFLAGS="-I${libjpeg_prefix}/include -I${libtiff_prefix}/include" TIFF_LIBS="-L${libjpeg_prefix}/lib -L${libtiff_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$TIFF_CFLAGS save_libs=$LIBS; LIBS=$TIFF_LIBS AC_CHECK_LIB(tiff, TIFFReadScanline, [AC_CHECK_HEADER(tiffio.h, TIFF='tiff'; LIBTIFF='-ltiff'; tiff_ok=yes, AC_MSG_WARN(*** TIFF loader will not be built (TIFF header files not found) ***))], [AC_CHECK_LIB(tiff, TIFFWriteScanline, [AC_CHECK_HEADER(tiffio.h, TIFF='tiff'; LIBTIFF='-ltiff -ljpeg -lz'; tiff_ok=yes, AC_MSG_WARN(*** TIFF loader will not be built (TIFF header files not found) ***))], [AC_CHECK_LIB(tiff34, TIFFFlushData, [AC_CHECK_HEADER(tiffio.h, TIFF='tiff'; LIBTIFF='-ltiff34 -ljpeg -lz'; tiff_ok=yes, AC_MSG_WARN(*** TIFF loader will not be built (TIFF header files not found) ***))], AC_MSG_WARN(*** TIFF plug-in will not be built (TIFF library not found) ***), -lz -lm)], -ljpeg -lz -lm)], -lm) CFLAGS=$save_cflags LIBS=$save_libs fi if test x$TIFF != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBTIFF" AC_DEFINE(HAVE_LIBTIFF, 1, Define if tiff support is available) else tiff_ok="no (Get it from http://www.libtiff.org/)" fi dnl Test for libgif or libungif AC_ARG_WITH([libgif], AS_HELP_STRING([--with-libgif=PREFIX], [Prefix where libgif is installed, or 'no' to disable]), [libgif_prefix="$withval"], [libgif_prefix="${prefix}"]) if test x$with_libgif != xno && test -z "$LIBGIF"; then GIF_CFLAGS="-I${libgif_prefix}/include" GIF_LIBS="-L${libgif_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$GIF_CFLAGS save_libs=$LIBS; LIBS=$GIF_LIBS AC_CHECK_LIB(gif, DGifOpenFileName, [AC_CHECK_HEADER(gif_lib.h, GIF='gif'; LIBGIF='-lgif'; gif_ok=yes, AC_MSG_WARN(*** GIF loader will not be built (giflibrary not found) ***))], AC_MSG_WARN(*** GIF loader will not be built (giflibrary not found) ***)) AC_CHECK_LIB(ungif, DGifOpenFileName, [AC_CHECK_HEADER(gif_lib.h, GIF='ungif'; LIBGIF='-lungif'; gif_ok=yes, AC_MSG_WARN(*** GIF loader will not be built (ungiflibrary not found) ***))], AC_MSG_WARN(*** GIF loader will not be built (ungiflibrary not found) ***)) CFLAGS=$save_cflags LIBS=$save_libs fi if test x$GIF != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBGIF" AC_DEFINE(HAVE_LIBGIF, 1, Define if gif support is available) else gif_ok="no (See http://sourceforge.net/projects/libgif)" fi dnl Test for libpng AC_MSG_CHECKING(for libpng14) if $PKG_CONFIG --exists libpng14 ; then AC_MSG_RESULT(yes) PNG='png' PNG_DEP_CFLAGS_PACKAGES=libpng14 LIBPNG=`$PKG_CONFIG --libs libpng14` else AC_MSG_CHECKING(for libpng12) if $PKG_CONFIG --exists libpng12 ; then AC_MSG_RESULT(yes) PNG='png' PNG_DEP_CFLAGS_PACKAGES=libpng12 LIBPNG=`$PKG_CONFIG --libs libpng12` else AC_MSG_RESULT(no) AC_CHECK_LIB(png, png_read_info, [AC_CHECK_HEADER(png.h, png_ok=yes, png_ok=no)], AC_MSG_ERROR(*** libpng12 not found. See http://www.libpng.org/pub/png/libpng.html.), -lz -lm) if test "$png_ok" = yes; then AC_MSG_CHECKING([for png_structp in png.h]) AC_TRY_COMPILE([#include ], [png_structp pp; png_infop info; png_colorp cmap; png_create_read_struct;], png_ok=yes, png_ok=no) AC_MSG_RESULT($png_ok) if test "$png_ok" = yes; then PNG='png'; LIBPNG='-lpng -lz' else AC_MSG_ERROR(*** libpng12 found, but it is too old. See http://www.libpng.org/pub/png/libpng.html.) fi else AC_MSG_ERROR(*** libpng12 not found. See http://www.libpng.org/pub/png/libpng.html.) fi fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBPNG" AC_DEFINE(HAVE_LIBPNG, 1, Define if png support is available. Always defined.) dnl Test for libexif if test x$with_libexif != xno && test -z "$LIBEXIF"; then PKG_CHECK_MODULES(LIBEXIF, libexif, [libexif_pkgconfig=yes], libexif_pkgconfig=no]) if test x$libexif_pkgconfig = xyes ; then GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $LIBEXIF_CFLAGS" GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBEXIF_LIBS" AC_DEFINE(HAVE_LIBEXIF, 1, Define if libexif is available.) else libexif_pkgconfig="No. Get it from http://libexif.sourceforge.net/" fi else libexif_pkgconfig="No. You disabled it." fi AM_CONDITIONAL(HAVE_LIBEXIF, test x$libexif_pkgconfig = xyes) dnl dnl Produce a diagnostic, to reduce support time dnl AC_TRY_COMPILE([#include ], [],[x11_failed=false],[x11_failed=true]) if $x11_failed; then AC_ERROR("Failed to compile with X11/Xlib.h include. You must fix your compiler paths") fi GDIPLUS_PKG_LIBS="$GDIPLUS_LIBS" GDIPLUS_PKG_CFLAGS="$GDIPLUS_CFLAGS" AC_SUBST(GDIPLUS_LIBS) AC_SUBST(GDIPLUS_CFLAGS) AC_SUBST(GDIPLUS_PKG_LIBS) AC_SUBST(GDIPLUS_PKG_CFLAGS) AC_SUBST(GDIPLUS_PKG_REQ) AC_SUBST(CAIRO_DIR) AC_OUTPUT([ Makefile libgdiplus.pc libgdiplus0.spec src/Makefile tests/Makefile]) echo "---" echo "Configuration summary" echo "" echo " * Installation prefix = $prefix" echo " * Cairo = $cairo_info" echo " * Text = $text_v" echo " * EXIF tags = $libexif_pkgconfig" echo " * Codecs supported:" echo "" echo " - TIFF: $tiff_ok" echo " - JPEG: $jpeg_ok" echo " - GIF: $gif_ok" echo " - PNG: yes" echo "" echo " NOTE: if any of the above say 'no' you may install the" echo " corresponding development packages for them, rerun" echo " autogen.sh to include them in the build." echo "" echo "---" libgdiplus-2.11/Makefile.am0000664000175000017500000000033512225470167012561 00000000000000SUBDIRS = @CAIRO_DIR@ src tests DIST_SUBDIRS = pixman cairo src tests pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA= libgdiplus.pc DISTCLEANFILES= libgdiplus.pc EXTRA_DIST = libgdiplus.pc.in LICENSE MPL-1.1.html libgdiplus-2.11/depcomp0000755000175000017500000005064312026454250012101 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2012-03-27.16; # UTC # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac # A tabulation character. tab=' ' # A newline character. nl=' ' if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency informations. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' "$nl" < "$tmpdepfile" | ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependent.h'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler anf tcc (Tiny C Compiler) understand '-MD -MF file'. # However on # $CC -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\': # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... # tcc 0.9.26 (FIXME still under development at the moment of writing) # will emit a similar output, but also prepend the continuation lines # with horizontal tabulation characters. "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form 'foo.o: dependent.h', # or 'foo.o: dep1.h dep2.h \', or ' dep3.h dep4.h \'. # Do two passes, one to just change these to # '$object: dependent.h' and one to simply 'dependent.h:'. sed -e "s/^[ $tab][ $tab]*/ /" -e "s,^[^:]*:,$object :," \ < "$tmpdepfile" > "$depfile" sed ' s/[ '"$tab"'][ '"$tab"']*/ /g s/^ *// s/ *\\*$// s/^[^:]*: *// /^$/d /:$/d s/$/ :/ ' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" sed -e 's,^.*\.[a-z]*:['"$tab"' ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test "$stat" = 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed 's:^['"$tab"' ]*[^:'"$tab"' ][^:][^:]*\:['"$tab"' ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' "$nl" < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' "$nl" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libgdiplus-2.11/missing0000755000175000017500000002415212026454250012117 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2012-01-06.13; # UTC # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, # 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file yacc create \`y.tab.[ch]', if possible, from existing .[ch] Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and \`g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # normalize program name to check for. program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). This is about non-GNU programs, so use $1 not # $program. case $1 in lex*|yacc*) # Not GNU programs, they don't have --version. ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $program in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te*) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison*|yacc*) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex*|flex*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG=\${$#} case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit $? fi ;; makeinfo*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: libgdiplus-2.11/ChangeLog0000664000175000017500000002233112225470167012277 000000000000002009-01-02 Sebastien Pouliot * autogen.sh: Rename --with-cairo=system to --skip-cairo. This option allows you to skip the autogen part of cairo and pixman if you're building libgdiplus with a more recent (than 1.6.4) version of cairo. * configure.in: Automatically use the system cairo if it's more recent than the one we have bundled in libgdiplus. * README: Update with changes 2008-08-12 Raja R Harinath * configure.in (FONTCONFIG_CONFIG): Rename from FONTCONFIG-CONFIG. (FREETYPE_CONFIG): Likewise. 2008-05-22 Wade Berrier * configure.in: version bump -> 1.9.1 2008-04-16 Sebastien Pouliot * cairo/configure.in: Fix (at least try to) the Solaris build. 2008-04-16 Geoff Norton * configure.in: Ensure we never build the cairo-font support in our embedded cairo, it breaks gdi+ everywhere on Mac. 2008-04-16 Sebastien Pouliot * cairo/*: Update to Cairo 1.6.4 * pixman/*: New (it's out of Cairo now). Version 0.10 * src/cairo-embed.h: Moved into cairo tree (pixman has it's own too) 2008-01-28 Wade Berrier * configure.in: version bump -> 1.9 2007-12-03 Sebastien Pouliot * configure.in: Disable cairo PNG support since libgdiplus provides it's own (save about 26kb of code size). 2007-11-08 Wade Berrier * configure.in: version bump -> 1.2.6 2007-10-26 Sebastien Pouliot * configure.in: Make sure --without-libgif works (as we also check for libungif) 2007-08-09 Sebastien Pouliot * autogen.sh: Skip running cairo/autogen.sh if we're not using our internal copy of Cairo. * configure.in: Add --with-cairo=internal,system and --with-pango (unsupported) options. * libgdiplus.pc.in: Add additional requirements if the system's Cairo and/or Pango are being used. * Makefile.am: Don't include cairo in SUBDIRS if we're not using our internal copy of Cairo. * NEWS: Link to mono-project.com * README: Added new build options * TODO: refreshed 2007-07-24 Wade Berrier * configure.in: version bump -> 1.2.5 2007-04-24 Sebastien Pouliot * configure.in: Add check for FcFini 2007-04-19 Wade Berrier * configure.in: version bump -> 1.2.4 2007-04-03 Sebastien Pouliot * configure.in: Add check for visibility ("hidden") attribute (based on mono's configure.in) to enable hiding libgdiplus internals. 2007-02-21 Sebastien Pouliot * configure.in: Disable the "newer" PDF and SVG surface backends as they aren't required by GDI+ (saves about 130kb in the .so). 2007-03-16 Wade Berrier * configure.in: version bump -> 1.2.3.50 (RaceToLinux) 2007-02-01 Sebastien Pouliot * TODO: Updated to include bug reports closed because of some Cairo limitations. 2007-01-12 Sebastien Pouliot * TODO: Updated to remove missing ICON decoder and functions GdipCreateBitmapFromHICON and GdipCreateHICONFromBitmap. Also removed comments about DEBUG_MEMLEAKS as it's better to use valgrind. 2007-01-04 Wade Berrier * configure.in: * libgdiplus.pc.in: Remove CAIRO_CFLAGS and CAIRO_LIBS from libgdiplus.pc. Fixes: bxc: #79889 2006-11-17 Wade Berrier * configure.in: version bump -> 1.2.1 2006-11-02 Wade Berrier * configure.in: version bump -> 1.2 2006-08-23 Wade Berrier * cairo/configure.in: Use a backward compatible method of finding pkg-config instead of the >= 0.16 macro. 2006-08-15 Gonzalo Paniagua Javier * configure.in: properly disable exif support when asked to do so. 2006-08-13 Gonzalo Paniagua Javier * configure.in: if libexif is available use it. 2006-07-21 Alexander Olk * cairo/src/cairo-xlib-surface.c: Backported a patch from cairo head that removes XSync implementation of surface_flush. (git commit b7191885c88068dad57d68ced69a752d1162b12c) 2006-07-13 Wade Berrier * configure.in: separate xrender pkg-config statement from the glib statement. If xrender.pc isn't found, the glib settings are not gathered. 2006-07-12 Chris Toshok * configure.in: add --with-pics=yes for subdir configure args. 2006-07-11 Peter Dennis Bartok * Updated to cairo 1.2 2006-06-08 Sebastien Pouliot * TODO: Updated status for GdipIsVisiblePathPoint[I] functions. 2006-06-07 Sebastien Pouliot * TODO: Updated to add status for GdipIsOutlineVisiblePathPoint[I] and GdipIsVisiblePathPoint[I] functions. 2006-05-25 Sebastien Pouliot * TODO: Updated to remove GdipSetClipHrgn and to add a few more details. 2006-05-25 Gonzalo Paniagua Javier * configure.in: made libpng12 mandatory. The resources used in SWF are png files. 2006-05-05 Sebastien Pouliot * TODO: Added a few details about some not-quite-supported API. 2006-05-02 Sebastien Pouliot * TODO: Removed GdipBeginContainer and GdipEndContainer from the list of unimplemented functions. Added note for GdipAddString[I] about the partial support for both functions. 2006-04-28 Wade Berrier * configure.in: Fallback to -config if .pc files are not found for freetype and fontconfig 2006-04-21 Peter Dennis Bartok * TODO: Removed newly implemented items from the list 2006-03-29 Gonzalo Paniagua Javier * src/image.c: avoid double-freeing Scan0 twice. Fixes bug #77910. 2006-01-31 Sebastien Pouliot * TODO: Remove GdipCreateRegionPath. GdipFlattenPath and GdipSetClipPath from the list if unimplemented functions. 2006-01-13 Peter Dennis Bartok * libgdiplus.pc.in: Removed cairo as a dependency. Fixes #77173 2006-01-09 Everaldo Canuto * Fix cairo compilation problems when used gcc 4.0.2. 2006-01-04 Peter Dennis Bartok * configure.in: - ungif check was using cached gif check result. Fixed by changing name of ungif check to be different from gif check. - Removed unused cairo check 2005-09-19 Jordi Mas * configure.in: Keep also libungif support on top of libgif 2005-10-17 Ruediger Oertel * configure.in: Switching from libungif to libgif 2005-09-19 Jordi Mas * Added TODO file 2005-09-13 Jordi Mas * configure.in: 1.1.9 (It was only changed in the mono-1-1-9 tag) 2005-09-12 Jordi Mas * configure.in: comment out linking with installed Cairo options until we supported again 2005-08-25 Hisham Mardam Bey * Upgrade Cairo to 1.0 release * Added INSTALL file 2005-06-10 Ben Maurer * configure.in: 1.1.8 2005-06-02 Peter Bartok * configure.in: Added URLs to help people find the image libraries (suggested by Gonzalo) 2005-05-03 Ben Maurer * configure.in: 1.1.7 2005-03-22 Raja R Harinath * configure.in (CAIRO_CFLAGS): Work with builddir != srcdir. 2005-01-26 Geoff Norton * configure.in: Add AC_C_BIGENDIAN check to define WORDS_BIGENDIAN where needed Tue Jan 25 11:34:41 CET 2005 Paolo Molaro * configure.in, Makefile.am, cairo, libpixman: imported the cairo sources so it's easier to track the right version. 2005-01-23 Peter Bartok * configure.in: - Bumped required cairo version to *exactly* 0.3.0. After that version, there are major changes that we don't track yet. - Added detection define for post 0.3.0 suppor 2005-01-18 Geoff Norton * configure.in: Bump required cairo version to 0.2.0. We dont support 0.1.x anymore 2004-07-04 Peter Bartok * configure.in: Added fix for bug #60787, added dependency definitons for pthreads (Mark Recht [recht at netbsd.org] verified the fix) 2004-05-27 Jordi Mas * configure.in. make libpng optional depending on the user's system 2004-05-20 Gonzalo Paniagua Javier * libgdiplus.pc.in: cairo package name is not cairo-0.1.17. 2004-05-14 Gonzalo Paniagua Javier * configure.in: added configuration summary. 2004-05-05 Ravindra * configure.in: We need cairo 0.1.22 version. 2004-04-17 Vladimir Vukicevic * configure.in: fixed gdip_ok -> $gdip_ok in sigsetjmp check 2004-04-04 Vladimir Vukicevic * configure.in: "libpng", not "libgpng" * configure.in: Add checks for libungif and libpng. Added sigsetjmp check. * configure.in: Added checks for libtiff and libjpeg. Cribbed from gtk. Also added in test/Makefile target. 2004-01-31 Miguel de Icaza * Initial release, split from the Mono's MCS package. libgdiplus-2.11/libgdiplus0.spec.in0000664000175000017500000000315012225470167014222 00000000000000%define real_name libgdiplus # There may be strange bugs when using the system cairo %define system_cairo 0 Name: libgdiplus0 Version: @VERSION@ Release: 0 License: LGPL v2.1 only ; MPL ; MIT License (or similar) Url: http://go-mono.org/ Source0: %{real_name}-%{version}.tar.bz2 Summary: Open Source Implementation of the GDI+ API Group: Development/Libraries/Other BuildRoot: %{_tmppath}/%{name}-%{version}-build Obsoletes: libgdiplus-devel Provides: libgdiplus-devel Obsoletes: libgdiplus Provides: libgdiplus %if %system_cairo BuildRequires: cairo-devel >= 1.6.4 %endif BuildRequires: fontconfig-devel BuildRequires: freetype2-devel BuildRequires: giflib-devel BuildRequires: glib2-devel BuildRequires: libexif-devel BuildRequires: libjpeg-devel BuildRequires: libpng-devel BuildRequires: libtiff-devel BuildRequires: xorg-x11-libXrender-devel %description This is part of the Mono project. It is required when using Windows.Forms. %files %defattr(-, root, root) %_libdir/libgdiplus.so* %_libdir/pkgconfig/libgdiplus.pc %doc AUTHORS COPYING ChangeLog* NEWS README %prep %setup -q -n %{real_name}-%{version} %build export CFLAGS="$RPM_OPT_FLAGS" %configure make %install make install DESTDIR=%{buildroot} # Unwanted files: rm -f %{buildroot}%{_libdir}/libgdiplus.a rm -f %{buildroot}%{_libdir}/libgdiplus.la # Remove generic non-usefull INSTALL file... (appeases # suse rpmlint checks, saves 3kb) find . -name INSTALL | xargs rm -f %clean rm -rf "$RPM_BUILD_ROOT" %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %changelog libgdiplus-2.11/config.guess0000755000175000017500000012743211772274120013050 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-02-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner. Please send patches (context # diff format) to and include a ChangeLog # entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-gnueabi else echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) LIBC=gnu eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 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) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in i386) eval $set_cc_for_build if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then UNAME_PROCESSOR="x86_64" fi fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libgdiplus-2.11/LICENSE0000664000175000017500000000014312225470167011527 00000000000000Libgdiplus is licensed under the terms of the GNU Library GPL or the Mozilla Public License 1.1. libgdiplus-2.11/config.h.in0000664000175000017500000000633412225470230012544 00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* OpenBSD */ #undef BSDOS /* Win32 */ #undef CYGWIN /* Define to 1 if you have the header file. */ #undef HAVE_BYTESWAP_H /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `FcFini' function. */ #undef HAVE_FCFINI /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if libexif is available. */ #undef HAVE_LIBEXIF /* Define to 1 if you have the `fontconfig' library (-lfontconfig). */ #undef HAVE_LIBFONTCONFIG /* Define if gif support is available */ #undef HAVE_LIBGIF /* Define to 1 if you have the `intl' library (-lintl). */ #undef HAVE_LIBINTL /* Define if jpeg support is available */ #undef HAVE_LIBJPEG /* Define if png support is available. Always defined. */ #undef HAVE_LIBPNG /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define if tiff support is available */ #undef HAVE_LIBTIFF /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* sigsetjmp is available */ #undef HAVE_SIGSETJMP /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Support for the visibility ("hidden") attribute */ #undef HAVE_VISIBILITY_HIDDEN /* Linux */ #undef LINUX /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* OS X */ #undef OSX /* Unknown */ #undef OTHEROS /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Solaris */ #undef SOLARIS /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Use Cairo/pixman bundled in libgdiplus */ #undef USE_INCLUDED_CAIRO /* Use Pango to measure and draw text (INCOMPLETE and UNSUPPORTED) */ #undef USE_PANGO_RENDERING /* Version number of package */ #undef VERSION /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* For libc reentrancy */ #undef _REENTRANT libgdiplus-2.11/ltmain.sh0000644000175000017500000105204412225470346012347 00000000000000 # libtool (GNU libtool) 2.4.2 # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, # 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, # or obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Usage: $progname [OPTION]... [MODE-ARG]... # # Provide generalized library-building support services. # # --config show all configuration variables # --debug enable verbose shell tracing # -n, --dry-run display commands without modifying any files # --features display basic configuration information and exit # --mode=MODE use operation mode MODE # --preserve-dup-deps don't remove duplicate dependency libraries # --quiet, --silent don't print informational messages # --no-quiet, --no-silent # print informational messages (default) # --no-warn don't display warning messages # --tag=TAG use configuration variables from tag TAG # -v, --verbose print more informational messages than default # --no-verbose don't print the extra informational messages # --version print version information # -h, --help, --help-all print short, long, or detailed help message # # MODE must be one of the following: # # clean remove files from the build directory # compile compile a source file into a libtool object # execute automatically set library path, then run a program # finish complete the installation of libtool libraries # install install libraries or executables # link create a library or an executable # uninstall remove libraries from an installed directory # # MODE-ARGS vary depending on the MODE. When passed as first option, # `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. # Try `$progname --help --mode=MODE' for a more detailed description of MODE. # # When reporting a bug, please describe a test case to reproduce it and # include the following information: # # host-triplet: $host # shell: $SHELL # compiler: $LTCC # compiler flags: $LTCFLAGS # linker: $LD (gnu? $with_gnu_ld) # $progname: (GNU libtool) 2.4.2 Debian-2.4.2-1.2ubuntu1 # automake: $automake_version # autoconf: $autoconf_version # # Report bugs to . # GNU libtool home page: . # General help using GNU software: . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.2 Debian-2.4.2-1.2ubuntu1" TIMESTAMP="" package_revision=1.3337 # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # NLS nuisances: We save the old values to restore during execute mode. lt_user_locale= lt_safe_locale= for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${$lt_var+set}\" = set; then save_$lt_var=\$$lt_var $lt_var=C export $lt_var lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\" lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\" fi" done LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL $lt_unset CDPATH # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath="$0" : ${CP="cp -f"} test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} : ${Xsed="$SED -e 1s/^X//"} # Global variables: EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. exit_status=$EXIT_SUCCESS # Make sure IFS has a sensible default lt_nl=' ' IFS=" $lt_nl" dirname="s,/[^/]*$,," basename="s,^.*/,," # func_dirname file append nondir_replacement # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. func_dirname () { func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi } # func_dirname may be replaced by extended shell implementation # func_basename file func_basename () { func_basename_result=`$ECHO "${1}" | $SED "$basename"` } # func_basename may be replaced by extended shell implementation # func_dirname_and_basename file append nondir_replacement # perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # Implementation must be kept synchronized with func_dirname # and func_basename. For efficiency, we do not delegate to # those functions but instead duplicate the functionality here. func_dirname_and_basename () { # Extract subdirectory from the argument. func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` if test "X$func_dirname_result" = "X${1}"; then func_dirname_result="${3}" else func_dirname_result="$func_dirname_result${2}" fi func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` } # func_dirname_and_basename may be replaced by extended shell implementation # func_stripname prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # func_strip_suffix prefix name func_stripname () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname may be replaced by extended shell implementation # These SED scripts presuppose an absolute path with a trailing slash. pathcar='s,^/\([^/]*\).*$,\1,' pathcdr='s,^/[^/]*,,' removedotparts=':dotsl s@/\./@/@g t dotsl s,/\.$,/,' collapseslashes='s@/\{1,\}@/@g' finalslash='s,/*$,/,' # func_normal_abspath PATH # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. # value returned in "$func_normal_abspath_result" func_normal_abspath () { # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` while :; do # Processed it all yet? if test "$func_normal_abspath_tpath" = / ; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result" ; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_relative_path SRCDIR DSTDIR # generates a relative path from SRCDIR to DSTDIR, with a trailing # slash if non-empty, suitable for immediately appending a filename # without needing to append a separator. # value returned in "$func_relative_path_result" func_relative_path () { func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=${func_dirname_result} if test "x$func_relative_path_tlibdir" = x ; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test "x$func_stripname_result" != x ; then func_relative_path_result=${func_relative_path_result}/${func_stripname_result} fi # Normalisation. If bindir is libdir, return empty string, # else relative path ending with a slash; either way, target # file name can be directly appended. if test ! -z "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result/" func_relative_path_result=$func_stripname_result fi } # The name of this program: func_dirname_and_basename "$progpath" progname=$func_basename_result # Make sure we have an absolute path for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=$func_dirname_result progdir=`cd "$progdir" && pwd` progpath="$progdir/$progname" ;; *) save_IFS="$IFS" IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS="$save_IFS" test -x "$progdir/$progname" && break done IFS="$save_IFS" test -n "$progdir" || progdir=`pwd` progpath="$progdir/$progname" ;; esac # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. Xsed="${SED}"' -e 1s/^X//' sed_quote_subst='s/\([`"$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # Sed substitution that converts a w32 file name or path # which contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. # Since each input `\' is now two `\'s, look for any number of runs of # four `\'s followed by two `\'s and then a '$'. `\' that '$'. bs='\\' bs2='\\\\' bs4='\\\\\\\\' dollar='\$' sed_double_backslash="\ s/$bs4/&\\ /g s/^$bs2$dollar/$bs&/ s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g s/\n//g" # Standard options: opt_dry_run=false opt_help=false opt_quiet=false opt_verbose=false opt_warning=: # func_echo arg... # Echo program name prefixed message, along with the current mode # name if it has been set yet. func_echo () { $ECHO "$progname: ${opt_mode+$opt_mode: }$*" } # func_verbose arg... # Echo program name prefixed message in verbose mode only. func_verbose () { $opt_verbose && func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_error arg... # Echo program name prefixed message to standard error. func_error () { $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 } # func_warning arg... # Echo program name prefixed warning message to standard error. func_warning () { $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 # bash bug again: : } # func_fatal_error arg... # Echo program name prefixed message to standard error, and exit. func_fatal_error () { func_error ${1+"$@"} exit $EXIT_FAILURE } # func_fatal_help arg... # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { func_error ${1+"$@"} func_fatal_error "$help" } help="Try \`$progname --help' for more information." ## default # func_grep expression filename # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $GREP "$1" "$2" >/dev/null 2>&1 } # func_mkdir_p directory-path # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { my_directory_path="$1" my_dir_list= if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then # Protect directory names starting with `-' case $my_directory_path in -*) my_directory_path="./$my_directory_path" ;; esac # While some portion of DIR does not yet exist... while test ! -d "$my_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. my_dir_list="$my_directory_path:$my_dir_list" # If the last portion added has no slash in it, the list is done case $my_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` done my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` save_mkdir_p_IFS="$IFS"; IFS=':' for my_dir in $my_dir_list; do IFS="$save_mkdir_p_IFS" # mkdir can fail with a `File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$my_dir" 2>/dev/null || : done IFS="$save_mkdir_p_IFS" # Bail out if we (or some other process) failed to create a directory. test -d "$my_directory_path" || \ func_fatal_error "Failed to create \`$1'" fi } # func_mktempdir [string] # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, STRING is the basename for that directory. func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" if test "$opt_dry_run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else # If mktemp works, use that first and foremost my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race my_tmpdir="${my_template}-${RANDOM-0}$$" save_mktempdir_umask=`umask` umask 0077 $MKDIR "$my_tmpdir" umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$my_tmpdir" || \ func_fatal_error "cannot create temporary directory \`$my_tmpdir'" fi $ECHO "$my_tmpdir" } # func_quote_for_eval arg # Aesthetically quote ARG to be evaled later. # This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT # is double-quoted, suitable for a subsequent eval, whereas # FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters # which are still active within double quotes backslashified. func_quote_for_eval () { case $1 in *[\\\`\"\$]*) func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; *) func_quote_for_eval_unquoted_result="$1" ;; esac case $func_quote_for_eval_unquoted_result in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and and variable # expansion for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" ;; *) func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" esac } # func_quote_for_expand arg # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { case $1 in *[\\\`\"]*) my_arg=`$ECHO "$1" | $SED \ -e "$double_quote_subst" -e "$sed_double_backslash"` ;; *) my_arg="$1" ;; esac case $my_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") my_arg="\"$my_arg\"" ;; esac func_quote_for_expand_result="$my_arg" } # func_show_eval cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$my_cmd" my_status=$? if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_show_eval_locale cmd [fail_exp] # Unless opt_silent is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { my_cmd="$1" my_fail_exp="${2-:}" ${opt_silent-false} || { func_quote_for_expand "$my_cmd" eval "func_echo $func_quote_for_expand_result" } if ${opt_dry_run-false}; then :; else eval "$lt_user_locale $my_cmd" my_status=$? eval "$lt_safe_locale" if test "$my_status" -eq 0; then :; else eval "(exit $my_status); $my_fail_exp" fi fi } # func_tr_sh # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_version # Echo version message to standard output and exit. func_version () { $opt_debug $SED -n '/(C)/!b go :more /\./!{ N s/\n# / / b more } :go /^# '$PROGRAM' (GNU /,/# warranty; / { s/^# // s/^# *$// s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ p }' < "$progpath" exit $? } # func_usage # Echo short help message to standard output and exit. func_usage () { $opt_debug $SED -n '/^# Usage:/,/^# *.*--help/ { s/^# // s/^# *$// s/\$progname/'$progname'/ p }' < "$progpath" echo $ECHO "run \`$progname --help | more' for full usage" exit $? } # func_help [NOEXIT] # Echo long help message to standard output and exit, # unless 'noexit' is passed as argument. func_help () { $opt_debug $SED -n '/^# Usage:/,/# Report bugs to/ { :print s/^# // s/^# *$// s*\$progname*'$progname'* s*\$host*'"$host"'* s*\$SHELL*'"$SHELL"'* s*\$LTCC*'"$LTCC"'* s*\$LTCFLAGS*'"$LTCFLAGS"'* s*\$LD*'"$LD"'* s/\$with_gnu_ld/'"$with_gnu_ld"'/ s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ p d } /^# .* home page:/b print /^# General help using/b print ' < "$progpath" ret=$? if test -z "$1"; then exit $ret fi } # func_missing_arg argname # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $opt_debug func_error "missing argument for $1." exit_cmd=exit } # func_split_short_opt shortopt # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. func_split_short_opt () { my_sed_short_opt='1s/^\(..\).*$/\1/;q' my_sed_short_rest='1s/^..\(.*\)$/\1/;q' func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` } # func_split_short_opt may be replaced by extended shell implementation # func_split_long_opt longopt # Set func_split_long_opt_name and func_split_long_opt_arg shell # variables after splitting LONGOPT at the `=' sign. func_split_long_opt () { my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' my_sed_long_arg='1s/^--[^=]*=//' func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` } # func_split_long_opt may be replaced by extended shell implementation exit_cmd=: magic="%%%MAGIC variable%%%" magic_exe="%%%MAGIC EXE variable%%%" # Global variables. nonopt= preserve_args= lo2o="s/\\.lo\$/.${objext}/" o2lo="s/\\.${objext}\$/.lo/" extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # func_append var value # Append VALUE to the end of shell variable VAR. func_append () { eval "${1}=\$${1}\${2}" } # func_append may be replaced by extended shell implementation # func_append_quoted var value # Quote VALUE and append to the end of shell variable VAR, separated # by a space. func_append_quoted () { func_quote_for_eval "${2}" eval "${1}=\$${1}\\ \$func_quote_for_eval_result" } # func_append_quoted may be replaced by extended shell implementation # func_arith arithmetic-term... func_arith () { func_arith_result=`expr "${@}"` } # func_arith may be replaced by extended shell implementation # func_len string # STRING may not start with a hyphen. func_len () { func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` } # func_len may be replaced by extended shell implementation # func_lo2o object func_lo2o () { func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` } # func_lo2o may be replaced by extended shell implementation # func_xform libobj-or-source func_xform () { func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` } # func_xform may be replaced by extended shell implementation # func_fatal_configuration arg... # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_error ${1+"$@"} func_error "See the $PACKAGE documentation for more information." func_fatal_error "Fatal configuration error." } # func_config # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # Display the features supported by this script. func_features () { echo "host: $host" if test "$build_libtool_libs" = yes; then echo "enable shared libraries" else echo "disable shared libraries" fi if test "$build_old_libs" = yes; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag tagname # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname="$1" re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf="/$re_begincf/,/$re_endcf/p" # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; esac # Option defaults: opt_debug=: opt_dry_run=false opt_config=false opt_preserve_dup_deps=false opt_features=false opt_finish=false opt_help=false opt_help_all=false opt_silent=: opt_warning=: opt_verbose=: opt_silent=false opt_verbose=false # Parse options once, thoroughly. This comes as soon as possible in the # script to make things like `--version' happen as quickly as we can. { # this just eases exit handling while test $# -gt 0; do opt="$1" shift case $opt in --debug|-x) opt_debug='set -x' func_echo "enabling shell trace mode" $opt_debug ;; --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) opt_config=: func_config ;; --dlopen|-dlopen) optarg="$1" opt_dlopen="${opt_dlopen+$opt_dlopen }$optarg" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) opt_features=: func_features ;; --finish) opt_finish=: set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help_all=: opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_mode="$optarg" case $optarg in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_silent=false func_append preserve_args " $opt" ;; --no-warning|--no-warn) opt_warning=false func_append preserve_args " $opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $opt" ;; --silent|--quiet) opt_silent=: func_append preserve_args " $opt" opt_verbose=false ;; --verbose|-v) opt_verbose=: func_append preserve_args " $opt" opt_silent=false ;; --tag) test $# = 0 && func_missing_arg $opt && break optarg="$1" opt_tag="$optarg" func_append preserve_args " $opt $optarg" func_enable_tag "$optarg" shift ;; -\?|-h) func_usage ;; --help) func_help ;; --version) func_version ;; # Separate optargs to long options: --*=*) func_split_long_opt "$opt" set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-n*|-v*) func_split_short_opt "$opt" set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) break ;; -*) func_fatal_help "unrecognized option \`$opt'" ;; *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac done # Validate options: # save first non-option argument if test "$#" -gt 0; then nonopt="$opt" shift fi # preserve --debug test "$opt_debug" = : || func_append preserve_args " --debug" case $host in *cygwin* | *mingw* | *pw32* | *cegcc*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then func_fatal_configuration "not configured to build any kind of library" fi # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test "$opt_mode" != execute; then func_error "unrecognized option \`-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help="$help" help="Try \`$progname --help --mode=$opt_mode' for more information." } # Bail if the options were screwed $exit_cmd $EXIT_FAILURE } ## ----------- ## ## Main. ## ## ----------- ## # func_lalib_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null \ | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_unsafe_p file # True iff FILE is a libtool `.la' library or `.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if `file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case "$lalib_p_line" in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test "$lalib_p" = yes } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { func_lalib_p "$1" } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $opt_debug save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$save_ifs eval cmd=\"$cmd\" func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # `FILE.' does not work on cygwin managed mounts. func_source () { $opt_debug case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case "$lt_sysroot:$1" in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result="=$func_stripname_result" ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with \`--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=${1} if test "$build_libtool_libs" = yes; then write_lobj=\'${2}\' else write_lobj=none fi if test "$build_old_libs" = yes; then write_oldobj=\'${3}\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$lt_sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $opt_debug # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result="" if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result" ; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $opt_debug if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $opt_debug # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $opt_debug if test -z "$2" && test -n "$1" ; then func_error "Could not determine host file name corresponding to" func_error " \`$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result="$1" fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $opt_debug if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " \`$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result="$3" fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $opt_debug case $4 in $1 ) func_to_host_path_result="$3$func_to_host_path_result" ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via `$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $opt_debug $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $opt_debug case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result="$1" } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result="$func_convert_core_msys_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $opt_debug func_to_host_file_result="$1" if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result="$func_cygpath_result" fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via `$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $opt_debug if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd="func_convert_path_${func_stripname_result}" fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $opt_debug func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result="$1" } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_msys_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $opt_debug func_to_host_path_result="$1" if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result="$func_cygpath_result" func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_mode_compile arg... func_mode_compile () { $opt_debug # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg="$arg" arg_mode=normal ;; target ) libobj="$arg" arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify \`-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs="$IFS"; IFS=',' for arg in $args; do IFS="$save_ifs" func_append_quoted lastarg "$arg" done IFS="$save_ifs" func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg="$srcfile" srcfile="$arg" ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with \`-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj="$func_basename_result" } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from \`$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name \`$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname="$func_basename_result" xdir="$func_dirname_result" lobj=${xdir}$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test "$build_old_libs" = yes; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test "$build_libtool_libs" = yes; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test "$pic_mode" != no; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test "$suppress_opt" = yes; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test "$build_old_libs" = yes; then if test "$pic_mode" != yes; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test "$compiler_c_o" = yes; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test "$need_locks" = warn && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support \`-c' and \`-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test "$need_locks" != no; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test "$opt_mode" = compile && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a \`.o' file suitable for static linking -static only build a \`.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a \`standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix \`.c' with the library object suffix, \`.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to \`-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the \`--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the \`install' or \`cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE Use a list of object files found in FILE to specify objects -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with \`-') are ignored. Every other argument is treated as a filename. Files ending in \`.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only library objects (\`.lo' files) may be specified, and \`-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created using \`ar' and \`ranlib', or on Windows using \`lib'. If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode \`$opt_mode'" ;; esac echo $ECHO "Try \`$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test "$opt_help" = :; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | sed -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | sed '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $opt_debug # The first argument is the command name. cmd="$nonopt" test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "\`$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "\`$file' was not linked with \`-export-dynamic'" continue fi func_dirname "$file" "" "." dir="$func_dirname_result" if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir="$func_dirname_result" ;; *) func_warning "\`-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir="$absdir" # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic="$magic" # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file="$progdir/$program" elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file="$progdir/$program" fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if test "X$opt_dry_run" = Xfalse; then if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd="\$cmd$args" else # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS fi } test "$opt_mode" = execute && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $opt_debug libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "\`$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument \`$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and \`=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_silent && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the \`-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the \`$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the \`$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the \`$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test "$opt_mode" = finish && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $opt_debug # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac; then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=no stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=yes ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test "x$prev" = x-m && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the \`$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=yes if test "$isdir" = yes; then destdir="$dest" destname= else func_dirname_and_basename "$dest" "" "." destdir="$func_dirname_result" destname="$func_basename_result" # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "\`$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "\`$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "\`$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir="$func_dirname_result" func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking \`$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname="$1" shift srcname="$realname" test -n "$relink_command" && srcname="$realname"T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme="$stripme" case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme="" ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try `ln -sf' first, because the `ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib="$destdir/$realname" func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name="$func_basename_result" instname="$dir/$name"i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest="$destfile" destfile= ;; *) func_fatal_help "cannot copy a libtool object to \`$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test "$build_old_libs" = yes; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile="$destdir/$destname" else func_basename "$file" destfile="$func_basename_result" destfile="$destdir/$destfile" fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext="" case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=".exe" fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script \`$wrapper'" finalize=yes for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test if test -n "$libdir" && test ! -f "$libfile"; then func_warning "\`$lib' has not been installed in \`$libdir'" finalize=no fi done relink_command= func_source "$wrapper" outputname= if test "$fast_install" = no && test -n "$relink_command"; then $opt_dry_run || { if test "$finalize" = yes; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file="$func_basename_result" outputname="$tmpdir/$file" # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_silent || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink \`$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file="$outputname" else func_warning "cannot relink \`$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name="$func_basename_result" # Set up the ranlib parameters. oldlib="$destdir/$name" func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run \`$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test "$opt_mode" = install && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $opt_debug my_outputname="$1" my_originator="$2" my_pic_p="${3-no}" my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms="${my_outputname}S.c" else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist="$output_objdir/${my_outputname}.nm" func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif /* External symbol declarations for the compiler. */\ " if test "$dlself" = yes; then func_verbose "generating symbol list for \`$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols="$output_objdir/$outputname.exp" $opt_dry_run || { $RM $export_symbols eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from \`$dlprefile'" func_basename "$dlprefile" name="$func_basename_result" case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename="" if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname" ; then func_basename "$dlprefile_dlname" dlprefile_dlbasename="$func_basename_result" else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename" ; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[]; LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = {\ { \"$my_originator\", (void *) 0 }," case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) if test "X$my_pic_p" != Xno; then pic_flag_for_symtable=" $pic_flag" fi ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' # Transform the symbol file into the correct name. symfileobj="$output_objdir/${my_outputname}S.$objext" case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for \`$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $opt_debug win32_libid_type="unknown" win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s,.*,import, p q } }'` case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $opt_debug sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $opt_debug match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive which possess that section. Heuristic: eliminate # all those which have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 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)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $opt_debug func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $opt_debug if func_cygming_gnu_implib_p "$1" ; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1" ; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result="" fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $opt_debug f_ex_an_ar_dir="$1"; shift f_ex_an_ar_oldlib="$1" if test "$lock_old_archive_extraction" = yes; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test "$lock_old_archive_extraction" = yes; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $opt_debug my_gentop="$1"; shift my_oldlibs=${1+"$@"} my_oldobjs="" my_xlib="" my_xabs="" my_xdir="" for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib="$func_basename_result" my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir="$my_gentop/$my_xlib_u" func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` darwin_base_archive=`basename "$darwin_archive"` darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches ; do func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" func_extract_an_archive "`pwd`" "${darwin_base_archive}" cd "$darwin_curdir" $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result="$my_oldobjs" } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory in which it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ which is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options which match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test "$fast_install" = yes; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else $ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include /* declarations of non-ANSI functions */ #if defined(__MINGW32__) # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined(__CYGWIN__) # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined (other platforms) ... */ #endif /* portability defines, excluding path handling macros */ #if defined(_MSC_VER) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC # ifndef _INTPTR_T_DEFINED # define _INTPTR_T_DEFINED # define intptr_t int # endif #elif defined(__MINGW32__) # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined(__CYGWIN__) # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined (other platforms) ... */ #endif #if defined(PATH_MAX) # define LT_PATHMAX PATH_MAX #elif defined(MAXPATHLEN) # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ defined (__OS2__) # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free ((void *) stale); stale = 0; } \ } while (0) #if defined(LT_DEBUGWRAPPER) static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; int tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined (HAVE_DOS_BASED_FILE_SYSTEM) if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined (HAVE_DOS_BASED_FILE_SYSTEM) } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = q - p; p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (strcmp (str, pat) == 0) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else int len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { int orig_value_len = strlen (orig_value); int add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ int len = strlen (new_value); while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[len-1] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #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" #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" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $opt_debug case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_mode_link arg... func_mode_link () { $opt_debug case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll which has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=no prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module="${wl}-single_module" func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test "$build_libtool_libs" != yes && \ func_fatal_configuration "can not build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg="$1" shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir="$arg" prev= continue ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=yes fi case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test "$dlself" = no; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test "$prev" = dlprefiles; then dlself=yes elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test "$prev" = dlfiles; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols="$arg" test -f "$arg" \ || func_fatal_error "symbol file \`$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex="$arg" prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file \`$arg' does not exist" fi arg=$save_arg prev= continue ;; precious_regex) precious_files_regex="$arg" prev= continue ;; release) release="-$arg" prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds="$arg" prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg="$arg" case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "\`-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test "X$arg" = "X-export-symbols"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between \`-L' and \`$1'" else func_fatal_error "need path for \`-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of \`$dir'" dir="$absdir" ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test "X$arg" = "X-lc" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. test "X$arg" = "X-lc" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test "X$arg" = "X-lc" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test "X$arg" = "X-lc" && continue ;; esac elif test "X$arg" = "X-lc_r"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module="${wl}-multi_module" continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "\`-no-install' is ignored for $host" func_warning "assuming \`-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS="$save_ifs" func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-flto*|-fwhopr*|-fuse-linker-plugin) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test "$pic_object" = none && test "$non_pic_object" = none; then func_fatal_error "cannot find name of object for \`$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. pic_object="$xdir$pic_object" if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg="$pic_object" fi # Non-PIC object. if test "$non_pic_object" != none; then # Prepend the subdirectory the object is found in. non_pic_object="$xdir$non_pic_object" # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir="$func_dirname_result" func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "\`$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg="$func_quote_for_eval_result" ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the \`$prevarg' option requires an argument" if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname="$func_basename_result" libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" func_dirname "$output" "/" "" output_objdir="$func_dirname_result$objdir" func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps ; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test "$linkmode" = lib; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=no newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test "$linkmode,$pass" = "lib,link"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs="$tmp_deplibs" fi if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" deplibs= fi if test "$linkmode" = prog; then case $pass in dlopen) libs="$dlfiles" ;; dlpreopen) libs="$dlprefiles" ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test "$linkmode,$pass" = "lib,dlpreopen"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs="$dlprefiles" fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi for deplib in $libs; do lib= found=no case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then func_warning "\`-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib="$searchdir/lib${name}${search_ext}" if test -f "$lib"; then if test "$search_ext" = ".la"; then found=yes else found=no fi break 2 fi done done if test "$found" != yes; then # deplib doesn't seem to be a libtool library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue else # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no func_dirname "$lib" "" "." ladir="$func_dirname_result" lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi fi ;; # -l *.ltframework) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test "$linkmode" = lib ; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi if test "$pass" = scan; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "\`-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=no case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=yes fi ;; pass_all) valid_a_lib=yes ;; esac if test "$valid_a_lib" != yes; then echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." else echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" fi ;; esac continue ;; prog) if test "$pass" != link; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test "$pass" = conv; then deplibs="$deplib $deplibs" elif test "$linkmode" = prog; then if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=yes continue ;; esac # case $deplib if test "$found" = yes || test -f "$lib"; then : else func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" fi # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "\`$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir="$func_dirname_result" dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test "$pass" = conv; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test "$linkmode" != prog && test "$linkmode" != lib; then func_fatal_error "\`$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test "$prefer_static_libs" = yes || test "$prefer_static_libs,$installed" = "built,no"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib="$l" done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for \`$lib'" fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then func_fatal_error "cannot -dlopen a convenience library: \`$lib'" fi if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of \`$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir="$ladir" fi ;; esac func_basename "$lib" laname="$func_basename_result" # Find the relevant object directory and library name. if test "X$installed" = Xyes; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library \`$lib' was moved." dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else dir="$lt_sysroot$libdir" absdir="$lt_sysroot$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir="$ladir" absdir="$abs_ladir" # Remove this search path later func_append notinst_path " $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then if test -z "$libdir" && test "$linkmode" = prog; then func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" fi case "$host" in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test "$linkmode" = lib; then deplibs="$dir/$old_library $deplibs" elif test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test "$linkmode" = prog && test "$pass" != link; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=no if test "$link_all_deplibs" != no || test -z "$library_names" || test "$build_libtool_libs" = no; then linkalldeplibs=yes fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. case "$temp_rpath:" in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if test "$alldeplibs" = yes && { test "$deplibs_check_method" = pass_all || { test "$build_libtool_libs" = yes && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test "$use_static_libs" = built && test "$installed" = yes; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test "$installed" = no; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule="" for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule="$dlpremoduletest" break fi done if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then echo if test "$linkmode" = prog; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname="$1" shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc*) func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; esac eval soname=\"$soname_spec\" else soname="$realname" fi # Make a new name for the extract_expsyms_cmds to use soroot="$soname" func_basename "$soroot" soname="$func_basename_result" func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from \`$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for \`$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test "$linkmode" = prog || test "$opt_mode" != relink; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test "$hardcode_direct" = no; then add="$dir/$linklib" case $host in *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;; *-*-sysv4*uw2*) add_dir="-L$dir" ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we can not # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null ; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library" ; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add="$dir/$old_library" fi elif test -n "$old_library"; then add="$dir/$old_library" fi fi esac elif test "$hardcode_minus_L" = no; then case $host in *-*-sunos*) add_shlibpath="$dir" ;; esac add_dir="-L$dir" add="-l$name" elif test "$hardcode_shlibpath_var" = no; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; relink) if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$absdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then add_shlibpath="$dir" add="-l$name" else lib_linked=no fi ;; *) lib_linked=no ;; esac if test "$lib_linked" != yes; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test "$hardcode_direct" != yes && test "$hardcode_minus_L" != yes && test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test "$linkmode" = prog || test "$opt_mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test "$hardcode_direct" = yes && test "$hardcode_direct_absolute" = no; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" add="-l$name" elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then add="$inst_prefix_dir$libdir/$linklib" else add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir="-L$libdir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add="-l$name" fi if test "$linkmode" = prog; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test "$linkmode" = prog; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test "$hardcode_direct" != unsupported; then test -n "$old_library" && linklib="$old_library" compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test "$build_libtool_libs" = yes; then # Not a shared library if test "$deplibs_check_method" != pass_all; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system can not link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test "$linkmode" = lib; then if test -n "$dependency_libs" && { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes || test "$link_static" = yes; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs="$temp_deplibs" fi func_append newlib_search_path " $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps ; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path="$deplib" ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of \`$dir'" absdir="$dir" fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl" ; then depdepl="$absdir/$objdir/$depdepl" darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" path= fi fi ;; *) path="-L$absdir/$objdir" ;; esac else eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "\`$deplib' seems to be moved" path="-L$absdir" fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test "$pass" = link; then if test "$linkmode" = "prog"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test "$pass" != dlopen; then if test "$pass" != conv; then # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= fi if test "$linkmode,$pass" != "prog,link"; then vars="deplibs" else vars="compile_deplibs finalize_deplibs" fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs ; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i="" ;; esac if test -n "$i" ; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" fi if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "\`-R' is ignored for archives" test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "\`-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "\`-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test "$module" = no && \ func_fatal_help "libtool library \`$output' must begin with \`lib'" if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test "$dlself" != no && \ func_warning "\`-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test "$#" -gt 1 && \ func_warning "ignoring multiple \`-rpath's for a libtool library" install_libdir="$1" oldlibs= if test -z "$rpath"; then if test "$build_libtool_libs" = yes; then # Building a libtool convenience library. # Some compilers have problems with a `.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "\`-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "\`-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 shift IFS="$save_ifs" test -n "$7" && \ func_fatal_help "too many parameters to \`-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major="$1" number_minor="$2" number_revision="$3" # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # which has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_revision" ;; freebsd-aout|freebsd-elf|qnx|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age="$number_minor" revision="$number_minor" lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type \`$version_type'" ;; esac ;; no) current="$1" revision="$2" age="$3" ;; esac # Check that each of the things are valid numbers. case $current in 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]) ;; *) func_error "CURRENT \`$current' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $revision in 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]) ;; *) func_error "REVISION \`$revision' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac case $age in 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]) ;; *) func_error "AGE \`$age' must be a nonnegative integer" func_fatal_error "\`$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE \`$age' is greater than the current interface number \`$current'" func_fatal_error "\`$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; freebsd-aout) major=".$current" versuffix=".$current.$revision"; ;; freebsd-elf) major=".$current" versuffix=".$current" ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring="$verstring_prefix$major.$revision" # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring_prefix$major.$iface:$verstring" done # Before this point, $major must not contain `.'. major=.$major versuffix="$major.$revision" ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix="$major.$age.$revision" ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring="$verstring:${iface}.0" done # Make executables depend on our current version. func_append verstring ":${current}.0" ;; qnx) major=".$current" versuffix=".$current" ;; sunos) major=".$current" versuffix=".$current.$revision" ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. func_arith $current - $age major=$func_arith_result versuffix="-$major" ;; *) func_fatal_configuration "unknown library version type \`$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring="0.0" ;; esac if test "$need_version" = no; then versuffix= else versuffix=".0.0" fi fi # Remove version info from name if versioning should be avoided if test "$avoid_version" = yes && test "$need_version" = no; then major= versuffix= verstring="" fi # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then func_warning "undefined symbols not allowed in $host shared libraries" build_libtool_libs=no build_old_libs=yes fi else # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi fi func_generate_dlsyms "$libname" "$libname" "yes" func_append libobjs " $symfileobj" test "X$libobjs" = "X " && libobjs= if test "$opt_mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles="$dlfiles" dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles="$dlprefiles" dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release="" versuffix="" major="" newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib="$potent_lib" while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib="" break 2 fi done done fi if test -n "$a_deplib" ; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test "X$deplibs_check_method" = "Xnone"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using \`nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs="$new_libs" # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then # Remove ${wl} instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" test "$opt_mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath="$finalize_shlibpath" test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname="$1" shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname="$realname" fi if test -z "$dlname"; then dlname=$soname fi lib="$output_objdir/$realname" linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols="$output_objdir/$libname.uexp" func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile if test "x`$SED 1q $export_symbols`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols="$export_symbols" export_symbols= always_export_symbols=yes fi fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' for cmd1 in $cmds; do IFS="$save_ifs" # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test "$try_normal_branch" = yes \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=${output_objdir}/${output_la}.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test "$compiler_needs_object" = yes && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then output=${output_objdir}/${output_la}.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then output=${output_objdir}/${output_la}.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test "$compiler_needs_object" = yes; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-${k}.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test "X$objlist" = X || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test "$k" -eq 1 ; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-${k}.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-${k}.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\${concat_cmds}$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi if ${skipped_export-false}; then func_verbose "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi fi test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs="$IFS"; IFS='~' for cmd in $concat_cmds; do IFS="$save_ifs" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi if ${skipped_export-false}; then if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols="$export_symbols" test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi fi libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test "$module" = yes && test -n "$module_cmds" ; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" $opt_silent || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test "$opt_mode" = relink; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS="$save_ifs" # Restore the uninstalled library and exit if test "$opt_mode" = relink; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test "$module" = yes || test "$export_dynamic" = yes; then # On all known operating systems, these are identical. dlname="$soname" fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then func_warning "\`-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "\`-l' and \`-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "\`-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "\`-R' is ignored for objects" test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for objects" test -n "$release" && \ func_warning "\`-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object \`$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj="$output" ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # reload_cmds runs $LD directly, so let us get rid of # -Wl from whole_archive_flag_spec and hope we can get by with # turning comma into space.. wl= if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` else gentop="$output_objdir/${obj}x" func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" # Create the old-style object. reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi if test -n "$pic_flag" || test "$pic_mode" != default; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "\`-version-info' is ignored for programs" test -n "$release" && \ func_warning "\`-release' is ignored for programs" test "$preload" = yes \ && test "$dlopen_support" = unknown \ && test "$dlopen_self" = unknown \ && test "$dlopen_self_static" = unknown && \ func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test "$tagname" = CXX ; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " ${wl}-bind_at_load" func_append finalize_command " ${wl}-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs="$new_libs" func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath="$rpath" rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath="$rpath" if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" "no" # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=yes case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=no ;; *cygwin* | *mingw* ) if test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; *) if test "$need_relink" = no || test "$build_libtool_libs" != yes; then wrappers_required=no fi ;; esac if test "$wrappers_required" = no; then # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.${objext}"; then func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' fi exit $exit_status fi if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test "$no_install" = yes; then # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi if test "$hardcode_action" = relink; then # Fast installation is not supported link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" func_warning "this platform does not like uninstalled shared libraries" func_warning "\`$output' will be relinked during installation" else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` else # fast_install is set to needless relink_command= fi else link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" fi fi # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" 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'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource="$output_path/$objdir/lt-$output_name.c" cwrapper="$output_path/$output_name.exe" $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host" ; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then oldobjs="$libobjs_save $symfileobj" addlibs="$convenience" build_libtool_libs=no else if test "$build_libtool_libs" = module; then oldobjs="$libobjs_save" build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" if test "$preload" = yes && test -f "$symfileobj"; then func_append oldobjs " $symfileobj" fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop="$output_objdir/${outputname}x" func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase="$func_basename_result" case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test "X$oldobjs" = "X" ; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test "$hardcode_automatic" = yes ; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then break fi output="$output_objdir/$outputname"i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name="$func_basename_result" func_resolve_sysroot "$deplib" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "\`$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name="$func_basename_result" eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "\`$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles="$newdlprefiles" else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles="$newdlprefiles" fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test "x$bindir" != x ; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that can not go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } { test "$opt_mode" = link || test "$opt_mode" = relink; } && func_mode_link ${1+"$@"} # func_mode_uninstall arg... func_mode_uninstall () { $opt_debug RM="$nonopt" files= rmforce= exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic="$magic" for arg do case $arg in -f) func_append RM " $arg"; rmforce=yes ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir="$func_dirname_result" if test "X$dir" = X.; then odir="$objdir" else odir="$dir/$objdir" fi func_basename "$file" name="$func_basename_result" test "$opt_mode" = uninstall && odir="$dir" # Remember odir for removal later, being careful to avoid duplicates if test "$opt_mode" = clean; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif test "$rmforce" = yes; then continue fi rmfiles="$file" case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case "$opt_mode" in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test "$pic_object" != none; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test "$non_pic_object" != none; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test "$opt_mode" = clean ; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name" ; then func_append rmfiles " $odir/lt-${noexename}.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } { test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && func_mode_uninstall ${1+"$@"} test -z "$opt_mode" && { help="$generic_help" func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode \`$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: # vi:sw=2 libgdiplus-2.11/COPYING0000664000175000017500000000010012225470167011546 00000000000000Libgdiplus is available under the terms of the MIT X11 license. libgdiplus-2.11/config.sub0000755000175000017500000010532711772274120012512 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # 2011, 2012 Free Software Foundation, Inc. timestamp='2012-04-18' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ knetbsd*-gnu* | netbsd*-gnu* | \ kopensolaris*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; android-linux) os=-linux-android basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray | -microblaze) os= basic_machine=$1 ;; -bluegene*) os=-cnk ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | aarch64 | aarch64_be \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | epiphany \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | hexagon \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep | metag \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64octeon | mips64octeonel \ | mips64orion | mips64orionel \ | mips64r5900 | mips64r5900el \ | mips64vr | mips64vrel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 \ | ns16k | ns32k \ | open8 \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle \ | pyramid \ | rl78 | rx \ | score \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ | ubicom32 \ | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ | we32k \ | x86 | xc16x | xstormy16 | xtensa \ | z8k | z80) basic_machine=$basic_machine-unknown ;; c54x) basic_machine=tic54x-unknown ;; c55x) basic_machine=tic55x-unknown ;; c6x) basic_machine=tic6x-unknown ;; m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; strongarm | thumb | xscale) basic_machine=arm-unknown ;; xgate) basic_machine=$basic_machine-unknown os=-none ;; xscaleeb) basic_machine=armeb-unknown ;; xscaleel) basic_machine=armel-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | aarch64-* | aarch64_be-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hexagon-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64octeon-* | mips64octeonel-* \ | mips64orion-* | mips64orionel-* \ | mips64r5900-* | mips64r5900el-* \ | mips64vr-* | mips64vrel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | open8-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ | pyramid-* \ | rl78-* | romp-* | rs6000-* | rx-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ | tahoe-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tile*-* \ | tron-* \ | ubicom32-* \ | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-* | z80-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aros) basic_machine=i386-pc os=-aros ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; bluegene*) basic_machine=powerpc-ibm os=-cnk ;; c54x-*) basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c90) basic_machine=c90-cray os=-unicos ;; cegcc) basic_machine=arm-unknown os=-cegcc ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16 | cr16-*) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dicos) basic_machine=i686-pc os=-dicos ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; microblaze) basic_machine=microblaze-xilinx ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; msys) basic_machine=i386-pc os=-msys ;; mvs) basic_machine=i370-ibm os=-mvs ;; nacl) basic_machine=le32-unknown os=-nacl ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; neo-tandem) basic_machine=neo-tandem ;; nse-tandem) basic_machine=nse-tandem ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc | ppcbe) basic_machine=powerpc-unknown ;; ppc-* | ppcbe-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; strongarm-* | thumb-*) basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tile*) basic_machine=$basic_machine-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; xscale-* | xscalee[bl]-*) basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; z80-*-coff) basic_machine=z80-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -auroraux) os=-auroraux ;; -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ | -sym* | -kopensolaris* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* | -aros* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* | -cegcc* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -dicos*) os=-dicos ;; -nacl*) ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; hexagon-*) os=-elf ;; tic54x-*) os=-coff ;; tic55x-*) os=-coff ;; tic6x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -cnk*|-aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libgdiplus-2.11/MPL-1.1.html0000664000175000017500000006336512225470167012354 00000000000000 Mozilla Public License version 1.1
MOZILLA PUBLIC LICENSE
Version 1.1


1. Definitions.

    1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party.

    1.1. ''Contributor'' means each entity that creates or contributes to the creation of Modifications.

    1.2. ''Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.

    1.3. ''Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.

    1.4. ''Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data.

    1.5. ''Executable'' means Covered Code in any form other than Source Code.

    1.6. ''Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.

    1.7. ''Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.

    1.8. ''License'' means this document.

    1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein.

    1.9. ''Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:

      A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.

      B. Any new file that contains any part of the Original Code or previous Modifications.
       

    1.10. ''Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.

    1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation,  method, process, and apparatus claims, in any patent Licensable by grantor.

    1.11. ''Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.

    1.12. "You'' (or "Your")  means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.

2. Source Code License.
    2.1. The Initial Developer Grant.
    The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:
      (a)  under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and

      (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof).

           
      (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License.

      (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code;  or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices.
       

    2.2. Contributor Grant.
    Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license
       
      (a)  under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and

      (b) under Patent Claims infringed by the making, using, or selling of  Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of  Modifications made by that Contributor with its Contributor Version (or portions of such combination).

      (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code.

      (d)    Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2)  separate from the Contributor Version;  3)  for infringements caused by: i) third party modifications of Contributor Version or ii)  the combination of Modifications made by that Contributor with other software  (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor.


3. Distribution Obligations.

    3.1. Application of License.
    The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.

    3.2. Availability of Source Code.
    Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.

    3.3. Description of Modifications.
    You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.

    3.4. Intellectual Property Matters

      (a) Third Party Claims.
      If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.

      (b) Contributor APIs.
      If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file.
       

              (c)    Representations.
      Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License.


    3.5. Required Notices.
    You must duplicate the notice in Exhibit A in each file of the Source Code.  If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice.  If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A.  You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code.  You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.

    3.6. Distribution of Executable Versions.
    You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.

    3.7. Larger Works.
    You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.
    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.
5. Application of this License.
    This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code.
6. Versions of the License.
    6.1. New Versions.
    Netscape Communications Corporation (''Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.

    6.2. Effect of New Versions.
    Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License.

    6.3. Derivative Works.
    If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases ''Mozilla'', ''MOZILLAPL'', ''MOZPL'', ''Netscape'', "MPL", ''NPL'' or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)

7. DISCLAIMER OF WARRANTY.
    COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
    8.1.  This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.

    8.2.  If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant")  alleging that:

    (a)  such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i)  agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant.  If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above.

    (b)  any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant.

    8.3.  If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license.

    8.4.  In the event of termination under Sections 8.1 or 8.2 above,  all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination.

9. LIMITATION OF LIABILITY.
    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
    The Covered Code is a ''commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ''commercial computer software'' and ''commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
11. MISCELLANEOUS.
    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
12. RESPONSIBILITY FOR CLAIMS.
    As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability.
13. MULTIPLE-LICENSED CODE.
    Initial Developer may designate portions of the Covered Code as “Multiple-Licensed”.  “Multiple-Licensed” means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the MPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A.


EXHIBIT A -Mozilla Public License.

    ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
    http://www.mozilla.org/MPL/

    Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
    ANY KIND, either express or implied. See the License for the specific language governing rights and
    limitations under the License.

    The Original Code is ______________________________________.

    The Initial Developer of the Original Code is ________________________. Portions created by
     ______________________ are Copyright (C) ______ _______________________. All Rights
    Reserved.

    Contributor(s): ______________________________________.

    Alternatively, the contents of this file may be used under the terms of the _____ license (the  “[___] License”), in which case the provisions of [______] License are applicable  instead of those above.  If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting  the provisions above and replace  them with the notice and other provisions required by the [___] License.  If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License."

    [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.]

    libgdiplus-2.11/NEWS0000664000175000017500000000010712225470167011221 00000000000000See http://www.mono-project.com/Libgdiplus for the most recent details libgdiplus-2.11/src/0000775000175000017500000000000012225470636011374 500000000000000libgdiplus-2.11/src/graphics-pathiterator.c0000664000175000017500000002671312225470167015774 00000000000000/* * graphics-pathiterator.c * * Copyright (C) 2004,2006-2007 Novell Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * * Author: Ravindra (rkumar@novell.com) * */ #include "graphics-pathiterator-private.h" #include "graphics-path-private.h" #include "font.h" // coverity[+alloc : arg-*0] GpStatus GdipCreatePathIter (GpPathIterator **iterator, GpPath *path) { GpPath *clone = NULL; GpPathIterator *iter; GpStatus status; if (!iterator) return InvalidParameter; iter = (GpPathIterator *) GdipAlloc (sizeof (GpPathIterator)); if (iter == NULL) return OutOfMemory; /* supplying a path isn't required */ if (path) { status = GdipClonePath (path, &clone); if (status != Ok) { GdipFree (iter); if (clone) GdipDeletePath (clone); return status; } } iter->path = clone; iter->markerPosition = 0; iter->subpathPosition = 0; iter->pathTypePosition = 0; *iterator = iter; return Ok; } GpStatus GdipPathIterGetCount (GpPathIterator *iterator, int *count) { if (!iterator || !count) return InvalidParameter; if (iterator->path) *count = iterator->path->count; else *count = 0; return Ok; } GpStatus GdipPathIterGetSubpathCount (GpPathIterator *iterator, int *count) { int numSubpaths = 0; if (!iterator || !count) return InvalidParameter; if (iterator->path) { int i; BYTE type; /* Number of subpaths = Number of starting points */ for (i = 0; i < iterator->path->count; i++) { type = g_array_index (iterator->path->types, BYTE, i); if (type == PathPointTypeStart) numSubpaths++; } } *count = numSubpaths; return Ok; } GpStatus GdipDeletePathIter (GpPathIterator *iterator) { if (!iterator) return InvalidParameter; if (iterator->path) { GdipDeletePath (iterator->path); iterator->path = NULL; } GdipFree (iterator); return Ok; } GpStatus GdipPathIterCopyData (GpPathIterator *iterator, int *resultCount, GpPointF *points, BYTE *types, int startIndex, int endIndex) { int i, j; if (!iterator || !resultCount || !points || !types) return InvalidParameter; if (!iterator->path || (startIndex >= iterator->path->count) || (startIndex > endIndex) || (endIndex >= iterator->path->count) || (startIndex < 0) || (endIndex < 0)) { *resultCount = 0; return Ok; } for (i = startIndex, j = 0; i <= endIndex; i++, j++) { points [j] = g_array_index (iterator->path->points, GpPointF, i); types [j] = g_array_index (iterator->path->types, BYTE, i); } *resultCount = j; return Ok; } GpStatus GdipPathIterEnumerate (GpPathIterator *iterator, int *resultCount, GpPointF *points, BYTE *types, int count) { int i = 0; if (!iterator || !resultCount || !points || !types) return InvalidParameter; if (iterator->path) { for (; i < count && i < iterator->path->count; i++) { points [i] = g_array_index (iterator->path->points, GpPointF, i); types [i] = g_array_index (iterator->path->types, BYTE, i); } } *resultCount = i; return Ok; } GpStatus GdipPathIterHasCurve (GpPathIterator *iterator, BOOL *curve) { if (!iterator || !curve) return InvalidParameter; *curve = gdip_path_has_curve (iterator->path); return Ok; } GpStatus GdipPathIterNextMarkerPath (GpPathIterator *iterator, int *resultCount, GpPath *path) { int index = 0; BYTE type; GpPointF point; if (!iterator || !resultCount) return InvalidParameter; /* There are no paths or markers or we are done with all the markers */ if (!path || !iterator->path || (iterator->path->count == 0) || (iterator->markerPosition == iterator->path->count)) { *resultCount = 0; return Ok; } /* Clear the existing values from path */ if (path->count > 0) { g_array_free (path->points, TRUE); g_byte_array_free (path->types, TRUE); path->points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); path->types = g_byte_array_new (); path->count = 0; } for (index = iterator->markerPosition; index < iterator->path->count; index++) { type = g_array_index (iterator->path->types, BYTE, index); point = g_array_index (iterator->path->points, GpPointF, index); g_array_append_val (path->points, point); g_byte_array_append (path->types, &type, 1); path->count++; /* Copy the marker and stop copying the points when we reach a marker type */ if (type & PathPointTypePathMarker) { index++; break; } } *resultCount = index - iterator->markerPosition; iterator->markerPosition = index; return Ok; } GpStatus GdipPathIterNextMarker (GpPathIterator *iterator, int *resultCount, int *startIndex, int *endIndex) { int index = 0; BYTE type; if (!iterator || !resultCount || !startIndex || !endIndex) return InvalidParameter; /* There are no markers or we are done with all the markers */ if (!iterator->path || (iterator->path->count == 0) || (iterator->markerPosition == iterator->path->count)) { /* we don't touch startIndex and endIndex in this case */ *resultCount = 0; return Ok; } /* Check for next marker */ for (index = iterator->markerPosition; index < iterator->path->count; index++) { type = g_array_index (iterator->path->types, BYTE, index); if (type & PathPointTypePathMarker) { index++; break; } } *startIndex = iterator->markerPosition; *endIndex = index - 1; *resultCount = (*endIndex) - (*startIndex) + 1;; iterator->markerPosition = index; return Ok; } GpStatus GdipPathIterNextPathType (GpPathIterator *iterator, int *resultCount, BYTE *pathType, int *startIndex, int *endIndex) { int index; BYTE currentType; BYTE lastTypeSeen; if (!iterator || !resultCount || !pathType || !startIndex || !endIndex) return InvalidParameter; /* There are no subpaths or we are done with all the subpaths */ if (!iterator->path || (iterator->path->count == 0) || (iterator->subpathPosition == 0)) { /* we don't touch pathType, startIndex and endIndex in this case */ *resultCount = 0; return Ok; } /* Pathtype position lags behind subpath position */ else if (iterator->pathTypePosition < iterator->subpathPosition) { lastTypeSeen = g_array_index (iterator->path->types, BYTE, iterator->pathTypePosition + 1); /* Mask the flags */ lastTypeSeen &= PathPointTypePathTypeMask; /* Check for the change in type */ for (index = iterator->pathTypePosition + 2; index < iterator->subpathPosition; index++) { currentType = g_array_index (iterator->path->types, BYTE, index); currentType &= PathPointTypePathTypeMask; if (currentType != lastTypeSeen) break; } *startIndex = iterator->pathTypePosition; *endIndex = index - 1; *resultCount = (*endIndex) - (*startIndex) + 1; *pathType = lastTypeSeen; /* If lastTypeSeen is a line, it becomes the starting point for the next * path type. We get this when we have connected figures. We need to step * back in that case. We don't need to step back if we are finished with * current subpath. */ if ((lastTypeSeen == PathPointTypeLine) && (index != iterator->subpathPosition)) iterator->pathTypePosition = index - 1; else iterator->pathTypePosition = index; } /* If pathtype position and subpath position coincide we return the resultCount = 0 */ else *resultCount = 0; return Ok; } GpStatus GdipPathIterNextSubpathPath (GpPathIterator *iterator, int *resultCount, GpPath *path, BOOL *isClosed) { int index = 0; GpPointF point; BYTE currentType; if (!iterator || !resultCount || !isClosed) return InvalidParameter; /* There are no subpaths or we are done with all the subpaths */ if (!path || !iterator->path || (iterator->path->count == 0) || (iterator->subpathPosition == iterator->path->count)) { *resultCount = 0; *isClosed = TRUE; return Ok; } /* Clear the existing values from path */ if (path->count > 0) { g_array_free (path->points, TRUE); g_byte_array_free (path->types, TRUE); path->points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); path->types = g_byte_array_new (); path->count = 0; } /* Copy the starting point */ currentType = g_array_index (iterator->path->types, BYTE, iterator->subpathPosition); point = g_array_index (iterator->path->points, GpPointF, iterator->subpathPosition); g_array_append_val (path->points, point); g_byte_array_append (path->types, ¤tType, 1); path->count++; /* Check for next start point */ for (index = iterator->subpathPosition + 1; index < iterator->path->count; index++) { currentType = g_array_index (iterator->path->types, BYTE, index); /* Copy the start point till next start point */ if (currentType == PathPointTypeStart) break; point = g_array_index (iterator->path->points, GpPointF, index); g_array_append_val (path->points, point); g_byte_array_append (path->types, ¤tType, 1); path->count++; } *resultCount = index - iterator->subpathPosition; /* set positions for next iteration */ iterator->pathTypePosition = iterator->subpathPosition; iterator->subpathPosition = index; /* Check if last subpath was closed */ currentType = g_array_index (iterator->path->types, BYTE, index - 1); if (currentType & PathPointTypeCloseSubpath) *isClosed = TRUE; else *isClosed = FALSE; return Ok; } GpStatus GdipPathIterNextSubpath (GpPathIterator *iterator, int *resultCount, int *startIndex, int *endIndex, BOOL *isClosed) { int index = 0; BYTE currentType; if (!iterator || !resultCount || !startIndex || !endIndex || !isClosed) return InvalidParameter; /* There are no subpaths or we are done with all the subpaths */ if (!iterator->path || (iterator->path->count == 0) || (iterator->subpathPosition == iterator->path->count)) { /* we don't touch startIndex and endIndex in this case */ *resultCount = 0; *isClosed = TRUE; return Ok; } /* Check for next start point */ for (index = iterator->subpathPosition + 1; index < iterator->path->count; index++) { currentType = g_array_index (iterator->path->types, BYTE, index); if (currentType == PathPointTypeStart) break; } *startIndex = iterator->subpathPosition; *endIndex = index - 1; *resultCount = (*endIndex) - (*startIndex) + 1; /* set positions for next iteration */ iterator->pathTypePosition = iterator->subpathPosition; iterator->subpathPosition = index; /* check if last subpath was closed */ currentType = g_array_index (iterator->path->types, BYTE, index - 1); if (currentType & PathPointTypeCloseSubpath) *isClosed = TRUE; else *isClosed = FALSE; return Ok; } GpStatus GdipPathIterRewind (GpPathIterator *iterator) { if (!iterator) return InvalidParameter; /* Reset the marker and subpath positions */ iterator->markerPosition = 0; iterator->subpathPosition = 0; iterator->pathTypePosition = 0; return Ok; } libgdiplus-2.11/src/tiffcodec.c0000664000175000017500000012341212225470167013410 00000000000000/* * * tiffcodec.c : Contains function definitions for encoding decoding tiff images * * * Copyright (C) Novell, Inc. 2003-2004. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Jordi Mas (jordi@ximian.com) * * Copyright (C) Novell, Inc. 2003-2004. */ #if HAVE_CONFIG_H #include #endif #include "gdiplus-private.h" GUID gdip_tif_image_format_guid = {0xb96b3cb1U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; #ifdef HAVE_LIBTIFF /* Thankfully, libtiff sucks far less than libjpeg */ #include #ifdef HAVE_BYTESWAP_H #include #endif #include "tiffcodec.h" #ifndef TIFFTAG_EXIFIFD #define TIFFTAG_EXIFIFD 34665 #endif /* Codecinfo related data*/ static ImageCodecInfo tiff_codec; static const WCHAR tiff_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'T', 'I', 'F', 'F', 0}; /* Built-in TIFF */ static const WCHAR tiff_extension[] = {'*', '.', 'T', 'I', 'F',';', '*', '.', 'T', 'I', 'F','F', 0}; /* *.TIF;*.TIFF */ static const WCHAR tiff_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 't', 'i', 'f', 'f', 0}; /* image/gif */ static const WCHAR tiff_format[] = {'T', 'I', 'F', 'F', 0}; /* TIFF */ static const BYTE tiff_sig_pattern[] = { 0x49, 0x49, 0x4D, 0x4D }; static const BYTE tiff_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF }; /*Wrapper functions and client data strucutre for delegate functions from StreamHelper class of System.Drawing Namespace*/ typedef struct { GetBytesDelegate getBytesFunc; PutBytesDelegate putBytesFunc; SeekDelegate seekFunc; CloseDelegate closeFunc; SizeDelegate sizeFunc; } gdip_tiff_clientData; static tsize_t gdip_tiff_fileread (thandle_t clientData, tdata_t buffer, tsize_t size) { return (tsize_t)fread(buffer, 1, size, (FILE*)clientData); } static tsize_t gdip_tiff_fileread_none (thandle_t clientData, tdata_t buffer, tsize_t size) { return 0; } static tsize_t gdip_tiff_filewrite (thandle_t clientData, tdata_t buffer, tsize_t size) { return (tsize_t)fwrite (buffer, 1, size, (FILE*)clientData); } static toff_t gdip_tiff_fileseek (thandle_t clientData, toff_t offSet, int whence) { int seek_ok = fseek ((FILE*)clientData, offSet, whence); if (seek_ok == 0) return offSet; return -1; } static int gdip_tiff_fileclose (thandle_t clientData) { /* This is a TIFF cleanup function; but we own the FILE* and close it in image.c so this is a null op */ return 0; } static toff_t gdip_tiff_filesize (thandle_t clientData) { long ret; long cur_pos = ftell ((FILE*)clientData); fseek ((FILE*)clientData, 0, SEEK_END); ret = ftell ((FILE*)clientData); fseek ((FILE*)clientData, cur_pos, SEEK_SET); return (toff_t)ret; } static int gdip_tiff_filedummy_map (thandle_t clientData, tdata_t *phase, toff_t* size) { return 0; } static void gdip_tiff_filedummy_unmap (thandle_t clientData, tdata_t base, toff_t size) { } static tsize_t gdip_tiff_read (thandle_t clientData, tdata_t buffer, tsize_t size) { return (tsize_t)((gdip_tiff_clientData *) clientData)->getBytesFunc (buffer, size, 0); } static tsize_t gdip_tiff_read_none (thandle_t clientData, tdata_t buffer, tsize_t size) { return 0; } static tsize_t gdip_tiff_write (thandle_t clientData, tdata_t buffer, tsize_t size) { return (tsize_t)((gdip_tiff_clientData *) clientData)->putBytesFunc (buffer, size); } static toff_t gdip_tiff_seek (thandle_t clientData, toff_t offSet, int whence) { return (toff_t)((gdip_tiff_clientData *) clientData)->seekFunc (offSet, whence); } static int gdip_tiff_close (thandle_t clientData) { /* We should not close the user provided streams */ /* ((gdip_tiff_clientData *) clientData)->closeFunc (); */ return 1; } static toff_t gdip_tiff_size (thandle_t clientData) { return (toff_t)((gdip_tiff_clientData *) clientData)->sizeFunc (); } static int gdip_tiff_dummy_map (thandle_t clientData, tdata_t *phase, toff_t* size) { return 0; } static void gdip_tiff_dummy_unmap (thandle_t clientData, tdata_t base, toff_t size) { } ImageCodecInfo * gdip_getcodecinfo_tiff () { tiff_codec.Clsid = (CLSID) { 0x557cf405, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; tiff_codec.FormatID = gdip_tif_image_format_guid; tiff_codec.CodecName = (const WCHAR*) tiff_codecname; tiff_codec.DllName = NULL; tiff_codec.FormatDescription = (const WCHAR*) tiff_format; tiff_codec.FilenameExtension = (const WCHAR*) tiff_extension; tiff_codec.MimeType = (const WCHAR*) tiff_mimetype; tiff_codec.Flags = ImageCodecFlagsEncoder | ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; tiff_codec.Version = 1; tiff_codec.SigCount = 2; tiff_codec.SigSize = 2; tiff_codec.SigPattern = tiff_sig_pattern; tiff_codec.SigMask = tiff_sig_mask; /* Mute the lib */ TIFFSetErrorHandler(NULL); TIFFSetWarningHandler(NULL); return &tiff_codec; } static GpStatus gdip_load_tiff_properties (TIFF *tiff, BitmapData *bitmap_data) { BYTE *text; uint32 i; uint16 s; uint16 s2; char c; double d; float f; uint16 samples_per_pixel; uint16 bits_per_sample; uint16 planar_configuration; uint32 image_length; uint16 strips_per_image; uint32 rows_per_strip; uint32 tile_length; uint32 tile_width; uint16 compression = 0; samples_per_pixel = 0; bits_per_sample = 0; planar_configuration = 0; image_length = 0; strips_per_image = 0; rows_per_strip = 0; tile_length = 0; tile_width = 0; i = 0; s = 0; s2 = 0; if (TIFFGetField(tiff, TIFFTAG_ARTIST, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagArtist, text); } if (TIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bits_per_sample)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagBitsPerSample, bits_per_sample); } { uint16 *rmap; uint16 *gmap; uint16 *bmap; if (TIFFGetField(tiff, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap)) { BYTE *buffer; uint16 *ptr; if ((rmap != NULL) && (gmap != NULL) && (bmap != NULL)) { buffer = GdipAlloc (3 * bits_per_sample * sizeof (uint16)); if (buffer != NULL) { ptr = (uint16 *)buffer; for (i = 0; i < bits_per_sample; i++) { ptr[0] = rmap[i]; ptr[1] = gmap[i]; ptr[2] = bmap[i]; ptr += 3; } gdip_bitmapdata_property_add(bitmap_data, PropertyTagColorMap, 3 * bits_per_sample * sizeof(uint16), PropertyTagTypeShort, buffer); GdipFree(buffer); } } } } if (TIFFGetField(tiff, TIFFTAG_COMPRESSION, &s)) { compression = s; gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagCompression, s); } if (TIFFGetField(tiff, TIFFTAG_COPYRIGHT, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagCopyright, text); } if (TIFFGetField(tiff, TIFFTAG_DATETIME, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagDateTime, text); } if (TIFFGetField(tiff, TIFFTAG_DOCUMENTNAME, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagDocumentName, text); } if (TIFFGetField(tiff, TIFFTAG_DOTRANGE, &s, &s2)) { gdip_bitmapdata_property_add_srational(bitmap_data, PropertyTagDotRange, s, s2); } { uint16 count; uint16 *samples; if (TIFFGetField(tiff, TIFFTAG_EXTRASAMPLES, &count, &samples)) { if ((count > 0) && (samples != NULL)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagExtraSamples, count * sizeof(uint16), PropertyTagTypeShort, samples); } } } if (TIFFGetField(tiff, TIFFTAG_FILLORDER, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagFillOrder, s); } if (TIFFGetField(tiff, TIFFTAG_GROUP3OPTIONS, &i, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagT4Option, i); } if (TIFFGetField(tiff, TIFFTAG_GROUP4OPTIONS, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagT6Option, i); } if (TIFFGetField(tiff, TIFFTAG_HALFTONEHINTS, &s, &s2)) { gdip_bitmapdata_property_add_srational(bitmap_data, PropertyTagHalftoneHints, s, s2); } if (TIFFGetField(tiff, TIFFTAG_HOSTCOMPUTER, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagHostComputer, text); } if (TIFFGetField(tiff, TIFFTAG_IMAGEDESCRIPTION, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagImageDescription, text); } if (TIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagImageWidth, i); } if (TIFFGetField(tiff, TIFFTAG_IMAGELENGTH, &image_length)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagImageHeight, image_length); } if (TIFFGetField(tiff, TIFFTAG_INKNAMES, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagInkNames, text); } if (TIFFGetField(tiff, TIFFTAG_INKSET, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagInkSet, s); } #ifdef NotImplemented /* Don't know how this property should be stored, datatype is void */ { uint32 count; void *tables; if (TIFFGetField(tiff, TIFFTAG_JPEGTABLES, &count, &tables)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagJPEGTables, text); } } #endif if (TIFFGetField(tiff, TIFFTAG_JPEGQUALITY, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagJPEGQuality, i); } if (TIFFGetField(tiff, TIFFTAG_MAKE, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagEquipMake, text); } if (TIFFGetField(tiff, TIFFTAG_MAXSAMPLEVALUE, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagMaxSampleValue, s); } if (TIFFGetField(tiff, TIFFTAG_MINSAMPLEVALUE, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagMinSampleValue, s); } if (TIFFGetField(tiff, TIFFTAG_MODEL, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagEquipModel, text); } if (TIFFGetField(tiff, TIFFTAG_ORIENTATION, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagOrientation, s); } if (TIFFGetField(tiff, TIFFTAG_PAGENAME, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagPageName, text); } if (TIFFGetField(tiff, TIFFTAG_PAGENUMBER, &s, &s2)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagPageNumber, s); } if (TIFFGetField(tiff, TIFFTAG_PHOTOMETRIC, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagPhotometricInterp, s); } if (TIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planar_configuration)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagPlanarConfig, planar_configuration); } if (compression == COMPRESSION_ADOBE_DEFLATE) { if (TIFFGetField(tiff, TIFFTAG_PREDICTOR, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagPredictor, s); } } { float *chromacities = NULL; /* 6-entry array */ if (TIFFGetField(tiff, TIFFTAG_PRIMARYCHROMATICITIES, &chromacities) && (chromacities != NULL)) { BYTE *buffer; uint32 *ptr; buffer = GdipAlloc(6 * (sizeof(uint32) + sizeof(uint32))); if (buffer != NULL) { ptr = (uint32 *)buffer; for (i = 0; i < 6; i++) { ptr[0] = (uint32)(chromacities[i] * 1000000); ptr[1] = 1000000; ptr += 2; } gdip_bitmapdata_property_add (bitmap_data, PropertyTagPrimaryChromaticities, 6 * (sizeof(uint32) + sizeof(uint32)), PropertyTagTypeRational, buffer); GdipFree(buffer); } } } if (TIFFGetField(tiff, TIFFTAG_RESOLUTIONUNIT, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagResolutionUnit, s); } if (TIFFGetField(tiff, TIFFTAG_ROWSPERSTRIP, &rows_per_strip)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagRowsPerStrip, rows_per_strip); } if (TIFFGetField(tiff, TIFFTAG_SAMPLEFORMAT, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagSampleFormat, s); } if (TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagSamplesPerPixel, samples_per_pixel); } if (samples_per_pixel > 0) { float *ref_blackwhite; /* 2 * SamplesPerPixel array */ if (TIFFGetField(tiff, TIFFTAG_REFERENCEBLACKWHITE, &ref_blackwhite)) { BYTE *buffer; uint32 *ptr; buffer = GdipAlloc(2 * samples_per_pixel * (sizeof(uint32) + sizeof(uint32))); if (buffer != NULL) { ptr = (uint32 *)buffer; for (i = 0; i < 2 * samples_per_pixel; i++) { ptr[0] = (uint32)(ref_blackwhite[i] * 1000000); ptr[1] = 1000000; ptr += 2; } gdip_bitmapdata_property_add (bitmap_data, PropertyTagREFBlackWhite, 6 * (sizeof(uint32) + sizeof(uint32)), PropertyTagTypeRational, buffer); GdipFree(buffer); } } } if (TIFFGetField(tiff, TIFFTAG_SMAXSAMPLEVALUE, &d)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagSMaxSampleValue, d * 1000000, 1000000); } if (TIFFGetField(tiff, TIFFTAG_SMINSAMPLEVALUE, &d)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagSMinSampleValue, d * 1000000, 1000000); } if (TIFFGetField(tiff, TIFFTAG_SOFTWARE, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagSoftwareUsed, text); } if ((rows_per_strip != 0) && (planar_configuration != 0)) { uint32 *bytecounts; uint32 *offsets; int count; strips_per_image = floor ((image_length + rows_per_strip - 1) / rows_per_strip); if (planar_configuration == 1) { count = strips_per_image; } else { count = samples_per_pixel * strips_per_image; } if (TIFFGetField(tiff, TIFFTAG_STRIPBYTECOUNTS, &bytecounts)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagStripBytesCount, count * sizeof(uint32), PropertyTagTypeLong, bytecounts); } if (TIFFGetField(tiff, TIFFTAG_STRIPOFFSETS, &offsets)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagStripOffsets, count * sizeof(uint32), PropertyTagTypeLong, offsets); } } if (TIFFGetField(tiff, TIFFTAG_SUBFILETYPE, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagNewSubfileType, i); } if (TIFFGetField(tiff, TIFFTAG_TARGETPRINTER, &text)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagTargetPrinter, text); } if (TIFFGetField(tiff, TIFFTAG_THRESHHOLDING, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagThreshHolding, s); } if (TIFFGetField(tiff, TIFFTAG_TILEWIDTH, &tile_width)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagTileWidth, tile_width); } if (TIFFGetField(tiff, TIFFTAG_TILELENGTH, &tile_length)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagTileLength, tile_length); } if ((planar_configuration != 0) && (tile_width != 0) && (tile_length != 0)) { uint32 *byte_counts; uint32 *offsets; uint32 tiles_across; uint32 tiles_down; int tiles_per_image; int count; tiles_across = (image_length + tile_width - 1) / tile_width; tiles_down = (image_length + tile_length - 1) / tile_length; tiles_per_image = tiles_across * tiles_down; if (planar_configuration == 1) { count = tiles_per_image; } else { count = samples_per_pixel * tiles_per_image; } if (TIFFGetField(tiff, TIFFTAG_TILEBYTECOUNTS, &byte_counts)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagTileByteCounts, count * sizeof(uint32), PropertyTagTypeLong, byte_counts); } if (TIFFGetField(tiff, TIFFTAG_TILEOFFSETS, &offsets)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagTileOffset, count * sizeof(uint32), PropertyTagTypeLong, offsets); } } if (samples_per_pixel == 1) { uint16 *sample; if (TIFFGetField(tiff, TIFFTAG_TRANSFERFUNCTION, &sample)) { gdip_bitmapdata_property_add (bitmap_data, PropertyTagTransferFunction, (1 << bits_per_sample) * sizeof(uint16), PropertyTagTypeShort, sample); } } else if (samples_per_pixel == 3) { uint16 *r; uint16 *g; uint16 *b; if (TIFFGetField(tiff, TIFFTAG_TRANSFERFUNCTION, &r, &g, &b)) { BYTE *buffer; uint16 *ptr; buffer = GdipAlloc(3 * (1 << samples_per_pixel) * sizeof(uint16)); if (buffer != NULL) { ptr = (uint16 *)buffer; for (i = 0; i < 1 << bits_per_sample; i++) { ptr[i] = r[i]; ptr[i + 1] = g[i]; ptr[i + 2] = b[i]; } gdip_bitmapdata_property_add (bitmap_data, PropertyTagTransferFunction, 3 * (1 << samples_per_pixel) * sizeof(uint16), PropertyTagTypeShort, buffer); GdipFree(buffer); } } } { float *whitepoints; if (TIFFGetField(tiff, TIFFTAG_WHITEPOINT, &whitepoints)) { BYTE *buffer; uint32 *ptr; buffer = GdipAlloc(2 * (sizeof(uint32) + sizeof(uint32))); if (buffer != NULL) { ptr = (uint32 *)buffer; ptr[0] = whitepoints[0] * 1000000; ptr[1] = 1000000; ptr[2] = whitepoints[1] * 1000000; ptr[3] = 1000000; gdip_bitmapdata_property_add (bitmap_data, PropertyTagTransferFunction, 2 * (sizeof(uint32) + sizeof(uint32)), PropertyTagTypeRational, buffer); GdipFree(buffer); } gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagWhitePoint, whitepoints[0] * 1000000, 1000000); } } if (TIFFGetField(tiff, TIFFTAG_XPOSITION, &f)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagXPosition, f * 1000000, 1000000); } if (TIFFGetField(tiff, TIFFTAG_XRESOLUTION, &f)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagXResolution, f, 1); } { float *coefficients; if (TIFFGetField(tiff, TIFFTAG_YCBCRCOEFFICIENTS, &coefficients)) { BYTE buffer[sizeof(uint32) * 6]; uint32 *ptr; ptr = (uint32 *)&buffer; ptr[0] = (uint32)(coefficients[0] * 1000000); ptr[1] = 1000000; ptr[2] = (uint32)(coefficients[1] * 1000000); ptr[3] = 1000000; ptr[4] = (uint32)(coefficients[2] * 1000000); ptr[5] = 1000000; gdip_bitmapdata_property_add(bitmap_data, PropertyTagYCbCrCoefficients, sizeof(uint32) * 6, PropertyTagTypeRational, buffer); } } if (TIFFGetField(tiff, TIFFTAG_YCBCRPOSITIONING, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagYCbCrPositioning, s); } if (TIFFGetField(tiff, TIFFTAG_YCBCRSUBSAMPLING, &s, &s2)) { gdip_bitmapdata_property_add_srational(bitmap_data, PropertyTagYCbCrSubsampling, s, s2); } if (TIFFGetField(tiff, TIFFTAG_YPOSITION, &f)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagYPosition, f * 1000000, 1000000); } if (TIFFGetField(tiff, TIFFTAG_YRESOLUTION, &f)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagYResolution, f, 1); } #ifdef NotImplemented /* Not sure what type the data is */ { uint32 count; void *profile_data; if (TIFFGetField(tiff, TIFFTAG_ICCPROFILE, &count, &profile_data)) { gdip_bitmapdata_property_add(bitmap_data, PropertyTagICCProfile, count * sizeof(void *), , profile_data); } } #endif /* EXIF section */ if (TIFFGetField(tiff, TIFFTAG_EXIFIFD, &i)) { gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagExifIFD, i); } return Ok; } static GpStatus gdip_save_tiff_properties (TIFF *tiff, BitmapData *bitmap_data, int samples_per_pixel, int bits_per_sample) { int index; BYTE *text; guint32 i; guint32 l; int j; uint16 s; uint16 s2; double d; float f; i = 0; s = 0; s2 = 0; d = 0; if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagArtist, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_ARTIST, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagCopyright, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_COPYRIGHT, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagDateTime, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_DATETIME, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagDocumentName, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_DOCUMENTNAME, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagDotRange, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); gdip_property_get_short(2, bitmap_data->property[index].value, &s2); TIFFSetField(tiff, TIFFTAG_DOTRANGE, s, s2); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagExtraSamples, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_EXTRASAMPLES, bitmap_data->property[index].length, bitmap_data->property[index].value); } else { TIFFSetField (tiff, TIFFTAG_EXTRASAMPLES, 1, EXTRASAMPLE_UNSPECIFIED); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagFillOrder, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_FILLORDER, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagT4Option, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &l); TIFFSetField(tiff, TIFFTAG_GROUP3OPTIONS, l); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagT6Option, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &l); TIFFSetField(tiff, TIFFTAG_GROUP4OPTIONS, l); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagHalftoneHints, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); gdip_property_get_short(2, bitmap_data->property[index].value, &s2); TIFFSetField(tiff, TIFFTAG_HALFTONEHINTS, s, s2); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagHostComputer, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_HOSTCOMPUTER, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagImageDescription, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_IMAGEDESCRIPTION, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagInkNames, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_INKNAMES, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagInkSet, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_INKSET, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagJPEGQuality, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &l); TIFFSetField(tiff, TIFFTAG_JPEGQUALITY, l); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagEquipMake, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_MAKE, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagMaxSampleValue, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_MAXSAMPLEVALUE, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagMinSampleValue, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_MINSAMPLEVALUE, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagEquipModel, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_MODEL, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagOrientation, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_ORIENTATION, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagPageName, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_PAGENAME, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagPhotometricInterp, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagPredictor, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_PREDICTOR, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagPrimaryChromaticities, &index) == Ok) { float chromacities[6]; for (j = 0; j < 6; j++) { gdip_property_get_long(j * 8, bitmap_data->property[index].value, &i); chromacities[j] = (float)i / 1000000; } TIFFSetField(tiff, TIFFTAG_PRIMARYCHROMATICITIES, &chromacities); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagResolutionUnit, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_RESOLUTIONUNIT, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagSampleFormat, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_SAMPLEFORMAT, s); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagREFBlackWhite, &index) == Ok) { float *ref_blackwhite; /* 2 * SamplesPerPixel array */ ref_blackwhite = GdipAlloc(2 * samples_per_pixel * sizeof(float)); if (ref_blackwhite != NULL) { for (j = 0; j < (2 * samples_per_pixel); j++) { gdip_property_get_long(j * 8, bitmap_data->property[index].value, &i); ref_blackwhite[j] = (float)i / 1000000; } TIFFSetField(tiff, TIFFTAG_REFERENCEBLACKWHITE, &ref_blackwhite); GdipFree(ref_blackwhite); } } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagSMaxSampleValue, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); d = (double)i / 10000000; TIFFSetField(tiff, TIFFTAG_SMAXSAMPLEVALUE, d); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagSMinSampleValue, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); d = (double)i / 10000000; TIFFSetField(tiff, TIFFTAG_SMINSAMPLEVALUE, d); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagSoftwareUsed, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_SOFTWARE, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagNewSubfileType, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_SUBFILETYPE, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagNewSubfileType, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &l); TIFFSetField(tiff, TIFFTAG_SUBFILETYPE, l); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagTargetPrinter, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_TARGETPRINTER, bitmap_data->property[index].value); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagThreshHolding, &index) == Ok) { gdip_property_get_short(0, bitmap_data->property[index].value, &s); TIFFSetField(tiff, TIFFTAG_THRESHHOLDING, s); } if (samples_per_pixel == 1) { if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagTransferFunction, &index) == Ok) { TIFFSetField(tiff, TIFFTAG_TRANSFERFUNCTION, bitmap_data->property[index].value); } } else if (samples_per_pixel == 3) { if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagTransferFunction, &index) == Ok) { uint16 *rmap; uint16 *gmap; uint16 *bmap; rmap = GdipAlloc((1 << samples_per_pixel) * sizeof(uint16)); gmap = GdipAlloc((1 << samples_per_pixel) * sizeof(uint16)); bmap = GdipAlloc( (1 << samples_per_pixel) * sizeof(uint16)); if ((rmap != NULL) && (gmap != NULL) && (bmap != NULL)) { for (j = 0; j < 1 << bits_per_sample; j++) { gdip_property_get_short((j * 3), bitmap_data->property[index].value, &rmap[j]); gdip_property_get_short((j * 3) + 1, bitmap_data->property[index].value, &gmap[j]); gdip_property_get_short((j * 3) + 2, bitmap_data->property[index].value, &bmap[j]); } TIFFSetField(tiff, TIFFTAG_TRANSFERFUNCTION, rmap, gmap, bmap); } if (rmap != NULL) { GdipFree(rmap); } if (gmap != NULL) { GdipFree(gmap); } if (bmap != NULL) { GdipFree(bmap); } } } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagXPosition, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); f = (float)i / 10000000; TIFFSetField(tiff, TIFFTAG_XPOSITION, f); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagXResolution, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); f = (float)i; TIFFSetField(tiff, TIFFTAG_XRESOLUTION, f); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagYCbCrCoefficients, &index) == Ok) { float coefficients[3]; gdip_property_get_long(0, bitmap_data->property[index].value, &i); coefficients[0] = (float)i / 1000000; gdip_property_get_long(8, bitmap_data->property[index].value, &i); coefficients[1] = (float)i / 1000000; gdip_property_get_long(16, bitmap_data->property[index].value, &i); coefficients[2] = (float)i / 1000000; TIFFSetField(tiff, TIFFTAG_YCBCRCOEFFICIENTS, coefficients); } if (TIFFGetField(tiff, TIFFTAG_YCBCRPOSITIONING, &s)) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagYCbCrPositioning, s); } if (TIFFGetField(tiff, TIFFTAG_YCBCRSUBSAMPLING, &s, &s2)) { gdip_bitmapdata_property_add_srational(bitmap_data, PropertyTagYCbCrSubsampling, s, s2); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagYPosition, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); f = (float)i / 1000000; TIFFSetField(tiff, TIFFTAG_YPOSITION, f); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagYResolution, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); f = (float)i; TIFFSetField(tiff, TIFFTAG_YRESOLUTION, f); } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagExifIFD, &index) == Ok) { gdip_property_get_long(0, bitmap_data->property[index].value, &i); TIFFSetField(tiff, TIFFTAG_EXIFIFD, d); } return Ok; } /*TODO Handle TIFF Encoder Parameters*/ static GpStatus gdip_save_tiff_image (TIFF* tiff, GpImage *image, GDIPCONST EncoderParameters *params) { int frame; int x; int y; int i; int num_of_pages; int page; BitmapData *bitmap_data; BYTE *pixbuf; int samples_per_pixel; int bits_per_sample; if (tiff == NULL) { return InvalidParameter; } /* Count all pages, we need to know ahead */ num_of_pages = 0; for (frame = 0; frame < image->num_of_frames; frame++) { num_of_pages += image->frames[frame].count; for (i = 0; i < image->frames[frame].count; i++) { if (gdip_is_an_indexed_pixelformat (image->frames[frame].bitmap[i].pixel_format)) { return NotImplemented; /* FIXME? */ } } } page = 0; for (frame = 0; frame < image->num_of_frames; frame++) { for (i = 0; i < image->frames[frame].count; i++) { bitmap_data = &image->frames[frame].bitmap[i]; if (num_of_pages > 1) { if ((frame > 0) && (i > 0)) { TIFFCreateDirectory(tiff); } TIFFSetField (tiff, TIFFTAG_SUBFILETYPE, FILETYPE_PAGE); TIFFSetField (tiff, TIFFTAG_PAGENUMBER, page, num_of_pages); } if (((bitmap_data->pixel_format & PixelFormatAlpha) != 0) || (bitmap_data->pixel_format == PixelFormat32bppRGB)) { samples_per_pixel = 4; bits_per_sample = 8; } else { samples_per_pixel = 3; bits_per_sample = 8; } gdip_save_tiff_properties(tiff, bitmap_data, samples_per_pixel, bits_per_sample); TIFFSetField (tiff, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel); TIFFSetField (tiff, TIFFTAG_IMAGEWIDTH, bitmap_data->width); TIFFSetField (tiff, TIFFTAG_IMAGELENGTH, bitmap_data->height); TIFFSetField (tiff, TIFFTAG_BITSPERSAMPLE, bits_per_sample); TIFFSetField (tiff, TIFFTAG_COMPRESSION, COMPRESSION_NONE); TIFFSetField (tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); TIFFSetField (tiff, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); TIFFSetField (tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize (tiff, bitmap_data->stride)); TIFFSetField (tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); pixbuf = GdipAlloc (bitmap_data->width * samples_per_pixel); if (pixbuf == NULL) { goto error; } if (samples_per_pixel == 4) { for (y = 0; y < bitmap_data->height; y++) { for (x = 0; x < bitmap_data->width; x++) { #ifdef WORDS_BIGENDIAN pixbuf[x*4+0] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 1); pixbuf[x*4+1] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 2); pixbuf[x*4+2] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 3); pixbuf[x*4+3] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 0); #else pixbuf[x*4+0] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 2); pixbuf[x*4+1] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 1); pixbuf[x*4+2] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 0); pixbuf[x*4+3] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 3); #endif } TIFFWriteScanline (tiff, pixbuf, y, 0); } } else { for (y = 0; y < bitmap_data->height; y++) { for (x = 0; x < bitmap_data->width; x++) { #ifdef WORDS_BIGENDIAN pixbuf[x*3+0] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 1); pixbuf[x*3+1] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 2); pixbuf[x*3+2] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 3); #else pixbuf[x*3+0] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 2); pixbuf[x*3+1] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 1); pixbuf[x*3+2] = *((BYTE*)bitmap_data->scan0 + (bitmap_data->stride * y) + (x*4) + 0); #endif } TIFFWriteScanline (tiff, pixbuf, y, 0); } } GdipFree(pixbuf); TIFFWriteDirectory (tiff); page++; } } TIFFClose (tiff); return Ok; error: TIFFClose (tiff); return OutOfMemory; } static GpStatus gdip_load_tiff_image (TIFF *tiff, GpImage **image) { int i; char error_message[1024]; int num_of_pages; GpImage *result; int page; TIFFRGBAImage tiff_image; FrameData *frame; BitmapData *bitmap_data; size_t num_of_pixels; char *pixbuf; char *pixbuf_row; guint32 *pixbuf_ptr; guint16 samples_per_pixel; float dpi; if (tiff == NULL) { *image = NULL; /* we cannot call TIFFClose(tiff); with a NULL value since it will crash - bnc #569940 */ return InvalidParameter; } pixbuf_row = NULL; pixbuf = NULL; num_of_pages = TIFFNumberOfDirectories(tiff); result = gdip_bitmap_new(); if (!result) return OutOfMemory; result->type = ImageTypeBitmap; frame = gdip_frame_add(result, &gdip_image_frameDimension_page_guid); for (page = 0; page < num_of_pages; page++) { unsigned long long int size; bitmap_data = gdip_frame_add_bitmapdata(frame); if (bitmap_data == NULL) { goto error; } if (!TIFFSetDirectory(tiff, page)) { goto error; } gdip_load_tiff_properties(tiff, bitmap_data); if (!TIFFRGBAImageBegin(&tiff_image, tiff, 0, error_message)) { /* Can we use the error message somewhere? */ goto error; } if (TIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples_per_pixel)) { if (samples_per_pixel != 4) { bitmap_data->pixel_format = PixelFormat24bppRGB; } else { bitmap_data->pixel_format = PixelFormat32bppARGB; bitmap_data->image_flags |= ImageFlagsHasAlpha; } } if (TIFFGetField(tiff, TIFFTAG_XRESOLUTION, &dpi)) { bitmap_data->dpi_horz = dpi; bitmap_data->image_flags |= ImageFlagsHasRealDPI; } if (TIFFGetField(tiff, TIFFTAG_YRESOLUTION, &dpi)) { bitmap_data->dpi_vert = dpi; bitmap_data->image_flags |= ImageFlagsHasRealDPI; } /* width and height are uint32, but TIFF uses 32 bits offsets (so it's real size limit is 4GB), * however libtiff uses signed int (int32 not uint32) as offsets so we limit ourselves to 2GB */ size = tiff_image.width; /* stride is a (signed) _int_ and once multiplied by 4 it should hold a value that can be allocated by GdipAlloc * this effectively limits 'width' to 536870911 pixels */ size *= sizeof (guint32); if (size > G_MAXINT32) goto error; bitmap_data->stride = size; bitmap_data->width = tiff_image.width; bitmap_data->height = tiff_image.height; bitmap_data->reserved = GBD_OWN_SCAN0; bitmap_data->image_flags |= ImageFlagsColorSpaceRGB | ImageFlagsHasRealPixelSize | ImageFlagsReadOnly; /* ensure total 'size' does not overflow an integer and fits inside our 2GB limit */ size *= tiff_image.height; if (size > G_MAXINT32) goto error; pixbuf = GdipAlloc (size); if (pixbuf == NULL) { goto error; } /* Flip the image. TIFF has its origin at bottom left, and is in ARGB instead of ABGR */ if (!TIFFRGBAImageGet(&tiff_image, (uint32 *)pixbuf, tiff_image.width, tiff_image.height)) { goto error; } pixbuf_row = GdipAlloc(bitmap_data->stride); if (pixbuf_row == NULL) { goto error; } /* First, flip rows */ for (i = 0; i < tiff_image.height / 2; i++) { memcpy(pixbuf_row, pixbuf + (bitmap_data->stride * i), bitmap_data->stride); memcpy(pixbuf + (bitmap_data->stride * i), pixbuf + (bitmap_data->stride * (tiff_image.height - i - 1)), bitmap_data->stride); memcpy(pixbuf + (bitmap_data->stride * (tiff_image.height - i - 1)), pixbuf_row, bitmap_data->stride); } /* Now flip from ARGB to ABGR processing one pixel (4 bytes) at the time */ pixbuf_ptr = (guint32 *)pixbuf; for (i = 0; i < (size >> 2); i++) { *pixbuf_ptr = (*pixbuf_ptr & 0xff000000) | ((*pixbuf_ptr & 0x00ff0000) >> 16) | (*pixbuf_ptr & 0x0000ff00) | ((*pixbuf_ptr & 0x000000ff) << 16); pixbuf_ptr++; } GdipFree(pixbuf_row); bitmap_data->scan0 = (BYTE*) pixbuf; pixbuf_row = NULL; pixbuf = NULL; TIFFRGBAImageEnd (&tiff_image); } gdip_bitmap_setactive(result, &gdip_image_frameDimension_page_guid, 0); TIFFClose(tiff); *image = result; return Ok; error: /* coverity[dead_error_line] */ if (pixbuf_row != NULL) { GdipFree(pixbuf_row); } if (pixbuf != NULL) { GdipFree(pixbuf); } if (result != NULL) { gdip_bitmap_dispose(result); } TIFFRGBAImageEnd (&tiff_image); TIFFClose(tiff); return OutOfMemory; } GpStatus gdip_load_tiff_image_from_file (FILE *fp, GpImage **image) { TIFF *tif = NULL; tif = TIFFClientOpen("", "r", (thandle_t) fp, gdip_tiff_fileread, gdip_tiff_filewrite, gdip_tiff_fileseek, gdip_tiff_fileclose, gdip_tiff_filesize, gdip_tiff_filedummy_map, gdip_tiff_filedummy_unmap); return gdip_load_tiff_image (tif, image); } GpStatus gdip_save_tiff_image_to_file (BYTE *filename, GpImage *image, GDIPCONST EncoderParameters *params) { TIFF* tiff; tiff = TIFFOpen((char *)filename, "w"); if (!tiff) return FileNotFound; return gdip_save_tiff_image (tiff, image, params); } GpStatus gdip_load_tiff_image_from_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage **image) { TIFF *tif = NULL; gdip_tiff_clientData clientData; clientData.getBytesFunc = getBytesFunc; clientData.putBytesFunc = putBytesFunc; clientData.seekFunc = seekFunc; clientData.closeFunc = closeFunc; clientData.sizeFunc = sizeFunc; tif = TIFFClientOpen("", "r", (thandle_t) &clientData, gdip_tiff_read, gdip_tiff_write, gdip_tiff_seek, gdip_tiff_close, gdip_tiff_size, gdip_tiff_dummy_map, gdip_tiff_dummy_unmap); return gdip_load_tiff_image (tif, image); } GpStatus gdip_save_tiff_image_to_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage *image, GDIPCONST EncoderParameters *params) { TIFF* tiff; gdip_tiff_clientData clientData; clientData.getBytesFunc = getBytesFunc; clientData.putBytesFunc = putBytesFunc; clientData.seekFunc = seekFunc; clientData.closeFunc = closeFunc; clientData.sizeFunc = sizeFunc; tiff = TIFFClientOpen("", "w", (thandle_t) &clientData, gdip_tiff_read_none, gdip_tiff_write, gdip_tiff_seek, gdip_tiff_close, gdip_tiff_size, gdip_tiff_dummy_map, gdip_tiff_dummy_unmap); if (!tiff) return InvalidParameter; return gdip_save_tiff_image (tiff, image, params); } #else /* no libtiff */ #include "image.h" ImageCodecInfo * gdip_getcodecinfo_tiff () { return NULL; } GpStatus gdip_load_tiff_image_from_file (FILE *fp, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_load_tiff_image_from_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_save_tiff_image_to_file (BYTE *filename, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } GpStatus gdip_save_tiff_image_to_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } #endif libgdiplus-2.11/src/pen-private.h0000664000175000017500000000545112225470167013723 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __PEN_PRIVATE_H__ #define __PEN_PRIVATE_H__ #include "gdiplus-private.h" #include "matrix-private.h" struct _Pen { int color; GpBrush *brush; BOOL own_brush; float width; float miter_limit; GpLineJoin line_join; GpDashStyle dash_style; GpLineCap line_cap; /* Cairo supports only same kind of end caps for both the ends. */ GpLineCap end_cap; GpDashCap dash_cap; /* not supported */ int compound_count; float *compound_array; GpPenAlignment mode; float dash_offset; int dash_count; BOOL own_dash_array; /* flag to mark if pen maintains its own array or global array */ float *dash_array; GpUnit unit; /* Always set to UnitWorld. */ cairo_matrix_t matrix; BOOL changed; /* flag to mark if pen is changed and needs setup */ GpCustomLineCap *custom_start_cap; GpCustomLineCap *custom_end_cap; }; GpStatus gdip_pen_setup (GpGraphics *graphics, GpPen *pen) GDIP_INTERNAL; GpStatus gdip_pen_draw_custom_start_cap (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2); GpStatus gdip_pen_draw_custom_end_cap (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2); #include "pen.h" #endif libgdiplus-2.11/src/emfcodec.h0000664000175000017500000000765612225470167013247 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __EMFCODEC_H__ #define __EMFCODEC_H__ #include "gdiplus-private.h" #include "metafile-private.h" #include "graphics-private.h" /* * Some interesting links... * http://wvware.sourceforge.net/caolan/ora-wmf.html * http://www.undocprint.org/formats/winspool/emf */ #define EMF_MIN_RECORD_SIZE 8 #define EMF_CHECK_PARAMS(x) do { \ if (params < (x)) goto cleanup; \ } while (0) #define EMF_FUNCTION 0 #define EMF_RECORDSIZE 4 #define DWP1 8 #define DWP2 12 #define DWP3 16 #define DWP4 20 #define DWP5 24 #define DWP6 28 #define DWP7 32 #define DWP8 36 #define DWP9 40 #define DWP10 44 #define DWP11 48 #define DWP(y) (8 + ((y) << 2)) #define EMR_HEADER 1 #define EMR_POLYBEZIER 2 #define EMR_POLYGON 3 #define EMR_POLYPOLYGON 8 #define EMR_SETWINDOWEXTEX 9 #define EMR_SETWINDOWORGEX 10 #define EMR_SETVIEWPORTEXTEX 11 #define EMR_SETVIEWPORTORGEX 12 #define EMR_SETBRUSHORGEX 13 #define EMR_EOF 14 #define EMR_SETMAPMODE 17 #define EMR_SETBKMODE 18 #define EMR_SETPOLYFILLMODE 19 #define EMR_SETROP2 20 #define EMR_SETSTRETCHBLTMODE 21 #define EMR_SETTEXTALIGN 22 #define EMR_SETTEXTCOLOR 24 #define EMR_MOVETOEX 27 #define EMR_INTERSECTCLIPRECT 30 #define EMR_SAVEDC 33 #define EMR_RESTOREDC 34 #define EMR_SETWORLDTRANSFORM 35 #define EMR_MODIFYWORLDTRANSFORM 36 #define EMR_SELECTOBJECT 37 #define EMR_CREATEPEN 38 #define EMR_CREATEBRUSHINDIRECT 39 #define EMR_DELETEOBJECT 40 #define EMR_LINETO 54 #define EMR_SETMITERLIMIT 58 #define EMR_BEGINPATH 59 #define EMR_ENDPATH 60 #define EMR_CLOSEFIGURE 61 #define EMR_FILLPATH 62 #define EMR_STROKEANDFILLPATH 63 #define EMR_STROKEPATH 64 #define EMR_SELECTCLIPPATH 67 #define EMR_GDICOMMENT 70 #define EMR_EXTSELECTCLIPRGN 75 #define EMR_EXTCREATEFONTINDIRECTW 82 #define EMR_EXTTEXTOUTA 83 #define EMR_EXTTEXTOUTW 84 #define EMR_POLYGON16 86 #define EMR_POLYBEZIERTO16 88 #define EMR_POLYPOLYGON16 91 #define EMR_EXTCREATEPEN 95 /* some old GDI cruft we need to consider... */ #define ENHMETA_STOCK_OBJECT 0x80000000 #define WHITE_BRUSH 0 #define LTGRAY_BRUSH 1 #define GRAY_BRUSH 2 #define DKGRAY_BRUSH 3 #define BLACK_BRUSH 4 #define NULL_BRUSH 5 #define WHITE_PEN 6 #define BLACK_PEN 7 #define NULL_PEN 8 #define OEM_FIXED_FONT 10 #define ANSI_FIXED_FONT 11 #define ANSI_VAR_FONT 12 #define SYSTEM_FONT 13 #define DEVICE_DEFAULT_FONT 14 #define DEFAULT_PALETTE 15 #define SYSTEM_FIXED_FONT 16 #define gdip_read_emf_data gdip_read_bmp_data GpStatus gdip_load_emf_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_emf_image_from_stream_delegate (dstream_t *loader, GpImage **image) GDIP_INTERNAL; /* no save functions as the EMF "codec" is a decoder only */ ImageCodecInfo* gdip_getcodecinfo_emf () GDIP_INTERNAL; #endif libgdiplus-2.11/src/stringformat.h0000664000175000017500000000741712225470167014214 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __STRINGFORMAT_H__ #define __STRINGFORMAT_H__ /* StringFormat public API (only!) */ GpStatus GdipCreateStringFormat (INT formatAttributes, LANGID language, GpStringFormat **format); GpStatus GdipStringFormatGetGenericDefault (GpStringFormat **format); GpStatus GdipStringFormatGetGenericTypographic (GpStringFormat **format); GpStatus GdipCloneStringFormat (GDIPCONST GpStringFormat* format, GpStringFormat** newFormat); GpStatus GdipDeleteStringFormat (GpStringFormat *format); GpStatus GdipGetStringFormatAlign (GDIPCONST GpStringFormat *format, StringAlignment *align); GpStatus GdipSetStringFormatAlign (GpStringFormat *format, StringAlignment align); GpStatus GdipGetStringFormatDigitSubstitution (GDIPCONST GpStringFormat *format, LANGID *language, StringDigitSubstitute *substitute); GpStatus GdipSetStringFormatDigitSubstitution (GpStringFormat *format, LANGID language, StringDigitSubstitute substitute); GpStatus GdipGetStringFormatFlags (GDIPCONST GpStringFormat *format, INT *flags); GpStatus GdipSetStringFormatFlags (GpStringFormat *format, INT flags); GpStatus GdipGetStringFormatHotkeyPrefix (GDIPCONST GpStringFormat *format, INT *hotkeyPrefix); GpStatus GdipSetStringFormatHotkeyPrefix (GpStringFormat *format, INT hotkeyPrefix); GpStatus GdipGetStringFormatLineAlign (GDIPCONST GpStringFormat *format, StringAlignment *align); GpStatus GdipSetStringFormatLineAlign (GpStringFormat *format, StringAlignment align); GpStatus GdipGetStringFormatMeasurableCharacterRangeCount (GDIPCONST GpStringFormat *format, INT *count); GpStatus GdipSetStringFormatMeasurableCharacterRanges (GpStringFormat *format, INT rangeCount, GDIPCONST CharacterRange *ranges); GpStatus GdipGetStringFormatTabStopCount (GDIPCONST GpStringFormat *format, INT *count); GpStatus GdipGetStringFormatTabStops (GDIPCONST GpStringFormat *format, INT count, REAL *firstTabOffset, REAL *tabStops); GpStatus GdipSetStringFormatTabStops (GpStringFormat *format, REAL firstTabOffset, INT count, GDIPCONST REAL *tabStops); GpStatus GdipGetStringFormatTrimming (GDIPCONST GpStringFormat *format, StringTrimming *trimming); GpStatus GdipSetStringFormatTrimming (GpStringFormat *format, StringTrimming trimming); #endif libgdiplus-2.11/src/font.c0000664000175000017500000007073112225470167012435 00000000000000/* * Copyright (c) 2004 Ximian * Copyright (c) 2004-2007 Novell, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Jordi Mas i Hernandez , 2004-2006 * Peter Dennis Bartok * Sebastien Pouliot * Jeffrey Stedfast */ #include "gdiplus-private.h" #include "font-private.h" #include "fontcollection-private.h" #include "fontfamily-private.h" #include "graphics-private.h" /* Generic fonts families */ static GStaticMutex generic = G_STATIC_MUTEX_INIT; static GpFontFamily* familySerif = NULL; static GpFontFamily* familySansSerif = NULL; static GpFontFamily* familyMonospace = NULL; static int ref_familySerif = 0; static int ref_familySansSerif = 0; static int ref_familyMonospace = 0; /* Family and collections font functions */ static void gdip_createFontFamily (GpFontFamily **family) { GpFontFamily *result = (GpFontFamily *) GdipAlloc (sizeof (GpFontFamily)); if (result) { result->height = -1; result->linespacing = -1; result->celldescent = -1; result->cellascent = -1; result->pattern = NULL; result->allocated = FALSE; } *family = result; } static GpFontCollection *system_fonts = NULL; // coverity[+alloc : arg-*0] GpStatus GdipNewInstalledFontCollection (GpFontCollection **font_collection) { if (!font_collection) return InvalidParameter; /* * Ensure we leak this data only a single time, because: * (a) there is no API to free it; * (b) other libgdiplus structures depends on that allocated data; */ if (!system_fonts) { FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, FC_FOUNDRY, NULL); FcPattern *pat = FcPatternCreate (); FcValue val; FcFontSet *col; /* Only Scalable fonts for now */ val.type = FcTypeBool; val.u.b = FcTrue; FcPatternAdd (pat, FC_SCALABLE, val, TRUE); FcObjectSetAdd (os, FC_SCALABLE); col = FcFontList (0, pat, os); FcPatternDestroy (pat); FcObjectSetDestroy (os); system_fonts = (GpFontCollection *) GdipAlloc (sizeof (GpFontCollection)); if (system_fonts) { system_fonts->fontset = col; system_fonts->config = NULL; } } *font_collection = system_fonts; return Ok; } // coverity[+alloc : arg-*0] GpStatus GdipNewPrivateFontCollection (GpFontCollection **font_collection) { GpFontCollection *result; if (!font_collection) return InvalidParameter; result = (GpFontCollection *) GdipAlloc (sizeof (GpFontCollection)); if (result) { result->fontset = NULL; result->config = FcConfigCreate (); } *font_collection = result; return Ok; } // coverity[+free : arg-0] GpStatus GdipDeletePrivateFontCollection (GpFontCollection **font_collection) { if (!font_collection) return InvalidParameter; if (*font_collection) { if ((*font_collection)->fontset != NULL) { FcFontSetDestroy ((*font_collection)->fontset); (*font_collection)->fontset = NULL; } if ((*font_collection)->config != NULL) { FcConfigDestroy ((*font_collection)->config); (*font_collection)->config = NULL; } GdipFree ((void *)*font_collection); } return Ok; } GpStatus GdipPrivateAddFontFile (GpFontCollection *font_collection, GDIPCONST WCHAR *filename) { BYTE *file; if (!font_collection || !filename) return InvalidParameter; file = (BYTE*) ucs2_to_utf8 ((const gunichar2 *)filename, -1); if (!file) return OutOfMemory; FcConfigAppFontAddFile (font_collection->config, file); GdipFree (file); return Ok; } GpStatus GdipCloneFontFamily (GpFontFamily *fontFamily, GpFontFamily **clonedFontFamily) { GpFontFamily *result; if (!fontFamily || !clonedFontFamily) return InvalidParameter; gdip_createFontFamily (&result); if (!result) return OutOfMemory; result->height = fontFamily->height; result->linespacing = fontFamily->linespacing; result->celldescent = fontFamily->celldescent; result->cellascent = fontFamily->cellascent; if (fontFamily->pattern) { result->pattern = FcPatternDuplicate (fontFamily->pattern); result->allocated = TRUE; } *clonedFontFamily = result; return Ok; } GpStatus GdipDeleteFontFamily (GpFontFamily *fontFamily) { BOOL delete = TRUE; if (!fontFamily) return InvalidParameter; g_static_mutex_lock (&generic); if (fontFamily == familySerif) { ref_familySerif--; if (ref_familySerif) delete = FALSE; else familySerif = NULL; } if (fontFamily == familySansSerif) { ref_familySansSerif--; if (ref_familySansSerif) delete = FALSE; else familySansSerif = NULL; } if (fontFamily == familyMonospace) { ref_familyMonospace--; if (ref_familyMonospace) delete = FALSE; else familyMonospace = NULL; } g_static_mutex_unlock (&generic); if (delete) { if (fontFamily->allocated) { FcPatternDestroy (fontFamily->pattern); fontFamily->pattern = NULL; } GdipFree (fontFamily); } return Ok; } static void gdip_createPrivateFontSet (GpFontCollection *font_collection) { FcObjectSet *os = FcObjectSetBuild (FC_FAMILY, FC_FOUNDRY, NULL); FcPattern *pat = FcPatternCreate (); FcFontSet *col = FcFontList (font_collection->config, pat, os); if (font_collection->fontset) FcFontSetDestroy (font_collection->fontset); FcPatternDestroy (pat); FcObjectSetDestroy (os); font_collection->fontset = col; } GpStatus GdipGetFontCollectionFamilyCount (GpFontCollection *font_collection, int *numFound) { if (!font_collection || !numFound) return InvalidParameter; if (font_collection->config) gdip_createPrivateFontSet (font_collection); if (font_collection->fontset) *numFound = font_collection->fontset->nfont; else *numFound = 0; return Ok; } GpStatus GdipGetFontCollectionFamilyList (GpFontCollection *font_collection, int num_sought, GpFontFamily *gpfamilies[], int *num_found) { int i; if (!font_collection || !gpfamilies || !num_found) return InvalidParameter; if (font_collection->config) gdip_createPrivateFontSet (font_collection); for (i = 0; i < font_collection->fontset->nfont; i++) { gdip_createFontFamily(&gpfamilies[i]); gpfamilies[i]->pattern = font_collection->fontset->fonts[i]; gpfamilies[i]->allocated = FALSE; } *num_found = font_collection->fontset->nfont; return Ok; } static GpStatus gdip_status_from_fontconfig (FcResult result) { switch (result) { case FcResultMatch: return Ok; case FcResultNoMatch: case FcResultTypeMismatch: case FcResultNoId: return FontFamilyNotFound; default: return GenericError; } } /* note: MUST be executed inside a lock because FcConfig isn't thread-safe */ static FcPattern* create_pattern_from_name (char* name) { FcValue val; /* FcResult must be initialized because it's changed only in error conditions */ FcResult rlt = FcResultMatch; FcPattern *full_pattern = NULL; FcPattern *name_pattern = FcPatternCreate (); if (!name_pattern) return NULL; /* find the family we want */ val.type = FcTypeString; val.u.s = (BYTE*)name; if (!FcPatternAdd (name_pattern, FC_FAMILY, val, TRUE)) { FcPatternDestroy (name_pattern); return NULL; } if (!FcConfigSubstitute (0, name_pattern, FcMatchPattern)) { FcPatternDestroy (name_pattern); return NULL; } FcDefaultSubstitute (name_pattern); full_pattern = FcFontMatch (0, name_pattern, &rlt); if (gdip_status_from_fontconfig (rlt) == Ok) { if (full_pattern == NULL) { full_pattern = name_pattern; } else { FcPatternDestroy (name_pattern); } } else { FcPatternDestroy (name_pattern); if (full_pattern) { FcPatternDestroy (full_pattern); full_pattern = NULL; } } return full_pattern; } static GStaticMutex patterns_mutex = G_STATIC_MUTEX_INIT; static GHashTable *patterns_hashtable = NULL; static GpStatus create_fontfamily_from_name (char* name, GpFontFamily **fontFamily) { GpStatus status = FontFamilyNotFound; GpFontFamily *ff = NULL; FcPattern *pat = NULL; g_static_mutex_lock (&patterns_mutex); if (patterns_hashtable) { pat = (FcPattern*) g_hash_table_lookup (patterns_hashtable, name); } else { patterns_hashtable = g_hash_table_new (g_str_hash, g_str_equal); } if (!pat) { pat = create_pattern_from_name (name); if (pat) { /* create the pattern and store it for further usage */ g_hash_table_insert (patterns_hashtable, g_strdup (name), pat); } } if (pat) { gdip_createFontFamily (&ff); if (ff) { ff->pattern = pat; ff->allocated = FALSE; status = Ok; } else status = OutOfMemory; } *fontFamily = ff; g_static_mutex_unlock (&patterns_mutex); return status; } static BOOL free_cached_pattern (gpointer key, gpointer value, gpointer user) { g_free (key); FcPatternDestroy ((FcPattern*) value); return TRUE; } void gdip_font_clear_pattern_cache (void) { g_static_mutex_lock (&patterns_mutex); if (patterns_hashtable) { g_hash_table_foreach_remove (patterns_hashtable, free_cached_pattern, NULL); g_hash_table_destroy (patterns_hashtable); } g_static_mutex_unlock (&patterns_mutex); } static GpStatus create_fontfamily_from_collection (char* name, GpFontCollection *font_collection, GpFontFamily **fontFamily) { /* note: fontset can be NULL when we supply an empty private collection */ if (font_collection->fontset) { int i; FcChar8 *str; FcPattern **gpfam = font_collection->fontset->fonts; for (i=0; i < font_collection->fontset->nfont; gpfam++, i++) { FcResult rlt = FcPatternGetString (*gpfam, FC_FAMILY, 0, &str); GpStatus status = gdip_status_from_fontconfig (rlt); if (status != Ok) return status; if (strcmp ((char *)name, (const char *)str) == 0) { gdip_createFontFamily (fontFamily); (*fontFamily)->pattern = *gpfam; (*fontFamily)->allocated = FALSE; return Ok; } } } return FontFamilyNotFound; } // coverity[+alloc : arg-*2] GpStatus GdipCreateFontFamilyFromName (GDIPCONST WCHAR *name, GpFontCollection *font_collection, GpFontFamily **fontFamily) { GpStatus status; char *string; if (!name || !fontFamily) return InvalidParameter; string = (char*)ucs2_to_utf8 ((const gunichar2 *)name, -1); if (!string) return OutOfMemory; if (font_collection) { status = create_fontfamily_from_collection (string, font_collection, fontFamily); } else { status = create_fontfamily_from_name (string, fontFamily); } GdipFree (string); return status; } GpStatus GdipGetFamilyName (GDIPCONST GpFontFamily *family, WCHAR name[LF_FACESIZE], int language) { GpStatus status; FcChar8 *fc_str; FcResult r; if (!family) return InvalidParameter; r = FcPatternGetString (family->pattern, FC_FAMILY, 0, &fc_str); status = gdip_status_from_fontconfig (r); if (status != Ok) return status; utf8_to_ucs2((const gchar *)fc_str, (gunichar2 *)name, LF_FACESIZE); return Ok; } // coverity[+alloc : arg-*0] GpStatus GdipGetGenericFontFamilySansSerif (GpFontFamily **nativeFamily) { const WCHAR MSSansSerif[] = {'M','S',' ','S','a','n','s',' ', 'S','e','r','i','f', 0}; GpStatus status = Ok; g_static_mutex_lock (&generic); if (ref_familySansSerif == 0) status = GdipCreateFontFamilyFromName (MSSansSerif, NULL, &familySansSerif); if (status == Ok) ref_familySansSerif++; else familySansSerif = NULL; g_static_mutex_unlock (&generic); *nativeFamily = familySansSerif; return status; } // coverity[+alloc : arg-*0] GpStatus GdipGetGenericFontFamilySerif (GpFontFamily **nativeFamily) { const WCHAR Serif[] = {'S','e','r','i','f', 0}; GpStatus status = Ok; g_static_mutex_lock (&generic); if (ref_familySerif == 0) status = GdipCreateFontFamilyFromName (Serif, NULL, &familySerif); if (status == Ok) ref_familySerif++; else familySerif = NULL; g_static_mutex_unlock (&generic); *nativeFamily = familySerif; return status; } // coverity[+alloc : arg-*0] GpStatus GdipGetGenericFontFamilyMonospace (GpFontFamily **nativeFamily) { const WCHAR Monospace[] = {'C','o','u','r','i', 'e', 'r', ' ', 'N', 'e', 'w', 0}; GpStatus status = Ok; g_static_mutex_lock (&generic); if (ref_familyMonospace == 0) status = GdipCreateFontFamilyFromName (Monospace, NULL, &familyMonospace); if (status == Ok) ref_familyMonospace++; else familyMonospace = NULL; g_static_mutex_unlock (&generic); *nativeFamily = familyMonospace; return status; } /* OpenType's OS/2 fsSelection Table: * * http://www.microsoft.com/typography/otspec/os2.htm#fss */ enum fsSelection { fsSelectionItalic = (1 << 0), fsSelectionUnderscore = (1 << 1), fsSelectionNegative = (1 << 2), fsSelectionOutlined = (1 << 3), fsSelectionStrikeout = (1 << 4), fsSelectionBold = (1 << 5), fsSelectionRegular = (1 << 6), fsSelectionUseTypoMetrics = (1 << 7), fsSelectionWWS = (1 << 8), fsSelectionOblique = (1 << 9), }; static void gdip_get_fontfamily_details_from_freetype (GpFontFamily *family, FT_Face face) { if (FT_IS_SFNT (face)) { TT_HoriHeader *hhea = FT_Get_Sfnt_Table (face, ft_sfnt_hhea); TT_OS2 *os2 = FT_Get_Sfnt_Table (face, ft_sfnt_os2); if (os2 && (os2->fsSelection & fsSelectionUseTypoMetrics)) { /* Use the typographic Ascender, Descender, and LineGap values for everything. */ family->linespacing = os2->sTypoAscender - os2->sTypoDescender + os2->sTypoLineGap; family->celldescent = -os2->sTypoDescender; family->cellascent = os2->sTypoAscender; } else { /* Calculate the LineSpacing for both the hhea table and the OS/2 table. */ int hhea_linespacing = hhea->Ascender + abs (hhea->Descender) + hhea->Line_Gap; int os2_linespacing = os2 ? (os2->usWinAscent + os2->usWinDescent) : 0; /* The LineSpacing is the maximum of the two sumations. */ family->linespacing = MAX (hhea_linespacing, os2_linespacing); /* If the OS/2 table exists, use usWinDescent as the * CellDescent. Otherwise use hhea's Descender value. */ family->celldescent = os2 ? os2->usWinDescent : hhea->Descender; /* If the OS/2 table exists, use usWinAscent as the * CellAscent. Otherwise use hhea's Ascender value. */ family->cellascent = os2 ? os2->usWinAscent : hhea->Ascender; } } else { /* Fall back to using whatever FreeType2 provides. */ family->celldescent = -face->descender; family->cellascent = face->ascender; family->linespacing = face->height; } family->height = face->units_per_EM; } #ifdef USE_PANGO_RENDERING PangoFontDescription* gdip_get_pango_font_description (GpFont *font) { if (!font->pango) { font->pango = pango_font_description_from_string ((char*)font->face); pango_font_description_set_size (font->pango, font->emSize * PANGO_SCALE); if (font->style & FontStyleBold) pango_font_description_set_weight (font->pango, PANGO_WEIGHT_BOLD); if (font->style & FontStyleItalic) pango_font_description_set_style (font->pango, PANGO_STYLE_ITALIC); } return font->pango; } static GpStatus gdip_get_fontfamily_details (GpFontFamily *family, FontStyle style) { GpFont *font = NULL; GpStatus status = GdipCreateFont (family, 8.0f, style, UnitPoint, &font); if ((status == Ok) && font) { PangoFontMap *map = pango_cairo_font_map_get_default (); /* owned by pango */ PangoContext *context = pango_cairo_font_map_create_context ((PangoCairoFontMap*)map); PangoFont *pf = pango_font_map_load_font (map, context, gdip_get_pango_font_description (font)); FT_Face face = pango_fc_font_lock_face ((PangoFcFont*)pf); if (face) { gdip_get_fontfamily_details_from_freetype (family, face); pango_fc_font_unlock_face ((PangoFcFont*)pf); } else { status = FontFamilyNotFound; } g_object_unref (context); } if (font) GdipDeleteFont (font); return status; } #else cairo_font_face_t* gdip_get_cairo_font_face (GpFont *font) { if (!font->cairofnt) { #if CAIRO_HAS_QUARTZ_FONT FcPattern *pattern = FcPatternBuild ( NULL, FC_FAMILY, FcTypeString, font->face, FC_SLANT, FcTypeInteger, ((font->style & FontStyleItalic) ? FC_SLANT_ITALIC : FC_SLANT_ROMAN), FC_WEIGHT, FcTypeInteger, ((font->style & FontStyleBold) ? FC_WEIGHT_BOLD : FC_WEIGHT_MEDIUM), NULL); font->cairofnt = cairo_ft_font_face_create_for_pattern (pattern); cairo_font_face_reference (font->cairofnt); FcPatternDestroy (pattern); #else cairo_surface_t *surface = cairo_image_surface_create_for_data ((BYTE*)NULL, CAIRO_FORMAT_ARGB32, 0, 0, 0); font->cairo = cairo_create (surface); cairo_select_font_face (font->cairo, (const char *)font->face, (font->style & FontStyleItalic) ? CAIRO_FONT_SLANT_ITALIC : CAIRO_FONT_SLANT_NORMAL, (font->style & FontStyleBold) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL); font->cairofnt = cairo_get_font_face (font->cairo); cairo_font_face_reference (font->cairofnt); cairo_surface_destroy (surface); #endif } return font->cairofnt; } static GpStatus gdip_get_fontfamily_details (GpFontFamily *family, FontStyle style) { GpFont *font = NULL; GpStatus status = GdipCreateFont (family, 0.0f, style, UnitPoint, &font); if ((status == Ok) && font) { cairo_scaled_font_t* scaled_ft; FT_Face face = NULL; cairo_matrix_t matrix1, matrix2; cairo_font_options_t *options = cairo_font_options_create (); cairo_font_face_t* cairofnt = gdip_get_cairo_font_face (font); cairo_matrix_init (&matrix1, 1, 0, 0, 1, 0, 0); cairo_matrix_init (&matrix2, 1, 0, 0, 1, 0, 0); scaled_ft = cairo_scaled_font_create (cairofnt, &matrix1, &matrix2, options); /* a missing fonts.conf will resuls in a NULL *scaled_ft (#78237) */ if (!scaled_ft) { static int flag = 0; if (flag == 0) { g_warning ("couldn't lock the font face. this may be due to a missing fonts.conf on the system."); flag = 1; } status = FontFamilyNotFound; } if (status == Ok) face = cairo_ft_scaled_font_lock_face (scaled_ft); cairo_font_options_destroy (options); if (face) { gdip_get_fontfamily_details_from_freetype (family, face); cairo_ft_scaled_font_unlock_face (scaled_ft); cairo_scaled_font_destroy (scaled_ft); } else { status = FontFamilyNotFound; } } if (font) GdipDeleteFont (font); return status; } #endif GpStatus GdipGetEmHeight (GDIPCONST GpFontFamily *family, int style, guint16 *EmHeight) { GpStatus status = Ok; if (!family || !EmHeight) return InvalidParameter; if (family->height == -1) status = gdip_get_fontfamily_details ((GpFontFamily*)family, style); *EmHeight = family->height; return status; } GpStatus GdipGetCellAscent (GDIPCONST GpFontFamily *family, int style, guint16 *CellAscent) { GpStatus status = Ok; if (!family || !CellAscent) return InvalidParameter; if (family->cellascent == -1) status = gdip_get_fontfamily_details ((GpFontFamily*)family, style); *CellAscent = family->cellascent; return status; } GpStatus GdipGetCellDescent (GDIPCONST GpFontFamily *family, int style, guint16 *CellDescent) { GpStatus status = Ok; if (!family || !CellDescent) return InvalidParameter; if (family->celldescent == -1) status = gdip_get_fontfamily_details ((GpFontFamily*)family, style); *CellDescent = family->celldescent; return status; } GpStatus GdipGetLineSpacing (GDIPCONST GpFontFamily *family, int style, guint16 *LineSpacing) { GpStatus status = Ok; if (!family || !LineSpacing) return InvalidParameter; if (family->linespacing == -1) status = gdip_get_fontfamily_details ((GpFontFamily*)family, style); *LineSpacing = family->linespacing; return status; } GpStatus GdipIsStyleAvailable (GDIPCONST GpFontFamily *family, int style, BOOL *IsStyleAvailable) { if (!family || !IsStyleAvailable) return InvalidParameter; *IsStyleAvailable = TRUE; return Ok; } /* Font functions */ // coverity[+alloc : arg-*4] GpStatus GdipCreateFont (GDIPCONST GpFontFamily* family, float emSize, int style, Unit unit, GpFont **font) { GpStatus status; FcChar8* str; FcResult r; GpFont *result; float sizeInPixels; if (!family || !font || (unit == UnitDisplay)) return InvalidParameter; r = FcPatternGetString (family->pattern, FC_FAMILY, 0, &str); status = gdip_status_from_fontconfig (r); if (status != Ok) return status; sizeInPixels = gdip_unit_conversion (unit, UnitPixel, gdip_get_display_dpi(), gtMemoryBitmap, emSize); result = (GpFont *) GdipAlloc (sizeof (GpFont)); result->sizeInPixels = sizeInPixels; result->face = GdipAlloc(strlen((char *)str) + 1); if (!result->face) { GdipFree(result); return OutOfMemory; } memcpy(result->face, str, strlen((char *)str) + 1); result->style = style; result->emSize = emSize; result->unit = unit; GdipCloneFontFamily ((GpFontFamily*) family, &result->family); result->style = style; #ifdef USE_PANGO_RENDERING result->pango = NULL; #else result->cairofnt = NULL; result->cairo = NULL; gdip_get_cairo_font_face (result); #endif *font = result; return Ok; } GpStatus GdipDeleteFont (GpFont* font) { if (!font) return InvalidParameter; if (font->family) GdipDeleteFontFamily (font->family); #ifdef USE_PANGO_RENDERING if (font->pango) pango_font_description_free (font->pango); #else if (font->cairofnt) cairo_font_face_destroy (font->cairofnt); if (font->cairo) cairo_destroy (font->cairo); #endif GdipFree (font->face); GdipFree (font); return Ok; } GpStatus GdipCreateFontFromDC(void *hdc, GpFont **font) { return(NotImplemented); } static GpStatus gdip_logfont_from_font (GpFont *font, GpGraphics *graphics, void *lf, BOOL ucs2) { LOGFONTA *logFont; if (!lf) return InvalidParameter; logFont = (LOGFONTA *)lf; /* will be changed back to 1 inside System.Drawing */ logFont->lfCharSet = 0; if (!font || !graphics) { int size = (ucs2) ? 2 * LF_FACESIZE : LF_FACESIZE; memset (logFont->lfFaceName, 0, size); return InvalidParameter; } logFont->lfHeight = -(font->sizeInPixels); logFont->lfWidth = 0; logFont->lfEscapement = 0; // FIXME logFont->lfOrientation = logFont->lfEscapement; if (font->style & FontStyleBold) { logFont->lfWeight = 700; } else { logFont->lfWeight = 400; } if (font->style & FontStyleItalic) { logFont->lfItalic = 1; } else { logFont->lfItalic = 0; } if (font->style & FontStyleUnderline) { logFont->lfUnderline = 1; } else { logFont->lfUnderline = 0; } if (font->style & FontStyleStrikeout) { logFont->lfStrikeOut = 1; } else { logFont->lfStrikeOut = 0; } logFont->lfOutPrecision = 0; logFont->lfClipPrecision = 0; switch (graphics->text_mode) { case TextRenderingHintSystemDefault: { logFont->lfQuality = 0; break; } case TextRenderingHintSingleBitPerPixelGridFit: case TextRenderingHintSingleBitPerPixel: case TextRenderingHintAntiAliasGridFit: case TextRenderingHintAntiAlias: { logFont->lfQuality = 3; // ANTIALIASED_QUALITY; break; } case TextRenderingHintClearTypeGridFit: { logFont->lfQuality = 5; // CLEARTYPE_QUALITY break; } } logFont->lfPitchAndFamily = 0; if (ucs2) { utf8_to_ucs2((const gchar *)font->face, (gunichar2 *)logFont->lfFaceName, LF_FACESIZE); } else { int len = strlen ((char*)font->face); memset (logFont->lfFaceName, 0, LF_FACESIZE); memcpy (logFont->lfFaceName, font->face, len < LF_FACESIZE ? len : LF_FACESIZE - 1); } return Ok; } // coverity[+alloc : arg-*1] GpStatus GdipCreateFontFromHfontA(void *hfont, GpFont **font, void *lf) { GpFont *src_font; GpFont *result; src_font = (GpFont *)hfont; result = (GpFont *) GdipAlloc (sizeof (GpFont)); if (!result) return OutOfMemory; result->sizeInPixels = src_font->sizeInPixels; result->style = src_font->style; GdipCloneFontFamily (src_font->family, &result->family); result->style = src_font->style; result->emSize = src_font->emSize; result->unit = src_font->unit; result->face = GdipAlloc(strlen((char *)src_font->face) + 1); if (!result->face) { GdipFree(result); return OutOfMemory; } memcpy(result->face, src_font->face, strlen((char *)src_font->face) + 1); *font = result; return gdip_logfont_from_font (result, NULL, lf, FALSE); } GpStatus GdipGetLogFontW (GpFont *font, GpGraphics *graphics, LOGFONTW *logfontW) { return gdip_logfont_from_font (font, graphics, logfontW, TRUE); } GpStatus GdipGetLogFontA (GpFont *font, GpGraphics *graphics, LOGFONTA *logfontA) { return gdip_logfont_from_font (font, graphics, logfontA, FALSE); } static GpStatus gdip_create_font_from_logfont (void *hdc, void *lf, GpFont **font, BOOL ucs2) { GpFont *result = (GpFont*) GdipAlloc (sizeof (GpFont)); LOGFONTA *logfont = (LOGFONTA *)lf; if (logfont->lfHeight < 0) { result->sizeInPixels = fabs (logfont->lfHeight); } else { result->sizeInPixels = logfont->lfHeight; // Fixme - convert units } result->style = 0; result->family = NULL; /* Fixme - this is wrong, but I don't know of a quick way to get the emSize */ result->emSize = result->sizeInPixels; result->unit = UnitPixel; if (logfont->lfItalic) { result->style |= FontStyleItalic; } if (logfont->lfWeight > 400) { result->style |= FontStyleBold; } if (logfont->lfUnderline) { result->style |= FontStyleUnderline; } if (logfont->lfStrikeOut) { result->style |= FontStyleStrikeout; } if (ucs2) { result->face = (BYTE*) ucs2_to_utf8 ((const gunichar2 *)logfont->lfFaceName, -1); if (!result->face){ GdipFree (result); return OutOfMemory; } } else { result->face = GdipAlloc(LF_FACESIZE); if (!result->face){ GdipFree (result); return OutOfMemory; } memcpy(result->face, logfont->lfFaceName, LF_FACESIZE); result->face[LF_FACESIZE - 1] = '\0'; } *font = result; return Ok; } // coverity[+alloc : arg-*2] GpStatus GdipCreateFontFromLogfontA(void *hdc, GDIPCONST LOGFONTA *logfont, GpFont **font) { return gdip_create_font_from_logfont(hdc, (void *)logfont, font, FALSE); } // coverity[+alloc : arg-*2] GpStatus GdipCreateFontFromLogfontW(void *hdc, GDIPCONST LOGFONTW *logfont, GpFont **font) { return gdip_create_font_from_logfont(hdc, (void *)logfont, font, TRUE); } GpStatus GdipPrivateAddMemoryFont(GpFontCollection *fontCollection, GDIPCONST void *memory, int length) { FcBool result; FcChar8 fontfile[256]; int f; if (!memory) return InvalidParameter; strcpy((char *) fontfile, "/tmp/ffXXXXXX"); f = mkstemp((char*)fontfile); if (f == -1) return FileNotFound; if (write(f, memory, length)!=length) { close(f); return FileNotFound; } close(f); /* FIXME - this doesn't seems to catch "bad" (e.g. invalid) font files */ result = FcConfigAppFontAddFile (fontCollection->config, fontfile); /* FIXME - May we delete our temporary font file or does FcConfigAppFontAddFile just reference our file? */ /* unlink(fontfile); */ return result ? Ok : FileNotFound; } GpStatus GdipGetFontHeight (GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, float *height) { GpStatus status; guint16 emHeight, lineSpacing; float emSize, h; if (!font || !height || !graphics) return InvalidParameter; status = GdipGetEmHeight (font->family, font->style, &emHeight); if (status != Ok) return status; status = GdipGetLineSpacing (font->family, font->style, &lineSpacing); if (status != Ok) return status; /* Operations in display dpi's */ emSize = gdip_unit_conversion (font->unit, UnitPixel, gdip_get_display_dpi (), gtMemoryBitmap, font->emSize); h = lineSpacing * (emSize / emHeight); *height = gdip_unit_conversion (UnitPixel, graphics->page_unit, gdip_get_display_dpi (), graphics->type, h); return Ok; } GpStatus GdipGetFontHeightGivenDPI (GDIPCONST GpFont *font, float dpi, float *height) { GpStatus status; guint16 emHeight, lineSpacing; float h; if (!font || !height) return InvalidParameter; status = GdipGetEmHeight (font->family, font->style, &emHeight); if (status != Ok) return status; status = GdipGetLineSpacing (font->family, font->style, &lineSpacing); if (status != Ok) return status; h = lineSpacing * (font->emSize / emHeight); *height = gdip_unit_conversion (font->unit, UnitInch, dpi, gtMemoryBitmap, h) * dpi; return Ok; } GpStatus GdipGetFontSize (GpFont *font, float *size) { if (!font ||!size) return InvalidParameter; *size = font->emSize; return Ok; } libgdiplus-2.11/src/pathgradientbrush-private.h0000664000175000017500000000463312225470167016660 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __PATHGRADIENTBRUSH_PRIVATE_H__ #define __PATHGRADIENTBRUSH_PRIVATE_H__ #include "gdiplus-private.h" #include "brush-private.h" #include "matrix-private.h" /* _N: normalize to 0.0 .. 1.0 */ #define ARGB_ALPHA_N(argb) ((double)((argb >> 24) & 0xff) / 255.0) #define ARGB_RED_N(argb) ((double)((argb >> 16) & 0xff) / 255.0) #define ARGB_GREEN_N(argb) ((double)((argb >> 8) & 0xff) / 255.0) #define ARGB_BLUE_N(argb) ((double)((argb) & 0xff) / 255.0) struct _PathGradient { GpBrush base; GpPath *boundary; ARGB *boundaryColors; int boundaryColorsCount; GpPointF center; ARGB centerColor; GpPointF focusScales; GpRectF rectangle; Blend *blend; InterpolationColors *presetColors; GpWrapMode wrapMode; cairo_matrix_t transform; cairo_pattern_t *pattern; }; #include "pathgradientbrush.h" #endif libgdiplus-2.11/src/graphics-cairo.c0000664000175000017500000010200512225470167014350 00000000000000/* * Copyright (c) 2003 Alexandre Pigolkine, Novell Inc. * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #include "graphics-cairo-private.h" #include "graphics-private.h" #include "graphics-path-private.h" /* * NOTE: all parameter's validations are done inside graphics.c */ /* helper functions to avoid a lot of repetitive code */ static GpStatus fill_graphics_with_brush (GpGraphics *graphics, GpBrush *brush, BOOL stroke) { /* We do brush setup just before filling. */ gdip_brush_setup (graphics, brush); /* don't stroke if scaled (since the pen thickness will be scaled too!) */ if (stroke && !gdip_is_scaled (graphics)) { /* stroke only using 1 pixel width - see #413461 */ double width = cairo_get_line_width (graphics->ct); cairo_set_line_width (graphics->ct, 1.0); cairo_stroke_preserve (graphics->ct); cairo_set_line_width (graphics->ct, width); } cairo_close_path (graphics->ct); cairo_fill (graphics->ct); /* Set the matrix back to graphics->copy_of_ctm for other functions. * This overwrites the matrix set by brush setup. */ cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); return gdip_get_status (cairo_status (graphics->ct)); } static GpStatus stroke_graphics_with_pen (GpGraphics *graphics, GpPen *pen) { /* We do pen setup just before stroking. */ gdip_pen_setup (graphics, pen); cairo_stroke (graphics->ct); /* Set the matrix back to graphics->copy_of_ctm for other functions. * This overwrites the matrix set by pen setup. */ cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); return gdip_get_status (cairo_status (graphics->ct)); } cairo_fill_rule_t gdip_convert_fill_mode (FillMode fill_mode) { if (fill_mode == FillModeAlternate) return CAIRO_FILL_RULE_EVEN_ODD; else return CAIRO_FILL_RULE_WINDING; } static void make_ellipse (GpGraphics *graphics, float x, float y, float width, float height, BOOL convert_units, BOOL antialiasing) { double rx, ry, cx, cy; /* if required deal, once and for all, with unit conversion */ if (convert_units && !OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); width = gdip_unitx_convgr (graphics, width); height = gdip_unity_convgr (graphics, height); } rx = width / 2; ry = height / 2; cx = x + rx; cy = y + ry; /* if required deal, once and for all, with antialiasing */ if (antialiasing && !gdip_is_scaled (graphics)) { cx += graphics->aa_offset_x; cy += graphics->aa_offset_y; } gdip_cairo_move_to (graphics, cx + rx, cy, FALSE, FALSE); /* an approximate of the ellipse by drawing a curve in each * quadrants */ gdip_cairo_curve_to (graphics, cx + rx, cy - C1 * ry, cx + C1 * rx, cy - ry, cx, cy - ry, FALSE, FALSE); gdip_cairo_curve_to (graphics, cx - C1 * rx, cy - ry, cx - rx, cy - C1 * ry, cx - rx, cy, FALSE, FALSE); gdip_cairo_curve_to (graphics, cx - rx, cy + C1 * ry, cx - C1 * rx, cy + ry, cx, cy + ry, FALSE, FALSE); gdip_cairo_curve_to (graphics, cx + C1 * rx, cy + ry, cx + rx, cy + C1 * ry, cx + rx, cy, FALSE, FALSE); cairo_close_path (graphics->ct); } /* * Based on the algorithm described in * http://www.stillhq.com/ctpfaq/2002/03/c1088.html#AEN1212 */ static void make_arc (GpGraphics *graphics, BOOL start, float x, float y, float width, float height, float startAngle, float endAngle, BOOL antialiasing) { float delta, bcp; double sin_alpha, sin_beta, cos_alpha, cos_beta; float rx = width / 2; float ry = height / 2; /* center */ float cx = x + rx; float cy = y + ry; /* angles in radians */ float alpha = startAngle * PI / 180; float beta = endAngle * PI / 180; /* adjust angles for ellipses */ alpha = atan2 (rx * sin (alpha), ry * cos (alpha)); beta = atan2 (rx * sin (beta), ry * cos (beta)); if (fabs (beta - alpha) > M_PI){ if (beta > alpha) beta -= 2 * PI; else alpha -= 2 * PI; } delta = beta - alpha; bcp = 4.0 / 3 * (1 - cos (delta / 2)) / sin (delta /2); sin_alpha = sin (alpha); sin_beta = sin (beta); cos_alpha = cos (alpha); cos_beta = cos (beta); /* don't move to starting point if we're continuing an existing curve */ if (start) { /* starting point */ double sx = cx + rx * cos_alpha; double sy = cy + ry * sin_alpha; gdip_cairo_move_to (graphics, sx, sy, FALSE, antialiasing); } gdip_cairo_curve_to (graphics, cx + rx * (cos_alpha - bcp * sin_alpha), cy + ry * (sin_alpha + bcp * cos_alpha), cx + rx * (cos_beta + bcp * sin_beta), cy + ry * (sin_beta - bcp * cos_beta), cx + rx * cos_beta, cy + ry * sin_beta, FALSE, antialiasing); } static void make_arcs (GpGraphics *graphics, float x, float y, float width, float height, float startAngle, float sweepAngle, BOOL convert_units, BOOL antialiasing) { int i; float drawn = 0; float endAngle; BOOL enough = FALSE; /* if required deal, once and for all, with unit conversions */ if (convert_units && !OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); width = gdip_unitx_convgr (graphics, width); height = gdip_unity_convgr (graphics, height); } if (fabs (sweepAngle) >= 360) { /* FALSE -> units are already converted */ make_ellipse (graphics, x, y, width, height, FALSE, antialiasing); return; } endAngle = startAngle + sweepAngle; /* if we end before the start then reverse positions (to keep increment positive) */ if (endAngle < startAngle) { double temp = endAngle; endAngle = startAngle; startAngle = temp; } /* i is the number of sub-arcs drawn, each sub-arc can be at most 90 degrees.*/ /* there can be no more then 4 subarcs, ie. 90 + 90 + 90 + (something less than 90) */ for (i = 0; i < 4; i++) { float current = startAngle + drawn; float additional; if (enough) return; additional = endAngle - current; /* otherwise, add the remainder */ if (additional > 90) { additional = 90.0; } else { /* a near zero value will introduce bad artefact in the drawing (#78999) */ if (gdip_near_zero (additional)) return; enough = TRUE; } make_arc (graphics, (i == 0), /* only move to the starting pt in the 1st iteration */ x, y, width, height, /* bounding rectangle */ current, current + additional, antialiasing); drawn += additional; } } GpStatus cairo_DrawArc (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { /* We use graphics->copy_of_ctm matrix for path creation. We should * have it set already. */ make_arcs (graphics, x, y, width, height, startAngle, sweepAngle, TRUE, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawArcI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) { return cairo_DrawArc (graphics, pen, x, y, width, height, startAngle, sweepAngle); } GpStatus cairo_DrawBezier (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, x1, y1, TRUE, TRUE); gdip_cairo_curve_to (graphics, x2, y2, x3, y3, x4, y4, TRUE, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawBezierI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { return cairo_DrawBezier (graphics, pen, x1, y1, x2, y2, x3, y3, x4, y4); } GpStatus cairo_DrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { int i, j, k; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, TRUE); for (i = 0, j = 1, k = 2; i < count - 3; i += 3, j += 3, k += 3) { gdip_cairo_curve_to (graphics, points [i].X, points [i].Y, points [j].X, points [j].Y, points [k].X, points [k].Y, TRUE, TRUE); } return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { int i, j, k; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, TRUE); for (i = 0, j = 1, k = 2; i < count - 3; i += 3, j += 3, k += 3) { gdip_cairo_curve_to (graphics, points [i].X, points [i].Y, points [j].X, points [j].Y, points [k].X, points [k].Y, TRUE, TRUE); } return stroke_graphics_with_pen (graphics, pen); } static void make_curve (GpGraphics *graphics, GDIPCONST GpPointF *points, GpPointF *tangents, int offset, int length, _CurveType type, BOOL antialiasing) { int i; gdip_cairo_move_to (graphics, points [offset].X, points [offset].Y, FALSE, antialiasing); for (i = offset; i < offset + length; i++) { int j = i + 1; double x1 = points [i].X + tangents [i].X; double y1 = points [i].Y + tangents [i].Y; double x2 = points [j].X - tangents [j].X; double y2 = points [j].Y - tangents [j].Y; double x3 = points [j].X; double y3 = points [j].Y; gdip_cairo_curve_to (graphics, x1, y1, x2, y2, x3, y3, FALSE, antialiasing); } if (type == CURVE_CLOSE) { /* complete (close) the curve using the first point */ double x1 = points [i].X + tangents [i].X; double y1 = points [i].Y + tangents [i].Y; double x2 = points [0].X - tangents [0].X; double y2 = points [0].Y - tangents [0].Y; double x3 = points [0].X; double y3 = points [0].Y; gdip_cairo_curve_to (graphics, x1, y1, x2, y2, x3, y3, FALSE, antialiasing); cairo_close_path (graphics->ct); } } GpStatus cairo_DrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count, float tension) { GpStatus status; GpPointF *tangents = gdip_closed_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; make_curve (graphics, points, tangents, 0, count - 1, CURVE_CLOSE, TRUE); status = stroke_graphics_with_pen (graphics, pen); GdipFree (tangents); return status; } GpStatus cairo_DrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count, float tension) { GpStatus status; GpPointF *pt = convert_points (points, count); if (!pt) return OutOfMemory; status = cairo_DrawClosedCurve2 (graphics, pen, pt, count, tension); GdipFree (pt); return status; } GpStatus cairo_FillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, float tension) { GpStatus status; GpPointF *tangents = gdip_closed_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; make_curve (graphics, points, tangents, 0, count - 1, CURVE_CLOSE, FALSE); status = fill_graphics_with_brush (graphics, brush, FALSE); GdipFree (tangents); return status; } GpStatus cairo_FillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, float tension) { GpStatus status; GpPointF *pt = convert_points (points, count); if (!pt) return OutOfMemory; status = GdipFillClosedCurve2 (graphics, brush, pt, count, tension); GdipFree (pt); return status; } GpStatus cairo_DrawCurve3 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, int offset, int numOfSegments, float tension) { GpStatus status; GpPointF *tangents = gdip_open_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; make_curve (graphics, points, tangents, offset, numOfSegments, CURVE_OPEN, TRUE); status = stroke_graphics_with_pen (graphics, pen); GdipFree (tangents); return status; } GpStatus cairo_DrawCurve3I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, int offset, int numOfSegments, float tension) { GpStatus status; GpPointF *pt = convert_points (points, count); if (!pt) return OutOfMemory; status = cairo_DrawCurve3 (graphics, pen, pt, count, offset, numOfSegments, tension); GdipFree (pt); return status; } /* * Ellipses */ GpStatus cairo_DrawEllipse (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ make_ellipse (graphics, x, y, width, height, TRUE, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawEllipseI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) { return cairo_DrawEllipse (graphics, pen, x, y, width, height); } GpStatus cairo_FillEllipse (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ make_ellipse (graphics, x, y, width, height, TRUE, FALSE); return fill_graphics_with_brush (graphics, brush, FALSE); } GpStatus cairo_FillEllipseI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) { return cairo_FillEllipse (graphics, brush, x, y, width, height); } GpStatus cairo_DrawLine (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) { GpStatus ret; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, x1, y1, TRUE, TRUE); gdip_cairo_line_to (graphics, x2, y2, TRUE, TRUE); ret = stroke_graphics_with_pen (graphics, pen); gdip_pen_draw_custom_start_cap (graphics, pen, x1, y1, x2, y2); gdip_pen_draw_custom_end_cap (graphics, pen, x2, y2, x1, y1); return ret; } GpStatus cairo_DrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { int i; float last_x, last_y, prev_x, prev_y; GpStatus ret; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, TRUE); for (i = 1; i < count; i++) { gdip_cairo_line_to (graphics, points [i].X, points [i].Y, TRUE, TRUE); prev_x = points [i - 1].X; prev_y = points [i - 1].Y; last_x = points [i].X; last_y = points [i].Y; } ret = stroke_graphics_with_pen (graphics, pen); if (count > 1) { gdip_pen_draw_custom_start_cap (graphics, pen, points [0].X, points [0].Y, points [1].X, points [1].Y); gdip_pen_draw_custom_end_cap (graphics, pen, last_x, last_y, prev_x, prev_y); } return ret; } GpStatus cairo_DrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { int i; float last_x, last_y, prev_x, prev_y; GpStatus ret; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, TRUE); for (i = 1; i < count; i++) { gdip_cairo_line_to (graphics, points [i].X, points [i].Y, TRUE, TRUE); prev_x = points [i - 1].X; prev_y = points [i - 1].Y; last_x = points [i].X; last_y = points [i].Y; } ret = stroke_graphics_with_pen (graphics, pen); if (count > 1) { gdip_pen_draw_custom_start_cap (graphics, pen, points [0].X, points [0].Y, points [1].X, points [1].Y); gdip_pen_draw_custom_end_cap (graphics, pen, last_x, last_y, prev_x, prev_y); } return ret; } GpStatus gdip_plot_path (GpGraphics *graphics, GpPath *path, BOOL antialiasing) { int length = path->count; int i, idx = 0; for (i = 0; i < length; ++i) { GpPointF pt = g_array_index (path->points, GpPointF, i); BYTE type = g_array_index (path->types, BYTE, i); GpPointF pts [3]; /* mask the bits so that we get only the type value not the other flags */ switch (type & PathPointTypePathTypeMask) { case PathPointTypeStart: gdip_cairo_move_to (graphics, pt.X, pt.Y, TRUE, antialiasing); break; case PathPointTypeLine: gdip_cairo_line_to (graphics, pt.X, pt.Y, TRUE, antialiasing); break; case PathPointTypeBezier: /* make sure we only add at most 3 points to pts */ if (idx < 3) { pts [idx] = pt; idx ++; } /* once we've added 3 pts, we can draw the curve */ if (idx == 3) { gdip_cairo_curve_to (graphics, pts[0].X, pts[0].Y, pts[1].X, pts[1].Y, pts[2].X, pts[2].Y, TRUE, antialiasing); idx = 0; } break; default: g_warning ("Unknown PathPointType %d", type); return NotImplemented; } /* close the subpath */ if (type & PathPointTypeCloseSubpath) cairo_close_path (graphics->ct); } return Ok; } GpStatus cairo_DrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path) { GpStatus ret; int count; GpPointF *points; /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ GpStatus status = gdip_plot_path (graphics, path, TRUE); if (status != Ok) return status; ret = stroke_graphics_with_pen (graphics, pen); /* Draw any custom pen end caps */ status = GdipGetPointCount (path, &count); /* To know the angle of the end cap, we need the penultimate point. Unfortunately there's no way of getting it without getting all the points :-( */ if (status == Ok && count > 1) { points = gdip_calloc (count, sizeof(GpPointF)); if (points == NULL) { return OutOfMemory; } status = GdipGetPathPoints (path, points, count); if (status == Ok) { gdip_pen_draw_custom_start_cap (graphics, pen, points [0].X, points [0].Y, points [1].X, points [1].Y); gdip_pen_draw_custom_end_cap (graphics, pen, points [count - 1].X, points [count - 1].Y, points [count - 2].X, points [count - 2].Y); } GdipFree (points); } return ret; } /* FIXME - this doesn't match MS behaviour when we use really complex paths with internal intersections */ GpStatus cairo_FillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path) { /* We use graphics->copy_of_ctm matrix for path creation. We should have it set already. */ GpStatus status = gdip_plot_path (graphics, path, TRUE); if (status != Ok) return status; cairo_set_fill_rule (graphics->ct, gdip_convert_fill_mode (path->fill_mode)); // filled paths includes the stroke return fill_graphics_with_brush (graphics, brush, TRUE); } static void make_pie (GpGraphics *graphics, float x, float y, float width, float height, float startAngle, float sweepAngle, BOOL antialiasing) { float rx, ry, cx, cy, alpha; double sin_alpha, cos_alpha; /* if required deal, once and for all, with unit conversions */ if (!OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); width = gdip_unitx_convgr (graphics, width); height = gdip_unity_convgr (graphics, height); } rx = width / 2; ry = height / 2; /* center */ cx = x + rx; cy = y + ry; /* angles in radians */ alpha = startAngle * PI / 180; /* adjust angle for ellipses */ alpha = atan2 (rx * sin (alpha), ry * cos (alpha)); sin_alpha = sin (alpha); cos_alpha = cos (alpha); /* if required deal, once and for all, with antialiasing */ if (antialiasing && !gdip_is_scaled (graphics)) { cx += graphics->aa_offset_x; cy += graphics->aa_offset_y; } /* draw pie edge */ if (fabs (sweepAngle) >= 360) gdip_cairo_move_to (graphics, cx + rx * cos_alpha, cy + ry * sin_alpha, FALSE, FALSE); else { gdip_cairo_move_to (graphics, cx, cy, FALSE, FALSE); gdip_cairo_line_to (graphics, cx + rx * cos_alpha, cy + ry * sin_alpha, FALSE, FALSE); } /* draw the arcs */ make_arcs (graphics, x, y, width, height, startAngle, sweepAngle, FALSE, antialiasing); /* draws line back to center */ if (fabs (sweepAngle) >= 360) gdip_cairo_move_to (graphics, cx, cy, FALSE, FALSE); else gdip_cairo_line_to (graphics, cx, cy, FALSE, FALSE); } GpStatus cairo_DrawPie (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { make_pie (graphics, x, y, width, height, startAngle, sweepAngle, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_FillPie (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height, float startAngle, float sweepAngle) { make_pie (graphics, x, y, width, height, startAngle, sweepAngle, FALSE); return fill_graphics_with_brush (graphics, brush, FALSE); } /* * Polygons */ static void make_polygon (GpGraphics *graphics, GDIPCONST GpPointF *points, int count, BOOL antialiasing) { int i; gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, antialiasing); for (i = 0; i < count; i++) { gdip_cairo_line_to (graphics, points [i].X, points [i].Y, TRUE, antialiasing); } /* * Draw a line from the last point back to the first point if * they're not the same */ if (points [0].X != points [count-1].X && points [0].Y != points [count-1].Y) { gdip_cairo_line_to (graphics, points [0].X, points [0].Y, TRUE, antialiasing); } cairo_close_path (graphics->ct); } static void make_polygon_from_integers (GpGraphics *graphics, GDIPCONST GpPoint *points, int count, BOOL antialiasing) { int i; gdip_cairo_move_to (graphics, points [0].X, points [0].Y, TRUE, antialiasing); for (i = 0; i < count; i++) { gdip_cairo_line_to (graphics, points [i].X, points [i].Y, TRUE, antialiasing); } /* * Draw a line from the last point back to the first point if * they're not the same */ if (points [0].X != points [count-1].X && points [0].Y != points [count-1].Y) { gdip_cairo_line_to (graphics, points [0].X, points [0].Y, TRUE, antialiasing); } cairo_close_path (graphics->ct); } GpStatus cairo_DrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { make_polygon (graphics, points, count, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { make_polygon_from_integers (graphics, points, count, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_FillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, FillMode fillMode) { make_polygon (graphics, points, count, FALSE); cairo_set_fill_rule (graphics->ct, gdip_convert_fill_mode (fillMode)); return fill_graphics_with_brush (graphics, brush, FALSE); } GpStatus cairo_FillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, FillMode fillMode) { make_polygon_from_integers (graphics, points, count, FALSE); cairo_set_fill_rule (graphics->ct, gdip_convert_fill_mode (fillMode)); return fill_graphics_with_brush (graphics, brush, FALSE); } /* * Rectangle(s) */ GpStatus cairo_DrawRectangle (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { /* wide pen position can be different between cairo and gdi+ */ if (gdip_cairo_pen_width_needs_adjustment (pen)) { x -= 1.0f; y -= 1.0f; } gdip_cairo_rectangle (graphics, x, y, width, height, TRUE); return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_FillRectangle (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { gdip_cairo_rectangle (graphics, x, y, width, height, FALSE); return fill_graphics_with_brush (graphics, brush, FALSE); } GpStatus cairo_DrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, int count) { BOOL draw = FALSE; BOOL adjust = gdip_cairo_pen_width_needs_adjustment (pen); int i; for (i = 0; i < count; i++) { float x = rects [i].X; float y = rects [i].Y; float w = rects [i].Width; float h = rects [i].Height; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((w < 0) || (h < 0)) continue; /* wide pen position can be different between cairo and gdi+ */ if (adjust) { x -= 1.0f; y -= 1.0f; } gdip_cairo_rectangle (graphics, x, y, w, h, TRUE); draw = TRUE; } if (!draw) return Ok; return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_DrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, int count) { BOOL draw = FALSE; BOOL adjust = gdip_cairo_pen_width_needs_adjustment (pen); int i; for (i = 0; i < count; i++) { int x = rects [i].X; int y = rects [i].Y; int w = rects [i].Width; int h = rects [i].Height; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((w < 0) || (h < 0)) continue; /* wide pen position can be different between cairo and gdi+ */ if (adjust) { x -= 1; y -= 1; } gdip_cairo_rectangle (graphics, x, y, w, h, TRUE); draw = TRUE; } if (!draw) return Ok; return stroke_graphics_with_pen (graphics, pen); } GpStatus cairo_FillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, int count) { BOOL draw = FALSE; int i; /* We use graphics->copy_of_ctm matrix for path creation. We * should have it set already. */ for (i = 0; i < count; i++) { /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((rects [i].Width < 0) || (rects [i].Height < 0)) continue; gdip_cairo_rectangle (graphics, rects [i].X, rects [i].Y, rects [i].Width, rects [i].Height, FALSE); draw = TRUE; } /* shortcut if no rectangles were drawn into the graphics */ if (!draw) return Ok; return fill_graphics_with_brush (graphics, brush, FALSE); } GpStatus cairo_FillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, int count) { BOOL draw = FALSE; int i; /* We use graphics->copy_of_ctm matrix for path creation. We * should have it set already. */ for (i = 0; i < count; i++) { /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((rects [i].Width < 0) || (rects [i].Height < 0)) continue; gdip_cairo_rectangle (graphics, rects [i].X, rects [i].Y, rects [i].Width, rects [i].Height, FALSE); draw = TRUE; } /* shortcut if no rectangles were drawn into the graphics */ if (!draw) return Ok; return fill_graphics_with_brush (graphics, brush, FALSE); } /* * Regions */ GpStatus cairo_FillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region) { /* if this is a region with a complex path */ if (region->type == RegionTypePath) { GpStatus status; GpBitmap *bitmap = NULL; /* (optimization) if if the path is empty, return immediately */ if (!region->tree) return Ok; /* (optimization) if there is only one path, then we do not need the bitmap */ if (region->tree->path) { /* if the path is empty, return OK */ if (region->tree->path->count == 0) return Ok; /* else fill the single path */ return cairo_FillPath (graphics, brush, region->tree->path); } gdip_region_bitmap_ensure (region); if (!region->bitmap) return OutOfMemory; status = GdipCreateBitmapFromGraphics (region->bitmap->Width, region->bitmap->Height, graphics, &bitmap); if (status == Ok) { GpGraphics *bitgraph = NULL; status = GdipGetImageGraphicsContext ((GpImage*)bitmap, &bitgraph); if (status == Ok) { /* fill the "full" rectangle using the specified brush */ cairo_FillRectangle (bitgraph, brush, 0, 0, region->bitmap->Width, region->bitmap->Height); /* adjust bitmap alpha (i.e. shape the brushed-rectangle like the region) */ gdip_region_bitmap_apply_alpha (bitmap, region->bitmap); /* draw the region */ status = GdipDrawImageRect (graphics, (GpImage*)bitmap, region->bitmap->X, region->bitmap->Y, region->bitmap->Width, region->bitmap->Height); } if (bitgraph) GdipDeleteGraphics (bitgraph); } if (bitmap) GdipDisposeImage ((GpImage*)bitmap); return status; } /* if there's no rectangles, we can return directly */ if (!region->rects || (region->cnt == 0)) return Ok; return cairo_FillRectangles (graphics, brush, region->rects, region->cnt); } /* * */ GpStatus cairo_GraphicsClear (GpGraphics *graphics, ARGB color) { double blue = color & 0xff; double green = (color >> 8) & 0xff; double red = (color >> 16) & 0xff; double alpha = (color >> 24); /* Save the existing color/alpha/pattern settings */ cairo_save (graphics->ct); cairo_set_source_rgba (graphics->ct, red / 255, green / 255, blue / 255, alpha / 255); cairo_set_operator (graphics->ct, CAIRO_OPERATOR_SOURCE); cairo_paint (graphics->ct); /* Restore the color/alpha/pattern settings */ cairo_restore (graphics->ct); return gdip_get_status (cairo_status (graphics->ct)); } GpStatus cairo_SetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode) { switch (compositingMode) { case CompositingModeSourceOver: cairo_set_operator (graphics->ct, CAIRO_OPERATOR_OVER); break; case CompositingModeSourceCopy: cairo_set_operator (graphics->ct, CAIRO_OPERATOR_SOURCE); break; } return Ok; } GpStatus cairo_SetSmoothingMode (GpGraphics *graphics, SmoothingMode mode) { switch (mode) { case SmoothingModeAntiAlias: case SmoothingModeHighQuality: cairo_set_antialias (graphics->ct, CAIRO_ANTIALIAS_DEFAULT); graphics->aa_offset_x = 0.5; graphics->aa_offset_y = 0.5; break; case SmoothingModeNone: case SmoothingModeDefault: case SmoothingModeHighSpeed: default: cairo_set_antialias (graphics->ct, CAIRO_ANTIALIAS_NONE); graphics->aa_offset_x = CAIRO_AA_OFFSET_X; graphics->aa_offset_y = CAIRO_AA_OFFSET_Y; break; } return Ok; } /* * Clipping */ /* Since cairo does autoclipping and it hides the clipping rectangles from the API, the best thing for now is keep track of what the user wants and let Cairo do its autoclipping */ GpStatus cairo_SetGraphicsClip (GpGraphics *graphics) { GpRegion *work; GpRectF* rect; int i; cairo_reset_clip (graphics->ct); if (gdip_is_InfiniteRegion (graphics->clip)) return Ok; if (gdip_is_matrix_empty (graphics->clip_matrix)) { work = graphics->clip; } else { GdipCloneRegion (graphics->clip, &work); GdipTransformRegion (work, graphics->clip_matrix); } switch (work->type) { case RegionTypeRectF: for (i = 0, rect = work->rects; i < work->cnt; i++, rect++) { gdip_cairo_rectangle (graphics, rect->X, rect->Y, rect->Width, rect->Height, FALSE); } break; case RegionTypePath: if (work->tree && work->tree->path) gdip_plot_path (graphics, work->tree->path, FALSE); else { int count; /* I admit that's a (not so cute) hack - anyone with a better idea ? */ if ((GdipGetRegionScansCount (work, &count, NULL) == Ok) && (count > 0)) { GpRectF *rects = (GpRectF*) GdipAlloc (count * sizeof (GpRectF)); if (rects) { GdipGetRegionScans (work, rects, &count, NULL); for (i = 0, rect = rects; i < count; i++, rect++) { gdip_cairo_rectangle (graphics, rect->X, rect->Y, rect->Width, rect->Height, FALSE); } GdipFree (rects); } } } break; default: g_warning ("Unknown region type %d", work->type); break; } cairo_clip (graphics->ct); /* destroy the clone, if one was needed */ if (work != graphics->clip) GdipDeleteRegion (work); return Ok; } GpStatus cairo_ResetClip (GpGraphics *graphics) { cairo_reset_clip (graphics->ct); return gdip_get_status (cairo_status (graphics->ct)); } /* * World Transforms */ GpStatus cairo_ResetWorldTransform (GpGraphics *graphics) { cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); cairo_reset_clip (graphics->ct); cairo_SetGraphicsClip (graphics); return gdip_get_status (cairo_status (graphics->ct)); } GpStatus cairo_SetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) { cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); cairo_SetGraphicsClip (graphics); return gdip_get_status (cairo_status (graphics->ct)); } libgdiplus-2.11/src/metafile-private.h0000664000175000017500000001756512225470167014740 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __METAFILE_PRIVATE_H__ #define __METAFILE_PRIVATE_H__ #include "gdiplus-private.h" #include "codecs-private.h" #include "bitmap-private.h" #include "matrix-private.h" #include "bmpcodec.h" #include "emfcodec.h" #include "wmfcodec.h" /* * http://wvware.sourceforge.net/caolan/ora-wmf.html */ #define ALDUS_PLACEABLE_METAFILE_KEY 0x9AC6CDD7 #define WMF_TYPE_AND_HEADERSIZE_KEY 0x00090001 #define EMF_EMR_HEADER_KEY 0x1 /* this has to do with 25.4mm in an inch (but why is it multiplied by 100 ?) */ #define METAFILE_DIMENSION_FACTOR 2540 #define MM_PER_INCH 25.4f /* match System.Drawing.Imaging.MetafileType */ #define METAFILETYPE_INVALID 0 #define METAFILETYPE_WMF 1 #define METAFILETYPE_WMFPLACEABLE 2 #define METAFILETYPE_EMF 3 #define METAFILETYPE_EMFPLUSONLY 4 #define METAFILETYPE_EMFPLUSDUAL 5 /* object types */ #define METAOBJECT_TYPE_EMPTY 0 #define METAOBJECT_TYPE_PEN 1 #define METAOBJECT_TYPE_BRUSH 2 #define GDIP_EMFPLUS_RECORD_BASE 16384 #define gdip_get_metaheader(image) (&((GpMetafile*)image)->metafile_header) #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define GETDW(x) (*(DWORD*)(data + (x))) #else #define GETDW(x) (GUINT32_FROM_LE(*(DWORD*)(data + (x)))) #endif typedef struct { void *ptr; int type; } MetaObject; struct _Metafile { GpImage base; MetafileHeader metafile_header; BOOL delete; BYTE *data; int length; BOOL recording; /* recording into memory (data), file (fp) or user stream (stream) */ FILE *fp; void *stream; }; typedef struct { GpMetafile *metafile; int x, y, width, height; int objects_count; MetaObject *objects; MetaObject created; GpGraphics *graphics; GpMatrix initial; GpMatrix matrix; DWORD bk_mode; DWORD bk_color; float miter_limit; int selected_pen; int selected_brush; int selected_font; int selected_palette; int map_mode; FillMode fill_mode; int current_x, current_y; /* path related data */ BOOL use_path; GpPath *path; int path_x, path_y; /* stock objects */ GpPen *stock_pen_white; GpPen *stock_pen_black; GpPen *stock_pen_null; GpSolidFill *stock_brush_white; GpSolidFill *stock_brush_ltgray; GpSolidFill *stock_brush_gray; GpSolidFill *stock_brush_dkgray; GpSolidFill *stock_brush_black; GpSolidFill *stock_brush_null; /* bitmap representation */ BYTE *scan0; } MetafilePlayContext; typedef struct { int num; GpPointF *points; } PointFList; GpStatus gdip_get_metafile_from (void *pointer, GpMetafile **metafile, ImageSource source) GDIP_INTERNAL; GpStatus gdip_metafile_clone (GpMetafile *metafile, GpMetafile **clonedmetafile) GDIP_INTERNAL; GpStatus gdip_metafile_dispose (GpMetafile *metafile) GDIP_INTERNAL; GpStatus gdip_metafile_stop_recording (GpMetafile *metafile) GDIP_INTERNAL; GpStatus gdip_metafile_play_emf (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_play_wmf (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_play_emfplus_block (MetafilePlayContext *context, BYTE* data, int length) GDIP_INTERNAL; MetafilePlayContext* gdip_metafile_play_setup (GpMetafile *metafile, GpGraphics *graphics, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus gdip_metafile_play (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_play_cleanup (MetafilePlayContext *context) GDIP_INTERNAL; GpPen* gdip_metafile_GetSelectedPen (MetafilePlayContext *context) GDIP_INTERNAL; GpBrush* gdip_metafile_GetSelectedBrush (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus GdiComment (MetafilePlayContext *context, BYTE* data, DWORD size) GDIP_INTERNAL; GpStatus gdip_metafile_SaveDC (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_SetBkMode (MetafilePlayContext *context, DWORD bkMode) GDIP_INTERNAL; GpStatus gdip_metafile_SetMapMode (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL; GpStatus gdip_metafile_SetROP2 (MetafilePlayContext *context, DWORD rop) GDIP_INTERNAL; GpStatus gdip_metafile_SetRelabs (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL; GpStatus gdip_metafile_SetPolyFillMode (MetafilePlayContext *context, DWORD mode) GDIP_INTERNAL; GpStatus gdip_metafile_SetStretchBltMode (MetafilePlayContext *context, int iStretchMode) GDIP_INTERNAL; GpStatus gdip_metafile_RestoreDC (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_SelectObject (MetafilePlayContext *context, DWORD slot) GDIP_INTERNAL; GpStatus gdip_metafile_ModifyWorldTransform (MetafilePlayContext *context, XFORM *lpXform, DWORD iMode) GDIP_INTERNAL; GpStatus gdip_metafile_SetTextAlign (MetafilePlayContext *context, DWORD textalign) GDIP_INTERNAL; GpStatus gdip_metafile_DeleteObject (MetafilePlayContext *context, DWORD slot) GDIP_INTERNAL; GpStatus gdip_metafile_SetBkColor (MetafilePlayContext *context, DWORD color) GDIP_INTERNAL; GpStatus gdip_metafile_SetWindowOrg (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL; GpStatus gdip_metafile_SetWindowExt (MetafilePlayContext *context, int height, int width) GDIP_INTERNAL; GpStatus gdip_metafile_LineTo (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL; GpStatus gdip_metafile_MoveTo (MetafilePlayContext *context, int x, int y) GDIP_INTERNAL; GpStatus gdip_metafile_SetMiterLimit (MetafilePlayContext *context, float eNewLimit, float *peOldLimit) GDIP_INTERNAL; GpStatus gdip_metafile_CreatePenIndirect (MetafilePlayContext *context, DWORD style, DWORD width, DWORD color) GDIP_INTERNAL; GpStatus gdip_metafile_ExtCreatePen (MetafilePlayContext *context, DWORD dwPenStyle, DWORD dwWidth, CONST LOGBRUSH *lplb, DWORD dwStyleCount, CONST DWORD *lpStyle) GDIP_INTERNAL; GpStatus gdip_metafile_CreateBrushIndirect (MetafilePlayContext *context, DWORD style, DWORD color, DWORD hatch) GDIP_INTERNAL; GpStatus gdip_metafile_Arc (MetafilePlayContext *context, int left, int top, int right, int bottom, int xstart, int ystart, int xend, int yend) GDIP_INTERNAL; GpStatus gdip_metafile_StretchDIBits (MetafilePlayContext *context, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, CONST void *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop) GDIP_INTERNAL; GpStatus gdip_metafile_PolyBezier (MetafilePlayContext *context, GpPointF *points, int count) GDIP_INTERNAL; GpStatus gdip_metafile_Polygon (MetafilePlayContext *context, GpPointF *points, int count) GDIP_INTERNAL; GpStatus gdip_metafile_BeginPath (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_EndPath (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_CloseFigure (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_FillPath (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_StrokePath (MetafilePlayContext *context) GDIP_INTERNAL; GpStatus gdip_metafile_StrokeAndFillPath (MetafilePlayContext *context) GDIP_INTERNAL; #include "metafile.h" #endif libgdiplus-2.11/src/Makefile.in0000664000175000017500000005726212225470350013366 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ChangeLog ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libgdiplus_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am_libgdiplus_la_OBJECTS = adjustablearrowcap.lo bitmap.lo brush.lo \ carbon-private.lo customlinecap.lo dstream.lo font.lo \ general.lo graphics.lo graphics-cairo.lo graphics-metafile.lo \ graphics-path.lo graphics-pathiterator.lo hatchbrush.lo \ icocodec.lo image.lo imageattributes.lo lineargradientbrush.lo \ matrix.lo metafile.lo pathgradientbrush.lo pen.lo print.lo \ region.lo region-bitmap.lo region-path-tree.lo solidbrush.lo \ stringformat.lo text.lo text-cairo.lo text-pango.lo \ text-metafile.lo texturebrush.lo bmpcodec.lo emfcodec.lo \ emfplus.lo gifcodec.lo jpegcodec.lo pngcodec.lo tiffcodec.lo \ wmfcodec.lo libgdiplus_la_OBJECTS = $(am_libgdiplus_la_OBJECTS) DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libgdiplus_la_SOURCES) DIST_SOURCES = $(libgdiplus_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASE_DEPENDENCIES_CFLAGS = @BASE_DEPENDENCIES_CFLAGS@ BASE_DEPENDENCIES_LIBS = @BASE_DEPENDENCIES_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_DIR = @CAIRO_DIR@ CAIRO_LIBS = @CAIRO_LIBS@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ FONTCONFIG_CONFIG = @FONTCONFIG_CONFIG@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ FREETYPE2_CFLAGS = @FREETYPE2_CFLAGS@ FREETYPE2_LIBS = @FREETYPE2_LIBS@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ GDIPLUS_CFLAGS = @GDIPLUS_CFLAGS@ GDIPLUS_LIBS = @GDIPLUS_LIBS@ GDIPLUS_PKG_CFLAGS = @GDIPLUS_PKG_CFLAGS@ GDIPLUS_PKG_LIBS = @GDIPLUS_PKG_LIBS@ GDIPLUS_PKG_REQ = @GDIPLUS_PKG_REQ@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBEXIF_CFLAGS = @LIBEXIF_CFLAGS@ LIBEXIF_LIBS = @LIBEXIF_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PANGO_CFLAGS = @PANGO_CFLAGS@ PANGO_LIBS = @PANGO_LIBS@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ subdirs = @subdirs@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ lib_LTLIBRARIES = libgdiplus.la libgdiplus_la_SOURCES = \ adjustablearrowcap.c \ adjustablearrowcap.h \ adjustablearrowcap-private.h \ alpha-premul-table.inc \ bitmap.c \ bitmap.h \ bitmap-private.h \ brush.c \ brush.h \ brush-private.h \ carbon-private.c \ carbon-private.h \ codecs.h \ codecs-private.h \ customlinecap.c \ customlinecap.h \ customlinecap-private.h \ dstream.c \ dstream.h \ font.c \ font.h \ font-private.h \ fontcollection.h \ fontcollection-private.h \ fontfamily.h \ fontfamily-private.h \ GdiPlusFlat.h \ gdiplus-private.h \ gdip.h \ gdipenums.h \ gdipstructs.h \ general.c \ general.h \ general-private.h \ graphics.c \ graphics.h \ graphics-cairo.c \ graphics-cairo-private.h \ graphics-metafile.c \ graphics-metafile-private.h \ graphics-private.h \ graphics-path.c \ graphics-path.h \ graphics-path-private.h \ graphics-pathiterator.c \ graphics-pathiterator.h \ graphics-pathiterator-private.h \ hatchbrush.c \ hatchbrush.h \ hatchbrush-private.h \ icocodec.c \ icocodec.h \ image.c \ image.h \ image-private.h \ imageattributes.c \ imageattributes.h \ imageattributes-private.h \ lineargradientbrush.c \ lineargradientbrush.h \ lineargradientbrush-private.h \ matrix.c \ matrix.h \ matrix-private.h \ metafile.c \ metafile.h \ metafile-private.h \ pathgradientbrush.c \ pathgradientbrush.h \ pathgradientbrush-private.h \ pen.c \ pen.h \ pen-private.h \ print.c \ region.c \ region.h \ region-private.h \ region-bitmap.c \ region-bitmap.h \ region-path-tree.c \ region-path-tree.h \ solidbrush.c \ solidbrush.h \ solidbrush-private.h \ stringformat.c \ stringformat.h \ stringformat-private.h \ text.c \ text.h \ text-cairo.c \ text-cairo-private.h \ text-pango.c \ text-pango-private.h \ text-metafile.c \ text-metafile-private.h \ texturebrush.c \ texturebrush.h \ texturebrush-private.h \ win32structs.h \ bmpcodec.h \ bmpcodec.c \ emfcodec.c \ emfcodec.h \ emfplus.c \ emfplus.h \ gifcodec.h \ gifcodec.c \ jpegcodec.h \ jpegcodec.c \ pngcodec.h \ pngcodec.c \ tiffcodec.h \ tiffcodec.c \ wmfcodec.c \ wmfcodec.h libgdiplus_la_LIBADD = $(GDIPLUS_LIBS) INCLUDES = $(GDIPLUS_CFLAGS) -Wall -Wno-unused -Wno-format all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libgdiplus.la: $(libgdiplus_la_OBJECTS) $(libgdiplus_la_DEPENDENCIES) $(EXTRA_libgdiplus_la_DEPENDENCIES) $(LINK) -rpath $(libdir) $(libgdiplus_la_OBJECTS) $(libgdiplus_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/adjustablearrowcap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bmpcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/brush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/carbon-private.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/customlinecap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dstream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emfcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/emfplus.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/general.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gifcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics-cairo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics-metafile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics-path.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics-pathiterator.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/graphics.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hatchbrush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icocodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/image.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imageattributes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jpegcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lineargradientbrush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/metafile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pathgradientbrush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pngcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/region-bitmap.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/region-path-tree.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/region.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/solidbrush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stringformat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-cairo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-metafile.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text-pango.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/text.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/texturebrush.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tiffcodec.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wmfcodec.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) installdirs: for dir in "$(DESTDIR)$(libdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-libLTLIBRARIES clean-libtool ctags distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am \ install-libLTLIBRARIES install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-libLTLIBRARIES # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/src/region-bitmap.h0000664000175000017500000000616212225470167014226 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __REGION_BITMAP_H__ #define __REGION_BITMAP_H__ #include "gdiplus-private.h" #include "bitmap-private.h" /* * REGION_MAX_BITMAP_SIZE defines the size limit of the region bitmap we keep * in memory. The current value is 2 megabits which should be enough for any * on-screen region. Before changing this value remember that a "real", but * temporary, ARGB32 bitmap (32 times bigger, i.e. 8MB) may be allocated when * converting the path into the region bitmap. */ #define REGION_MAX_BITMAP_SIZE (2 * 1024 * 1024 >> 3) #define SHAPE_SIZE(shape) (((shape)->Width * (shape)->Height) >> 3) typedef struct { int X; int Y; int Width; int Height; unsigned char *Mask; BOOL reduced; } GpRegionBitmap; void gdip_region_bitmap_ensure (GpRegion *region) GDIP_INTERNAL; GpRegionBitmap* gdip_region_bitmap_from_path (GpPath *path) GDIP_INTERNAL; GpRegionBitmap* gdip_region_bitmap_clone (GpRegionBitmap *bitmap) GDIP_INTERNAL; void gdip_region_bitmap_free (GpRegionBitmap *bitmap) GDIP_INTERNAL; void gdip_region_bitmap_invalidate (GpRegion *region) GDIP_INTERNAL; BOOL gdip_region_bitmap_compare (GpRegionBitmap *shape1, GpRegionBitmap *shape2) GDIP_INTERNAL; BOOL gdip_region_bitmap_is_point_visible (GpRegionBitmap *bitmap, int x, int y) GDIP_INTERNAL; BOOL gdip_region_bitmap_is_rect_visible (GpRegionBitmap *bitmap, GpRect *rect) GDIP_INTERNAL; int gdip_region_bitmap_get_scans (GpRegionBitmap *bitmap, GpRectF *rect, int count) GDIP_INTERNAL; void gdip_region_bitmap_get_smallest_rect (GpRegionBitmap *bitmap, GpRect *rect) GDIP_INTERNAL; void gdip_region_bitmap_shrink (GpRegionBitmap *bitmap, BOOL always_shrink) GDIP_INTERNAL; void gdip_region_bitmap_apply_alpha (GpBitmap *bitmap, GpRegionBitmap *alpha) GDIP_INTERNAL; GpRegionBitmap* gdip_region_bitmap_combine (GpRegionBitmap *bitmap1, GpRegionBitmap* bitmap2, CombineMode combineMode) GDIP_INTERNAL; #endif libgdiplus-2.11/src/gifcodec.c0000664000175000017500000006663512225470167013242 00000000000000/* * gifcodec.c : Contains function definitions for encoding decoding gif images * * Copyright (C) 2003-2004,2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Jordi Mas (jordi@ximian.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot */ #if HAVE_CONFIG_H #include #endif #include "gdiplus-private.h" GUID gdip_gif_image_format_guid = {0xb96b3cb0U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; #ifdef HAVE_LIBGIF #include #include "gifcodec.h" /* giflib declares this incorrectly as EgifOpen */ extern GifFileType *EGifOpen(void *userData, OutputFunc writeFunc); /* Data structure used for callback */ typedef struct { GetBytesDelegate getBytesFunc; SeekDelegate seekFunc; } gif_callback_data; /* Codecinfo related data*/ static ImageCodecInfo gif_codec; static const WCHAR gif_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'G', 'I', 'F', ' ', 'C', 'o', 'd', 'e', 'c', 0}; /* Built-in GIF Codec */ static const WCHAR gif_extension[] = {'*', '.', 'G', 'I', 'F',0}; /* *.GIF */ static const WCHAR gif_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'g', 'i', 'f', 0}; /* image/gif */ static const WCHAR gif_format[] = {'G', 'I', 'F', 0}; /* GIF */ static const BYTE gif_sig_pattern[] = { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }; static const BYTE gif_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; ImageCodecInfo * gdip_getcodecinfo_gif () { gif_codec.Clsid = (CLSID) { 0x557cf402, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; gif_codec.FormatID = gdip_gif_image_format_guid; gif_codec.CodecName = (const WCHAR*) gif_codecname; gif_codec.DllName = NULL; gif_codec.FormatDescription = (const WCHAR*) gif_format; gif_codec.FilenameExtension = (const WCHAR*) gif_extension; gif_codec.MimeType = (const WCHAR*) gif_mimetype; gif_codec.Flags = ImageCodecFlagsEncoder | ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; gif_codec.Version = 1; gif_codec.SigCount = 2; gif_codec.SigSize = 6; gif_codec.SigPattern = gif_sig_pattern; gif_codec.SigMask = gif_sig_mask; return &gif_codec; } /* Read callback function for the gif libbrary*/ static int gdip_gif_fileinputfunc (GifFileType *gif, GifByteType *data, int len) { return fread (data, 1, len, (FILE*) gif->UserData); } static int gdip_gif_inputfunc (GifFileType *gif, GifByteType *data, int len) { int read = 0; gif_callback_data *gcd = (gif_callback_data*) gif->UserData; read = gcd->getBytesFunc (data, len, 0); return read; } /* This is the DGifSlurp and AddExtensionBlock code courtesy of giflib, It's modified to not dump comments after the image block, since those are still valid */ static int AddExtensionBlockMono(SavedImage *New, int Len, BYTE ExtData[]) { ExtensionBlock *ep; if (New->ExtensionBlocks == NULL) { New->ExtensionBlocks=(ExtensionBlock *)GdipAlloc(sizeof(ExtensionBlock)); } else { New->ExtensionBlocks = (ExtensionBlock*) gdip_realloc (New->ExtensionBlocks, sizeof(ExtensionBlock) * (New->ExtensionBlockCount + 1)); } if (New->ExtensionBlocks == NULL) { return (GIF_ERROR); } ep = &New->ExtensionBlocks[New->ExtensionBlockCount++]; ep->ByteCount=Len; ep->Bytes = (char *)GdipAlloc(ep->ByteCount); if (ep->Bytes == NULL) { return (GIF_ERROR); } if (ExtData) { memcpy(ep->Bytes, ExtData, Len); ep->Function = New->Function; } return (GIF_OK); } static void FreeExtensionMono(SavedImage *Image) { ExtensionBlock *ep; if ((Image == NULL) || (Image->ExtensionBlocks == NULL)) { return; } for (ep = Image->ExtensionBlocks; ep < (Image->ExtensionBlocks + Image->ExtensionBlockCount); ep++) { (void)GdipFree((char *)ep->Bytes); } GdipFree((char *)Image->ExtensionBlocks); Image->ExtensionBlocks = NULL; } static int gif_read_interlace (GifFileType* GifFile, SavedImage *sp, int start, int increment) { int line; for (line = start; line < sp->ImageDesc.Height; line += increment) { int index = line * sp->ImageDesc.Width * sizeof (GifPixelType); if (DGifGetLine(GifFile, &sp->RasterBits[index], sp->ImageDesc.Width) == GIF_ERROR) return GIF_ERROR; } return GIF_OK; } static int DGifSlurpMono(GifFileType * GifFile, SavedImage *TrailingExtensions) { int ImageSize; GifRecordType RecordType; SavedImage *sp; GifByteType *ExtData; SavedImage temp_save; temp_save.ExtensionBlocks = NULL; temp_save.ExtensionBlockCount = 0; if (TrailingExtensions != NULL) { TrailingExtensions->ExtensionBlocks = NULL; TrailingExtensions->ExtensionBlockCount = 0; } sp = NULL; do { if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) { return (GIF_ERROR); } switch (RecordType) { case IMAGE_DESC_RECORD_TYPE: { /* This call will leak GifFile->Image.ColorMap; there's a fixme in the DGifGetImageDesc code */ if (DGifGetImageDesc(GifFile) == GIF_ERROR) { return (GIF_ERROR); } sp = &GifFile->SavedImages[GifFile->ImageCount - 1]; ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; sp->RasterBits = (BYTE*) GdipAlloc (ImageSize * sizeof (GifPixelType)); if (sp->RasterBits == NULL) { return GIF_ERROR; } if (GifFile->Image.Interlace) { /* first start at line 0 and read every 8th lines */ if (gif_read_interlace (GifFile, sp, 0, 8) == GIF_ERROR) return GIF_ERROR; /* then start at line 4 and read every 8th lines */ if (gif_read_interlace (GifFile, sp, 4, 8) == GIF_ERROR) return GIF_ERROR; /* then start at line 2 and read every 4th lines */ if (gif_read_interlace (GifFile, sp, 2, 4) == GIF_ERROR) return GIF_ERROR; /* then start at line 1 and read every 2th lines */ if (gif_read_interlace (GifFile, sp, 1, 2) == GIF_ERROR) return GIF_ERROR; /* all lines are read */ } else { if (DGifGetLine(GifFile, sp->RasterBits, ImageSize) == GIF_ERROR) { return (GIF_ERROR); } } if (temp_save.ExtensionBlocks) { sp->ExtensionBlocks = temp_save.ExtensionBlocks; sp->ExtensionBlockCount = temp_save.ExtensionBlockCount; temp_save.ExtensionBlocks = NULL; temp_save.ExtensionBlockCount = 0; } break; } case EXTENSION_RECORD_TYPE: { if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) == GIF_ERROR) { return (GIF_ERROR); } while (ExtData != NULL) { /* Create an extension block with our data */ if (AddExtensionBlockMono(&temp_save, ExtData[0], &ExtData[1]) == GIF_ERROR) { return (GIF_ERROR); } if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) { return (GIF_ERROR); } temp_save.Function = 0; } break; } case TERMINATE_RECORD_TYPE: { break; } default: { /* Should be trapped by DGifGetRecordType */ break; } } } while (RecordType != TERMINATE_RECORD_TYPE); /* In case the Gif has an extension block without an associated * image we return it in TrailingExtensions, if provided */ if ((TrailingExtensions != NULL) && (temp_save.ExtensionBlocks != NULL)) { *TrailingExtensions = temp_save; } return (GIF_OK); } static GpStatus gdip_load_gif_image (void *stream, GpImage **image, BOOL from_file) { GifFileType *gif; BYTE *readptr; BYTE *writeptr; int i; int l; int num_of_images; BOOL animated; const GUID *dimension; FrameData *frame; GpBitmap *result; BitmapData *bitmap_data; SavedImage si; SavedImage global_extensions; ColorPalette *global_palette; BOOL loop_counter; unsigned short loop_value; int disposal; int last_disposal; int transparent_index; int screen_width; int screen_height; GifImageDesc *img_desc; disposal = 0; last_disposal = 0; loop_value = 0; global_palette = NULL; result = NULL; loop_counter = FALSE; if (from_file) { gif = DGifOpen(stream, &gdip_gif_fileinputfunc); } else { gif = DGifOpen (stream, &gdip_gif_inputfunc); } if (gif == NULL) { goto error; } /* Read the image */ if (DGifSlurpMono(gif, &global_extensions) != GIF_OK) { goto error; } /* We can have either multiple pages (page dimension) or an animation (time dimension) If we find an Application Extension, it's an animated gif, otherwise we've got multiple pages */ screen_width = gif->SWidth; screen_height = gif->SHeight; animated = FALSE; num_of_images = gif->ImageCount; for (i = 0; i < num_of_images; i++) { for (l = 0; l < gif->SavedImages[i].ExtensionBlockCount; l++) { switch(gif->SavedImages[i].ExtensionBlocks[l].Function) { case APPLICATION_EXT_FUNC_CODE: { if (num_of_images > 1) { animated = TRUE; } /* Mention of the Netscape format is here: http://list-archive.xemacs.org/xemacs-beta/199910/msg00070.html */ /* We seem to be dealing with a bug in the gif lib here, it breaks the sub-bart part of the * extension data up into a separate ExtensionBlock (of type 0x00) */ if (gif->SavedImages[i].ExtensionBlocks[l].ByteCount > 10) { if (memcmp(gif->SavedImages[i].ExtensionBlocks[l].Bytes, "NETSCAPE2.0", 11) == 0) { loop_counter = TRUE; /* The next Block is a subblock of the app extension. The 3 bytes are the loop counter */ if ((l + 1) < gif->SavedImages[i].ExtensionBlockCount) { if ((gif->SavedImages[i].ExtensionBlocks[l + 1].Function == 0) && (gif->SavedImages[i].ExtensionBlocks[l + 1].ByteCount == 3) && (gif->SavedImages[i].ExtensionBlocks[l + 1].Bytes[0] == 1)) { loop_value = (BYTE)(gif->SavedImages[i].ExtensionBlocks[l + 1].Bytes[2] << 8) + (BYTE)gif->SavedImages[i].ExtensionBlocks[l + 1].Bytes[1]; } } } } break; } case 0: { break; } } } } if (animated) { dimension = &gdip_image_frameDimension_time_guid; } else { dimension = &gdip_image_frameDimension_page_guid; } result = gdip_bitmap_new(); result->type = ImageTypeBitmap; frame = gdip_frame_add(result, dimension); /* Copy the palette over, if there is one */ if (gif->SColorMap != NULL) { global_palette = GdipAlloc (sizeof(ColorPalette) + sizeof(ARGB) * gif->SColorMap->ColorCount); global_palette->Flags = 0; global_palette->Count = gif->SColorMap->ColorCount; for (i = 0; i < gif->SColorMap->ColorCount; i++) { global_palette->Entries[i] = MAKE_ARGB_ARGB(0xff, gif->SColorMap->Colors[i].Red, gif->SColorMap->Colors[i].Green, gif->SColorMap->Colors[i].Blue); } } else { /* Assume a grayscale image for the global palette. Individual images might still have a different one. */ global_palette = GdipAlloc (sizeof(ColorPalette) + 256 * sizeof(ARGB)); global_palette->Flags = PaletteFlagsGrayScale; global_palette->Count = 256; for (i=0; i < 256; i++) { global_palette->Entries[i] = MAKE_ARGB_RGB(i, i, i); } } result->cairo_format = CAIRO_FORMAT_A8; /* create our bitmaps */ for (i = 0; i < num_of_images; i++) { /* Add BitmapData to our frame */ bitmap_data = gdip_frame_add_bitmapdata(frame); if (bitmap_data == NULL) { goto error; } si = gif->SavedImages[i]; img_desc = &si.ImageDesc; if (img_desc->Top < 0 || img_desc->Height < 0 || img_desc->Left < 0 || img_desc->Width < 0 || (img_desc->Width + img_desc->Left) > screen_width || (img_desc->Height + img_desc->Top) > screen_height) { goto error; } for (l = 0; l < global_extensions.ExtensionBlockCount; l++) { ExtensionBlock eb = global_extensions.ExtensionBlocks[l]; if (eb.Function == COMMENT_EXT_FUNC_CODE) { int index; if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagExifUserComment, &index) != Ok) { BYTE *bytes = (BYTE*) GdipAlloc (eb.ByteCount + 1); if (bytes == NULL) goto error; memcpy (bytes, eb.Bytes, eb.ByteCount); bytes [eb.ByteCount] = '\0'; gdip_bitmapdata_property_add_ASCII (bitmap_data, PropertyTagExifUserComment, bytes); GdipFree (bytes); } } } for (l = 0; l < si.ExtensionBlockCount; l++) { ExtensionBlock eb = si.ExtensionBlocks[l]; switch(eb.Function) { case GRAPHICS_EXT_FUNC_CODE: { /* Pull animation time and/or transparent color */ if (eb.ByteCount > 3) { /* Sanity */ guint32 delay; disposal = ((eb.Bytes [0] >> 2) & 7); if ((eb.Bytes[0] & 0x01) != 0) { /* 0 = no transparency, so we need to shift range */ bitmap_data->transparent = -eb.Bytes[3] - 1; } delay = (eb.Bytes[2] << 8) + (eb.Bytes[1]); gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagFrameDelay, delay); if (loop_counter) { gdip_bitmapdata_property_add_short(bitmap_data, PropertyTagLoopCount, loop_value); } } break; } case COMMENT_EXT_FUNC_CODE: { int index; BYTE *text; /* Per-image comments override global */ if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagExifUserComment, &index) == Ok) { gdip_bitmapdata_property_remove_index(bitmap_data, index); } /* String is not null terminated */ text = (BYTE*)GdipAlloc(eb.ByteCount + 1); if (text != NULL) { memcpy(text, eb.Bytes, eb.ByteCount); text[eb.ByteCount] = '\0'; gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagExifUserComment, text); GdipFree(text); } break; } #if 0 case PLAINTEXT_EXT_FUNC_CODE: { printf("Do something with PLAINTEXT_EXT_FUNC_CODE?\n"); break; } #endif } } /* copy the local color map if there is one, otherwise we duplicate the global one */ if (img_desc->ColorMap != NULL) { ColorMapObject *local_palette_obj; /* TODO: what do we do with combined gif + local palettes? */ local_palette_obj = img_desc->ColorMap; bitmap_data->palette = GdipAlloc (sizeof(ColorPalette) + sizeof(ARGB) * local_palette_obj->ColorCount); bitmap_data->palette->Flags = 0; bitmap_data->palette->Count = local_palette_obj->ColorCount; for (l = 0; l < local_palette_obj->ColorCount; l++) { bitmap_data->palette->Entries[l] = MAKE_ARGB_ARGB(0xff, local_palette_obj->Colors[l].Red, local_palette_obj->Colors[l].Green, local_palette_obj->Colors[l].Blue); } } else { bitmap_data->palette = gdip_palette_clone(global_palette); } if (bitmap_data->transparent < 0) { BYTE *v; bitmap_data->palette->Flags |= PaletteFlagsHasAlpha; transparent_index = (bitmap_data->transparent + 1) * -1; v = (BYTE*)&bitmap_data->palette->Entries [transparent_index]; #ifdef WORDS_BIGENDIAN v[0] = 0x00; #else v[3] = 0x00; #endif /* WORDS_BIGENDIAN */ } else { transparent_index = -1; } bitmap_data->pixel_format = PixelFormat8bppIndexed; bitmap_data->width = screen_width; bitmap_data->height = screen_height; bitmap_data->stride = bitmap_data->width; gdip_align_stride (bitmap_data->stride); bitmap_data->left = img_desc->Left; bitmap_data->top = img_desc->Top; bitmap_data->scan0 = GdipAlloc (bitmap_data->stride * bitmap_data->height); bitmap_data->reserved = GBD_OWN_SCAN0; bitmap_data->image_flags = ImageFlagsHasAlpha | ImageFlagsReadOnly | ImageFlagsHasRealPixelSize | ImageFlagsColorSpaceRGB; bitmap_data->dpi_horz = gdip_get_display_dpi (); bitmap_data->dpi_vert = bitmap_data->dpi_horz; readptr = (BYTE*) si.RasterBits; writeptr = bitmap_data->scan0; for (l = 0; l < bitmap_data->height; l++) { if (l >= img_desc->Top && l - img_desc->Top < img_desc->Height) { /* Ignore 'disposal' 0 (don't care) and 4, 5, 6, 7 (undocumented) */ if (i == 0 || transparent_index == -1 || (last_disposal != 1 && last_disposal != 3)) { writeptr += img_desc->Left; memcpy (writeptr, readptr, img_desc->Width); writeptr -= img_desc->Left; writeptr += bitmap_data->stride; readptr += img_desc->Width; } else { int ridx, widx; BitmapData *last_bitmap; last_bitmap = &frame->bitmap [i - 1]; if (l == img_desc->Top) { /* Copy the previous bitmap as the base for this one */ /* TODO: This will be wrong if each image has a different palette */ /* There's a comment up there too */ memcpy (bitmap_data->scan0, last_bitmap->scan0, bitmap_data->height * bitmap_data->stride); } for (ridx = 0, widx = bitmap_data->left; ridx < img_desc->Width; widx++, ridx++) { BYTE bt = readptr [ridx]; if (bt == transparent_index) continue; writeptr [widx] = bt; } readptr += img_desc->Width; writeptr += bitmap_data->stride; } } else { writeptr += bitmap_data->stride; } } last_disposal = disposal; disposal = 0; } gdip_bitmap_setactive(result, dimension, 0); if (global_palette != NULL) { GdipFree(global_palette); } FreeExtensionMono(&global_extensions); DGifCloseFile (gif); *image = result; return Ok; error: if (global_palette != NULL) { GdipFree(global_palette); } if (result != NULL) { gdip_bitmap_dispose (result); } if (gif != NULL) { FreeExtensionMono (&global_extensions); DGifCloseFile (gif); } *image = NULL; return InvalidParameter; } GpStatus gdip_load_gif_image_from_file (FILE *fp, GpImage **image) { return gdip_load_gif_image (fp, image, TRUE); } GpStatus gdip_load_gif_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seekFunc, GpImage **image) { gif_callback_data gif_data; gif_data.getBytesFunc = getBytesFunc; gif_data.seekFunc = seekFunc; return gdip_load_gif_image (&gif_data, image, FALSE); } /* Write callback function for the gif libbrary*/ static int gdip_gif_outputfunc (GifFileType *gif, const GifByteType *data, int len) { int written = 0; PutBytesDelegate putBytesFunc = (PutBytesDelegate) gif->UserData; written = putBytesFunc ((void *)data, len); return written; } static GpStatus gdip_save_gif_image (void *stream, GpImage *image, BOOL from_file) { GifFileType *fp; int i, x, y, size; GifByteType *red; GifByteType *green; GifByteType *blue; GifByteType *red_ptr; GifByteType *green_ptr; GifByteType *blue_ptr; GifByteType *pixbuf; GifByteType *pixbuf_org; int cmap_size; ColorMapObject *cmap = NULL; int k; BYTE *v; int c; int index; BOOL animated; int frame; BitmapData *bitmap_data; int pixbuf_size; if (!stream) { return InvalidParameter; } if (from_file) { fp = EGifOpenFileName (stream, 0); } else { fp = EGifOpen (stream, gdip_gif_outputfunc); } if (!fp) { return FileNotFound; } red = NULL; green = NULL; blue = NULL; pixbuf_org = NULL; for (frame = 0; frame < image->num_of_frames; frame++) { animated = FALSE; if (memcmp(&image->frames[frame].frame_dimension, &gdip_image_frameDimension_time_guid, sizeof(GUID)) == 0) { animated = TRUE; } for (k = 0; k < image->frames[frame].count; k++) { bitmap_data = &image->frames[frame].bitmap[k]; pixbuf_size = bitmap_data->width * bitmap_data->height * sizeof(GifByteType); if (gdip_is_an_indexed_pixelformat(bitmap_data->pixel_format)) { BYTE w; switch (bitmap_data->pixel_format) { case PixelFormat1bppIndexed: cmap_size = 2; break; case PixelFormat4bppIndexed: cmap_size = 16; break; case PixelFormat8bppIndexed: cmap_size = 256; break; default: goto error; } cmap = MakeMapObject(cmap_size, 0); pixbuf = GdipAlloc(pixbuf_size); if (pixbuf == NULL) { goto error; } pixbuf_org = pixbuf; for (c = 0; (c < cmap_size) && (c < bitmap_data->palette->Count); c++) { v = (BYTE*)&bitmap_data->palette->Entries[c]; #ifdef WORDS_BIGENDIAN cmap->Colors[c].Red = v[1]; cmap->Colors[c].Green = v[2]; cmap->Colors[c].Blue = v[3]; #else cmap->Colors[c].Red = v[2]; cmap->Colors[c].Green = v[1]; cmap->Colors[c].Blue = v[0]; #endif /* WORDS_BIGENDIAN */ } switch(bitmap_data->pixel_format) { case PixelFormat1bppIndexed: { for (y = 0; y < bitmap_data->height; y++) { v = bitmap_data->scan0 + y * bitmap_data->stride; for (x = 0; x + 7 < bitmap_data->width; x += 8) { w = *v; *(pixbuf++) = ((w & 0x80) != 0); *(pixbuf++) = ((w & 0x40) != 0); *(pixbuf++) = ((w & 0x20) != 0); *(pixbuf++) = ((w & 0x10) != 0); *(pixbuf++) = ((w & 0x08) != 0); *(pixbuf++) = ((w & 0x04) != 0); *(pixbuf++) = ((w & 0x02) != 0); *(pixbuf++) = ((w & 0x01) != 0); v++; } w = *v; switch (bitmap_data->width & 7) {/* every 'case' here flows into the next */ case 7: pixbuf[6] = ((w & 0x02) != 0); case 6: pixbuf[5] = ((w & 0x04) != 0); case 5: pixbuf[4] = ((w & 0x08) != 0); case 4: pixbuf[3] = ((w & 0x10) != 0); case 3: pixbuf[2] = ((w & 0x20) != 0); case 2: pixbuf[1] = ((w & 0x40) != 0); case 1: pixbuf[0] = ((w & 0x80) != 0); } pixbuf += (bitmap_data->width & 7); } break; } case PixelFormat4bppIndexed: { for (y = 0; y < bitmap_data->height; y++) { v = bitmap_data->scan0 + y * bitmap_data->stride; for (x = 0; x + 1 < bitmap_data->width; x += 2) { w = *v; *(pixbuf++) = ((w >> 4) & 0xF); *(pixbuf++) = ( w & 0xF); v++; } if ((bitmap_data->width & 1) != 0) { *(pixbuf++) = ((*v >> 4) & 0xF); } } break; } case PixelFormat8bppIndexed: { for (y = 0; y < bitmap_data->height; y++) { memcpy(pixbuf + y * bitmap_data->width, bitmap_data->scan0 + y * bitmap_data->stride, bitmap_data->width); } break; } } /* Restore pointer, 1bpp and 4bpp above alter it */ pixbuf = pixbuf_org; } else { cmap_size = 256; cmap = MakeMapObject (cmap_size, 0); red = GdipAlloc(pixbuf_size); green = GdipAlloc(pixbuf_size); blue = GdipAlloc(pixbuf_size); pixbuf = GdipAlloc(pixbuf_size); if ((red == NULL) || (green == NULL) || (blue == NULL) || (pixbuf == NULL)) { goto error; } pixbuf_org = pixbuf; red_ptr = red; green_ptr = green; blue_ptr = blue; for (y = 0; y < bitmap_data->height; y++) { v = bitmap_data->scan0 + y * bitmap_data->stride; for (x = 0; x < bitmap_data->width; x++) { #ifdef WORDS_BIGENDIAN *red_ptr++ = v[1]; *green_ptr++ = v[2]; *blue_ptr++ = v[3]; #else *red_ptr++ = v[2]; *green_ptr++ = v[1]; *blue_ptr++ = v[0]; #endif v += 4; } } if (QuantizeBuffer(bitmap_data->width, bitmap_data->height, &cmap_size, red, green, blue, pixbuf, cmap->Colors) == GIF_ERROR) { goto error; } } cmap->BitsPerPixel = BitSize (cmap_size); cmap->ColorCount = 1 << cmap->BitsPerPixel; if ((frame == 0) && (k == 0)) { /* First Image defines the global colormap */ if (EGifPutScreenDesc (fp, bitmap_data->width, bitmap_data->height, cmap->BitsPerPixel, 0, cmap) == GIF_ERROR) { goto error; } /* An animated image must have the application extension */ if (animated) { /* Store the LoopCount extension */ if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagLoopCount, &index) == Ok) { BYTE Buffer[3]; BYTE *ptr = bitmap_data->property[index].value; Buffer[0] = 1; Buffer[1] = ptr[0]; Buffer[2] = ptr[1]; EGifPutExtensionFirst(fp, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0"); EGifPutExtensionLast(fp, APPLICATION_EXT_FUNC_CODE, 3, Buffer); } } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagExifUserComment, &index) == Ok) { EGifPutComment(fp, (const char *)bitmap_data->property[index].value); } } /* Every image has a control extension specifying the time delay */ if (animated || bitmap_data->transparent < 0) { BYTE buffer[4]; buffer[0] = 0x03; /* 0000 0100 = do not dispose */ if (bitmap_data->transparent < 0) { buffer[0] |= 0x01; /* 0000 0001 = transparent */ } if (gdip_bitmapdata_property_find_id(bitmap_data, PropertyTagFrameDelay, &index) == Ok) { BYTE *ptr; ptr = bitmap_data->property[index].value; buffer[1] = ptr[0]; buffer[2] = ptr[1]; } else { buffer[1] = 0; buffer[2] = 0; } if (bitmap_data->transparent < 0) { buffer[3] = (bitmap_data->transparent + 1) * -1; } else { buffer[3] = 0; } EGifPutExtension(fp, GRAPHICS_EXT_FUNC_CODE, 4, buffer); } /* Store the image description */ /* This call will leak GifFile->Image.ColorMap */ if (EGifPutImageDesc (fp, bitmap_data->left, bitmap_data->top, bitmap_data->width, bitmap_data->height, FALSE, cmap) == GIF_ERROR) { goto error; } for (i = 0; i < bitmap_data->height; ++i) { if (EGifPutLine (fp, pixbuf, bitmap_data->width) == GIF_ERROR) { goto error; } pixbuf += bitmap_data->width; } FreeMapObject (cmap); if (red != NULL) { GdipFree (red); } if (green != NULL) { GdipFree (green); } if (blue != NULL) { GdipFree (blue); } if (pixbuf_org != NULL) { GdipFree (pixbuf_org); } red = NULL; green = NULL; blue = NULL; pixbuf_org = NULL; } } EGifCloseFile (fp); return Ok; error: if (cmap != NULL) { FreeMapObject (cmap); } if (red != NULL) { GdipFree (red); } if (green != NULL) { GdipFree (green); } if (blue != NULL) { GdipFree (blue); } if (pixbuf_org != NULL) { GdipFree (pixbuf_org); } return GenericError; } GpStatus gdip_save_gif_image_to_file (BYTE *filename, GpImage *image) { return gdip_save_gif_image ((void *)filename, image, TRUE); } GpStatus gdip_save_gif_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return gdip_save_gif_image ( (void *)putBytesFunc, image, FALSE); } #else /* No libgif */ #include "image.h" ImageCodecInfo * gdip_getcodecinfo_gif () { return NULL; } GpStatus gdip_load_gif_image_from_file (FILE *fp, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_save_gif_image_to_file (BYTE *filename, GpImage *image) { return UnknownImageFormat; } GpStatus gdip_save_gif_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } GpStatus gdip_load_gif_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seekFunc, GpImage **image) { *image = NULL; return UnknownImageFormat; } #endif libgdiplus-2.11/src/hatchbrush.h0000664000175000017500000000103512225470167013616 00000000000000/* * hatchbrush.h * * Author: * Ravindra (rkumar@novell.com) * * Copyright (C) 2004, 2007 Novell, Inc. http://www.novell.com */ #ifndef __HATCHBRUSH_H__ #define __HATCHBRUSH_H__ #include "brush.h" GpStatus GdipCreateHatchBrush (GpHatchStyle hatchstyle, ARGB forecolor, ARGB backcolor, GpHatch **brush); GpStatus GdipGetHatchStyle (GpHatch *brush, GpHatchStyle *hatchstyle); GpStatus GdipGetHatchForegroundColor (GpHatch *brush, ARGB *forecolor); GpStatus GdipGetHatchBackgroundColor (GpHatch *brush, ARGB *backcolor); #endif libgdiplus-2.11/src/jpegcodec.c0000664000175000017500000006252512225470167013414 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t -*- * * jpegcodec.c : Contains function definitions for encoding decoding jpeg images * * Copyright (C) 2003-2004,2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * */ #if HAVE_CONFIG_H #include #endif #include "gdiplus-private.h" GUID gdip_jpg_image_format_guid = {0xb96b3caeU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; extern GUID GdipEncoderQuality; #ifdef HAVE_LIBJPEG #include /* pkgsrc */ #undef HAVE_STDLIB_H #include #include "dstream.h" #ifdef HAVE_LIBEXIF #include #include #include #endif #include "jpegcodec.h" /* Codecinfo related data*/ static ImageCodecInfo jpeg_codec; static const WCHAR jpeg_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'J', 'P', 'E', 'G', 0}; /* Built-in JPEG */ static const WCHAR jpeg_extension[] = {'*', '.', 'J', 'P','G', ';','*', '.', 'J','P', 'E', 'G', ';', '*', '.', 'J', 'P', 'E', ';', '*', '.', 'J', 'F','I','F', 0}; /* JPG;*.JPEG;*.JPE;*.JFIF */ static const WCHAR jpeg_mimetype[] = {'i', 'm', 'a','g', 'e','/', 'j', 'p', 'e', 'g', 0}; /* image/png */ static const WCHAR jpeg_format[] = {'J', 'P', 'E', 'G', 0}; /* JPEG */ static const BYTE jpeg_sig_pattern[] = { 0xFF, 0xD8 }; static const BYTE jpeg_sig_mask[] = { 0xFF, 0xFF }; ImageCodecInfo * gdip_getcodecinfo_jpeg () { jpeg_codec.Clsid = (CLSID) { 0x557cf401, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; jpeg_codec.FormatID = gdip_jpg_image_format_guid; jpeg_codec.CodecName = (const WCHAR*) jpeg_codecname; jpeg_codec.DllName = NULL; jpeg_codec.FormatDescription = (const WCHAR*) jpeg_format; jpeg_codec.FilenameExtension = (const WCHAR*) jpeg_extension; jpeg_codec.MimeType = (const WCHAR*) jpeg_mimetype; jpeg_codec.Flags = ImageCodecFlagsEncoder | ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; jpeg_codec.Version = 1; jpeg_codec.SigCount = 1; jpeg_codec.SigSize = 2; jpeg_codec.SigPattern = jpeg_sig_pattern; jpeg_codec.SigMask = jpeg_sig_mask; return &jpeg_codec; } #if !defined(HAVE_SIGSETJMP) && !defined(sigsetjmp) #define sigjmp_buf jmp_buf #define sigsetjmp(jb, x) setjmp(jb) #define siglongjmp longjmp #endif #define JPEG_BUFFER_SIZE 65536 struct gdip_stdio_jpeg_source_mgr { struct jpeg_source_mgr parent; FILE *infp; JOCTET *buf; }; typedef struct gdip_stdio_jpeg_source_mgr *gdip_stdio_jpeg_source_mgr_ptr; struct gdip_stream_jpeg_source_mgr { struct jpeg_source_mgr parent; dstream_t *loader; JOCTET *buf; }; typedef struct gdip_stream_jpeg_source_mgr *gdip_stream_jpeg_source_mgr_ptr; struct gdip_stream_jpeg_dest_mgr { struct jpeg_destination_mgr parent; PutBytesDelegate putBytesFunc; JOCTET *buf; }; typedef struct gdip_stream_jpeg_dest_mgr *gdip_stream_jpeg_dest_mgr_ptr; struct gdip_jpeg_error_mgr { struct jpeg_error_mgr parent; sigjmp_buf setjmp_buffer; GError **error; }; typedef struct gdip_jpeg_error_mgr *gdip_jpeg_error_mgr_ptr; static void _gdip_jpeg_error_exit (j_common_ptr cinfo) { gdip_jpeg_error_mgr_ptr err = (gdip_jpeg_error_mgr_ptr) cinfo->err; char buffer[JMSG_LENGTH_MAX]; (* cinfo->err->format_message) (cinfo, buffer); /* There is some very bizzare stuff happening with error * reporting. These are supposed to be fatal errors, * but libjpeg goes through a bunch of these calls and then * -finishes uncompressing the image-. I have no idea * what's going on here. * -- FIXME */ g_warning ("jpeg error: %d %s\n", err->parent.msg_code, buffer); siglongjmp (err->setjmp_buffer, 1); } static void _gdip_jpeg_output_message (j_common_ptr cinfo) { /* shh. */ } static void _gdip_source_dummy_init (j_decompress_ptr cinfo) { /* nothing */ } static BOOL _gdip_source_stdio_fill_input_buffer (j_decompress_ptr cinfo) { gdip_stdio_jpeg_source_mgr_ptr src = (gdip_stdio_jpeg_source_mgr_ptr) cinfo->src; size_t nb; nb = fread (src->buf, 1, JPEG_BUFFER_SIZE, src->infp); if (nb <= 0) { /* this is a hack learned from gdk-pixbuf */ /* insert fake EOI marker, to try to salvage image * in case of malformed/incomplete input */ src->buf[0] = (JOCTET) 0xFF; src->buf[1] = (JOCTET) JPEG_EOI; nb = 2; } src->parent.next_input_byte = src->buf; src->parent.bytes_in_buffer = nb; return TRUE; } static void _gdip_source_stdio_skip_input_data (j_decompress_ptr cinfo, long skipbytes) { gdip_stdio_jpeg_source_mgr_ptr src = (gdip_stdio_jpeg_source_mgr_ptr) cinfo->src; if (skipbytes > 0) { if (skipbytes > (long) src->parent.bytes_in_buffer) { skipbytes -= (long) src->parent.bytes_in_buffer; fseek (src->infp, skipbytes, SEEK_CUR); (void) _gdip_source_stdio_fill_input_buffer (cinfo); } else { src->parent.next_input_byte += (size_t) skipbytes; src->parent.bytes_in_buffer -= (size_t) skipbytes; } } } static BOOL _gdip_source_stream_fill_input_buffer (j_decompress_ptr cinfo) { gdip_stream_jpeg_source_mgr_ptr src = (gdip_stream_jpeg_source_mgr_ptr) cinfo->src; dstream_t *loader = src->loader; size_t nb; nb = dstream_read (loader, src->buf, JPEG_BUFFER_SIZE, 0); if (nb <= 0) { /* this is a hack learned from gdk-pixbuf */ /* insert fake EOI marker, to try to salvage image * in case of malformed/incomplete input */ src->buf[0] = (JOCTET) 0xFF; src->buf[1] = (JOCTET) JPEG_EOI; nb = 2; } src->parent.next_input_byte = src->buf; src->parent.bytes_in_buffer = nb; return TRUE; } static void _gdip_source_stream_skip_input_data (j_decompress_ptr cinfo, long skipbytes) { gdip_stream_jpeg_source_mgr_ptr src = (gdip_stream_jpeg_source_mgr_ptr) cinfo->src; dstream_t *loader = src->loader; if (skipbytes > 0) { if (skipbytes > (long) src->parent.bytes_in_buffer) { skipbytes -= (long) src->parent.bytes_in_buffer; dstream_skip (loader, skipbytes); (void) _gdip_source_stream_fill_input_buffer (cinfo); } else { src->parent.next_input_byte += (size_t) skipbytes; src->parent.bytes_in_buffer -= (size_t) skipbytes; } } } static void _gdip_source_dummy_term (j_decompress_ptr cinfo) { /* nothing */ } static void _gdip_dest_stream_init (j_compress_ptr cinfo) { gdip_stream_jpeg_dest_mgr_ptr dest = (gdip_stream_jpeg_dest_mgr_ptr) cinfo->dest; dest->parent.next_output_byte = dest->buf; dest->parent.free_in_buffer = JPEG_BUFFER_SIZE; } static BOOL _gdip_dest_stream_empty_output_buffer (j_compress_ptr cinfo) { gdip_stream_jpeg_dest_mgr_ptr dest = (gdip_stream_jpeg_dest_mgr_ptr) cinfo->dest; dest->putBytesFunc (dest->buf, JPEG_BUFFER_SIZE); dest->parent.next_output_byte = dest->buf; dest->parent.free_in_buffer = JPEG_BUFFER_SIZE; return TRUE; } static void _gdip_dest_stream_term (j_compress_ptr cinfo) { gdip_stream_jpeg_dest_mgr_ptr dest = (gdip_stream_jpeg_dest_mgr_ptr) cinfo->dest; dest->putBytesFunc (dest->buf, JPEG_BUFFER_SIZE - dest->parent.free_in_buffer); } static GpStatus gdip_load_jpeg_image_internal (struct jpeg_source_mgr *src, GpImage **image) { struct jpeg_decompress_struct cinfo; struct gdip_jpeg_error_mgr jerr; GpBitmap *result; BYTE *destbuf; BYTE *destptr; BYTE *lines[4] = {NULL, NULL, NULL, NULL}; GpStatus status; int stride; unsigned long long int size; destbuf = NULL; result = NULL; cinfo.err = jpeg_std_error ((struct jpeg_error_mgr *) &jerr); jerr.parent.error_exit = _gdip_jpeg_error_exit; jerr.parent.output_message = _gdip_jpeg_output_message; if (sigsetjmp (jerr.setjmp_buffer, 1)) { /* Error occured during decompression */ status = OutOfMemory; goto error; } jpeg_create_decompress (&cinfo); cinfo.src = src; jpeg_read_header (&cinfo, TRUE); cinfo.do_fancy_upsampling = FALSE; cinfo.do_block_smoothing = FALSE; result = gdip_bitmap_new_with_frame (NULL, TRUE); result->type = ImageTypeBitmap; result->active_bitmap->width = cinfo.image_width; result->active_bitmap->height = cinfo.image_height; result->active_bitmap->image_flags = ImageFlagsReadOnly | ImageFlagsHasRealPixelSize | ImageFlagsPartiallyScalable | ImageFlagsHasRealDPI; if (cinfo.density_unit == 1) { /* dpi */ result->active_bitmap->dpi_horz = cinfo.X_density; result->active_bitmap->dpi_vert = cinfo.Y_density; } else if (cinfo.density_unit == 2) { /* dots/cm */ result->active_bitmap->dpi_horz = cinfo.X_density * 2.54; result->active_bitmap->dpi_vert = cinfo.Y_density * 2.54; } else { /* unknown density */ result->active_bitmap->dpi_horz = 0; result->active_bitmap->dpi_vert = 0; } if (cinfo.num_components == 1) { result->cairo_format = CAIRO_FORMAT_A8; result->active_bitmap->pixel_format = PixelFormat8bppIndexed; size = 1; } else if (cinfo.num_components == 3) { /* libjpeg gives us RGB for many formats and * we convert to RGB format when needed. JPEG * does not support alpha (transparency). */ result->cairo_format = CAIRO_FORMAT_ARGB32; result->active_bitmap->pixel_format = PixelFormat24bppRGB; size = 4; } else if (cinfo.num_components == 4) { result->cairo_format = CAIRO_FORMAT_ARGB32; result->active_bitmap->pixel_format = PixelFormat32bppRGB; size = 4; } else goto error; switch (cinfo.jpeg_color_space) { case JCS_GRAYSCALE: result->active_bitmap->image_flags |= ImageFlagsColorSpaceGRAY; if (cinfo.num_components == 1) result->active_bitmap->palette = gdip_create_greyscale_palette (256); break; case JCS_RGB: result->active_bitmap->image_flags |= ImageFlagsColorSpaceRGB; break; case JCS_YCbCr: result->active_bitmap->image_flags |= ImageFlagsColorSpaceYCBCR; break; case JCS_YCCK: result->active_bitmap->image_flags |= ImageFlagsColorSpaceYCCK; break; case JCS_CMYK: result->active_bitmap->image_flags |= ImageFlagsColorSpaceCMYK; break; default: break; } size *= cinfo.image_width; /* stride is a (signed) _int_ and once multiplied by 4 it should hold a value that can be allocated by GdipAlloc * this effectively limits 'width' to 536870911 pixels */ if (size > G_MAXINT32) goto error; stride = result->active_bitmap->stride = size; /* Request cairo-compat output */ /* libjpeg can do only following conversions, * YCbCr => GRAYSCALE, YCbCr => RGB * GRAYSCALE => RGB, YCCK => CMYK. * Therefore, we convert YCbCr, GRAYSCALE to RGB and * YCCK to CMYK using the libjpeg. We convert CMYK * to RGB ourself. */ switch (cinfo.jpeg_color_space) { case JCS_GRAYSCALE: /* special case for indexed 256 greyscale images (bug #81552) */ if (cinfo.num_components == 1) { cinfo.out_color_space = JCS_GRAYSCALE; cinfo.out_color_components = 1; break; } /* else treat as RGB */ case JCS_RGB: case JCS_YCbCr: cinfo.out_color_space = JCS_RGB; cinfo.out_color_components = 3; break; case JCS_YCCK: case JCS_CMYK: cinfo.out_color_space = JCS_CMYK; cinfo.out_color_components = 4; break; default: /* Unsupported JPEG color space */ status = InvalidParameter; goto error; } jpeg_start_decompress (&cinfo); /* ensure total 'size' does not overflow an integer and fits inside our 2GB limit */ size *= cinfo.output_height; if (size > G_MAXINT32) { status = OutOfMemory; goto error; } destbuf = GdipAlloc (size); if (destbuf == NULL) { status = OutOfMemory; goto error; } destptr = destbuf; while (cinfo.output_scanline < cinfo.output_height) { int i; int nlines; for (i = 0; i < cinfo.rec_outbuf_height; i++) { lines[i] = destptr; destptr += stride; } nlines = jpeg_read_scanlines (&cinfo, lines, cinfo.rec_outbuf_height); /* If the out colorspace is not RBG, we need to convert it to RBG. */ if (cinfo.out_color_space == JCS_CMYK) { int i, j; for (i = 0; i < cinfo.rec_outbuf_height; i++) { BYTE *lineptr = lines [i]; for (j = 0; j < cinfo.output_width; j++) { JOCTET c, m, y, k; JOCTET r, g, b; c = lineptr [0]; m = lineptr [1]; y = lineptr [2]; k = lineptr [3]; /* Adobe photoshop seems to have a bug and inverts the CMYK data. * We might need to remove this check, if Adobe decides to fix it. */ if (cinfo.saw_Adobe_marker) { b = (k * c) / 255; g = (k * m) / 255; r = (k * y) / 255; } else { b = (255 - k) * (255 - c) / 255; g = (255 - k) * (255 - m) / 255; r = (255 - k) * (255 - y) / 255; } set_pixel_bgra(lineptr, 0, b, g, r, 0xff); lineptr += 4; } } } else if (cinfo.out_color_components == 1) { /* no decoding required, we already have all we need */ } else { int width = result->active_bitmap->width; for (i = 0; i < nlines; i++) { int j; BYTE *inptr, *outptr; inptr = lines[i] + (width * 3); outptr = lines[i] + stride; /* this loop can't work for the last two lines as it will overwrite values it requires */ for (j = 0; j < width - 2; j++) { /* Note the swapping of R and B, to get ARGB from what * looks like BGR data. */ inptr -= 3; outptr -= 4; set_pixel_bgra(outptr, 0, inptr[2], inptr[1], inptr[0], 0xff); } /* keep last 2 lines in temporary variables */ if (width > 1) { BYTE b2, g2, r2, b1, g1, r1; inptr -= 3; b2 = inptr[2]; g2 = inptr[1]; r2 = inptr[0]; inptr -= 3; b1 = inptr[2]; g1 = inptr[1]; r1 = inptr[0]; outptr -= 4; set_pixel_bgra(outptr, 0, b2, g2, r2, 0xff); outptr -= 4; set_pixel_bgra(outptr, 0, b1, g1, r1, 0xff); } else if (width > 0) { /* in case the jpeg has a single line */ BYTE b, g, r; inptr -= 3; b = inptr[2]; g = inptr[1]; r = inptr[0]; outptr -= 4; set_pixel_bgra(outptr, 0, b, g, r, 0xff); } } } } jpeg_finish_decompress (&cinfo); jpeg_destroy_decompress (&cinfo); result->active_bitmap->scan0 = destbuf; result->active_bitmap->reserved = GBD_OWN_SCAN0; result->surface = cairo_image_surface_create_for_data ((BYTE*)destbuf, result->cairo_format, result->active_bitmap->width, result->active_bitmap->height, stride); *image = result; return Ok; error: /* coverity[dead_error_line] */ if (destbuf != NULL) { GdipFree (destbuf); } if (result != NULL) { gdip_bitmap_dispose (result); } *image = NULL; return status; } #ifdef HAVE_LIBEXIF static void add_properties_from_entry (ExifEntry *entry, void *user_data) { BitmapData *bitmap_data = (BitmapData *) user_data; ULONG length; gdip_bitmapdata_property_add (bitmap_data, entry->tag, entry->size, entry->format, entry->data); } static void add_properties_from_content (ExifContent *content, void *user_data) { exif_content_foreach_entry (content, add_properties_from_entry, user_data); } static void load_exif_data (ExifData *exif_data, GpImage *image) { int n; BitmapData *bitmap; if (exif_data == NULL) return; bitmap = image->active_bitmap; exif_data_foreach_content (exif_data, add_properties_from_content, bitmap); /* thumbnail */ if (exif_data->size != 0) { gdip_bitmapdata_property_add (bitmap, PropertyTagThumbnailData, exif_data->size, PropertyTagTypeByte, exif_data->data); } exif_data_unref (exif_data); } #endif GpStatus gdip_load_jpeg_image_from_file (FILE *fp, const char *filename, GpImage **image) { GpStatus st; #ifdef HAVE_LIBEXIF ExifData *exif_data; #endif gdip_stdio_jpeg_source_mgr_ptr src; src = (gdip_stdio_jpeg_source_mgr_ptr) GdipAlloc (sizeof (struct gdip_stdio_jpeg_source_mgr)); if (src == NULL) { return OutOfMemory; } src->buf = GdipAlloc (JPEG_BUFFER_SIZE * sizeof(JOCTET)); if (src->buf == NULL) { GdipFree(src); return OutOfMemory; } src->parent.init_source = _gdip_source_dummy_init; src->parent.fill_input_buffer = _gdip_source_stdio_fill_input_buffer; src->parent.skip_input_data = _gdip_source_stdio_skip_input_data; src->parent.resync_to_restart = jpeg_resync_to_restart; src->parent.term_source = _gdip_source_dummy_term; src->parent.bytes_in_buffer = 0; src->parent.next_input_byte = NULL; src->infp = fp; st = gdip_load_jpeg_image_internal ((struct jpeg_source_mgr *) src, image); GdipFree (src->buf); GdipFree (src); #ifdef HAVE_LIBEXIF if (st == Ok) { load_exif_data (exif_data_new_from_file (filename), *image); } #endif return st; } GpStatus gdip_load_jpeg_image_from_stream_delegate (dstream_t *loader, GpImage **image) { GpStatus st; #ifdef HAVE_LIBEXIF unsigned int length; BYTE *ptr; #endif gdip_stream_jpeg_source_mgr_ptr src; src = (gdip_stream_jpeg_source_mgr_ptr) GdipAlloc (sizeof (struct gdip_stream_jpeg_source_mgr)); src->buf = GdipAlloc (JPEG_BUFFER_SIZE * sizeof(JOCTET)); src->parent.init_source = _gdip_source_dummy_init; src->parent.fill_input_buffer = _gdip_source_stream_fill_input_buffer; src->parent.skip_input_data = _gdip_source_stream_skip_input_data; src->parent.resync_to_restart = jpeg_resync_to_restart; src->parent.term_source = _gdip_source_dummy_init; src->parent.bytes_in_buffer = 0; src->parent.next_input_byte = NULL; src->loader = loader; #ifdef HAVE_LIBEXIF dstream_keep_exif_buffer (loader); #endif st = gdip_load_jpeg_image_internal ((struct jpeg_source_mgr *) src, image); GdipFree (src->buf); GdipFree (src); #ifdef HAVE_LIBEXIF if (st == Ok){ dstream_get_exif_buffer (loader, &ptr, &length); load_exif_data (exif_data_new_from_data (ptr, length), *image); } #endif return st; } static GpStatus gdip_save_jpeg_image_internal (FILE *fp, PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { gdip_stream_jpeg_dest_mgr_ptr dest = NULL; struct jpeg_compress_struct cinfo; struct gdip_jpeg_error_mgr jerr; const EncoderParameter *param; GpBitmap *bitmap = (GpBitmap *) image; JOCTET *scanline = NULL; int need_argb_conversion = 0; GpStatus status; /* Verify that we can support this pixel format */ switch (image->active_bitmap->pixel_format) { case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: case PixelFormat24bppRGB: break; case PixelFormat1bppIndexed: case PixelFormat4bppIndexed: case PixelFormat8bppIndexed: image = gdip_convert_indexed_to_rgb (image); if (image == NULL) { return OutOfMemory; } /* We recurse, makes flow and cleanup more straightforward */ status = gdip_save_jpeg_image_internal(fp, putBytesFunc, image, params); return status; default: status = InvalidParameter; goto error; } cinfo.err = jpeg_std_error ((struct jpeg_error_mgr *) &jerr); jerr.parent.error_exit = _gdip_jpeg_error_exit; jerr.parent.output_message = _gdip_jpeg_output_message; if (sigsetjmp (jerr.setjmp_buffer, 1)) { status = GenericError; goto error; } jpeg_create_compress (&cinfo); if (fp != NULL) { jpeg_stdio_dest (&cinfo, fp); } else { dest = GdipAlloc (sizeof (struct gdip_stream_jpeg_dest_mgr)); dest->parent.init_destination = _gdip_dest_stream_init; dest->parent.empty_output_buffer = _gdip_dest_stream_empty_output_buffer; dest->parent.term_destination = _gdip_dest_stream_term; dest->putBytesFunc = putBytesFunc; dest->buf = GdipAlloc (JPEG_BUFFER_SIZE); cinfo.dest = (struct jpeg_destination_mgr *) dest; } cinfo.image_width = image->active_bitmap->width; cinfo.image_height = image->active_bitmap->height; if (gdip_get_pixel_format_components (image->active_bitmap->pixel_format) == 3) { cinfo.in_color_space = JCS_RGB; cinfo.input_components = 3; if (image->active_bitmap->pixel_format == PixelFormat24bppRGB) { need_argb_conversion = 1; } else { need_argb_conversion = 0; } } else if (gdip_get_pixel_format_components (image->active_bitmap->pixel_format) == 4) { cinfo.in_color_space = JCS_RGB; cinfo.input_components = 3; need_argb_conversion = 1; } else if (gdip_get_pixel_format_components (image->active_bitmap->pixel_format) == 1) { cinfo.in_color_space = JCS_RGB; cinfo.input_components = 1; need_argb_conversion = 1; /* do this conversion */ } jpeg_set_defaults (&cinfo); if (gdip_get_pixel_format_components (image->active_bitmap->pixel_format) == 1) { jpeg_set_colorspace (&cinfo, JCS_GRAYSCALE); } /* Handle encoding parameters */ if (params) { param = gdip_find_encoder_parameter (params, &GdipEncoderQuality); if (param != NULL) { int quality; if (param->Type == EncoderParameterValueTypeLong) { quality = * (int *) param->Value; } else if (param->Type == EncoderParameterValueTypeLongRange) { const int *pval = (int *) param->Value; quality = (pval[0] + pval[1]) / 2; } else if (param->Type == EncoderParameterValueTypeByte) { quality = *(BYTE*)param->Value; } else if (param->Type == EncoderParameterValueTypeShort) { quality = *(short *)param->Value; } else { /* Should we report an error here? */ quality = 80; } jpeg_set_quality (&cinfo, quality, 0); } } jpeg_start_compress (&cinfo, TRUE); if (need_argb_conversion) { BYTE *inptr, *outptr; int i, j; scanline = GdipAlloc (image->active_bitmap->stride); for (i = 0; i < image->active_bitmap->height; i++) { inptr = image->active_bitmap->scan0 + (i * image->active_bitmap->stride); outptr = scanline; for (j = 0; j < image->active_bitmap->width; j++) { #ifdef WORDS_BIGENDIAN *outptr++ = inptr[1]; /* R */ *outptr++ = inptr[2]; /* G */ *outptr++ = inptr[3]; /* B */ #else *outptr++ = inptr[2]; /* R */ *outptr++ = inptr[1]; /* G */ *outptr++ = inptr[0]; /* B */ #endif inptr += 4; /* skip RGB+A */ } jpeg_write_scanlines (&cinfo, &scanline, 1); } GdipFree (scanline); scanline = NULL; } else { int i; for (i = 0; i < image->active_bitmap->height; i++) { scanline = image->active_bitmap->scan0 + (i * image->active_bitmap->stride); jpeg_write_scanlines (&cinfo, &scanline, 1); } } jpeg_finish_compress (&cinfo); jpeg_destroy_compress (&cinfo); if (dest != NULL) { if (dest->buf != NULL) { GdipFree (dest->buf); } GdipFree (dest); } return Ok; error: jpeg_destroy_compress (&cinfo); /* coverity[dead_error_line] */ if (dest != NULL) { if (dest->buf != NULL) { GdipFree (dest->buf); } GdipFree (dest); } if (scanline != NULL && need_argb_conversion) { GdipFree (scanline); } return GenericError; return status; } GpStatus gdip_save_jpeg_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) { return gdip_save_jpeg_image_internal (fp, NULL, image, params); } GpStatus gdip_save_jpeg_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return gdip_save_jpeg_image_internal (NULL, putBytesFunc, image, params); } #else /* No libjpeg */ #include "image.h" #include "dstream.h" ImageCodecInfo * gdip_getcodecinfo_jpeg () { return NULL; } GpStatus gdip_load_jpeg_image_from_file (FILE *fp, const char *filename, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_save_jpeg_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } GpStatus gdip_load_jpeg_image_from_stream_delegate (dstream_t *loader, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_save_jpeg_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } #endif /* * MS Jpeg supports: * Quality (LongRange) * Transformation (Long) * LuminanceTable (Short) * ChrominanceTable (Short) * For now, we're only going to export Quality. */ UINT gdip_get_encoder_parameter_list_size_jpeg () { /* We'll need: * 4 - count * + sizeof(EncoderParameter) * 1 - number of param structs * + sizeof(int) * 2 - param data (the two quality values) * and make sure the whole thing is 4-byte aligned (so we can index from the end) */ UINT sz = 4 + sizeof(EncoderParameter) * 1 + sizeof(int) * 2; return (sz + 3) & ~3; } GpStatus gdip_fill_encoder_parameter_list_jpeg (EncoderParameters *eps, UINT size) { BYTE *ucptr = (BYTE*) eps; int *iptr; if (!eps || (size < gdip_get_encoder_parameter_list_size_jpeg ()) || ((size & 3) != 0)) return InvalidParameter; eps->Count = 1; /* Steal the last 8 bytes from the data space to hold our range values */ iptr = (int *) (ucptr + size - 8); iptr[0] = 0; iptr[1] = 100; eps->Parameter[0].Guid = GdipEncoderQuality; eps->Parameter[0].NumberOfValues = 1; eps->Parameter[0].Type = EncoderParameterValueTypeLongRange; eps->Parameter[0].Value = iptr; return Ok; } libgdiplus-2.11/src/graphics.h0000664000175000017500000003333312225470167013271 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __GRAPHICS_H__ #define __GRAPHICS_H__ /* Graphics public API (only!) */ typedef unsigned int GraphicsContainer; GpStatus GdipBeginContainer (GpGraphics *graphics, GDIPCONST GpRectF* dstrect, GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state); GpStatus GdipBeginContainer2 (GpGraphics *graphics, GraphicsContainer* state); GpStatus GdipBeginContainerI (GpGraphics *graphics, GDIPCONST GpRect* dstrect, GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state); GpStatus GdipEndContainer (GpGraphics *graphics, GraphicsContainer state); GpStatus GdipCreateFromHDC (HDC hDC, GpGraphics **graphics); GpStatus GdipDeleteGraphics (GpGraphics *graphics); GpStatus GdipGetDC (GpGraphics *graphics, HDC *hDC); GpStatus GdipReleaseDC (GpGraphics *graphics, HDC hDC); GpStatus GdipRestoreGraphics (GpGraphics *graphics, unsigned int graphicsState); GpStatus GdipSaveGraphics(GpGraphics *graphics, unsigned int * state); GpStatus GdipGetWorldTransform (GpGraphics *graphics, GpMatrix *matrix); GpStatus GdipSetWorldTransform (GpGraphics *graphics, GpMatrix *matrix); GpStatus GdipMultiplyWorldTransform (GpGraphics *graphics, GpMatrix *matrix, GpMatrixOrder order); GpStatus GdipResetWorldTransform (GpGraphics *graphics); GpStatus GdipScaleWorldTransform (GpGraphics *graphics, float sx, float sy, GpMatrixOrder order); GpStatus GdipRotateWorldTransform (GpGraphics *graphics, float angle, GpMatrixOrder order); GpStatus GdipTranslateWorldTransform (GpGraphics *graphics, float dx, float dy, GpMatrixOrder order); GpStatus GdipDrawArc (GpGraphics *graphics, GpPen *pen, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle); GpStatus GdipDrawArcI (GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle); GpStatus GdipDrawBezier (GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1, REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4); GpStatus GdipDrawBezierI (GpGraphics *graphics, GpPen *pen, INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4); GpStatus GdipDrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count); GpStatus GdipDrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count); GpStatus GdipDrawCurve (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count); GpStatus GdipDrawCurveI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count); GpStatus GdipDrawCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count, REAL tension); GpStatus GdipDrawCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count, REAL tension); GpStatus GdipDrawCurve3 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count, INT offset, INT numOfSegments, REAL tension); GpStatus GdipDrawCurve3I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count, INT offset, INT numOfSegments, REAL tension); GpStatus GdipDrawClosedCurve (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count); GpStatus GdipDrawClosedCurveI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count); GpStatus GdipDrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count, REAL tension); GpStatus GdipDrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count, REAL tension); GpStatus GdipDrawEllipse (GpGraphics *graphics, GpPen *pen, REAL x, REAL y, REAL width, REAL height); GpStatus GdipDrawEllipseI (GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height); GpStatus GdipDrawImage (GpGraphics *graphics, GpImage *image, REAL x, REAL y); GpStatus GdipDrawImageI (GpGraphics *graphics, GpImage *image, INT x, INT y); GpStatus GdipDrawImageRect (GpGraphics *graphics, GpImage *image, REAL x, REAL y, REAL width, REAL height); GpStatus GdipDrawImageRectI (GpGraphics *graphics, GpImage *image, INT x, INT y, INT width, INT height); GpStatus GdipDrawImagePoints (GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *dstPoints, INT count); GpStatus GdipDrawImagePointsI (GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstPoints, INT count); GpStatus GdipDrawImagePointRect (GpGraphics *graphics, GpImage *image, REAL x, REAL y, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit); GpStatus GdipDrawImagePointRectI (GpGraphics *graphics, GpImage *image, INT x, INT y, INT srcx, INT srcy, INT srcwidth, INT srcheight, GpUnit srcUnit); GpStatus GdipDrawImageRectRect (GpGraphics *graphics, GpImage *image, REAL dstx, REAL dsty, REAL dstwidth, REAL dstheight, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData); GpStatus GdipDrawImageRectRectI (GpGraphics *graphics, GpImage *image, INT dstx, INT dsty, INT dstwidth, INT dstheight, INT srcx, INT srcy, INT srcwidth, INT srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData); GpStatus GdipDrawImagePointsRect (GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *points, INT count, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData); GpStatus GdipDrawImagePointsRectI (GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *points, INT count, INT srcx, INT srcy, INT srcwidth, INT srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData); GpStatus GdipDrawLine (GpGraphics *graphics, GpPen *pen, REAL x1, REAL y1, REAL x2, REAL y2); GpStatus GdipDrawLineI (GpGraphics *graphics, GpPen *pen, INT x1, INT y1, INT x2, INT y2); GpStatus GdipDrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count); GpStatus GdipDrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count); GpStatus GdipDrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path); GpStatus GdipDrawPie (GpGraphics *graphics, GpPen *pen, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle); GpStatus GdipDrawPieI (GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle); GpStatus GdipDrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, INT count); GpStatus GdipDrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, INT count); GpStatus GdipDrawRectangle (GpGraphics *graphics, GpPen *pen, REAL x, REAL y, REAL width, REAL height); GpStatus GdipDrawRectangleI (GpGraphics *graphics, GpPen *pen, INT x, INT y, INT width, INT height); GpStatus GdipDrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, INT count); GpStatus GdipDrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, INT count); GpStatus GdipFillClosedCurve (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count); GpStatus GdipFillClosedCurveI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count); GpStatus GdipFillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count, REAL tension); GpStatus GdipFillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count, REAL tension); GpStatus GdipFillEllipse (GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height); GpStatus GdipFillEllipseI (GpGraphics *graphics, GpBrush *brush, INT x, INT y, INT width, INT height); GpStatus GdipFillRectangle (GpGraphics *graphics, GpBrush *brush, REAL x1, REAL y1, REAL x2, REAL y2); GpStatus GdipFillRectangleI (GpGraphics *graphics, GpBrush *brush, INT x1, INT y1, INT x2, INT y2); GpStatus GdipFillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, INT count); GpStatus GdipFillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, INT count); GpStatus GdipFillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count, FillMode fillMode); GpStatus GdipFillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count, FillMode fillMode); GpStatus GdipFillPolygon2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, INT count); GpStatus GdipFillPolygon2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, INT count); GpStatus GdipFillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path); GpStatus GdipFillPie (GpGraphics *graphics, GpBrush *brush, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle); GpStatus GdipFillPieI( GpGraphics *graphics, GpBrush *brush, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle); GpStatus GdipFillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region); GpStatus GdipGraphicsClear (GpGraphics *graphics, ARGB color); GpStatus GdipGetDpiX( GpGraphics *graphics, REAL *dpi); GpStatus GdipGetDpiY (GpGraphics *graphics, REAL *dpi); GpStatus GdipGetNearestColor (GpGraphics *graphics, ARGB *argb); GpStatus GdipSetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode); GpStatus GdipGetCompositingMode (GpGraphics *graphics, CompositingMode *compositingMode); GpStatus GdipSetCompositingQuality (GpGraphics *graphics, CompositingQuality compositingQuality); GpStatus GdipGetCompositingQuality (GpGraphics *graphics, CompositingQuality *compositingQuality); GpStatus GdipSetInteroplationMode (GpGraphics *graphics, InterpolationMode imode); GpStatus GdipGetInteroplationMode (GpGraphics *graphics, InterpolationMode *imode); GpStatus GdipSetPageScale (GpGraphics *graphics, REAL scale); GpStatus GdipGetPageScale (GpGraphics *graphics, REAL *scale); GpStatus GdipSetPageUnit (GpGraphics *graphics, GpUnit unit); GpStatus GdipGetPageUnit (GpGraphics *graphics, GpUnit *unit); GpStatus GdipSetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode pixelOffsetMode); GpStatus GdipGetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode); GpStatus GdipSetRenderingOrigin (GpGraphics *graphics, INT x, INT y); GpStatus GdipGetRenderingOrigin (GpGraphics *graphics, INT *x, INT *y); GpStatus GdipSetSmoothingMode (GpGraphics *graphics, SmoothingMode mode); GpStatus GdipGetSmoothingMode (GpGraphics *graphics, SmoothingMode *mode); GpStatus GdipSetTextContrast (GpGraphics *graphics, UINT contrast); GpStatus GdipGetTextContrast (GpGraphics *graphics, UINT *contrast); GpStatus GdipSetTextRenderingHint (GpGraphics *graphics, TextRenderingHint mode); GpStatus GdipGetTextRenderingHint (GpGraphics *graphics, TextRenderingHint *mode); GpStatus GdipIsVisiblePoint (GpGraphics *graphics, REAL x, REAL y, BOOL *result); GpStatus GdipIsVisiblePointI (GpGraphics *graphics, INT x, INT y, BOOL *result); GpStatus GdipIsVisibleRect (GpGraphics *graphics, REAL x, REAL y, REAL width, REAL height, BOOL *result); GpStatus GdipIsVisibleRectI (GpGraphics *graphics, INT x, INT y, INT width, INT height, BOOL *result); GpStatus GdipTransformPoints (GpGraphics *graphics, GpCoordinateSpace destSpace, GpCoordinateSpace srcSpace, GpPointF *points, INT count); GpStatus GdipTransformPointsI (GpGraphics *graphics, GpCoordinateSpace destSpace, GpCoordinateSpace srcSpace, GpPoint *points, INT count); GpStatus GdipResetClip (GpGraphics *graphics); GpStatus GdipGetClip (GpGraphics *graphics, GpRegion *region); GpStatus GdipGetClipBounds (GpGraphics *graphics, GpRectF *rect); GpStatus GdipGetClipBoundsI (GpGraphics *graphics, GpRect *rect); GpStatus GdipGetVisibleClipBounds (GpGraphics *graphics, GpRectF *rect); GpStatus GdipGetVisibleClipBoundsI (GpGraphics *graphics, GpRect *rect); GpStatus GdipIsClipEmpty (GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisibleClipEmpty (GpGraphics *graphics, BOOL *result); GpStatus GdipSetClipGraphics (GpGraphics *graphics, GpGraphics *srcgraphics, CombineMode combineMode); GpStatus GdipSetClipHrgn (GpGraphics *graphics, void *hRgn, CombineMode combineMode); GpStatus GdipSetClipPath (GpGraphics *graphics, GpPath *path, CombineMode combineMode); GpStatus GdipSetClipRect (GpGraphics *graphics, REAL x, REAL y, REAL width, REAL height, CombineMode combineMode); GpStatus GdipSetClipRectI (GpGraphics *graphics, INT x, INT y, INT width, INT height, CombineMode combineMode); GpStatus GdipSetClipRegion (GpGraphics *graphics, GpRegion *region, CombineMode combineMode); GpStatus GdipSetVisibleClip_linux (GpGraphics *graphics, GpRect *rect); GpStatus GdipTranslateClip (GpGraphics *graphics, REAL dx, REAL dy); GpStatus GdipTranslateClipI (GpGraphics *graphics, INT dx, INT dy); /* missing API GdipCreateFromHDC2 GdipCreateFromHWND GdipCreateFromHWNDICM GdipCreateHalftonePalette GdipResetPageTransform */ #endif libgdiplus-2.11/src/brush.c0000664000175000017500000000536112225470167012607 00000000000000/* * brush.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine(pigolkine@gmx.de) * Ravindra (rkumar@novell.com) */ #include "brush-private.h" #include "graphics-private.h" void gdip_brush_init (GpBrush *brush, BrushClass* vtable) { brush->vtable = vtable; /* Set the changed state to true, so that we don't miss the * first setup of the brush. */ brush->changed = TRUE; } GpStatus gdip_brush_setup (GpGraphics *graphics, GpBrush *brush) { /* Don't need to setup, if brush is the same as the cached brush and * it is not changed. Just comparing pointers may not be sufficient * to say that the brushes are same. It is possible to have different * brush on the same memory, but probability is very low. We would * need a function to check the equality of the brushes in that case. */ if (brush == graphics->last_brush && !brush->changed) return Ok; else { GpStatus status = brush->vtable->setup (graphics, brush); if (status == Ok) { brush->changed = FALSE; graphics->last_brush = brush; } return status; } } /* coverity[+alloc : arg-*1] */ GpStatus GdipCloneBrush (GpBrush *brush, GpBrush **clonedBrush) { if (!brush || !clonedBrush) return InvalidParameter; return brush->vtable->clone_brush (brush, clonedBrush); } GpStatus GdipDeleteBrush (GpBrush *brush) { GpStatus status; if (!brush) return InvalidParameter; status = brush->vtable->destroy (brush); GdipFree (brush); return status; } GpStatus GdipGetBrushType (GpBrush *brush, GpBrushType *type) { if (!brush || !type) return InvalidParameter; *type = brush->vtable->type; return Ok; } libgdiplus-2.11/src/font-private.h0000664000175000017500000000444612225470167014112 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __FONT_PRIVATE_H__ #define __FONT_PRIVATE_H__ #include "gdiplus-private.h" #ifdef USE_PANGO_RENDERING #include #include #endif struct _Font { float sizeInPixels; FontStyle style; unsigned char* face; GpFontFamily *family; float emSize; GpUnit unit; #ifdef USE_PANGO_RENDERING PangoFontDescription *pango; #else cairo_font_face_t *cairofnt; cairo_t *cairo; #endif }; void gdip_font_clear_pattern_cache (void) GDIP_INTERNAL; #ifdef USE_PANGO_RENDERING PangoFontDescription* gdip_get_pango_font_description (GpFont *font); #else cairo_font_face_t* gdip_get_cairo_font_face (GpFont *font); #endif #include "font.h" #endif libgdiplus-2.11/src/text-cairo.c0000664000175000017500000011400412225470167013536 00000000000000/* * Copyright (c) 2003 Alexandre Pigolkine, Novell Inc. * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #include "gdiplus-private.h" #ifndef USE_PANGO_RENDERING #include #include "text-cairo-private.h" #include "graphics-private.h" #include "graphics-cairo-private.h" #include "brush-private.h" #include "font-private.h" /* * NOTE: all parameter's validations are done inside text.c */ #undef DRAWSTRING_DEBUG static int CalculateStringWidths (cairo_t *ct, GDIPCONST GpFont *gdiFont, GDIPCONST gunichar2 *stringUnicode, unsigned long StringDetailElements, GpStringDetailStruct *StringDetails) { size_t i; cairo_text_extents_t ext; GpStringDetailStruct *CurrentDetail; BYTE utf8[5]; CurrentDetail = StringDetails; for (i = 0; i < StringDetailElements; i++) { utf8[utf8_encode_ucs2char(*(stringUnicode + i), utf8)] = '\0'; cairo_text_extents(ct, (const char *) utf8, &ext); CurrentDetail->Width = ext.x_advance; CurrentDetail++; } return StringDetailElements; } #ifdef NOT_USED /* Currently not used */ static int CalculateStringWidthsUTF8 (cairo_t *ct, GDIPCONST GpFont *gdiFont, const BYTE *utf8, unsigned long StringDetailElements, GpStringDetailStruct *StringDetails) { FT_Face face; size_t i; gunichar *ucs4 = NULL; cairo_font_face_t *Font; GpStringDetailStruct *CurrentDetail; glong NumOfGlyphs; cairo_matrix_t matrix; #ifdef DRAWSTRING_DEBUG printf("CalculateStringWidths(font, %s, %d, details) called\n", utf8, StringDetailElements); #endif Font = (cairo_font_face_t *)gdiFont->cairofnt; face = gdip_cairo_ft_font_lock_face(Font); if (!face) return 0; cairo_get_font_matrix(ct, &matrix); cairo_matrix_scale(&matrix, gdiFont->sizeInPixels, gdiFont->sizeInPixels); ucs4 = g_utf8_to_ucs4 ((const gchar *) utf8, (glong)-1, NULL, &NumOfGlyphs, NULL); if ((NumOfGlyphs == 0) || (ucs4 == NULL)) { return 0; } CurrentDetail=StringDetails; for (i = 0; i < NumOfGlyphs; i++) { FT_Load_Glyph (face, FT_Get_Char_Index (face, ucs4[i]), FT_LOAD_DEFAULT); CurrentDetail->Width = DOUBLE_FROM_26_6 (face->glyph->advance.x); CurrentDetail++; } gdip_cairo_ft_font_unlock_face(Font); GdipFree(ucs4); #ifdef DRAWSTRING_DEBUG printf("CalculateStringWidths: string >%s< translated into %d glyphs\n", utf8, NumOfGlyphs); #endif return NumOfGlyphs; } #endif static GpStatus MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int *length, GDIPCONST GpFont *font, GDIPCONST RectF *rc_org, GDIPCONST GpStringFormat *format, GpBrush *brush, RectF *boundingBox, int *codepointsFitted, int *linesFilled, WCHAR *CleanString, GpStringDetailStruct* StringDetails, GpDrawTextData *data) { BYTE *String; /* Holds the UTF8 version of our sanitized string */ unsigned long StringLen; /* Length of CleanString */ GDIPCONST WCHAR *Src; WCHAR *Dest; unsigned long i; unsigned long j; GpStringDetailStruct *CurrentDetail; GpStringDetailStruct *CurrentLineStart; /* For rendering engine, to bump LineLen */ float *TabStops; int NumOfTabStops; int WrapPoint; /* Array index of wrap character */ int WrapX; /* Width of text at wrap character */ float CursorX; /* Current X position of drawing cursor */ float CursorY; /* Current Y position of drawing cursor */ int MaxX; /* Largest X of cursor */ int MaxXatY; /* Y coordinate of line with largest X, needed for MaxX resetting on wrap */ int MaxY; /* Largest Y of cursor */ int FrameWidth; /* rc->Width (or rc->Height if vertical) */ int FrameHeight; /* rc->Height (or rc->Width if vertical) */ int AlignHorz; /* Horizontal Alignment mode */ int AlignVert; /* Vertical Alignment mode */ int LineHeight; /* Height of a line with given font */ cairo_font_extents_t FontExtent; /* Info about our font */ cairo_font_options_t *FontOptions; RectF rc_coords, *rc = &rc_coords; float FontSize; if (OPTIMIZE_CONVERSION (graphics)) { rc->X = rc_org->X; rc->Y = rc_org->Y; rc->Width = rc_org->Width; rc->Height = rc_org->Height; } else { rc->X = gdip_unitx_convgr (graphics, rc_org->X); rc->Y = gdip_unity_convgr (graphics, rc_org->Y); rc->Width = gdip_unitx_convgr (graphics, rc_org->Width); rc->Height = gdip_unity_convgr (graphics, rc_org->Height); } #ifdef DRAWSTRING_DEBUG printf("GdipDrawString(...) called (length=%d, fontsize=%d)\n", length, (int)font->sizeInPixels); #endif TabStops = format->tabStops; NumOfTabStops = format->numtabStops; /* Prepare our various buffers and variables */ StringLen = *length; if (data) data->has_hotkeys = FALSE; /* Set aliasing mode */ FontOptions = cairo_font_options_create(); switch(graphics->text_mode) { default: case TextRenderingHintSystemDefault: { cairo_font_options_set_antialias(FontOptions, CAIRO_ANTIALIAS_DEFAULT); //cairo_font_options_set_hint_style(FontOptions, CAIRO_HINT_STYLE_NONE); //cairo_font_options_set_subpixel_order(FontOptions, CAIRO_SUBPIXEL_ORDER_DEFAULT); //cairo_font_options_set_hint_style(FontOptions, CAIRO_HINT_STYLE_DEFAULT); //cairo_font_options_set_hint_metrics(FontOptions, CAIRO_HINT_METRICS_DEFAULT); break; } // FIXME - pick matching settings for each text mode case TextRenderingHintSingleBitPerPixelGridFit: case TextRenderingHintSingleBitPerPixel: case TextRenderingHintAntiAliasGridFit: case TextRenderingHintAntiAlias: { cairo_font_options_set_antialias(FontOptions, CAIRO_ANTIALIAS_DEFAULT); break; } case TextRenderingHintClearTypeGridFit: { cairo_font_options_set_antialias(FontOptions, CAIRO_ANTIALIAS_DEFAULT); break; } } cairo_set_font_options(graphics->ct, FontOptions); cairo_font_options_destroy(FontOptions); // Do we want this here? /* Commented out until we properly save/restore AA settings; should fix bug #76135 cairo_set_antialias(graphics->ct, CAIRO_ANTIALIAS_NONE); */ /* Get font size information; how expensive is the cairo stuff here? */ cairo_set_font_face (graphics->ct, (cairo_font_face_t*) font->cairofnt); /* Set our font; this will also be used for later drawing */ /* this will always return the same value, except when printing */ FontSize = (graphics->type == gtPostScript) ? font->emSize : font->sizeInPixels; cairo_set_font_size (graphics->ct, FontSize); cairo_font_extents (graphics->ct, &FontExtent); /* Get the size we're looking for */ /* cairo_font_set_transform(font->cairofnt, SavedMatrix);*/ /* Restore the matrix */ if ((LineHeight=FontExtent.ascent)<1) { LineHeight=1; } #ifdef DRAWSTRING_DEBUG printf("Font extents: ascent:%d, descent: %d, height:%d, maxXadvance:%d, maxYadvance:%d\n", (int)FontExtent.ascent, (int)FontExtent.descent, (int)FontExtent.height, (int)FontExtent.max_x_advance, (int)FontExtent.max_y_advance); #endif /* Sanitize string, remove formatting chars and build description array */ #ifdef DRAWSTRING_DEBUG printf("GdipDrawString(...) Sanitizing string, StringLen=%d\n", StringLen); #endif Src=stringUnicode; /* unless specified we don't consider the trailing spaces, unless there is just one space (#80680) */ if ((format->formatFlags & StringFormatFlagsMeasureTrailingSpaces) == 0) { while ((StringLen > 0) && (isspace ((int) ((unsigned char) *(Src + StringLen - 1))))) StringLen--; if (StringLen == 0) StringLen = 1; } Dest=CleanString; CurrentDetail=StringDetails; for (i=0; i 0) { CurrentDetail->Flags |= STRING_DETAIL_TAB; } Src++; continue; } case '\n': { /* LF */ CurrentDetail->Flags |= STRING_DETAIL_LF; CurrentDetail->Linefeeds++; Src++; continue; } case '&': { /* We print *all* chars if no hotkeys */ if (format->hotkeyPrefix==HotkeyPrefixNone) { break; } Src++; if (*Src=='&') { /* We skipped the first '&', the break will make us drop to copying the second */ break; } CurrentDetail->Flags |= STRING_DETAIL_HOTKEY; if (data) data->has_hotkeys = TRUE; continue; } /* Boy, this must be slow, FIXME somehow */ default: { if (((format->formatFlags & StringFormatFlagsNoWrap)==0) || ((format->trimming != StringTrimmingCharacter) && (format->trimming != StringTrimmingNone))) { break; } /* Fall through */ } case ' ': case '.': { /* Mark where we can break for a new line */ CurrentDetail->Flags |= STRING_DETAIL_BREAK; break; } } *Dest=*Src; Src++; Dest++; CurrentDetail++; } *Dest='\0'; /* Recalculate StringLen; we may have shortened String */ Dest=CleanString; StringLen=0; while (*Dest!=0) { StringLen++; Dest++; } /* Don't bother doing anything else if the length is 0 */ if (StringLen == 0) { *length = 0; return Ok; } /* Convert string from Gdiplus format to UTF8, suitable for cairo */ String = (BYTE*) ucs2_to_utf8 ((const gunichar2 *)CleanString, -1); if (!String) return OutOfMemory; #ifdef DRAWSTRING_DEBUG printf("Sanitized string: >%s<, length %d (utf8-length:%d)\n", String, StringLen, strlen((char *)String)); #endif /* Generate size array */ if (CalculateStringWidths (graphics->ct, font, CleanString, StringLen, StringDetails)==0) { /* FIXME; pick right return code */ GdipFree(String); return Ok; } GdipFree (String); CursorX=0; CursorY=0; MaxX=0; MaxXatY=0; MaxY=0; CurrentLineStart=StringDetails; CurrentDetail=StringDetails; CurrentDetail->Flags |= STRING_DETAIL_LINESTART; WrapPoint=-1; WrapX=0; if (format->formatFlags & StringFormatFlagsDirectionVertical) { FrameWidth = SAFE_FLOAT_TO_UINT32 (rc->Height); FrameHeight = SAFE_FLOAT_TO_UINT32 (rc->Width); } else { FrameWidth = SAFE_FLOAT_TO_UINT32 (rc->Width); FrameHeight = SAFE_FLOAT_TO_UINT32 (rc->Height); } #ifdef DRAWSTRING_DEBUG printf("Frame %d x %d\n", FrameWidth, FrameHeight); #endif for (i=0; iFlags & STRING_DETAIL_TAB) { float tab_pos; int tab_index; tab_pos = format->firstTabOffset; tab_index = 0; while (CursorX > tab_pos) { tab_pos += TabStops[tab_index % NumOfTabStops]; tab_index++; } CursorX = tab_pos; CurrentLineStart = CurrentDetail; CurrentDetail->Flags |= STRING_DETAIL_LINESTART; } if (CurrentDetail->Flags & STRING_DETAIL_LF) { CursorX = 0; CursorY += LineHeight * CurrentDetail->Linefeeds; CurrentDetail->Flags |= STRING_DETAIL_LINESTART; CurrentLineStart = CurrentDetail; #ifdef DRAWSTRING_DEBUG { int j; for (j=0; jLinefeeds; j++) { printf("\n"); } } #endif } #ifdef DRAWSTRING_DEBUG printf("[%3d] X: %3d, Y:%3d, '%c' | ", i, (int)CursorX, (int)CursorY, CleanString[i]>=32 ? CleanString[i] : '?'); #endif /* Remember where to wrap next, but only if wrapping allowed */ if (((format->formatFlags & StringFormatFlagsNoWrap)==0) && (CurrentDetail->Flags & STRING_DETAIL_BREAK)) { if (CleanString[i] == ' ') { WrapPoint=i+1; /* We skip the break char itself, keeping it at the end of the old line */ } else { WrapPoint=i; } if (CursorX>MaxX) { WrapX=CursorX; } else { WrapX=MaxX; } #ifdef DRAWSTRING_DEBUG printf(""); #endif } /* New line voids any previous wrap point */ if (CurrentDetail->Flags & STRING_DETAIL_LINESTART) { WrapPoint=-1; } CurrentDetail->PosX=CursorX; CurrentDetail->PosY=CursorY; /* Advance cursor */ CursorX+=CurrentDetail->Width; if (MaxXFrameWidth) { if (WrapPoint!=-1) { /** Re-Calculate line lengths **/ /* Old line */ CurrentLineStart->LineLen-=i-WrapPoint; if (MaxXatY==CursorY) { MaxX=WrapX; } /* Remove the trailing space from being counted if we're not supposed to */ if (((format->formatFlags & StringFormatFlagsMeasureTrailingSpaces)==0) && (WrapPoint>0)) { if (CleanString[WrapPoint-1]==' ') { if (MaxXatY==CursorY) { MaxX-=StringDetails[WrapPoint-1].Width; } StringDetails[WrapPoint-1].Width=0; CurrentLineStart->LineLen--; } } /* New line */ CurrentLineStart=&(StringDetails[WrapPoint]); CurrentLineStart->Flags|=STRING_DETAIL_LINESTART; CurrentLineStart->LineLen=0; /* Generate CursorX/Y for new line */ CursorY+=LineHeight; CursorX=CurrentLineStart->Width; i=WrapPoint; #ifdef DRAWSTRING_DEBUG printf("\n\n", WrapPoint, CursorX, CurrentLineStart->LineLen); #endif CurrentDetail=&(StringDetails[WrapPoint]); CurrentDetail->PosX=0; CurrentDetail->PosY=CursorY; WrapPoint=-1; } else { /* This line is too long and has no wrap points, check if we need to insert ellipsis. To keep at least a bit of performance, we cheat - we don't actually calculate the size of the elipsis chars but assume that they're always smaller than any other character. And we don't try to hard to fit as many chars as possible. */ int EndOfLine; #ifdef DRAWSTRING_DEBUG printf("No wrappoint (yet) set\n"); #endif /* Find end of line, index i is the first char no longer visible on the line */ EndOfLine=i; if ((format->formatFlags & StringFormatFlagsNoWrap)==0) { while (EndOfLinetrimming==StringTrimmingEllipsisWord) || (format->trimming==StringTrimmingEllipsisCharacter)) { if (CurrentLineStart->LineLen>3) { if (format->trimming==StringTrimmingEllipsisCharacter) { CleanString[i-1]='.'; CleanString[i-2]='.'; CleanString[i-3]='.'; } else { int found=0; j=i; while(j>(i-CurrentLineStart->LineLen)) { if (CleanString[j]==' ') { CleanString[j]='.'; CurrentLineStart->LineLen-=i-j-1; if ((j+1)LineLen++; } if ((j+2)LineLen++; } found=1; break; } j--; } if (!found) { CleanString[i-1]='.'; CleanString[i-2]='.'; CleanString[i-3]='.'; } } } } else if (format->trimming==StringTrimmingEllipsisPath) { int k; float LineWidth; /* Find end of line, index i is the first char no longer visible on the line */ EndOfLine=i; while (EndOfLineLineLen>3) { j=i-(CurrentLineStart->LineLen/2); CleanString[j-1]='.'; CleanString[j]='.'; CleanString[j+1]='.'; /* Have just enough to include our ellipsis */ LineWidth=0; for (k=i-CurrentLineStart->LineLen; k<(j+1); k++) { LineWidth+=StringDetails[k].Width; } CurrentLineStart->LineLen=i-j+3; /* 3=ellipsis */ /* Now figure out how many chars from the end of the string we have to copy */ j+=2; /* Points to the char behind the last ellipsis */ k=EndOfLine-1; while ((LineWidth+StringDetails[k].Width)LineLen+=EndOfLine-k-1; } } else { #ifdef DRAWSTRING_DEBUG /* Just cut off the text */ printf("End of line at index:%d\n", EndOfLine); #endif CurrentLineStart->LineLen=EndOfLine; } if ((format->formatFlags & StringFormatFlagsNoWrap)!=0) { // Avoid endless loops, always print at least one char if (CurrentLineStart->LineLen == 0) { CurrentLineStart->LineLen = 1; } break; } /* avoid endless loop when wrapping is allowed */ if (CurrentLineStart->LineLen == 0) { CurrentLineStart->LineLen = 1; } /* New line */ CurrentLineStart=&(StringDetails[EndOfLine]); CurrentLineStart->Flags|=STRING_DETAIL_LINESTART; CurrentLineStart->LineLen=0; /* Generate CursorX/Y for new line */ CursorY+=LineHeight; CursorX=CurrentLineStart->Width; i=EndOfLine; CurrentDetail=&(StringDetails[EndOfLine]); CurrentDetail->PosX=0; CurrentDetail->PosY=CursorY; } } /* Still visible? */ if ((FrameWidth && CursorX>FrameWidth) || (FrameHeight && ((CursorY>FrameHeight) || ((format->formatFlags & StringFormatFlagsLineLimit) && (CursorY+LineHeight)>FrameHeight)))) { CurrentDetail->Flags|=STRING_DETAIL_HIDDEN; #ifdef DRAWSTRING_DEBUG if (CurrentDetail->Flags & STRING_DETAIL_LINESTART) { printf(""); } else { printf(""); } #endif } else { if (MaxYLineLen++; } /* We ignored it above, for shorter of calculations, also, add a bit of padding */ #if 0 if ((fmt->formatFlags & StringFormatFlagsNoFitBlackBox) == 0) { MaxX+=2; } #endif MaxY+=LineHeight+FontExtent.descent; #ifdef DRAWSTRING_DEBUG printf("\n"); printf("Bounding box: %d x %d\n", MaxX, MaxY); printf("Line layout [Total len %d]:\n", StringLen); for (i=0; ialignment; if (format->formatFlags & StringFormatFlagsDirectionRightToLeft) { if (format->alignment==StringAlignmentNear) { AlignHorz=StringAlignmentFar; } else if (format->alignment==StringAlignmentFar) { AlignHorz=StringAlignmentNear; } } AlignVert = format->lineAlignment; #if 0 /* Alignment sanity checks, not sure about these, might not match MS */ if (MaxX>rc->Width) { AlignHorz=StringAlignmentNear; } if (MaxY>rc->Height) { AlignVert=StringAlignmentNear; } #endif /* At this point we know our bounding box, what characters are to be displayed and where every character goes */ if (boundingBox) { boundingBox->X = rc->X; boundingBox->Y = rc->Y; if (format->formatFlags & StringFormatFlagsDirectionVertical) { boundingBox->Width = MaxY; boundingBox->Height = MaxX; } else { boundingBox->Width = MaxX; boundingBox->Height = MaxY; } if ((rc->Width > 0) && (boundingBox->Width > rc->Width)) { boundingBox->Width = rc->Width; } if ((rc->Height > 0) && (boundingBox->Height > rc->Height)) { boundingBox->Height = rc->Height; } /* avoid conversion computations if possible */ if (!OPTIMIZE_CONVERSION (graphics)) { boundingBox->X = gdip_convgr_unitx (graphics, boundingBox->X); boundingBox->Y = gdip_convgr_unity (graphics, boundingBox->Y); boundingBox->Width = gdip_convgr_unitx (graphics, boundingBox->Width); boundingBox->Height = gdip_convgr_unity (graphics, boundingBox->Height); } } if (codepointsFitted) { /* how many characters from the string can be drawn in the boundingBox (#76664) */ double max_width = boundingBox ? (boundingBox->X + boundingBox->Width) : rc->X + min (MaxX, rc->Width); double max_height = boundingBox ? (boundingBox->Y + boundingBox->Height) : rc->Y + min (MaxY, rc->Height); int charactersFitted; for (charactersFitted = 0; charactersFitted < StringLen; charactersFitted++) { if ((StringDetails[charactersFitted].PosX + StringDetails[charactersFitted].Width) > max_width) break; if (StringDetails[charactersFitted].PosY + LineHeight > max_height) break; } *codepointsFitted = charactersFitted; } if (linesFilled) { /* how many *complete* lines fits in our calculated boundingBox */ double height = (boundingBox) ? boundingBox->Height : min (MaxY, rc->Height); *linesFilled = floor (height / LineHeight); } /* if asked, supply extra data to be reused when drawing the same string */ if (data) { data->align_horz = AlignHorz; data->align_vert = AlignVert; data->line_height = LineHeight; data->max_y = MaxY; data->descent = FontExtent.descent; } return Ok; } static GpStatus DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc_org, GDIPCONST GpStringFormat *fmt, GpBrush *brush, WCHAR *CleanString, GpStringDetailStruct* StringDetails, GpDrawTextData *data) { float CursorX = 0.0; /* Current X position of drawing cursor */ float CursorY = 0.0; /* Current Y position of drawing cursor */ int StringLen = length; BOOL SetClipping = FALSE; unsigned long i, j; int AlignHorz = data->align_horz; int AlignVert = data->align_vert; int LineHeight = data->line_height; int MaxY = data->max_y; cairo_font_extents_t FontExtent; RectF rect, *rc = ▭ cairo_font_extents (graphics->ct, &FontExtent); if (OPTIMIZE_CONVERSION (graphics)) { rc->X = rc_org->X; rc->Y = rc_org->Y; rc->Width = rc_org->Width; rc->Height = rc_org->Height; } else { rc->X = gdip_unitx_convgr (graphics, rc_org->X); rc->Y = gdip_unity_convgr (graphics, rc_org->Y); rc->Width = gdip_unitx_convgr (graphics, rc_org->Width); rc->Height = gdip_unity_convgr (graphics, rc_org->Height); } /* Set our clipping rectangle */ if ((rc->Width!=0) && (rc->Height!=0) && ((fmt->formatFlags & StringFormatFlagsNoClip)==0)) { #ifdef DRAWSTRING_DEBUG printf("Setting clipping rectangle (%f, %f %fx%f)\n", rc->X, rc->Y, rc->Width, rc->Height); #endif /* We do not call cairo_reset_clip because we want to take previous clipping into account */ gdip_cairo_rectangle (graphics, rc->X, rc->Y, rc->Width, rc->Height, TRUE); cairo_clip (graphics->ct); SetClipping = TRUE; } /* Setup cairo */ if (brush) { gdip_brush_setup (graphics, (GpBrush *)brush); } else { cairo_set_source_rgb (graphics->ct, 0., 0., 0.); } for (i=0; i StringLen - i) length = StringLen - i; String = (BYTE*) ucs2_to_utf8 ((const gunichar2 *)(CleanString+i), length); #ifdef DRAWSTRING_DEBUG printf("Displaying line >%s< (%d chars)\n", String, length); #endif if ((fmt->formatFlags & StringFormatFlagsDirectionVertical)==0) { CursorX = rc->X + StringDetails[i].PosX; switch (AlignHorz) { case StringAlignmentNear: break; case StringAlignmentCenter: /* PosX isn't calculated if the char is out of the bounding box (#79573/#79685) */ if ((current_line_length == 1) || (StringDetails [current_line_length-1].PosX > 0)) { CursorX += (rc->Width - StringDetails [current_line_length-1].PosX - StringDetails [current_line_length-1].Width) / 2; } /* which means that the line is too long so no centering is required */ break; case StringAlignmentFar: CursorX += rc->Width - StringDetails [current_line_length-1].PosX - StringDetails [current_line_length-1].Width; break; } switch (AlignVert) { case StringAlignmentNear: CursorY=rc->Y+StringDetails[i].PosY+LineHeight; break; case StringAlignmentCenter: CursorY=rc->Y+(rc->Height-MaxY)/2+StringDetails[i].PosY+LineHeight; break; case StringAlignmentFar: CursorY=rc->Y+rc->Height-MaxY+StringDetails[i].PosY+LineHeight; break; } gdip_cairo_move_to (graphics, CursorX, CursorY, FALSE, TRUE); cairo_show_text (graphics->ct, (const char *) String); } else { CursorY = rc->Y; switch (AlignHorz) { case StringAlignmentNear: break; case StringAlignmentCenter: /* PosX isn't calculated if the char is out of the bounding box (#79573/#79685) */ if ((current_line_length == 1) || (StringDetails [current_line_length-1].PosX > 0)) { CursorY += (rc->Height - StringDetails[current_line_length-1].PosX - StringDetails [current_line_length-1].Width) / 2; } /* which means that the line is too long so no centering is required */ break; case StringAlignmentFar: CursorY += rc->Height - StringDetails[current_line_length-1].PosX - StringDetails [current_line_length-1].Width; break; } switch (AlignVert) { case StringAlignmentNear: CursorX=rc->X + StringDetails[i].PosX+StringDetails[i].PosY; break; case StringAlignmentCenter: CursorX=rc->X + StringDetails[i].PosX+(rc->Width-MaxY)/2+StringDetails[i].PosY; break; case StringAlignmentFar: CursorX=rc->X + StringDetails[i].PosX+rc->Width-MaxY+StringDetails[i].PosY; break; } /* Rotate text for vertical drawing */ cairo_save (graphics->ct); gdip_cairo_move_to (graphics, CursorX, CursorY, FALSE, TRUE); cairo_rotate (graphics->ct, PI/2); cairo_show_text (graphics->ct, (const char *) String); cairo_restore (graphics->ct); } #ifdef DRAWSTRING_DEBUG printf("Drawing %d chars at %d x %d (width=%f pixels)\n", StringDetails[i].LineLen, (int)CursorX, (int)CursorY, StringDetails[i+StringDetails[i].LineLen-1].PosX); #endif GdipFree (String); if (font->style & (FontStyleUnderline | FontStyleStrikeout)) { double line_width = cairo_get_line_width (graphics->ct); /* Calculate the width of the line */ cairo_set_line_width (graphics->ct, 1.0); j=StringDetails[i+StringDetails[i].LineLen-1].PosX+StringDetails[i+StringDetails[i].LineLen-1].Width; if (font->style & FontStyleStrikeout) { if ((fmt->formatFlags & StringFormatFlagsDirectionVertical)==0) { gdip_cairo_move_to (graphics, (int)(CursorX), (int)(CursorY-FontExtent.descent), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX+j), (int)(CursorY-FontExtent.descent), FALSE, TRUE); } else { gdip_cairo_move_to (graphics, (int)(CursorX+FontExtent.descent), (int)(CursorY), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX+FontExtent.descent), (int)(CursorY+j), FALSE, TRUE); } } if (font->style & FontStyleUnderline) { if ((fmt->formatFlags & StringFormatFlagsDirectionVertical)==0) { gdip_cairo_move_to (graphics, (int)(CursorX), (int)(CursorY+FontExtent.descent-2), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX+j), (int)(CursorY+FontExtent.descent-2), FALSE, TRUE); } else { gdip_cairo_move_to (graphics, (int)(CursorX+FontExtent.descent-2), (int)(CursorY), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX+FontExtent.descent-2), (int)(CursorY+j), FALSE, TRUE); } } cairo_stroke (graphics->ct); cairo_set_line_width (graphics->ct, line_width); } i+=StringDetails[i].LineLen-1; } } /* Handle Hotkey prefix */ if (fmt->hotkeyPrefix==HotkeyPrefixShow && data->has_hotkeys) { GpStringDetailStruct *CurrentDetail = StringDetails; for (i=0; iFlags & STRING_DETAIL_LINESTART) { if ((fmt->formatFlags & StringFormatFlagsDirectionVertical)==0) { switch (AlignHorz) { case StringAlignmentNear: CursorX=rc->X; break; case StringAlignmentCenter: CursorX=rc->X+(rc->Width-StringDetails[i+StringDetails[i].LineLen-1].PosX-StringDetails[i+StringDetails[i].LineLen-1].Width)/2; break; case StringAlignmentFar: CursorX=rc->X+rc->Width-StringDetails[i+StringDetails[i].LineLen-1].PosX-StringDetails[i+StringDetails[i].LineLen-1].Width; break; } switch (AlignVert) { case StringAlignmentNear: CursorY=rc->Y+StringDetails[i].PosY+LineHeight; break; case StringAlignmentCenter: CursorY=rc->Y+(rc->Height-MaxY)/2+StringDetails[i].PosY+LineHeight; break; case StringAlignmentFar: CursorY=rc->Y+rc->Height-MaxY+StringDetails[i].PosY+LineHeight; break; } } else { switch (AlignHorz) { case StringAlignmentNear: CursorY=rc->Y; break; case StringAlignmentCenter: CursorY=rc->Y+(rc->Height-StringDetails[i+StringDetails[i].LineLen-1].PosX-StringDetails[i+StringDetails[i].LineLen-1].Width)/2; break; case StringAlignmentFar: CursorY=rc->Y+rc->Height-StringDetails[i+StringDetails[i].LineLen-1].PosX-StringDetails[i+StringDetails[i].LineLen-1].Width; break; } switch (AlignVert) { case StringAlignmentNear: CursorX=rc->X+StringDetails[i].PosY; break; case StringAlignmentCenter: CursorX=rc->X+(rc->Width-MaxY)/2+StringDetails[i].PosY; break; case StringAlignmentFar: CursorX=rc->X+rc->Width-MaxY+StringDetails[i].PosY; break; } } } if (CurrentDetail->Flags & STRING_DETAIL_HOTKEY) { if ((fmt->formatFlags & StringFormatFlagsDirectionVertical)==0) { CursorX+=CurrentDetail->PosX; cairo_set_line_width(graphics->ct, 1); gdip_cairo_move_to (graphics, (int)(CursorX), (int)(CursorY+FontExtent.descent/2), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX+CurrentDetail->Width), (int)(CursorY+FontExtent.descent/2), FALSE, TRUE); cairo_stroke (graphics->ct); CursorX-=CurrentDetail->PosX; } else { CursorY+=CurrentDetail->PosX; gdip_cairo_move_to (graphics, (int)(CursorX-FontExtent.descent/2), (int)(CursorY), FALSE, TRUE); gdip_cairo_line_to (graphics, (int)(CursorX-FontExtent.descent/2), (int)(CursorY+CurrentDetail->Width), FALSE, TRUE); CursorY-=CurrentDetail->PosX; } } CurrentDetail++; } } /* Restore the graphics clipping region */ if (SetClipping) cairo_SetGraphicsClip (graphics); return Ok; } static GpStatus AllocStringData (WCHAR **clean_string, GpStringDetailStruct **details, int length) { *details = gdip_calloc (length + 1, sizeof (GpStringDetailStruct)); if (!*details) return OutOfMemory; *clean_string = GdipAlloc (sizeof (WCHAR) * (length + 1)); if (!*clean_string) { GdipFree (*details); return OutOfMemory; } return Ok; } GpStatus cairo_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) { cairo_matrix_t SavedMatrix; GpStringFormat *fmt; BOOL hotkeys = FALSE; GpStringDetailStruct *StringDetails; WCHAR *CleanString; GpDrawTextData data; /* avoid recomputation of stuff done while measuring */ int StringLen = length; GpStatus status = AllocStringData (&CleanString, &StringDetails, length); if (status != Ok) return status; /* a NULL format is valid, it means get the generic default values (and free them later) */ if (!format) { GdipStringFormatGetGenericDefault ((GpStringFormat **)&fmt); } else { fmt = (GpStringFormat *)format; } /* is the following ok ? */ cairo_get_font_matrix (graphics->ct, &SavedMatrix); status = MeasureString (graphics, stringUnicode, &StringLen, font, rc, fmt, brush, NULL, NULL, NULL, CleanString, StringDetails, &data); if ((status == Ok) && (StringLen > 0)) { status = DrawString (graphics, stringUnicode, StringLen, font, rc, fmt, brush, CleanString, StringDetails, &data); } /* Restore matrix to original values */ cairo_set_font_matrix (graphics->ct, &SavedMatrix); /* Cleanup */ GdipFree (CleanString); GdipFree (StringDetails); /* we must delete the default stringformat (when one wasn't provided by the caller) */ if (format != fmt) GdipDeleteStringFormat (fmt); return status; } GpStatus cairo_MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, RectF *boundingBox, int *codepointsFitted, int *linesFilled) { cairo_matrix_t SavedMatrix; GpStringFormat *fmt; GpStringDetailStruct *StringDetails; WCHAR *CleanString; int StringLen = length; GpStatus status; status = AllocStringData (&CleanString, &StringDetails, length); if (status != Ok) return status; /* a NULL format is valid, it means get the generic default values (and free them later) */ if (!format) { GdipStringFormatGetGenericDefault ((GpStringFormat **)&fmt); } else { fmt = (GpStringFormat *)format; } /* is the following ok ? */ cairo_get_font_matrix (graphics->ct, &SavedMatrix); status = MeasureString (graphics, stringUnicode, &StringLen, font, rc, fmt, NULL, boundingBox, codepointsFitted, linesFilled, CleanString, StringDetails, NULL); /* Restore matrix to original values */ cairo_set_font_matrix (graphics->ct, &SavedMatrix); /* Cleanup */ GdipFree (CleanString); GdipFree (StringDetails); /* we must delete the default stringformat (when one wasn't provided by the caller) */ if (format != fmt) GdipDeleteStringFormat (fmt); return status; } GpStatus cairo_MeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layout, GDIPCONST GpStringFormat *format, int regionCount, GpRegion **regions) { int i, j, start, end; int lineHeight; CharacterRange range; GpStringDetailStruct* StringDetails; RectF boundingBox; RectF charRect; RectF rc_coords, *layoutRect = &rc_coords; float FontSize; BOOL optimize_convert; WCHAR *CleanString; GpDrawTextData data; /* avoid recomputation of stuff done while measuring */ int StringLen = length; GpStatus status = AllocStringData (&CleanString, &StringDetails, length); if (status != Ok) return status; /* avoid conversion if possible */ optimize_convert = OPTIMIZE_CONVERSION (graphics); if (optimize_convert) { layoutRect->X = layout->X; layoutRect->Y = layout->Y; layoutRect->Width = layout->Width; layoutRect->Height = layout->Height; } else { layoutRect->X = gdip_unitx_convgr (graphics, layout->X); layoutRect->Y = gdip_unity_convgr (graphics, layout->Y); layoutRect->Width = gdip_unitx_convgr (graphics, layout->Width); layoutRect->Height = gdip_unity_convgr (graphics, layout->Height); } if (layoutRect->Width <= 0.0) { if (layoutRect->Height < 0.0) { /* special case only if BOTH values are negative */ for (i = 0; i < format->charRangeCount; i++) GdipSetInfinite (regions [i]); return Ok; } else { layoutRect->Width = REGION_INFINITE_LENGTH; } } if (layoutRect->Height <= 0.0) { layoutRect->Height = REGION_INFINITE_LENGTH; } /* string measurements */ status = MeasureString (graphics, stringUnicode, &StringLen, font, layoutRect, format, NULL, NULL, NULL, NULL, CleanString, StringDetails, &data); if (status != Ok) goto cleanup; lineHeight = data.line_height + data.descent; /* Create a region for every char range */ for (i = 0; i < format->charRangeCount; i++) { range = format->charRanges [i]; GdipSetEmpty (regions [i]); if (range.Length > 0) start = range.First; else start = range.First + range.Length; end = start + range.Length; /* sanity check on charRange. negative lengths are allowed */ if (range.First < 0) { status = InvalidParameter; goto cleanup; } if ((start < 0) || (end > length)) { status = InvalidParameter; goto cleanup; } /* calculate the regions */ for (j = start; j < end; j++) { /* the prefix char (&) always count - even if we are not actually print it as a char */ if ((StringDetails[j].Flags & STRING_DETAIL_HOTKEY) && (format->hotkeyPrefix != HotkeyPrefixNone)) { end--; /* '&' count as invisible char */ continue; } /* workaround the fact that current implementation thinks LF is on the next line */ if ((j == end - 1) && (StringDetails[j].Flags & STRING_DETAIL_LF)) continue; if (format->formatFlags & StringFormatFlagsDirectionVertical) { charRect.X = StringDetails [j].PosY; charRect.Y = StringDetails [j].PosX; charRect.Width = lineHeight; charRect.Height = StringDetails [j].Width; } else { charRect.X = StringDetails [j].PosX; charRect.Y = StringDetails [j].PosY; charRect.Width = StringDetails [j].Width; charRect.Height = lineHeight; } if (optimize_convert) { charRect.X = gdip_convgr_unitx (graphics, charRect.X); charRect.Y = gdip_convgr_unity (graphics, charRect.Y); charRect.Width = gdip_convgr_unitx (graphics, charRect.Width); charRect.Height = gdip_convgr_unity (graphics, charRect.Height); } status = GdipCombineRegionRect (regions [i], &charRect, CombineModeUnion); if (status != Ok) break; } if (status != Ok) break; } cleanup: /* Cleanup */ GdipFree (CleanString); GdipFree (StringDetails); return status; } #endif libgdiplus-2.11/src/adjustablearrowcap.h0000664000175000017500000000470712225470167015351 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __ADJUSTABLEARROWCAP_H__ #define __ADJUSTABLEARROWCAP_H__ /* AdjustableArrowCap public API (only!) */ GpStatus GdipCreateAdjustableArrowCap (REAL height, REAL width, BOOL isFilled, GpAdjustableArrowCap **arrowCap); GpStatus GdipGetAdjustableArrowCapHeight (GpAdjustableArrowCap *arrowCap, REAL *height); GpStatus GdipSetAdjustableArrowCapHeight (GpAdjustableArrowCap *arrowCap, REAL height); GpStatus GdipGetAdjustableArrowCapWidth (GpAdjustableArrowCap *arrowCap, REAL *width); GpStatus GdipSetAdjustableArrowCapWidth (GpAdjustableArrowCap *arrowCap, REAL width); GpStatus GdipGetAdjustableArrowCapMiddleInset (GpAdjustableArrowCap *arrowCap, REAL *middleInset); GpStatus GdipSetAdjustableArrowCapMiddleInset (GpAdjustableArrowCap *arrowCap, REAL middleInset); GpStatus GdipSetAdjustableArrowCapFillState (GpAdjustableArrowCap *arrowCap, BOOL isFilled); GpStatus GdipGetAdjustableArrowCapFillState (GpAdjustableArrowCap *arrowCap, BOOL *isFilled); #endif libgdiplus-2.11/src/brush-private.h0000664000175000017500000000437112225470167014264 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __BRUSH_PRIVATE_H__ #define __BRUSH_PRIVATE_H__ #include "gdiplus-private.h" typedef struct { float *factors; float *positions; int count; } Blend; typedef struct _BrushClass { /* Brush virtual functions */ GpBrushType type; GpStatus (*setup) (GpGraphics *graphics, GpBrush *brush); GpStatus (*clone_brush) (GpBrush *brush, GpBrush **clonedBrush); GpStatus (*destroy) (GpBrush *brush); } BrushClass; typedef struct _Brush { BrushClass *vtable; BOOL changed; } Brush; void gdip_brush_init (GpBrush *brush, BrushClass* vtable) GDIP_INTERNAL; GpStatus gdip_brush_setup (GpGraphics *graphics, GpBrush *brush) GDIP_INTERNAL; #include "brush.h" #endif libgdiplus-2.11/src/pathgradientbrush.c0000664000175000017500000010006412225470167015176 00000000000000/* * pathgradientbrush.c * * Copyright (C) 2003-2004,2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Vladimir Vukicevic (vladimir@pobox.com) * Ravindra (rkumar@novell.com) * */ #include "pathgradientbrush-private.h" #include "graphics-private.h" #include "graphics-path-private.h" #include "matrix-private.h" static GpStatus gdip_pgrad_setup (GpGraphics *graphics, GpBrush *brush); static GpStatus gdip_pgrad_clone_brush (GpBrush *brush, GpBrush **clonedBrush); static GpStatus gdip_pgrad_destroy (GpBrush *brush); static BrushClass pathgradient_vtable = { BrushTypePathGradient, gdip_pgrad_setup, gdip_pgrad_clone_brush, gdip_pgrad_destroy }; static void gdip_pathgradient_init (GpPathGradient *pg) { gdip_brush_init (&pg->base, &pathgradient_vtable); pg->boundary = NULL; pg->boundaryColors = (ARGB *) GdipAlloc (sizeof (ARGB)); *(pg->boundaryColors) = MAKE_ARGB_ARGB(255,255,255,255); /* default boundary color is white */ pg->boundaryColorsCount = 1; /* one default boundary color */ pg->focusScales.X = 0.0f; pg->focusScales.Y = 0.0f; pg->wrapMode = WrapModeClamp; cairo_matrix_init_identity (&pg->transform); pg->presetColors = (InterpolationColors *) GdipAlloc (sizeof (InterpolationColors)); pg->presetColors->count = 1; pg->presetColors->colors = (ARGB *) GdipAlloc (sizeof (ARGB)); pg->presetColors->positions = (float *) GdipAlloc (sizeof (float)); pg->presetColors->colors [0] = MAKE_ARGB_ARGB(0,0,0,0); pg->presetColors->positions[0] = 0.0; pg->blend = (Blend *) GdipAlloc (sizeof (Blend)); pg->blend->count = 1; pg->blend->factors = (float *) GdipAlloc (sizeof (float)); pg->blend->positions = (float *) GdipAlloc (sizeof (float)); pg->blend->factors [0] = 1.0; pg->blend->positions[0] = 0.0; pg->rectangle.X = 0.0; pg->rectangle.Y = 0.0; pg->rectangle.Width = 0.0; pg->rectangle.Height = 0.0; pg->pattern = NULL; } static GpPathGradient* gdip_pathgradient_new (void) { GpPathGradient *result = (GpPathGradient *) GdipAlloc (sizeof (GpPathGradient)); if (result) gdip_pathgradient_init (result); return result; } GpStatus gdip_pgrad_clone_brush (GpBrush *brush, GpBrush **clonedBrush) { GpPathGradient *pgbrush; GpPathGradient *newbrush; if (!brush || !clonedBrush) return InvalidParameter; newbrush = (GpPathGradient *) GdipAlloc (sizeof (GpPathGradient)); if (!newbrush) return OutOfMemory; pgbrush = (GpPathGradient *) brush; newbrush->base = pgbrush->base; if (pgbrush->boundary) { GdipClonePath (pgbrush->boundary, &newbrush->boundary); } else { newbrush->boundary = NULL; } newbrush->boundaryColors = GdipAlloc (sizeof(ARGB) * pgbrush->boundaryColorsCount); if (!newbrush->boundaryColors) goto NO_BOUNDARY_COLORS; memcpy (newbrush->boundaryColors, pgbrush->boundaryColors, sizeof(ARGB) * pgbrush->boundaryColorsCount); newbrush->boundaryColorsCount = pgbrush->boundaryColorsCount; newbrush->focusScales = pgbrush->focusScales; newbrush->center = pgbrush->center; newbrush->centerColor = pgbrush->centerColor; newbrush->wrapMode = pgbrush->wrapMode; gdip_cairo_matrix_copy (&newbrush->transform, &pgbrush->transform); newbrush->rectangle.X = pgbrush->rectangle.X; newbrush->rectangle.Y = pgbrush->rectangle.Y; newbrush->rectangle.Width = pgbrush->rectangle.Width; newbrush->rectangle.Height = pgbrush->rectangle.Height; newbrush->presetColors = (InterpolationColors *) GdipAlloc (sizeof (InterpolationColors)); if (newbrush->presetColors == NULL) goto NO_PRESET; newbrush->presetColors->count = pgbrush->presetColors->count; if (pgbrush->presetColors->count > 0) { newbrush->presetColors->colors = (ARGB *) GdipAlloc (pgbrush->presetColors->count * sizeof (ARGB)); if (newbrush->presetColors->colors == NULL) goto NO_PRESET_COLORS; memcpy (newbrush->presetColors->colors, pgbrush->presetColors->colors, pgbrush->presetColors->count * sizeof (ARGB)); newbrush->presetColors->positions = (float *) GdipAlloc (pgbrush->presetColors->count * sizeof (float)); if (newbrush->presetColors->positions == NULL) goto NO_PRESET_POSITIONS; memcpy (newbrush->presetColors->positions, pgbrush->presetColors->positions, pgbrush->presetColors->count * sizeof (float)); } else { memcpy (newbrush->presetColors, pgbrush->presetColors, sizeof (InterpolationColors)); } newbrush->blend = (Blend *) GdipAlloc (sizeof (Blend)); if (newbrush->blend == NULL) goto NO_BLEND; newbrush->blend->count = pgbrush->blend->count; if (pgbrush->blend->count > 0) { newbrush->blend->factors = (float *) GdipAlloc (pgbrush->blend->count * sizeof (float)); if (newbrush->blend->factors == NULL) goto NO_BLEND_FACTORS; memcpy (newbrush->blend->factors, pgbrush->blend->factors, pgbrush->blend->count * sizeof (ARGB)); newbrush->blend->positions = (float *) GdipAlloc (pgbrush->blend->count * sizeof (float)); if (newbrush->blend->positions == NULL) goto NO_BLEND_POSITIONS; memcpy (newbrush->blend->positions, pgbrush->blend->positions, pgbrush->blend->count * sizeof (float)); } else { memcpy (newbrush->blend, pgbrush->blend, sizeof (Blend)); } goto SUCCESS; NO_BLEND_POSITIONS: GdipFree (newbrush->blend->factors); NO_BLEND_FACTORS: GdipFree (newbrush->blend); NO_BLEND: NO_PRESET_POSITIONS: GdipFree (newbrush->presetColors->colors); NO_PRESET_COLORS: GdipFree (newbrush->presetColors); NO_PRESET: GdipFree (newbrush->boundaryColors); NO_BOUNDARY_COLORS: GdipFree (newbrush); return OutOfMemory; SUCCESS: /* Let the clone to create its own pattern */ newbrush->base.changed = TRUE; newbrush->pattern = NULL; *clonedBrush = (GpBrush *) newbrush; return Ok; } GpStatus gdip_pgrad_destroy (GpBrush *brush) { /* a. the NULL check for brush is done by the caller, GdipDeleteBrush */ /* b. brush itself is freed by the caller */ GpPathGradient *pgbrush = (GpPathGradient *) brush; if (pgbrush->boundary) { GdipDeletePath (pgbrush->boundary); pgbrush->boundary = NULL; } if (pgbrush->boundaryColors) { GdipFree (pgbrush->boundaryColors); pgbrush->boundaryColors = NULL; } if (pgbrush->pattern) { cairo_pattern_destroy (pgbrush->pattern); pgbrush->pattern = NULL; } if (pgbrush->blend) { if (pgbrush->blend->count > 0) { GdipFree (pgbrush->blend->factors); GdipFree (pgbrush->blend->positions); } GdipFree (pgbrush->blend); pgbrush->blend = NULL; } if (pgbrush->presetColors) { if (pgbrush->presetColors->count > 0) { GdipFree (pgbrush->presetColors->colors); GdipFree (pgbrush->presetColors->positions); } GdipFree (pgbrush->presetColors); pgbrush->presetColors = NULL; } return Ok; } static void add_color_stops_from_blend (cairo_pattern_t *pattern, Blend *blend, ARGB color1, ARGB color2) { int index; double sr, sg, sb, sa; double er, eg, eb, ea; double offset, factor; sa = (color1 >> 24) & 0xFF; sr = (color1 >> 16) & 0xFF; sg = (color1 >> 8) & 0xFF; sb = color1 & 0xFF; ea = (color2 >> 24) & 0xFF; er = (color2 >> 16) & 0xFF; eg = (color2 >> 8) & 0xFF; eb = color2 & 0xFF; for (index = 0; index < blend->count; index++) { factor = blend->factors [index]; offset = blend->positions [index]; cairo_pattern_add_color_stop_rgba (pattern, offset, ((sr * (1 - factor)) + (er * factor)) / 255, ((sg * (1 - factor)) + (eg * factor)) / 255, ((sb * (1 - factor)) + (eb * factor)) / 255, ((sa * (1 - factor)) + (ea * factor)) / 255); } } static void add_color_stops_from_interpolation_colors (cairo_pattern_t *pattern, InterpolationColors *presetColors) { int index; double r, g, b, a; double offset; ARGB color; /* MS accecpts positions above 1.0 also. Cairo assumes the values above 1.0 as 1.0 * and values below 0 are assumed as 0. So we get different results if any of the * offset values is out of [0.0, 1.0]. */ for (index = 0; index < presetColors->count; index++) { color = presetColors->colors [index]; a = (color >> 24) & 0xFF; r = (color >> 16) & 0xFF; g = (color >> 8) & 0xFF; b = color & 0xFF; offset = presetColors->positions [index]; cairo_pattern_add_color_stop_rgba (pattern, offset, r / 255, g / 255, b / 255, a / 255); } } GpStatus gdip_pgrad_setup (GpGraphics *graphics, GpBrush *brush) { GpPathGradient *pgbrush; GpStatus status; if (!graphics || !brush) return InvalidParameter; pgbrush = (GpPathGradient *) brush; if (pgbrush->boundary == NULL) return Ok; /* do nothing */ /* We create the new pattern for brush, if the brush is changed * or if pattern has not been created yet. */ if (pgbrush->base.changed || !pgbrush->pattern) { cairo_pattern_t *pat; float r = MIN (pgbrush->rectangle.Width / 2, pgbrush->rectangle.Height / 2); int i; /* destroy the existing pattern */ if (pgbrush->pattern) { cairo_pattern_destroy (pgbrush->pattern); pgbrush->pattern = NULL; } /* FIXME: To fully implement this function we need cairo to support path gradients. * Right now we have radial gradient which can be used, in some cases, to get the right effect. */ pat = cairo_pattern_create_radial (pgbrush->center.X, pgbrush->center.Y, 0.0f, pgbrush->center.X, pgbrush->center.Y, r); status = gdip_get_pattern_status (pat); if (status != Ok) return status; cairo_pattern_set_matrix (pat, &pgbrush->transform); if ((pgbrush->blend->count > 1) && (pgbrush->boundaryColorsCount > 0)) { /* FIXME: blending done using the a radial shape (not the path shape) */ add_color_stops_from_blend (pat, pgbrush->blend, pgbrush->boundaryColors[0], pgbrush->centerColor); } else if (pgbrush->presetColors->count > 1) { /* FIXME: copied from lineargradiantbrush, most probably not right */ add_color_stops_from_interpolation_colors (pat, pgbrush->presetColors); } else { cairo_pattern_add_color_stop_rgba (pat, 0.0f, ARGB_RED_N (pgbrush->centerColor), ARGB_GREEN_N (pgbrush->centerColor), ARGB_BLUE_N (pgbrush->centerColor), ARGB_ALPHA_N (pgbrush->centerColor)); /* if a single other boundary color is present, then we can do the a real radial */ if (pgbrush->boundaryColorsCount == 1) { ARGB c = pgbrush->boundaryColors[0]; cairo_pattern_add_color_stop_rgba (pat, 1.0f, ARGB_RED_N (c), ARGB_GREEN_N (c), ARGB_BLUE_N (c), ARGB_ALPHA_N (c)); } else { /* FIXME: otherwise we (solid-)fill with the centerColor */ } } pgbrush->pattern = pat; } cairo_set_source (graphics->ct, pgbrush->pattern); return gdip_get_status (cairo_status (graphics->ct)); } static GpPointF gdip_get_center (GDIPCONST GpPointF *points, int count) { /* Center is the mean of all the points. */ int i; GpPointF center = {0.0, 0.0}; for (i = 0; i < count; i++) { center.X += points[i].X; center.Y += points[i].Y; } center.X /= count; center.Y /= count; return center; } static BOOL gdip_has_non_empty_color (GDIPCONST ARGB *colors, int count) { int i; ARGB *c = (ARGB*)colors; for (i = 0; i < count; i++, c++) { if (*c) return TRUE; } return FALSE; } static void gdip_rect_expand_by (GpRectF *rect, GpPointF *point) { /* This method is somewhat stupid, because GpRect is x,y width,height, * instead of x0,y0 x1,y1. */ float x0 = rect->X; float y0 = rect->Y; float x1 = x0 + rect->Width; float y1 = y0 + rect->Height; if (point->X < x0) x0 = point->X; else if (point->X > x1) x1 = point->X; if (point->Y < y0) y0 = point->Y; else if (point->Y > y1) y1 = point->Y; rect->X = x0; rect->Y = y0; rect->Width = (x1 - x0); rect->Height = (y1 - y0); } /* coverity[+alloc : arg-*3] */ GpStatus GdipCreatePathGradient (GDIPCONST GpPointF *points, int count, GpWrapMode wrapMode, GpPathGradient **polyGradient) { int i; GpPathGradient *gp; GpPath *gppath = NULL; GpStatus status; GpPointF point; if (!polyGradient) return InvalidParameter; /* this match MS GDI+ behaviour */ if (!points || (count < 2)) return OutOfMemory; status = GdipCreatePath (FillModeAlternate, /* ??? */ &gppath); if (status != Ok) { if (gppath) GdipDeletePath (gppath); return status; } GdipAddPathLine2 (gppath, points, count); gp = gdip_pathgradient_new (); gp->boundary = gppath; gp->wrapMode = wrapMode; gp->center = gdip_get_center (points, count); gp->centerColor = MAKE_ARGB_ARGB(255,0,0,0); /* black center color */ /* set the bounding rectangle */ point = g_array_index (gppath->points, GpPointF, 0); /* set the first point as the edge of the rectangle */ gp->rectangle.X = point.X; gp->rectangle.Y = point.Y; for (i = 1; i < gppath->count; i++) { point = g_array_index (gppath->points, GpPointF, i); gdip_rect_expand_by (&gp->rectangle, &point); } *polyGradient = gp; return Ok; } /* coverity[+alloc : arg-*3] */ GpStatus GdipCreatePathGradientI (GDIPCONST GpPoint *points, int count, GpWrapMode wrapMode, GpPathGradient **polyGradient) { int i; GpStatus result; GpPointF *newPoints; if (!polyGradient) return InvalidParameter; /* this match MS GDI+ behaviour */ if (!points || (count < 2)) return OutOfMemory; newPoints = GdipAlloc (sizeof (GpPointF) * count); if (!newPoints) return OutOfMemory; for (i = 0; i < count; i++) { newPoints[i].X = points[i].X; newPoints[i].Y = points[i].Y; } result = GdipCreatePathGradient (newPoints, count, wrapMode, polyGradient); GdipFree (newPoints); return result; } /* coverity[+alloc : arg-*1] */ GpStatus GdipCreatePathGradientFromPath (GDIPCONST GpPath *path, GpPathGradient **polyGradient) { int i, count; GpPathGradient *gp; GpPointF *points; /* this match MS GDI+ behaviour */ if (!path || (path->count < 2)) return OutOfMemory; if (!polyGradient) return InvalidParameter; gp = gdip_pathgradient_new (); GdipClonePath ((GpPath*) path, &(gp->boundary)); GdipGetPointCount ((GpPath*) path, &count); points = (GpPointF*) GdipAlloc (count * sizeof (GpPointF)); GdipGetPathPoints ((GpPath*) path, points, count); gp->center = gdip_get_center (points, count); gp->centerColor = MAKE_ARGB_ARGB(255,255,255,255); /* white center color */ /* set the bounding rectangle */ /* set the first point as the edge of the rectangle */ gp->rectangle.X = points [0].X; gp->rectangle.Y = points [0].Y; for (i = 1; i < count; i++) { gdip_rect_expand_by (&gp->rectangle, &points[i]); } *polyGradient = gp; GdipFree (points); return Ok; } GpStatus GdipGetPathGradientCenterColor (GpPathGradient *brush, ARGB *colors) { if (!brush || !colors) return InvalidParameter; *colors = brush->centerColor; return Ok; } GpStatus GdipSetPathGradientCenterColor (GpPathGradient *brush, ARGB colors) { if (!brush) return InvalidParameter; brush->centerColor = colors; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetPathGradientSurroundColorsWithCount (GpPathGradient *brush, ARGB *colors, int *count) { int i; if (!brush || !colors || !count) return InvalidParameter; for (i = 0; i < *count && i < brush->boundaryColorsCount; i++) { colors[i] = brush->boundaryColors[i]; } *count = i; return Ok; } GpStatus GdipSetPathGradientSurroundColorsWithCount (GpPathGradient *brush, GDIPCONST ARGB *colors, int *count) { if (!brush || !colors || !count) return InvalidParameter; if ((*count < 1) || (*count > brush->boundary->count)) return InvalidParameter; /* at least one of the colors must be non-zero (i.e. not empty) */ if (!gdip_has_non_empty_color (colors, *count)) return Ok; if (*count != brush->boundaryColorsCount) { GdipFree (brush->boundaryColors); brush->boundaryColors = (ARGB *) GdipAlloc (sizeof(ARGB) * (*count)); } memcpy (brush->boundaryColors, colors, sizeof (ARGB) * (*count)); brush->boundaryColorsCount = *count; return Ok; } GpStatus GdipGetPathGradientCenterPoint (GpPathGradient *brush, GpPointF *point) { if (!brush || !point) return InvalidParameter; point->X = brush->center.X; point->Y = brush->center.Y; return Ok; } GpStatus GdipSetPathGradientCenterPoint (GpPathGradient *brush, GDIPCONST GpPointF *point) { if (!brush || !point) return InvalidParameter; brush->center.X = point->X; brush->center.Y = point->Y; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetPathGradientRect (GpPathGradient *brush, GpRectF *rect) { if (!brush || !rect) return InvalidParameter; memcpy (rect, &brush->rectangle, sizeof (GpRectF)); return Ok; } GpStatus GdipGetPathGradientSurroundColorCount (GpPathGradient *brush, int *count) { if (!brush || !count) return InvalidParameter; *count = brush->boundaryColorsCount; return Ok; } GpStatus GdipGetPathGradientBlendCount (GpPathGradient *brush, int *count) { if (!brush || !count) return InvalidParameter; /* If count is less than 1, we are not in a proper state * to return blend property. By default, we have one blend * set. Therefore, count of 1 is acceptible. */ if (brush->blend->count < 1) return WrongState; *count = brush->blend->count; return Ok; } GpStatus GdipGetPathGradientBlend (GpPathGradient *brush, float *blend, float *positions, int count) { if (!brush || !blend || !positions || (brush->blend->count != count)) return InvalidParameter; /* If count is less than 1, we are not in a proper state * to return blend property. By default, we have one blend * set. Therefore, count of 1 is acceptible. */ if (brush->blend->count < 1) return WrongState; memcpy (blend, brush->blend->factors, count * sizeof (float)); memcpy (positions, brush->blend->positions, count * sizeof (float)); return Ok; } GpStatus GdipSetPathGradientBlend (GpPathGradient *brush, GDIPCONST float *blend, GDIPCONST float *positions, int count) { float *blendFactors; float *blendPositions; int index; if (!brush || !blend || !positions || (count < 2)) return InvalidParameter; if (brush->blend->count != count) { blendFactors = (float *) GdipAlloc (count * sizeof (float)); if (!blendFactors) return OutOfMemory; blendPositions = (float *) GdipAlloc (count * sizeof (float)); if (!blendPositions) { GdipFree (blendFactors); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blendFactors; brush->blend->positions = blendPositions; } for (index = 0; index < count; index++) { brush->blend->factors [index] = blend [index]; brush->blend->positions [index] = positions [index]; } brush->blend->count = count; /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 1) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 1; brush->presetColors->colors = (ARGB *) GdipAlloc (sizeof (ARGB)); brush->presetColors->positions = (float *) GdipAlloc (sizeof (float)); } brush->presetColors->colors [0] = MAKE_ARGB_ARGB(0,0,0,0); brush->presetColors->positions[0] = 0.0; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetPathGradientPresetBlendCount (GpPathGradient *brush, int *count) { if (!brush) return InvalidParameter; *count = brush->presetColors->count; return Ok; } GpStatus GdipGetPathGradientPresetBlend (GpPathGradient *brush, ARGB *blend, float *positions, int count) { if (!brush || !blend || !positions || (brush->presetColors->count != count) || (count < 2)) return InvalidParameter; memcpy (blend, brush->presetColors->colors, count * sizeof (ARGB)); memcpy (positions, brush->presetColors->positions, count * sizeof (float)); return Ok; } GpStatus GdipSetPathGradientPresetBlend (GpPathGradient *brush, GDIPCONST ARGB *blend, GDIPCONST float *positions, int count) { ARGB *blendColors; float *blendPositions; int index; if (!brush || !blend || !positions || (count < 2)) return InvalidParameter; if (brush->presetColors->count != count) { blendColors = (ARGB *) GdipAlloc (count * sizeof (ARGB)); if (!blendColors) return OutOfMemory; blendPositions = (float *) GdipAlloc (count * sizeof (float)); if (!blendPositions) { GdipFree (blendColors); return OutOfMemory; } /* free the existing values */ if (brush->presetColors->count != 0) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); } brush->presetColors->colors = blendColors; brush->presetColors->positions = blendPositions; } for (index = 0; index < count; index++) { brush->presetColors->colors [index] = blend [index]; brush->presetColors->positions [index] = positions [index]; } brush->presetColors->count = count; /* we clear the blend when setting preset colors */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); brush->blend->count = 0; } brush->base.changed = TRUE; return Ok; } GpStatus GdipSetPathGradientSigmaBlend (GpPathGradient *brush, float focus, float scale) { float *blends; float *positions; float pos = 0.0; int count = 511; /* total no of samples */ int index; float sigma; float mean; float fall_off_len = 2.0; /* curve fall off length in terms of SIGMA */ float delta; /* distance between two samples */ /* we get a curve not starting from 0 and not ending at 1. * so we subtract the starting value and divide by the curve * height to make it fit in the 0 to scale range */ float curve_bottom; float curve_top; float curve_height; if (!brush) return InvalidParameter; if (focus == 0 || focus == 1) { count = 256; } if (brush->blend->count != count) { blends = (float *) GdipAlloc (count * sizeof (float)); if (!blends) return OutOfMemory; positions = (float *) GdipAlloc (count * sizeof (float)); if (!positions) { GdipFree (blends); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blends; brush->blend->positions = positions; } /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 1) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 1; brush->presetColors->colors = (ARGB *) GdipAlloc (sizeof (ARGB)); brush->presetColors->positions = (float *) GdipAlloc (sizeof (float)); } brush->presetColors->colors [0] = MAKE_ARGB_ARGB(0,0,0,0); brush->presetColors->positions[0] = 0.0; /* Set the blend colors. We use integral of the Normal Distribution, * i.e. Cumulative Distribution Function (CFD). * * Normal distribution: * * y (x) = (1 / sqrt (2 * PI * sq (sigma))) * exp (-sq (x - mu)/ (2 * sq (sigma))) * * where, y = height of normal curve, * sigma = standard deviation * mu = mean * OR * y (x) = peak * exp ( - z * z / 2) * where, z = (x - mu) / sigma * * In this curve, peak would occur at mean i.e. for x = mu. This results in * a peak value of peak = (1 / sqrt (2 * PI * sq (sigma))). * * Cumulative distribution function: * Ref: http://mathworld.wolfram.com/NormalDistribution.html * * D (x) = (1 / 2) [1 + erf (z)] * where, z = (x - mu) / (sigma * sqrt (2)) * */ if (focus == 0) { /* right part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = 1.0 / fall_off_len; mean = 0.5; delta = 1.0 / 255.0; curve_bottom = 0.5 * (1.0 - gdip_erf (1.0, sigma, mean)); curve_top = 0.5 * (1.0 - gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; /* set the start */ brush->blend->positions [0] = focus; brush->blend->factors [0] = scale; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 - gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = 1.0; brush->blend->factors [count - 1] = 0.0; } else if (focus == 1) { /* left part of the curve with a complete rise in fall_off_len * SIGMAs */ sigma = 1.0 / fall_off_len; mean = 0.5; delta = 1.0 / 255.0; curve_bottom = 0.5 * (1.0 + gdip_erf (0.0, sigma, mean)); curve_top = 0.5 * (1.0 + gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; /* set the start */ brush->blend->positions [0] = 0.0; brush->blend->factors [0] = 0.0; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 + gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = focus; brush->blend->factors [count - 1] = scale; } else { /* left part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = focus / (2 * fall_off_len); mean = focus / 2.0; delta = focus / 255.0; /* set the start */ brush->blend->positions [0] = 0.0; brush->blend->factors [0] = 0.0; curve_bottom = 0.5 * (1.0 + gdip_erf (0.0, sigma, mean)); curve_top = 0.5 * (1.0 + gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 + gdip_erf (pos, sigma, mean)) - curve_bottom); } brush->blend->positions [index] = focus; brush->blend->factors [index] = scale; /* right part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = (1.0 - focus) / (2 * fall_off_len); mean = (1.0 + focus) / 2.0; delta = (1.0 - focus) / 255.0; curve_bottom = 0.5 * (1.0 - gdip_erf (1.0, sigma, mean)); curve_top = 0.5 * (1.0 - gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; index ++; pos = focus + delta; for (; index < 510; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 - gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = 1.0; brush->blend->factors [count - 1] = 0.0; } brush->blend->count = count; brush->base.changed = TRUE; return Ok; } GpStatus GdipSetPathGradientLinearBlend (GpPathGradient *brush, float focus, float scale) { float *blends; float *positions; int count = 3; if (!brush) return InvalidParameter; if (focus == 0 || focus == 1) { count = 2; } if (brush->blend->count != count) { blends = (float *) GdipAlloc (count * sizeof (float)); if (!blends) return OutOfMemory; positions = (float *) GdipAlloc (count * sizeof (float)); if (!positions) { GdipFree (blends); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blends; brush->blend->positions = positions; } /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 1) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 1; brush->presetColors->colors = (ARGB *) GdipAlloc (sizeof (ARGB)); brush->presetColors->positions = (float *) GdipAlloc (sizeof (float)); } brush->presetColors->colors [0] = MAKE_ARGB_ARGB(0,0,0,0); brush->presetColors->positions[0] = 0.0; /* set the blend colors */ if (focus == 0) { brush->blend->positions [0] = focus; brush->blend->factors [0] = scale; brush->blend->positions [1] = 1; brush->blend->factors [1] = 0; } else if (focus == 1) { brush->blend->positions [0] = 0; brush->blend->factors [0] = 0; brush->blend->positions [1] = focus; brush->blend->factors [1] = scale; } else { brush->blend->positions [0] = 0; brush->blend->factors [0] = 0; brush->blend->positions [1] = focus; brush->blend->factors [1] = scale; brush->blend->positions [2] = 1; brush->blend->factors [2] = 0; } brush->blend->count = count; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetPathGradientWrapMode (GpPathGradient *brush, GpWrapMode *wrapMode) { if (!brush || !wrapMode) return InvalidParameter; *wrapMode = brush->wrapMode; return Ok; } GpStatus GdipSetPathGradientWrapMode (GpPathGradient *brush, GpWrapMode wrapMode) { if (!brush) return InvalidParameter; brush->wrapMode = wrapMode; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetPathGradientTransform (GpPathGradient *brush, GpMatrix *matrix) { if (!brush || !matrix) return InvalidParameter; /* If presetcolors are set, we are not in a proper state * to return transform property. */ if (brush->presetColors->count >= 2) return WrongState; gdip_cairo_matrix_copy (matrix, &brush->transform); return Ok; } GpStatus GdipSetPathGradientTransform (GpPathGradient *brush, GpMatrix *matrix) { GpStatus status; BOOL invertible; if (!brush || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; gdip_cairo_matrix_copy (&brush->transform, matrix); brush->base.changed = TRUE; return Ok; } GpStatus GdipResetPathGradientTransform (GpPathGradient *brush) { if (!brush) return InvalidParameter; cairo_matrix_init_identity (&brush->transform); brush->base.changed = TRUE; return Ok; } GpStatus GdipMultiplyPathGradientTransform (GpPathGradient *brush, GDIPCONST GpMatrix *matrix, GpMatrixOrder order) { GpStatus status; BOOL invertible; cairo_matrix_t mat; if (!brush || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; if (order == MatrixOrderPrepend) cairo_matrix_multiply (&mat, matrix, &brush->transform); else if (order == MatrixOrderAppend) cairo_matrix_multiply (&mat, &brush->transform, matrix); gdip_cairo_matrix_copy (&brush->transform, &mat); brush->base.changed = TRUE; return Ok; } GpStatus GdipTranslatePathGradientTransform (GpPathGradient *brush, float dx, float dy, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipTranslateMatrix (&brush->transform, dx, dy, order)) == Ok) brush->base.changed = TRUE; return status; } GpStatus GdipScalePathGradientTransform (GpPathGradient *brush, float sx, float sy, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipScaleMatrix (&brush->transform, sx, sy, order)) == Ok) brush->base.changed = TRUE; return status; } GpStatus GdipRotatePathGradientTransform (GpPathGradient *brush, float angle, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipRotateMatrix (&brush->transform, angle, order)) == Ok) brush->base.changed = TRUE; return status; } GpStatus GdipGetPathGradientFocusScales (GpPathGradient *brush, float *xScale, float *yScale) { if (!brush || !xScale || !yScale) return InvalidParameter; *xScale = brush->focusScales.X; *yScale = brush->focusScales.Y; return Ok; } GpStatus GdipSetPathGradientFocusScales (GpPathGradient *brush, float xScale, float yScale) { if (!brush) return InvalidParameter; brush->focusScales.X = xScale; brush->focusScales.Y = yScale; brush->base.changed = TRUE; return Ok; } libgdiplus-2.11/src/imageattributes.h0000664000175000017500000000656612225470167014672 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __IMAGEATTRIBUTES_H__ #define __IMAGEATTRIBUTES_H__ /* ImageAttributes public API (only!) */ GpStatus GdipCreateImageAttributes (GpImageAttributes **imageattr); GpStatus GdipCloneImageAttributes (GDIPCONST GpImageAttributes *imageattr, GpImageAttributes **cloneImageattr); GpStatus GdipDisposeImageAttributes (GpImageAttributes *imageattr); GpStatus GdipGetImageAttributesAdjustedPalette(GpImageAttributes *imageattr, ColorPalette *colorPalette, ColorAdjustType colorAdjustType); GpStatus GdipSetImageAttributesColorKeys (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, ARGB colorLow, ARGB colorHigh); GpStatus GdipSetImageAttributesColorMatrix (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, GDIPCONST ColorMatrix* colorMatrix, GDIPCONST ColorMatrix* grayMatrix, ColorMatrixFlags flags); GpStatus GdipSetImageAttributesGamma (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, REAL gamma); GpStatus GdipSetImageAttributesNoOp (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag); GpStatus GdipSetImageAttributesOutputChannel (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, ColorChannelFlags channelFlags); GpStatus GdipSetImageAttributesOutputChannelColorProfile (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, GDIPCONST WCHAR *colorProfileFilename); GpStatus GdipSetImageAttributesRemapTable (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, UINT mapSize, GDIPCONST ColorMap *map); GpStatus GdipSetImageAttributesThreshold (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, REAL threshold); GpStatus GdipSetImageAttributesWrapMode (GpImageAttributes *imageattr, WrapMode wrap, ARGB argb, BOOL clamp); /* missing API GdipResetImageAttributes GdipSetImageAttributesICMMode GdipSetImageAttributesToIdentity */ #endif libgdiplus-2.11/src/metafile.h0000664000175000017500000001404112225470167013252 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __METAFILE_H__ #define __METAFILE_H__ typedef enum { MetafileTypeInvalid, MetafileTypeWmf, MetafileTypeWmfPlaceable, MetafileTypeEmf, MetafileTypeEmfPlusOnly, MetafileTypeEmfPlusDual } MetafileType; typedef enum { EmfTypeEmfOnly = MetafileTypeEmf, EmfTypeEmfPlusOnly = MetafileTypeEmfPlusOnly, EmfTypeEmfPlusDual = MetafileTypeEmfPlusDual } EmfType; typedef enum { MetafileFrameUnitPixel = UnitPixel, MetafileFrameUnitPoint = UnitPoint, MetafileFrameUnitInch = UnitInch, MetafileFrameUnitDocument = UnitDocument, MetafileFrameUnitMillimeter = UnitMillimeter, MetafileFrameUnitGdi } MetafileFrameUnit; typedef enum { EmfRecordTypeGdiComment = 70, EmfPlusRecordTypeHeader = 16385, EmfPlusRecordTypeEndOfFile = 16386, EmfPlusRecordTypeClear = 16393, EmfPlusRecordTypeFillRects = 16394, } EmfPlusRecordType; typedef BOOL (*EnumerateMetafileProc) (EmfPlusRecordType, UINT, UINT, const BYTE*, void*); /* function prototypes */ GpStatus GdipCreateMetafileFromWmf (HMETAFILE hWmf, BOOL deleteWmf, GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, GpMetafile **metafile); GpStatus GdipCreateMetafileFromEmf (HENHMETAFILE hEmf, BOOL deleteEmf, GpMetafile **metafile); GpStatus GdipCreateMetafileFromFile (GDIPCONST WCHAR *file, GpMetafile **metafile); GpStatus GdipCreateMetafileFromWmfFile (GDIPCONST WCHAR *file, GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, GpMetafile **metafile); GpStatus GdipCreateMetafileFromStream (void *stream, GpMetafile **metafile); GpStatus GdipCreateMetafileFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpMetafile **metafile); GpStatus GdipGetMetafileHeaderFromWmf (HMETAFILE hWmf, GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, MetafileHeader *header); GpStatus GdipGetMetafileHeaderFromEmf (HENHMETAFILE hEmf, MetafileHeader *header); GpStatus GdipGetMetafileHeaderFromFile (GDIPCONST WCHAR *filename, MetafileHeader *header); GpStatus GdipGetMetafileHeaderFromStream (void *stream, MetafileHeader *header); GpStatus GdipGetMetafileHeaderFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, MetafileHeader *header); GpStatus GdipGetMetafileHeaderFromMetafile (GpMetafile *metafile, MetafileHeader *header); GpStatus GdipGetHemfFromMetafile (GpMetafile *metafile, HENHMETAFILE *hEmf); GpStatus GdipGetMetafileDownLevelRasterizationLimit (GpMetafile *metafile, UINT *metafileRasterizationLimitDpi); GpStatus GdipSetMetafileDownLevelRasterizationLimit (GpMetafile *metafile, UINT metafileRasterizationLimitDpi); GpStatus GdipPlayMetafileRecord (GDIPCONST GpMetafile *metafile, EmfPlusRecordType recordType, UINT flags, UINT dataSize, GDIPCONST BYTE* data); GpStatus GdipRecordMetafile (HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileI (HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileFileName (GDIPCONST WCHAR *fileName, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileFileNameI (GDIPCONST WCHAR *fileName, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileStream (void /* IStream */ *stream, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileStreamI (void /* IStream */ *stream, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); /* extra public (exported) functions in libgdiplus to replace the IStream (COM-based) ones available on Windows */ GpStatus GdipRecordMetafileFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); GpStatus GdipRecordMetafileFromDelegateI_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile); #endif libgdiplus-2.11/src/stringformat-private.h0000664000175000017500000000404312225470167015654 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __STRINGFORMAT_PRIVATE_H__ #define __STRINGFORMAT_PRIVATE_H__ #include "gdiplus-private.h" struct _StringFormat { StringAlignment alignment; StringAlignment lineAlignment; HotkeyPrefix hotkeyPrefix; StringFormatFlags formatFlags; StringTrimming trimming; StringDigitSubstitute substitute; CharacterRange *charRanges; float firstTabOffset; float *tabStops; int numtabStops; int charRangeCount; }; #include "stringformat.h" #endif libgdiplus-2.11/src/gdipstructs.h0000664000175000017500000000502412225470167014040 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __GDIPSTRUCTS_H__ #define __GDIPSTRUCTS_H__ #include "win32structs.h" #define GDIPCONST const /* public structures defined by GDI+ (i.e. you can safely access their members) */ typedef struct { int First; int Length; } CharacterRange; typedef struct { ARGB Argb; } Color; typedef struct { Color oldColor; Color newColor; } ColorMap; typedef struct { float m[5][5]; } ColorMatrix; typedef struct { UINT Flags; UINT Count; ARGB Entries[1]; } ColorPalette; typedef struct { int X, Y; } Point, GpPoint; typedef struct { float X, Y; } PointF, GpPointF; typedef struct { int Count; PointF *Points; BYTE *Types; } PathData, GpPathData; typedef struct { PROPID id; ULONG length; WORD type; VOID* value; } PropertyItem; typedef struct { int X, Y, Width, Height; } Rect, GpRect; typedef struct { float X, Y, Width, Height; } RectF, GpRectF; /* Callbacks */ typedef BOOL (*ImageAbort) (void *); typedef ImageAbort DrawImageAbort; typedef ImageAbort GetThumbnailImageAbort; #endif libgdiplus-2.11/src/GdiPlusFlat.h0000664000175000017500000000620512225470167013645 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ /* * This is *the* public header to be used by C/C++ consumers of GDI+ * and has the same name as MS provided header for the "flat API" */ #ifndef _FLATAPI_H #define _FLATAPI_H #ifdef __cplusplus extern "C" { #endif /* * If you ever need a workaround specific to libgdiplus then use the following define */ #define MONO_LIBGDIPLUS 1 /* * public view of internal stuff (curious about them, check in *-private.h files ;-) */ typedef void GpAdjustableArrowCap; typedef void GpBitmap; typedef void GpBrush; typedef void GpCustomLineCap; typedef void GpFont; typedef void GpFontCollection; typedef void GpFontFamily; typedef void GpGraphics; typedef void GpHatch; typedef void GpImage; typedef void GpImageAttributes; typedef void GpLineGradient; typedef void GpMatrix; typedef void GpPath; typedef void GpPathIterator; typedef void GpPathGradient; typedef void GpPen; typedef void GpRegion; typedef void GpSolidFill; typedef void GpState; typedef void GpStringFormat; typedef void GpTexture; /* * Do not include those headers directly. * Their content is public but, unlike this file, the header filenames do NOT match MS filenames! */ #include "gdipenums.h" #include "gdipstructs.h" /* FIXME - libgdiplus version is larger than this (and some members are misnamed) */ typedef struct { UINT Width; UINT Height; INT Stride; /* C++ compilers should need '::' (and GCC does) */ #ifdef __cplusplus ::PixelFormat PixelFormat; #else PixelFormat PixelFormat; #endif VOID *Scan0; UINT *Reserved; } BitmapData; #include "general.h" #include "adjustablearrowcap.h" #include "bitmap.h" #include "brush.h" #include "customlinecap.h" #include "font.h" #include "fontcollection.h" #include "fontfamily.h" #include "graphics.h" #include "graphics-path.h" #include "hatchbrush.h" #include "image.h" #include "imageattributes.h" #include "pen.h" #include "matrix.h" #include "region.h" #include "solidbrush.h" #include "stringformat.h" #include "text.h" #ifdef __cplusplus } #endif #endif libgdiplus-2.11/src/image-private.h0000664000175000017500000000423112225470167014216 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __IMAGE_PRIVATE_H__ #define __IMAGE_PRIVATE_H__ #include "gdiplus-private.h" #include "codecs-private.h" typedef enum { BMP, TIF, GIF, PNG, JPEG, EXIF, WMF, EMF, ICON, MEMBMP, INVALID } ImageFormat; int gdip_get_pixel_format_depth (PixelFormat pixfmt) GDIP_INTERNAL; int gdip_get_pixel_format_components (PixelFormat pixfmt) GDIP_INTERNAL; int gdip_get_pixel_format_bpp (PixelFormat pixfmt) GDIP_INTERNAL; BOOL gdip_is_an_indexed_pixelformat (PixelFormat pixfmt) GDIP_INTERNAL; void gdip_image_init (GpImage *image) GDIP_INTERNAL; #include "image.h" #endif libgdiplus-2.11/src/adjustablearrowcap-private.h0000664000175000017500000000364312225470167017017 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __ADJUSTABLEARROWCAP_PRIVATE_H__ #define __ADJUSTABLEARROWCAP_PRIVATE_H__ #include "gdiplus-private.h" #include "customlinecap-private.h" typedef struct _AdjustableArrowCap { CustomLineCap base; float width; float height; float middle_inset; BOOL fill_state; } AdjustableArrowCap; #include "adjustablearrowcap.h" #endif libgdiplus-2.11/src/customlinecap-private.h0000664000175000017500000000536012225470167016006 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __CUSTOMLINECAP_PRIVATE_H__ #define __CUSTOMLINECAP_PRIVATE_H__ #include "gdiplus-private.h" typedef struct _CapClass { CustomLineCapType type; GpStatus (*setup) (GpGraphics *graphics, GpCustomLineCap *cap); GpStatus (*clone_cap) (GpCustomLineCap *cap, GpCustomLineCap **clonedCap); GpStatus (*destroy) (GpCustomLineCap *cap); GpStatus (*draw) (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *cap, float x, float y, float otherend_x, float otherend_y); } CapClass; typedef struct _CustomLineCap { CapClass *vtable; GpPath *fill_path; GpPath *stroke_path; GpLineCap base_cap; GpLineCap start_cap; GpLineCap end_cap; GpLineJoin stroke_join; float base_inset; float width_scale; } CustomLineCap; void gdip_custom_linecap_init (GpCustomLineCap *cap, CapClass *vt) GDIP_INTERNAL; GpStatus gdip_linecap_setup (GpGraphics *graphics, GpCustomLineCap *customCap) GDIP_INTERNAL; GpStatus gdip_linecap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *customCap, float x, float y, float otherend_x, float otherend_y) GDIP_INTERNAL; double gdip_custom_linecap_angle (float x, float y, float otherend_x, float otherend_y); #include "customlinecap.h" #endif libgdiplus-2.11/src/codecs.h0000664000175000017500000000476212225470167012735 00000000000000/* * codecs.h * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __CODECS_H__ #define __CODECS_H__ #include "win32structs.h" #include "gdipenums.h" typedef struct { GUID Guid; ULONG NumberOfValues; ULONG Type; VOID* Value; } EncoderParameter; typedef struct { UINT Count; EncoderParameter Parameter[1]; } EncoderParameters; typedef struct { CLSID Clsid; GUID FormatID; const WCHAR* CodecName; const WCHAR* DllName; const WCHAR* FormatDescription; const WCHAR* FilenameExtension; const WCHAR* MimeType; DWORD Flags; DWORD Version; DWORD SigCount; DWORD SigSize; const BYTE* SigPattern; const BYTE* SigMask; } ImageCodecInfo; GpStatus GdipGetImageDecodersSize (UINT *numDecoders, UINT *size); GpStatus GdipGetImageDecoders (UINT numDecoders, UINT size, ImageCodecInfo *decoders); GpStatus GdipGetImageEncodersSize (UINT *numEncoders, UINT *size); GpStatus GdipGetImageEncoders (UINT numEncoders, UINT size, ImageCodecInfo *encoders); #endif libgdiplus-2.11/src/pen.c0000664000175000017500000006152612225470167012253 00000000000000/* * pen.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2006 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine(pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Ravindra (rkumar@novell.com) * */ #include "pen-private.h" #include "solidbrush-private.h" #include "matrix-private.h" #include "graphics-private.h" #include "customlinecap-private.h" static void gdip_pen_init (GpPen *pen) { pen->color = 0; pen->brush = 0; pen->own_brush = FALSE; pen->width = 1; pen->miter_limit = 10; pen->line_join = LineJoinMiter; pen->dash_style = DashStyleSolid; pen->line_cap = LineCapFlat; pen->end_cap = LineCapFlat; /* ignored, Cairo only support a single start/end line cap */ pen->dash_cap = DashCapFlat; /* ignored */ pen->mode = PenAlignmentCenter; pen->dash_offset = 0; pen->dash_count = 0; pen->own_dash_array = FALSE; pen->dash_array = NULL; pen->compound_count = 0; pen->compound_array = NULL; pen->unit = UnitWorld; pen->changed = TRUE; pen->custom_start_cap = NULL; pen->custom_end_cap = NULL; cairo_matrix_init_identity (&pen->matrix); } static GpPen* gdip_pen_new (void) { GpPen *result = (GpPen *) GdipAlloc (sizeof (GpPen)); if (result) gdip_pen_init (result); return result; } static cairo_line_join_t convert_line_join (GpLineJoin join) { switch (join) { case LineJoinMiter: return CAIRO_LINE_JOIN_MITER; case LineJoinBevel: return CAIRO_LINE_JOIN_BEVEL; case LineJoinRound: return CAIRO_LINE_JOIN_ROUND; case LineJoinMiterClipped: default: return CAIRO_LINE_JOIN_MITER; } } static cairo_line_cap_t convert_line_cap (GpPen *pen) { switch (pen->line_cap) { /* HACK - this keeps SWF (mostly) happy with results very similar to GDI+ * (under those specific cases) and also keeps the pen's functionalities * on par with GDI+ */ case LineCapFlat: if (pen->dash_array || (pen->width > 1.0)) return CAIRO_LINE_CAP_BUTT; else return CAIRO_LINE_CAP_SQUARE; case LineCapSquare: return CAIRO_LINE_CAP_SQUARE; case LineCapRound: return CAIRO_LINE_CAP_ROUND; case LineCapTriangle: case LineCapNoAnchor: case LineCapSquareAnchor: case LineCapRoundAnchor: case LineCapDiamondAnchor: case LineCapArrowAnchor: case LineCapCustom: default: return CAIRO_LINE_CAP_BUTT; } } static double * convert_dash_array (float *f, double width, int count) { double *retval = GdipAlloc (sizeof (double) * count); int i; for (i = 0; i < count; i++) { retval[i] = (double) f[i] * width; } return retval; } GpStatus gdip_pen_setup (GpGraphics *graphics, GpPen *pen) { GpStatus status; cairo_matrix_t product; double widthx; if (!graphics || !pen) return InvalidParameter; status = gdip_brush_setup (graphics, pen->brush); if (status != Ok) return status; cairo_matrix_init_identity (&product); /* Here we use product of pen->matrix and graphics->copy_of_ctm. * This gives us absolute results with respect to graphics. We * do following irrespective of the pen->changed state since graphics * has its own matrix and we need to multiply that with pen->matrix * every time we perform stroke operations. Graphics matrix gets * reset to its own state after stroking. */ cairo_matrix_multiply (&product, &pen->matrix, graphics->copy_of_ctm); /* Pen scaling by 0 are supported by MS GDI+ but would error in Cairo, see bug #338233 */ if (gdip_near_zero (product.xx) || gdip_near_zero (product.yy)) { /* *both* X and Y are affected if either is 0 */ product.xx = product.yy = 0.0001f; } cairo_set_matrix (graphics->ct, &product); /* Don't need to setup, if pen is the same as the cached pen and * it is not changed. Just comparing pointers may not be sufficient * to say that the pens are same. It is possible to have different * pen on the same memory, but probability is very low. We would * need a function to check the equality of the pens in that case. */ if (pen == graphics->last_pen && !pen->changed) return Ok; if (pen->width < 1.0) { /* we draw a pixel wide line if width is < 1.0 */ double widthy = 1.0; widthx = 1.0; cairo_device_to_user_distance (graphics->ct, &widthx, &widthy); } else { widthx = (double) pen->width; } cairo_set_line_width (graphics->ct, widthx); cairo_set_miter_limit (graphics->ct, (double) pen->miter_limit); cairo_set_line_join (graphics->ct, convert_line_join (pen->line_join)); cairo_set_line_cap (graphics->ct, convert_line_cap (pen)); if (pen->dash_count > 0) { double *dash_array; /* note: pen->width may be different from what was used to call cairo_set_line_width, e.g. 0.0 (#78742) */ dash_array = convert_dash_array (pen->dash_array, widthx, pen->dash_count); cairo_set_dash (graphics->ct, dash_array, pen->dash_count, pen->dash_offset); GdipFree (dash_array); } else /* Clear the dashes, if set in previous calls */ cairo_set_dash (graphics->ct, NULL, 0, 0); /* We are done with using all the changes in the pen. */ pen->changed = FALSE; graphics->last_pen = pen; return gdip_get_status (cairo_status (graphics->ct)); } GpStatus gdip_pen_draw_custom_start_cap (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) { if (!graphics || !pen) return InvalidParameter; if (pen->custom_start_cap) { /* Draw the end cap */ gdip_linecap_draw (graphics, pen, pen->custom_start_cap, x1, y1, x2, y2); } return gdip_get_status (cairo_status (graphics->ct)); } GpStatus gdip_pen_draw_custom_end_cap (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) { if (!graphics || !pen) return InvalidParameter; if (pen->custom_end_cap) { /* Draw the end cap */ gdip_linecap_draw (graphics, pen, pen->custom_end_cap, x1, y1, x2, y2); } return gdip_get_status (cairo_status (graphics->ct)); } // coverity[+alloc : arg-*3] GpStatus GdipCreatePen1 (ARGB argb, float width, GpUnit unit, GpPen **pen) { GpStatus s; GpSolidFill *solidBrush = NULL; GpPen *result; if (!pen) return InvalidParameter; *pen = result = gdip_pen_new (); if (!result) return OutOfMemory; result->color = argb; /* FIXME: do unit conversion when setting width */ result->width = width; s = GdipCreateSolidFill (argb, &solidBrush); if (s != Ok) { if (solidBrush) GdipDeleteBrush ((GpBrush*) solidBrush); GdipFree (result); *pen = NULL; return s; } result->brush = (GpBrush*) solidBrush; result->own_brush = TRUE; return Ok; } // coverity[+alloc : arg-*3] GpStatus GdipCreatePen2 (GpBrush *brush, float width, GpUnit unit, GpPen **pen) { ARGB color; GpStatus s; GpBrushType type; GpPen *result; if (!brush || !pen) return InvalidParameter; *pen = result = gdip_pen_new (); if (!result) return OutOfMemory; /* FIXME: do unit conversion when setting width */ result->width = width; /* the user supplied brush can be disposed, we must clone it to ensure * it's valid when we need to set the pen */ s = GdipCloneBrush (brush, &result->brush); if (s != Ok) { GdipFree (result); *pen = NULL; return s; } result->own_brush = TRUE; s = GdipGetBrushType (brush, &type); if (s != Ok) { GdipFree (result); *pen = NULL; return s; } switch (type) { case BrushTypeSolidColor: s = GdipGetSolidFillColor ((GpSolidFill*) brush, &color); if (s != Ok) { GdipFree (result); *pen = NULL; return s; } result->color = color; *pen = result; return Ok; case BrushTypeHatchFill: case BrushTypeTextureFill: case BrushTypePathGradient: case BrushTypeLinearGradient: *pen = result; return Ok; default: GdipFree (result); *pen = NULL; return GenericError; } } static float * clone_dash_array (float *clone, float *array, int size) { int i; for (i = 0; i < size; i++) clone [i] = array [i]; return clone; } // coverity[+alloc : arg-*1] GpStatus GdipClonePen (GpPen *pen, GpPen **clonepen) { GpPen *result; float *dashes; /* copy off pen->dash_array */ float *compound_array = NULL; /* copy off pen->compound_array */ GpCustomLineCap *custom_start_cap = NULL; GpCustomLineCap *custom_end_cap = NULL; if (!pen || !clonepen) return InvalidParameter; /* we make a copy of dash array only if it is owned by pen, i.e. it is not * our global array. */ if (pen->dash_count > 0 && pen->own_dash_array) { dashes = (float *) GdipAlloc (pen->dash_count * sizeof (float)); if (!dashes) return OutOfMemory; clone_dash_array (dashes, pen->dash_array, pen->dash_count); } else dashes = pen->dash_array; if (pen->compound_count > 0) { compound_array = (float *) GdipAlloc (pen->compound_count * sizeof (float)); if (compound_array == NULL) { if (pen->dash_count > 0) GdipFree (dashes); return OutOfMemory; } clone_dash_array (compound_array, pen->compound_array, pen->compound_count); } if (pen->custom_start_cap != NULL) { GpStatus status = GdipCloneCustomLineCap (pen->custom_start_cap, &custom_start_cap); if (status != Ok) { if (custom_start_cap) GdipDeleteCustomLineCap (custom_start_cap); if (compound_array != NULL) GdipFree (compound_array); if (pen->dash_count > 0) GdipFree (dashes); return OutOfMemory; } } if (pen->custom_end_cap != NULL) { GpStatus status = GdipCloneCustomLineCap (pen->custom_end_cap, &custom_end_cap); if (status != Ok) { if (custom_end_cap) GdipDeleteCustomLineCap (custom_end_cap); if (custom_start_cap) GdipDeleteCustomLineCap (custom_start_cap); if (compound_array != NULL) GdipFree (compound_array); if (pen->dash_count > 0) GdipFree (dashes); return OutOfMemory; } } result = gdip_pen_new (); if (result == NULL) { if (pen->dash_count > 0) GdipFree (dashes); if (pen->compound_count > 0) GdipFree (compound_array); return OutOfMemory; } if (pen->own_brush) { GpSolidFill* solidBrush; GpSolidFill* oldbrush = (GpSolidFill*)pen->brush; GdipCreateSolidFill (oldbrush->color, &solidBrush); result->brush = (GpBrush*) solidBrush; } else { result->brush = pen->brush; } result->own_brush = pen->own_brush; result->color = pen->color; result->width = pen->width; result->miter_limit = pen->miter_limit; result->line_join = pen->line_join; result->dash_style = pen->dash_style; result->line_cap = pen->line_cap; result->end_cap = pen->end_cap; result->mode = pen->mode; result->dash_offset = pen->dash_offset; result->dash_count = pen->dash_count; result->own_dash_array = pen->own_dash_array; result->dash_array = dashes; result->compound_count = pen->compound_count; result->compound_array = compound_array; result->unit = pen->unit; gdip_cairo_matrix_copy (&result->matrix, &pen->matrix); result->changed = pen->changed; result->custom_start_cap = custom_start_cap; result->custom_end_cap = custom_end_cap; *clonepen = result; return Ok; } GpStatus GdipDeletePen (GpPen *pen) { if (!pen) return InvalidParameter; if (pen->dash_count != 0 && pen->own_dash_array) { GdipFree (pen->dash_array); pen->dash_count = 0; pen->dash_array = NULL; } if (pen->own_brush && pen->brush) { GdipDeleteBrush (pen->brush); pen->brush = NULL; } if (pen->compound_count != 0) { GdipFree (pen->compound_array); pen->compound_array = NULL; pen->compound_count = 0; } if (pen->custom_start_cap != NULL) { GdipDeleteCustomLineCap (pen->custom_start_cap); pen->custom_start_cap = NULL; } if (pen->custom_end_cap != NULL) { GdipDeleteCustomLineCap (pen->custom_end_cap); pen->custom_end_cap = NULL; } GdipFree (pen); return Ok; } GpStatus GdipSetPenWidth (GpPen *pen, float width) { if (!pen) return InvalidParameter; pen->width = width; pen->changed = TRUE; return Ok; } GpStatus GdipGetPenWidth (GpPen *pen, float *width) { if (!pen || !width) return InvalidParameter; *width = pen->width; return Ok; } GpStatus GdipSetPenBrushFill (GpPen *pen, GpBrush *brush) { GpStatus s; ARGB color; GpBrushType type; if (!pen || !brush) return InvalidParameter; s = GdipGetBrushType (brush, &type); if (s != Ok) return s; if (type == BrushTypeSolidColor) { s = GdipGetSolidFillColor ((GpSolidFill*) brush, &color); if (s != Ok) return s; pen->color = color; } else pen->color = 0; if (pen->own_brush && pen->brush) GdipDeleteBrush (pen->brush); pen->brush = brush; pen->changed = TRUE; pen->own_brush = FALSE; return Ok; } GpStatus GdipGetPenBrushFill (GpPen *pen, GpBrush **brush) { if (!pen) return InvalidParameter; return GdipCloneBrush (pen->brush, brush); } GpStatus GdipGetPenFillType (GpPen *pen, GpPenType *type) { if (!pen || !type) return InvalidParameter; if (pen->brush != NULL) return GdipGetBrushType (pen->brush, (GpBrushType *) type); *type = PenTypeSolidColor; return Ok; } GpStatus GdipSetPenColor (GpPen *pen, ARGB argb) { if (!pen) return InvalidParameter; pen->changed = pen->changed ? TRUE : (pen->color != argb); pen->color = argb; if (pen->changed && pen->brush && (pen->brush->vtable->type == BrushTypeSolidColor)) return GdipSetSolidFillColor ((GpSolidFill*)pen->brush, argb); return Ok; } GpStatus GdipGetPenColor (GpPen *pen, ARGB *argb) { if (!pen || !argb) return InvalidParameter; *argb = pen->color; return Ok; } GpStatus GdipSetPenMiterLimit (GpPen *pen, float miterLimit) { if (!pen) return InvalidParameter; if (miterLimit < 1.0f) miterLimit = 1.0f; pen->changed = pen->changed ? TRUE : (pen->miter_limit != miterLimit); pen->miter_limit = miterLimit; return Ok; } GpStatus GdipGetPenMiterLimit (GpPen *pen, float *miterLimit) { if (!pen || !miterLimit) return InvalidParameter; *miterLimit = pen->miter_limit; return Ok; } GpStatus GdipSetPenLineJoin (GpPen *pen, GpLineJoin lineJoin) { if (!pen) return InvalidParameter; pen->changed = pen->changed ? TRUE : (pen->line_join != lineJoin); pen->line_join = lineJoin; return Ok; } GpStatus GdipGetPenLineJoin (GpPen *pen, GpLineJoin *lineJoin) { if (!pen || !lineJoin) return InvalidParameter; *lineJoin = pen->line_join; return Ok; } GpStatus GdipSetPenLineCap197819 (GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap) { if (!pen) return InvalidParameter; /* FIXME: * Cairo supports only one cap for a line. We use startcap for that. * Use end cap and dash cap when Cairo supports different caps for the * line ends and dashcap. */ pen->line_cap = startCap; pen->end_cap = endCap; /* any invalid value is changed to DashCapFlat */ if ((dashCap == DashCapRound) || (dashCap == DashCapTriangle)) pen->dash_cap = dashCap; else pen->dash_cap = DashCapFlat; /* default */ pen->changed = TRUE; return Ok; } GpStatus GdipSetPenMode (GpPen *pen, GpPenAlignment penMode) { if (!pen) return InvalidParameter; pen->changed = pen->changed ? TRUE : (penMode != pen->mode); pen->mode = penMode; return Ok; } GpStatus GdipGetPenMode (GpPen *pen, GpPenAlignment *penMode) { if (!pen || !penMode) return InvalidParameter; *penMode = pen->mode; return Ok; } GpStatus GdipGetPenUnit (GpPen *pen, GpUnit *unit) { if (!pen || !unit) return InvalidParameter; *unit = pen->unit; return Ok; } GpStatus GdipSetPenUnit (GpPen *pen, GpUnit unit) { if (!pen) return InvalidParameter; pen->unit = unit; pen->changed = TRUE; return Ok; } GpStatus GdipSetPenTransform (GpPen *pen, GpMatrix *matrix) { GpStatus status; BOOL invertible; if (!pen || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; gdip_cairo_matrix_copy (&pen->matrix, matrix); pen->changed = TRUE; return Ok; } GpStatus GdipGetPenTransform (GpPen *pen, GpMatrix *matrix) { if (!pen || !matrix) return InvalidParameter; gdip_cairo_matrix_copy(matrix, &pen->matrix); return Ok; } GpStatus GdipResetPenTransform (GpPen *pen) { if (!pen) return InvalidParameter; cairo_matrix_init_identity (&pen->matrix); pen->changed = TRUE; return Ok; } GpStatus GdipMultiplyPenTransform (GpPen *pen, GpMatrix *matrix, GpMatrixOrder order) { GpStatus status; BOOL invertible; if (!pen || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; /* invalid GpMatrixOrder values are computed as MatrixOrderAppend (i.e. no error) */ if (order != MatrixOrderPrepend) order = MatrixOrderAppend; status = GdipMultiplyMatrix (&pen->matrix, matrix, order); if (status == Ok) pen->changed = TRUE; return status; } GpStatus GdipTranslatePenTransform (GpPen *pen, float dx, float dy, GpMatrixOrder order) { GpStatus status; if (!pen) return InvalidParameter; status = GdipTranslateMatrix (&pen->matrix, dx, dy, order); if (status == Ok) pen->changed = TRUE; return status; } GpStatus GdipScalePenTransform (GpPen *pen, float sx, float sy, GpMatrixOrder order) { GpStatus status; if (!pen) return InvalidParameter; status = GdipScaleMatrix (&pen->matrix, sx, sy, order); if (status == Ok) pen->changed = TRUE; return status; } GpStatus GdipRotatePenTransform (GpPen *pen, float angle, GpMatrixOrder order) { GpStatus status; if (!pen) return InvalidParameter; status = GdipRotateMatrix (&pen->matrix, angle, order); if (status == Ok) pen->changed = TRUE; return status; } GpStatus GdipGetPenDashStyle (GpPen *pen, GpDashStyle *dashStyle) { if (!pen || !dashStyle) return InvalidParameter; *dashStyle = pen->dash_style; return Ok; } static float Dot [] = { 1.0, 1.0 }; static float Dash [] = { 3.0, 1.0 }; static float DashDot [] = { 3.0, 1.0, 1.0, 1.0 }; static float DashDotDot [] = { 3.0, 1.0, 1.0, 1.0, 1.0, 1.0 }; GpStatus GdipSetPenDashStyle (GpPen *pen, GpDashStyle dashStyle) { if (!pen) return InvalidParameter; switch (dashStyle) { case DashStyleSolid: pen->dash_array = NULL; pen->dash_count = 0; break; case DashStyleDashDot: pen->dash_array = DashDot; pen->dash_count = 4; break; case DashStyleDashDotDot: pen->dash_array = DashDotDot; pen->dash_count = 6; break; case DashStyleDot: pen->dash_array = Dot; pen->dash_count = 2; break; case DashStyleDash: pen->dash_array = Dash; pen->dash_count = 2; break; case DashStyleCustom: /* we keep the current assigned value when switching to Custom */ /* other special stuff happens in System.Drawing (but not here) */ break; default: return GenericError; } pen->dash_style = dashStyle; pen->changed = TRUE; return Ok; } GpStatus GdipGetPenDashOffset (GpPen *pen, float *offset) { if (!pen || !offset) return InvalidParameter; *offset = pen->dash_offset; return Ok; } GpStatus GdipSetPenDashOffset (GpPen *pen, float offset) { if (!pen) return InvalidParameter; pen->dash_offset = offset; pen->changed = TRUE; return Ok; } GpStatus GdipGetPenDashCount (GpPen *pen, int *count) { if (!pen || !count) return InvalidParameter; *count = pen->dash_count; return Ok; } /* * This is the DashPattern property in Pen. */ GpStatus GdipGetPenDashArray (GpPen *pen, float *dash, int count) { if (!pen || !dash) return InvalidParameter; if (count == 0) return OutOfMemory; if (count != pen->dash_count) return InvalidParameter; memcpy (dash, pen->dash_array, count * sizeof (float)); return Ok; } GpStatus GdipSetPenDashArray (GpPen *pen, GDIPCONST float *dash, int count) { float *dash_array; if (!pen || !dash || (count <= 0)) return InvalidParameter; if (pen->dash_count != count || pen->own_dash_array == FALSE) { dash_array = (float *) GdipAlloc (count * sizeof (float)); if (!dash_array) return OutOfMemory; /* free the existing values, if we own them */ if (pen->dash_count != 0 && pen->own_dash_array == TRUE) GdipFree (pen->dash_array); pen->dash_array = dash_array; pen->dash_count = count; pen->own_dash_array = TRUE; } memcpy (pen->dash_array, dash, pen->dash_count * sizeof (float)); pen->dash_style = DashStyleCustom; pen->changed = TRUE; return Ok; } /* * MonoTODO: Find out what the difference is between CompoundArray and DashArray */ GpStatus GdipGetPenCompoundCount (GpPen *pen, int *count) { if (!pen || !count) return InvalidParameter; *count = pen->compound_count; return Ok; } GpStatus GdipSetPenCompoundArray (GpPen *pen, const float *compound, int count) { float *compound_array; if (!pen || !compound || (count <= 0)) return InvalidParameter; if (pen->compound_count != count) { compound_array = (float *) GdipAlloc (count * sizeof (float)); if (!compound_array) return OutOfMemory; /* free the existing values */ if (pen->compound_count != 0) GdipFree (pen->compound_array); pen->compound_array = compound_array; pen->compound_count = count; } memcpy (pen->compound_array, compound, pen->compound_count * sizeof (float)); return Ok; } GpStatus GdipGetPenCompoundArray (GpPen *pen, float *compound, int count) { if (!pen || !compound || (count != pen->compound_count)) return InvalidParameter; memcpy (compound, pen->compound_array, count * sizeof (float)); return Ok; } GpStatus GdipSetPenStartCap (GpPen *pen, GpLineCap startCap) { if (!pen) return InvalidParameter; pen->line_cap = startCap; pen->changed = TRUE; return Ok; } GpStatus GdipGetPenStartCap (GpPen *pen, GpLineCap *startCap) { if (!pen || !startCap) return InvalidParameter; *startCap = pen->line_cap; return Ok; } /* MonoTODO - ignored (always same as start cap) */ GpStatus GdipSetPenEndCap (GpPen *pen, GpLineCap endCap) { if (!pen) return InvalidParameter; /* * This is currently ignored, as Cairo does not support * having a different start and end Cap */ pen->end_cap = endCap; pen->changed = TRUE; return Ok; } /* MonoTODO - ignored (always same as start cap) */ GpStatus GdipGetPenEndCap (GpPen *pen, GpLineCap *endCap) { if (!pen || !endCap) return InvalidParameter; *endCap = pen->end_cap; return Ok; } /* MonoTODO - ignored */ GpStatus GdipSetPenDashCap197819 (GpPen *pen, GpDashCap dashCap) { if (!pen) return InvalidParameter; pen->dash_cap = dashCap; return Ok; } /* MonoTODO - ignored */ GpStatus GdipGetPenDashCap197819 (GpPen *pen, GpDashCap *dashCap) { if (!pen || !dashCap) return InvalidParameter; *dashCap = pen->dash_cap; return Ok; } GpStatus GdipSetPenCustomStartCap (GpPen *pen, GpCustomLineCap *customCap) { if (!pen) return InvalidParameter; return GdipCloneCustomLineCap (customCap, &pen->custom_start_cap); } GpStatus GdipGetPenCustomStartCap (GpPen *pen, GpCustomLineCap **customCap) { if (!pen || !customCap) return InvalidParameter; return GdipCloneCustomLineCap (pen->custom_start_cap, customCap); } GpStatus GdipSetPenCustomEndCap (GpPen *pen, GpCustomLineCap *customCap) { if (!pen) return InvalidParameter; return GdipCloneCustomLineCap (customCap, &pen->custom_end_cap); } GpStatus GdipGetPenCustomEndCap (GpPen *pen, GpCustomLineCap **customCap) { if (!pen || !customCap) return InvalidParameter; return GdipCloneCustomLineCap (pen->custom_end_cap, customCap); } libgdiplus-2.11/src/jpegcodec.h0000664000175000017500000000207612225470167013414 00000000000000/* * jpegcodec.h : Contains function declarations for encoding decoding jpeg images * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * * Copyright (C) 2003-2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef _JPEGCODEC_H #define _JPEGCODEC_H #include "bitmap-private.h" #include "bmpcodec.h" GpStatus gdip_load_jpeg_image_from_file (FILE *fp, const char *filename, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_jpeg_image_from_stream_delegate (dstream_t *loader, GpImage **image) GDIP_INTERNAL; GpStatus gdip_save_jpeg_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; GpStatus gdip_save_jpeg_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; ImageCodecInfo *gdip_getcodecinfo_jpeg () GDIP_INTERNAL; UINT gdip_get_encoder_parameter_list_size_jpeg () GDIP_INTERNAL; GpStatus gdip_fill_encoder_parameter_list_jpeg (EncoderParameters *eps, UINT size) GDIP_INTERNAL; #endif /* _JPEGCODEC_H */ libgdiplus-2.11/src/image.c0000664000175000017500000021313212225470167012543 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 4; -*- * * image.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine(pigolkine@gmx.de) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Jordi Mas (jordi@ximian.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot */ #include "gdiplus-private.h" #include "image-private.h" #include "imageattributes-private.h" #include "graphics-private.h" #include "matrix.h" #include "metafile-private.h" #include "bmpcodec.h" #include "pngcodec.h" #include "jpegcodec.h" #include "gifcodec.h" #include "tiffcodec.h" #include "icocodec.h" #include "emfcodec.h" #include "wmfcodec.h" /* * format guids */ extern GUID gdip_bmp_image_format_guid; extern GUID gdip_jpg_image_format_guid; extern GUID gdip_png_image_format_guid; extern GUID gdip_gif_image_format_guid; extern GUID gdip_tif_image_format_guid; extern GUID gdip_wmf_image_format_guid; extern GUID gdip_emf_image_format_guid; extern GUID gdip_ico_image_format_guid; GUID gdip_exif_image_format_guid = {0xb96b3cb2U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; GUID gdip_membmp_image_format_guid = {0xb96b3caaU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; /* * encoder param guids */ GUID GdipEncoderQuality = {0x1d5be4b5U, 0xfa4aU, 0x452dU, {0x9c, 0xdd, 0x5d, 0xb3, 0x51, 0x05, 0xe7, 0xeb}}; GUID GdipEncoderCompression = {0xe09d739dU, 0xccd4U, 0x44eeU, {0x8e, 0xba, 0x3f, 0xbf, 0x8b, 0xe4, 0xfc, 0x58}}; #define DECODERS_SUPPORTED 8 #define ENCODERS_SUPPORTED 5 static BYTE *g_decoder_list; static int g_decoders = 0; static BYTE *g_encoder_list; static int g_encoders = 0; static ImageFormat gdip_image_format_for_format_guid (GDIPCONST GUID *formatGUID) { if (memcmp (formatGUID, &gdip_bmp_image_format_guid, sizeof (GUID)) == 0) return BMP; if (memcmp (formatGUID, &gdip_jpg_image_format_guid, sizeof (GUID)) == 0) return JPEG; if (memcmp (formatGUID, &gdip_png_image_format_guid, sizeof (GUID)) == 0) return PNG; if (memcmp (formatGUID, &gdip_gif_image_format_guid, sizeof (GUID)) == 0) return GIF; if (memcmp (formatGUID, &gdip_tif_image_format_guid, sizeof (GUID)) == 0) return TIF; if (memcmp (formatGUID, &gdip_exif_image_format_guid, sizeof (GUID)) == 0) return EXIF; if (memcmp (formatGUID, &gdip_wmf_image_format_guid, sizeof (GUID)) == 0) return WMF; if (memcmp (formatGUID, &gdip_emf_image_format_guid, sizeof (GUID)) == 0) return EMF; if (memcmp (formatGUID, &gdip_ico_image_format_guid, sizeof (GUID)) == 0) return ICON; if (memcmp (formatGUID, &gdip_membmp_image_format_guid, sizeof (GUID)) == 0) return PNG; /* MemoryBmp is saved as PNG */ return INVALID; } /* hack #1 - nonplaceable WMF metafiles are supported by no signature match them in the codecs */ static const BYTE nonplaceable_wmf_sig_pattern[] = { 0x01, 0x00, 0x09, 0x00, 0x00, 0x03 }; static const BYTE nonplaceable_wmf_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; static const int nonplaceable_wmf_sig_count = 1; static const int nonplaceable_wmf_sig_size = 6; static BOOL signature_match (char *data, size_t data_size, int size, int count, BYTE* sig_pattern, BYTE* sig_mask) { int sig; for (sig = 0; sig < (size * count); sig += size) { BOOL match = TRUE; int p; for (p = 0; ((p < size) && (p < data_size)); p++) { BYTE *mask = (BYTE*)(&sig_mask [sig]); BYTE *pattern = (BYTE*)(&sig_pattern [sig]); if ((data [p] & mask[p]) != pattern[p]) { match = FALSE; break; } } if (match) return TRUE; } return FALSE; } static ImageFormat get_image_format (char *sig_read, size_t size_read, ImageFormat *final) { ImageCodecInfo *decoder = (ImageCodecInfo*)g_decoder_list; int index; /* look at every decoder available, this will depends on how libgdiplus is compiled */ for (index = 0; index < g_decoders; index++, decoder++) { /* for each signature in the codec */ if (signature_match (sig_read, size_read, decoder->SigSize, decoder->SigCount, (BYTE*)&decoder->SigPattern[0], (BYTE*)&decoder->SigMask[0])) { *final = gdip_image_format_for_format_guid (&decoder->FormatID); return *final; } } /* last chance - GDI+ still detects some files even if they don't match the codec signatures */ /* [mis-]handle non-placeable metafiles are WMF but reported as EMF (see #81178 for a test case) */ if (signature_match (sig_read, size_read, nonplaceable_wmf_sig_size, nonplaceable_wmf_sig_count, (BYTE*)&nonplaceable_wmf_sig_pattern[0], (BYTE*)&nonplaceable_wmf_sig_mask[0])) { *final = EMF; return WMF; } return INVALID; } /* Converts the given interpolation value to cairo_filter_t */ static cairo_filter_t gdip_get_cairo_filter (InterpolationMode imode) { cairo_filter_t filter; switch (imode) { case InterpolationModeHighQuality: case InterpolationModeHighQualityBilinear: case InterpolationModeHighQualityBicubic: return CAIRO_FILTER_BEST; case InterpolationModeNearestNeighbor: return CAIRO_FILTER_NEAREST; case InterpolationModeBilinear: return CAIRO_FILTER_BILINEAR; case InterpolationModeBicubic: return CAIRO_FILTER_GAUSSIAN; case InterpolationModeLowQuality: return CAIRO_FILTER_FAST; case InterpolationModeDefault: default: return CAIRO_FILTER_GOOD; } } void gdip_image_init (GpImage *image) { gdip_bitmap_init(image); } static void copy_pixel (BYTE *src, BYTE *trg, int size) { memcpy (trg, src, size); } static GpStatus gdip_flip_x (GpImage *image) { BYTE *src; BYTE *line; int stride; int width; int height; int pixel_size; int i; int j; stride = image->active_bitmap->stride; width = image->active_bitmap->width; height = image->active_bitmap->height; pixel_size = gdip_get_pixel_format_components (image->active_bitmap->pixel_format) * gdip_get_pixel_format_depth (image->active_bitmap->pixel_format) / 8; line = GdipAlloc (stride); src = (BYTE *) image->active_bitmap->scan0; if (line == NULL) { return OutOfMemory; } for (i = 0; i < height; i++, src += stride) { memcpy (line, src, stride); /* Save original line */ for (j = 0; j < width; j++) { copy_pixel(&line[(width - j - 1) * pixel_size], &src[j * pixel_size], pixel_size); } } GdipFree (line); return Ok; } static GpStatus gdip_flip_y (GpImage *image) { BYTE *src; BYTE *trg; BYTE *line; int stride; int height; int i; stride = image->active_bitmap->stride; height = image->active_bitmap->height; line = GdipAlloc (stride); src = (BYTE *) image->active_bitmap->scan0; trg = (BYTE *) image->active_bitmap->scan0; trg += (height-1) * stride; if (line == NULL) { return OutOfMemory; } for (i = 0; i < (height /2); i++, src += stride, trg -= stride) { memcpy (line, trg, stride); /* Save target line*/ memcpy (trg, src, stride); /* Copy src to trg*/ memcpy (src, line, stride); /* Copy trg to src*/ } GdipFree (line); return Ok; } GpStatus GdipDisposeImage (GpImage *image) { if (!image) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: return gdip_bitmap_dispose (image); case ImageTypeMetafile: return gdip_metafile_dispose ((GpMetafile*)image); default: /* imageUndefined */ g_warning ("unknown image type couldn't be disposed, ptr = %d, type %d", image, image->type); return Ok; } } /* coverity[+alloc : arg-*1] */ GpStatus GdipGetImageGraphicsContext (GpImage *image, GpGraphics **graphics) { GpGraphics *gfx; cairo_surface_t *surface; cairo_pattern_t *filter; if (!image || !graphics) return InvalidParameter; /* This function isn't allowed on metafiles - unless we're recording */ if (image->type == ImageTypeMetafile) { GpMetafile *mf = (GpMetafile*)image; if (!mf->recording) return OutOfMemory; *graphics = gdip_metafile_graphics_new (mf); return *graphics ? Ok : OutOfMemory; } if (!image->active_bitmap) return InvalidParameter; /* * Microsoft GDI+ only supports these pixel formats Format24bppRGB, Format32bppARGB, * Format32bppPARGB, Format32bppRGB, Format48bppRGB, Format64bppARGB, Format64bppPARGB * but we're limited to 24/32 inside libgdiplus */ switch (image->active_bitmap->pixel_format) { case PixelFormat24bppRGB: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: break; default: return OutOfMemory; } surface = cairo_image_surface_create_for_data ((BYTE*) image->active_bitmap->scan0, image->cairo_format, image->active_bitmap->width, image->active_bitmap->height, image->active_bitmap->stride); gfx = gdip_graphics_new (surface); gfx->dpi_x = image->active_bitmap->dpi_horz <= 0 ? gdip_get_display_dpi () : image->active_bitmap->dpi_horz; gfx->dpi_y = image->active_bitmap->dpi_vert <= 0 ? gdip_get_display_dpi () : image->active_bitmap->dpi_vert; cairo_surface_destroy (surface); gfx->image = image; gfx->type = gtMemoryBitmap; filter = cairo_pattern_create_for_surface (image->surface); cairo_pattern_set_filter (filter, gdip_get_cairo_filter (gfx->interpolation)); cairo_pattern_destroy (filter); *graphics = gfx; return Ok; } GpStatus GdipDrawImageI (GpGraphics *graphics, GpImage *image, int x, int y) { if (!image) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: { BitmapData *data = image->active_bitmap; return GdipDrawImageRect (graphics, image, x, y, data->width, data->height); } case ImageTypeMetafile: { MetafileHeader *metaheader = &((GpMetafile*)image)->metafile_header; return GdipDrawImageRect (graphics, image, x, y, metaheader->Width, metaheader->Height); } default: return InvalidParameter; } } GpStatus GdipDrawImage (GpGraphics *graphics, GpImage *image, float x, float y) { if (!image) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: { BitmapData *data = image->active_bitmap; return GdipDrawImageRect (graphics, image, x, y, data->width, data->height); } case ImageTypeMetafile: { MetafileHeader *metaheader = &((GpMetafile*)image)->metafile_header; return GdipDrawImageRect (graphics, image, x, y, metaheader->Width, metaheader->Height); } default: return InvalidParameter; } } GpStatus GdipDrawImageRectI (GpGraphics *graphics, GpImage *image, int x, int y, int width, int height) { return GdipDrawImageRect (graphics, image, x, y, width, height); } GpStatus GdipDrawImageRect (GpGraphics *graphics, GpImage *image, float x, float y, float width, float height) { cairo_pattern_t *pattern; cairo_pattern_t *org_pattern; MetafilePlayContext *metacontext = NULL; BOOL need_scaling = FALSE; double scaled_width, scaled_height; cairo_matrix_t orig_matrix; BYTE *premul = NULL; cairo_surface_t *original = NULL; if (!graphics || !image) return InvalidParameter; if ((width <= 0) || (height <= 0)) return Ok; if (image->type == ImageTypeBitmap) { /* check does not apply to metafiles, and it's better be done before converting the image */ if (gdip_is_overflow(x) || gdip_is_overflow(y)) return ValueOverflow; if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format)) { GpStatus status = OutOfMemory; GpBitmap *rgb_bitmap = gdip_convert_indexed_to_rgb (image); if (rgb_bitmap) { status = GdipDrawImageRect (graphics, rgb_bitmap, x, y, width, height); GdipDisposeImage (rgb_bitmap); } return status; } } /* conversion must be done after the recursive call to GdipDrawImageRect to remove the indexed bitmap */ if (!OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); width = gdip_unitx_convgr (graphics, width); height = gdip_unity_convgr (graphics, height); } cairo_new_path (graphics->ct); /* metafile */ if (image->type == ImageTypeMetafile) { GpStatus status; metacontext = gdip_metafile_play_setup ((GpMetafile*)image, graphics, x, y, width, height); cairo_translate (graphics->ct, x, y); status = gdip_metafile_play (metacontext); gdip_metafile_play_cleanup (metacontext); return status; } /* Create a surface for this bitmap if one doesn't exist */ gdip_bitmap_ensure_surface (image); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (image)) { premul = gdip_bitmap_get_premultiplied_scan0 (image); if (premul) { BitmapData *data = image->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = image->surface; if (width != image->active_bitmap->width || height != image->active_bitmap->height) { scaled_width = (double) width / image->active_bitmap->width; scaled_height = (double) height / image->active_bitmap->height; need_scaling = TRUE; } /* Use the original as a pattern */ pattern = cairo_pattern_create_for_surface (original); cairo_pattern_set_filter (pattern, gdip_get_cairo_filter (graphics->interpolation)); cairo_get_matrix (graphics->ct, &orig_matrix); cairo_translate (graphics->ct, x, y); if (need_scaling) cairo_scale (graphics->ct, scaled_width, scaled_height); org_pattern = cairo_get_source(graphics->ct); cairo_pattern_reference(org_pattern); cairo_set_source (graphics->ct, pattern); cairo_identity_matrix (graphics->ct); cairo_paint (graphics->ct); cairo_set_source (graphics->ct, org_pattern); cairo_set_matrix (graphics->ct, &orig_matrix); cairo_pattern_destroy (org_pattern); cairo_pattern_destroy (pattern); if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return Ok; } /* points are upper left, upper right, lower left. fourth point is extrapolated. */ GpStatus GdipDrawImagePoints (GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *dstPoints, int count) { cairo_pattern_t *pattern; cairo_pattern_t *org_pattern; GpMatrix *matrix = NULL; cairo_matrix_t orig_matrix; GpRectF tRect; MetafilePlayContext *metacontext = NULL; BYTE *premul = NULL; cairo_surface_t *original = NULL; if (!graphics || !image || !dstPoints || (count != 3)) return InvalidParameter; cairo_new_path (graphics->ct); if (image->type == ImageTypeBitmap) { if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format)) { GpStatus status = OutOfMemory; GpBitmap *rgb_bitmap = gdip_convert_indexed_to_rgb (image); if (rgb_bitmap) { status = GdipDrawImagePoints (graphics, rgb_bitmap, dstPoints, count); GdipDisposeImage(rgb_bitmap); } return status; } tRect.Width = image->active_bitmap->width; tRect.Height = image->active_bitmap->height; } else { MetafileHeader *metaheader = &((GpMetafile*)image)->metafile_header; tRect.Width = metaheader->Width; tRect.Height = metaheader->Height; } tRect.X = 0; tRect.Y = 0; GdipCreateMatrix3 (&tRect, dstPoints, &matrix); /* metafile */ if (image->type == ImageTypeMetafile) { GpStatus status; metacontext = gdip_metafile_play_setup ((GpMetafile*)image, graphics, tRect.X, tRect.Y, tRect.Width, tRect.Height); cairo_get_matrix (graphics->ct, &orig_matrix); cairo_set_matrix (graphics->ct, matrix); status = gdip_metafile_play (metacontext); GdipDeleteMatrix (matrix); gdip_metafile_play_cleanup (metacontext); return status; } /* Create a surface for this bitmap if one doesn't exist */ gdip_bitmap_ensure_surface (image); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (image)) { premul = gdip_bitmap_get_premultiplied_scan0 (image); if (premul) { BitmapData *data = image->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = image->surface; pattern = cairo_pattern_create_for_surface (original); cairo_pattern_set_filter (pattern, gdip_get_cairo_filter (graphics->interpolation)); org_pattern = cairo_get_source(graphics->ct); cairo_pattern_reference(org_pattern); cairo_get_matrix(graphics->ct, &orig_matrix); cairo_set_matrix (graphics->ct, matrix); cairo_set_source_surface (graphics->ct, image->surface, 0, 0); cairo_paint (graphics->ct); cairo_set_source(graphics->ct, org_pattern); cairo_set_matrix (graphics->ct, &orig_matrix); GdipDeleteMatrix (matrix); cairo_pattern_destroy (org_pattern); cairo_pattern_destroy (pattern); if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return Ok; } GpStatus GdipDrawImagePointsI (GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *dstPoints, int count) { GpPointF points[3]; int i; if (!dstPoints || (count != 3)) return InvalidParameter; for (i = 0; i < 3; i++) { points[i].X = dstPoints[i].X; points[i].Y = dstPoints[i].Y; } return GdipDrawImagePoints (graphics, image, points, 3); } GpStatus GdipDrawImagePointRect (GpGraphics *graphics, GpImage *image, float x, float y, float srcx, float srcy, float srcwidth, float srcheight, GpUnit srcUnit) { return GdipDrawImageRectRect (graphics, image, x, y, srcwidth, srcheight, srcx, srcy, srcwidth, srcheight, srcUnit, NULL, NULL, NULL); } GpStatus GdipDrawImagePointRectI (GpGraphics *graphics, GpImage *image, int x, int y, int srcx, int srcy, int srcwidth, int srcheight, GpUnit srcUnit) { return GdipDrawImagePointRect (graphics, image, x, y, srcx, srcy, srcwidth, srcheight, srcUnit); } GpStatus GdipDrawImageRectRect (GpGraphics *graphics, GpImage *image, float dstx, float dsty, float dstwidth, float dstheight, float srcx, float srcy, float srcwidth, float srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData) { cairo_pattern_t *pattern; cairo_pattern_t *orig; cairo_matrix_t mat; void *dest; void *org; int org_format; BOOL allocated = FALSE; BYTE *premul = NULL; cairo_surface_t *original = NULL; if (!graphics || !image) return InvalidParameter; switch (srcUnit) { case UnitPixel: break; case UnitPoint: case UnitInch: case UnitDocument: case UnitMillimeter: if (graphics->type != gtPostScript) return NotImplemented; /* GDI+ returns the same */ break; case UnitWorld: case UnitDisplay: default: return InvalidParameter; } if (image->type == ImageTypeBitmap) { if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format)) { GpStatus status = OutOfMemory; GpBitmap *rgb_bitmap = gdip_convert_indexed_to_rgb (image); if (rgb_bitmap) { status = GdipDrawImageRectRect (graphics, rgb_bitmap, dstx, dsty, dstwidth, dstheight, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); GdipDisposeImage (rgb_bitmap); } return status; } } else { /* metafile support */ return NotImplemented; } /* see OPTIMIZE_CONVERSION in general.h */ if ((srcUnit != UnitPixel) && (srcUnit != UnitWorld) && ((srcUnit != UnitDisplay) || (graphics->type != gtPostScript))) { dstx = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_x, dstx); dsty = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_y, dsty); dstwidth = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_x, dstwidth); dstheight = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_y, dstheight); srcx = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_x, srcx); srcy = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_y, srcy); srcwidth = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_x, srcwidth); srcheight = gdip_unit_conversion (srcUnit, UnitCairoPoint, graphics->type, graphics->dpi_y, srcheight); } org = dest = image->active_bitmap->scan0; org_format = image->active_bitmap->pixel_format; gdip_process_bitmap_attributes (image, &dest, (GpImageAttributes *) imageAttributes, &allocated); /* If allocated is true we have a newly allocated and altered Scan0 in dest */ if (allocated) { image->active_bitmap->scan0 = dest; } /* Drop the existing surface if attributes are being applied since the surface might be out-of-date */ if ((image->surface != NULL) && (imageAttributes != NULL)) { cairo_surface_destroy (image->surface); image->surface = NULL; } cairo_matrix_init (&mat, 1, 0, 0, 1, 0, 0); if (imageAttributes && imageAttributes->wrapmode != WrapModeClamp) { float posx; float posy; BOOL flipXOn = (imageAttributes->wrapmode == WrapModeTileFlipX); BOOL flipYOn = (imageAttributes->wrapmode == WrapModeTileFlipY); BOOL flipX = FALSE; BOOL flipY = FALSE; GpBitmap *imgflipX = NULL; GpBitmap *imgflipY = NULL; GpBitmap *imgflipXY = NULL; float img_width = image->active_bitmap->width * (dstwidth / srcwidth); float img_height = image->active_bitmap->height * (dstheight / srcheight); BYTE *premul = NULL; BYTE *premulX = NULL; BYTE *premulY = NULL; BYTE *premulXY = NULL; cairo_surface_t *original = NULL; cairo_surface_t *originalX = NULL; cairo_surface_t *originalY = NULL; cairo_surface_t *originalXY = NULL; cairo_surface_t *cur_surface; if (imageAttributes->wrapmode == WrapModeTileFlipXY) { flipXOn = flipYOn = TRUE; } if (flipXOn) { /* We're ok just cloning the bitmap, we don't need the image data * and we destroy it before we leave this function */ gdip_bitmap_clone (image, &imgflipX); gdip_flip_x (imgflipX); gdip_bitmap_ensure_surface (imgflipX); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (imgflipX)) { premulX = gdip_bitmap_get_premultiplied_scan0 (imgflipX); if (premulX) { BitmapData *data = imgflipX->active_bitmap; originalX = cairo_image_surface_create_for_data (premulX, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!originalX) originalX = imgflipX->surface; } if (flipYOn) { gdip_bitmap_clone (image, &imgflipY); gdip_flip_y (imgflipY); gdip_bitmap_ensure_surface (imgflipY); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (imgflipY)) { premulY = gdip_bitmap_get_premultiplied_scan0 (imgflipY); if (premulY) { BitmapData *data = imgflipY->active_bitmap; originalY = cairo_image_surface_create_for_data (premulY, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!originalY) originalY = imgflipY->surface; } if (flipXOn && flipYOn) { gdip_bitmap_clone (image, &imgflipXY); gdip_flip_x (imgflipXY); gdip_flip_y (imgflipXY); gdip_bitmap_ensure_surface (imgflipXY); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (imgflipXY)) { premulXY = gdip_bitmap_get_premultiplied_scan0 (imgflipXY); if (premulXY) { BitmapData *data = imgflipXY->active_bitmap; originalXY = cairo_image_surface_create_for_data (premulXY, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!originalXY) originalXY = imgflipXY->surface; } gdip_bitmap_ensure_surface (image); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (image)) { premul = gdip_bitmap_get_premultiplied_scan0 (image); if (premul) { BitmapData *data = image->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = image->surface; for (posy = 0; posy < dstheight; posy += img_height) { for (posx = 0; posx < dstwidth; posx += img_width) { if (flipX && flipY) { cur_surface = originalXY; } else { if (flipX) { cur_surface = originalX; } else { if (flipY) { cur_surface = originalY; } else { cur_surface = original; } } } cairo_matrix_translate (&mat, srcx, srcy); cairo_matrix_scale (&mat, srcwidth / dstwidth, srcheight / dstheight); cairo_matrix_translate (&mat, - (dstx + posx), - (dsty + posy)); pattern = cairo_pattern_create_for_surface(cur_surface); cairo_pattern_set_matrix (pattern, &mat); orig = cairo_get_source(graphics->ct); cairo_pattern_reference(orig); cairo_set_source(graphics->ct, pattern); cairo_rectangle (graphics->ct, dstx + posx, dsty + posy, img_width, img_height); cairo_fill (graphics->ct); cairo_set_source(graphics->ct, orig); cairo_matrix_init_identity (&mat); cairo_pattern_set_matrix (pattern, &mat); cairo_pattern_destroy(orig); cairo_pattern_destroy(pattern); if (flipXOn) { flipX = !flipX; } } if (flipYOn) { flipY = !flipY; } } if (imgflipX) { GdipDisposeImage ((GpImage *) imgflipX); if (premulX) { cairo_surface_destroy (originalX); GdipFree (premulX); } } if (imgflipY) { GdipDisposeImage ((GpImage *) imgflipY); if (premulY) { cairo_surface_destroy (originalY); GdipFree (premulY); } } if (imgflipXY) { GdipDisposeImage ((GpImage *) imgflipXY); if (premulXY) { cairo_surface_destroy (originalXY); GdipFree (premulXY); } } if (premul) { cairo_surface_destroy (original); GdipFree (premul); } } else { cairo_pattern_t *filter; gdip_bitmap_ensure_surface (image); if (graphics->type != gtMemoryBitmap && gdip_bitmap_format_needs_premultiplication (image)) { premul = gdip_bitmap_get_premultiplied_scan0 (image); if (premul) { BitmapData *data = image->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = image->surface; filter = cairo_pattern_create_for_surface (original); cairo_pattern_set_filter (filter, gdip_get_cairo_filter (graphics->interpolation)); cairo_matrix_translate (&mat, srcx, srcy); if (!gdip_near_zero(srcwidth - dstwidth) || !gdip_near_zero(srcheight - dstheight)) cairo_matrix_scale (&mat, srcwidth / dstwidth, srcheight / dstheight); cairo_matrix_translate (&mat, -dstx, -dsty); pattern = cairo_pattern_create_for_surface(original); cairo_pattern_set_matrix (pattern, &mat); orig = cairo_get_source(graphics->ct); cairo_pattern_reference(orig); cairo_set_source(graphics->ct, pattern); cairo_rectangle (graphics->ct, dstx, dsty, dstwidth, dstheight); cairo_fill (graphics->ct); cairo_set_source(graphics->ct, orig); cairo_pattern_destroy (orig); cairo_matrix_init_identity (&mat); cairo_pattern_set_matrix (pattern, &mat); cairo_pattern_destroy (pattern); cairo_pattern_destroy (filter); if (premul) { cairo_surface_destroy (original); GdipFree (premul); } } /* The current surface is no longer valid if we had attributes applied */ if (image->surface && imageAttributes != NULL) { cairo_surface_destroy (image->surface); image->surface = NULL; } if (allocated) { image->active_bitmap->scan0 = org; image->active_bitmap->pixel_format = org_format; GdipFree (dest); } return Ok; } GpStatus GdipDrawImageRectRectI (GpGraphics *graphics, GpImage *image, int dstx, int dsty, int dstwidth, int dstheight, int srcx, int srcy, int srcwidth, int srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData) { return GdipDrawImageRectRect (graphics, image, dstx, dsty, dstwidth, dstheight, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); } GpStatus GdipDrawImagePointsRect (GpGraphics *graphics, GpImage *image, GDIPCONST GpPointF *points, int count, float srcx, float srcy, float srcwidth, float srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData) { GpRectF rect; GpStatus status; GpMatrix *matrix = NULL; cairo_matrix_t orig_matrix; if (!graphics || !image || !points || (count < 3)) return InvalidParameter; if (count > 3) return NotImplemented; rect.X = 0; rect.Y = 0; if (image->type == ImageTypeBitmap) { rect.Width = image->active_bitmap->width; rect.Height = image->active_bitmap->height; } else { MetafileHeader *metaheader = &((GpMetafile*)image)->metafile_header; rect.Width = metaheader->Width; rect.Height = metaheader->Height; } status = GdipCreateMatrix3 (&rect, points, &matrix); if (status == Ok) { cairo_get_matrix (graphics->ct, &orig_matrix); cairo_set_matrix (graphics->ct, matrix); status = GdipDrawImageRectRect (graphics, image, rect.X, rect.Y, rect.Width, rect.Height, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); cairo_set_matrix (graphics->ct, &orig_matrix); } if (matrix) GdipDeleteMatrix (matrix); return status; } GpStatus GdipDrawImagePointsRectI (GpGraphics *graphics, GpImage *image, GDIPCONST GpPoint *points, int count, int srcx, int srcy, int srcwidth, int srcheight, GpUnit srcUnit, GDIPCONST GpImageAttributes *imageAttributes, DrawImageAbort callback, void *callbackData) { GpPointF pf[3]; if (!points || (count < 3)) return InvalidParameter; if (count > 3) return NotImplemented; pf[0].X = points[0].X; pf[0].Y = points[0].Y; pf[1].X = points[1].X; pf[1].Y = points[1].Y; pf[2].X = points[2].X; pf[2].Y = points[2].Y; return GdipDrawImagePointsRect (graphics, image, (GDIPCONST GpPointF*)&pf, count, srcx, srcy, srcwidth, srcheight, srcUnit, imageAttributes, callback, callbackData); } /* * These two will never be implemented, as 'stream' is a COM IStream */ GpStatus GdipLoadImageFromStream (void *stream, GpImage **image) { return NotImplemented; /* GdipLoadImageFromStream - not supported */ } GpStatus GdipSaveImageToStream (GpImage *image, void *stream, GDIPCONST CLSID *encoderCLSID, GDIPCONST EncoderParameters *params) { return NotImplemented; /* GdipSaveImageToStream - not supported */ } /* coverity[+alloc : arg-*1] */ GpStatus GdipLoadImageFromFile (GDIPCONST WCHAR *file, GpImage **image) { FILE *fp = NULL; GpImage *result = NULL; GpStatus status = Ok; ImageFormat format, public_format; char *file_name = NULL; char format_peek[MAX_CODEC_SIG_LENGTH]; int format_peek_sz; if (!image || !file) return InvalidParameter; file_name = (char *) ucs2_to_utf8 ((const gunichar2 *)file, -1); if (!file_name) { *image = NULL; return InvalidParameter; } fp = fopen (file_name, "rb"); if (!fp) { GdipFree (file_name); return OutOfMemory; } format_peek_sz = fread (format_peek, 1, MAX_CODEC_SIG_LENGTH, fp); format = get_image_format (format_peek, format_peek_sz, &public_format); fseek (fp, 0, SEEK_SET); switch (format) { case BMP: status = gdip_load_bmp_image_from_file (fp, &result); break; case TIF: status = gdip_load_tiff_image_from_file (fp, &result); break; case GIF: status = gdip_load_gif_image_from_file (fp, &result); break; case PNG: status = gdip_load_png_image_from_file (fp, &result); break; case JPEG: status = gdip_load_jpeg_image_from_file (fp, file_name, &result); break; case ICON: status = gdip_load_ico_image_from_file (fp, &result); break; case WMF: status = gdip_load_wmf_image_from_file (fp, &result); break; case EMF: status = gdip_load_emf_image_from_file (fp, &result); break; case EXIF: status = NotImplemented; break; default: status = OutOfMemory; break; } if (result && (status == Ok)) result->image_format = public_format; fclose (fp); GdipFree (file_name); *image = result; if (status != Ok) { *image = NULL; } else if (result && (result->type == ImageTypeBitmap) && !result->active_bitmap) { /* If the codec didn't set the active bitmap we will */ gdip_bitmap_setactive (result, NULL, 0); } return status; } /* Note: use only for encoders (there's more decoders than encoders) */ static ImageFormat gdip_get_imageformat_from_codec_clsid (CLSID *encoderCLSID) { GpStatus status; UINT numEncoders, size, cnt; ImageCodecInfo *encoders, *encoder; status = GdipGetImageEncodersSize (&numEncoders, &size); if ((status != Ok) ||(numEncoders == 0)) return INVALID; encoders = GdipAlloc (size); status = GdipGetImageEncoders (numEncoders, size, encoders); if (status != Ok) return INVALID; for (cnt = 0, encoder = encoders; cnt < numEncoders; cnt++, encoder++) { if (memcmp (&encoder->Clsid, encoderCLSID, sizeof (GUID)) == 0) { ImageFormat ifmt = gdip_image_format_for_format_guid (&encoder->FormatID); GdipFree (encoders); return ifmt; } } GdipFree (encoders); return INVALID; } GpStatus GdipSaveImageToFile (GpImage *image, GDIPCONST WCHAR *file, GDIPCONST CLSID *encoderCLSID, GDIPCONST EncoderParameters *params) { FILE *fp = 0; GpStatus status = 0; char *file_name; ImageFormat format; if (!image || !file || !encoderCLSID) return InvalidParameter; if (image->type != ImageTypeBitmap) return InvalidParameter; format = gdip_get_imageformat_from_codec_clsid ( (CLSID *)encoderCLSID); if (format == INVALID) return UnknownImageFormat; file_name = (char *) ucs2_to_utf8 ((const gunichar2 *)file, -1); if (file_name == NULL) return InvalidParameter; if (format == GIF) { /* gif library has to open the file itself*/ status = gdip_save_gif_image_to_file ((BYTE*)file_name, image); GdipFree (file_name); return status; } else if (format == TIF) { /* tif library has to open the file itself or seeking will fail when saving multi-page images*/ status = gdip_save_tiff_image_to_file ((BYTE*)file_name, image, params); GdipFree (file_name); return status; } if ((fp = fopen(file_name, "wb")) == NULL) { GdipFree (file_name); return GenericError; } GdipFree (file_name); switch (format) { case BMP: case ICON: status = gdip_save_bmp_image_to_file (fp, image); break; case PNG: status = gdip_save_png_image_to_file (fp, image, params); break; case JPEG: status = gdip_save_jpeg_image_to_file (fp, image, params); break; default: status = NotImplemented; break; } fclose (fp); return status; } GpStatus GdipGetImageBounds (GpImage *image, GpRectF *rect, GpUnit *unit) { if (!image || !rect || !unit) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: rect->X = 0; rect->Y = 0; rect->Height = image->active_bitmap->height; rect->Width = image->active_bitmap->width; *unit = UnitPixel; break; case ImageTypeMetafile: { MetafileHeader *metaheader = gdip_get_metaheader(image); rect->X = metaheader->X; rect->Y = metaheader->Y; rect->Height = metaheader->Height; rect->Width = metaheader->Width; *unit = UnitPixel; break; } default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageDimension (GpImage *image, float *width, float *height) { if (!image || !width || !height) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *width = image->active_bitmap->width; *height = image->active_bitmap->height; break; case ImageTypeMetafile: { MetafileHeader *metaheader = gdip_get_metaheader(image); *width = metaheader->Width * METAFILE_DIMENSION_FACTOR / metaheader->DpiX; *height = metaheader->Height * METAFILE_DIMENSION_FACTOR / metaheader->DpiY; break; } default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageType (GpImage *image, ImageType *type) { if (!image || !type) return InvalidParameter; *type = image->type; return Ok; } GpStatus GdipGetImageWidth (GpImage *image, UINT *width) { if (!image || !width) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *width = image->active_bitmap->width; break; case ImageTypeMetafile: *width = gdip_get_metaheader(image)->Width; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageHeight (GpImage *image, UINT *height) { if (!image || !height) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *height = image->active_bitmap->height; break; case ImageTypeMetafile: *height = gdip_get_metaheader(image)->Height; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageHorizontalResolution (GpImage *image, float *resolution) { if (!image || !resolution) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *resolution = image->active_bitmap->dpi_horz; break; case ImageTypeMetafile: *resolution = gdip_get_metaheader(image)->DpiX; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageVerticalResolution (GpImage *image, float *resolution) { if (!image || !resolution) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *resolution = image->active_bitmap->dpi_vert; break; case ImageTypeMetafile: *resolution = gdip_get_metaheader(image)->DpiY; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageFlags (GpImage *image, UINT *flags) { if (!image || !flags) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *flags = image->active_bitmap->image_flags; break; case ImageTypeMetafile: *flags = ImageFlagsUndocumented | ImageFlagsReadOnly | ImageFlagsHasAlpha | ImageFlagsScalable; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImageRawFormat (GpImage *image, GUID *format) { if (!image || !format) return InvalidParameter; switch (image->image_format) { case BMP: memcpy (format, &gdip_bmp_image_format_guid, sizeof (GUID)); break; case TIF: memcpy (format, &gdip_tif_image_format_guid, sizeof (GUID)); break; case GIF: memcpy (format, &gdip_gif_image_format_guid, sizeof (GUID)); break; case PNG: memcpy (format, &gdip_png_image_format_guid, sizeof (GUID)); break; case JPEG: memcpy (format, &gdip_jpg_image_format_guid, sizeof (GUID)); break; case EXIF: memcpy (format, &gdip_exif_image_format_guid, sizeof (GUID)); break; case WMF: memcpy (format, &gdip_wmf_image_format_guid, sizeof (GUID)); break; case EMF: memcpy (format, &gdip_emf_image_format_guid, sizeof (GUID)); break; case MEMBMP: memcpy (format, &gdip_membmp_image_format_guid, sizeof (GUID)); break; case ICON: memcpy (format, &gdip_ico_image_format_guid, sizeof (GUID)); break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetImagePixelFormat (GpImage *image, PixelFormat *format) { if (!image || !format) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *format = image->active_bitmap->pixel_format; break; case ImageTypeMetafile: *format = PixelFormat32bppRGB; break; default: return InvalidParameter; } return Ok; } GpStatus GdipImageGetFrameDimensionsCount (GpImage *image, UINT *count) { if (!image || !count) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *count = image->num_of_frames; break; case ImageTypeMetafile: *count = 1; /* always one for metafiles */ break; default: return InvalidParameter; } return Ok; } GpStatus GdipImageGetFrameDimensionsList (GpImage *image, GUID *dimensionGUID, UINT count) { if (!image || !dimensionGUID) return InvalidParameter; if (count < 1) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: { int i; int countReturn = image->num_of_frames; if (countReturn > count) countReturn = count; for (i = 0; i < countReturn; i++) dimensionGUID[i] = image->frames[i].frame_dimension; break; } case ImageTypeMetafile: if (count > 1) return InvalidParameter; dimensionGUID[0] = gdip_image_frameDimension_page_guid; break; default: return InvalidParameter; } return Ok; } GpStatus GdipImageGetFrameCount (GpImage *image, GDIPCONST GUID *dimensionGUID, UINT* count) { if (!image || !dimensionGUID || !count) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: { int i; for (i = 0; i < image->num_of_frames; i++){ if (memcmp (dimensionGUID, &(image->frames[i].frame_dimension), sizeof (CLSID)) == 0) { *count = image->frames[i].count; return Ok; } } } case ImageTypeMetafile: /* note: an empty GUID also returns 1 */ *count = 1; return Ok; default: break; } return InvalidParameter; } GpStatus GdipImageSelectActiveFrame (GpImage *image, GDIPCONST GUID *dimensionGUID, UINT index) { if (!image || !dimensionGUID) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: return gdip_bitmap_setactive (image, dimensionGUID, index); case ImageTypeMetafile: /* any index value or GUID returns Ok */ return Ok; default: return InvalidParameter; } } static GpStatus gdip_rotate_orthogonal_flip_x (GpImage *image, int angle, BOOL flip_x) { BYTE *rotated; BYTE *source; BYTE *target; int x, y; int source_stride, source_height, source_width, source_pixel_delta, source_interscan_delta; int target_stride, target_height, target_width, target_pixel_delta, target_interscan_delta; int initial_source_offset, initial_target_offset; int components; int depth; int pixel_size; components = gdip_get_pixel_format_components (image->active_bitmap->pixel_format); depth = gdip_get_pixel_format_depth (image->active_bitmap->pixel_format); pixel_size = components * depth / 8; source_stride = image->active_bitmap->stride; source_width = image->active_bitmap->width; source_height = image->active_bitmap->height; source_pixel_delta = pixel_size; source_interscan_delta = source_stride - source_width * pixel_size; initial_source_offset = 0; if (angle == 180) { target_width = source_width; target_height = source_height; } else { target_height = source_width; /* swap width & height here */ target_width = source_height; } target_stride = target_width * pixel_size; target_stride = (target_stride + 3) & ~3; switch (angle) { case 90: { target_pixel_delta = target_stride; if (flip_x) { target_interscan_delta = +pixel_size - target_stride * target_height; initial_target_offset = 0; } else { target_interscan_delta = -pixel_size - target_stride * target_height; initial_target_offset = (target_width - 1) * pixel_size; } break; } case 180: { if (flip_x) { target_pixel_delta = +pixel_size; target_interscan_delta = -target_width * pixel_size - target_stride; initial_target_offset = (target_height - 1) * target_stride; } else { target_pixel_delta = -pixel_size; target_interscan_delta = +target_width * pixel_size - target_stride; initial_target_offset = (target_height - 1) * target_stride + (target_width - 1) * pixel_size; } break; } case 270: { target_pixel_delta = -target_stride; if (flip_x) { target_interscan_delta = target_stride * target_height - pixel_size; initial_target_offset = (target_height - 1) * target_stride + (target_width - 1) * pixel_size; } else { target_interscan_delta = target_stride * target_height + pixel_size; initial_target_offset = (target_height - 1) * target_stride; } break; } default: { if (flip_x) { return gdip_flip_x (image); } else { return Ok; } } } rotated = GdipAlloc (target_height * target_stride); if (rotated == NULL) { return OutOfMemory; } source = initial_source_offset + (BYTE *) image->active_bitmap->scan0; target = initial_target_offset + rotated; for (y = 0; y < source_height; y++, source += source_interscan_delta, target += target_interscan_delta) { for (x = 0; x < source_width; x++, source += source_pixel_delta, target += target_pixel_delta) { copy_pixel (source, target, pixel_size); } } image->active_bitmap->stride = target_stride; image->active_bitmap->height = target_height; image->active_bitmap->width = target_width; if ((image->active_bitmap->reserved & GBD_OWN_SCAN0) != 0) { GdipFree(image->active_bitmap->scan0); } image->active_bitmap->scan0 = rotated; image->active_bitmap->reserved |= GBD_OWN_SCAN0; if (image->surface != NULL) { cairo_surface_destroy (image->surface); image->surface = NULL; } return Ok; } static GpStatus gdip_rotate_flip_packed_indexed (GpImage *image, PixelFormat pixel_format, int angle, BOOL flip_x) { BYTE *rotated; StreamingState scan[8]; BOOL scan_valid[8]; int x; int y; int i; int bits_per_pixel; int pixels_per_byte; int source_width; int source_height; BOOL aspect_inversion; int target_width; int target_height; int target_scan_size; int target_stride; bits_per_pixel = gdip_get_pixel_format_depth (pixel_format); pixels_per_byte = 8 / bits_per_pixel; source_width = image->active_bitmap->width; source_height = image->active_bitmap->height; /* Swap the width & height if needed */ aspect_inversion = ((angle % 180) != 0); target_width = aspect_inversion ? source_height : source_width; target_height = aspect_inversion ? source_width : source_height; target_scan_size = (target_width + pixels_per_byte - 1) / pixels_per_byte; target_stride = (target_scan_size + 3) & ~3; if ((angle == 180) && flip_x) { return gdip_flip_y(image); } rotated = GdipAlloc (target_height * target_stride); if (rotated == NULL) { return OutOfMemory; } if (aspect_inversion == FALSE) { int x_alignment = ((source_width - 1) % pixels_per_byte) + 1 - pixels_per_byte; int x_step = pixels_per_byte; StreamingState stream; BOOL target_starts_at_bottom = (angle == 180); int target_x_offset = target_scan_size - 1; int target_y_offset = target_starts_at_bottom ? (target_height - 1) * target_stride : 0; int target_y_offset_delta = target_starts_at_bottom ? -target_stride : +target_stride; GpStatus status = gdip_init_pixel_stream (&stream, image->active_bitmap, 0, 0, image->active_bitmap->width, image->active_bitmap->height); if (status != Ok) { GdipFree (rotated); return status; } for (y = 0; y < source_height; y++, target_y_offset += target_y_offset_delta) { BYTE *target = rotated + target_x_offset + target_y_offset; for (x = x_alignment; x < source_width; x += x_step) { int byte = 0; for (i = 0; i < pixels_per_byte; i++) { int index = x + i; if ((index >= 0) && (index < source_width)) { byte |= (gdip_pixel_stream_get_next (&stream) << 8); } byte >>= bits_per_pixel; } *target = byte; target--; } } } else { int y_alignment = ((source_height - 1) % pixels_per_byte) + 1 - pixels_per_byte; int y_step = pixels_per_byte; int byte_column = 0; int target_delta; BOOL target_starts_at_bottom = (angle == 270); BOOL target_starts_at_left = (target_starts_at_bottom ^ flip_x); if (target_starts_at_left) { y_alignment = 0; } if (target_starts_at_bottom) { target_delta = -target_stride; } else { target_delta = +target_stride; } for (y = y_alignment; y < source_height; y += y_step) { BYTE *target; for (i=0; i < pixels_per_byte; i++) { int scan_index = y + i; scan_valid[i] = ((scan_index >= 0) && (scan_index < source_height)); if (scan_valid[i]) { GpStatus status = gdip_init_pixel_stream (&scan[i], image->active_bitmap, 0, scan_index, source_width, 1); if (status != Ok) { GdipFree (rotated); return status; } } } target = rotated; if (target_starts_at_left) { target += byte_column; } else { target += target_scan_size - byte_column - 1; } if (target_starts_at_bottom) { target += (target_height - 1) * target_stride; } for (x = 0; x < source_width; x++) { int byte = 0; if (target_starts_at_left) { for (i=0; i < pixels_per_byte; i++) { byte <<= bits_per_pixel; if (scan_valid[i]) byte |= gdip_pixel_stream_get_next (&scan[i]); } } else { for (i = pixels_per_byte - 1; i >= 0; i--) { byte <<= bits_per_pixel; if (scan_valid[i]) byte |= gdip_pixel_stream_get_next (&scan[i]); } } *target = byte; target += target_delta; } byte_column++; } } image->active_bitmap->stride = target_stride; image->active_bitmap->height = target_height; image->active_bitmap->width = target_width; if ((image->active_bitmap->reserved & GBD_OWN_SCAN0) != 0) { GdipFree(image->active_bitmap->scan0); } image->active_bitmap->scan0 = rotated; image->active_bitmap->reserved |= GBD_OWN_SCAN0; /* It shouldn't be possible for an indexed image to have one, * but if it does, it needs to be killed. */ if (image->surface != NULL) { cairo_surface_destroy (image->surface); image->surface = NULL; } return Ok; } GpStatus GdipImageRotateFlip (GpImage *image, RotateFlipType type) { int angle; BOOL flip_x; if (!image) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; angle = flip_x = 0; switch (type) { case RotateNoneFlipNone:/* equivalent to Rotate180FlipXY */ return Ok; case Rotate90FlipNone: /* equivalent to Rotate270FlipXY */ angle = 90; break; case RotateNoneFlipXY: /* equivalent to Rotate180FlipNone */ angle = 180; break; case Rotate90FlipXY: /* equivalent to Rotate270FlipNone */ angle = 270; break; case RotateNoneFlipX: /* equivalent to Rotate180FlipY */ flip_x = TRUE; break; case Rotate90FlipX: /* equivalent to Rotate270FlipY */ angle = 90; flip_x = TRUE; break; case RotateNoneFlipY: /* equivalent to Rotate180FlipX */ return gdip_flip_y (image); case Rotate90FlipY: /* equivalent to Rotate270FlipX */ angle = 270; flip_x = TRUE; break; default: return NotImplemented; } if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format) && (gdip_get_pixel_format_depth (image->active_bitmap->pixel_format) < 8)) { return gdip_rotate_flip_packed_indexed (image, image->active_bitmap->pixel_format, angle, flip_x); } else { return gdip_rotate_orthogonal_flip_x (image, angle, flip_x); } } GpStatus GdipGetImagePalette (GpImage *image, ColorPalette *palette, int size) { int palette_entries; int bytes_needed; if (!image || !palette) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; if (!image->active_bitmap->palette) { /* ColorPalette definition includes one ARGB member (ARGB Entries[1]). In reality there are * Count entries allocated, where Count can be 0 (and required to substract the ARGB size) */ /* coverity[buffer_alloc] */ image->active_bitmap->palette = (ColorPalette*) GdipAlloc (sizeof(ColorPalette) - sizeof(ARGB)); image->active_bitmap->palette->Flags = 0; image->active_bitmap->palette->Count = 0; } palette_entries = image->active_bitmap->palette->Count; if (image->active_bitmap->pixel_format == PixelFormat4bppIndexed) palette_entries = 16; bytes_needed = (palette_entries - 1) * sizeof(ARGB) + sizeof(ColorPalette); if (bytes_needed > size) { return InvalidParameter; } memcpy(palette, image->active_bitmap->palette, bytes_needed); return Ok; } GpStatus GdipSetImagePalette (GpImage *image, GDIPCONST ColorPalette *palette) { int size; if (!image || !palette) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; size = (palette->Count - 1) * sizeof(ARGB) + sizeof(ColorPalette); if (!image->active_bitmap->palette || (palette->Count != image->active_bitmap->palette->Count)) { if (image->active_bitmap->palette) GdipFree (image->active_bitmap->palette); image->active_bitmap->palette = (ColorPalette*) GdipAlloc (size); } memcpy (image->active_bitmap->palette, palette, size); return Ok; } GpStatus GdipGetImagePaletteSize (GpImage *image, int* size) { int palette_entries; if (!image || !size) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return GenericError; palette_entries = (image->active_bitmap->palette) ? image->active_bitmap->palette->Count : 0; if (image->active_bitmap->pixel_format == PixelFormat4bppIndexed) palette_entries = 16; *size = (palette_entries - 1) * sizeof(ARGB) + sizeof(ColorPalette); return Ok; } GpStatus GdipGetPropertyCount (GpImage *image, UINT *propertyNumber) { if (!image || !propertyNumber) return InvalidParameter; switch (image->type) { case ImageTypeBitmap: *propertyNumber = image->active_bitmap->property_count; break; case ImageTypeMetafile: *propertyNumber = 0; break; default: return InvalidParameter; } return Ok; } GpStatus GdipGetPropertyIdList (GpImage *image, UINT propertyNumber, PROPID *list) { int i; if (!image || !list) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; if (propertyNumber != image->active_bitmap->property_count) return InvalidParameter; for (i = 0; i < propertyNumber; i++) { list[i] = image->active_bitmap->property[i].id; } return Ok; } GpStatus GdipGetPropertyItemSize (GpImage *image, PROPID propID, UINT *size) { int index; if (!image || !size) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; if (gdip_bitmapdata_property_find_id(image->active_bitmap, propID, &index) != Ok) { return PropertyNotFound; } *size = sizeof(PropertyItem) + image->active_bitmap->property[index].length; return Ok; } GpStatus GdipGetPropertyItem (GpImage *image, PROPID propID, UINT size, PropertyItem *buffer) { int index; int size_needed; if (!image || !buffer) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; if (gdip_bitmapdata_property_find_id(image->active_bitmap, propID, &index) != Ok) { return PropertyNotFound; } if (size != (sizeof(PropertyItem) + image->active_bitmap->property[index].length)) { return InvalidParameter; } memcpy(buffer, &image->active_bitmap->property[index], sizeof(PropertyItem)); buffer->value = (BYTE*)buffer + sizeof(PropertyItem); memcpy(buffer->value, image->active_bitmap->property[index].value, buffer->length); return Ok; } GpStatus GdipGetPropertySize (GpImage *image, UINT *totalBufferSize, UINT *numProperties) { UINT size; int i; if (!image || !totalBufferSize || !numProperties) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; *numProperties = image->active_bitmap->property_count; size = image->active_bitmap->property_count * sizeof(PropertyItem); for (i = 0; i < image->active_bitmap->property_count; i++) { size += image->active_bitmap->property[i].length; } *totalBufferSize = size; return Ok; } GpStatus GdipRemovePropertyItem (GpImage *image, PROPID propID) { if (!image) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; return gdip_bitmapdata_property_remove_id(image->active_bitmap, propID); } GpStatus GdipSetPropertyItem(GpImage *image, GDIPCONST PropertyItem *item) { int i; if (!image || !item) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; switch(image->image_format) { case TIF: case JPEG: case PNG: { break; } default: { return PropertyNotSupported; } } /* Check if it exists and we need to replace */ if (gdip_bitmapdata_property_find_id(image->active_bitmap, item->id, &i) != Ok) { /* We're adding a new item */ return gdip_bitmapdata_property_add(image->active_bitmap, item->id, item->length, item->type, item->value); } /* We're replacing an existing item */ if (item->length > image->active_bitmap->property[i].length) { /* We need to allocate more space for our value */ if (image->active_bitmap->property[i].value != NULL) { GdipFree(image->active_bitmap->property[i].value); } image->active_bitmap->property[i].value = GdipAlloc(item->length); if (image->active_bitmap->property[i].value == NULL) { /* We already freed the old value, remove the entry */ gdip_bitmapdata_property_remove_index(image->active_bitmap, i); return OutOfMemory; } } else if (item->length == 0) { /* Just drop the old value */ if (image->active_bitmap->property[i].value != NULL) { GdipFree(image->active_bitmap->property[i].value); image->active_bitmap->property[i].value = NULL; } } image->active_bitmap->property[i].id = item->id; image->active_bitmap->property[i].length = item->length; image->active_bitmap->property[i].type = item->type; if (item->length > 0) { memcpy(image->active_bitmap->property[i].value, item->value, item->length); } return Ok; } GpStatus GdipCloneImage (GpImage *image, GpImage **cloneImage) { if (!image || !cloneImage) return InvalidParameter; switch (image->type){ case ImageTypeBitmap: gdip_bitmap_clone (image, cloneImage); gdip_bitmap_setactive(*cloneImage, NULL, 0); return Ok; case ImageTypeMetafile: return gdip_metafile_clone ((GpMetafile*)image, (GpMetafile**)cloneImage); case ImageTypeUnknown: default: return Ok; } } int gdip_get_pixel_format_bpp (PixelFormat pixfmt) { return gdip_get_pixel_format_depth (pixfmt) * gdip_get_pixel_format_components (pixfmt); } int gdip_get_pixel_format_depth(PixelFormat pixfmt) { switch (pixfmt) { case PixelFormat16bppARGB1555: case PixelFormat16bppGrayScale: case PixelFormat16bppRGB555: case PixelFormat16bppRGB565: case PixelFormat24bppRGB: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: return 8; /* FIXME - shouldn't this be 32? - pdb */ case PixelFormat48bppRGB: case PixelFormat64bppARGB: case PixelFormat64bppPARGB: return 16; case PixelFormat8bppIndexed: return 8; case PixelFormat4bppIndexed: return 4; case PixelFormat1bppIndexed: return 1; default: break; } return 0; } int gdip_get_pixel_format_components(PixelFormat pixfmt) { switch (pixfmt) { case PixelFormat16bppARGB1555: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat64bppARGB: case PixelFormat64bppPARGB: case PixelFormat32bppRGB: /* Cairo uses four bytes for 32BPP*/ case PixelFormat24bppRGB: return 4; case PixelFormat16bppRGB555: case PixelFormat16bppRGB565: case PixelFormat48bppRGB: return 3; case PixelFormat16bppGrayScale: case PixelFormat8bppIndexed: case PixelFormat4bppIndexed: case PixelFormat1bppIndexed: return 1; default: break; } return 0; } GpStatus GdipLoadImageFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage **image) { GpImage *result = 0; GpStatus status = 0; ImageFormat format, public_format; dstream_t *loader = NULL; BYTE format_peek[MAX_CODEC_SIG_LENGTH]; int format_peek_sz; format_peek_sz = getHeaderFunc (format_peek, MAX_CODEC_SIG_LENGTH); format = get_image_format ((char *)format_peek, format_peek_sz, &public_format); switch (format) { case JPEG: loader = dstream_input_new (getBytesFunc, seekFunc); status = gdip_load_jpeg_image_from_stream_delegate (loader, &result); break; case PNG: status = gdip_load_png_image_from_stream_delegate (getBytesFunc, seekFunc, &result); break; case BMP: loader = dstream_input_new (getBytesFunc, seekFunc); status = gdip_load_bmp_image_from_stream_delegate (loader, &result); break; case TIF: status = gdip_load_tiff_image_from_stream_delegate (getBytesFunc, putBytesFunc, seekFunc, closeFunc, sizeFunc, &result); break; case GIF: status = gdip_load_gif_image_from_stream_delegate (getBytesFunc, seekFunc, &result); break; case ICON: loader = dstream_input_new (getBytesFunc, seekFunc); status = gdip_load_ico_image_from_stream_delegate (loader, &result); break; case EMF: loader = dstream_input_new (getBytesFunc, seekFunc); status = gdip_load_emf_image_from_stream_delegate (loader, &result); break; case WMF: loader = dstream_input_new (getBytesFunc, seekFunc); status = gdip_load_wmf_image_from_stream_delegate (loader, &result); break; default: /* NotImplemented looks better but this matchs MS behavior */ status = InvalidParameter; break; } if (result && (status == Ok)) result->image_format = public_format; dstream_free (loader); *image = result; if (status != Ok) { *image = NULL; } else if (result && (result->type == ImageTypeBitmap) && !result->active_bitmap) { /* If the codec didn't set the active bitmap we will */ gdip_bitmap_setactive(result, NULL, 0); } return status; } GpStatus GdipSaveImageToDelegate_linux (GpImage *image, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GDIPCONST CLSID *encoderCLSID, GDIPCONST EncoderParameters *params) { if (!image || !encoderCLSID || (image->type != ImageTypeBitmap)) return InvalidParameter; switch (gdip_get_imageformat_from_codec_clsid ((CLSID *)encoderCLSID)) { case ICON: case BMP: return gdip_save_bmp_image_to_stream_delegate (putBytesFunc, image); case PNG: return gdip_save_png_image_to_stream_delegate (putBytesFunc, image, params); case JPEG: return gdip_save_jpeg_image_to_stream_delegate (putBytesFunc, image, params); case GIF: return gdip_save_gif_image_to_stream_delegate (putBytesFunc, image, params); case TIF: return gdip_save_tiff_image_to_stream_delegate (getBytesFunc, putBytesFunc, seekFunc, closeFunc, sizeFunc, image, params); case INVALID: return UnknownImageFormat; default: return NotImplemented; } } GpStatus initCodecList (void) { BYTE *dpos, *epos; g_decoder_list = dpos = GdipAlloc (sizeof (ImageCodecInfo) * DECODERS_SUPPORTED); if (!g_decoder_list) return OutOfMemory; g_encoder_list = epos = GdipAlloc (sizeof (ImageCodecInfo) * ENCODERS_SUPPORTED); if (!g_decoder_list) { GdipFree (g_decoder_list); g_decoder_list = NULL; return OutOfMemory; } /* BMP codec (encoder+decoder) - built-in */ memcpy (dpos, gdip_getcodecinfo_bmp (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; memcpy (epos, gdip_getcodecinfo_bmp (), sizeof (ImageCodecInfo)); epos += sizeof (ImageCodecInfo); g_encoders++; /* ICO codec (decoder-only) - built-in */ memcpy (dpos, gdip_getcodecinfo_ico (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; /* JPEG codec (encoder+decoder) */ if (gdip_getcodecinfo_jpeg ()) { memcpy (dpos, gdip_getcodecinfo_jpeg(), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; memcpy (epos, gdip_getcodecinfo_jpeg(), sizeof (ImageCodecInfo)); epos += sizeof (ImageCodecInfo); g_encoders++; } /* GIF codec (encoder+decoder) */ if (gdip_getcodecinfo_gif ()) { memcpy (dpos, gdip_getcodecinfo_gif (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; memcpy (epos, gdip_getcodecinfo_gif (), sizeof (ImageCodecInfo)); epos += sizeof (ImageCodecInfo); g_encoders++; } /* TIFF codec (encoder+decoder) */ if (gdip_getcodecinfo_tiff ()) { memcpy (dpos, gdip_getcodecinfo_tiff (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; memcpy (epos, gdip_getcodecinfo_tiff (), sizeof (ImageCodecInfo)); epos += sizeof (ImageCodecInfo); g_encoders++; } /* PNG codec (encoder+decoder) */ if (gdip_getcodecinfo_png ()) { memcpy (dpos, gdip_getcodecinfo_png (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; memcpy (epos, gdip_getcodecinfo_png (), sizeof (ImageCodecInfo)); epos += sizeof (ImageCodecInfo); g_encoders++; } /* WMF codec (decoder-only) */ if (gdip_getcodecinfo_wmf ()) { memcpy (dpos, gdip_getcodecinfo_wmf (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; } /* EMF codec (decoder-only) */ if (gdip_getcodecinfo_emf ()) { memcpy (dpos, gdip_getcodecinfo_emf (), sizeof (ImageCodecInfo)); dpos += sizeof (ImageCodecInfo); g_decoders++; } return Ok; } void releaseCodecList (void) { if (g_decoder_list) { GdipFree (g_decoder_list); g_decoder_list = NULL; g_decoders = 0; } if (g_encoder_list) { GdipFree (g_encoder_list); g_encoder_list = NULL; g_encoders = 0; } } GpStatus GdipGetImageDecodersSize (UINT *numDecoders, UINT *size) { if (!numDecoders || !size) return InvalidParameter; *numDecoders = g_decoders; *size = sizeof (ImageCodecInfo) * g_decoders; return Ok; } GpStatus GdipGetImageDecoders (UINT numDecoders, UINT size, ImageCodecInfo *decoders) { if (!decoders || (numDecoders != g_decoders) || (size != sizeof (ImageCodecInfo) * g_decoders)) return GenericError; memcpy (decoders, g_decoder_list, size); return Ok; } GpStatus GdipGetImageEncodersSize (UINT *numEncoders, UINT *size) { if (!numEncoders || !size) return InvalidParameter; *numEncoders = g_encoders; *size = sizeof (ImageCodecInfo) * g_encoders; return Ok; } GpStatus GdipGetImageEncoders (UINT numEncoders, UINT size, ImageCodecInfo *encoders) { if (!encoders || (numEncoders != g_encoders) || (size != sizeof (ImageCodecInfo) * g_encoders)) return GenericError; memcpy (encoders, g_encoder_list, size); return Ok; } GpStatus GdipGetAllPropertyItems (GpImage *image, UINT totalBufferSize, UINT numProperties, PropertyItem *allItems) { int size; int i; BYTE *ptr; if (!image || !allItems) return InvalidParameter; /* GDI+ doesn't support this for metafiles */ if (image->type != ImageTypeBitmap) return NotImplemented; if (numProperties != image->active_bitmap->property_count) { return InvalidParameter; } size = image->active_bitmap->property_count * sizeof(PropertyItem); for (i = 0; i < numProperties; i++) { size += image->active_bitmap->property[i].length; } if (size != totalBufferSize) { return InvalidParameter; } ptr = (BYTE*)allItems; ptr += totalBufferSize; /* Copy the PropertyItem array */ memcpy(allItems, image->active_bitmap->property, sizeof(PropertyItem) * numProperties); /* Copy the values and fix up the value pointers in the PropertyItem array to point to them */ for (i = 0; i < numProperties; i++) { if (allItems[i].value != NULL) { ptr -= allItems[i].length; memcpy(ptr, allItems[i].value, allItems[i].length); /* Use the copied pointer, less indirection than image->active_bitmap->property[i].value */ allItems[i].value = ptr; } } return Ok; } GpStatus GdipGetEncoderParameterListSize (GpImage *image, GDIPCONST CLSID *clsidEncoder, UINT *size) { ImageFormat fmt; if (!image || !clsidEncoder || !size) return InvalidParameter; fmt = gdip_get_imageformat_from_codec_clsid ((CLSID *) clsidEncoder); switch (fmt) { case JPEG: *size = gdip_get_encoder_parameter_list_size_jpeg (); return Ok; case TIF: *size = 0; return NotImplemented; default: break; } return FileNotFound; } GpStatus GdipGetEncoderParameterList (GpImage *image, GDIPCONST CLSID *clsidEncoder, UINT size, EncoderParameters *buffer) { ImageFormat fmt; if (!image || !clsidEncoder || !buffer) return InvalidParameter; fmt = gdip_get_imageformat_from_codec_clsid ((CLSID *) clsidEncoder); switch (fmt) { case JPEG: return gdip_fill_encoder_parameter_list_jpeg (buffer, size); case TIF: return NotImplemented; default: break; } return FileNotFound; } GpStatus GdipGetImageThumbnail (GpImage *image, UINT thumbWidth, UINT thumbHeight, GpImage **thumbImage, GetThumbnailImageAbort callback, VOID *callbackData) { /* We don't really need to implement this; we've got it handled in System.Drawing directly */ return NotImplemented; } /* coverity[+alloc : arg-*1] */ GpStatus GdipLoadImageFromFileICM (GDIPCONST WCHAR* filename, GpImage **image) { return GdipLoadImageFromFile (filename, image); } const EncoderParameter * gdip_find_encoder_parameter (GDIPCONST EncoderParameters *eps, const GUID *guid) { int i; for (i = 0; i < eps->Count; i++) { if (memcmp (&(eps->Parameter[i].Guid), guid, sizeof(GUID)) == 0) return &(eps->Parameter[i]); } return NULL; } /* GDI+ 1.0 only supports multiple frames on an image for the tiff format */ GpStatus GdipSaveAdd (GpImage *image, GDIPCONST EncoderParameters* encoderParams) { if (!image || !encoderParams) return InvalidParameter; return NotImplemented; } GpStatus GdipSaveAddImage (GpImage *image, GpImage *imageNew, GDIPCONST EncoderParameters *params) { if (!image || !imageNew || !params) return InvalidParameter; return NotImplemented; } libgdiplus-2.11/src/graphics-metafile.c0000664000175000017500000004047712225470167015057 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "graphics-metafile-private.h" /* * NOTE: all parameter's validations are done inside graphics.c */ #define FIT_IN_INT16(x) (((x) >= G_MININT16) && ((x) <= G_MAXINT16)) #define EMFPLUS_FLAGS_USE_SINGLE 0x0000 #define EMFPLUS_FLAGS_FILLMODE_WINDING 0x2000 #define EMFPLUS_FLAGS_USE_INT16 0x4000 #define EMFPLUS_FLAGS_USE_ARGB 0x8000 static BOOL RectFitInInt16 (int x, int y, int width, int height) { return (FIT_IN_INT16(x) && FIT_IN_INT16(y) && FIT_IN_INT16(width) && FIT_IN_INT16(height)); } static BOOL GpRectFitInInt16 (GDIPCONST GpRect *rect) { return (FIT_IN_INT16(rect->X) && FIT_IN_INT16(rect->Y) && FIT_IN_INT16(rect->Width) && FIT_IN_INT16(rect->Height)); } static BOOL GpRectArrayFitInInt16 (GDIPCONST GpRect *rects, int count) { GpRect *r = (GpRect*) rects; int i; for (i = 0; i < count; i++, r++) { if (!GpRectFitInInt16 (r)) return FALSE; } return TRUE; } static GpRectF * convert_rects (GDIPCONST GpRect *rects, int count) { int i; GpRectF *result = (GpRectF *) GdipAlloc (sizeof (GpRectF) * count); if (!result) return NULL; for (i = 0; i < count; i++) { result [i].X = rects [i].X; result [i].Y = rects [i].Y; result [i].Width = rects [i].Width; result [i].Height = rects [i].Height; } return result; } static BOOL GetARGBFromBrush (GDIPCONST GpBrush* brush, ARGB *color) { /* if brush is a solid brush we can use (and return) it's color, otherwise it must be treated as an object */ return FALSE; } /* DrawArcs - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawArc.html */ GpStatus metafile_DrawArc (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { /* TODO */ return Ok; } GpStatus metafile_DrawArcI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_DrawArc (graphics, pen, x, y, width, height, startAngle, sweepAngle); /* TODO */ return Ok; } /* DrawBeziers - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawBeziers.html */ GpStatus metafile_DrawBezier (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { /* TODO */ return Ok; } GpStatus metafile_DrawBezierI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { /* TODO */ return Ok; } GpStatus metafile_DrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { /* TODO */ return Ok; } GpStatus metafile_DrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { /* TODO */ return Ok; } /* * DrawClosedCurve - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawClosedCurve.html */ GpStatus metafile_DrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count, float tension) { /* TODO */ return Ok; } GpStatus metafile_DrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count, float tension) { /* TODO */ return Ok; } /* * FillClosedCurve - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillClosedCurve.html */ GpStatus metafile_FillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, float tension) { /* TODO */ return Ok; } GpStatus metafile_FillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, float tension) { /* TODO */ return Ok; } /* * DrawCurve - ? */ GpStatus metafile_DrawCurve3 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, int offset, int numOfSegments, float tension) { /* TODO */ return Ok; } GpStatus metafile_DrawCurve3I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, int offset, int numOfSegments, float tension) { /* TODO */ return Ok; } /* * DrawEllipse - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawEllipse.html */ GpStatus metafile_DrawEllipse (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { /* TODO */ return Ok; } GpStatus metafile_DrawEllipseI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_DrawEllipse (graphics, pen, x, y, width, height); /* TODO */ return Ok; } /* * FillEllipse - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillEllipse.html */ GpStatus metafile_FillEllipse (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { /* TODO */ return Ok; } GpStatus metafile_FillEllipseI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_FillEllipse (graphics, brush, x, y, width, height); /* TODO */ return Ok; } /* * DrawLines - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawLines.html */ GpStatus metafile_DrawLine (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) { /* TODO */ return Ok; } GpStatus metafile_DrawLineI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2) { /* TODO */ return Ok; } GpStatus metafile_DrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { /* TODO */ return Ok; } GpStatus metafile_DrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { /* TODO */ return Ok; } /* * DrawPath - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawPath.html */ GpStatus metafile_DrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path) { /* TODO */ return Ok; } /* * FillPath - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillPath.html */ GpStatus metafile_FillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path) { /* TODO */ return Ok; } /* * DrawPie - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawPie.html */ GpStatus metafile_DrawPie (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { /* TODO */ return Ok; } GpStatus metafile_DrawPieI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_DrawPie (graphics, pen, x, y, width, height, startAngle, sweepAngle); /* TODO */ return Ok; } /* * FillPie - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillPie.html */ GpStatus metafile_FillPie (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height, float startAngle, float sweepAngle) { /* TODO */ return Ok; } GpStatus metafile_FillPieI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height, float startAngle, float sweepAngle) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_FillPie (graphics, brush, x, y, width, height, startAngle, sweepAngle); /* TODO */ return Ok; } /* * DrawPolygon - ? */ GpStatus metafile_DrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { /* TODO */ return Ok; } GpStatus metafile_DrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { /* TODO */ return Ok; } /* * FillPolygon - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillPolygon.html */ GpStatus metafile_FillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, FillMode fillMode) { /* TODO */ return Ok; } GpStatus metafile_FillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, FillMode fillMode) { /* TODO */ return Ok; } /* * DrawRects - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawRects.html */ GpStatus metafile_DrawRectangle (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { /* TODO */ return Ok; } GpStatus metafile_DrawRectangleI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_DrawRectangleI (graphics, pen, x, y, width, height); /* TODO */ return Ok; } GpStatus metafile_DrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, int count) { /* TODO */ return Ok; } GpStatus metafile_DrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, int count) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!GpRectArrayFitInInt16 (rects, count)) { GpStatus status; GpRectF *rf = convert_rects (rects, count); if (!rf) return OutOfMemory; status = metafile_DrawRectangles (graphics, pen, rf, count); GdipFree (rf); return status; } /* TODO */ return Ok; } /* * FillRects - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillRects.html */ GpStatus metafile_FillRectangle (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { /* TODO */ return Ok; } GpStatus metafile_FillRectangleI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!RectFitInInt16 (x, y, width, height)) return metafile_FillRectangle (graphics, brush, x, y, width, height); /* TODO */ return Ok; } GpStatus metafile_FillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, int count) { /* TODO */ return Ok; } GpStatus metafile_FillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, int count) { /* every rectangle must fit into a INT16 or we must use the float version */ if (!GpRectArrayFitInInt16 (rects, count)) { GpStatus status; GpRectF *rf = convert_rects (rects, count); if (!rf) return OutOfMemory; status = metafile_FillRectangles (graphics, brush, rf, count); GdipFree (rf); return status; } /* TODO */ return Ok; } /* * FillRegion - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillRegion.html */ GpStatus metafile_FillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region) { /* TODO */ return Ok; } /* * Clear - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/Clear.html */ GpStatus metafile_GraphicsClear (GpGraphics *graphics, ARGB color) { /* TODO */ return Ok; } /* * SetCompositingMode - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetCompositingMode.html */ GpStatus metafile_SetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode) { /* TODO */ return Ok; } /* * SetCompositingQuality - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetCompositingQuality.html */ GpStatus metafile_SetCompositingQuality (GpGraphics *graphics, CompositingQuality compositingQuality) { /* TODO */ return Ok; } /* * SetInterpolationMode - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetInterpolationMode.html */ GpStatus metafile_SetInterpolationMode (GpGraphics *graphics, InterpolationMode interpolationMode) { /* TODO */ return Ok; } /* * SetPixelOffsetMode - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetPixelOffsetMode.html */ GpStatus metafile_SetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode pixelOffsetMode) { /* TODO */ return Ok; } /* * SetPageTransform (SetPageUnit+SetPageScale) - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetPageTransform.html */ GpStatus metafile_SetPageTransform (GpGraphics *graphics, GpUnit unit, float scale) { /* TODO */ return Ok; } /* * SetRenderingOrigin - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetRenderingOrigin.html */ GpStatus metafile_SetRenderingOrigin (GpGraphics *graphics, int x, int y) { /* TODO */ return Ok; } /* * SetSmoothingMode - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetAntiAliasMode.html */ GpStatus metafile_SetSmoothingMode (GpGraphics *graphics, SmoothingMode mode) { /* TODO */ return Ok; } /* * GdipSetTextContrast - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetTextContrast.html */ GpStatus metafile_SetTextContrast (GpGraphics *graphics, UINT contrast) { /* TODO */ return Ok; } /* * SetTextRenderingHint - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetTextRenderingHint.html */ GpStatus metafile_SetTextRenderingHint (GpGraphics *graphics, TextRenderingHint mode) { /* TODO */ return Ok; } /* * ResetClip - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/ResetClip.html */ GpStatus metafile_ResetClip (GpGraphics *graphics) { /* TODO */ return Ok; } /* * SetClipPath - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetClipPath.html */ GpStatus metafile_SetClipPath (GpGraphics *graphics, GpPath *path, CombineMode combineMode) { /* TODO */ return Ok; } /* * SetClipRect - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetClipRect.html */ GpStatus metafile_SetClipRect (GpGraphics *graphics, float x, float y, float width, float height, CombineMode combineMode) { /* TODO */ return Ok; } /* * SetClipRegion - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetClipRegion.html */ GpStatus metafile_SetClipRegion (GpGraphics *graphics, GpRegion *region, CombineMode combineMode) { /* TODO */ return Ok; } /* * OffsetClip - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/OffsetClip.html */ GpStatus metafile_TranslateClip (GpGraphics *graphics, float dx, float dy) { /* TODO */ return Ok; } /* * ResetWorldTransform - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/ResetWorldTransform.html */ GpStatus metafile_ResetWorldTransform (GpGraphics *graphics) { /* TODO */ return Ok; } /* * SetWorldTransform - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/SetWorldTransform.html */ GpStatus metafile_SetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) { /* TODO */ return Ok; } /* * http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/MultiplyWorldTransform.html */ GpStatus metafile_MultiplyWorldTransform (GpGraphics *graphics, GpMatrix *matrix, GpMatrixOrder order) { /* TODO */ return Ok; } /* * RotateWorldTransform - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/RotateWorldTransform.html */ GpStatus metafile_RotateWorldTransform (GpGraphics *graphics, float angle, GpMatrixOrder order) { /* TODO */ return Ok; } /* * ScaleWorldTransform - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/ScaleWorldTransform.html */ GpStatus metafile_ScaleWorldTransform (GpGraphics *graphics, float sx, float sy, GpMatrixOrder order) { /* TODO */ return Ok; } /* * TranslateWorldTransform - http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/TranslateWorldTransform.html */ GpStatus metafile_TranslateWorldTransform (GpGraphics *graphics, float dx, float dy, GpMatrixOrder order) { /* TODO */ return Ok; } libgdiplus-2.11/src/lineargradientbrush.h0000664000175000017500000001100112225470167015511 00000000000000/* * lineargradientbrush.h * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * Copyright (C) 2004, 2007 Novell, Inc. http://www.novell.com */ #ifndef __LINEAR_GRADIENT_H__ #define __LINEAR_GRADIENT_H__ #include "brush-private.h" typedef enum { LinearGradientModeHorizontal = 0, /* angle = 0 deg */ LinearGradientModeVertical = 1, /* angle = 90 deg */ LinearGradientModeForwardDiagonal = 2, /* angle = 45 deg */ LinearGradientModeBackwardDiagonal = 3 /* angle = 135 deg */ } LinearGradientMode; GpStatus GdipCreateLineBrushI (GDIPCONST GpPoint *point1, GDIPCONST GpPoint *point2, ARGB color1, ARGB color2, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipCreateLineBrush (GDIPCONST GpPointF *point1, GDIPCONST GpPointF *point2, ARGB color1, ARGB color2, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipCreateLineBrushFromRectI (GDIPCONST GpRect *rect, ARGB color1, ARGB color2, LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipCreateLineBrushFromRect (GDIPCONST GpRectF *rect, ARGB color1, ARGB color2, LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipCreateLineBrushFromRectWithAngleI (GDIPCONST GpRect *rect, ARGB color1, ARGB color2, float angle, BOOL isAngleScalable, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipCreateLineBrushFromRectWithAngle (GDIPCONST GpRectF *rect, ARGB color1, ARGB color2, float angle, BOOL isAngleScalable, GpWrapMode wrapMode, GpLineGradient **lineGradient); GpStatus GdipGetLineBlendCount (GpLineGradient *brush, int *count); GpStatus GdipSetLineBlend (GpLineGradient *brush, GDIPCONST float *blend, GDIPCONST float *positions, int count); GpStatus GdipGetLineBlend (GpLineGradient *brush, float *blend, float *positions, int count); GpStatus GdipSetLineGammaCorrection (GpLineGradient *brush, BOOL useGammaCorrection); GpStatus GdipGetLineGammaCorrection (GpLineGradient *brush, BOOL *useGammaCorrection); GpStatus GdipGetLinePresetBlendCount (GpLineGradient *brush, int *count); GpStatus GdipSetLinePresetBlend (GpLineGradient *brush, GDIPCONST ARGB *blend, GDIPCONST float *positions, int count); GpStatus GdipGetLinePresetBlend (GpLineGradient *brush, ARGB *blend, float *positions, int count); GpStatus GdipSetLineColors (GpLineGradient *brush, ARGB color1, ARGB color2); GpStatus GdipGetLineColors (GpLineGradient *brush, ARGB *colors); GpStatus GdipGetLineRectI (GpLineGradient *brush, GpRect *rect); GpStatus GdipGetLineRect (GpLineGradient * brush, GpRectF *rect); GpStatus GdipSetLineTransform (GpLineGradient *brush, GDIPCONST GpMatrix *matrix); GpStatus GdipGetLineTransform (GpLineGradient *brush, GpMatrix *matrix); GpStatus GdipSetLineWrapMode (GpLineGradient *brush, GpWrapMode wrapMode); GpStatus GdipGetLineWrapMode (GpLineGradient *brush, GpWrapMode *wrapMode); GpStatus GdipSetLineLinearBlend (GpLineGradient *brush, float focus, float scale); GpStatus GdipSetLineSigmaBlend (GpLineGradient *brush, float focus, float scale); GpStatus GdipMultiplyLineTransform (GpLineGradient *brush, GpMatrix *matrix, GpMatrixOrder order); GpStatus GdipResetLineTransform (GpLineGradient *brush); GpStatus GdipRotateLineTransform (GpLineGradient *brush, float angle, GpMatrixOrder order); GpStatus GdipScaleLineTransform (GpLineGradient *brush, float sx, float sy, GpMatrixOrder order); GpStatus GdipTranslateLineTransform (GpLineGradient *brush, float dx, float dy, GpMatrixOrder order); #endif libgdiplus-2.11/src/general.h0000664000175000017500000000364212225470167013106 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __GENERAL_H__ #define __GENERAL_H__ #include "win32structs.h" /* Startup / shutdown */ typedef struct { UINT32 GdiplusVersion; /* must be 1 */ void* DebugEventCallback; /* ignored in libgdiplus */ BOOL SuppressBackgroundThread; /* ignored in libgdiplus */ BOOL SuppressExternalCodecs; /* ignored in libgdiplus */ } GdiplusStartupInput; typedef struct { void* NotificationHook; /* ignored in libgdiplus */ void* NotificationUnhook; /* ignored in libgdiplus */ } GdiplusStartupOutput; GpStatus GdiplusStartup (ULONG_PTR *token, const GdiplusStartupInput *input, GdiplusStartupOutput *output); void GdiplusShutdown (ULONG_PTR token); /* Memory / public API */ void* GdipAlloc (size_t size); void GdipFree (void *ptr); #endif libgdiplus-2.11/src/metafile.c0000664000175000017500000015070712225470167013257 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "metafile-private.h" #include "solidbrush-private.h" #include "graphics.h" #include "graphics-path-private.h" #include "pen.h" //#define DEBUG_METAFILE /* http://wvware.sourceforge.net/caolan/SaveDC.html */ GpStatus gdip_metafile_SaveDC (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("SaveDC"); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/SetBkMode.html */ GpStatus gdip_metafile_SetBkMode (MetafilePlayContext *context, DWORD bkMode) { #ifdef DEBUG_METAFILE printf ("SetBkMode %d", bkMode); #endif /* TODO - currently unused elsewhere */ context->bk_mode = bkMode; return Ok; } /* http://wvware.sourceforge.net/caolan/SetMapMode.html */ GpStatus gdip_metafile_SetMapMode (MetafilePlayContext *context, DWORD mode) { GpStatus status; float scale; #ifdef DEBUG_METAFILE printf ("SetMapMode %d", mode); #endif context->map_mode = mode; switch (mode) { case MM_HIENGLISH: /* 1 logical unit == 0.001 inch */ scale = gdip_get_display_dpi () * 0.001; break; case MM_LOENGLISH: /* 1 logical unit == 0.01 inch */ scale = gdip_get_display_dpi () * 0.01; break; case MM_HIMETRIC: /* 1 logical unit == 0.01 mm */ scale = gdip_get_display_dpi () / METAFILE_DIMENSION_FACTOR; break; case MM_LOMETRIC: /* 1 logical unit == 0.1 mm */ scale = 10 * gdip_get_display_dpi () / METAFILE_DIMENSION_FACTOR; break; case MM_TWIPS: /* 1 logical point == 1/1440 inch (1/20 of a "old" printer point ;-) */ scale = gdip_get_display_dpi () / 1440; break; case MM_TEXT: default: /* 1 logical unit == 1 pixel */ scale = 1.0f; context->map_mode = MM_TEXT; break; case MM_ISOTROPIC: case MM_ANISOTROPIC: /* SetWindowExt will calculate the correct ratio */ return Ok; } /* this isn't cumulative (and we get a lot of "junk" calls) */ GdipSetWorldTransform (context->graphics, &context->matrix); status = GdipScaleWorldTransform (context->graphics, scale, scale, MatrixOrderPrepend); #ifdef DEBUG_METAFILE_2 printf ("\n\tGdipScaleWorldTransform sx %g, sy %g (status %d)", scale, scale, status); #endif return status; } /* http://wvware.sourceforge.net/caolan/SetROP2.html */ GpStatus gdip_metafile_SetROP2 (MetafilePlayContext *context, DWORD rop) { #ifdef DEBUG_METAFILE printf ("SetROP2 %d", rop); #endif /* TODO */ return Ok; } /* http://www.ousob.com/ng/win2api/ng30859.php */ GpStatus gdip_metafile_SetRelabs (MetafilePlayContext *context, DWORD mode) { #ifdef DEBUG_METAFILE printf ("SetRelabs %d", mode); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/SetPolyFillMode.html */ GpStatus gdip_metafile_SetPolyFillMode (MetafilePlayContext *context, DWORD fillmode) { #ifdef DEBUG_METAFILE printf ("SetPolyFillMode %d", fillmode); #endif switch (fillmode) { case WINDING: context->fill_mode = FillModeWinding; break; default: g_warning ("Unknown fillmode %d, assuming ALTERNATE", fillmode); /* fall through */ case ALTERNATE: context->fill_mode = FillModeAlternate; break; } return Ok; } /* http://wvware.sourceforge.net/caolan/SetStretchBltMode.html */ GpStatus gdip_metafile_SetStretchBltMode (MetafilePlayContext *context, int iStretchMode) { #ifdef DEBUG_METAFILE printf ("SetStretchBltMode %d", iStretchMode); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/RestoreDC.html */ GpStatus gdip_metafile_RestoreDC (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("RestoreDC"); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/SelectObject.html */ GpStatus gdip_metafile_SelectObject (MetafilePlayContext *context, DWORD slot) { // EMF have some stock objects that do not requires creation if (slot & ENHMETA_STOCK_OBJECT) { #ifdef DEBUG_METAFILE printf ("SelectObject stock #%X", slot); #endif switch (slot - ENHMETA_STOCK_OBJECT) { case WHITE_BRUSH: case LTGRAY_BRUSH: case GRAY_BRUSH: case DKGRAY_BRUSH: case BLACK_BRUSH: case NULL_BRUSH: context->selected_brush = slot; break; case WHITE_PEN: case BLACK_PEN: case NULL_PEN: context->selected_pen = slot; break; case OEM_FIXED_FONT: case ANSI_FIXED_FONT: case ANSI_VAR_FONT: case SYSTEM_FONT: case DEVICE_DEFAULT_FONT: case SYSTEM_FIXED_FONT: context->selected_font = slot; break; case DEFAULT_PALETTE: context->selected_palette = slot; break; default: return InvalidParameter; } return Ok; } #ifdef DEBUG_METAFILE printf ("SelectObject %d (out of %d slots)", slot, context->objects_count); #endif if (slot >= context->objects_count) { g_warning ("SelectObject %d, invalid slot number.", slot); return InvalidParameter; } /* FIXME - what's first ? the created object or what's in the slot ? */ switch (context->created.type) { case METAOBJECT_TYPE_EMPTY: /* if nothing is "created" (and not yet selected into a slot) then we "reselect" the object */ switch (context->objects [slot].type) { case METAOBJECT_TYPE_EMPTY: g_warning ("SelectObject %d, no created object, slot empty.", slot); break; case METAOBJECT_TYPE_PEN: context->selected_pen = slot; break; case METAOBJECT_TYPE_BRUSH: context->selected_brush = slot; break; } return Ok; case METAOBJECT_TYPE_PEN: context->selected_pen = slot; break; case METAOBJECT_TYPE_BRUSH: context->selected_brush = slot; break; } context->objects [slot].type = context->created.type; context->objects [slot].ptr = context->created.ptr; context->created.type = METAOBJECT_TYPE_EMPTY; context->created.ptr = NULL; return Ok; } GpStatus gdip_metafile_ModifyWorldTransform (MetafilePlayContext *context, XFORM *lpXform, DWORD iMode) { GpMatrix matrix; GpMatrixOrder order; switch (iMode) { case MWT_IDENTITY: /* This is a reset and it ignores lpXform in this case */ /* we can't use GdipResetWorldTransform as we still want the original parameters */ return GdipSetWorldTransform (context->graphics, &context->matrix); case MWT_LEFTMULTIPLY: order = MatrixOrderPrepend; break; case MWT_RIGHTMULTIPLY: order = MatrixOrderPrepend; break; default: return InvalidParameter; } if (!lpXform) return InvalidParameter; matrix.xx = lpXform->eM11; matrix.yx = lpXform->eM12; matrix.xy = lpXform->eM21; matrix.yy = lpXform->eM22; matrix.x0 = lpXform->eDx; matrix.y0 = lpXform->eDy; return GdipMultiplyWorldTransform (context->graphics, &matrix, order); } /* http://wvware.sourceforge.net/caolan/SetTextAlign.html */ GpStatus gdip_metafile_SetTextAlign (MetafilePlayContext *context, DWORD textalign) { #ifdef DEBUG_METAFILE printf ("SetTextAlign %d", textalign); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/DeleteObject.html */ GpStatus gdip_metafile_DeleteObject (MetafilePlayContext *context, DWORD slot) { GpStatus status = Ok; GpMetafile *metafile = context->metafile; MetaObject *obj; if (slot >= context->objects_count) { g_warning ("DeleteObject failure"); return InvalidParameter; } obj = &context->objects [slot]; switch (obj->type) { case METAOBJECT_TYPE_PEN: status = GdipDeletePen ((GpPen*)obj->ptr); break; case METAOBJECT_TYPE_BRUSH: status = GdipDeleteBrush ((GpBrush*)obj->ptr); break; case METAOBJECT_TYPE_EMPTY: break; } #ifdef DEBUG_METAFILE printf ("DeleteObject %d (type %d, ptr %p, status %d)", slot, obj->type, obj->ptr, status); #endif obj->type = METAOBJECT_TYPE_EMPTY; obj->ptr = NULL; return status; } /* http://wvware.sourceforge.net/caolan/SetBkColor.html */ GpStatus gdip_metafile_SetBkColor (MetafilePlayContext *context, DWORD color) { #ifdef DEBUG_METAFILE printf ("SetBkColor %X", color); #endif /* TODO - currently unused elsewhere */ context->bk_color = color; return Ok; } /* http://wvware.sourceforge.net/caolan/SetWindowOrg.html */ GpStatus gdip_metafile_SetWindowOrg (MetafilePlayContext *context, int x, int y) { #ifdef DEBUG_METAFILE printf ("SetWindowOrg X: %d, Y: %d", x, y); #endif /* TODO */ return Ok; } /* http://wvware.sourceforge.net/caolan/SetWindowExt.html */ GpStatus gdip_metafile_SetWindowExt (MetafilePlayContext *context, int height, int width) { GpStatus status; float sx, sy; #ifdef DEBUG_METAFILE printf ("SetWindowExt height %d, width %d", height, width); #endif switch (context->map_mode) { case MM_ISOTROPIC: sx = (float)context->metafile->metafile_header.Width / width; sy = (float)context->metafile->metafile_header.Height / height; /* keeps ratio to 1:1 */ if (sx < sy) sy = sx; break; case MM_ANISOTROPIC: sx = (float)context->metafile->metafile_header.Width / width; sy = (float)context->metafile->metafile_header.Height / height; break; default: /* most cases are handled by SetMapMode */ return Ok; } /* this isn't cumulative (and we get a lot of "junk" calls) */ GdipSetWorldTransform (context->graphics, &context->matrix); status = GdipScaleWorldTransform (context->graphics, sx, sy, MatrixOrderPrepend); #ifdef DEBUG_METAFILE_2 printf ("\n\tGdipScaleWorldTransform sx %g, sy %g (status %d)", sx, sy, status); #endif return status; } /* http://wvware.sourceforge.net/caolan/LineTo.html */ GpStatus gdip_metafile_LineTo (MetafilePlayContext *context, int x, int y) { GpStatus status; #ifdef DEBUG_METAFILE printf ("LineTo %s%d, %d", context->use_path ? "Path " : " ", x, y); #endif if (context->use_path) { status = GdipAddPathLine (context->path, context->current_x, context->current_y, x, y); } else { GpPen *pen = gdip_metafile_GetSelectedPen (context); status = GdipDrawLine (context->graphics, pen, context->current_x, context->current_y, x, y); } context->current_x = x; context->current_y = y; return status; } /* http://wvware.sourceforge.net/caolan/MoveTo.html */ GpStatus gdip_metafile_MoveTo (MetafilePlayContext *context, int x, int y) { #ifdef DEBUG_METAFILE printf ("MoveTo X: %d, Y: %d", x, y); #endif /* seems to always be called before Arc but, according to documentation, Arc doesn't depend on the current cursor position */ context->current_x = x; context->current_y = y; return Ok; } GpStatus gdip_metafile_SetMiterLimit (MetafilePlayContext *context, float eNewLimit, float *peOldLimit) { if (peOldLimit) *peOldLimit = context->miter_limit; /* GDI+ keeps the miter limit with it's pen, not the context, definition */ context->miter_limit = eNewLimit; return Ok; } /* http://wvware.sourceforge.net/caolan/CreatePenIndirect.html */ GpStatus gdip_metafile_CreatePenIndirect (MetafilePlayContext *context, DWORD style, DWORD width, DWORD color) { GpStatus status; GpPen *pen = NULL; GpLineCap line_cap = LineCapRound; GpLineJoin line_join = LineJoinRound; int s = style & PS_STYLE_MASK; #ifdef DEBUG_METAFILE printf ("CreatePenIndirect style %d, width %d, color %X", style, width, color); #endif if (s == PS_NULL) color &= 0x00FFFFFF; else color |= 0xFF000000; if (width > 1) { /* style is always solid for width > 1 */ status = GdipCreatePen1 (color, width, UnitPixel, &pen); } else { /* 0 isn't a mistake, this ensure we have a "real" pixel-wide line drawn */ status = GdipCreatePen1 (color, 0, UnitPixel, &pen); switch (s) { default: g_warning ("Invalid pen style %d, style & PS_STYLE_MASK %d", style, s); /* fall through */ case PS_NULL: case DashStyleSolid: break; case DashStyleDash: case DashStyleDot: case DashStyleDashDot: case DashStyleDashDotDot: if (status == Ok) status = GdipSetPenDashStyle (pen, s); break; } } if (status != Ok) { if (pen) GdipDeletePen (pen); return status; } /* at this stage we got a pen, so we won't abort drawing on it's style */ s = (style & PS_ENDCAP_MASK); switch (s) { default: g_warning ("Invalid pen endcap, style %d, (style & PS_ENDCAP_MASK) %d", style, s); /* fall through */ case PS_ENDCAP_ROUND: line_cap = LineCapRound; break; case PS_ENDCAP_SQUARE: line_cap = LineCapSquare; break; case PS_ENDCAP_FLAT: line_cap = LineCapFlat; break; } GdipSetPenStartCap (pen, line_cap); GdipSetPenEndCap (pen, line_cap); s = (style & PS_JOIN_MASK); switch (s) { default: g_warning ("Invalid pen join, style %d, (style & PS_JOIN_MASK) %d", style, s); /* fall through */ case PS_JOIN_ROUND: line_join = LineJoinRound; break; case PS_JOIN_BEVEL: line_join = LineJoinBevel; break; case PS_JOIN_MITER: line_join = LineJoinMiter; break; } GdipSetPenLineJoin (pen, line_join); context->created.type = METAOBJECT_TYPE_PEN; context->created.ptr = pen; return Ok; } GpStatus gdip_metafile_ExtCreatePen (MetafilePlayContext *context, DWORD dwPenStyle, DWORD dwWidth, CONST LOGBRUSH *lplb, DWORD dwStyleCount, CONST DWORD *lpStyle) { /* TODO - there's more cases to consider */ return gdip_metafile_CreatePenIndirect (context, dwPenStyle, dwWidth, lplb->lbColor); } /* http://wvware.sourceforge.net/caolan/CreateBrushIndirect.html */ GpStatus gdip_metafile_CreateBrushIndirect (MetafilePlayContext *context, DWORD style, DWORD color, DWORD hatch) { GpStatus status = Ok; GpSolidFill *brush; switch (style) { case BS_SOLID: color |= 0xFF000000; status = GdipCreateSolidFill (color, &brush); break; case BS_NULL: color &= 0x00FFFFFF; status = GdipCreateSolidFill (color, &brush); break; default: g_warning ("gdip_metafile_CreateBrushIndirect unimplemented style %d", style); status = GdipCreateSolidFill (color, &brush); break; } #ifdef DEBUG_METAFILE printf ("CreateBrushIndirect style %d, color %X, hatch %d (%p, status %d)", style, color, hatch, brush, status); #endif context->created.type = METAOBJECT_TYPE_BRUSH; context->created.ptr = brush; return status; } /* http://wvware.sourceforge.net/caolan/Arc.html */ GpStatus gdip_metafile_Arc (MetafilePlayContext *context, int left, int top, int right, int bottom, int xstart, int ystart, int xend, int yend) { #ifdef DEBUG_METAFILE printf ("Arc left %d, top %d, right %d, bottom %d, xstart %d, ystart %d, xend %d, yend %d", left, top, right, bottom, xstart, ystart, xend, yend); #endif /* don't draw if the bounds are empty (width or height) */ if ((right - left <= 0) || (bottom = top <= 0)) return Ok; return GdipDrawArc (context->graphics, gdip_metafile_GetSelectedPen (context), left, top, (right - left), (bottom - top), atan2 (ystart, xstart), atan2 (yend, xend)); } /* http://wvware.sourceforge.net/caolan/ora-wmf.html */ GpStatus gdip_metafile_StretchDIBits (MetafilePlayContext *context, int XDest, int YDest, int nDestWidth, int nDestHeight, int XSrc, int YSrc, int nSrcWidth, int nSrcHeight, CONST void *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage, DWORD dwRop) { GpStatus status = OutOfMemory; GpImage *image = NULL; MemorySource ms; #ifdef DEBUG_METAFILE printf ("StretchDIBits\n\t[XDest %d, YDest %d, nDestWidth %d, nDestHeight %d]", XDest, YDest, nDestWidth, nDestHeight); printf ("\n\t[XSrc %d, YSrc %d, nSrcWidth %d, nSrcHeight %d]", XSrc, YSrc, nSrcWidth, nSrcHeight); printf ("\n\tlpBits %p, lpBitsInfo %p, iUsage %d, dwRop %d", lpBits, lpBitsInfo, iUsage, dwRop); printf ("\n\tBITMAPINFO\n\t\tSize: %d", lpBitsInfo->bmiHeader.biSize); printf ("\n\t\tWidth: %d", lpBitsInfo->bmiHeader.biWidth); printf ("\n\t\tHeight: %d", lpBitsInfo->bmiHeader.biHeight); printf ("\n\t\tPlanes: %d", lpBitsInfo->bmiHeader.biPlanes); printf ("\n\t\tBitCount: %d", lpBitsInfo->bmiHeader.biBitCount); printf ("\n\t\tCompression: %d", lpBitsInfo->bmiHeader.biCompression); printf ("\n\t\tSizeImage: %d", lpBitsInfo->bmiHeader.biSizeImage); printf ("\n\t\tXPelsPerMeter: %d", lpBitsInfo->bmiHeader.biXPelsPerMeter); printf ("\n\t\tYPelsPerMeter: %d", lpBitsInfo->bmiHeader.biXPelsPerMeter); printf ("\n\t\tClrUsed: %d", lpBitsInfo->bmiHeader.biClrUsed); printf ("\n\t\tClrImportant: %d", lpBitsInfo->bmiHeader.biClrImportant); #endif ms.ptr = (BYTE*)lpBitsInfo; ms.size = lpBitsInfo->bmiHeader.biSizeImage; ms.pos = 0; status = gdip_read_bmp_image (&ms, &image, Memory); if (status == Ok) { status = GdipDrawImageRectRect (context->graphics, image, context->x + XDest, context->y + YDest, context->width, context->height, XSrc, YSrc, nSrcWidth, nSrcHeight, UnitPixel, NULL, NULL, NULL); } if (image) GdipDisposeImage (image); return status; } /* * Return the selected GDI+ Pen to draw on the metafile or NULL if none is selected/valid. */ GpPen* gdip_metafile_GetSelectedPen (MetafilePlayContext *context) { GpPen *pen; // EMF have some stock objects that do not requires explicit creation if (context->selected_pen & ENHMETA_STOCK_OBJECT) { switch (context->selected_pen - ENHMETA_STOCK_OBJECT) { case WHITE_PEN: if (!context->stock_pen_white) { if (GdipCreatePen1 (0xFFFFFFFF, 0, UnitPixel, &context->stock_pen_white) != Ok) return NULL; } pen = context->stock_pen_white; break; case BLACK_PEN: if (!context->stock_pen_black) { if (GdipCreatePen1 (0xFF000000, 0, UnitPixel, &context->stock_pen_black) != Ok) return NULL; } pen = context->stock_pen_black; break; case NULL_PEN: if (!context->stock_pen_null) { if (GdipCreatePen1 (0x00000000, 0, UnitPixel, &context->stock_pen_null) != Ok) return NULL; } pen = context->stock_pen_null; break; default: return NULL; } } else { if ((context->selected_pen < 0) || (context->selected_pen >= context->objects_count)) { g_warning ("Invalid pen handle %d [0..%d[", context->selected_pen, context->objects_count); return NULL; } if (context->objects [context->selected_pen].type != METAOBJECT_TYPE_PEN) { g_warning ("Wrong object type %d, expected pen (%d)", context->objects [context->selected_pen].type, METAOBJECT_TYPE_PEN); return NULL; } #ifdef DEBUG_METAFILE printf ("\tusing pen #%d (%p)", context->selected_pen, context->objects [context->selected_pen].ptr); #endif pen = (GpPen*) context->objects [context->selected_pen].ptr; } /* miter limit was global (i.e. context not pen specific) in GDI */ GdipSetPenMiterLimit (pen, context->miter_limit); return pen; } /* * Return the selected GDI+ Brush to fill on the metafile or NULL if none is selected/valid. */ GpBrush* gdip_metafile_GetSelectedBrush (MetafilePlayContext *context) { // EMF have some stock objects that do not requires explicit creation if (context->selected_brush & ENHMETA_STOCK_OBJECT) { switch (context->selected_brush - ENHMETA_STOCK_OBJECT) { case WHITE_BRUSH: if (!context->stock_brush_white) { if (GdipCreateSolidFill (0xFFFFFFFF, &context->stock_brush_white) != Ok) return NULL; } return (GpBrush*)context->stock_brush_white; case LTGRAY_BRUSH: if (!context->stock_brush_ltgray) { if (GdipCreateSolidFill (0xFFBBBBBB, &context->stock_brush_ltgray) != Ok) return NULL; } return (GpBrush*)context->stock_brush_ltgray; case GRAY_BRUSH: if (!context->stock_brush_gray) { if (GdipCreateSolidFill (0xFF888888, &context->stock_brush_gray) != Ok) return NULL; } return (GpBrush*)context->stock_brush_gray; case DKGRAY_BRUSH: if (!context->stock_brush_dkgray) { if (GdipCreateSolidFill (0xFF444444, &context->stock_brush_dkgray) != Ok) return NULL; } return (GpBrush*)context->stock_brush_dkgray; case BLACK_BRUSH: if (!context->stock_brush_black) { if (GdipCreateSolidFill (0xFF000000, &context->stock_brush_black) != Ok) return NULL; } return (GpBrush*)context->stock_brush_black; case NULL_BRUSH: if (!context->stock_brush_null) { if (GdipCreateSolidFill (0x00000000, &context->stock_brush_null) != Ok) return NULL; } return (GpBrush*)context->stock_brush_null; default: return NULL; } } if ((context->selected_brush < 0) || (context->selected_brush >= context->objects_count)) { g_warning ("Invalid brush handle %d [0..%d[", context->selected_brush, context->objects_count); return NULL; } if (context->objects [context->selected_brush].type != METAOBJECT_TYPE_BRUSH) { g_warning ("Wrong object type %d, expected brush (%d)", context->objects [context->selected_brush].type, METAOBJECT_TYPE_BRUSH); return NULL; } #ifdef DEBUG_METAFILE printf ("\tusing brush #%d (%p)", context->selected_brush, context->objects [context->selected_brush].ptr); #endif return (GpBrush*) context->objects [context->selected_brush].ptr; } GpStatus gdip_metafile_PolyBezier (MetafilePlayContext *context, GpPointF *points, int count) { GpStatus status; #ifdef DEBUG_METAFILE printf ("PolyBezier %s count %d", context->use_path ? "Path " : " ", count); #endif if (context->use_path) { status = GdipAddPathBeziers (context->path, points, count); } else { GpPen *pen = gdip_metafile_GetSelectedPen (context); return GdipDrawCurve (context->graphics, pen, points, count); } return status; } GpStatus gdip_metafile_Polygon (MetafilePlayContext *context, GpPointF *points, int count) { #ifdef DEBUG_METAFILE printf ("Polygon %s count %d", context->use_path ? "Path " : " ", count); #endif GpBrush *brush = gdip_metafile_GetSelectedBrush (context); GpStatus status = GdipFillPolygon (context->graphics, brush, points, count, context->fill_mode); if (status == Ok) { GpPen *pen = gdip_metafile_GetSelectedPen (context); status = GdipDrawPolygon (context->graphics, pen, points, count); } return status; } GpStatus gdip_metafile_BeginPath (MetafilePlayContext *context) { GpStatus status; if (context->path) { GdipDeletePath (context->path); context->path = NULL; } context->use_path = TRUE; status = GdipCreatePath (0, &context->path); #ifdef DEBUG_METAFILE printf ("BeginPath %p", context->path); #endif return status; } GpStatus gdip_metafile_EndPath (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("EndPath %p", context->path); #endif context->use_path = FALSE; return Ok; } GpStatus gdip_metafile_CloseFigure (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("CloseFigure %p", context->path); #endif return GdipClosePathFigures (context->path); } GpStatus gdip_metafile_FillPath (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("FillPath %p", context->path); #endif GpBrush* brush = gdip_metafile_GetSelectedBrush (context); /* end path if required */ if (context->use_path) gdip_metafile_EndPath (context); return GdipFillPath (context->graphics, brush, context->path); } GpStatus gdip_metafile_StrokePath (MetafilePlayContext *context) { #ifdef DEBUG_METAFILE printf ("StrokePath %p", context->path); #endif GpPen *pen = gdip_metafile_GetSelectedPen (context); /* end path if required */ if (context->use_path) gdip_metafile_EndPath (context); return GdipDrawPath (context->graphics, pen, context->path); } GpStatus gdip_metafile_StrokeAndFillPath (MetafilePlayContext *context) { GpBrush *brush; GpStatus status; #ifdef DEBUG_METAFILE printf ("StrokeAndFillPath %p", context->path); #endif /* end path if required */ if (context->use_path) gdip_metafile_EndPath (context); brush = gdip_metafile_GetSelectedBrush (context); status = GdipFillPath (context->graphics, brush, context->path); if (status == Ok) { GpPen *pen = gdip_metafile_GetSelectedPen (context); status = GdipDrawPath (context->graphics, pen, context->path); } return status; } static GpMetafile* gdip_metafile_create () { GpMetafile* mf = (GpMetafile*) GdipAlloc (sizeof (GpMetafile)); if (mf) { mf->base.type = ImageTypeMetafile; mf->delete = FALSE; mf->data = NULL; mf->length = 0; mf->recording = FALSE; mf->fp = NULL; mf->stream = NULL; } return mf; } GpStatus gdip_metafile_clone (GpMetafile *metafile, GpMetafile **clonedmetafile) { GpMetafile *mf = gdip_metafile_create (); if (!mf) return OutOfMemory; memcpy (&mf->metafile_header, &metafile->metafile_header, sizeof (MetafileHeader)); if (metafile->length > 0) { mf->data = GdipAlloc (metafile->length); memcpy (mf->data, metafile->data, metafile->length); mf->length = metafile->length; } *clonedmetafile = mf; return Ok; } GpStatus gdip_metafile_dispose (GpMetafile *metafile) { if (!metafile) return InvalidParameter; /* TODO deal with "delete" flag */ metafile->length = 0; if (metafile->data) { GdipFree (metafile->data); metafile->data = NULL; } if (metafile->recording) gdip_metafile_stop_recording (metafile); GdipFree (metafile); return Ok; } GpStatus gdip_metafile_stop_recording (GpMetafile *metafile) { /* TODO save current stuff */ if (metafile->fp) { fclose (metafile->fp); metafile->fp = NULL; } if (metafile->stream) { /* it's not ours to close, just forget about it */ metafile->stream = NULL; } /* we cannot open a new graphics instance on this metafile - recording is over */ metafile->recording = FALSE; return Ok; } MetafilePlayContext* gdip_metafile_play_setup (GpMetafile *metafile, GpGraphics *graphics, int x, int y, int width, int height) { int i, n; MetaObject *obj; MetafilePlayContext *context; /* metafiles always render as 32bppRgb */ int stride = width * 4; int size = height * stride; if (!metafile || !graphics) return NULL; context = GdipAlloc (sizeof (MetafilePlayContext)); context->metafile = metafile; context->graphics = graphics; context->use_path = FALSE; context->path = NULL; /* keep a copy for clean up */ GdipGetWorldTransform (graphics, &context->initial); #ifdef DEBUG_METAFILE MetafileHeader *mh = &metafile->metafile_header; GpMatrix *m = &context->initial; g_warning ("\nMetafileHeader X %d, Y %d, W %d, H %d", mh->X, mh->Y, mh->Width, mh->Height); g_warning ("\n\tinitial matrix %g %g %g %g %g %g", m->xx, m->yx, m->xy, m->yy, m->x0, m->y0); #endif context->x = x; context->y = y; context->width = width; context->height = height; /* and keep an adjusted copy for providing "resets" */ GdipTranslateWorldTransform (graphics, -metafile->metafile_header.X, -metafile->metafile_header.Y, MatrixOrderPrepend); GdipGetWorldTransform (graphics, &context->matrix); /* defaults */ context->fill_mode = FillModeAlternate; context->map_mode = MM_TEXT; context->miter_limit = 10.0f; context->selected_pen = -1; context->selected_brush = -1; context->selected_font = -1; context->selected_palette = -1; /* Create* functions store the object here */ context->created.type = METAOBJECT_TYPE_EMPTY; context->created.ptr = NULL; /* stock objects */ context->stock_pen_white = NULL; context->stock_pen_black = NULL; context->stock_pen_null = NULL; context->stock_brush_white = NULL; context->stock_brush_ltgray = NULL; context->stock_brush_gray = NULL; context->stock_brush_dkgray = NULL; context->stock_brush_black = NULL; context->stock_brush_null = NULL; /* SelectObject | DeleteObject works on this array */ switch (context->metafile->metafile_header.Type) { case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: context->objects_count = metafile->metafile_header.WmfHeader.mtNoObjects; break; case METAFILETYPE_EMF: case METAFILETYPE_EMFPLUSONLY: case METAFILETYPE_EMFPLUSDUAL: context->objects_count = metafile->metafile_header.EmfHeader.nHandles + 1; /* 0 is reserved */ break; default: GdipFree (context); return NULL; } context->objects = (MetaObject*) GdipAlloc (context->objects_count * sizeof (MetaObject)); if (!context->objects) { GdipFree (context); return NULL; } obj = context->objects; for (i = 0; i < context->objects_count; i++) { obj->type = METAOBJECT_TYPE_EMPTY; obj->ptr = NULL; obj++; } return context; } GpStatus gdip_metafile_play (MetafilePlayContext *context) { GpStatus status; if (!context || !context->metafile) return InvalidParameter; switch (context->metafile->metafile_header.Type) { case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: return gdip_metafile_play_wmf (context); case METAFILETYPE_EMF: return gdip_metafile_play_emf (context); case METAFILETYPE_EMFPLUSONLY: case METAFILETYPE_EMFPLUSDUAL: return gdip_metafile_play_emf (context); default: g_warning ("Invalid metafile format %d", context->metafile->metafile_header.Type); break; } return NotImplemented; } GpStatus gdip_metafile_play_cleanup (MetafilePlayContext *context) { if (!context) return InvalidParameter; GdipSetWorldTransform (context->graphics, &context->initial); context->graphics = NULL; if (context->path) { GdipDeletePath (context->path); context->path = NULL; } context->created.type = METAOBJECT_TYPE_EMPTY; context->created.ptr = NULL; if (context->objects) { int i; GpMetafile *metafile = context->metafile; MetaObject *obj = context->objects; /* free each object */ for (i = 0; i < context->objects_count; i++) { gdip_metafile_DeleteObject (context, i); obj++; } GdipFree (context->objects); context->objects = NULL; } context->selected_pen = -1; context->selected_brush = -1; context->selected_font = -1; context->selected_font = -1; context->selected_palette = -1; /* stock objects */ if (context->stock_pen_white) GdipDeletePen (context->stock_pen_white); if (context->stock_pen_black) GdipDeletePen (context->stock_pen_black); if (context->stock_pen_null) GdipDeletePen (context->stock_pen_null); if (context->stock_brush_white) GdipDeleteBrush ((GpBrush*)context->stock_brush_white); if (context->stock_brush_ltgray) GdipDeleteBrush ((GpBrush*)context->stock_brush_ltgray); if (context->stock_brush_gray) GdipDeleteBrush ((GpBrush*)context->stock_brush_gray); if (context->stock_brush_dkgray) GdipDeleteBrush ((GpBrush*)context->stock_brush_dkgray); if (context->stock_brush_black) GdipDeleteBrush ((GpBrush*)context->stock_brush_black); if (context->stock_brush_null) GdipDeleteBrush ((GpBrush*)context->stock_brush_null); GdipFree (context); return Ok; } static void WmfPlaceableFileHeaderLE (WmfPlaceableFileHeader *wmfPlaceableFileHeader) { #if G_BYTE_ORDER != G_LITTLE_ENDIAN /* header->Key is already adjusted */ wmfPlaceableFileHeader->Hmf = GUINT16_FROM_LE (wmfPlaceableFileHeader->Hmf); wmfPlaceableFileHeader->BoundingBox.Left = GUINT16_FROM_LE (wmfPlaceableFileHeader->BoundingBox.Left); wmfPlaceableFileHeader->BoundingBox.Top = GUINT16_FROM_LE (wmfPlaceableFileHeader->BoundingBox.Top); wmfPlaceableFileHeader->BoundingBox.Right = GUINT16_FROM_LE (wmfPlaceableFileHeader->BoundingBox.Right); wmfPlaceableFileHeader->BoundingBox.Bottom = GUINT16_FROM_LE (wmfPlaceableFileHeader->BoundingBox.Bottom); wmfPlaceableFileHeader->Inch = GUINT16_FROM_LE (wmfPlaceableFileHeader->Inch); wmfPlaceableFileHeader->Reserved = GUINT32_FROM_LE (wmfPlaceableFileHeader->Reserved); wmfPlaceableFileHeader->Checksum = GUINT16_FROM_LE (wmfPlaceableFileHeader->Checksum); #endif } static void MetafileHeaderLE (MetafileHeader *header) { #if G_BYTE_ORDER != G_LITTLE_ENDIAN header->WmfHeader.mtType = GUINT16_FROM_LE (header->WmfHeader.mtType); header->WmfHeader.mtHeaderSize = GUINT16_FROM_LE (header->WmfHeader.mtHeaderSize); header->WmfHeader.mtVersion = GUINT16_FROM_LE (header->WmfHeader.mtVersion); header->WmfHeader.mtSize = GUINT32_FROM_LE (header->WmfHeader.mtSize); header->WmfHeader.mtNoObjects = GUINT16_FROM_LE (header->WmfHeader.mtNoObjects); header->WmfHeader.mtMaxRecord = GUINT32_FROM_LE (header->WmfHeader.mtMaxRecord); header->WmfHeader.mtNoParameters = GUINT16_FROM_LE (header->WmfHeader.mtNoParameters); #endif } static void EnhMetaHeaderLE (ENHMETAHEADER3 *emf) { #if G_BYTE_ORDER != G_LITTLE_ENDIAN /* emf->iType is already adjusted */ emf->nSize = GUINT32_FROM_LE (emf->nSize); emf->rclBounds.left = GUINT32_FROM_LE (emf->rclBounds.left); emf->rclBounds.top = GUINT32_FROM_LE (emf->rclBounds.top); emf->rclBounds.right = GUINT32_FROM_LE (emf->rclBounds.right); emf->rclBounds.bottom = GUINT32_FROM_LE (emf->rclBounds.bottom); emf->rclFrame.left = GUINT32_FROM_LE (emf->rclFrame.left); emf->rclFrame.top = GUINT32_FROM_LE (emf->rclFrame.top); emf->rclFrame.right = GUINT32_FROM_LE (emf->rclFrame.right); emf->rclFrame.bottom = GUINT32_FROM_LE (emf->rclFrame.bottom); emf->dSignature = GUINT32_FROM_LE (emf->dSignature); emf->nVersion = GUINT32_FROM_LE (emf->nVersion); emf->nBytes = GUINT32_FROM_LE (emf->nBytes); emf->nRecords = GUINT32_FROM_LE (emf->nRecords); emf->nHandles = GUINT32_FROM_LE (emf->nHandles); emf->sReserved = GUINT32_FROM_LE (emf->sReserved); emf->nDescription = GUINT32_FROM_LE (emf->nDescription); emf->offDescription = GUINT32_FROM_LE (emf->offDescription); emf->nPalEntries = GUINT32_FROM_LE (emf->nPalEntries); emf->szlDevice.cx = GUINT32_FROM_LE (emf->szlDevice.cx); emf->szlDevice.cy = GUINT32_FROM_LE (emf->szlDevice.cy); emf->szlMillimeters.cx = GUINT32_FROM_LE (emf->szlMillimeters.cx); emf->szlMillimeters.cy = GUINT32_FROM_LE (emf->szlMillimeters.cy); #endif } static GpStatus combine_headers (GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, MetafileHeader *header) { if (wmfPlaceableFileHeader) { header->Type = METAFILETYPE_WMFPLACEABLE; header->X = wmfPlaceableFileHeader->BoundingBox.Left; header->Y = wmfPlaceableFileHeader->BoundingBox.Top; header->Width = wmfPlaceableFileHeader->BoundingBox.Right - wmfPlaceableFileHeader->BoundingBox.Left; header->Height= wmfPlaceableFileHeader->BoundingBox.Bottom - wmfPlaceableFileHeader->BoundingBox.Top; header->DpiX = wmfPlaceableFileHeader->Inch; header->DpiY = wmfPlaceableFileHeader->Inch; } else { header->Type = METAFILETYPE_WMF; header->X = 0; header->Y = 0; /* TODO: GDI+ uses screen resolution for non-placeable metafiles */ header->Width = 1280; header->Height= 1024; header->DpiX = gdip_get_display_dpi (); header->DpiY = header->DpiX; } header->Size = header->WmfHeader.mtSize * 2; header->Version = header->WmfHeader.mtVersion; header->EmfPlusFlags = 0; header->EmfPlusHeaderSize = 0; header->LogicalDpiX = 0; header->LogicalDpiY = 0; return Ok; } /* Handle the record based headers that can exists in EMF files */ /* Note: GDI+ doesn't report correctly all stuff within the headers :| */ static GpStatus update_emf_header (MetafileHeader *header, BYTE* data, int length) { GpStatus status = Ok; MetafilePlayContext context; GpMetafile mf; DWORD *func = (DWORD*)data; switch (*func) { case EMR_HEADER: g_warning ("TODO - EMR_HEADER. Not common, need test case :)"); break; case EMR_GDICOMMENT: /* this could be an embedded EmfPlusRecordTypeHeader */ context.metafile = &mf; context.graphics = NULL; /* special case where we're not playing the metafile */ status = GdiComment (&context, data, length); if (status == Ok) { header->Type = mf.metafile_header.Type; header->Version = mf.metafile_header.Version; /* GDI+ seems to report the object header */ /* Horizontal and Vertical Logical DPI are available but not reported */ } break; } return status; } static GpStatus gdip_get_metafileheader_from (void *pointer, MetafileHeader *header, ImageSource source) { int size; DWORD key; GpStatus status = NotImplemented; WmfPlaceableFileHeader aldus_header; ENHMETAHEADER3 *emf; /* peek at first DWORD to select the right format */ size = sizeof (DWORD); if (gdip_read_wmf_data (pointer, (void*)&key, size, source) != size) return GenericError; #if G_BYTE_ORDER != G_LITTLE_ENDIAN key = GUINT32_FROM_LE (key); #endif switch (key) { case ALDUS_PLACEABLE_METAFILE_KEY: aldus_header.Key = key; size = sizeof (WmfPlaceableFileHeader) - size; if (gdip_read_wmf_data (pointer, (void*)(&aldus_header) + sizeof (DWORD), size, source) != size) return InvalidParameter; #if FALSE g_warning ("ALDUS_PLACEABLE_METAFILE key %d, hmf %d, L %d, T %d, R %d, B %d, inch %d, reserved %d, checksum %d", aldus_header.Key, aldus_header.Hmf, aldus_header.BoundingBox.Left, aldus_header.BoundingBox.Top, aldus_header.BoundingBox.Right, aldus_header.BoundingBox.Bottom, aldus_header.Inch, aldus_header.Reserved, aldus_header.Checksum); #endif size = sizeof (METAHEADER); if (gdip_read_wmf_data (pointer, (void*)&header->WmfHeader, size, source) != size) return InvalidParameter; WmfPlaceableFileHeaderLE (&aldus_header); MetafileHeaderLE (header); status = combine_headers (&aldus_header, header); break; case WMF_TYPE_AND_HEADERSIZE_KEY: memcpy (&header->WmfHeader, &key, size); size = sizeof (METAHEADER) - size; if (gdip_read_wmf_data (pointer, (void*)(&header->WmfHeader) + sizeof (DWORD), size, source) != size) return InvalidParameter; MetafileHeaderLE (header); status = combine_headers (NULL, header); break; case EMF_EMR_HEADER_KEY: emf = &(header->EmfHeader); emf->iType = key; size = sizeof (ENHMETAHEADER3) - size; if (gdip_read_emf_data (pointer, (void*)(&header->EmfHeader) + sizeof (DWORD), size, source) != size) return InvalidParameter; EnhMetaHeaderLE (&header->EmfHeader); #if FALSE g_warning ("EMF HEADER iType %d, nSize %d, Bounds L %d, T %d, R %d, B %d, Frame L %d, T %d, R %d, B %d, signature %X, version %d, bytes %d, records %d, handles %d, reserved %d, description %d, %d, palentries %d, device %d, %d, millimeters %d, %d", emf->iType, emf->nSize, emf->rclBounds.left, emf->rclBounds.top, emf->rclBounds.right, emf->rclBounds.bottom, emf->rclFrame.left, emf->rclFrame.top, emf->rclFrame.right, emf->rclFrame.bottom, emf->dSignature, emf->nVersion, emf->nBytes, emf->nRecords, emf->nHandles, emf->sReserved, emf->nDescription, emf->offDescription, emf->nPalEntries, emf->szlDevice.cx, emf->szlDevice.cy, emf->szlMillimeters.cx, emf->szlMillimeters.cy); #endif /* sanity check */ if ((emf->iType != 1) || (emf->dSignature != 0x464D4520) || (emf->sReserved != 0)) return InvalidParameter; header->Type = METAFILETYPE_EMF; /* FIXME: inclusive-inclusive, MS gets 1 to 5 pixels larger than the header */ if ((emf->rclFrame.left == 0) && (emf->rclFrame.top == 0)) { header->X = 0; header->Y = 0; header->Width = emf->szlDevice.cx + 1; header->Height = emf->szlDevice.cy + 1; } else { header->X = emf->rclBounds.left; header->Y = emf->rclBounds.top; header->Width = emf->rclBounds.right - emf->rclBounds.left + 1; header->Height = emf->rclBounds.bottom - emf->rclBounds.top + 1; } header->DpiX = MM_PER_INCH / ((float)emf->szlMillimeters.cx / emf->szlDevice.cx); header->DpiY = MM_PER_INCH / ((float)emf->szlMillimeters.cy / emf->szlDevice.cy); header->Size = emf->nBytes; header->Version = emf->nVersion; /* We need to check for the EmfHeader record (can't be done at this stage) but some files still returns * invalid values. E.g. Files with "strange" bounds also have insanely large EmfPlusHeaderSize and logical * DPI values (with MS GDI+) */ header->EmfPlusFlags = 0; header->EmfPlusHeaderSize = 0; header->LogicalDpiX = 0; header->LogicalDpiY = 0; /* note: there can be (empty?) space between the header and the start of the metafile records */ size = emf->nSize - sizeof (ENHMETAHEADER3); if (size > 0) { while (size > sizeof (DWORD)) { if (gdip_read_emf_data (pointer, (void*)(&key), sizeof (DWORD), source) != sizeof (DWORD)) return InvalidParameter; size -= sizeof (DWORD); } if (size > 0) { if (gdip_read_emf_data (pointer, (void*)(&key), size, source) != size) return InvalidParameter; } } status = Ok; break; default: g_warning ("Unknown metafile format: key %d", key); status = GenericError; } #if FALSE g_warning ("METAHEADER type %d, header %d, version %d, size %d, #obj %d, max rec %d, #params %d", header->WmfHeader.mtType, header->WmfHeader.mtHeaderSize, header->WmfHeader.mtVersion, header->WmfHeader.mtSize, header->WmfHeader.mtNoObjects, header->WmfHeader.mtMaxRecord, header->WmfHeader.mtNoParameters); #endif return status; } GpStatus gdip_get_metafile_from (void *pointer, GpMetafile **metafile, ImageSource source) { BOOL adjust_emf_headers = FALSE; GpStatus status = OutOfMemory; GpMetafile *mf = gdip_metafile_create (); if (!mf) goto error; /* decode metafile header */ status = gdip_get_metafileheader_from (pointer, &mf->metafile_header, source); if (status != Ok) goto error; switch (mf->metafile_header.Type) { case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: mf->base.image_format = WMF; /* note: mtSize is in WORD, mtSize contains the METAHEADER, mf->length is in bytes */ mf->length = mf->metafile_header.WmfHeader.mtSize * 2 - sizeof (METAHEADER); break; case METAFILETYPE_EMF: case METAFILETYPE_EMFPLUSONLY: case METAFILETYPE_EMFPLUSDUAL: mf->base.image_format = EMF; mf->length = mf->metafile_header.EmfHeader.nBytes - mf->metafile_header.EmfHeader.nSize; adjust_emf_headers = TRUE; break; } mf->data = (BYTE*) GdipAlloc (mf->length); if (!mf->data) goto error; /* copy data in memory (to play it later) */ if (gdip_read_wmf_data (pointer, (void*)mf->data, mf->length, source) != mf->length) { status = InvalidParameter; goto error; } if (adjust_emf_headers) { /* if the first EMF record is an EmfHeader (or an Header inside a Comment) then we have extra data to extract */ status = update_emf_header (&mf->metafile_header, mf->data, mf->length); } *metafile = mf; return Ok; error: if (mf) gdip_metafile_dispose (mf); *metafile = NULL; return status; } /* public (GDI+) functions */ GpStatus GdipCreateMetafileFromFile (GDIPCONST WCHAR *file, GpMetafile **metafile) { FILE *fp; char *file_name; GpStatus status = GenericError; if (!file || !metafile) return InvalidParameter; file_name = (char *) ucs2_to_utf8 ((const gunichar2 *)file, -1); if (!file_name) return InvalidParameter; fp = fopen (file_name, "rb"); if (fp) { status = gdip_get_metafile_from (fp, metafile, File); fclose (fp); } GdipFree (file_name); return status; } /* * GdipCreateMetafileFromStream will never be implemented, as 'stream' is a COM IStream ... */ GpStatus GdipCreateMetafileFromStream (void *stream, GpMetafile **metafile) { return NotImplemented; } /* * instead we'll use delegates to load the metafile header with this function */ GpStatus GdipCreateMetafileFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpMetafile **metafile) { GpStatus status = InvalidParameter; dstream_t *loader; if (!metafile) return InvalidParameter; loader = dstream_input_new (getBytesFunc, seekFunc); if (loader) { status = gdip_get_metafile_from (loader, metafile, DStream); dstream_free (loader); } return status; } GpStatus GdipCreateMetafileFromEmf (HENHMETAFILE hEmf, BOOL deleteEmf, GpMetafile **metafile) { GpStatus status; if (!hEmf || !metafile) return InvalidParameter; status = gdip_metafile_clone ((GpMetafile*)hEmf, metafile); if (status != Ok) return status; (*metafile)->delete = deleteEmf; return Ok; } GpStatus GdipCreateMetafileFromWmf (HMETAFILE hWmf, BOOL deleteWmf, GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, GpMetafile **metafile) { GpStatus status; if (!hWmf || !metafile) return InvalidParameter; status = gdip_metafile_clone ((GpMetafile*)hWmf, metafile); if (status != Ok) return status; status = GdipGetMetafileHeaderFromWmf (hWmf, wmfPlaceableFileHeader, &(*metafile)->metafile_header); if (status != Ok) { GdipFree (*metafile); return status; } (*metafile)->delete = deleteWmf; return Ok; } GpStatus GdipGetMetafileHeaderFromWmf (HMETAFILE hWmf, GDIPCONST WmfPlaceableFileHeader *wmfPlaceableFileHeader, MetafileHeader *header) { GpMetafile *mf; if (!hWmf || !wmfPlaceableFileHeader || !header) return InvalidParameter; mf = (GpMetafile*)hWmf; memcpy (header, &mf->metafile_header, sizeof (MetafileHeader)); return combine_headers (wmfPlaceableFileHeader, header); } GpStatus GdipGetMetafileHeaderFromEmf (HENHMETAFILE hEmf, MetafileHeader *header) { GpMetafile* metafile = (GpMetafile*)hEmf; if (!metafile || !header) return InvalidParameter; switch (metafile->metafile_header.Type) { case METAFILETYPE_EMF: case METAFILETYPE_EMFPLUSONLY: case METAFILETYPE_EMFPLUSDUAL: return GdipGetMetafileHeaderFromMetafile (metafile, header); /* you can get a HENHMETAFILE from a WMF metafile but it seems (unit tests) that you can't use it as such */ case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: default: return InvalidParameter; } } GpStatus GdipGetMetafileHeaderFromFile (GDIPCONST WCHAR *filename, MetafileHeader *header) { FILE *fp; char *file_name; GpStatus status = InvalidParameter; if (!filename || !header) return InvalidParameter; file_name = (char *) ucs2_to_utf8 ((const gunichar2 *)filename, -1); if (!file_name) return InvalidParameter; fp = fopen (file_name, "rb"); if (fp) { status = gdip_get_metafileheader_from (fp, header, File); /* if EMF check for additional header record */ if (header->Type == METAFILETYPE_EMF) { /* look for more details, possibly upgrading the metafile to METAFILETYPE_EMFPLUSONLY or EMFPLUSDUAL */ /* TODO */ } fclose (fp); } GdipFree (file_name); return status; } /* * GdipGetMetafileHeaderFromStream will never be implemented, as 'stream' is a COM IStream ... */ GpStatus GdipGetMetafileHeaderFromStream (void *stream, MetafileHeader *header) { return NotImplemented; } /* * instead we'll use delegates to load the metafile header with this function */ GpStatus GdipGetMetafileHeaderFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, MetafileHeader *header) { GpStatus status = InvalidParameter; dstream_t *loader; if (!header) return status; loader = dstream_input_new (getBytesFunc, seekFunc); if (loader) { status = gdip_get_metafileheader_from (loader, header, DStream); /* if EMF check for additional header record */ if (header->Type == METAFILETYPE_EMF) { /* look for more details, possibly upgrading the metafile to METAFILETYPE_EMFPLUSONLY or EMFPLUSDUAL */ /* TODO */ } dstream_free (loader); } return status; } GpStatus GdipGetMetafileHeaderFromMetafile (GpMetafile *metafile, MetafileHeader *header) { if (!metafile || !header) return InvalidParameter; memcpy (header, &metafile->metafile_header, sizeof (MetafileHeader)); return Ok; } GpStatus GdipGetHemfFromMetafile (GpMetafile *metafile, HENHMETAFILE *hEmf) { if (!metafile || !hEmf) return InvalidParameter; *hEmf = (HENHMETAFILE)metafile; return Ok; } GpStatus GdipGetMetafileDownLevelRasterizationLimit (GpMetafile *metafile, UINT *metafileRasterizationLimitDpi) { if (!metafile || !metafileRasterizationLimitDpi) return InvalidParameter; switch (metafile->metafile_header.Type) { case METAFILETYPE_EMF: case METAFILETYPE_EMFPLUSDUAL: /* TODO */ *metafileRasterizationLimitDpi = 0; return Ok; case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: case METAFILETYPE_EMFPLUSONLY: default: return WrongState; } } GpStatus GdipSetMetafileDownLevelRasterizationLimit (GpMetafile *metafile, UINT metafileRasterizationLimitDpi) { if (!metafile || (metafileRasterizationLimitDpi < 0)) return InvalidParameter; switch (metafile->metafile_header.Type) { case METAFILETYPE_EMF: case METAFILETYPE_EMFPLUSDUAL: // values less than 10 left resolution unchanged (from GDI+ documentation) if (metafileRasterizationLimitDpi >= 10) { /* TODO */ } return Ok; case METAFILETYPE_WMFPLACEABLE: case METAFILETYPE_WMF: case METAFILETYPE_EMFPLUSONLY: default: return WrongState; } } GpStatus GdipPlayMetafileRecord (GDIPCONST GpMetafile *metafile, EmfPlusRecordType recordType, UINT flags, UINT dataSize, GDIPCONST BYTE* data) { if (!metafile) return InvalidParameter; /* TODO */ return NotImplemented; } GpStatus GdipRecordMetafile (HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpMetafile *mf; if (!referenceHdc || !frameRect || !metafile) return InvalidParameter; if ((type < EmfTypeEmfOnly) || (type > EmfTypeEmfPlusDual)) return InvalidParameter; if ((frameUnit < MetafileFrameUnitPixel) || (frameUnit > MetafileFrameUnitGdi)) return InvalidParameter; if (((frameRect->Width == 0) || (frameRect->Height == 0)) && (frameUnit != MetafileFrameUnitGdi)) return GenericError; mf = gdip_metafile_create (); if (!mf) return OutOfMemory; mf->metafile_header.X = frameRect->X; mf->metafile_header.Y = frameRect->Y; mf->metafile_header.Width = frameRect->Width; mf->metafile_header.Height = frameRect->Height; mf->metafile_header.Size = 0; mf->metafile_header.Type = type; mf->recording = TRUE; /* TODO - more stuff here! */ *metafile = mf; return Ok; } GpStatus GdipRecordMetafileI (HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpRectF rect; if (!frameRect) return InvalidParameter; rect.X = frameRect->X; rect.Y = frameRect->Y; rect.Width = frameRect->Width; rect.Height = frameRect->Height; return GdipRecordMetafile (referenceHdc, type, (GDIPCONST GpRectF*) &rect, frameUnit, description, metafile); } GpStatus GdipRecordMetafileFileName (GDIPCONST WCHAR *fileName, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpStatus status; GpMetafile *mf = NULL; char *file_name; if (!fileName) return InvalidParameter; file_name = (char *) ucs2_to_utf8 ((const gunichar2 *)fileName, -1); if (!file_name) { *metafile = NULL; return InvalidParameter; } status = GdipRecordMetafile (referenceHdc, type, frameRect, frameUnit, description, &mf); if (status != Ok) { GdipFree (file_name); return status; } /* yep, an existing file is overwritten */ mf->fp = fopen (file_name, "wb"); GdipFree (file_name); *metafile = mf; return Ok; } GpStatus GdipRecordMetafileFileNameI (GDIPCONST WCHAR *fileName, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpRectF rect; if (!frameRect) return InvalidParameter; rect.X = frameRect->X; rect.Y = frameRect->Y; rect.Width = frameRect->Width; rect.Height = frameRect->Height; return GdipRecordMetafileFileName (fileName, referenceHdc, type, (GDIPCONST GpRectF*) &rect, frameUnit, description, metafile); } /* * GdipRecordMetafileStream and GdipRecordMetafileStreamI will never be implemented, as 'stream' is a COM IStream ... */ GpStatus GdipRecordMetafileStream (void /* IStream */ *stream, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { return NotImplemented; } GpStatus GdipRecordMetafileStreamI (void /* IStream */ *stream, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { return NotImplemented; } /* * instead we'll use delegates to create the metafile header with these functions */ GpStatus GdipRecordMetafileFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, HDC referenceHdc, EmfType type, GDIPCONST GpRectF *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpStatus status; if (!putBytesFunc) return InvalidParameter; status = GdipRecordMetafile (referenceHdc, type, frameRect, frameUnit, description, metafile); if (status != Ok) return status; /* TODO - keep delegates around to write stuff */ return Ok; } GpStatus GdipRecordMetafileFromDelegateI_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, HDC referenceHdc, EmfType type, GDIPCONST GpRect *frameRect, MetafileFrameUnit frameUnit, GDIPCONST WCHAR *description, GpMetafile **metafile) { GpRectF rect; if (!frameRect) return InvalidParameter; rect.X = frameRect->X; rect.Y = frameRect->Y; rect.Width = frameRect->Width; rect.Height = frameRect->Height; return GdipRecordMetafileFromDelegate_linux (getHeaderFunc, getBytesFunc, putBytesFunc, seekFunc, closeFunc, sizeFunc, referenceHdc, type, (GDIPCONST GpRectF*) &rect, frameUnit, description, metafile); } libgdiplus-2.11/src/wmfcodec.h0000664000175000017500000000600512225470167013254 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __WMFCODEC_H__ #define __WMFCODEC_H__ #include "gdiplus-private.h" #include "graphics-private.h" #include "metafile-private.h" #define WMF_MIN_RECORD_SIZE 6 #define WMF_CHECK_PARAMS(x) do { \ if (params < (x)) goto cleanup; \ } while (0) #define RECORDSIZE 0 #define FUNCTION 4 #define WP1 6 #define WP2 8 #define WP3 10 #define WP4 12 #define WP5 14 #define WP6 16 #define WP7 18 #define WP8 20 #define WP9 22 #define WP10 24 #define WP11 26 #define WP12 28 #define WP(y) (4 + ((y) << 1)) #define METAFILE_RECORD_SAVEDC 0x001E #define METAFILE_RECORD_SETBKMODE 0x0102 #define METAFILE_RECORD_SETMAPMODE 0x0103 #define METAFILE_RECORD_SETROP2 0x0104 #define METAFILE_RECORD_SETRELABS 0x0105 #define METAFILE_RECORD_SETPOLYFILLMODE 0x0106 #define METAFILE_RECORD_SETSTRETCHBLTMODE 0x0107 #define METAFILE_RECORD_RESTOREDC 0x0127 #define METAFILE_RECORD_SELECTOBJECT 0x012D #define METAFILE_RECORD_SETTEXTALIGN 0x012E #define METAFILE_RECORD_DELETEOBJECT 0x01F0 #define METAFILE_RECORD_SETBKCOLOR 0x0201 #define METAFILE_RECORD_SETWINDOWORG 0x020B #define METAFILE_RECORD_SETWINDOWEXT 0x020C #define METAFILE_RECORD_LINETO 0x0213 #define METAFILE_RECORD_MOVETO 0x0214 #define METAFILE_RECORD_CREATEPENINDIRECT 0x02FA #define METAFILE_RECORD_CREATEBRUSHINDIRECT 0x02FC #define METAFILE_RECORD_POLYGON 0x0324 #define METAFILE_RECORD_POLYLINE 0x0325 #define METAFILE_RECORD_POLYPOLYGON 0x0538 #define METAFILE_RECORD_ARC 0x0817 #define METAFILE_RECORD_STRETCHDIBITS 0x0F43 #define gdip_read_wmf_data gdip_read_bmp_data GpStatus gdip_load_wmf_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_wmf_image_from_stream_delegate (dstream_t *loader, GpImage **image) GDIP_INTERNAL; /* no save functions as the WMF "codec" is a decoder only */ ImageCodecInfo* gdip_getcodecinfo_wmf () GDIP_INTERNAL; #endif libgdiplus-2.11/src/pathgradientbrush.h0000664000175000017500000001060412225470167015203 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Vladimir Vukicevic (vladimir@pobox.com) * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef __PATHGRADIENTBRUSH_H__ #define __PATHGRADIENTBRUSH_H__ #include "gdiplus-private.h" #include "brush.h" GpStatus GdipCreatePathGradient (GDIPCONST GpPointF *points, INT count, GpWrapMode wrapMode, GpPathGradient **polyGradient); GpStatus GdipCreatePathGradientI (GDIPCONST GpPoint *points, INT count, GpWrapMode wrapMode, GpPathGradient **polyGradient); GpStatus GdipCreatePathGradientFromPath (GDIPCONST GpPath *path, GpPathGradient **polyGradient); GpStatus GdipGetPathGradientCenterColor (GpPathGradient *brush, ARGB *colors); GpStatus GdipSetPathGradientCenterColor (GpPathGradient *brush, ARGB colors); GpStatus GdipGetPathGradientSurroundColorCount (GpPathGradient *brush, INT *count); GpStatus GdipGetPathGradientSurroundColorsWithCount (GpPathGradient *brush, ARGB *color, INT *count); GpStatus GdipSetPathGradientSurroundColorsWithCount (GpPathGradient *brush, GDIPCONST ARGB *color, INT *count); GpStatus GdipGetPathGradientCenterPoint (GpPathGradient *brush, GpPointF *points); GpStatus GdipSetPathGradientCenterPoint (GpPathGradient *brush, GDIPCONST GpPointF *points); GpStatus GdipGetPathGradientRect (GpPathGradient *brush, GpRectF *rect); GpStatus GdipGetPathGradientBlendCount (GpPathGradient *brush, INT *count); GpStatus GdipGetPathGradientBlend (GpPathGradient *brush, REAL *blend, REAL *positions, INT count); GpStatus GdipSetPathGradientBlend (GpPathGradient *brush, GDIPCONST REAL *blend, GDIPCONST REAL *positions, INT count); GpStatus GdipGetPathGradientPresetBlendCount (GpPathGradient *brush, INT *count); GpStatus GdipGetPathGradientPresetBlend (GpPathGradient *brush, ARGB *blend, REAL *positions, INT count); GpStatus GdipSetPathGradientPresetBlend (GpPathGradient *brush, GDIPCONST ARGB *blend, GDIPCONST REAL *positions, INT count); GpStatus GdipSetPathGradientSigmaBlend (GpPathGradient *brush, REAL focus, REAL scale); GpStatus GdipSetPathGradientLinearBlend (GpPathGradient *brush, REAL focus, REAL scale); GpStatus GdipGetPathGradientWrapMode (GpPathGradient *brush, GpWrapMode *wrapMode); GpStatus GdipSetPathGradientWrapMode (GpPathGradient *brush, GpWrapMode wrapMode); GpStatus GdipGetPathGradientTransform (GpPathGradient *brush, GpMatrix *matrix); GpStatus GdipSetPathGradientTransform (GpPathGradient *brush, GpMatrix *matrix); GpStatus GdipResetPathGradientTransform (GpPathGradient *brush); GpStatus GdipMultiplyPathGradientTransform (GpPathGradient *brush, GDIPCONST GpMatrix *matrix, GpMatrixOrder order); GpStatus GdipTranslatePathGradientTransform (GpPathGradient *brush, REAL dx, REAL dy, GpMatrixOrder order); GpStatus GdipScalePathGradientTransform (GpPathGradient *brush, REAL sx, REAL sy, GpMatrixOrder order); GpStatus GdipRotatePathGradientTransform (GpPathGradient *brush, REAL angle, GpMatrixOrder order); GpStatus GdipGetPathGradientFocusScales (GpPathGradient *brush, REAL *xScale, REAL *yScale); GpStatus GdipSetPathGradientFocusScales (GpPathGradient *brush, REAL xScale, REAL yScale); /* missing API GdipGetPathGradientPath GdipSetPathGradientPath GdipGetPathGradientCenterPointI GdipSetPathGradientCenterPointI GdipGetPathGradientRectI GdipGetPathGradientGammaCorrection GdipSetPathGradientGammaCorrection */ #endif libgdiplus-2.11/src/bitmap.h0000664000175000017500000000627712225470167012754 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __BITMAP_H__ #define __BITMAP_H__ GpStatus GdipCreateBitmapFromFile (GDIPCONST WCHAR* filename, GpBitmap **bitmap); GpStatus GdipCreateBitmapFromFileICM (GDIPCONST WCHAR* filename, GpBitmap **bitmap); GpStatus GdipCreateBitmapFromScan0 (INT width, INT height, INT stride, PixelFormat format, BYTE* scan0, GpBitmap **bitmap); GpStatus GdipCreateBitmapFromGraphics (INT width, INT height, GpGraphics *target, GpBitmap **bitmap); GpStatus GdipCreateBitmapFromHBITMAP (HBITMAP hbm, HPALETTE hpal, GpBitmap** bitmap); GpStatus GdipCreateHBITMAPFromBitmap (GpBitmap* bitmap, HBITMAP *hbmReturn, ARGB background); GpStatus GdipCreateBitmapFromHICON (HICON hicon, GpBitmap** bitmap); GpStatus GdipCreateHICONFromBitmap (GpBitmap* bitmap, HICON *hbmReturn); GpStatus GdipCreateBitmapFromResource (HINSTANCE hInstance, GDIPCONST WCHAR *lpBitmapName, GpBitmap** bitmap); GpStatus GdipBitmapLockBits (GpBitmap *bitmap, GDIPCONST Rect *rect, UINT flags, PixelFormat format, BitmapData *lockedBitmapData); GpStatus GdipBitmapUnlockBits (GpBitmap *bitmap, BitmapData *lockedBitmapData); GpStatus GdipBitmapSetPixel (GpBitmap *bitmap, INT x, INT y, ARGB color); GpStatus GdipBitmapGetPixel (GpBitmap *bitmap, INT x, INT y, ARGB *color); GpStatus GdipCloneBitmapArea (REAL x, REAL y, REAL width, REAL height, PixelFormat format, GpBitmap *srcBitmap, GpBitmap **dstBitmap); GpStatus GdipCloneBitmapAreaI (INT x, INT y, INT width, INT height, PixelFormat format, GpBitmap *srcBitmap, GpBitmap **dstBitmap); GpStatus GdipBitmapSetResolution (GpBitmap *bitmap, REAL xdpi, REAL ydpi); /* missing API GdipCreateBitmapFromStream GdipCreateBitmapFromDirectDrawSurface GdipCreateBitmapFromGdiDib GdipCreateBitmapFromGdiDib */ #endif libgdiplus-2.11/src/customlinecap.h0000664000175000017500000000265112225470167014336 00000000000000/* * customlinecap.h * * Authors: * Ravindra (rkumar@novell.com) * * Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef __CUSTOMLINECAP_H__ #define __CUSTOMLINECAP_H__ /* CustomLineCap functions */ GpStatus GdipCreateCustomLineCap (GpPath *fillPath, GpPath *strokePath, GpLineCap baseCap, float baseInset, GpCustomLineCap **customCap); GpStatus GdipDeleteCustomLineCap (GpCustomLineCap *customCap); GpStatus GdipCloneCustomLineCap (GpCustomLineCap *customCap, GpCustomLineCap **clonedCap); GpStatus GdipSetCustomLineCapStrokeCaps (GpCustomLineCap *customCap, GpLineCap startCap, GpLineCap endCap); GpStatus GdipGetCustomLineCapStrokeCaps (GpCustomLineCap *customCap, GpLineCap *startCap, GpLineCap *endCap); GpStatus GdipSetCustomLineCapStrokeJoin (GpCustomLineCap *customCap, GpLineJoin lineJoin); GpStatus GdipGetCustomLineCapStrokeJoin (GpCustomLineCap *customCap, GpLineJoin *lineJoin); GpStatus GdipSetCustomLineCapBaseCap (GpCustomLineCap *customCap, GpLineCap baseCap); GpStatus GdipGetCustomLineCapBaseCap (GpCustomLineCap *customCap, GpLineCap *baseCap); GpStatus GdipSetCustomLineCapBaseInset (GpCustomLineCap *customCap, float inset); GpStatus GdipGetCustomLineCapBaseInset (GpCustomLineCap *customCap, float *inset); GpStatus GdipSetCustomLineCapWidthScale (GpCustomLineCap *customCap, float widthScale); GpStatus GdipGetCustomLineCapWidthScale (GpCustomLineCap *customCap, float *widthScale); #endif libgdiplus-2.11/src/text-cairo-private.h0000664000175000017500000000675412225470167015227 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __TEXT_CAIRO_PRIVATE_H__ #define __TEXT_CAIRO_PRIVATE_H__ #include "gdiplus-private.h" #include "graphics-private.h" #include "stringformat-private.h" /* Flags and Support structure for MeasureOrDrawString */ #define STRING_DETAIL_TAB (1<<0) #define STRING_DETAIL_LF (1<<1) #define STRING_DETAIL_HOTKEY (1<<2) #define STRING_DETAIL_BREAK (1<<3) #define STRING_DETAIL_HIDDEN (1<<4) #define STRING_DETAIL_LINESTART (1<<5) #define text_DrawString cairo_DrawString #define text_MeasureString cairo_MeasureString #define text_MeasureCharacterRanges cairo_MeasureCharacterRanges /* cache for computed information during MeasureString that can be reused during DrawString */ typedef struct { BOOL has_hotkeys; int align_horz; int align_vert; int line_height; int max_y; int descent; } GpDrawTextData; typedef struct { unsigned long Flags; unsigned long Linefeeds; float PosX; /* We call it X, even though it might become Y for vertical drawing */ float PosY; /* We call it Y, even though it might become X for vertical drawing */ float Width; /* Width of the character; height is defined in font structure */ int LineLen; /* If LineStart how many chars is the line long? */ } GpStringDetailStruct; GpStatus cairo_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) GDIP_INTERNAL; GpStatus cairo_MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, RectF *boundingBox, int *codepointsFitted, int *linesFilled) GDIP_INTERNAL; GpStatus cairo_MeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layout, GDIPCONST GpStringFormat *format, int regionCount, GpRegion **regions) GDIP_INTERNAL; #endif libgdiplus-2.11/src/matrix.c0000664000175000017500000002447712225470167013001 00000000000000/** * matrix.c * * Copyright (C) Novell, Inc. 2003-2004, 2007. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Author: Duncan Mak (duncan@ximian.com) * * **/ #include "matrix-private.h" /* GDI+ matrix takes 6 elements arranged in 3 rows by 2 columns. The identity matrix is [1, 0] [1, 0, 0] [0, 1] that is a simplification of [0, 1, 0] [0, 0] [0, 0, 1] Point v1, v2 Matrix: [m11, m12] [m21, m22] [m31, m32] Calcutation of X, Y using the previous matrix X = v1 * m11 + v2 * m12 + m31 Y = v1 * m21 + v2 * m22 + m32 M31 and M32 are used to do matrix translations */ /* private functions */ /* * In System.Drawing it is often impossible to specify a 'null' matrix. * Instead we supply an empty matrix (i.e. new Matrix ()). However this * "empty" matrix can cause a lot of extra calculation in libgdiplus * (e.g. invalidating the bitmap) unless we consider it as a special case. */ BOOL gdip_is_matrix_empty (GpMatrix* matrix) { if (!matrix) return TRUE; /* compare the matrix elements with the empty (no-op) version */ return (gdip_near_one (matrix->xx) && gdip_near_zero (matrix->yx) && gdip_near_zero (matrix->xy) && gdip_near_one (matrix->yy) && gdip_near_zero (matrix->x0) && gdip_near_zero (matrix->y0)); } BOOL gdip_is_matrix_a_translation (GpMatrix *matrix) { if (!matrix) return TRUE; return ((matrix->xx == 1.0f) && (matrix->yx == 0.0f) && (matrix->xy == 0.0f) && (matrix->yy == 1.0f)); } /* this helper function avoid GpMatrix allocation and reduce code duplication */ GpStatus gdip_matrix_init_from_rect_3points (GpMatrix *matrix, const GpRectF *rect, const GpPointF *dstplg) { GpPointF *p, *p0, *p1, *p2; double m11, m12, m21, m22; if (!matrix || !rect || !dstplg) return InvalidParameter; if ((rect->Width == 0) || (rect->Height == 0)) return OutOfMemory; p = (GpPointF*) dstplg; p0 = p++; p1 = p++; p2 = p; m11 = (p1->X - p0->X) / rect->Width; m12 = (p1->Y - p0->Y) / rect->Width; m21 = (p2->X - p0->X) / rect->Height; m22 = (p2->Y - p0->Y) / rect->Height; cairo_matrix_init (matrix, m11, m12, m21, m22, p0->X, p0->Y); cairo_matrix_translate (matrix, -rect->X, -rect->Y); return Ok; } /* public (exported) functions */ // coverity[+alloc : arg-*0] GpStatus GdipCreateMatrix (GpMatrix **matrix) { GpMatrix *result; if (!matrix) return InvalidParameter; result = GdipAlloc (sizeof (GpMatrix)); if (!result) return OutOfMemory; cairo_matrix_init_identity (result); *matrix = result; return Ok; } // coverity[+alloc : arg-*6] GpStatus GdipCreateMatrix2 (float m11, float m12, float m21, float m22, float dx, float dy, GpMatrix **matrix) { GpMatrix *result; if (!matrix) return InvalidParameter; result = GdipAlloc (sizeof (GpMatrix)); if (!result) return OutOfMemory; cairo_matrix_init (result, m11, m12, m21, m22, dx, dy); *matrix = result; return Ok; } // coverity[+alloc : arg-*2] GpStatus GdipCreateMatrix3 (const GpRectF *rect, const GpPointF *dstplg, GpMatrix **matrix) { GpMatrix *result; GpStatus status; if (!rect || !dstplg || !matrix) return InvalidParameter; result = GdipAlloc (sizeof (GpMatrix)); if (!result) return OutOfMemory; status = gdip_matrix_init_from_rect_3points (result, rect, dstplg); if (status == Ok) *matrix = result; else GdipFree (result); return status; } // coverity[+alloc : arg-*2] GpStatus GdipCreateMatrix3I (const GpRect *rect, const GpPoint *dstplg, GpMatrix **matrix) { GpRectF r; GpPointF pts[3]; if (!rect || !dstplg || !matrix) return InvalidParameter; r.X = rect->X; r.Y = rect->Y; r.Width = rect->Width; r.Height = rect->Height; pts [0].X = dstplg [0].X; pts [0].Y = dstplg [0].Y; pts [1].X = dstplg [1].X; pts [1].Y = dstplg [1].Y; pts [2].X = dstplg [2].X; pts [2].Y = dstplg [2].Y; return GdipCreateMatrix3 (&r, (GpPointF*)&pts, matrix); } // coverity[+alloc : arg-*1] GpStatus GdipCloneMatrix (GpMatrix *matrix, GpMatrix **cloneMatrix) { GpMatrix *result; if (!matrix || !cloneMatrix) return InvalidParameter; result = GdipAlloc (sizeof (GpMatrix)); if (!result) return OutOfMemory; gdip_cairo_matrix_copy (result, matrix); *cloneMatrix = result; return Ok; } GpStatus GdipDeleteMatrix (GpMatrix *matrix) { if (!matrix) return InvalidParameter; GdipFree (matrix); return Ok; } GpStatus GdipSetMatrixElements (GpMatrix *matrix, float m11, float m12, float m21, float m22, float dx, float dy) { if (!matrix) return InvalidParameter; cairo_matrix_init (matrix, m11, m12, m21, m22, dx, dy); return Ok; } GpStatus GdipGetMatrixElements (GpMatrix *matrix, float *matrixOut) { if (!matrix || !matrixOut) return InvalidParameter; matrixOut[0] = (float) matrix->xx; matrixOut[1] = (float) matrix->yx; matrixOut[2] = (float) matrix->xy; matrixOut[3] = (float) matrix->yy; matrixOut[4] = (float) matrix->x0; matrixOut[5] = (float) matrix->y0; return Ok; } GpStatus GdipMultiplyMatrix (GpMatrix *matrix, GpMatrix *matrix2, GpMatrixOrder order) { if (!matrix || !matrix2) return InvalidParameter; if (order == MatrixOrderAppend) cairo_matrix_multiply (matrix, matrix, matrix2); else if (order == MatrixOrderPrepend) cairo_matrix_multiply (matrix, matrix2, matrix); else return InvalidParameter; return Ok; } GpStatus GdipTranslateMatrix (GpMatrix *matrix, float offsetX, float offsetY, GpMatrixOrder order) { cairo_matrix_t tmp; GpStatus s; cairo_matrix_init (&tmp, 1, 0, 0, 1, offsetX, offsetY); s = GdipMultiplyMatrix (matrix, &tmp, order); return s; } GpStatus GdipScaleMatrix (GpMatrix *matrix, float scaleX, float scaleY, GpMatrixOrder order) { GpMatrix tmp; GpStatus s; cairo_matrix_init (&tmp, scaleX, 0, 0, scaleY, 0, 0); s = GdipMultiplyMatrix (matrix, &tmp, order); return s; } GpStatus GdipRotateMatrix (GpMatrix *matrix, float angle, GpMatrixOrder order) { cairo_matrix_t tmp; GpStatus s; float rad = angle * DEGTORAD; cairo_matrix_init (&tmp, cos (rad), sin (rad), -sin (rad), cos (rad), 0, 0); s = GdipMultiplyMatrix (matrix, &tmp, order); return s; } GpStatus GdipShearMatrix (GpMatrix *matrix, float shearX, float shearY, GpMatrixOrder order) { cairo_matrix_t tmp; GpStatus s; cairo_matrix_init (&tmp, 1, shearY, shearX, 1, 0, 0); s = GdipMultiplyMatrix (matrix, &tmp, order); return s; } GpStatus GdipInvertMatrix (GpMatrix *matrix) { if (!matrix) return InvalidParameter; return gdip_get_status ( cairo_matrix_invert (matrix)); } GpStatus GdipTransformMatrixPoints (GpMatrix *matrix, GpPointF *pts, int count) { int i; if (!matrix || !pts || (count < 1)) return InvalidParameter; for (i = 0; i < count; i++, pts++) { double x = pts->X; double y = pts->Y; cairo_matrix_transform_point (matrix, &x, &y); pts->X = (float) x; pts->Y = (float) y; } return Ok; } GpStatus GdipTransformMatrixPointsI (GpMatrix *matrix, GpPoint *pts, int count) { int i; if (!matrix || !pts || (count < 1)) return InvalidParameter; for (i = 0; i < count; i++, pts++) { double x = pts->X; double y = pts->Y; cairo_matrix_transform_point (matrix, &x, &y); pts->X = (int) x; pts->Y = (int) y; } return Ok; } GpStatus GdipVectorTransformMatrixPoints (GpMatrix *matrix, GpPointF *pts, int count) { int i; if (!matrix || !pts || (count < 1)) return InvalidParameter; for (i = 0; i < count; i++, pts++) { double x = pts->X; double y = pts->Y; cairo_matrix_transform_distance (matrix, &x, &y); pts->X = (float) x; pts->Y = (float) y; } return Ok; } GpStatus GdipVectorTransformMatrixPointsI (GpMatrix *matrix, GpPoint *pts, int count) { int i; if (!matrix || !pts || (count < 1)) return InvalidParameter; for (i = 0; i < count; i++, pts++) { double x = pts->X; double y = pts->Y; cairo_matrix_transform_distance (matrix, &x, &y); pts->X = (int) x; pts->Y = (int) y; } return Ok; } GpStatus GdipIsMatrixInvertible (GpMatrix *matrix, BOOL *result) { cairo_status_t status; cairo_matrix_t copy; if (!matrix || !result) return InvalidParameter; gdip_cairo_matrix_copy (©, matrix); status = cairo_matrix_invert (©); *result = (status != CAIRO_STATUS_INVALID_MATRIX); return Ok; } GpStatus GdipIsMatrixIdentity (GpMatrix *matrix, BOOL *result) { if (!matrix || !result) return InvalidParameter; /* note: we CAN'T use GdipIsMatrixEqual - as the precision is different */ *result = gdip_is_matrix_empty (matrix); return Ok; } GpStatus GdipIsMatrixEqual (GpMatrix *matrix, GpMatrix *matrix2, BOOL *result) { if (!matrix || !matrix2 || !result) return InvalidParameter; *result = ((matrix->xx == matrix2->xx) && (matrix->yx == matrix2->yx) && (matrix->xy == matrix2->xy) && (matrix->yy == matrix2->yy) && (matrix->x0 == matrix2->x0) && (matrix->y0 == matrix2->y0)); return Ok; } libgdiplus-2.11/src/wmfcodec.c0000664000175000017500000002672112225470167013256 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "wmfcodec.h" /* Codecinfo related data*/ GUID gdip_wmf_image_format_guid = {0xb96b3cadU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; static ImageCodecInfo wmf_codec; static const WCHAR wmf_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'W', 'M', 'F', 0}; /* Built-in WMF */ static const WCHAR wmf_extension[] = {'*','.','W', 'M', 'F', 0}; /* *.WMF */ static const WCHAR wmf_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'x', '-', 'w', 'm', 'f', 0}; /* image/x-wmf */ static const WCHAR wmf_format[] = {'W', 'M', 'F', 0}; /* WMF */ static const BYTE wmf_sig_pattern[] = { 0xD7, 0xCD, 0xC6, 0x9A }; static const BYTE wmf_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF }; //#define DEBUG_WMF_ALL #ifdef DEBUG_WMF_ALL #define DEBUG_WMF #define DEBUG_WMF_2 #define DEBUG_WMF_3 #define DEBUG_WMF_NOTIMPLEMENTED #endif ImageCodecInfo* gdip_getcodecinfo_wmf () { wmf_codec.Clsid = (CLSID) { 0x557cf404, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; wmf_codec.FormatID = gdip_wmf_image_format_guid; wmf_codec.CodecName = (const WCHAR*) wmf_codecname; wmf_codec.DllName = NULL; wmf_codec.FormatDescription = (const WCHAR*) wmf_format; wmf_codec.FilenameExtension = (const WCHAR*) wmf_extension; wmf_codec.MimeType = (const WCHAR*) wmf_mimetype; wmf_codec.Flags = ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; wmf_codec.Version = 1; wmf_codec.SigCount = 1; wmf_codec.SigSize = 4; wmf_codec.SigPattern = wmf_sig_pattern; wmf_codec.SigMask = wmf_sig_mask; return &wmf_codec; } static WORD GetWORD (int position, BYTE *data) { WORD *value = (WORD*)(data + position); #if G_BYTE_ORDER != G_LITTLE_ENDIAN return GUINT16_FROM_LE (*value); #else return *value; #endif } static DWORD GetDWORD (int position, BYTE* data) { DWORD *value = (DWORD*)(data + position); #if G_BYTE_ORDER != G_LITTLE_ENDIAN return GUINT32_FROM_LE (*value); #else return *value; #endif } static DWORD GetColor (WORD w1, WORD w2) { DWORD color = (w2 << 16) | w1; BYTE *p = (BYTE*)&color; BYTE temp = p[0]; p[0] = p[2]; p[2] = temp; return color; } #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define GETW(x) (*(WORD*)(data + (x))) #else #define GETW(x) (GUINT16_FROM_LE(*(WORD*)(data + (x)))) #endif #define GetParam(x,y) GetWORD((6 + ((x) << 1)), (y)) /* http://wvware.sourceforge.net/caolan/Polygon.html */ static GpStatus Polygon (MetafilePlayContext *context, BYTE *data, int len) { GpPointF *points, *pt; GpStatus status; int p; /* variable number of parameters */ SHORT num = GETW(WP1); /* len (in WORDs) = num (WORD) + num * (x WORD + y WORD) */ if (num > len + 1) return InvalidParameter; #ifdef DEBUG_WMF printf ("Polygon %d points", num); #endif points = (GpPointF*) GdipAlloc (num * sizeof (GpPointF)); if (!points) return OutOfMemory; int n = 2; for (p = 0, pt = points; p < num; p++, pt++) { pt->X = GETW(WP(n)); n++; pt->Y = GETW(WP(n)); n++; #ifdef DEBUG_WMF printf ("\n\tpoly to %g,%g", pt->X, pt->Y); #endif } status = gdip_metafile_Polygon (context, points, num); GdipFree (points); return status; } /* http://wvware.sourceforge.net/caolan/Polyline.html */ static GpStatus Polyline (MetafilePlayContext *context, BYTE *data) { GpStatus status; int p; /* variable number of parameters */ SHORT num = GETW(WP1); #ifdef DEBUG_WMF printf ("Polyline %d points", num); #endif SHORT x1 = GETW(WP2); SHORT y1 = GETW(WP3); int n = 4; for (p = 1; p < num; p++) { SHORT x2 = GETW(WP(n)); n++; SHORT y2 = GETW(WP(n)); n++; #ifdef DEBUG_WMF_2 printf ("\n\tdraw from %d,%d to %d,%d", x1, y1, x2, y2); #endif GpPen *pen = gdip_metafile_GetSelectedPen (context); status = GdipDrawLine (context->graphics, pen, x1, y1, x2, y2); if (status != Ok) return status; x1 = x2; y1 = y2; } return Ok; } /* http://wvware.sourceforge.net/caolan/PolyPolygon.html */ /* storage isn't very efficient, # of polygons, size of each polygon, data for each polygon */ static GpStatus PolyPolygon (MetafilePlayContext *context, BYTE *data) { GpStatus status = Ok; /* variable number of parameters */ int poly_num = GETW(WP1); int i; PointFList *list = GdipAlloc (poly_num * sizeof (PointFList)); PointFList *current = list; #ifdef DEBUG_WMF printf ("PolyPolygon has %d polygons", poly_num); #endif int n = 2; /* read size of each polygon and allocate the required memory */ for (i = 0; i < poly_num; i++) { current->num = GETW(WP(n)); n++; current->points = (GpPointF*) GdipAlloc (current->num * sizeof (GpPointF)); #ifdef DEBUG_WMF_2 printf ("\n\tSub Polygon #%d has %d points", i, current->num); #endif current++; } /* read the points for each polygons */ current = list; for (i = 0; i < poly_num; i++) { GpPointF *pt = current->points; int p; for (p = 0; p < current->num; p++) { pt->X = GETW(WP(n)); n++; pt->Y = GETW(WP(n)); n++; #ifdef DEBUG_WMF_3 printf ("\n\t\tpoly to %g,%g", pt->X, pt->Y); #endif pt++; } GpStatus s = gdip_metafile_Polygon (context, current->points, current->num); if (s != Ok) status = s; /* free points */ GdipFree (current->points); current++; } /* all points were freed, after being drawn, so we just have to free the polygon list*/ GdipFree (list); return status; } GpStatus gdip_metafile_play_wmf (MetafilePlayContext *context) { GpStatus status = Ok; GpMetafile *metafile = context->metafile; GpGraphics *graphics = context->graphics; BYTE *data = metafile->data; BYTE *end = data + metafile->length; #ifdef DEBUG_WMF int i = 1, j; #endif /* reality check - each record is, at minimum, 6 bytes long (4 size + 2 function) */ while (data < end - WMF_MIN_RECORD_SIZE) { DWORD size = GETDW(RECORDSIZE); WORD func = GETW(FUNCTION); int params = size - (WMF_MIN_RECORD_SIZE / sizeof (WORD)); #ifdef DEBUG_WMF printf ("\n[#%d] size %d ", i++, size); #endif /* reality check - enough data available to read all parameters ? (params is in WORD) */ if ((params << 1) > (end - data)) { status = InvalidParameter; goto cleanup; } /* Notes: * - The previous check doesn't mean we have all required parameters (only the one encoded) * - sometimes there are extra (undocumented?, buggy?) parameters for some functions */ switch (func) { case METAFILE_RECORD_SAVEDC: WMF_CHECK_PARAMS(0); status = gdip_metafile_SaveDC (context); break; case METAFILE_RECORD_SETBKMODE: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetBkMode (context, GETW(WP1)); break; case METAFILE_RECORD_SETMAPMODE: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetMapMode (context, GETW(WP1)); break; case METAFILE_RECORD_SETROP2: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetROP2 (context, GETW(WP1)); break; case METAFILE_RECORD_SETRELABS: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetRelabs (context, GETW(WP1)); break; case METAFILE_RECORD_SETPOLYFILLMODE: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetPolyFillMode (context, GETW(WP1)); break; case METAFILE_RECORD_SETSTRETCHBLTMODE: WMF_CHECK_PARAMS(1); /* 2 but second is unused (32bits?) */ status = gdip_metafile_SetStretchBltMode (context, GETW(WP1)); break; case METAFILE_RECORD_RESTOREDC: WMF_CHECK_PARAMS(0); status = gdip_metafile_RestoreDC (context); break; case METAFILE_RECORD_SELECTOBJECT: WMF_CHECK_PARAMS(1); status = gdip_metafile_SelectObject (context, GETW(WP1)); break; case METAFILE_RECORD_SETTEXTALIGN: WMF_CHECK_PARAMS(1); status = gdip_metafile_SetTextAlign (context, GETW(WP1)); break; case METAFILE_RECORD_DELETEOBJECT: WMF_CHECK_PARAMS(1); status = gdip_metafile_DeleteObject (context, GETW(WP1)); break; case METAFILE_RECORD_SETBKCOLOR: WMF_CHECK_PARAMS(2); status = gdip_metafile_SetBkColor (context, GetColor (GETW(WP1), GETW(WP2))); break; case METAFILE_RECORD_SETWINDOWORG: WMF_CHECK_PARAMS(2); status = gdip_metafile_SetWindowOrg (context, GETW(WP1), GETW(WP2)); break; case METAFILE_RECORD_SETWINDOWEXT: WMF_CHECK_PARAMS(2); status = gdip_metafile_SetWindowExt (context, GETW(WP1), GETW(WP2)); break; case METAFILE_RECORD_LINETO: WMF_CHECK_PARAMS(2); status = gdip_metafile_LineTo (context, GETW(WP1), GETW(WP2)); break; case METAFILE_RECORD_MOVETO: WMF_CHECK_PARAMS(2); status = gdip_metafile_MoveTo (context, GETW(WP1), GETW(WP2)); break; case METAFILE_RECORD_CREATEPENINDIRECT: /* note: documented with only 4 parameters, LOGPEN use a POINT to specify width, so y (3) is unused) */ WMF_CHECK_PARAMS(5); status = gdip_metafile_CreatePenIndirect (context, GETW(WP1), GETW(WP2), GetColor (GETW(WP4), GETW(WP5))); break; case METAFILE_RECORD_CREATEBRUSHINDIRECT: WMF_CHECK_PARAMS(4); status = gdip_metafile_CreateBrushIndirect (context, GETW(WP1), GetColor (GETW(WP2), GETW(WP3)), GETW(WP4)); break; case METAFILE_RECORD_POLYGON: status = Polygon (context, data, params); break; case METAFILE_RECORD_POLYLINE: status = Polyline (context, data); break; case METAFILE_RECORD_POLYPOLYGON: status = PolyPolygon (context, data); break; case METAFILE_RECORD_ARC: WMF_CHECK_PARAMS(8); status = gdip_metafile_Arc (context, GETW(WP1), GETW(WP2), GETW(WP3), GETW(WP4), GETW(WP5), GETW(WP6), GETW(WP7), GETW(WP8)); break; case METAFILE_RECORD_STRETCHDIBITS: { WMF_CHECK_PARAMS(14); BITMAPINFO *bmi = (BITMAPINFO*) (data + 14 * sizeof (WORD)); void* bits = (void*) (bmi + GETDW(WP12)); status = gdip_metafile_StretchDIBits (context, GETW(WP11), GETW(WP10), GETW(WP9), GETW(WP8), GETW(WP7), GETW(WP6), GETW(WP5), GETW(WP4), bits, bmi, GETW(WP3), GETDW(WP1)); break; } default: /* unprocessed records, ignore the data */ /* 3 for size (DWORD) == 2 * SHORT + function == 1 SHORT */ #ifdef DEBUG_WMF printf ("Unimplemented_%X (", func); for (j = 0; j < params; j++) { printf (" %d", GetParam (j, data)); } printf (" )"); #endif break; } if (status != Ok) { g_warning ("Parsing interupted, status %d returned from function %d.", status, func); goto cleanup; } data += size * 2; } cleanup: return status; } GpStatus gdip_load_wmf_image_from_file (FILE *fp, GpImage **image) { return gdip_get_metafile_from ((void*)fp, (GpMetafile**)image, File); } GpStatus gdip_load_wmf_image_from_stream_delegate (dstream_t *loader, GpImage **image) { return gdip_get_metafile_from ((void *)loader, (GpMetafile**)image, DStream); } libgdiplus-2.11/src/fontcollection-private.h0000664000175000017500000000351012225470167016155 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __FONTCOLLECTION_PRIVATE_H__ #define __FONTCOLLECTION_PRIVATE_H__ #include "gdiplus-private.h" struct _FontCollection { FcFontSet* fontset; FcConfig* config; /* Only for private collections */ }; #include "fontcollection.h" #endif libgdiplus-2.11/src/texturebrush.h0000664000175000017500000000335612225470167014237 00000000000000/* * texturebrush.h * * Author: * Ravindra (rkumar@novell.com) * * Copyright (C) 2004,2006-2007 Novell, Inc. http://www.novell.com */ /* * NOTE: This header file contains ONLY public definitions and MUST match the GDI+ definitions. */ #ifndef __TEXTUREBRUSH_H__ #define __TEXTUREBRUSH_H__ GpStatus GdipCreateTexture (GpImage *image, GpWrapMode wrapMode, GpTexture **texture); GpStatus GdipCreateTexture2 (GpImage *image, GpWrapMode wrapMode, float x, float y, float width, float height, GpTexture **texture); GpStatus GdipCreateTexture2I (GpImage *image, GpWrapMode wrapMode, int x, int y, int width, int height, GpTexture **texture); GpStatus GdipCreateTextureIA (GpImage *image, GpImageAttributes *imageAttributes, float x, float y, float width, float height, GpTexture **texture); GpStatus GdipCreateTextureIAI (GpImage *image, GpImageAttributes *imageAttributes, int x, int y, int width, int height, GpTexture **texture); GpStatus GdipGetTextureTransform (GpTexture *texture, GpMatrix *matrix); GpStatus GdipSetTextureTransform (GpTexture *texture, GDIPCONST GpMatrix *matrix); GpStatus GdipResetTextureTransform (GpTexture *texture); GpStatus GdipMultiplyTextureTransform (GpTexture *texture, GpMatrix *matrix, GpMatrixOrder order); GpStatus GdipTranslateTextureTransform (GpTexture *texture, float dx, float dy, GpMatrixOrder order); GpStatus GdipScaleTextureTransform (GpTexture *texture, float sx, float sy, GpMatrixOrder order); GpStatus GdipRotateTextureTransform (GpTexture *texture, float angle, GpMatrixOrder order); GpStatus GdipSetTextureWrapMode (GpTexture *texture, GpWrapMode wrapMode); GpStatus GdipGetTextureWrapMode (GpTexture *texture, GpWrapMode *wrapMode); GpStatus GdipGetTextureImage (GpTexture *texture, GpImage **image); #endif libgdiplus-2.11/src/brush.h0000664000175000017500000000275712225470167012622 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Ravindra (rkumar@novell.com) * * Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef __BRUSH_H__ #define __BRUSH_H__ typedef struct _InterpolationColors { ARGB* colors; float *positions; int count; } InterpolationColors; GpStatus GdipCloneBrush (GpBrush *brush, GpBrush **clonedBrush); GpStatus GdipDeleteBrush (GpBrush *brush); GpStatus GdipGetBrushType (GpBrush *brush, GpBrushType *type); #endif libgdiplus-2.11/src/bitmap.c0000664000175000017500000021116212225470167012736 00000000000000/* * bitmap.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Vladimir Vukicevic (vladimir@pobox.com) * Jordi Mas (jordi@ximian.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot */ #include "gdiplus-private.h" #include "bitmap-private.h" static GpStatus gdip_bitmap_clone_data_rect (BitmapData *srcData, Rect *srcRect, BitmapData *destData, Rect *destRect); /* The default indexed palettes. This code was generated by a tiny C# program. */ static const unsigned int default_Format1bppIndexed_palette[2] = { 0xFF000000, 0xFFFFFFFF }; static const unsigned int default_Format4bppIndexed_palette[16] = { 0xFF000000, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080, 0xFF808080, 0xFFC0C0C0, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF }; static const unsigned int default_Format8bppIndexed_palette[256] = { 0xFF000000, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080, 0xFF808080, 0xFFC0C0C0, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0xFF000033, 0xFF000066, 0xFF000099, 0xFF0000CC, 0xFF0000FF, 0xFF003300, 0xFF003333, 0xFF003366, 0xFF003399, 0xFF0033CC, 0xFF0033FF, 0xFF006600, 0xFF006633, 0xFF006666, 0xFF006699, 0xFF0066CC, 0xFF0066FF, 0xFF009900, 0xFF009933, 0xFF009966, 0xFF009999, 0xFF0099CC, 0xFF0099FF, 0xFF00CC00, 0xFF00CC33, 0xFF00CC66, 0xFF00CC99, 0xFF00CCCC, 0xFF00CCFF, 0xFF00FF00, 0xFF00FF33, 0xFF00FF66, 0xFF00FF99, 0xFF00FFCC, 0xFF00FFFF, 0xFF330000, 0xFF330033, 0xFF330066, 0xFF330099, 0xFF3300CC, 0xFF3300FF, 0xFF333300, 0xFF333333, 0xFF333366, 0xFF333399, 0xFF3333CC, 0xFF3333FF, 0xFF336600, 0xFF336633, 0xFF336666, 0xFF336699, 0xFF3366CC, 0xFF3366FF, 0xFF339900, 0xFF339933, 0xFF339966, 0xFF339999, 0xFF3399CC, 0xFF3399FF, 0xFF33CC00, 0xFF33CC33, 0xFF33CC66, 0xFF33CC99, 0xFF33CCCC, 0xFF33CCFF, 0xFF33FF00, 0xFF33FF33, 0xFF33FF66, 0xFF33FF99, 0xFF33FFCC, 0xFF33FFFF, 0xFF660000, 0xFF660033, 0xFF660066, 0xFF660099, 0xFF6600CC, 0xFF6600FF, 0xFF663300, 0xFF663333, 0xFF663366, 0xFF663399, 0xFF6633CC, 0xFF6633FF, 0xFF666600, 0xFF666633, 0xFF666666, 0xFF666699, 0xFF6666CC, 0xFF6666FF, 0xFF669900, 0xFF669933, 0xFF669966, 0xFF669999, 0xFF6699CC, 0xFF6699FF, 0xFF66CC00, 0xFF66CC33, 0xFF66CC66, 0xFF66CC99, 0xFF66CCCC, 0xFF66CCFF, 0xFF66FF00, 0xFF66FF33, 0xFF66FF66, 0xFF66FF99, 0xFF66FFCC, 0xFF66FFFF, 0xFF990000, 0xFF990033, 0xFF990066, 0xFF990099, 0xFF9900CC, 0xFF9900FF, 0xFF993300, 0xFF993333, 0xFF993366, 0xFF993399, 0xFF9933CC, 0xFF9933FF, 0xFF996600, 0xFF996633, 0xFF996666, 0xFF996699, 0xFF9966CC, 0xFF9966FF, 0xFF999900, 0xFF999933, 0xFF999966, 0xFF999999, 0xFF9999CC, 0xFF9999FF, 0xFF99CC00, 0xFF99CC33, 0xFF99CC66, 0xFF99CC99, 0xFF99CCCC, 0xFF99CCFF, 0xFF99FF00, 0xFF99FF33, 0xFF99FF66, 0xFF99FF99, 0xFF99FFCC, 0xFF99FFFF, 0xFFCC0000, 0xFFCC0033, 0xFFCC0066, 0xFFCC0099, 0xFFCC00CC, 0xFFCC00FF, 0xFFCC3300, 0xFFCC3333, 0xFFCC3366, 0xFFCC3399, 0xFFCC33CC, 0xFFCC33FF, 0xFFCC6600, 0xFFCC6633, 0xFFCC6666, 0xFFCC6699, 0xFFCC66CC, 0xFFCC66FF, 0xFFCC9900, 0xFFCC9933, 0xFFCC9966, 0xFFCC9999, 0xFFCC99CC, 0xFFCC99FF, 0xFFCCCC00, 0xFFCCCC33, 0xFFCCCC66, 0xFFCCCC99, 0xFFCCCCCC, 0xFFCCCCFF, 0xFFCCFF00, 0xFFCCFF33, 0xFFCCFF66, 0xFFCCFF99, 0xFFCCFFCC, 0xFFCCFFFF, 0xFFFF0000, 0xFFFF0033, 0xFFFF0066, 0xFFFF0099, 0xFFFF00CC, 0xFFFF00FF, 0xFFFF3300, 0xFFFF3333, 0xFFFF3366, 0xFFFF3399, 0xFFFF33CC, 0xFFFF33FF, 0xFFFF6600, 0xFFFF6633, 0xFFFF6666, 0xFFFF6699, 0xFFFF66CC, 0xFFFF66FF, 0xFFFF9900, 0xFFFF9933, 0xFFFF9966, 0xFFFF9999, 0xFFFF99CC, 0xFFFF99FF, 0xFFFFCC00, 0xFFFFCC33, 0xFFFFCC66, 0xFFFFCC99, 0xFFFFCCCC, 0xFFFFCCFF, 0xFFFFFF00, 0xFFFFFF33, 0xFFFFFF66, 0xFFFFFF99, 0xFFFFFFCC, 0xFFFFFFFF }; /* Those are the only pixel formats that we really support */ static BOOL gdip_is_a_supported_pixelformat (PixelFormat fmt) { switch (fmt) { case PixelFormat1bppIndexed: case PixelFormat4bppIndexed: case PixelFormat8bppIndexed: case PixelFormat24bppRGB: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: return TRUE; default: return FALSE; } } static BOOL gdip_is_an_alpha_pixelformat (PixelFormat format) { return ((format & PixelFormatAlpha) != 0); } /* Returns TRUE if the Bitmap contains indexed (palettized) data. */ BOOL gdip_is_an_indexed_pixelformat (PixelFormat fmt) { return ((fmt & PixelFormatIndexed) != 0); } void gdip_bitmap_init (GpBitmap *bitmap) { if (bitmap == NULL) return; memset (bitmap, 0, sizeof (GpBitmap)); bitmap->type = ImageTypeBitmap; bitmap->image_format = INVALID; } static GpStatus gdip_propertyitems_clone(PropertyItem *src, PropertyItem **dest, int count) { PropertyItem *result; int i; int j; if (dest == NULL) { return InvalidParameter; } if (src == NULL) { *dest = NULL; return Ok; } result = GdipAlloc(sizeof(PropertyItem) * count); if (result == NULL) { return OutOfMemory; } for (i = 0; i < count; i++) { result[i].id = src[i].id; result[i].length = src[i].length; result[i].type = src[i].type; if ((src[i].value != NULL) && (src[i].length > 0)) { result[i].value = GdipAlloc(src[i].length); if (result[i].value == NULL) { for (j = 0; j < i; j++) { if (result[j].value != NULL) { GdipFree(result[j].value); } } GdipFree (result); return OutOfMemory; } memcpy(result[i].value, src[i].value, src[i].length); } else { result[i].value = NULL; } } *dest = result; return Ok; } static GpStatus gdip_propertyitems_dispose(PropertyItem *property, int count) { int i; if (property == NULL) { return Ok; } for (i = 0; i < count; i++) { if (property[i].value != NULL) { GdipFree(property[i].value); } } GdipFree(property); return Ok; } static GpStatus gdip_bitmapdata_init (BitmapData *data) { if (data != NULL) { memset(data, 0, sizeof(BitmapData)); return Ok; } return InvalidParameter; } GpStatus gdip_property_get_short(int offset, void *value, unsigned short *result) { BYTE *ptr = (BYTE*)value; *result = ptr[0] + (ptr[1] << 8); return Ok; } GpStatus gdip_property_get_long(int offset, void *value, guint32 *result) { BYTE *ptr = (BYTE*)value; *result = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24); return Ok; } GpStatus gdip_property_get_srational(int offset, void *value, unsigned short *numerator, unsigned short *denominator) { BYTE *ptr = (BYTE*)value; *numerator = ptr[0] + (ptr[1] << 8); *denominator = ptr[2] + (ptr[3] << 8); return Ok; } GpStatus gdip_property_get_rational(int offset, void *value, guint32 *numerator, guint32 *denominator) { BYTE *ptr = (BYTE*)value; *numerator = ptr[0] + (ptr[1] << 8) + (ptr[2] << 16) + (ptr[3] << 24); *denominator = ptr[4] + (ptr[5] << 8) + (ptr[6] << 16) + (ptr[7] << 24); return Ok; } GpStatus gdip_bitmapdata_property_add_long(BitmapData *bitmap_data, PROPID id, guint32 value) { BYTE buffer[4]; buffer[0] = value & 0xff; buffer[1] = (value & 0x0000ff00) >> 8; buffer[2] = (value & 0x00ff0000) >> 16; buffer[3] = (value & 0xff000000) >> 24; return gdip_bitmapdata_property_add (bitmap_data, id, 4, PropertyTagTypeLong, buffer); } GpStatus gdip_bitmapdata_property_add_ASCII(BitmapData *bitmap_data, PROPID id, BYTE *value) { return gdip_bitmapdata_property_add (bitmap_data, id, strlen((char *)value) + 1, PropertyTagTypeASCII, value); } GpStatus gdip_bitmapdata_property_add_byte (BitmapData *bitmap_data, PROPID id, BYTE value) { return gdip_bitmapdata_property_add (bitmap_data, id, 1, PropertyTagTypeByte, &value); } GpStatus gdip_bitmapdata_property_add_short(BitmapData *bitmap_data, PROPID id, unsigned short value) { BYTE buffer[2]; buffer[0] = value & 0xff; buffer[1] = (value & 0x0ff00) >> 8; return gdip_bitmapdata_property_add (bitmap_data, id, 2, PropertyTagTypeShort, buffer); } GpStatus gdip_bitmapdata_property_add_rational(BitmapData *bitmap_data, PROPID id, guint32 numerator, guint32 denominator) { BYTE buffer[8]; buffer[0] = numerator & 0xff; buffer[1] = (numerator & 0x0000ff00) >> 8; buffer[2] = (numerator & 0x00ff0000) >> 16; buffer[3] = (numerator & 0xff000000) >> 24; buffer[4] = denominator & 0xff; buffer[5] = (denominator & 0x0000ff00) >> 8; buffer[6] = (denominator & 0x00ff0000) >> 16; buffer[7] = (denominator & 0xff000000) >> 24; return gdip_bitmapdata_property_add (bitmap_data, id, 8, PropertyTagTypeRational, buffer); } GpStatus gdip_bitmapdata_property_add_srational(BitmapData *bitmap_data, PROPID id, unsigned short numerator, unsigned short denominator) { BYTE buffer[4]; buffer[0] = numerator & 0xff; buffer[1] = (numerator & 0x0ff00) >> 8; buffer[2] = denominator & 0xff; buffer[3] = (denominator & 0xff00) >> 8; return gdip_bitmapdata_property_add (bitmap_data, id, 8, PropertyTagTypeRational, buffer); } GpStatus gdip_bitmapdata_property_add(BitmapData *bitmap_data, PROPID id, ULONG length, WORD type, VOID *value) { int property_count; if (bitmap_data == NULL) { return InvalidParameter; } property_count = bitmap_data->property_count; if (bitmap_data->property == NULL) { bitmap_data->property = GdipAlloc(sizeof(PropertyItem)); } else { bitmap_data->property = gdip_realloc (bitmap_data->property, sizeof(PropertyItem) * (property_count + 1)); } if (bitmap_data->property == NULL) { bitmap_data->property_count = 0; return OutOfMemory; } if ((value != NULL) && (length > 0)) { bitmap_data->property[property_count].value = GdipAlloc(length); if (bitmap_data->property[property_count].value == NULL) { return OutOfMemory; } memcpy(bitmap_data->property[property_count].value, value, length); } else { bitmap_data->property[property_count].value = NULL; } bitmap_data->property[property_count].id = id; bitmap_data->property[property_count].length = length; bitmap_data->property[property_count].type = type; bitmap_data->property_count++; return Ok; } GpStatus gdip_bitmapdata_property_remove_id(BitmapData *bitmap_data, PROPID id) { int i; for (i = 0; i < bitmap_data->property_count; i++) { if (bitmap_data->property[i].id == id) { return gdip_bitmapdata_property_remove_index(bitmap_data, i); } } return PropertyNotFound; } GpStatus gdip_bitmapdata_property_remove_index(BitmapData *bitmap_data, int index) { BYTE *src; BYTE *dest; if (index >= bitmap_data->property_count) { return PropertyNotFound; } /* We don't realloc the array, more overhead than savings */ if ((index + 1) < bitmap_data->property_count) { if (bitmap_data->property[index].value != NULL) { GdipFree(bitmap_data->property[index].value); } memmove(&bitmap_data->property[index], &bitmap_data->property[index + 1], (bitmap_data->property_count - index - 1) * sizeof(PropertyItem)); } bitmap_data->property_count--; return Ok; } GpStatus gdip_bitmapdata_property_find_id(BitmapData *bitmap_data, PROPID id, int *index) { int i; if (index == NULL) { return InvalidParameter; } for (i = 0; i < bitmap_data->property_count; i++) { if (bitmap_data->property[i].id == id) { *index = i; return Ok; } } return PropertyNotFound; } GpStatus gdip_bitmapdata_clone(BitmapData *src, BitmapData **dest, int count) { GpStatus status; BitmapData *result; int i; if (dest == NULL) { return InvalidParameter; } if (src == NULL) { *dest = NULL; return Ok; } result = GdipAlloc(sizeof(BitmapData) * count); if (result == NULL) { return OutOfMemory; } for (i = 0; i < count; i++) { result[i].width = src[i].width; result[i].height = src[i].height; result[i].stride = src[i].stride; result[i].pixel_format = src[i].pixel_format; result[i].reserved = GBD_OWN_SCAN0; /* We're duplicating SCAN0, we always own it*/ result[i].dpi_horz = src[i].dpi_horz; result[i].dpi_vert = src[i].dpi_vert; result[i].image_flags = src[i].image_flags; result[i].top = src[i].top; result[i].left = src[i].left; result[i].x = src[i].x; result[i].y = src[i].y; result[i].transparent = src[i].transparent; if (src[i].scan0 != NULL) { result[i].scan0 = GdipAlloc(src[i].stride * src[i].height); if (result[i].scan0 == NULL) { GdipFree(result); return OutOfMemory; } memcpy(result[i].scan0, src[i].scan0, src[i].stride * src[i].height); } else { result[i].scan0 = NULL; } result[i].palette = gdip_palette_clone (src[i].palette); result[i].property_count = src[i].property_count; status = gdip_propertyitems_clone(src[i].property, &result[i].property, src[i].property_count); if (status != Ok) { int j; for (j = 0; j < i; j++) { if (result[j].scan0 != NULL) { GdipFree(result[j].scan0); } if (result[j].property != NULL) { gdip_propertyitems_dispose(result[j].property, result[j].property_count); } } GdipFree(result); return status; } } *dest = result; return Ok; } static GpStatus gdip_bitmapdata_dispose(BitmapData *bitmap, int count) { int index; if (bitmap == NULL) { return Ok; } for (index = 0; index < count; index++) { if ((bitmap[index].scan0 != NULL) && ((bitmap[index].reserved & GBD_OWN_SCAN0) != 0)) { GdipFree(bitmap[index].scan0); } if (bitmap[index].palette != NULL) { GdipFree(bitmap[index].palette); } gdip_propertyitems_dispose(bitmap[index].property, bitmap[index].property_count); } GdipFree(bitmap); return Ok; } /* Add a new frame for the given dimension, if it does not exist. Return pointer to frame for dimension */ FrameData * gdip_frame_add(GpBitmap *bitmap, const GUID *dimension) { int i; if (bitmap == NULL) { return NULL; } if (bitmap->frames == NULL) { bitmap->frames = GdipAlloc(sizeof(FrameData)); if (bitmap->frames == NULL) { return NULL; } bitmap->num_of_frames = 1; bitmap->frames[0].count = 0; bitmap->frames[0].bitmap = NULL; bitmap->frames[0].frame_dimension = *dimension; return bitmap->frames; } else { /* Check if this dimension already exists, if not, add it */ for (i = 0; i < bitmap->num_of_frames; i++) { if (memcmp(&bitmap->frames[i].frame_dimension, dimension, sizeof(GUID)) == 0) { return &bitmap->frames[i]; } } /* No frame for the requested dimension exists */ bitmap->num_of_frames++; bitmap->frames = gdip_realloc (bitmap->frames, sizeof(FrameData) * (bitmap->num_of_frames)); if (bitmap->frames == NULL) { return NULL; } bitmap->frames[bitmap->num_of_frames - 1].count = 0; bitmap->frames[bitmap->num_of_frames - 1].bitmap = NULL; bitmap->frames[bitmap->num_of_frames - 1].frame_dimension = *dimension; return &bitmap->frames[bitmap->num_of_frames - 1]; } } /* Add a new BitmapData structure to an existing frame, return pointer to the new structure */ BitmapData * gdip_frame_add_bitmapdata(FrameData *frame) { if (frame == NULL) { return NULL; } if (frame->bitmap == NULL) { frame->bitmap = GdipAlloc(sizeof(BitmapData)); if (frame->bitmap == NULL) { return NULL; } gdip_bitmapdata_init(frame->bitmap); frame->count++; return frame->bitmap; } frame->bitmap = gdip_realloc (frame->bitmap, sizeof(BitmapData) * (frame->count + 1)); if (frame->bitmap == NULL) { return NULL; } gdip_bitmapdata_init(&frame->bitmap[frame->count]); frame->count++; return &frame->bitmap[frame->count - 1]; } ColorPalette* gdip_palette_clone (ColorPalette *original) { if (!original) return NULL; /* ColorPalette definition already includes a (single) ARGB value */ int size = sizeof (ColorPalette) + sizeof (ARGB) * (original->Count - 1); ColorPalette *result = GdipAlloc (size); if (result) memcpy (result, original, size); return result; } GpStatus gdip_bitmap_setactive(GpBitmap *bitmap, const GUID *dimension, int index) { int i; if (bitmap == NULL) { return InvalidParameter; } /* Invalidate the cached surface */ if (bitmap->surface != NULL) { cairo_surface_destroy(bitmap->surface); bitmap->surface = NULL; } if ((bitmap->num_of_frames == 0) || (bitmap->frames == NULL)) { bitmap->active_frame = 0; bitmap->active_bitmap_no = 0; bitmap->active_bitmap = NULL; return Ok; } if (dimension == NULL) { if (bitmap->frames[0].count <= index) { return InvalidParameter; } bitmap->active_frame = 0; bitmap->active_bitmap_no = index; bitmap->active_bitmap = &bitmap->frames[0].bitmap[index]; return Ok; } for (i = 0; i < bitmap->num_of_frames; i++) { if (memcmp(&bitmap->frames[i].frame_dimension, dimension, sizeof(GUID)) == 0) { if (bitmap->frames[i].count <= index) { return InvalidParameter; } bitmap->active_frame = i; bitmap->active_bitmap_no = index; bitmap->active_bitmap = &bitmap->frames[i].bitmap[index]; return Ok; } } bitmap->active_frame = 0; bitmap->active_bitmap_no = 0; bitmap->active_bitmap = NULL; return InvalidParameter; } GpStatus gdip_bitmap_clone (GpBitmap *bitmap, GpBitmap **clonedbitmap) { GpBitmap *result; int frame; int image; GpStatus status; result = (GpBitmap *) GdipAlloc (sizeof (GpBitmap)); if (result == NULL) { return OutOfMemory; } /* Copy simple types */ result->type = bitmap->type; result->image_format = bitmap->image_format; result->num_of_frames = bitmap->num_of_frames; result->active_frame = bitmap->active_frame; result->active_bitmap_no = bitmap->active_bitmap_no; result->active_bitmap = NULL; result->cairo_format = bitmap->cairo_format; result->surface = NULL; /* Allocate and copy frames, properties and bitmap data */ if (bitmap->frames != NULL) { result->frames = GdipAlloc(sizeof (FrameData) * result->num_of_frames); for (frame = 0; frame < result->num_of_frames; frame++) { result->frames[frame].count = bitmap->frames[frame].count; result->frames[frame].frame_dimension = bitmap->frames[frame].frame_dimension; result->frames[frame].bitmap = NULL; status = gdip_bitmapdata_clone (bitmap->frames[frame].bitmap, &result->frames[frame].bitmap, bitmap->frames[frame].count); if (status != Ok) goto fail; } result->active_bitmap = &result->frames[result->active_frame].bitmap[result->active_bitmap_no]; } else { bitmap->frames = NULL; } *clonedbitmap = result; return Ok; fail: gdip_bitmap_dispose(result); return status; } GpBitmap * gdip_bitmap_new(void) { GpBitmap *result; result = (GpBitmap *) GdipAlloc (sizeof (GpBitmap)); if (result != NULL) { gdip_bitmap_init (result); } return result; } /* Create a new bitmap, and create a frame with the given dimension */ GpBitmap * gdip_bitmap_new_with_frame (const GUID *dimension, BOOL add_bitmapdata) { GpBitmap *result; FrameData *frame; if (dimension == NULL) { dimension = &gdip_image_frameDimension_page_guid; } result = gdip_bitmap_new(); if (result != NULL) { frame = gdip_frame_add(result, dimension); if ((frame != NULL) && add_bitmapdata) { BitmapData *bitmap_data; bitmap_data = gdip_frame_add_bitmapdata(frame); if (bitmap_data != NULL) { result->active_bitmap = bitmap_data; } } } return result; } GpStatus gdip_bitmap_dispose (GpBitmap *bitmap) { /* Might be called with partially filled bitmaps, so check values to be freed instead of assuming */ if (!bitmap) return Ok; if (bitmap->frames) { int frame; for (frame = 0; frame < bitmap->num_of_frames; frame++) { gdip_bitmapdata_dispose (bitmap->frames[frame].bitmap, bitmap->frames[frame].count); } GdipFree (bitmap->frames); } if (bitmap->surface) cairo_surface_destroy (bitmap->surface); GdipFree (bitmap); return Ok; } /* coverity[+alloc : arg-*1] */ GpStatus GdipCreateBitmapFromFile (GDIPCONST WCHAR* filename, GpBitmap **bitmap) { GpStatus status = GdipLoadImageFromFile (filename, (GpImage **) bitmap); if (status == OutOfMemory) status = InvalidParameter; return status; } /* coverity[+alloc : arg-*1] */ GpStatus GdipCreateBitmapFromFileICM (GDIPCONST WCHAR* filename, GpBitmap **bitmap) { /* ICM isn't supported */ return GdipCreateBitmapFromFile (filename, bitmap); } /* coverity[+alloc : arg-*5] */ GpStatus GdipCreateBitmapFromScan0 (int width, int height, int stride, PixelFormat format, BYTE *scan0, GpBitmap **bitmap) { GpStatus status; FrameData *frame; GpBitmap *result; BitmapData *bitmap_data; int cairo_format; int flags = 0; if (width <= 0 || height <= 0) { return InvalidParameter; } switch (format) { case PixelFormat24bppRGB: { cairo_format = CAIRO_FORMAT_RGB24; break; } case PixelFormat32bppARGB: case PixelFormat32bppPARGB: flags = ImageFlagsHasAlpha; /* fall through */ case PixelFormat32bppRGB: cairo_format = CAIRO_FORMAT_ARGB32; break; case PixelFormat16bppRGB555: case PixelFormat16bppRGB565: /* fake them as 32bpp RGB as Cairo deprecated CAIRO_FORMAT_RGB16_565 support */ /* why 32bpp ? because that's the result of MS GDI+ when loading them, even if the bitmap is empty */ format = PixelFormat32bppRGB; stride *= 2; cairo_format = CAIRO_FORMAT_ARGB32; break; case PixelFormat8bppIndexed: case PixelFormat4bppIndexed: { cairo_format = CAIRO_FORMAT_A8; break; } case PixelFormat1bppIndexed: { cairo_format = CAIRO_FORMAT_A1; break; } default: { *bitmap = NULL; return NotImplemented; } } result = gdip_bitmap_new (); if (result == NULL) { return OutOfMemory; } result->image_format = MEMBMP; result->cairo_format = cairo_format; result->surface = NULL; result->active_frame = 0; result->active_bitmap_no = 0; result->active_bitmap = NULL; /* Create single 'page' frame, with single bitmap */ frame = gdip_frame_add(result, &gdip_image_frameDimension_page_guid); if (frame == NULL) { status = OutOfMemory; goto fail; } bitmap_data = gdip_frame_add_bitmapdata(frame); if (bitmap_data == NULL) { status = OutOfMemory; goto fail; } /* populate first bitmap in first frame */ bitmap_data->width = width; bitmap_data->height = height; bitmap_data->pixel_format = format; bitmap_data->image_flags = flags; if (stride == 0) { if (gdip_is_an_indexed_pixelformat(format)) { stride = ((gdip_get_pixel_format_depth(format) * width) + 7) / 8; } else { stride = (gdip_get_pixel_format_components (format) * gdip_get_pixel_format_depth (format) * width) / 8; } /* make sure the stride aligns the next row to a 32 bits boundary */ gdip_align_stride (stride); } bitmap_data->stride = stride; if (scan0 == NULL) { scan0 = GdipAlloc (stride * height); if (scan0 == NULL) { status = OutOfMemory; goto fail; } if ((gdip_get_pixel_format_bpp(format) < 16) || gdip_is_an_alpha_pixelformat(format)) { memset (scan0, 0, stride * height); } else { /* Since the pixel format is not an alpha pixel format (i.e., it is * either PixelFormat24bppRGB or PixelFormat32bppRGB), the image should be * initially black, not initially transparent. Thus, we need to set * the alpha channel, which the user code doesn't think exists but * Cairo is still paying attention to, to 0xFF. */ int x; int y; ARGB solid_black; ARGB *scan; /* Make sure the alpha channel is at the right end of the word. */ set_pixel_bgra (&solid_black, 0, 0, 0, 0, 0xFF); for (y=0; y < height; y++) { scan = (ARGB *)((char *)scan0 + y * stride); for (x=0; x < width; x++) { scan[x] = solid_black; } } } bitmap_data->reserved = GBD_OWN_SCAN0; } bitmap_data->scan0 = scan0; /* Make sure indexed images have a palette */ if (gdip_is_an_indexed_pixelformat (format)) { int palette_entries; int header_size; int bytes_needed; const unsigned int *default_palette; int i; palette_entries = 1 << gdip_get_pixel_format_depth(format); header_size = sizeof(ColorPalette) - sizeof(ARGB); bytes_needed = header_size + palette_entries * sizeof(ARGB); bitmap_data->palette = GdipAlloc (bytes_needed); if (bitmap_data->palette == NULL) { status = OutOfMemory; goto fail; } bitmap_data->palette->Count = palette_entries; bitmap_data->palette->Flags = COLOR_PALETTE_FLAGS_DEFAULT; switch (format) { case PixelFormat1bppIndexed: default_palette = default_Format1bppIndexed_palette; bitmap_data->palette->Flags |= COLOR_PALETTE_FLAGS_GREYSCALE; break; case PixelFormat4bppIndexed: default_palette = default_Format4bppIndexed_palette; break; case PixelFormat8bppIndexed: default_palette = default_Format8bppIndexed_palette; bitmap_data->palette->Flags |= COLOR_PALETTE_FLAGS_HALFTONE; break; default: default_palette = NULL; /* Suppress unassigned val used warning */ palette_entries = 0; /* make sure we don't try to access default_palette later */ } #if WORDS_BIGENDIAN for (i=0; i < palette_entries; i++) { set_pixel_bgra (bitmap_data->palette->Entries, (i << 2), default_palette[i], (default_palette[i] >> 8), (default_palette[i] >> 16), (default_palette[i] >> 24)); } #else memcpy (bitmap_data->palette->Entries, default_palette, palette_entries * 4); #endif } else { bitmap_data->palette = NULL; } gdip_bitmap_setactive(result, NULL, 0); *bitmap = result; return Ok; fail: gdip_bitmap_dispose(result); return status; } /* coverity[+alloc : arg-*3] */ GpStatus GdipCreateBitmapFromGraphics (int width, int height, GpGraphics *graphics, GpBitmap **bitmap) { GpBitmap *result; FrameData *frame; BitmapData *bitmap_data; int stride; stride = width * 4; gdip_align_stride (stride); result = gdip_bitmap_new (); result->image_format = MEMBMP; result->cairo_format = CAIRO_FORMAT_ARGB32; frame = gdip_frame_add(result, &gdip_image_frameDimension_page_guid); if (frame == NULL) { goto fail; } bitmap_data = gdip_frame_add_bitmapdata(frame); if (bitmap_data == NULL) { goto fail; } bitmap_data->width = width; bitmap_data->height = height; bitmap_data->stride = stride; bitmap_data->pixel_format = PixelFormat32bppARGB; bitmap_data->reserved = GBD_OWN_SCAN0; bitmap_data->scan0 = GdipAlloc(stride * height); if (bitmap_data->scan0 == NULL) { goto fail; } memset (bitmap_data->scan0, 0, stride * height); gdip_bitmap_setactive(result, NULL, 0); *bitmap = result; return Ok; fail: gdip_bitmap_dispose(result); return OutOfMemory; } GpStatus GdipCreateBitmapFromHBITMAP (HBITMAP hbm, HPALETTE hpal, GpBitmap** bitmap) { if (!bitmap || !hbm) return InvalidParameter; return GdipCloneImage ((GpImage *)hbm, (GpImage**)bitmap); } GpStatus GdipCreateHBITMAPFromBitmap (GpBitmap* bitmap, HBITMAP *hbmReturn, ARGB background) { /* * Note: the handle must survive disposing the bitmap. This means that there's no interoperable way to free this memory. * For libgdiplus you must use GdipDisposeImage on the handle, while on Windows you should call the DeleteObject function. */ GpStatus status = GdipCloneImage ((GpImage *)bitmap, (GpImage**)hbmReturn); if (status != Ok) return status; ((GpImage*)*hbmReturn)->image_format = MEMBMP; ((GpImage*)*hbmReturn)->active_bitmap->image_flags |= ImageFlagsUndocumented; /* 0x00040000 */ ((GpImage*)*hbmReturn)->active_bitmap->image_flags &= ~ImageFlagsHasAlpha; /* 0x00000002 */ return Ok; } GpStatus GdipCreateBitmapFromHICON (HICON hicon, GpBitmap** bitmap) { GpStatus status; if (!hicon || !bitmap) return InvalidParameter; status = GdipCloneImage ((GpImage *)hicon, (GpImage**)bitmap); if (status == Ok) { /* ColorPalette definition includes one ARGB member (ARGB Entries[1]). In reality there are * Count entries allocated, where Count can be 0 (and required to substract the ARGB size) */ /* coverity[buffer_alloc] */ ColorPalette *palette = (ColorPalette*)GdipAlloc (sizeof (ColorPalette) - sizeof (ARGB)); if (!palette) return OutOfMemory; palette->Flags = 0; palette->Count = 0; status = GdipSetImagePalette ((GpImage*)*bitmap, palette); (*bitmap)->image_format = MEMBMP; (*bitmap)->active_bitmap->image_flags |= ImageFlagsUndocumented;/* 0x00040000 */ (*bitmap)->active_bitmap->image_flags &= ~ImageFlagsHasAlpha; /* 0x00000002 */ GdipFree (palette); } return status; } GpStatus GdipCreateHICONFromBitmap (GpBitmap* bitmap, HICON *hbmReturn) { /* * Note: the handle must survive disposing the bitmap. This means that there's no interoperable way to free this memory. * For libgdiplus you must use GdipDisposeImage on the handle, while on Windows you should call the DestroyIcon function. */ return GdipCloneImage ((GpImage *)bitmap, (GpImage**)hbmReturn); } GpStatus GdipCreateBitmapFromResource (HINSTANCE hInstance, GDIPCONST WCHAR *lpBitmapName, GpBitmap** bitmap) { return(NotImplemented); } /* coverity[+alloc : arg-*6] */ GpStatus GdipCloneBitmapAreaI (int x, int y, int width, int height, PixelFormat format, GpBitmap *original, GpBitmap **bitmap) { GpBitmap *result; FrameData *frame; BitmapData *bitmap_data; Rect sr = { x, y, width, height }; Rect dr = { 0, 0, width, height }; GpStatus status; if ((original == NULL) || (bitmap == NULL) || (original->active_bitmap == NULL)) { return InvalidParameter; } if (((x + width) > original->active_bitmap->width) || ((y + height) > original->active_bitmap->height)) { return InvalidParameter; } result = gdip_bitmap_new_with_frame(NULL, TRUE); if (result == NULL) { return OutOfMemory; } result->image_format = original->image_format; status = gdip_bitmap_clone_data_rect (original->active_bitmap, &sr, result->active_bitmap, &dr); if (status != Ok) { goto fail; } result->cairo_format = original->cairo_format; *bitmap = result; return Ok; fail: gdip_bitmap_dispose (result); return status; } /* coverity[+alloc : arg-*6] */ GpStatus GdipCloneBitmapArea (float x, float y, float w, float h, PixelFormat format, GpBitmap *original, GpBitmap **bitmap) { return GdipCloneBitmapAreaI ((int) x, (int) y, (int) w, (int) h, format, original, bitmap); } static void gdip_copy_strides (void *dst, int dstStride, void *src, int srcStride, int realBytes, int height) { int i; for (i = 0; i < height; i++) { memcpy (dst, src, realBytes); dst += dstStride; src += srcStride; } } /* * Copy srcRect region in srcData to destRect region in destData. No conversion is done. Assumes * BitmapData is straight from a GpBitmap. src and dest rects must be the same width/height and * bits must be of the same PixelFormat. */ static GpStatus gdip_bitmap_clone_data_rect (BitmapData *srcData, Rect *srcRect, BitmapData *destData, Rect *destRect) { int dest_components; int dest_depth; if ((srcData == NULL) || (srcRect == NULL) || (destData == NULL) || (destRect == NULL) || (srcRect->Width != destRect->Width) || (srcRect->Height != destRect->Height)) { return InvalidParameter; } if (!gdip_is_a_supported_pixelformat (srcData->pixel_format)) { return NotImplemented; } dest_components = gdip_get_pixel_format_components (destData->pixel_format); if (destData->scan0 == NULL) { dest_components = gdip_get_pixel_format_components (srcData->pixel_format); dest_depth = gdip_get_pixel_format_depth (srcData->pixel_format); destData->pixel_format = srcData->pixel_format; destData->stride = ((destRect->Width * dest_components * dest_depth) >> 3); gdip_align_stride (destData->stride); destData->scan0 = GdipAlloc (destData->stride * destRect->Height); if (destData== NULL) { return OutOfMemory; } destData->width = destRect->Width; destData->height = destRect->Height; destData->pixel_format = srcData->pixel_format; destData->reserved = GBD_OWN_SCAN0; if (srcData->palette) { destData->palette = gdip_palette_clone (srcData->palette); if (!destData->palette) { GdipFree (destData->scan0); destData->scan0 = NULL; return OutOfMemory; } } } if (!gdip_is_an_indexed_pixelformat (srcData->pixel_format)) { gdip_copy_strides (destData->scan0, destData->stride, srcData->scan0 + (srcData->stride * srcRect->Y) + (gdip_get_pixel_format_components (srcData->pixel_format) * srcRect->X), srcData->stride, destRect->Width * dest_components, destRect->Height); } else { int src_depth; int src_first_x_bit_index; int width_bits; int src_first_x_bit_offset_into_byte; src_depth = gdip_get_pixel_format_depth (srcData->pixel_format); /* first, check if the bits are aligned onto a byte boundary */ src_first_x_bit_index = srcRect->X * src_depth; width_bits = destRect->Width * src_depth; src_first_x_bit_offset_into_byte = src_first_x_bit_index & 7; if (src_first_x_bit_offset_into_byte == 0) { /* the fast path: no mid-byte bit mangling required :-) * this will always be the case for 8-bit images. * basically, the source bits are aligned to the destination * bytes, and it doesn't matter if the width isn't a multiple * of 8 bits, because the remainder is guaranteed to be * allocated by the stride, and will be ignored because the * width will indicate fewer pixels than actually end up being * copied. */ gdip_copy_strides ( destData->scan0, destData->stride, srcData->scan0 + (src_first_x_bit_index / 8) + (srcData->stride * srcRect->Y), srcData->stride, width_bits / 8, destRect->Height); } else { /* the not-so-fast path: no bits are aligned, so the entire image requires bit juggling. */ BYTE *src_scan; BYTE *src_scan0; BYTE *dest_scan; BYTE *dest_scan0; unsigned short buffer; int left_shift; int x; int y; src_scan0 = srcData->scan0; dest_scan0 = destData->scan0; left_shift = src_first_x_bit_offset_into_byte; /* move the src_scan0 up to the first byte with pixel data involved in the copy */ src_scan0 += srcRect->Y * srcData->stride; src_scan0 += (src_first_x_bit_offset_into_byte / 8); for (y=0; y < destRect->Height; y++) { src_scan = src_scan0 + y * srcData->stride; dest_scan = dest_scan0 + y * destData->stride; /* jump-start the packing function. it avoids double-sampling the source bits by * using buffer as a shift register; bits 8-15 are the current packed dest pixel, * and some of bits 0-7 are not used, to permit alignment of the pixel data. */ buffer = src_scan[0] << left_shift; for (x = 1; x < destRect->Width; x++) { buffer <<= 8; buffer |= src_scan[x] << left_shift; dest_scan[0] = (buffer >> 8); } } } } return Ok; } /* * According to GDI+ testing, * RGB[A] PixelFormats can be converted to/from any other RGB[A] pixel format, with or without alpha. * We should support all of these: * * 32bpp argb - 16bpp argb 1555 * 32bpp argb - 16bpp rgb 555 * 32bpp argb - 16bpp rgb 565 * 32bpp argb - 24bpp rgb 888 * 32bpp argb - 32bpp Pargb * 32bpp argb - 32bpp rgb * * Upconversion is allowed (e.g 8bpp indexed to 32bpp rgb), but no downconversion (32bpp to 8bpp indexed) * */ static int gdip_is_pixel_format_conversion_valid (PixelFormat src, PixelFormat dest) { if (src == dest) { return 1; } /* non-GDI supported formats can't be converted */ if (!(src & PixelFormatGDI)) { return 0; } /* We don't allow converting *to* indexed formats */ if (dest & PixelFormatIndexed) { return 0; } /* These are the RGB formats */ if ((src & PixelFormatGDI) && !(src & PixelFormatExtended)) { /* all of these should be supported, but we only report the * ones we really can do for now */ /* We can't handle converting to/from the 565/555/1555 ones */ if ((src & 0xff00) == 16 || (dest & 0xff00) == 16) { return 0; } return 1; } return 0; } #if FALSE /* PixelFormat24bppRGB is internally stored by Cairo as a four bytes. Convert it to 3-byte (RGB) */ int gdip_from_ARGB_to_RGB (BYTE *src, int width, int height, int stride, BYTE **dest, int* dest_stride) { int x; int y; BYTE *result; BYTE *pos_src; BYTE *pos_dest; int src_components = 4; /* ARGB */ int dest_components = 3; /* RGB */ int stride = ((dest_components << 3) * width) >> 3); gdip_align_stride (stride); *dest_stride = stride; result = GdipAlloc (*dest_stride * height); if (result == NULL) { return OutOfMemory; } memset (result, 0, *dest_stride * height); for (y = 0, pos_src = src, pos_dest = result; y < height; y++, pos_src += stride, pos_dest += *dest_stride) { for (x = 0; x < width; x++) { pos_dest[0 + (dest_components * x)] = pos_src[0 + (src_components * x)]; pos_dest[1 + (dest_components * x)] = pos_src[1 + (src_components * x)]; pos_dest[2 + (dest_components * x)] = pos_src[2 + (src_components * x)]; } } *dest = result; return Ok; } /* PixelFormat24bppRGB is internally stored by Cairo as a three bytes. Convert it to 4-byte (ARGB) */ int gdip_from_RGB_to_ARGB (BYTE *src, int width, int height, int stride, BYTE **dest, int* dest_stride) { int x; int y; BYTE *result; BYTE *pos_src; BYTE *pos_dest; int src_components = 3; /* RGB */ int dest_components = 4; /* ARGB */ int stride = ((dest_components << 3) * width) >> 3); gdip_align_stride (stride); *dest_stride = stride; result = GdipAlloc (*dest_stride * height); if (result == NULL) { return OutOfMemory; } memset (result, 0, *dest_stride * height); for (y = 0, pos_src = src, pos_dest = result; y < height; y++, pos_src += stride, pos_dest += *dest_stride) { for (x = 0; x < width; x++) { pos_dest[0 + (dest_components * x)] = pos_src[0 + (src_components * x)]; pos_dest[1 + (dest_components * x)] = pos_src[1 + (src_components * x)]; pos_dest[2 + (dest_components * x)] = pos_src[2 + (src_components * x)]; pos_dest[3 + (dest_components * x)] = 0xff; } } *dest = result; return Ok; } #endif GpStatus gdip_init_pixel_stream (StreamingState *state, BitmapData *data, int x, int y, int w, int h) { if ((state == NULL) || (data == NULL) || (data->scan0 == NULL)) { return InvalidParameter; } /* Ensure that the rectangle requested is legal. */ if ((x < 0) || (y < 0) || ((x + w) > data->width) || ((y + h) > data->height)) { return InvalidParameter; } /* Initialize the StreamingState structure to point at the first pixel. */ state->region.X = x; state->region.Y = y; state->region.Width = w; state->region.Height = h; state->x = x; state->y = y; state->p = -1; /* ensure that the buffer will be preloaded on the first call, for indexed formats */ /* The following computation will compute the byte pointer that _contains_ the first * pixel; this doesn't necessarily mean that the pixel is aligned to the byte. This * will be handled in gdip_pixel_stream_get_next () each time it starts a new row. */ state->scan = (BYTE*)(data->scan0) + y * data->stride; switch (data->pixel_format) { case PixelFormat1bppIndexed: state->one_pixel_mask = 0x01; state->one_pixel_shift = 1; state->pixels_per_byte = 8; state->scan += (x >> 3); /* x * 1 / 8 */ break; case PixelFormat4bppIndexed: state->one_pixel_mask = 0x0F; state->one_pixel_shift = 4; state->pixels_per_byte = 2; state->scan += (x >> 1); /* x * 4 / 8 */ break; case PixelFormat8bppIndexed: state->one_pixel_mask = 0xFF; state->one_pixel_shift = 8; state->pixels_per_byte = 1; state->scan += x; /* x * 8 / 8 */ break; case PixelFormat24bppRGB: /* GDI+ use 3 bytes for 24 bpp while Cairo use 4 bytes */ if (data->reserved & GBD_TRUE24BPP) { state->pixels_per_byte = -3; state->scan += ((x * 3) >> 3); /* x * 3 / 8 */ break; } /* else continue (don't break) */ case PixelFormat32bppRGB: default: /* indicate full RGB processing */ state->pixels_per_byte = -(gdip_get_pixel_format_bpp (data->pixel_format) >> 3); state->scan -= x * state->pixels_per_byte; break; } state->data = data; return Ok; } static BOOL gdip_pixel_stream_has_next (StreamingState *state) { if (state != NULL) { return (state->p >= 0) || ((state->y < (state->region.Y + state->region.Height)) && (state->x < (state->region.X + state->region.Width))); } else { return FALSE; } } unsigned int /* <-- can be an ARGB or a palette index */ gdip_pixel_stream_get_next (StreamingState *state) { unsigned int ret; if (state == NULL) { int bright_pink; set_pixel_bgra(&bright_pink, 0, 0xFF, 0x00, 0xFF, 0xFF); /* bright pink; hopefully this will get somebody's attention :-) */ return bright_pink; } /* Note: This function does not check whether the end of the region has been hit. This function can * potentially overrun memory buffers! gdip_pixel_stream_has_next () must be used in conjunction * with this function. */ if (state->pixels_per_byte == 1) { /* A fast path for 8-bit indexed data: pixels are byte-aligned, so no special unpacking is required. */ ret = *state->scan; state->scan++; state->x++; if (state->x >= (state->region.X + state->region.Width)) { state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x; } } else if (state->pixels_per_byte > 0) { /* We have an indexed format (the RGB formats can't fit a whole pixel into a single byte). */ if (state->p < 0) { state->buffer = *state->scan; state->scan++; state->p = 0; if (state->x == state->region.X) { /* First pixel of the row; check whether it is aligned to the byte or not. */ int index_into_byte = state->x & (state->pixels_per_byte - 1); if (index_into_byte != 0) { /* Not aligned; need to advance the buffer to the * first pixel in the stream region. */ state->buffer <<= (index_into_byte * state->one_pixel_shift); state->p = index_into_byte; } } } state->buffer <<= state->one_pixel_shift; ret = (state->buffer >> 8) & state->one_pixel_mask; state->x++; state->p++; /* Have we hit the end of the buffer? */ if (state->p >= state->pixels_per_byte) state->p = -1; if (state->x >= (state->region.X + state->region.Width)) { state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x * gdip_get_pixel_format_bpp (state->data->pixel_format) / 8; state->p = -1; } } else { /* We have an RGB format. In the current implementation, these are always stored as * CAIRO_FORMAT_ARGB. This makes this section very easy to implement. If native * support for 15- and 16-bit pixel formats needs to be added in the future, though, * then this is where it needs to be done. * * In order to simplify advancing the state->scan pointer, the state->pixels_per_byte * member is set to the number of bytes per pixel, negated. That is, for 24-bit * formats, it is set to -3, and for 32-bit formats, it is set to -4. * * Note that pixel streams do not support 48- and 64-bit data at this time. */ if (state->pixels_per_byte == -4) { #if WORDS_BIGENDIAN ret = state->scan [0] | (state->scan [1] << 8) | (state->scan [2] << 16) | (state->scan [3] << 24); #else ret = *(unsigned int *)state->scan; #endif } else { /* Special case: 24-bit data needs to have the cairo format alpha component forced * to 0xFF, or many operations will do nothing (or do strange things if the alpha * channel contains garbage). */ ret = state->scan [0] | (state->scan [1] << 8) | (state->scan [2] << 16) | 0xFF000000; } state->scan -= state->pixels_per_byte; state->x++; if (state->x >= (state->region.X + state->region.Width)) { state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x * -state->pixels_per_byte; } } return ret; } static void gdip_pixel_stream_set_next (StreamingState *state, unsigned int pixel_value) { if (state == NULL) { return; } /* Note: This function does not check whether the end of the region has been hit. This function can * potentially overrun memory buffers! gdip_pixel_stream_has_next () must be used in conjunction * with this function. */ if (state->pixels_per_byte == 1) { /* A fast path for 8-bit indexed data: pixels are byte-aligned, so no special packing is required. */ *state->scan = pixel_value; state->scan++; state->x++; if (state->x >= (state->region.X + state->region.Width)) { state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x; } } else if (state->pixels_per_byte > 0) { /* We have an indexed format (the RGB formats can't fit a whole pixel into a single byte). */ if (state->p < 0) { state->p = 0; if (state->x == state->region.X) { /* First pixel of the row; check whether it is aligned to the byte or not. */ int index_into_byte = state->x & (state->pixels_per_byte - 1); if (index_into_byte == 0) { /* It is aligned; all we need to do is clear the buffer. */ state->buffer = 0; } else { /* It is not aligned; the buffer needs to be pre-loaded with those * pixels that are to the left of the first pixel to be set. */ state->buffer = (*state->scan << (index_into_byte * state->one_pixel_shift)); state->p = index_into_byte; } } } state->buffer <<= state->one_pixel_shift; state->buffer |= ((pixel_value & state->one_pixel_mask) << 8); state->x++; state->p++; /* Have we hit the end of the buffer? */ if (state->p >= state->pixels_per_byte) { *state->scan = (state->buffer >> 8); state->scan++; state->p = -1; } if (state->x >= (state->region.X + state->region.Width)) { if (state->p >= 0) { int existing_mask = 0; while (state->p < state->pixels_per_byte) { existing_mask <<= state->one_pixel_shift; existing_mask |= state->one_pixel_mask; state->buffer <<= state->one_pixel_shift; state->p++; } *state->scan = (*state->scan & existing_mask) | (state->buffer >> 8); } state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x * gdip_get_pixel_format_bpp (state->data->pixel_format) / 8; state->p = -1; } } else { /* We have an RGB format. In the current implementation, these are always stored as * CAIRO_FORMAT_ARGB. This makes this section very easy to implement. If native * support for 15- and 16-bit pixel formats needs to be added in the future, though, * then this is where it needs to be done. * * In order to simplify advancing the state->scan pointer, the state->pixels_per_byte * member is set to the number of bytes per pixel, negated. That is, for 24-bit * formats, it is set to -3, and for 32-bit formats, it is set to -4. * * Note that pixel streams do not support 48- and 64-bit data at this time. */ if (state->pixels_per_byte == -4) { #if WORDS_BIGENDIAN state->scan [0] = (pixel_value >> 24); state->scan [1] = (pixel_value >> 16); state->scan [2] = (pixel_value >> 8); state->scan [3] = (state->data->pixel_format == PixelFormat32bppRGB) ? 0xFF : pixel_value; #else if (state->data->pixel_format == PixelFormat32bppRGB) pixel_value |= 0xFF000000; *(unsigned int *)state->scan = pixel_value; #endif } else { /* ensure we don't get one byte over our allocated buffer */ #if WORDS_BIGENDIAN state->scan [0] = (pixel_value >> 24); state->scan [1] = (pixel_value >> 16); state->scan [2] = (pixel_value >> 8); #else state->scan [2] = (pixel_value >> 16); state->scan [1] = (pixel_value >> 8); state->scan [0] = pixel_value; #endif } state->scan -= state->pixels_per_byte; state->x++; if (state->x >= (state->region.X + state->region.Width)) { state->x = state->region.X; state->y++; state->scan = (BYTE*)(state->data->scan0) + state->y * state->data->stride + state->x * -state->pixels_per_byte; } } } static BOOL /* <-- TRUE if optimisation was possible and copy done, else FALSE */ gdip_pixel_stream_copy_optimized (StreamingState *dst_state, StreamingState *src_state) { unsigned int ret; if (src_state == NULL) return FALSE; if (dst_state == NULL) return FALSE; /* in a first shot we only support copy operations for cases where source and destination storage width is exactly the same */ if (src_state->pixels_per_byte != dst_state->pixels_per_byte) return FALSE; //if (src_state->data->pixel_format == PixelFormat32bppRGB) return FALSE; /* if the target is in 32bpp format with only RGB but no alpha then we should forcefully set all alpha bits to 0xff -> optimize this later! */ if (dst_state->pixels_per_byte == -4) { if (dst_state->data->pixel_format == PixelFormat32bppRGB) return FALSE; } /* optimisation code differs for different bytes per pixel (== pixels per byte) */ if (src_state->pixels_per_byte == 1) { /* A fast path for 8-bit indexed data: pixels are byte-aligned, so no special unpacking is required. */ return FALSE; /* optimize this later */ } else if (src_state->pixels_per_byte > 0) { /* We have an indexed format (the RGB formats can't fit a whole pixel into a single byte). */ return FALSE; /* optimize this later */ } else if (src_state->pixels_per_byte == 0) { return FALSE; /* unknown format - dont know how to handle; this is a sanity check for crash prevention in the following code */ } else { /* We have an RGB format. In the current implementation, these are always stored as * CAIRO_FORMAT_ARGB. This makes this section very easy to implement. If native * support for 15- and 16-bit pixel formats needs to be added in the future, though, * then this is where it needs to be done. * * In order to simplify advancing the state->scan pointer, the state->pixels_per_byte * member is set to the number of bytes per pixel, negated. That is, for 24-bit * formats, it is set to -3, and for 32-bit formats, it is set to -4. * * Note that pixel streams do not support 48- and 64-bit data at this time. */ #if WORDS_BIGENDIAN return FALSE; /* optimize this later */ #else int bytes_per_pixel = -src_state->pixels_per_byte; int bytes_per_line = bytes_per_pixel * src_state->region.Width; int bytes_per_region = bytes_per_line * src_state->region.Height; int src_stride = src_state->data->stride; int dst_stride = dst_state->data->stride; /* calculate region base addresses (this might resemble the current ..._state->scan value, but we simply dont care) */ BYTE* src_region = (BYTE*)(src_state->data->scan0) + src_state->region.Y * src_stride + src_state->region.X * bytes_per_pixel; BYTE* dst_region = (BYTE*)(dst_state->data->scan0) + dst_state->region.Y * dst_stride + dst_state->region.X * bytes_per_pixel; /* check if thze data at both locations is in a perfectly consecutive arrangement */ if ((src_state->region.Width * bytes_per_pixel == src_stride) && (dst_state->region.Width * bytes_per_pixel == dst_stride)) { memcpy (dst_region, src_region, bytes_per_region); } else { BYTE *src = src_region; BYTE *dst = dst_region; int lines; for (lines = src_state->region.Height; lines; lines--) { memcpy (dst, src, bytes_per_line); src += src_stride; dst += dst_stride; } } /* all data got copied */ /* adjust the position index and the scan value to the end of the region */ src_state->x = src_state->region.X + src_state->region.Width; src_state->y = src_state->region.Y + src_state->region.Height; src_state->scan += src_state->region.Y * src_stride; dst_state->x = dst_state->region.X + dst_state->region.Width; dst_state->y = dst_state->region.Y + dst_state->region.Height; dst_state->scan += dst_state->region.Y * dst_stride; #endif } return TRUE; } /** * srcData - input data * srcRect - rectangle of input data to place in destData * destData - where to place output; only the PixelFormat field is needed, * which specifies the output type. * destRect - destination rectangle in output. * * assumes that: * - non-null data * - rectangles are valid * - the pixel format conversion has already been validated. */ static GpStatus gdip_bitmap_change_rect_pixel_format (BitmapData *srcData, Rect *srcRect, BitmapData *destData, Rect *destRect) { PixelFormat srcFormat; PixelFormat destFormat; StreamingState srcStream; StreamingState destStream; Rect effectiveDestRect; GpStatus status; srcFormat = srcData->pixel_format; destFormat = destData->pixel_format; if (!gdip_is_pixel_format_conversion_valid (srcFormat, destFormat)) return InvalidParameter; if (!destData->scan0) return InvalidParameter; /* Check that the destRect lies fully within the destData buffer. */ if ((destRect->X + destRect->Width > destData->width) || (destRect->Y + destRect->Height > destData->height)) return InvalidParameter; effectiveDestRect = *destRect; if (effectiveDestRect.Width > srcRect->Width) { effectiveDestRect.Width = srcRect->Width; } if (effectiveDestRect.Height > srcRect->Height) { effectiveDestRect.Height = srcRect->Height; } /* Fire up the pixel streams. */ status = gdip_init_pixel_stream (&srcStream, srcData, srcRect->X, srcRect->Y, srcRect->Width, srcRect->Height); if (status != Ok) { return status; } status = gdip_init_pixel_stream (&destStream, destData, effectiveDestRect.X, effectiveDestRect.Y, effectiveDestRect.Width, effectiveDestRect.Height); if (status != Ok) { return status; } /* Move the data; special path going from indexed to not-indexed */ if ((srcFormat & PixelFormatIndexed) && !(destFormat & PixelFormatIndexed)) { int pixel; while (gdip_pixel_stream_has_next (&srcStream)) { pixel = gdip_pixel_stream_get_next (&srcStream); /* Look up the pixel in the palette and get the ARGB value */ pixel = srcData->palette->Entries[pixel]; #if G_BYTE_ORDER != G_LITTLE_ENDIAN pixel = GUINT32_FROM_LE (pixel); #endif gdip_pixel_stream_set_next (&destStream, pixel); } } else { if (!gdip_pixel_stream_copy_optimized (&destStream, &srcStream)) { while (gdip_pixel_stream_has_next (&srcStream)) { gdip_pixel_stream_set_next (&destStream, gdip_pixel_stream_get_next (&srcStream)); } } } return Ok; } #if FALSE static BOOL gdip_is_a_32bit_pixelformat (PixelFormat format) { switch (format) { case PixelFormat32bppRGB: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: /* all of these use CAIRO_FORMAT_ARGB, which is 4 bytes wide */ return TRUE; default: return FALSE; } } BOOL gdip_can_window_without_copy (BitmapData *data, Rect *rect, int format) { int bpp = gdip_get_pixel_format_bpp (format); if (format != data->pixel_format) { /* can't possibly reinterpret bits from one indexed pixel * format as being of another indexed pixel format... */ if (gdip_is_an_indexed_pixelformat (format) || gdip_is_an_indexed_pixelformat (data->pixel_format)) { return FALSE; } /* ...but we can probably handle 24-bit<->32-bit and * 32-bit alpha<->32-bit opaque without copying data, * since these are all stored as CAIRO_FORMAT_ARGB * internally. */ if (!gdip_is_a_32bit_pixelformat (format) || !gdip_is_a_32bit_pixelformat (data->pixel_format)) { return FALSE; } } /* okay, so the pixel formats are compatible. now, make sure * the rectangle lies on byte boundaries; if it doesn't, then * pixels will have to be shuffled. =/ */ /* 8bpp and above are guaranteed to be byte-aligned */ if (bpp >= 8) { return TRUE; } else { int left_bit_offset = rect->X * bpp; int width_bit_count = rect->Width * bpp; /* check whether the values are byte-aligned */ return ((left_bit_offset & 7) | (width_bit_count & 7)) == 0; } } void gdip_make_alpha_opaque (BitmapData *data) { BYTE *scan0; int y; int x; int o; int f; /* sanity check; make sure we aren't mangling any image data */ if ((data->pixel_format != PixelFormat32bppARGB) && (data->pixel_format != PixelFormat32bppRGB)) { return; } scan0 = (BYTE*)data->scan0; f = data->stride - 4 * data->width; for (y = 0, o = 0; y < data->height; y++, o += f) { for (x = 0; x < data->width; x++, o += 4) { scan0[o + 3] = 0xff; /* set alpha to fully-opaque */ } } } #endif GpStatus GdipBitmapLockBits (GpBitmap *bitmap, GDIPCONST Rect *srcRect, UINT flags, PixelFormat format, BitmapData *locked_data) { int dest_pixel_format_bpp; int dest_stride; int dest_size; BYTE *dest_scan0; Rect destRect; GpStatus status; BitmapData *root_data; if (!bitmap || !srcRect || !locked_data) return InvalidParameter; root_data = bitmap->active_bitmap; /* Is this bitmap already locked? */ if (root_data->reserved & GBD_LOCKED) return Win32Error; /* Make sure the srcRect makes sense */ if ((srcRect->X < 0) || (srcRect->Y < 0) || (srcRect->Width < 0) || (srcRect->Height < 0)) return InvalidParameter; if (((srcRect->X + srcRect->Width) > root_data->width) || ((srcRect->Y + srcRect->Height) > root_data->height)) return InvalidParameter; /* if the current and specified format are different, that the bitmap is indexed and that we ask for write then... */ if ((root_data->pixel_format != format) && gdip_is_an_indexed_pixelformat (root_data->pixel_format) && ((flags & ImageLockModeWrite) != 0)) { return InvalidParameter; } if (!gdip_is_a_supported_pixelformat (format)) return NotImplemented; destRect.X = 0; destRect.Y = 0; destRect.Width = srcRect->Width; destRect.Height = srcRect->Height; /* Common stuff */ if ((flags & ImageLockModeWrite) != 0) { locked_data->reserved |= GBD_WRITE_OK; locked_data->image_flags &= ~ImageFlagsReadOnly; } else { locked_data->reserved &= ~GBD_WRITE_OK; locked_data->image_flags |= ImageFlagsReadOnly; } if ((format & PixelFormatAlpha) != 0) { locked_data->image_flags |= ImageFlagsHasAlpha; } locked_data->reserved |= GBD_LOCKED; locked_data->reserved |= GBD_OWN_SCAN0; root_data->reserved |= GBD_LOCKED; switch (format) { case PixelFormat24bppRGB: /* workaround a hack we have (because Cairo use 32bits in this case) */ dest_pixel_format_bpp = 24; locked_data->reserved |= GBD_TRUE24BPP; break; default: dest_pixel_format_bpp = gdip_get_pixel_format_bpp (format); break; } dest_stride = (srcRect->Width * dest_pixel_format_bpp + 7) >> 3; gdip_align_stride (dest_stride); dest_size = srcRect->Height * dest_stride; if ((flags & ImageLockModeUserInputBuf) == 0) { locked_data->scan0 = GdipAlloc(dest_size); if (locked_data->scan0 == NULL) { return OutOfMemory; } } else { /* User is supposed to have provided the buffer */ if (locked_data->scan0 == NULL) { return InvalidParameter; } locked_data->reserved &= ~GBD_OWN_SCAN0; } locked_data->width = srcRect->Width; locked_data->height = srcRect->Height; locked_data->stride = dest_stride; locked_data->pixel_format = format; locked_data->x = srcRect->X; locked_data->y = srcRect->Y; locked_data->palette = NULL; /* If the user wants the original data to be readable, then convert the bits. */ status = Ok; if ((flags & ImageLockModeRead) != 0) { status = gdip_bitmap_change_rect_pixel_format (root_data, (GpRect*)srcRect, locked_data, &destRect); if ((status != Ok) && ((flags & ImageLockModeUserInputBuf) == 0)) { GdipFree (locked_data->scan0); locked_data->scan0 = NULL; } } return status; } GpStatus GdipBitmapUnlockBits (GpBitmap *bitmap, BitmapData *locked_data) { GpStatus status; BitmapData *root_data;; if ((bitmap == NULL) || (locked_data == NULL)) { return InvalidParameter; } root_data = bitmap->active_bitmap; /* It is not safe to assume that the correct BitmapData has been passed in. * Sanity check: Make sure the locked data is in fact locked.*/ if (!(root_data->reserved & GBD_LOCKED) || !(locked_data->reserved & GBD_LOCKED)) { return Win32Error; } /* Sanity check: Make sure the locked data's size is consistent with having * been returned from LockBits (). */ if ((locked_data->width > root_data->width) || (locked_data->height > root_data->height)) { return InvalidParameter; } /* We need to copy the locked data back to the root data's Scan0 if the image was writeable */ if ((locked_data->reserved & GBD_WRITE_OK) != 0) { Rect srcRect = { 0, 0, locked_data->width, locked_data->height }; Rect destRect = { locked_data->x, locked_data->y, locked_data->width, locked_data->height }; status = gdip_bitmap_change_rect_pixel_format (locked_data, &srcRect, root_data, &destRect); } else { status = Ok; } if ((locked_data->reserved & GBD_OWN_SCAN0) != 0) { GdipFree(locked_data->scan0); locked_data->scan0 = NULL; locked_data->reserved &= ~GBD_OWN_SCAN0; } if (locked_data->palette) { GdipFree(locked_data->palette); locked_data->palette = NULL; } locked_data->reserved &= ~GBD_LOCKED; root_data->reserved &= ~GBD_LOCKED; return status; } GpStatus GdipBitmapSetPixel (GpBitmap *bitmap, int x, int y, ARGB color) { BitmapData *data; BYTE *v; if ((bitmap == NULL) || (bitmap->active_bitmap == NULL)) { return InvalidParameter; } data = bitmap->active_bitmap; if ((x < 0) || (x > data->width) || (y < 0) || (y > data->height) || (data->reserved & GBD_LOCKED)) { return InvalidParameter; } if (gdip_is_an_indexed_pixelformat (data->pixel_format)) return InvalidParameter; v = (BYTE*)(data->scan0) + y * data->stride; switch (data->pixel_format) { case PixelFormat24bppRGB: case PixelFormat32bppRGB: color |= 0xFF000000; /* force the alpha for Cairo */ /* fall through */ case PixelFormat32bppARGB: case PixelFormat32bppPARGB: { ARGB *scan = (ARGB *)v; scan[x] = color; break; } case PixelFormat16bppGrayScale: return InvalidParameter; default: return NotImplemented; } return Ok; } GpStatus GdipBitmapGetPixel (GpBitmap *bitmap, int x, int y, ARGB *color) { BitmapData *data; if ((bitmap == NULL) || (bitmap->active_bitmap == NULL) || (color == NULL)) { return InvalidParameter; } data = bitmap->active_bitmap; if ((x < 0) || (x >= data->width) || (y < 0) || (y >= data->height) || (data->reserved & GBD_LOCKED)) { return InvalidParameter; } if (gdip_is_an_indexed_pixelformat (data->pixel_format)) { StreamingState pixel_stream; GpStatus status; unsigned int palette_index; if (data->palette == NULL) { return InvalidParameter; } status = gdip_init_pixel_stream (&pixel_stream, data, x, y, 1, 1); if (status != Ok) { return status; } palette_index = gdip_pixel_stream_get_next (&pixel_stream); if (palette_index >= data->palette->Count) { return InvalidParameter; } *color = data->palette->Entries[palette_index]; } else { BYTE *v = ((BYTE*)data->scan0) + y * data->stride; switch (data->pixel_format) { case PixelFormat16bppGrayScale: return InvalidParameter; case PixelFormat24bppRGB: case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: { ARGB *scan = (ARGB *)v; *color = scan[x]; break; } default: return NotImplemented; } } return Ok; } GpStatus GdipBitmapSetResolution (GpBitmap *bitmap, float xdpi, float ydpi) { if (!bitmap || !bitmap->active_bitmap || isnan(xdpi) || isnan(xdpi) || (xdpi <= 0.0f) || (ydpi <= 0.0f)) return InvalidParameter; bitmap->active_bitmap->dpi_horz = xdpi; bitmap->active_bitmap->dpi_vert = ydpi; bitmap->active_bitmap->image_flags |= ImageFlagsHasRealDPI; return Ok; } cairo_surface_t * gdip_bitmap_ensure_surface (GpBitmap *bitmap) { cairo_format_t format; BitmapData *data = bitmap->active_bitmap; if (bitmap->surface || !data || !data->scan0) return bitmap->surface; switch (data->pixel_format) { case PixelFormat24bppRGB: format = CAIRO_FORMAT_RGB24; break; case PixelFormat32bppARGB: /* premultiplication is required */ case PixelFormat32bppRGB: /* no alpha */ case PixelFormat32bppPARGB: /* alpha already premultiplied */ format = CAIRO_FORMAT_ARGB32; break; default: g_warning ("gdip_bitmap_ensure_surface: Unable to create a surface for raw bitmap data of format 0x%08x", data->pixel_format); return NULL; } bitmap->surface = cairo_image_surface_create_for_data ((BYTE*)data->scan0, format, data->width, data->height, data->stride); return bitmap->surface; } BOOL gdip_bitmap_format_needs_premultiplication (GpBitmap *bitmap) { return (bitmap->active_bitmap->pixel_format == PixelFormat32bppARGB); } BYTE* gdip_bitmap_get_premultiplied_scan0 (GpBitmap *bitmap) { BitmapData *data = bitmap->active_bitmap; BYTE* premul = (BYTE*) GdipAlloc (data->height * data->stride); if (!premul) return NULL; BYTE *source = (BYTE*)data->scan0; BYTE *target = premul; int y, x; for (y = 0; y < data->height; y++) { ARGB *sp = (ARGB*) source; ARGB *tp = (ARGB*) target; for (x = 0; x < data->width; x++) { BYTE r, g, b, a; get_pixel_bgra (*sp, b, g, r, a); if (a < 0xff) { b = pre_multiplied_table [b][a]; g = pre_multiplied_table [g][a]; r = pre_multiplied_table [r][a]; set_pixel_bgra (tp, 0, b, g, r, a); } else { *tp = *sp; } sp++; tp++; } source += data->stride; target += data->stride; } return premul; } GpBitmap * gdip_convert_indexed_to_rgb (GpBitmap *indexed_bmp) { BitmapData *data; ColorPalette *palette; int rgb_stride; int rgb_bytes; int force_alpha; int one_pixel_mask; int one_pixel_shift; int pixels_per_byte; ARGB *rgb_scan0; int p; int x; int y; GpBitmap *ret; GpStatus status; BYTE *indexed_scan; ARGB *rgb_scan; int pixels_this_byte; unsigned short sample; int index; int transparent; int format; data = indexed_bmp->active_bitmap; if (data == NULL) { return NULL; } palette = data->palette; if (palette == NULL || !gdip_is_an_indexed_pixelformat (data->pixel_format)) { return NULL; } switch (data->pixel_format) { case PixelFormat1bppIndexed: one_pixel_mask = 0x01; one_pixel_shift = 1; pixels_per_byte = 8; break; case PixelFormat4bppIndexed: one_pixel_mask = 0x0F; one_pixel_shift = 4; pixels_per_byte = 2; break; case PixelFormat8bppIndexed: one_pixel_mask = 0xFF; one_pixel_shift = 8; pixels_per_byte = 1; break; default: /* something is wrong!! */ return NULL; } if ((palette->Flags & PaletteFlagsHasAlpha) == 0) { format = PixelFormat32bppRGB; set_pixel_bgra (&force_alpha, 0, 0, 0, 0, 0xFF); /* full alpha bits set */ } else { format = PixelFormat32bppARGB; force_alpha = 0; } rgb_stride = data->width * sizeof (ARGB); /* ensure 32bits alignment */ gdip_align_stride (rgb_stride); rgb_bytes = data->height * rgb_stride; /* allocate the RGB frame */ rgb_scan0 = GdipAlloc (rgb_bytes); if (rgb_scan0 == NULL) { /* out of memory?? */ return NULL; } /* convert the indexed pixels into RGB values and store them into the RGB frame */ for (y=0; y < data->height; y++) { indexed_scan = (BYTE*)(data->scan0) + y * data->stride; rgb_scan = rgb_scan0 + (y * data->width); /* Speed up the 8bpp case */ if (pixels_per_byte == 1) { for (x = 0; x < data->width; x++) { index = *indexed_scan++; rgb_scan [x] = palette->Entries [index] | force_alpha; } continue; } /* For 4bpp and 1bpp */ for (x=0; x < data->width; x += pixels_per_byte) { pixels_this_byte = pixels_per_byte; sample = *indexed_scan; indexed_scan++; if (x + pixels_this_byte >= data->width) { pixels_this_byte = data->width - x; } for (p=0; p < pixels_this_byte; p++) { sample <<= one_pixel_shift; index = (sample >> 8) & one_pixel_mask; rgb_scan[x + p] = palette->Entries[index] | force_alpha; } } } /* try to get a GpBitmap out of it :-) */ status = GdipCreateBitmapFromScan0 (data->width, data->height, rgb_stride, format, (BYTE*)rgb_scan0, &ret); if (status == Ok) { ret->active_bitmap->reserved = GBD_OWN_SCAN0; return ret; } if (ret != NULL) { gdip_bitmap_dispose(ret); } if (rgb_scan0 != NULL) { GdipFree (rgb_scan0); } return NULL; } ColorPalette* gdip_create_greyscale_palette (int num_colors) { ColorPalette *palette; int i; if ((num_colors < 0) || (num_colors > 256)) return NULL; /* ColorPalette definition already include 1 ARGB member */ palette = GdipAlloc (sizeof(ColorPalette) + (num_colors - 1) * sizeof(ARGB)); if (!palette) return NULL; palette->Count = num_colors; palette->Flags = 0; /* not every codec sets the ImageFlagsColorSpaceGRAY flag*/ /* always force alpha to opaque */ if (num_colors == 256) { for (i = 0; i < 256; i++) set_pixel_bgra (&palette->Entries[i], 0, i, i, i, 0xFF); } else { for (i = 0; i < num_colors; i++) { int intensity = i * 255 / (num_colors - 1); set_pixel_bgra (&palette->Entries[i], 0, intensity, intensity, intensity, 0xFF); } } return palette; } libgdiplus-2.11/src/print.c0000664000175000017500000000431612225470167012617 00000000000000/* * print.c * * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Jordi Mas (jordi@ximian.com) * Sebastien Pouliot */ #include #ifdef CAIRO_HAS_PS_SURFACE #include "graphics-private.h" #include /* * NOTE: The functions in this file aren't part of GDI+ and can only be called * from Mono's System.Drawing.dll on non-Windows operating systems */ /* coverity[+alloc : arg-*5] */ GpStatus GdipGetPostScriptGraphicsContext (char* filename, int width, int height, double dpix, double dpiy, GpGraphics **graphics) { GpGraphics *gfx; cairo_surface_t *surface; if (!graphics) return InvalidParameter; surface = cairo_ps_surface_create (filename, (double) width, (double) height); cairo_surface_set_fallback_resolution (surface, dpix, dpiy); gfx = gdip_graphics_new (surface); gfx->dpi_x = dpix; gfx->dpi_y = dpiy; cairo_surface_destroy (surface); gfx->type = gtPostScript; *graphics = gfx; return Ok; } GpStatus GdipGetPostScriptSavePage (GpGraphics* graphics) { if (!graphics) return InvalidParameter; cairo_show_page (graphics->ct); return Ok; } #endif libgdiplus-2.11/src/gdipenums.h0000664000175000017500000005562012225470167013467 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __GDIPENUMS_H__ #define __GDIPENUMS_H__ typedef enum { ColorAdjustTypeDefault, ColorAdjustTypeBitmap, ColorAdjustTypeBrush, ColorAdjustTypePen, ColorAdjustTypeText, ColorAdjustTypeCount, ColorAdjustTypeAny } ColorAdjustType; typedef enum { ColorChannelFlagsC = 0, ColorChannelFlagsM, ColorChannelFlagsY, ColorChannelFlagsK, ColorChannelFlagsLast } ColorChannelFlags; typedef enum { ColorMatrixFlagsDefault = 0, ColorMatrixFlagsSkipGrays = 1, ColorMatrixFlagsAltGray = 2 } ColorMatrixFlags; typedef enum { CombineModeReplace = 0, CombineModeIntersect = 1, CombineModeUnion = 2, CombineModeXor = 3, CombineModeExclude = 4, CombineModeComplement = 5 } CombineMode; typedef enum { CompositingModeSourceOver, CompositingModeSourceCopy } CompositingMode; typedef enum { CoordinateSpaceWorld, CoordinateSpacePage, CoordinateSpaceDevice } CoordinateSpace, GpCoordinateSpace; typedef enum { CustomLineCapTypeDefault = 0, CustomLineCapTypeAdjustableArrow = 1 } CustomLineCapType; typedef enum { EncoderParameterValueTypeByte = 1, EncoderParameterValueTypeASCII = 2, EncoderParameterValueTypeShort = 3, EncoderParameterValueTypeLong = 4, EncoderParameterValueTypeRational = 5, EncoderParameterValueTypeLongRange = 6, EncoderParameterValueTypeUndefined = 7, EncoderParameterValueTypeRationalRange = 8 } EncoderParameterValueType; typedef enum { FontStyleRegular = 0, FontStyleBold = 1, FontStyleItalic = 2, FontStyleUnderline = 4, FontStyleStrikeout = 8 } FontStyle; typedef enum { BrushTypeSolidColor = 0, /* Solid Brush */ BrushTypeHatchFill = 1, /* Hatch Brush */ BrushTypeTextureFill = 2, /* Texture Brush */ BrushTypePathGradient = 3, /* PathGradient Brush */ BrushTypeLinearGradient = 4 /* LinearGradient Brush */ } GpBrushType, BrushType; typedef enum { DashCapFlat = 0, DashCapRound = 2, DashCapTriangle = 3 } GpDashCap; typedef enum { DashStyleSolid = 0, /* solid line */ DashStyleDash = 1, /* dashed line */ DashStyleDot = 2, /* dotted line */ DashStyleDashDot = 3, /* alt. dash-dot */ DashStyleDashDotDot = 4, /* alt. dash-dot-dot */ DashStyleCustom = 5 /* user-defined */ } GpDashStyle; typedef enum { FillModeAlternate, FillModeWinding } FillMode, GpFillMode; typedef enum { FlushIntentionFlush = 0, FlushIntentionSync = 1 } FlushIntention, GpFlushIntention; typedef enum { LineCapFlat = 0, LineCapSquare = 1, LineCapRound = 2, LineCapTriangle = 3, LineCapNoAnchor = 0x10, LineCapSquareAnchor = 0x11, LineCapRoundAnchor = 0x12, LineCapDiamondAnchor = 0x13, LineCapArrowAnchor = 0x14, LineCapCustom = 0xff } GpLineCap; typedef enum { LineJoinMiter = 0, /* sharp corner */ LineJoinBevel = 1, /* round corner */ LineJoinRound = 2, /* circular, smooth, circular arc */ LineJoinMiterClipped = 3 /* miter, sharp or beveled corner */ } GpLineJoin; typedef enum { MatrixOrderPrepend = 0, MatrixOrderAppend = 1 } GpMatrixOrder, MatrixOrder; typedef enum { PenAlignmentCenter = 0, PenAlignmentInset = 1 } GpPenAlignment, PenAlignment; typedef enum { HotkeyPrefixNone = 0, HotkeyPrefixShow = 1, HotkeyPrefixHide = 2 } HotkeyPrefix; typedef enum { ImageFlagsNone = 0, ImageFlagsScalable = 1, ImageFlagsHasAlpha = 2, ImageFlagsHasTranslucent = 4, ImageFlagsPartiallyScalable = 8, ImageFlagsColorSpaceRGB = 16, ImageFlagsColorSpaceCMYK = 32, ImageFlagsColorSpaceGRAY = 64, ImageFlagsColorSpaceYCBCR = 128, ImageFlagsColorSpaceYCCK = 256, ImageFlagsHasRealDPI = 4096, ImageFlagsHasRealPixelSize = 8192, ImageFlagsReadOnly = 65536, ImageFlagsCaching = 131072, ImageFlagsUndocumented = 0x00040000 } ImageFlags; typedef enum { ImageLockModeRead = 1, ImageLockModeWrite = 2, ImageLockModeUserInputBuf = 4 } ImageLockMode; typedef enum { ImageTypeUnknown, ImageTypeBitmap, ImageTypeMetafile } ImageType; typedef enum { QualityModeInvalid = -1, QualityModeDefault = 0, QualityModeLow = 1, QualityModeHigh = 2 } QualityMode; typedef enum { CompositingQualityInvalid = QualityModeInvalid, CompositingQualityDefault = QualityModeDefault, CompositingQualityHighSpeed = QualityModeLow, CompositingQualityHighQuality = QualityModeHigh, CompositingQualityGammaCorrected, CompositingQualityAssumeLinear } CompositingQuality; typedef enum { HatchStyleHorizontal = 0, HatchStyleVertical = 1, HatchStyleForwardDiagonal = 2, HatchStyleBackwardDiagonal = 3, HatchStyleCross = 4, HatchStyleDiagonalCross = 5, HatchStyle05Percent = 6, HatchStyle10Percent = 7, HatchStyle20Percent = 8, HatchStyle25Percent = 9, HatchStyle30Percent = 10, HatchStyle40Percent = 11, HatchStyle50Percent = 12, HatchStyle60Percent = 13, HatchStyle70Percent = 14, HatchStyle75Percent = 15, HatchStyle80Percent = 16, HatchStyle90Percent = 17, HatchStyleLightDownwardDiagonal = 18, HatchStyleLightUpwardDiagonal = 19, HatchStyleDarkDownwardDiagonal = 20, HatchStyleDarkUpwardDiagonal = 21, HatchStyleWideDownwardDiagonal = 22, HatchStyleWideUpwardDiagonal = 23, HatchStyleLightVertical = 24, HatchStyleLightHorizontal = 25, HatchStyleNarrowVertical = 26, HatchStyleNarrowHorizontal = 27, HatchStyleDarkVertical = 28, HatchStyleDarkHorizontal = 29, HatchStyleDashedDownwardDiagonal = 30, HatchStyleDashedUpwardDiagonal = 31, HatchStyleDashedHorizontal = 32, HatchStyleDashedVertical = 33, HatchStyleSmallConfetti = 34, HatchStyleLargeConfetti = 35, HatchStyleZigZag = 36, HatchStyleWave = 37, HatchStyleDiagonalBrick = 38, HatchStyleHorizontalBrick = 39, HatchStyleWeave = 40, HatchStylePlaid = 41, HatchStyleDivot = 42, HatchStyleDottedGrid = 43, HatchStyleDottedDiamond = 44, HatchStyleShingle = 45, HatchStyleTrellis = 46, HatchStyleSphere = 47, HatchStyleSmallGrid = 48, HatchStyleSmallCheckerBoard = 49, HatchStyleLargeCheckerBoard = 50, HatchStyleOutlinedDiamond = 51, HatchStyleSolidDiamond = 52, HatchStyleLargeGrid = HatchStyleCross, HatchStyleMin = HatchStyleHorizontal, HatchStyleMax = HatchStyleSolidDiamond } GpHatchStyle, HatchStyle; typedef enum { ImageCodecFlagsEncoder = 1, ImageCodecFlagsDecoder = 2, ImageCodecFlagsSupportBitmap = 4, ImageCodecFlagsSupportVector = 8, ImageCodecFlagsSeekableEncode = 16, ImageCodecFlagsBlockingDecode = 32, ImageCodecFlagsBuiltin = 65536, ImageCodecFlagsSystem = 131072, ImageCodecFlagsUser = 262144 } ImageCodecFlags; typedef enum { InterpolationModeInvalid = QualityModeInvalid, InterpolationModeDefault = QualityModeDefault, InterpolationModeLowQuality = QualityModeLow, InterpolationModeHighQuality = QualityModeHigh, InterpolationModeBilinear, InterpolationModeBicubic, InterpolationModeNearestNeighbor, InterpolationModeHighQualityBilinear, InterpolationModeHighQualityBicubic } InterpolationMode; typedef enum { PaletteFlagsHasAlpha = 0x0001, PaletteFlagsGrayScale = 0x0002, PaletteFlagsHalftone = 0x0004 } PaletteFlags; typedef enum { PathPointTypeStart = 0x00, PathPointTypeLine = 0x01, PathPointTypeBezier = 0x03, PathPointTypePathTypeMask = 0x07, PathPointTypeDashMode = 0x10, PathPointTypePathMarker = 0x20, PathPointTypeCloseSubpath = 0x80, PathPointTypeBezier3 = 0x03 } PathPointType; typedef enum { PenTypeSolidColor = BrushTypeSolidColor, PenTypeHatchFill = BrushTypeHatchFill, PenTypeTextureFill = BrushTypeTextureFill, PenTypePathGradient = BrushTypePathGradient, PenTypeLinearGradient = BrushTypeLinearGradient, PenTypeUnknown = -1 } PenType, GpPenType; /* The pixel format spec is: * [0-7 format index] [8-15 pixel size, bits] [16-23 flags] [24-31 reserved] * so, * (ID | (bpp << 8) | flags) */ typedef enum { PixelFormatAlpha = 0x00040000, /* flag: format has alpha */ PixelFormatCanonical = 0x00200000, /* flag: unknown */ PixelFormatExtended = 0x00100000, /* flag: 16 bits per channel (16bpp grayscale and 48/64bpp rgb) */ PixelFormatGDI = 0x00020000, /* flag: supported by GDI */ PixelFormatIndexed = 0x00010000, /* flag: is palette-indexed */ PixelFormatPAlpha = 0x00080000, /* flag: alpha is pre-multiplied */ PixelFormat16bppARGB1555 = 0x00061007, PixelFormat16bppGrayScale = 0x00101004, PixelFormat16bppRGB555 = 0x00021005, PixelFormat16bppRGB565 = 0x00021006, PixelFormat1bppIndexed = 0x00030101, PixelFormat24bppRGB = 0x00021808, PixelFormat32bppARGB = 0x0026200a, PixelFormat32bppPARGB = 0x000e200b, PixelFormat32bppRGB = 0x00022009, PixelFormat48bppRGB = 0x0010300c, PixelFormat4bppIndexed = 0x00030402, PixelFormat64bppARGB = 0x0034400d, PixelFormat64bppPARGB = 0x001c400e, PixelFormat8bppIndexed = 0x00030803, PixelFormatUndefined = 0, PixelFormatDontCare = 0 } PixelFormat; typedef enum { PixelOffsetModeInvalid = QualityModeInvalid, PixelOffsetModeDefault = QualityModeDefault, PixelOffsetModeHighSpeed = QualityModeLow, PixelOffsetModeHighQuality = QualityModeHigh, PixelOffsetModeNone, PixelOffsetModeHalf } PixelOffsetMode; typedef enum { PropertyTagExifIFD = 0x8769, PropertyTagGpsIFD = 0x8825, PropertyTagNewSubfileType = 0x00FE, PropertyTagSubfileType = 0x00FF, PropertyTagImageWidth = 0x0100, PropertyTagImageHeight = 0x0101, PropertyTagBitsPerSample = 0x0102, PropertyTagCompression = 0x0103, PropertyTagPhotometricInterp = 0x0106, PropertyTagThreshHolding = 0x0107, PropertyTagCellWidth = 0x0108, PropertyTagCellHeight = 0x0109, PropertyTagFillOrder = 0x010A, PropertyTagDocumentName = 0x010D, PropertyTagImageDescription = 0x010E, PropertyTagEquipMake = 0x010F, PropertyTagEquipModel = 0x0110, PropertyTagStripOffsets = 0x0111, PropertyTagOrientation = 0x0112, PropertyTagSamplesPerPixel = 0x0115, PropertyTagRowsPerStrip = 0x0116, PropertyTagStripBytesCount = 0x0117, PropertyTagMinSampleValue = 0x0118, PropertyTagMaxSampleValue = 0x0119, PropertyTagXResolution = 0x011A, PropertyTagYResolution = 0x011B, PropertyTagPlanarConfig = 0x011C, PropertyTagPageName = 0x011D, PropertyTagXPosition = 0x011E, PropertyTagYPosition = 0x011F, PropertyTagFreeOffset = 0x0120, PropertyTagFreeByteCounts = 0x0121, PropertyTagGrayResponseUnit = 0x0122, PropertyTagGrayResponseCurve = 0x0123, PropertyTagT4Option = 0x0124, PropertyTagT6Option = 0x0125, PropertyTagResolutionUnit = 0x0128, PropertyTagPageNumber = 0x0129, PropertyTagTransferFunction = 0x012D, PropertyTagSoftwareUsed = 0x0131, PropertyTagDateTime = 0x0132, PropertyTagArtist = 0x013B, PropertyTagHostComputer = 0x013C, PropertyTagPredictor = 0x013D, PropertyTagWhitePoint = 0x013E, PropertyTagPrimaryChromaticities = 0x013F, PropertyTagColorMap = 0x0140, PropertyTagHalftoneHints = 0x0141, PropertyTagTileWidth = 0x0142, PropertyTagTileLength = 0x0143, PropertyTagTileOffset = 0x0144, PropertyTagTileByteCounts = 0x0145, PropertyTagInkSet = 0x014C, PropertyTagInkNames = 0x014D, PropertyTagNumberOfInks = 0x014E, PropertyTagDotRange = 0x0150, PropertyTagTargetPrinter = 0x0151, PropertyTagExtraSamples = 0x0152, PropertyTagSampleFormat = 0x0153, PropertyTagSMinSampleValue = 0x0154, PropertyTagSMaxSampleValue = 0x0155, PropertyTagTransferRange = 0x0156, PropertyTagJPEGProc = 0x0200, PropertyTagJPEGInterFormat = 0x0201, PropertyTagJPEGInterLength = 0x0202, PropertyTagJPEGRestartInterval = 0x0203, PropertyTagJPEGLosslessPredictors = 0x0205, PropertyTagJPEGPointTransforms = 0x0206, PropertyTagJPEGQTables = 0x0207, PropertyTagJPEGDCTables = 0x0208, PropertyTagJPEGACTables = 0x0209, PropertyTagYCbCrCoefficients = 0x0211, PropertyTagYCbCrSubsampling = 0x0212, PropertyTagYCbCrPositioning = 0x0213, PropertyTagREFBlackWhite = 0x0214, PropertyTagICCProfile = 0x8773, PropertyTagGamma = 0x0301, PropertyTagICCProfileDescriptor = 0x0302, PropertyTagSRGBRenderingIntent = 0x0303, PropertyTagImageTitle = 0x0320, PropertyTagCopyright = 0x8298, // Other tags (Adobe Image Info, etc) PropertyTagResolutionXUnit = 0x5001, PropertyTagResolutionYUnit = 0x5002, PropertyTagResolutionXLengthUnit = 0x5003, PropertyTagResolutionYLengthUnit = 0x5004, PropertyTagPrintFlags = 0x5005, PropertyTagPrintFlagsVersion = 0x5006, PropertyTagPrintFlagsCrop = 0x5007, PropertyTagPrintFlagsBleedWidth = 0x5008, PropertyTagPrintFlagsBleedWidthScale = 0x5009, PropertyTagHalftoneLPI = 0x500A, PropertyTagHalftoneLPIUnit = 0x500B, PropertyTagHalftoneDegree = 0x500C, PropertyTagHalftoneShape = 0x500D, PropertyTagHalftoneMisc = 0x500E, PropertyTagHalftoneScreen = 0x500F, PropertyTagJPEGQuality = 0x5010, PropertyTagGridSize = 0x5011, PropertyTagThumbnailFormat = 0x5012, // 0 = RAW RGB, 1 = JPEG PropertyTagThumbnailWidth = 0x5013, PropertyTagThumbnailHeight = 0x5014, PropertyTagThumbnailColorDepth = 0x5015, PropertyTagThumbnailPlanes = 0x5016, PropertyTagThumbnailRawBytes = 0x5017, PropertyTagThumbnailSize = 0x5018, PropertyTagThumbnailCompressedSize = 0x5019, PropertyTagColorTransferFunction = 0x501A, PropertyTagThumbnailData = 0x501B, // embeded image, format depends on ThumbnailFormat PropertyTagThumbnailImageWidth = 0x5020, PropertyTagThumbnailImageHeight = 0x5021, PropertyTagThumbnailBitsPerSample = 0x5022, PropertyTagThumbnailCompression = 0x5023, PropertyTagThumbnailPhotometricInterp = 0x5024, PropertyTagThumbnailImageDescription = 0x5025, PropertyTagThumbnailEquipMake = 0x5026, PropertyTagThumbnailEquipModel = 0x5027, PropertyTagThumbnailStripOffsets = 0x5028, PropertyTagThumbnailOrientation = 0x5029, PropertyTagThumbnailSamplesPerPixel = 0x502A, PropertyTagThumbnailRowsPerStrip = 0x502B, PropertyTagThumbnailStripBytesCount = 0x502C, PropertyTagThumbnailResolutionX = 0x502D, PropertyTagThumbnailResolutionY = 0x502E, PropertyTagThumbnailPlanarConfig = 0x502F, PropertyTagThumbnailResolutionUnit = 0x5030, PropertyTagThumbnailTransferFunction = 0x5031, PropertyTagThumbnailSoftwareUsed = 0x5032, PropertyTagThumbnailDateTime = 0x5033, PropertyTagThumbnailArtist = 0x5034, PropertyTagThumbnailWhitePoint = 0x5035, PropertyTagThumbnailPrimaryChromaticities = 0x5036, PropertyTagThumbnailYCbCrCoefficients = 0x5037, PropertyTagThumbnailYCbCrSubsampling = 0x5038, PropertyTagThumbnailYCbCrPositioning = 0x5039, PropertyTagThumbnailRefBlackWhite = 0x503A, PropertyTagThumbnailCopyRight = 0x503B, PropertyTagLuminanceTable = 0x5090, PropertyTagChrominanceTable = 0x5091, PropertyTagFrameDelay = 0x5100, PropertyTagLoopCount = 0x5101, PropertyTagPixelUnit = 0x5110, PropertyTagPixelPerUnitX = 0x5111, PropertyTagPixelPerUnitY = 0x5112, PropertyTagPaletteHistogram = 0x5113, // EXIF specific tag PropertyTagExifExposureTime = 0x829A, PropertyTagExifFNumber = 0x829D, PropertyTagExifExposureProg = 0x8822, PropertyTagExifSpectralSense = 0x8824, PropertyTagExifISOSpeed = 0x8827, PropertyTagExifOECF = 0x8828, PropertyTagExifVer = 0x9000, PropertyTagExifDTOrig = 0x9003, PropertyTagExifDTDigitized = 0x9004, PropertyTagExifCompConfig = 0x9101, PropertyTagExifCompBPP = 0x9102, PropertyTagExifShutterSpeed = 0x9201, PropertyTagExifAperture = 0x9202, PropertyTagExifBrightness = 0x9203, PropertyTagExifExposureBias = 0x9204, PropertyTagExifMaxAperture = 0x9205, PropertyTagExifSubjectDist = 0x9206, PropertyTagExifMeteringMode = 0x9207, PropertyTagExifLightSource = 0x9208, PropertyTagExifFlash = 0x9209, PropertyTagExifFocalLength = 0x920A, PropertyTagExifMakerNote = 0x927C, PropertyTagExifUserComment = 0x9286, PropertyTagExifDTSubsec = 0x9290, PropertyTagExifDTOrigSS = 0x9291, PropertyTagExifDTDigSS = 0x9292, PropertyTagExifFPXVer = 0xA000, PropertyTagExifColorSpace = 0xA001, PropertyTagExifPixXDim = 0xA002, PropertyTagExifPixYDim = 0xA003, PropertyTagExifRelatedWav = 0xA004, PropertyTagExifInterop = 0xA005, PropertyTagExifFlashEnergy = 0xA20B, PropertyTagExifSpatialFR = 0xA20C, PropertyTagExifFocalXRes = 0xA20E, PropertyTagExifFocalYRes = 0xA20F, PropertyTagExifFocalResUnit = 0xA210, PropertyTagExifSubjectLoc = 0xA214, PropertyTagExifExposureIndex = 0xA215, PropertyTagExifSensingMethod = 0xA217, PropertyTagExifFileSource = 0xA300, PropertyTagExifSceneType = 0xA301, PropertyTagExifCfaPattern = 0xA302, PropertyTagGpsVer = 0x0000, PropertyTagGpsLatitudeRef = 0x0001, PropertyTagGpsLatitude = 0x0002, PropertyTagGpsLongitudeRef = 0x0003, PropertyTagGpsLongitude = 0x0004, PropertyTagGpsAltitudeRef = 0x0005, PropertyTagGpsAltitude = 0x0006, PropertyTagGpsGpsTime = 0x0007, PropertyTagGpsGpsSatellites = 0x0008, PropertyTagGpsGpsStatus = 0x0009, PropertyTagGpsGpsMeasureMode = 0x000A, PropertyTagGpsGpsDop = 0x000B, PropertyTagGpsSpeedRef = 0x000C, PropertyTagGpsSpeed = 0x000D, PropertyTagGpsTrackRef = 0x000E, PropertyTagGpsTrack = 0x000F, PropertyTagGpsImgDirRef = 0x0010, PropertyTagGpsImgDir = 0x0011, PropertyTagGpsMapDatum = 0x0012, PropertyTagGpsDestLatRef = 0x0013, PropertyTagGpsDestLat = 0x0014, PropertyTagGpsDestLongRef = 0x0015, PropertyTagGpsDestLong = 0x0016, PropertyTagGpsDestBearRef = 0x0017, PropertyTagGpsDestBear = 0x0018, PropertyTagGpsDestDistRef = 0x0019, PropertyTagGpsDestDist = 0x001A } PropertyTag; typedef enum { PropertyTagTypeByte = 1, PropertyTagTypeASCII = 2, PropertyTagTypeShort = 3, PropertyTagTypeLong = 4, PropertyTagTypeRational = 5, PropertyTagTypeSByte = 6, PropertyTagTypeUndefined = 7, PropertyTagTypeSShort = 8, PropertyTagTypeSLONG = 9, PropertyTagTypeSRational = 10, PropertyTagTypeFloat = 11, PropertyTagTypeDouble = 12 } PropertyTagType; typedef enum { RotateNoneFlipNone = 0, Rotate90FlipNone = 1, Rotate180FlipNone = 2, Rotate270FlipNone = 3, RotateNoneFlipX = 4, Rotate90FlipX = 5, Rotate180FlipX = 6, Rotate270FlipX = 7, RotateNoneFlipY = Rotate180FlipX, Rotate90FlipY = Rotate270FlipX, Rotate180FlipY = RotateNoneFlipX, Rotate270FlipY = Rotate90FlipX, RotateNoneFlipXY = Rotate180FlipNone, Rotate90FlipXY = Rotate270FlipNone, Rotate180FlipXY = RotateNoneFlipNone, Rotate270FlipXY = Rotate90FlipNone } RotateFlipType; typedef enum { SmoothingModeInvalid = QualityModeInvalid, SmoothingModeDefault = QualityModeDefault, SmoothingModeHighSpeed = QualityModeLow, SmoothingModeHighQuality = QualityModeHigh, SmoothingModeNone, SmoothingModeAntiAlias } SmoothingMode; typedef enum { Ok = 0, GenericError = 1, InvalidParameter = 2, OutOfMemory = 3, ObjectBusy = 4, InsufficientBuffer = 5, NotImplemented = 6, Win32Error = 7, WrongState = 8, Aborted = 9, FileNotFound = 10, ValueOverflow = 11, AccessDenied = 12, UnknownImageFormat = 13, FontFamilyNotFound = 14, FontStyleNotFound = 15, NotTrueTypeFont = 16, UnsupportedGdiplusVersion = 17, GdiplusNotInitialized = 18, PropertyNotFound = 19, PropertyNotSupported = 20 } GpStatus; typedef enum { StringAlignmentNear = 0, StringAlignmentCenter = 1, StringAlignmentFar = 2 } StringAlignment; typedef enum { StringDigitSubstituteUser = 0, StringDigitSubstituteNone = 1, StringDigitSubstituteNational = 2, StringDigitSubstituteTraditional = 3 } StringDigitSubstitute; typedef enum { StringFormatFlagsDirectionRightToLeft = 0x00000001, StringFormatFlagsDirectionVertical = 0x00000002, StringFormatFlagsNoFitBlackBox = 0x00000004, StringFormatFlagsDisplayFormatControl = 0x00000020, StringFormatFlagsNoFontFallback = 0x00000400, StringFormatFlagsMeasureTrailingSpaces = 0x00000800, StringFormatFlagsNoWrap = 0x00001000, StringFormatFlagsLineLimit = 0x00002000, StringFormatFlagsNoClip = 0x00004000 } StringFormatFlags; typedef enum { StringTrimmingNone = 0, StringTrimmingCharacter = 1, StringTrimmingWord = 2, StringTrimmingEllipsisCharacter = 3, StringTrimmingEllipsisWord = 4, StringTrimmingEllipsisPath = 5 } StringTrimming; typedef enum { TextRenderingHintSystemDefault = 0, TextRenderingHintSingleBitPerPixelGridFit, TextRenderingHintSingleBitPerPixel, TextRenderingHintAntiAliasGridFit, TextRenderingHintAntiAlias, TextRenderingHintClearTypeGridFit } TextRenderingHint; typedef enum { UnitWorld = 0, UnitDisplay = 1, UnitPixel = 2, UnitPoint = 3, UnitInch = 4, UnitDocument = 5, UnitMillimeter = 6, UnitCairoPoint = 7 } Unit, GpUnit; typedef enum { WarpModePerspective = 0, WarpModeBilinear = 1 } WarpMode; typedef enum { WrapModeTile = 0, WrapModeTileFlipX = 1, WrapModeTileFlipY = 2, WrapModeTileFlipXY = 3, WrapModeClamp = 4 } WrapMode, GpWrapMode; #endif libgdiplus-2.11/src/imageattributes-private.h0000664000175000017500000000435012225470167016327 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __IMAGEATTRIBUTES_PRIVATE_H__ #define __IMAGEATTRIBUTES_PRIVATE_H__ #include "gdiplus-private.h" typedef struct { ColorMap *colormap; int colormap_elem; float gamma_correction; ARGB key_colorlow; ARGB key_colorhigh; BOOL key_enabled; BOOL no_op; ColorMatrix *colormatrix; ColorMatrix *graymatrix; ColorMatrixFlags colormatrix_flags; BOOL colormatrix_enabled; } GpImageAttribute; typedef struct _ImageAttributes { GpImageAttribute def; GpImageAttribute bitmap; GpImageAttribute brush; GpImageAttribute pen; GpImageAttribute text; /* Globals */ WrapMode wrapmode; ARGB color; } ImageAttributes; #include "imageattributes.h" #endif libgdiplus-2.11/src/dstream.h0000664000175000017500000000343312225470167013126 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #ifndef __DSTREAM_H #define __DSTREAM_H #include "win32structs.h" #include "image.h" typedef struct _dstream_pvt dstream_private; typedef struct _dstream dstream_t; struct _dstream { dstream_private *pvt; }; dstream_t *dstream_input_new (GetBytesDelegate read, SeekDelegate seek) GDIP_INTERNAL; int dstream_read (dstream_t *loader, void *buffer, int size, char peek) GDIP_INTERNAL; void dstream_skip (dstream_t *loader, int nbytes) GDIP_INTERNAL; void dstream_free (dstream_t *loader) GDIP_INTERNAL; void dstream_keep_exif_buffer (dstream_t *loader) GDIP_INTERNAL; void dstream_get_exif_buffer (dstream_t *loader, unsigned char **ptr, unsigned int *length) GDIP_INTERNAL; #endif libgdiplus-2.11/src/text-metafile-private.h0000664000175000017500000000307512225470167015711 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __TEXT_METAFILE_PRIVATE_H__ #define __TEXT_METAFILE_PRIVATE_H__ #include "gdiplus-private.h" GpStatus metafile_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) GDIP_INTERNAL; #endif libgdiplus-2.11/src/carbon-private.c0000664000175000017500000000460712225470167014402 00000000000000/* * carbon-private.c * * Copyright (C) 2008 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Geoff Norton */ #ifdef __APPLE__ #include #include static inline int gdip_get_int_from_dict_for_key (CFDictionaryRef dict, CFStringRef key) { CFNumberRef value = CFDictionaryGetValue (dict, key); int ret = 0; if (value == NULL) return 0; CFNumberGetValue (value, kCFNumberIntType, &ret); return ret; } void gdip_get_display_dpi_carbon (float *h_dpi, float *v_dpi) { if (getenv ("MONO_MWF_MAC_DETECT_DPI") != NULL) { CFDictionaryRef mode_dict = CGDisplayCurrentMode (kCGDirectMainDisplay); io_connect_t display_port = CGDisplayIOServicePort (kCGDirectMainDisplay); CFDictionaryRef display_dict = IOCreateDisplayInfoDictionary (display_port, 0); const float mmpi = 25.4; float h_size = (float) gdip_get_int_from_dict_for_key (display_dict, CFSTR (kDisplayHorizontalImageSize)) / mmpi; float v_size = (float) gdip_get_int_from_dict_for_key (display_dict, CFSTR (kDisplayVerticalImageSize)) / mmpi; *h_dpi = (float) gdip_get_int_from_dict_for_key (mode_dict, kCGDisplayWidth) / h_size; *v_dpi = (float) gdip_get_int_from_dict_for_key (mode_dict, kCGDisplayHeight) / v_size; CFRelease (display_dict); } else { *h_dpi = *v_dpi = 96.0f; } } #endif libgdiplus-2.11/src/Makefile.am0000664000175000017500000000463012225470167013352 00000000000000lib_LTLIBRARIES = libgdiplus.la libgdiplus_la_SOURCES = \ adjustablearrowcap.c \ adjustablearrowcap.h \ adjustablearrowcap-private.h \ alpha-premul-table.inc \ bitmap.c \ bitmap.h \ bitmap-private.h \ brush.c \ brush.h \ brush-private.h \ carbon-private.c \ carbon-private.h \ codecs.h \ codecs-private.h \ customlinecap.c \ customlinecap.h \ customlinecap-private.h \ dstream.c \ dstream.h \ font.c \ font.h \ font-private.h \ fontcollection.h \ fontcollection-private.h \ fontfamily.h \ fontfamily-private.h \ GdiPlusFlat.h \ gdiplus-private.h \ gdip.h \ gdipenums.h \ gdipstructs.h \ general.c \ general.h \ general-private.h \ graphics.c \ graphics.h \ graphics-cairo.c \ graphics-cairo-private.h \ graphics-metafile.c \ graphics-metafile-private.h \ graphics-private.h \ graphics-path.c \ graphics-path.h \ graphics-path-private.h \ graphics-pathiterator.c \ graphics-pathiterator.h \ graphics-pathiterator-private.h \ hatchbrush.c \ hatchbrush.h \ hatchbrush-private.h \ icocodec.c \ icocodec.h \ image.c \ image.h \ image-private.h \ imageattributes.c \ imageattributes.h \ imageattributes-private.h \ lineargradientbrush.c \ lineargradientbrush.h \ lineargradientbrush-private.h \ matrix.c \ matrix.h \ matrix-private.h \ metafile.c \ metafile.h \ metafile-private.h \ pathgradientbrush.c \ pathgradientbrush.h \ pathgradientbrush-private.h \ pen.c \ pen.h \ pen-private.h \ print.c \ region.c \ region.h \ region-private.h \ region-bitmap.c \ region-bitmap.h \ region-path-tree.c \ region-path-tree.h \ solidbrush.c \ solidbrush.h \ solidbrush-private.h \ stringformat.c \ stringformat.h \ stringformat-private.h \ text.c \ text.h \ text-cairo.c \ text-cairo-private.h \ text-pango.c \ text-pango-private.h \ text-metafile.c \ text-metafile-private.h \ texturebrush.c \ texturebrush.h \ texturebrush-private.h \ win32structs.h \ bmpcodec.h \ bmpcodec.c \ emfcodec.c \ emfcodec.h \ emfplus.c \ emfplus.h \ gifcodec.h \ gifcodec.c \ jpegcodec.h \ jpegcodec.c \ pngcodec.h \ pngcodec.c \ tiffcodec.h \ tiffcodec.c \ wmfcodec.c \ wmfcodec.h libgdiplus_la_LIBADD = $(GDIPLUS_LIBS) INCLUDES = $(GDIPLUS_CFLAGS) -Wall -Wno-unused -Wno-format libgdiplus-2.11/src/codecs-private.h0000664000175000017500000000477712225470167014413 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __CODECS_PRIVATE_H__ #define __CODECS_PRIVATE_H__ #include "gdipstructs.h" #include "codecs.h" /* Maximum CODEC signature length, which is the minimum size we need to read from an image file to detect it's type */ #define MAX_CODEC_SIG_LENGTH 44 typedef enum { File, DStream, Memory } ImageSource; typedef struct { BYTE* ptr; int size; int pos; } MemorySource; static const CLSID gdip_image_frameDimension_page_guid = {0x7462dc86U, 0x6180U, 0x4c7eU, {0x8e, 0x3f, 0xee, 0x73, 0x33, 0xa7, 0xa4, 0x83}}; static const CLSID gdip_image_frameDimension_time_guid = {0x6aedbd6dU, 0x3fb5U, 0x418aU, {0x83, 0xa6, 0x7f, 0x45, 0x22, 0x9d, 0xc8, 0x72}}; static const CLSID gdip_image_frameDimension_resolution_guid = {0x84236f7bU, 0x3bd3U, 0x428fU, {0x8d, 0xab, 0x4e, 0xa1, 0x43, 0x9c, 0xa3, 0x15}}; const EncoderParameter *gdip_find_encoder_parameter (GDIPCONST EncoderParameters *eps, const GUID *guid) GDIP_INTERNAL; GpStatus initCodecList (void) GDIP_INTERNAL; void releaseCodecList (void) GDIP_INTERNAL; #endif libgdiplus-2.11/src/fontfamily-private.h0000664000175000017500000000355212225470167015311 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __FONTFAMILY_PRIVATE_H__ #define __FONTFAMILY_PRIVATE_H__ #include "gdiplus-private.h" struct _FontFamily { FcPattern* pattern; BOOL allocated; short height; short linespacing; short celldescent; short cellascent; }; #include "fontfamily.h" #endif libgdiplus-2.11/src/texturebrush.c0000664000175000017500000006047012225470167014232 00000000000000/* * texturebrush.c * * Copyright (C) 2003,2006-2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * TODO * reduce duplication between draw_tile*_texture functions */ #include "texturebrush-private.h" #include "graphics-private.h" #include "bitmap-private.h" #include "matrix-private.h" static GpStatus gdip_texture_setup (GpGraphics *graphics, GpBrush *brush); static GpStatus gdip_texture_clone (GpBrush *brush, GpBrush **clonedBrush); static GpStatus gdip_texture_destroy (GpBrush *brush); /* * we have a single copy of vtable for * all instances of texturebrush. */ static BrushClass vtable = { BrushTypeTextureFill, gdip_texture_setup, gdip_texture_clone, gdip_texture_destroy }; static cairo_content_t from_cairoformat_to_content (cairo_format_t format) { switch (format) { case CAIRO_FORMAT_RGB24: return CAIRO_CONTENT_COLOR; case CAIRO_FORMAT_A8: return CAIRO_CONTENT_ALPHA; case CAIRO_FORMAT_ARGB32: default: return CAIRO_CONTENT_COLOR_ALPHA; } } static void gdip_texture_init (GpTexture *texture) { gdip_brush_init (&texture->base, &vtable); texture->wrapMode = WrapModeTile; texture->rectangle.X = 0; texture->rectangle.Y = 0; texture->rectangle.Width = 0; texture->rectangle.Height = 0; texture->pattern = NULL; cairo_matrix_init_identity (&texture->matrix); } static GpTexture* gdip_texture_new (void) { GpTexture *result = (GpTexture *) GdipAlloc (sizeof (GpTexture)); if (result) gdip_texture_init (result); return result; } /* * functions to create different wrapmodes. */ static GpStatus draw_tile_texture (cairo_t *ct, GpBitmap *bitmap, GpTexture *brush) { cairo_surface_t *original = NULL; cairo_surface_t *texture; cairo_pattern_t *pat; GpStatus status; GpRect *rect = &brush->rectangle; cairo_t *ct2; BYTE *premul = NULL; if (!rect) return InvalidParameter; gdip_bitmap_ensure_surface (bitmap); if (gdip_bitmap_format_needs_premultiplication (bitmap)) { premul = gdip_bitmap_get_premultiplied_scan0 (bitmap); if (premul) { BitmapData *data = bitmap->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = bitmap->surface; /* Use the original as a pattern */ pat = cairo_pattern_create_for_surface (original); status = gdip_get_pattern_status (pat); if (status != Ok) goto cleanup; cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); /* texture surface to be created */ texture = cairo_surface_create_similar (original, from_cairoformat_to_content (bitmap->cairo_format), rect->Width, rect->Height); status = gdip_get_status (cairo_surface_status (texture)); if (status != Ok) { cairo_pattern_destroy (pat); goto cleanup; } /* Draw the texture */ ct2 = cairo_create (texture); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); cairo_destroy (ct2); brush->pattern = cairo_pattern_create_for_surface (texture); status = gdip_get_pattern_status (brush->pattern); if (status == Ok) cairo_pattern_set_extend (brush->pattern, CAIRO_EXTEND_REPEAT); cairo_pattern_destroy (pat); cairo_surface_destroy (texture); status = gdip_get_status (cairo_status (ct)); cleanup: if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return status; } static GpStatus draw_tile_flipX_texture (cairo_t *ct, GpBitmap *bitmap, GpTexture *brush) { cairo_surface_t *original = NULL; cairo_surface_t *texture; cairo_pattern_t *pat; GpRect *rect = &brush->rectangle; GpStatus status; cairo_t *ct2; cairo_matrix_t tempMatrix; BYTE *premul = NULL; if (!rect) return InvalidParameter; gdip_bitmap_ensure_surface (bitmap); if (gdip_bitmap_format_needs_premultiplication (bitmap)) { premul = gdip_bitmap_get_premultiplied_scan0 (bitmap); if (premul) { BitmapData *data = bitmap->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = bitmap->surface; /* Use the original as a pattern */ pat = cairo_pattern_create_for_surface (original); status = gdip_get_pattern_status (pat); if (status != Ok) goto cleanup; cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); /* texture surface to be created */ texture = cairo_surface_create_similar (original, from_cairoformat_to_content (bitmap->cairo_format), 2 * rect->Width, rect->Height); status = gdip_get_status (cairo_surface_status (texture)); if (status != Ok) { cairo_pattern_destroy (pat); goto cleanup; } /* Draw left part of the texture */ ct2 = cairo_create (texture); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); /* Not sure if this is a bug, but using rect->Width - 1 avoids the seam. */ cairo_matrix_init_identity (&tempMatrix); cairo_matrix_translate (&tempMatrix, rect->Width - 1, 0); /* scale in -X direction to flip along X */ cairo_matrix_scale (&tempMatrix, -1.0, 1.0); cairo_pattern_set_matrix (pat, &tempMatrix); /* Draw right part of the texture */ cairo_set_source (ct2, pat); cairo_rectangle (ct2, rect->Width, 0, rect->Width, rect->Height); cairo_fill (ct2); cairo_destroy (ct2); brush->pattern = cairo_pattern_create_for_surface (texture); status = gdip_get_pattern_status (brush->pattern); if (status == Ok) cairo_pattern_set_extend (brush->pattern, CAIRO_EXTEND_REPEAT); cairo_pattern_destroy (pat); cairo_surface_destroy (texture); status = gdip_get_status (cairo_status (ct)); cleanup: if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return status; } static GpStatus draw_tile_flipY_texture (cairo_t *ct, GpBitmap *bitmap, GpTexture *brush) { cairo_surface_t *original = NULL; cairo_surface_t *texture; cairo_pattern_t *pat; GpMatrix tempMatrix; GpRect *rect = &brush->rectangle; GpStatus status; cairo_t *ct2; BYTE *premul = NULL; if (!rect) return InvalidParameter; gdip_bitmap_ensure_surface (bitmap); if (gdip_bitmap_format_needs_premultiplication (bitmap)) { premul = gdip_bitmap_get_premultiplied_scan0 (bitmap); if (premul) { BitmapData *data = bitmap->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = bitmap->surface; /* Use the original as a pattern */ pat = cairo_pattern_create_for_surface (original); status = gdip_get_pattern_status (pat); if (status != Ok) goto cleanup; cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); /* texture surface to be created */ texture = cairo_surface_create_similar (original, from_cairoformat_to_content (bitmap->cairo_format), rect->Width, 2 * rect->Height); status = gdip_get_status (cairo_surface_status (texture)); if (status != Ok) { cairo_pattern_destroy (pat); goto cleanup; } /* Draw upper part of the texture */ ct2 = cairo_create (texture); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); /* Not sure if this is a bug, but using rect->Height - 1 avoids the seam. */ cairo_matrix_init_identity (&tempMatrix); cairo_matrix_translate (&tempMatrix, 0, rect->Height - 1); /* scale in -Y direction to flip along Y */ cairo_matrix_scale (&tempMatrix, 1.0, -1.0); cairo_pattern_set_matrix (pat, &tempMatrix); /* Draw lower part of the texture */ cairo_translate (ct2, 0, rect->Height); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); cairo_destroy(ct2); brush->pattern = cairo_pattern_create_for_surface (texture); status = gdip_get_pattern_status (brush->pattern); if (status != Ok) { cairo_pattern_destroy (pat); cairo_surface_destroy (texture); goto cleanup; } cairo_pattern_set_extend (brush->pattern, CAIRO_EXTEND_REPEAT); cairo_pattern_destroy (pat); cairo_surface_destroy (texture); status = gdip_get_status (cairo_status (ct)); cleanup: if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return status; } static GpStatus draw_tile_flipXY_texture (cairo_t *ct, GpBitmap *bitmap, GpTexture *brush) { cairo_surface_t *original = NULL; cairo_surface_t *texture; cairo_pattern_t *pat; GpMatrix tempMatrix; GpRect *rect = &brush->rectangle; GpStatus status; cairo_t *ct2; BYTE *premul = NULL; if (!rect) return InvalidParameter; gdip_bitmap_ensure_surface (bitmap); if (gdip_bitmap_format_needs_premultiplication (bitmap)) { premul = gdip_bitmap_get_premultiplied_scan0 (bitmap); if (premul) { BitmapData *data = bitmap->active_bitmap; original = cairo_image_surface_create_for_data (premul, CAIRO_FORMAT_ARGB32, data->width, data->height, data->stride); } } /* if premul isn't required (or couldn't be computed, e.g. out of memory) */ if (!original) original = bitmap->surface; /* Use the original as a pattern */ pat = cairo_pattern_create_for_surface (original); status = gdip_get_pattern_status(pat); if (status != Ok) goto cleanup; cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); /* texture surface to be created */ texture = cairo_surface_create_similar (original, from_cairoformat_to_content (bitmap->cairo_format), 2 * rect->Width, 2 * rect->Height); status = gdip_get_status (cairo_surface_status (texture)); if (status != Ok) { cairo_pattern_destroy (pat); goto cleanup; } /* Draw upper left part of the texture */ ct2 = cairo_create (texture); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); /* Not sure if this is a bug, but using rect->Height - 1 avoids the seam. */ cairo_matrix_init_identity (&tempMatrix); cairo_matrix_translate (&tempMatrix, 0, rect->Height - 1); /* scale in -Y direction to flip along Y */ cairo_matrix_scale (&tempMatrix, 1.0, -1.0); cairo_pattern_set_matrix (pat, &tempMatrix); /* Draw lower left part of the texture */ cairo_translate (ct2, 0, rect->Height); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); /* Reset the pattern matrix and do fresh transformation */ cairo_matrix_init_identity (&tempMatrix); /* Not sure if this is a bug, but using rect->Width - 1 avoids the seam. */ cairo_matrix_translate (&tempMatrix, rect->Width - 1, 0); /* scale in -X direction to flip along X */ cairo_matrix_scale (&tempMatrix, -1.0, 1.0); cairo_pattern_set_matrix (pat, &tempMatrix); /* Draw upper right part of the texture */ cairo_translate (ct2, rect->Width, -rect->Height); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); /* Not sure if this is a bug, but using rect->Height - 1 avoids the seam. */ cairo_matrix_translate (&tempMatrix, 0, rect->Height - 1); /* scale in -Y direction to flip along Y */ cairo_matrix_scale (&tempMatrix, 1.0, -1.0); cairo_pattern_set_matrix (pat, &tempMatrix); /* Draw lower right part of the texture */ cairo_translate (ct2, 0, rect->Height); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); cairo_destroy(ct2); brush->pattern = cairo_pattern_create_for_surface (texture); status = gdip_get_pattern_status(brush->pattern); if (status != Ok) { cairo_pattern_destroy (pat); cairo_surface_destroy (texture); goto cleanup; } cairo_pattern_set_extend (brush->pattern, CAIRO_EXTEND_REPEAT); cairo_pattern_destroy (pat); cairo_surface_destroy (texture); status = gdip_get_status (cairo_status (ct)); cleanup: if (premul) { cairo_surface_destroy (original); GdipFree (premul); } return status; } static GpStatus draw_clamp_texture (cairo_t *ct, GpBitmap *bitmap, GpTexture *brush) { cairo_surface_t *original; cairo_surface_t *texture; cairo_pattern_t *pat; GpRect *rect = &brush->rectangle; GpStatus status; cairo_t *ct2; /* Original image surface */ gdip_bitmap_ensure_surface (bitmap); original = bitmap->surface; /* Use the original as a pattern */ pat = cairo_pattern_create_for_surface (original); status = gdip_get_pattern_status (pat); if (status != Ok) { return status; } cairo_pattern_set_extend (pat, CAIRO_EXTEND_REPEAT); /* texture surface to be created */ texture = cairo_surface_create_similar (original, from_cairoformat_to_content (bitmap->cairo_format), rect->Width, rect->Height); if (texture == NULL) { cairo_pattern_destroy (pat); return OutOfMemory; } /* Draw the texture */ ct2 = cairo_create (texture); cairo_identity_matrix (ct2); cairo_set_source (ct2, pat); cairo_rectangle (ct2, 0, 0, rect->Width, rect->Height); cairo_fill (ct2); cairo_destroy(ct2); brush->pattern = cairo_pattern_create_for_surface (texture); status = gdip_get_pattern_status (brush->pattern); if (status != Ok) { cairo_pattern_destroy (pat); cairo_surface_destroy (texture); return status; } cairo_pattern_destroy (pat); cairo_surface_destroy (texture); return gdip_get_status (cairo_status (ct)); } GpStatus gdip_texture_setup (GpGraphics *graphics, GpBrush *brush) { cairo_t *ct; cairo_pattern_t *pattern; GpTexture *texture; GpImage *img; GpStatus status = Ok; BOOL dispose_bitmap; if (!graphics || !brush || !graphics->ct) return InvalidParameter; texture = (GpTexture *) brush; img = texture->image; if (!img) return InvalidParameter; if (img->type != ImageTypeBitmap) return NotImplemented; if (gdip_is_an_indexed_pixelformat (img->active_bitmap->pixel_format)) { /* Unable to create a surface for the bitmap; it is an indexed image. * Instead, it will first be converted to 32-bit RGB. */ img = gdip_convert_indexed_to_rgb (img); if (img == NULL) { return OutOfMemory; } gdip_bitmap_ensure_surface (img); dispose_bitmap = TRUE; } else { dispose_bitmap = FALSE; } ct = graphics->ct; /* We create the new pattern for brush, if the brush is changed * or if pattern has not been created yet. */ if (texture->base.changed || (texture->pattern == NULL)) { if (texture->pattern != NULL) { cairo_pattern_destroy (texture->pattern); } switch (texture->wrapMode) { case WrapModeTile: status = draw_tile_texture (ct, img, texture); break; case WrapModeTileFlipX: status = draw_tile_flipX_texture (ct, img, texture); break; case WrapModeTileFlipY: status = draw_tile_flipY_texture (ct, img, texture); break; case WrapModeTileFlipXY: status = draw_tile_flipXY_texture (ct, img, texture); break; case WrapModeClamp: status = draw_clamp_texture (ct, img, texture); break; default: status = InvalidParameter; } } if (dispose_bitmap) { GdipDisposeImage((GpImage *)img); } if ((status != Ok) || (gdip_get_pattern_status(texture->pattern) != Ok)) { return GenericError; } pattern = texture->pattern; if (pattern != NULL) { /* got something to apply ? */ if (!gdip_is_matrix_empty (&texture->matrix)) { cairo_matrix_t product; gdip_cairo_matrix_copy (&product, &texture->matrix); cairo_matrix_invert (&product); cairo_pattern_set_matrix (pattern, &product); } cairo_set_source (ct, pattern); } return gdip_get_status (cairo_status (ct)); } GpStatus gdip_texture_clone (GpBrush *brush, GpBrush **clonedBrush) { GpTexture *result; GpTexture *texture; GpStatus status; if (!brush || !clonedBrush) return InvalidParameter; result = (GpTexture *) GdipAlloc (sizeof (GpTexture)); if (result == NULL) { return OutOfMemory; } texture = (GpTexture *) brush; result->base = texture->base; result->wrapMode = texture->wrapMode; /* Let the clone create its own pattern. */ result->pattern = NULL; result->base.changed = TRUE; gdip_cairo_matrix_copy (&result->matrix, &texture->matrix); result->rectangle.X = texture->rectangle.X; result->rectangle.Y = texture->rectangle.Y; result->rectangle.Width = texture->rectangle.Width; result->rectangle.Height = texture->rectangle.Height; result->image = NULL; status = GdipCloneImage (texture->image, &result->image); if (status != Ok) { if (result->image) GdipDisposeImage (result->image); GdipFree (result); result = NULL; } else { cairo_surface_reference (result->image->surface); } *clonedBrush = (GpBrush *) result; return status; } GpStatus gdip_texture_destroy (GpBrush *brush) { /* a. the NULL check for brush is done by the caller, GdipDeleteBrush */ /* b. brush itself is freed by the caller */ GpTexture *texture = (GpTexture *) brush; if (texture->pattern) { cairo_pattern_destroy (texture->pattern); texture->pattern = NULL; } if (texture->image) { GdipDisposeImage (texture->image); texture->image = NULL; } return Ok; } /* coverity[+alloc : arg-*2] */ GpStatus GdipCreateTexture (GpImage *image, GpWrapMode wrapMode, GpTexture **texture) { cairo_surface_t *imageSurface = NULL; GpTexture *result; GpStatus status; if (!image || !texture) return InvalidParameter; if ((wrapMode < WrapModeTile) || (wrapMode > WrapModeClamp)) return OutOfMemory; if (image->type != ImageTypeBitmap) return NotImplemented; result = gdip_texture_new (); if (!result) return OutOfMemory; result->image = NULL; status = GdipCloneImage (image, &result->image); if (status != Ok) goto failure; /* note: we must keep the scan0 alive, so we must use the cloned image (and not the original) see bug #80971 */ imageSurface = cairo_image_surface_create_for_data ((BYTE*)result->image->active_bitmap->scan0, image->cairo_format, image->active_bitmap->width, image->active_bitmap->height, image->active_bitmap->stride); if (!imageSurface) goto failure; result->wrapMode = wrapMode; if (result->image->surface) cairo_surface_destroy (result->image->surface); result->image->surface = imageSurface; result->rectangle.X = 0; result->rectangle.Y = 0; result->rectangle.Width = image->active_bitmap->width; result->rectangle.Height = image->active_bitmap->height; *texture = result; return Ok; failure: if (result->image) GdipDisposeImage (result->image); if (imageSurface) cairo_surface_destroy (imageSurface); GdipFree (result); *texture = NULL; return status; } /* coverity[+alloc : arg-*6] */ GpStatus GdipCreateTexture2 (GpImage *image, GpWrapMode wrapMode, float x, float y, float width, float height, GpTexture **texture) { return GdipCreateTexture2I (image, wrapMode, (int) x, (int) y, (int) width, (int) height, texture); } /* coverity[+alloc : arg-*6] */ GpStatus GdipCreateTexture2I (GpImage *image, GpWrapMode wrapMode, int x, int y, int width, int height, GpTexture **texture) { int bmpWidth; int bmpHeight; GpStatus status; GpImage *resized_image = NULL; if (!image || !texture) return InvalidParameter; if (image->type != ImageTypeBitmap) return NotImplemented; bmpWidth = image->active_bitmap->width; bmpHeight = image->active_bitmap->height; /* MS behaves this way */ if ((x < 0) || (y < 0) || (width <= 0) || (height <= 0) || (bmpWidth < (x + width)) || (bmpHeight < (y + height))) return OutOfMemory; status = GdipCloneBitmapAreaI (x, y, width, height, image->active_bitmap->pixel_format, image, &resized_image); if (status != Ok) return status; status = GdipCreateTexture (resized_image, wrapMode, texture); GdipDisposeImage (resized_image); return status; } /* coverity[+alloc : arg-*6] */ GpStatus GdipCreateTextureIA (GpImage *image, GpImageAttributes *imageAttributes, float x, float y, float width, float height, GpTexture **texture) { /* FIXME MonoTODO: Make use of ImageAttributes parameter when * ImageAttributes is implemented */ GpWrapMode mode = imageAttributes ? WrapModeClamp : WrapModeTile; return GdipCreateTexture2 (image, mode, x, y, width, height, texture); } /* coverity[+alloc : arg-*6] */ GpStatus GdipCreateTextureIAI (GpImage *image, GpImageAttributes *imageAttributes, int x, int y, int width, int height, GpTexture **texture) { /* FIXME MonoTODO: Make use of ImageAttributes parameter when * ImageAttributes is implemented */ GpWrapMode mode = imageAttributes ? WrapModeClamp : WrapModeTile; return GdipCreateTexture2I (image, mode, x, y, width, height, texture); } GpStatus GdipGetTextureTransform (GpTexture *texture, GpMatrix *matrix) { if ((texture == NULL) || (matrix == NULL)) { return InvalidParameter; } gdip_cairo_matrix_copy(matrix, &texture->matrix); return Ok; } GpStatus GdipSetTextureTransform (GpTexture *texture, GDIPCONST GpMatrix *matrix) { if ((texture == NULL) || (matrix == NULL)) { return InvalidParameter; } gdip_cairo_matrix_copy(&texture->matrix, matrix); texture->base.changed = TRUE; return Ok; } GpStatus GdipResetTextureTransform (GpTexture *texture) { if (texture == NULL) { return InvalidParameter; } cairo_matrix_init_identity (&texture->matrix); texture->base.changed = TRUE; return Ok; } GpStatus GdipMultiplyTextureTransform (GpTexture *texture, GpMatrix *matrix, GpMatrixOrder order) { GpStatus status; BOOL invertible = FALSE; cairo_matrix_t mat; if ((texture == NULL) || (matrix == NULL)) { return InvalidParameter; } /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; if (order == MatrixOrderPrepend) cairo_matrix_multiply (&mat, matrix, &texture->matrix); else if (order == MatrixOrderAppend) cairo_matrix_multiply (&mat, &texture->matrix, matrix); gdip_cairo_matrix_copy (&texture->matrix, &mat); texture->base.changed = TRUE; return status; } GpStatus GdipTranslateTextureTransform (GpTexture *texture, float dx, float dy, GpMatrixOrder order) { GpStatus status; if (texture == NULL) { return InvalidParameter; } status = GdipTranslateMatrix (&texture->matrix, dx, dy, order); if (status == Ok) texture->base.changed = TRUE; return status; } GpStatus GdipScaleTextureTransform (GpTexture *texture, float sx, float sy, GpMatrixOrder order) { GpStatus status; if (texture == NULL) { return InvalidParameter; } status = GdipScaleMatrix (&texture->matrix, sx, sy, order); if (status == Ok) texture->base.changed = TRUE; return status; } /* MonoTODO - FIXME - this hack affect the public transform and doesn't work with MultiplyTransform */ GpStatus GdipRotateTextureTransform (GpTexture *texture, float angle, GpMatrixOrder order) { GpStatus status; if (texture == NULL) return InvalidParameter; status = GdipRotateMatrix (&texture->matrix, angle, order); if (status == Ok) texture->base.changed = TRUE; return status; } GpStatus GdipSetTextureWrapMode (GpTexture *texture, GpWrapMode wrapMode) { if (texture == NULL) return InvalidParameter; /* ignore invalid GpWrapMode value */ if ((wrapMode < WrapModeTile) || (wrapMode > WrapModeClamp)) return Ok; texture->wrapMode = wrapMode; texture->base.changed = TRUE; return Ok; } GpStatus GdipGetTextureWrapMode (GpTexture *texture, GpWrapMode *wrapMode) { if (!texture || !wrapMode) return InvalidParameter; *wrapMode = texture->wrapMode; return Ok; } /* coverity[+alloc : arg-*1] */ GpStatus GdipGetTextureImage (GpTexture *texture, GpImage **image) { if (!texture || !image) return InvalidParameter; return GdipCloneImage (texture->image, image); } libgdiplus-2.11/src/region-path-tree.c0000664000175000017500000002045012225470167014632 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "region-path-tree.h" #include "graphics-path-private.h" /* * gdip_region_clear_tree: * @tree: a GpPathTree to clear * * Recursively clear (delete path and free memory) the specified path tree. */ void gdip_region_clear_tree (GpPathTree *tree) { if (!tree) return; if (tree->path) { GdipDeletePath (tree->path); tree->path = NULL; } else { gdip_region_clear_tree (tree->branch1); GdipFree (tree->branch1); gdip_region_clear_tree (tree->branch2); GdipFree (tree->branch2); } } /* * gdip_region_copy_tree: * @source: the GpPathTree to copy * @dest: the GpPathTree copy * * Recursively copy (and allocate) the @source path tree into @dest. * If @source is present then we must have a valid @dest. */ void gdip_region_copy_tree (GpPathTree *source, GpPathTree *dest) { if (!source) return; g_assert (dest); if (source->path) { GdipClonePath (source->path, &dest->path); dest->branch1 = NULL; dest->branch2 = NULL; } else { dest->path = NULL; dest->mode = source->mode; dest->branch1 = (GpPathTree *) GdipAlloc (sizeof (GpPathTree)); gdip_region_copy_tree (source->branch1, dest->branch1); dest->branch2 = (GpPathTree *) GdipAlloc (sizeof (GpPathTree)); gdip_region_copy_tree (source->branch2, dest->branch2); } } /* * gdip_region_get_tree_size: * @tree: a GpPathTree * * Recursively calculate the size (in bytes) required to serialized @tree. */ UINT gdip_region_get_tree_size (GpPathTree *tree) { UINT result; if (tree->path) { /* tag, count, fillmode, types and points */ result = 3 * sizeof (UINT) + (tree->path->count * sizeof (BYTE)) + (tree->path->count * sizeof (GpPointF)); } else { /* tag, operation, size (branch1), branch1, size (branch2), branch2 */ result = 4 * sizeof (guint32); result += gdip_region_get_tree_size (tree->branch1); result += gdip_region_get_tree_size (tree->branch2); } return result; } /* * gdip_region_deserialize_tree: * @data: a byte array * @size: the length of the byte array * @tree: a GpPathTree * * Recursively deserialize the @tree from the supplied buffer @data. Returns * TRUE if the deserialization was possible, or FALSE if a problem was found * (e.g. @size mismatch, bad data...) */ BOOL gdip_region_deserialize_tree (BYTE *data, int size, GpPathTree *tree) { int len = sizeof (guint32); guint32 tag; memcpy (&tag, data, len); data += len; size -= len; switch (tag) { case REGION_TAG_PATH: { /* deserialize a path from the memory blob */ guint32 count; FillMode mode; tree->mode = CombineModeReplace; tree->branch1 = NULL; tree->branch2 = NULL; /* count */ memcpy (&count, data, len); data += len; size -= len; /* mode (FillMode, not CombineMode) */ memcpy (&mode, data, len); data += len; size -= len; /* check that the size match the length of the type (byte) and GpPointF for the specified count */ if (size == count + count * sizeof (GpPointF)) { BYTE* types = data; GpPointF *points = (GpPointF*) (data + count); return (GdipCreatePath2 (points, types, count, mode, &tree->path) == Ok); } return FALSE; } break; case REGION_TAG_TREE: { guint branch_size; tree->path = NULL; /* operation */ memcpy (&tree->mode, data, len); data += len; size -= len; /* size (branch1) */ memcpy (&branch_size, data, len); data += len; size -= len; /* deserialize a tree from the memory blob */ tree->branch1 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); if (!gdip_region_deserialize_tree (data, branch_size, tree->branch1)) return FALSE; data += branch_size; size -= branch_size; /* size (branch2) */ memcpy (&branch_size, data, len); data += len; size -= len; tree->branch2 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); if (!gdip_region_deserialize_tree (data, branch_size, tree->branch2)) return FALSE; } break; default: g_warning ("Invalid tag %d", tag); return FALSE; } return TRUE; } /* * gdip_region_serialize_tree: * @tree: a GpPathTree * @buffer: a byte array * @bufferSize: the length of the byte array * @sizeFilled: a pointer to a integer * * Recursively serialize the @tree data in the supplied @buffer. Returns TRUE * if the serialization was possible, or FALSE if a problem was found (e.g. * @bufferSize too small). If successful @sizeFilled will contains the actual * number of bytes that were required to serialize @tree. */ BOOL gdip_region_serialize_tree (GpPathTree *tree, BYTE *buffer, UINT bufferSize, UINT *sizeFilled) { if (tree->path) { /* tag */ guint32 temp = REGION_TAG_PATH; int len = sizeof (guint32); memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; /* count */ memcpy (buffer, &tree->path->count, len); buffer += len; *sizeFilled += len; /* fill_mode */ temp = tree->path->fill_mode; memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; /* types */ len = tree->path->types->len; memcpy (buffer, tree->path->types->data, len); buffer += tree->path->types->len; *sizeFilled += len; /* points */ len = tree->path->points->len * sizeof (GpPointF); memcpy (buffer, tree->path->points->data, len); buffer += len; *sizeFilled += len; } else { /* tag */ BYTE *original = buffer; guint32 temp = REGION_TAG_TREE; int len = sizeof (guint32); memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; /* operation */ temp = tree->mode; memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; /* serialize branch 1 (size + branch) */ temp = gdip_region_get_tree_size (tree->branch1); memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; if (!gdip_region_serialize_tree (tree->branch1, buffer, bufferSize - (buffer - original), sizeFilled)) return FALSE; buffer += temp; /* serialize branch 2 (size + branch) */ temp = gdip_region_get_tree_size (tree->branch2); memcpy (buffer, &temp, len); buffer += len; *sizeFilled += len; if (!gdip_region_serialize_tree (tree->branch2, buffer, bufferSize - (buffer - original), sizeFilled)) return FALSE; } return TRUE; } /* * gdip_region_transform_tree: * @tree: a GpPathTree * @matrix: the GpMatrix to apply to the tree * * Recursively apply the @matrix to the @tree. */ GpStatus gdip_region_transform_tree (GpPathTree *tree, GpMatrix *matrix) { if (tree->path) { return GdipTransformPath (tree->path, matrix); } else { GpStatus status; status = gdip_region_transform_tree (tree->branch1, matrix); if (status == Ok) status = gdip_region_transform_tree (tree->branch2, matrix); return status; } } /* * gdip_region_translate_tree: * @tree: a GpPathTree * @dx: the delta x to apply to each point * @dy: the delta y to apply to each point * * Recursively apply the @dx, @dy translation to each point, of each path, * in the @tree. */ void gdip_region_translate_tree (GpPathTree *tree, float dx, float dy) { if (tree->path) { int i; for (i = 0; i < tree->path->count; i++) { GpPointF *point = &g_array_index (tree->path->points, GpPointF, i); point->X += dx; point->Y += dy; } } else { gdip_region_translate_tree (tree->branch1, dx, dy); gdip_region_translate_tree (tree->branch2, dx, dy); } } libgdiplus-2.11/src/tiffcodec.h0000664000175000017500000000215512225470167013415 00000000000000/* * tiffcodec.h : Contains function declarations for encoding decoding tiff images * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * * Copyright (C) 2003-2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef _TIFFCODEC_H #define _TIFFCODEC_H #include "bitmap-private.h" #include "bmpcodec.h" GpStatus gdip_load_tiff_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_tiff_image_from_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage **image) GDIP_INTERNAL; GpStatus gdip_save_tiff_image_to_file (unsigned char *filename, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; GpStatus gdip_save_tiff_image_to_stream_delegate (GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; ImageCodecInfo* gdip_getcodecinfo_tiff () GDIP_INTERNAL; #endif /* _TIFFCODEC_H */ libgdiplus-2.11/src/region-path-tree.h0000664000175000017500000000422112225470167014635 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef _REGION_PATH_TREE_H_ #define _REGION_PATH_TREE_H_ #include "gdiplus-private.h" #include "matrix-private.h" /* internal (private) API for regions path trees */ #define REGION_TAG_PATH 1 #define REGION_TAG_TREE 2 typedef struct GpPathTree { CombineMode mode; GpPath* path; struct GpPathTree* branch1; struct GpPathTree* branch2; } GpPathTree; void gdip_region_clear_tree (GpPathTree *tree) GDIP_INTERNAL; void gdip_region_copy_tree (GpPathTree *source, GpPathTree *dest) GDIP_INTERNAL; UINT gdip_region_get_tree_size (GpPathTree *tree) GDIP_INTERNAL; BOOL gdip_region_deserialize_tree (BYTE *data, int size, GpPathTree *tree) GDIP_INTERNAL; BOOL gdip_region_serialize_tree (GpPathTree *tree, BYTE *buffer, UINT bufferSize, UINT *sizeFilled) GDIP_INTERNAL; void gdip_region_translate_tree (GpPathTree *tree, float dx, float dy) GDIP_INTERNAL; GpStatus gdip_region_transform_tree (GpPathTree *tree, GpMatrix *matrix) GDIP_INTERNAL; #endif /* _REGION_PATH_TREE_H_ */ libgdiplus-2.11/src/win32structs.h0000664000175000017500000001447312225470167014067 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __WIN32STRUCTS_H__ #define __WIN32STRUCTS_H__ #include "glib.h" /* public enums and structures that GDI+ reuse from the other Windows API */ #define LF_FACESIZE 32 /* SetBkMode */ #define TRANSPARENT 1 #define OPAQUE 2 /* SetMapMode */ #define MM_TEXT 1 #define MM_LOMETRIC 2 #define MM_HIMETRIC 3 #define MM_LOENGLISH 4 #define MM_HIENGLISH 5 #define MM_TWIPS 6 #define MM_ISOTROPIC 7 #define MM_ANISOTROPIC 8 /* CreatePenIndirect */ #define PS_NULL 0x00000005 #define PS_STYLE_MASK 0x0000000F #define PS_ENDCAP_ROUND 0x00000000 #define PS_ENDCAP_SQUARE 0x00000100 #define PS_ENDCAP_FLAT 0x00000200 #define PS_ENDCAP_MASK 0x00000F00 #define PS_JOIN_ROUND 0x00000000 #define PS_JOIN_BEVEL 0x00001000 #define PS_JOIN_MITER 0x00002000 #define PS_JOIN_MASK 0x0000F000 /* CreateBrushIndirect */ #define BS_SOLID 0 #define BS_NULL 1 #define BS_HATCHED 2 #define BS_PATTERN 3 #define BS_INDEXED 4 /* SetPolyFillMode */ #define ALTERNATE 1 #define WINDING 2 /* SetRelabs */ #define ABSOLUTE 1 #define RELATIVE 2 /* ModifyWorldTransform */ #define MWT_IDENTITY 1 #define MWT_LEFTMULTIPLY 2 #define MWT_RIGHTMULTIPLY 3 typedef int LANGID; typedef int INT; typedef guint16 WCHAR; /* 16-bits unicode */ typedef guint32 UINT; typedef guint32 ARGB; typedef guint32 UINT32; typedef gint32 PROPID; typedef guint32 ULONG_PTR; /* not a pointer! */ typedef float REAL; typedef gpointer HBITMAP; typedef gpointer HDC; typedef gpointer HENHMETAFILE; typedef gpointer HFONT; typedef gpointer HICON; typedef gpointer HINSTANCE; typedef gpointer HMETAFILE; typedef gpointer HPALETTE; /* mono/io-layer/uglify.h also has these typedefs. * To avoid a dependency on mono we have copied all * the required stuff here. We don't include our defs * if uglify.h is included somehow. */ #ifndef _WAPI_UGLIFY_H_ /* to avoid conflict with uglify.h */ typedef const gunichar2 *LPCTSTR; typedef gunichar2 *LPTSTR; typedef guint8 BYTE; typedef guint8 *LPBYTE; typedef guint16 WORD; typedef guint32 DWORD; typedef gpointer PVOID; typedef gpointer LPVOID; typedef gboolean BOOL; typedef guint32 *LPDWORD; typedef gint16 SHORT; typedef gint32 LONG; typedef guint32 ULONG; typedef gint32 *PLONG; typedef guint64 LONGLONG; typedef gunichar2 TCHAR; typedef size_t SIZE_T; typedef gpointer HANDLE; typedef gpointer *LPHANDLE; typedef guint32 SOCKET; typedef gpointer HMODULE; typedef gpointer HRGN; #define CONST const #define VOID void #define IN #define OUT #define WINAPI #endif /* to avoid conflict with uglify.h */ typedef struct { DWORD Data1; WORD Data2; WORD Data3; BYTE Data4 [8]; } GUID, Guid, CLSID; typedef struct { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; char lfFaceName[LF_FACESIZE]; } LOGFONTA; typedef struct { LONG lfHeight; LONG lfWidth; LONG lfEscapement; LONG lfOrientation; LONG lfWeight; BYTE lfItalic; BYTE lfUnderline; BYTE lfStrikeOut; BYTE lfCharSet; BYTE lfOutPrecision; BYTE lfClipPrecision; BYTE lfQuality; BYTE lfPitchAndFamily; WCHAR lfFaceName[LF_FACESIZE]; } LOGFONTW; typedef struct { float eM11; float eM12; float eM21; float eM22; float eDx; float eDy; } XFORM; typedef struct { LONG x; LONG y; } POINT; typedef DWORD COLORREF; typedef struct { UINT lopnStyle; POINT lopnWidth; COLORREF lopnColor; } LOGPEN; typedef struct { UINT lbStyle; COLORREF lbColor; LONG lbHatch; } LOGBRUSH; typedef struct { int left; int top; int right; int bottom; } RECT, RECTL; typedef struct { int cx; int cy; } SIZE, SIZEL; typedef struct { SHORT Left; SHORT Top; SHORT Right; SHORT Bottom; } PWMFRect16; #ifndef __GNUC__ #pragma pack(2) #endif typedef struct #ifdef __GNUC__ __attribute__ ((packed)) #endif { WORD mtType; /* 1 for disk, 0 for memory */ WORD mtHeaderSize; WORD mtVersion; DWORD mtSize; WORD mtNoObjects; DWORD mtMaxRecord; WORD mtNoParameters; } METAHEADER; typedef struct #ifdef __GNUC__ __attribute__ ((packed)) #endif { DWORD Key; SHORT Hmf; PWMFRect16 BoundingBox; SHORT Inch; DWORD Reserved; SHORT Checksum; } WmfPlaceableFileHeader; #ifndef __GNUC__ #pragma pack() #endif typedef struct { DWORD iType; DWORD nSize; RECTL rclBounds; RECTL rclFrame; DWORD dSignature; DWORD nVersion; DWORD nBytes; DWORD nRecords; WORD nHandles; WORD sReserved; DWORD nDescription; DWORD offDescription; DWORD nPalEntries; SIZEL szlDevice; SIZEL szlMillimeters; } ENHMETAHEADER3; typedef struct { int Type; int Size; int Version; int EmfPlusFlags; float DpiX; float DpiY; int X; int Y; int Width; int Height; union { METAHEADER WmfHeader; ENHMETAHEADER3 EmfHeader; }; int EmfPlusHeaderSize; int LogicalDpiX; int LogicalDpiY; } MetafileHeader; #endif libgdiplus-2.11/src/ChangeLog0000664000175000017500000070175212225470167013101 000000000000002010-07-20 Sebastien Pouliot * image.c: Use DPI from source image when creating a Graphics instance from it. Fix bug #556181 2010-07-14 Sebastien Pouliot * lineargradientbrush.c: Do not accept empty (width/height) rectangles to create a linear brush. Fix bug #537396 2010-07-07 Sebastien Pouliot * pngcodec.c: security fix in libpng 1.2 broke the define 2010-06-16 Sebastien Pouliot * image.c: Fix #529887 for drawing a part of image with scaling. Patch provided by Dan Parnham 2010-05-17 Tom Hindle * image.c: perform calculated transformation. Fix #606412 2010-05-04 Miguel de Icaza * Apply patch from Matthew Metnetsky which fixes Bug #590286 Passing -1 (to indicate null terminated string) for the string lengths for GdipDrawString and GdipMeasureString causes the program to seg-fault. 2010-04-12 Sebastien Pouliot * pngcodec.c: SuSE provided patch for newer libpng (1.4.x). Made to be backward compatible with 1.2.x 2010-03-26 Miguel de Icaza * Apply patch from Matthew Metnetsky which fixes 590503, GdipCloneImage not cloning the properties. 2010-01-13 Sebastien Pouliot * tiffcodec.c: Don't call TIFFClose with a NULL value. Fix #569940 2009-08-19 Jeffrey Stedfast * font.c (gdip_get_fontfamily_details_from_freetype): Fixed to use values much closer to those returned by GDI+ based on work done in Moonlight. 2009-03-20 Tom Hindle * graphics.c: Allow GdipCreateFromHDC to work on the HDC of objects previousy created with GdipCreateFromHDC. Also allow GdipCreateFromHDC to work with gtMemoryBitmap types. 2009-01-28 Sebastien Pouliot * image.c: Revert last change wrt resolution 2009-01-02 Sebastien Pouliot * image.c: Adjust image width/height wrt its resolution before drawing (this can be used to scale a picture). * bitmap.c: Add more validations to GdipBitmapSetResolution [Fix bug #434583] 2008-12-23 Sebastien Pouliot * text.c (GdipMeasureCharacterRanges): Don't handle empty (zero) width or height at this early stage. * text-cairo.c: Handle negative/zero width/height to match MS GDI+ [Fix bug #449971] 2008-11-07 Sebastien Pouliot * graphics-cairo.c (make_arc): Only compute start points if we actually need them. * graphics-path.c (append_arcs): Fix arcs computation like this was done for #410459 (draw) but in this case we need to keep the direction/increment since the points are part of a path. [Fix bug #442428] 2008-10-30 Sebastien Pouliot * region-bitmap.c (reduce): Fix skipping a color channel while reducing the bitmap to 1bpp (provided by David Binderman) [Fix bug #440127] 2008-09-03 Sebastien Pouliot * general.c: Compute intermediate start/end points correctly on an open curve. Patch by Marek Habersack 2008-09-02 Sebastien Pouliot * graphics-path.c: Add support to compress points (skip on of two identical consecutive points) under some special cases. 2008-08-11 Sebastien Pouliot * image.c: Remove buggy loop in gdip_bitmap_clone which allocates way too much memory when cloning an image with multiple frames (and only free one of them). [Fix bug #411454] 2008-08-04 Sebastien Pouliot * graphics-cairo.c: (make_arcs) Simplify logic so the increment is always positive. Fix arcs going in the wrong direction (wihtout more code). [Fix bug #410459] 2008-08-04 Sebastien Pouliot * pen.c: Pen minimal visual size is 1.0 pixel (whatever the scaling). [Fix bug #410466] 2008-08-04 Sebastien Pouliot * graphics-cairo.c: Only stroke using a 1.0 width line. Also close the path before filling. [Fix bug #413461] 2008-07-18 Sebastien Pouliot * graphics-cairo.c: Don't stroke when filling (required to match GDI+ behavior) when the graphic is being scaled (since the pen's thickness is scaled too). [Fix bug #410124] 2008-07-17 Sebastien Pouliot * graphics-private.h: Add definition for gdip_is_scaled * general.c: Remove static from gdip_is_scaled * graphics-cairo.c: Don't apply AA offset to Ellipses and Pies if the graphic is being scaled. [Fix bug #409672] 2008-07-07 Sebastien Pouliot * font.c: Clone GpFontFamily when creating a new font. [Fix https://bugs.launchpad.net/ubuntu/+source/mono/+bug/246376] 2008-06-27 Sebastien Pouliot * region.c: Handle the case were we compute a negative Height value while building the rectangle list for exclude. [Fix bug #402613] 2008-04-25 Sebastien Pouliot * region.c: Normalize rectangles (apply negative width and height to X, Y) before doing binary operations on them. [Fix second part of bug #383878] 2008-04-25 Sebastien Pouliot * region.c: Fix possible crash in Complement. [Fix part of bug #383878] 2008-04-21 Sebastien Pouliot * general-private.h: Don't clamp values for Cairo >= 1.6 since the fixed point values are now kept in the 24/8 format. * graphics-private.h: Change the CAIRO_AA_OFFSET_X from 1.0 to 0.5 for Cairo >= 1.6. * graphics-cairo.c: Revert earlier AA tweaks (r100945) as it broke rectangles and the change to CAIRO_AA_OFFSET_X does the required fixes. [Fix bug #381737] * graphics-path.c: IsVisible X offset still needs to be 1.0 (whatever version of Cairo being used). 2008-04-18 Jeffrey Stedfast * text-cairo.c (MeasureString): #include for isspace() and also do proper casting so that we don't run into problems on non-GNU systems. 2008-04-18 Sebastien Pouliot * pngcodec.c: If PNG_INCH_CONVERSIONS is not defined (old libpng) then manual compute resolution. If none is available fall back to screen resolution. Fix bug #381169 2008-04-16 Sebastien Pouliot * graphics-cairo.c: Tweak AA (since looks like Cairo 1.6 tweaked it too ;-). Probably not complete but this fix SD unit tests. 2008-04-03 Sebastien Pouliot * image.c: Copy (and later restore) the original matrix before applying any "local" change inside GdipDrawImageRect. Fix bug #376855 2008-02-14 Geoff Norton * carbon-private.c: Display automatic dpi detection for now, its causing too many problems. 2008-01-23 Geoff Norton * Makefile.am: Add carbon-private.* to the build. * general.c: Use gdip_get_display_dpi_carbon to get dpi on the mac * graphics.c: Rename GdipCreateFromQuartz_macosx to GdipCreateFromContext_macosx * carbon-private.c: A mac specific implementation to get the horizontal and vertical dpi of a display. 2007-12-22 Geoff Norton * graphics-private.h: Revert the CAIRO_AA change as it caused regressions in the testsuite and improperly layed out controls. 2007-12-04 Geoff Norton * general.c: Optimize the code path to only check the environment variable once for dpi detection on the Mac. 2007-11-16 Sebastien Pouliot * graphics-cairo.c: If we need to stroke, before filling, then we must preserve the path. Fix bug #342074. 2007-11-15 Geoff Norton * general.c: If we're running on the Carbon driver avoid the call to XOpenDisplay. This fixes a deadlock race condition on Leopard as well as prevents X11 from opening when we start MWF apps. 2007-11-07 Geoff Norton * graphics-private.h: Add CGImageRelease prototype. * graphics.c: Free the CGImageRef after copying it to our display context. Fixes a massive memory leak in the Mac backend 2007-11-01 Sebastien Pouliot * font.c: Fix font face selection (typo) and ensure the font-family doesn't cache a version without bold and/or italics. Fix #338207 * pen.c: Fix pen scaling (either X or Y) by 0. MS GDI+ produce a thin line while Cairo would return an error. Fix bug #338233 * text-pango-private.h: Add ctype.h include to remove warning about isspace. 2007-10-31 Sebastien Pouliot * graphics-path.c: Avoid computing the start point coord unless we need them later. Add URL for formula used here. 2007-10-30 Sebastien Pouliot * lineargradientbrush.c: Remove small (+1) cosmetic fix that breaks severely when a scale transform is applied to the gradient. Fix bug #325178 2007-10-30 Sebastien Pouliot * graphics.c: Remove gdip_plot_path (duplicate) function. * graphics-cairo.c|h: Change [gdip_]convert_fill_mode visibility. * graphics-path.c: Remove old code used for Is[Outline]Visible functions and use the cairo functions (with some adjustments). This fix bug #325502 (ellipse didn't work). This should also fix some cases where GpGraphics should have been used for the check. 2007-10-29 Sebastien Pouliot * lineargradientbrush.c: Nullify linear->pattern since we can return from the function without creating a new pattern (i.e. stall pointer) 2007-10-17 Geoff Norton * graphics.c: Construct the quartz surface with a image backend so all cairo operations can complete without failure. We blit the image to the real cgContext when Flush () is called. * graphics-private.h: Set CAIRO_AA_OFFSET_X to 0.5 when running on a Mac. Add cg_context to Graphics structure when built with the Quartz surface so we can blit the resultant image to the real context. Add declarations for the CoreGraphics structures we need for the blitting. Add declarations for the CoreGraphics / cairo functions we need to call for blitting. 2007-08-13 Sebastien Pouliot * text-pango.c: Ensure we can use the results of MeasureString to DrawString and get the same results. 2007-08-13 Sebastien Pouliot * text.notes: New. Notes about text rendering. * text-cairo.c: Add correct support for MeasureTrailingSpaces * text-pango.c: Optimize the case where the font is underlined and HotkeyPrefixShow is used. 2007-08-10 Sebastien Pouliot * graphics-path.c: Reuse gdip_pango_setup_layout for paths (needs testing). * text-pango.c | text-pango-private.h: Make API usable for GdipAddPathString and free (unref) the PangoLayout. 2007-08-09 Sebastien Pouliot * font.c | font-private.h: Refactor font code to work with either Cairo+FreeType or Pango+FreeType. * graphics-path.c: Adjust for Pango/Cairo rendering in AddString. The Pango part isn't yet done. * text.c: switch between Cairo or Pango rendering at compile time. * text-cairo.c | text-cairo-private.h: Define out if pengo rendering is active. * text-pango.c | text-pango-private.h: New. Pango rendering using the high-level API (PangoLayout). Not all options are supported (but then our Cairo-based rendering never supported all of them either ;-) * Makefile.am: Add text-pango.c and text-pango-private.h to the build. 2007-08-02 Sebastien Pouliot * text-cairo.c: Reverting patch for bug #78777 to fix bug #81572. Fixed the "height" part of bug #78777 (LF isn't on the line you expect it to be). The X position is off because LF aren't characters anymore (and this mess with the ranges). 2007-08-01 Sebastien Pouliot * text-cairo-private.h | text-cairo.c: Fix MeasureCharacterRanges inconsistentency (#77496), i.e. missing descent, without (hopefully) breaking everything else. 2007-08-01 Sebastien Pouliot * bitmap.c: Use [g|s]et_pixel_bgra macros inside premul function to avoid endian issues. * font.c | fontfamily.h: Added GdipCloneFontFamily (fix #80845); 2007-07-31 Sebastien Pouliot * bitmap.c: Ensure proper initialization of palette when locking a bitmap. Make more use of gdip_palette_clone function. * region.c: Add special case for to exclude path/regions from infinity. Updated patch from Yves Bastide. Fix #81833. 2007-07-31 Sebastien Pouliot * graphics-path.c: Simplify GdipClosePathFigure. * text-[cairo|metafile]-private.h: Hide internal functions. 2007-07-31 Sebastien Pouliot * graphics-path.c: Reverse PathTypes. Patch by Yves Bastide. Fix #81859. 2007-07-30 Sebastien Pouliot * graphics-path.c: Avoid allocations/freeing of memory when reversing the array of points. 2007-07-30 Sebastien Pouliot * bitmap.c: Added global functions to deal with pre-multiplication. * bitmap-private.h: New prototypes for pre-multiplication. * texturebrush.c: If required by the format pre-multiply the alpha value of the brush bitmap before it's use as a pattern. Fix #81828. Cleaned-up some unused variables but there's still too much duplication for my taste (added TODO). 2007-07-30 Sebastien Pouliot * graphics-cairo.c: Fix DrawPath offset (bug #82202) and correctly fill the path (which includes stroking in this case). 2007-07-05 Sebastien Pouliot * imageattributes.c: Re-fix alpha. 2007-07-03 Sebastien Pouliot * graphics-path.c: Add missing checks in GdipGetPath[Types|Points] functions (based on parts of #81859 patch by Yves Bastide). * region.c: Add a few shortcuts to empty paths|regions combined with an infinite regions (based on parts of #81833 patch by Yves Bastide). 2007-06-21 Sebastien Pouliot * imageattributes.c: Fix "too clever" optimization with alpha when applying a ColorMatrix. 2007-06-21 Sebastien Pouliot * customlinecap.c: Fix #81829 to allow either a fill or stroke path when creating a GpCustomLineCap. 2007-06-21 Sebastien Pouliot * codecs.h, GdiPlusFlat.h, image.h, dstream.c: Fix #81845 to allow using with C++ compilers and -Werror. Patch by Yves Bastide. 2007-06-21 Sebastien Pouliot * graphics.h: Add missing GdipGetClip prototype. Fix #81844. Patch by Yves Bastide. 2007-06-21 Sebastien Pouliot * general.c|h: Fix signature for GdiplusShutdown. Fix bug #81842. 2007-06-21 Sebastien Pouliot * bitmap.c, bmpcodec.c, icocodec.c, imageattributes.c, image.c, jpegcodec.c, pngcodec.c, tiffcodec.c, gdipenums.h: Fix PixelFormat*Rgb (and Argb) to PixelFormat*RGB (and ARGB) to match MS GDI+ definitions. Patch by Yves Bastide. Fix #81841 2007-06-05 Sebastien Pouliot * emfcodec.c, metafile-private.h, wmfcodec.c, wmfcodec.h: ++ is unsafe to use with the GUINTx_FROM_LE macro. Also avoid macro re-declarations 2007-05-30 Sebastien Pouliot * gifcodec.c: Add support for interlaced GIF. Fix bug #81773 * imageattributes.c: Add support for ColorMatrixFlags and Gray ColorMatrix (quite popular based on MoMA reports); * imageattributes-private.h: Add the gray color matrix and the color matrix flags into the GpImageAttribute structure. 2007-05-28 Sebastien Pouliot * graphics-cairo.c: Adjust the x,y position (-1,-1) when the pen's length is a multiple of 2. This makes the rectangle drawing match MS implementation. Also fix cairo_DrawRectanglesI to use anti-aliasing (like all drawing functions should do). * graphics-cairo-private.h: Add macro to check if a coordinate correction is required for the specified pen's width. 2007-05-25 Sebastien Pouliot * general-private.h: Don't optimize convertions when printing. * text-cairo.c: Ensuew we converting coordinates when printing. Fix bug #81708 2007-05-24 Sebastien Pouliot * graphics-cairo.c: Don't use antialiasing on clipping paths. Fix bug #81721. * image.c: Implement GdipDrawImagePointsRect[I] functions. 2007-05-23 Sebastien Pouliot * pngcodec.c: Add correct support for 2bpp PNG images (promoted to 32bpp ARGB) and fixed palette for 4bpp images. Fix bug #81674. 2007-05-22 Sebastien Pouliot * graphics.c: Fix GdipCreateFromHDC to return OutOfMemory if HDC is NULL. This match MS behavior as seen in (unfixed) bug #81709. 2007-05-17 Sebastien Pouliot * general-private.h: Define G_MININT16 and G_MAXINT16 when not available on a platform. 2007-05-17 Sebastien Pouliot * emfcodec.c: Don't play empty but valid (e.g. recording) metafiles. * graphics.c: Move cairo code to graphics-cairo.c and switch functions between the cairo and metafile backends. * graphics-private.h: Add the required data for the metafile backend. * graphics-cairo.c: New file. Moved cairo-based stuff from graphics.c. * graphics-cairo-private.h: New. header to cairo graphics functions. * graphics-metafile.c: New. Metafile graphics recording functions. * graphics-metafile-private.h: New. header to metafile graphics functions. * image.c: Allow creating GpGraphics contexts on a recording metafile. * metafile.c: Starting support for recording. * metafile-private.h: Add data/functions required for recording. * text.c: Move non-validation code (i.e. cairo code) into text-cairo.c * text.h: Add copyrights header. * text-cairo.c: New file. Moved cairo-based stuff from text.c. * text-cairo-private.h: New. header to cairo-based text functions. * text-metafile.c: New. Metafile-based text rendering. * text-metafile-private.h: New. header to metafile text functions. * Makefile.am: Add new files, remove old one. 2007-05-15 Sebastien Pouliot * graphics-private.h: Add macro to check for position overflows. * image.c: Check for negative width/height values and overflows in function GdipDrawImageRect (not applicable to metafiles). Check GpUnit inside function GdipDrawImageRectRect. 2007-05-12 Miguel de Icaza * image.c (GdipDrawImageRect): Passing a width or height of 0 is a no-op on Windows. Prevents Cairo from setting an INVALID_MATRIX error (the Paint.NET reported bug). 2007-05-08 Sebastien Pouliot * bitmap.c|bitmap-private.h: Add new gdip_create_greyscale_palette function to avoid duplicate work in codecs. * jpegcodec.c: Fix support for 8bpp indexed greyscale images (#81552). * pngcodec.c: Use new greyscale palette function. 2007-05-03 Sebastien Pouliot * print.c: Fix headers inclusion (and re-enable that code). 2007-04-26 Sebastien Pouliot * metafile.c|h: Add delegate-based GdipRecordMetafile... functions to replace the IStream COM based functions outside of Windows. 2007-04-26 Sebastien Pouliot * gifcodec.c: Add image.h so we can build (stubs) without libgif * jpegcodec.c: Add image.h and dtream.h so we can build (stubs) without libjpeg and move up "extern GUID GdipEncoderQuality". * tiffcodec.c: Add image.h so we can build (stubs) without libtiff 2007-04-26 Sebastien Pouliot * emfcodec.h: Include metafile-private.h * emfplus.h: Include metafile-private.h * graphics.c: Correct API wrt public API * graphics.h: Clean up public API (and include missing stuff) * gdiplus-private.h: Add typedef for GpMetafile * image.c: Include metafile-private.h * metafile.c: Add GdipRecordMetafile{Filename][I] functions. * metafile.h: Add new record functions. Remove private stuff (into new private header) and win32 definitions. * metafile-private.h: New file. Private header. * win32structs.h: Add metafile public here * wmfcodec.h: Include metafile-private.h * Makefile.am: Add new metafile-private.h to the build/dist 2007-04-25 Sebastien Pouliot * pngcodec.c: Fix compilation when old headers are used (e.g. rh9 and our debian 3.1 builds on arm and sparc). 2007-04-24 Sebastien Pouliot * font.c: Use guint16 instead of UINT16. * font-family.h: Use guint16 instead of UINT16. * win32structs.h: Remove UINT16 definition. It's also present in some libjpeg headers and some compilers don't like it's redeclaration. 2007-04-24 Sebastien Pouliot * adjustablearrowcap.c: Header/types adjustments. * adjustablearrowcap.h: New file. Public header. * adjustablearrowcap-private.h: New file. Private header. * alpha-premul-table.inc: Types adjustment. * bmpcodec.c|h: Header/types adjustments. * bitmap.c: Header/types adjustments. * bitmap.h: New file. Public header. * bitmap-private.h: New file. Private header. * brush.c: Header adjustments. * brush.h: Move private stuff out. * brush-private.h: New file. Private header. * codecs.h: New file. Contains public codec declarations. * codecs-private.h: New file. Private header. * customlinecap.c: Header adjustments. * customlinecap.h: Move private stuff out, move public stuff in. * customlinecap-private.h: New file. Private header. * dstream.c|h: Header adjustments. * emfcodec.c|h: Header/types adjustments. * emfplus.h: Header adjustments. * font.c: Header/types adjustments. * font.h: New file. Public header. * fontcollection.h: New file. Public header. * fontcollection-private.h: New file. Private header. * fontfamily.h: New file. Public header. * fontfamily-private.h: New file. Private header. * gdip.h: Deprecated. Public and private stuff has been moved into different header files to avoid more errors in the future and make it easier to use libgdiplus as a library. * gdipenums.h: New file. Contains (only) public enums. * gdipstructs.h: New file. Contains (only) public types. * gdiplus-private.h: New file. Main private include file. * GdiPlusFlat.h: New file. This is *the* header file to include from C/C++ projects (i.e. the only one that match MS filenames). Makes it easier not to use internal/private (i.e. changing) libgdiplus stuff. * general.c: Move public types to public header. Use FcFini if available. Remove DEBUG_MEMLEAKS code (valgrind is much better). * general.h: Updated to contain only public stuff. * gifcodec.c|h: Header/types adjustments. * graphics.c: Header/types adjustments. [Draw|Measure]String functions have moved into text.c source file. * graphics.h: Move private stuff out and move public stuff in. * graphics-path.c: Header/types adjustments. * graphics-path.h: Move GpPathIterator functions into their own header file. Moved internal functions into private header file. * graphics-path-private.h: New file. Private header. * graphics-pathiterator.c: Header/types adjustments. * graphics-pathiterator.h: New file. Public header. * graphics-pathiterator-private.h: New file. Private header. * graphics-private.h: New file. Private header. * hatchbrush.c: Header/types adjustments. * hatchbrush.h: Move private definitions into a separate header file. * hatchbrush-private.h: New file. Private header. * icocodec.c|h: Header/types adjustments. * image.c: Header/types adjustments. Move codec GUID into codec source files. * image.h: New file to replace gdipImage.h but contains only public and semi-public stuff. * image-private.h: New file. Private header. * imageattributes.c: Header/types adjustments. * imageattributes.h: New file. Public header. * imageattributes-private.h: New file. Private header. * jpegcodec.c|h: Header/types adjustments. * lineargradientbrush.c: Header adjustments. * lineargradientbrush.h: Moved private stuff into it's own header file * lineargradientbrush-private.h: New file. Private header. * matrix.c: Header adjustments and inline matrix_equals. * matrix.h: Move private stuff out, move public stuff in. * matrix-private.h: New file. Private header. * metafile.c|h: Header/types adjustments. * pen.c: Header/types adjustments. * pen.h: New file. Public header. * pen-private.h: New file. Private header. * pathgradientbrush.c: Header adjustments. * pathgradientbrush.h: Move private stuff out. * pathgradientbrush-private.h: New file. Private header. * pngcodec.c|h: Header/types adjustments. * region.c: Header adjustments. * region.h: Move private stuff out. * region-bitmap.c|h: Header/types adjustments. * region-path-tree.c|h: Header/types adjustments. * region-private.h: New file. Private header. * solidbrush.c: Header/types adjustments. * solidbrush.h: Move private stuff out. * solidbrush-private.h: New file. Private header. * stringformat.c: Header/types adjustments. * stringformat.h: New file. Public header. * text.c: New file. [Draw|Mesure]String is moved here. This will help having an alternate implementation of them. * text.h: New file. Public header. * text-private.h: New file. Private header. * texturebrush.c: Header/types adjustments. * texturebrush.h: Header/types adjustments. * texturebrush-private.h: Move private stuff out. * tiffcodec.c|h: Header/types adjustments. * win32structs.h: New file that contains win32 definitions required by libgdiplus. * wmfcodec.c|h: Header/types adjustments. * Makefile.am: Add new files to the build. 2007-04-23 Sebastien Pouliot * bitmap.c: Use a macro to calculate aligned stride. * bmpcodec.c: Use a macro to calculate aligned stride. * gdip.h: Remove dependency on pixman.h as the alignment is always done on 4 bytes (32 bits) for all architectures. * general.h: Add macro to calculate aligned stride. * gifcodec.c: Use a macro to calculate aligned stride. * icocodec.c: Use a macro to calculate aligned stride. * pngcodec.c: Use a macro to calculate aligned stride. 2007-04-16 Sebastien Pouliot * bitmap.c: Complete (hopefully) endian fixes. 2007-04-16 Sebastien Pouliot * bitmap.c: Report correct error for GdipBitmap[Get|Set]Pixel on a 16bpp grayscale bitmap. 2007-04-13 Sebastien Pouliot * bitmap.c: Fix more endian issues in GdipLockBits and GdipUnlockBits and remove a few unrequired masks. 2007-04-13 Sebastien Pouliot * bitmap.c: Fix endian issues in GdipLockBits and GdipUnlockBits. * gdip.h: Add macros for setting BRG values in a buffer. 2007-04-12 Sebastien Pouliot * bitmap.c: Ensure we don't get out of bounds by one byte when using the 24bbp/3bytes mode. Fix a possible leak in GdipBitmapLockBits (e.g. if the pixel format convertion doesn't work). The 2.0 API allows a test case to be built to validate this. 2007-04-12 Sebastien Pouliot * bitmap.c: Complete the fix for #79246, the previous code was mishandling the fact that Cairo use 4 bytes for 24bpp while GDI+ is using only 3 bytes (so converting between format isn't only get and set operations). * gdip.h: Remove unused structures x11drv_escape_codes and GpLinePointF. Add define for GBD_TRUE24BPP used to tag a GpBitmapData that use 3 bytes for 24bpp (GDI+) versus 4 bytes (Cairo). 2007-04-11 Sebastien Pouliot * bitmap.c: Fix 24/32 mixup between GDI+ requirements and Cairo inner working. Fix bug #80681 and parts of bug #79246. 2007-04-09 Sebastien Pouliot * bmpcodec.c: Fix 32bpp RGB support not to use the (unused) alpha byte in the file since it can contains junk. 2007-04-05 Sebastien Pouliot * font.c: Remove internal (and unused) GdipGetHfont (not in GDI+). Fix GdipCreateFont signature (GpFontStyle isn't defined in GDI+). Fix (precise) GdipGetLogFont[A|W] signatures. * gdip.h: Remove unused GpCachedFont (doesn't exists in GDI+). Fix signature for GdipCreateFont. * tiffcodec.c: Change two functions to static to remove their symbols. 2007-04-05 Sebastien Pouliot * metafile.c: Stretch correctly to the metafile size. 2007-04-04 Sebastien Pouliot * bmpcodec.c: Remove extra symbols introduced in last change. 2007-04-04 Sebastien Pouliot * bmpcodec.c|h: Refactor reading to use ImageSource so metafiles can reuse the codec to load bitmaps. * emfcodec.c: Update reading to ImageSource. * icocodec.c: Update reading to ImageSource. * metafile.c|h: Implement StretchDIBits for #81178. Update reading to ImageSource. * wmfcodec.c: Update reading to ImageSource. 2007-04-04 Sebastien Pouliot * image.c: Hack around codec signature detection to add support for non-placeable WMF metafiles (which MS GDI+ supports even if no codec signature match them). Also add a second hack to report a different image format than the one used to decode the image (non-placeable WMF are reported as EMF). 2007-04-03 Sebastien Pouliot * The great static-fication and hidden-ization of private symbols inside libgdiplus. This brings us much closer to the real GDI+ API. 2007-04-03 Sebastien Pouliot * cairo-embed.h: Rename *all* cairo_* symbols into mono_cairo_*. Should fix bug #81279. 2007-04-02 Sebastien Pouliot * font.c: Avoid locking multiple time for the same font family (e.g. when asking for GetHeight). Make sure we're setting cellascent and celldescent even if the horizontal table isn't available. This also simplify the code and has better error handling. Added better error handling in GdipGetFontHeight and GdipGetFontHeightGivenDPI functions. 2007-04-02 Sebastien Pouliot * font.c: Change some functions to static and remove unused function. * graphics.c: Remove unused externs. 2007-03-30 Sebastien Pouliot * jpegcodec.c: Ensure we throw the "right" exception on the managed side when an invalid file is read. Fix #80980 2007-03-30 Sebastien Pouliot * brush.c: Change contract between GdipDeleteBrush and the destroy function of the specialized brushes. The NULL check and the GdipFree of the brush is now done centrally. * hatchbrush.c: Simplify with new contract. * lineargradientbrush.c: Simplify with new contract. * pathgradientbrush.c: Simplify with new contract. * solidbrush.c: Simplify with new contract. * texturebrush.c: Simplify with new contract. 2007-03-30 Sebastien Pouliot * pen.c: Update solid brush color (if used) when the pen color is changed. Fix #81266. Change GdipGetPenBrushFill to return a clone of the brush and not the original one. * tiffcodec.c: Fix TIFFSetField as it requires at least two parameters (count & type) when used for TIFFTAG_EXTRASAMPLES. Fix valgrind warning. 2007-03-29 Sebastien Pouliot * bmpcodec.h: Use __attribute__ ((packed)) instead of #pragma pack(2) to make this work on the ARM architecture. * metafile.h: Use __attribute__ ((packed)) instead of #pragma pack(2) in the hope this construct works on the ARM architecture. * tiffcodec.c: Fix TIFF crashes on SPARC (it's amazing what an integer can do to get promoted). 2007-03-23 Sebastien Pouliot * jpegcodec.c: Re-enable sigsetjmp to handle malformed JPEG files. Also don't try to load EXIF data if loading failed. Fix bug #80980. * metafile.c: More endian fixes (EMF headers) 2007-03-22 Sebastien Pouliot * emfcodec.h: Some endian fixes. * metafile.c: Some endian fixes. * wmfcodec.c: Some endian fixes. 2007-03-21 Sebastien Pouliot * emfcodec.c: Process ModifyWorldTransform and modify GdiComment to be reusable to detect between "classic" EMF and EMF+/dual. * Makefile.am: Add emfplus.g|h to the build/dist. * metafile.c|h: Fixed display bounds. Added detection of EMF+ (and dual) metafiles. Added ModifyWorldTransform function and a few other TODO. * wmfcodec.c: Process SaveDC, RestoreDC, SetStretchBltMode and StretchDIBits records. 2007-03-21 Sebastien Pouliot * emfplus.c|h: Starting point of the EMF+ (and dual) handling. 2007-03-21 Sebastien Pouliot * pen.c: Ensure we never clear the 'changed' flag when setting pen's properties. Issue #81102 found (and patch) by Choe Hwanjin. 2007-03-20 Chris Toshok * graphics.c (GdipDeleteGraphics): if this is an X drawable, ignore any errors we get destroying the surface. Works around a bug in the RENDER X server support, where the cairo pictures are freed when the drawable/window is destroyed (and so cairo's calls to XRenderFreePicture fail with errors). 2007-03-20 Sebastien Pouliot * emfcodec.h: Add some definitions. * gdip.h: Remove gdip_graphics_init prototype. * general.c: Remove unused stuff. * graphics.c: Make gdip_graphics_init static. * wmfcodec.h: Add some definitions. 2007-03-19 Sebastien Pouliot * bitmap.c: Exclude unused code and made some function static. * gdip.h: Remove un-shared function. * font.c: Fix free in free_cached_pattern to release the 'key' memory (no leak) and not the 'value' memory (double-free). Found/patch by Choe Hwanjin. 2007-03-15 Sebastien Pouliot * gdip.h: Add some missing prototypes to avoid compiler warnings. 2007-03-14 Sebastien Pouliot * image.c: Return InvalidParameter when loading an unknown file format from a stream. System.Drawing will throw the "correct" exception from this error code. * metafile.c: Fix DPI (purfect ;-) and improve bounds calculations. 2007-03-13 Sebastien Pouliot * image.c: Fix codec signature compare when more than one signature- mask exists (e.g. GIF87 files). Fix codec signature length to match the (very large) EMF requirement (44 bytes). * gdipImage.h: Add define for MAX_CODEC_SIG_LENGTH 2007-03-13 Sebastien Pouliot * bitmap.c: Added comment about the special allocation of ColorPalette where Count == 0 (CID273). * image.c: Added comment about the special allocation of ColorPalette where Count == 0 (CID272). * metafile.c: Delete possibly allocated pen if invalid (CID279). Free metafile context if the metafile type is invalid (CID280). * region.c: In gdip_is_rect_infinite make sure rect can never be dereferenced (CID276). 2007-03-08 Sebastien Pouliot * emfcodec.c|h: Initial (i.e. subset of) EMF parser/player. * metafile.c|h: Shared metafile code, like setup, play & cleanup functions and a lot of "record" functions (which looks like the old GDI32 API). * wmfcodec.c|h: Initial (i.e. subset of) WMF parser/player. 2007-03-08 Sebastien Pouliot * gdip.h: Add some missing prototypes to avoid compiler warnings. * image.c: Change drawing metafiles not to require a surface (it will be played on the existing one). 2007-02-27 Sebastien Pouliot * gdip.h: Add some missing prototypes to avoid compiler warnings. * texturebrush.cs: Reworked GdipCreateTexture to use the data from the cloned image (and not the original). Simplified GdipCreateTexture2I to reuse bitmap functions and call GdipCreateTexture. Fix bug #80971. 2007-02-26 Sebastien Pouliot * region.c: Change GdipGetRegionHRgn to return a pointer to a *clone* of the region as this better match MS implementation (multiple calls return different HRGN). It also means that each of them must be freed individually (or this will leak memory). 2007-02-22 Sebastien Pouliot * image.c: Fix DrawImage* functions when using indexed bitmaps. 2007-02-21 Sebastien Pouliot * emfcodec.c|h: Minor update to compile image.c changes. * image.c: Updated all functions to allow them to work on metafiles (i.e. don't touch the bitmap data). * Makefile.am: Add new files to the build. * metafile.c|h: New. Skeleton to make image.c changes compile. * print.c: Moved non-GDI+ (but public) print functions here (from image.c). * wmfcodec.c|h: Minor update to compile image.c changes. 2007-02-16 Sebastien Pouliot * bitmap.c: Refactor to match upcoming metafile definitions. * gdip.h: Update gdip_bitmap_dispose definition to return GpStatus. * gdipImage.h: Remove get_image_format definition, it's now static. * image.c: Rewrite get_image_format to use the codec info (and remove "uneasy" FIXME). Remove unused gdip_image_clone function. Refactor Dispose and Clone functions for upcoming metafile support. Fix GUID to ImageFormat for icons. * tiffcodec.c: Add missing signatures and mask to TIFF ImageCodecInfo. 2007-02-15 Sebastien Pouliot * graphics.c, graphics-path.c, region-bitmap.c, tiffcodec.c: Patch from Dmitriy Lukinov to fix compilation when using gcc 2.95 (and other old C compilers). #80844 2007-02-14 Sebastien Pouliot * bitmap.c: Fix default palettes values (8bpp), flags and encoding (RGB versus BGRA). * gdip.h: Add color palette flags required to fix palettes. 2007-02-13 Sebastien Pouliot * bmpcodec.c: MS generates what looks like invalid (or undocumented) 16bpp bitmaps for storing ImageList bitmaps. The header is bad (missing BI_BITFIELDS), there is no ARGB masks and the last line of the bitmap is incomplete. Fix bug #80797. 2007-02-08 Sebastien Pouliot * matrix.h: Add macros gdip_matrix_get_[x|y]_scale * region.c: Fix matrix operations on infinite region (the result is always an infinite region). Optimize the transform when the matrix is only a scale (or a scale+translate) to avoid converting a rectangular based region into a bitmap based region (fix #80758). 2007-02-07 Sebastien Pouliot * bmpcodec.c: Fix #80751 for that aren't reversed (bug introduced when refactoring for icon support). 2007-02-05 Sebastien Pouliot * cairo-embed.h: Redefine used cairo symbols to avoid coexistance problems with Gtk+ 2.8 (and later). Fix bug # * gdip.h: Rework includes, remove unused cairo_matrix typedef. * general.c: Remove cairo.h from includes. * Makefile.am: Add cairo-embed.h to the build. 2007-02-01 Sebastien Pouliot * general.c|h: Add iround (from graphics-path.c); * graphics.c: Apply world transformations to bounds and fix function GdipGetVisibleClipBounds to use the clipping region. Fix bug #78958; * graphics-path.c: Remove iround (moved to general.c); * region-bitmap.c: Fix typo; 2007-02-01 Sebastien Pouliot * pngcodec.c: Fix codec to return UnknownImageFormat and display a warning when loading an image with more than 32bpp. #80693. 2007-01-31 Sebastien Pouliot * graphics.c: Fix bug #80680 to make MeasureString handle trailing spaces like MS GDI+ 2007-01-19 Sebastien Pouliot * bitmap.c: Fix GdipLoadImageFromFile to return OutOfMemory (like MS GDI+) when the file isn't found. * image.c: Change GdipCreateBitmapFromFile[ICM] to still return (see previous fix) InvalidParameter if the file isn't found (again to match MS GDI+). Not sure why FileNotFound was defined as an error code :-| 2007-01-19 Sebastien Pouliot * graphics.c: Remove extern declaration for gdip_get_cairo_filter * image.c: Fix #77181 by using the pattern (not the surface) to get the interpolation modes to work. Of course the modes are limited by what's available in cairo/pixman (i.e. two modes). * general.h: Add prototype for gdip_get_cairo_filter. 2007-01-18 Sebastien Pouliot * bitmap.c: Handle the case where we're asked to create 15/16 bpp bitmaps. In this case the returned bitmap is a 32bpp RGB (no alpha) which, somewhat, match MS GDI+ when it loads such images. * bmpcodec.c: Switch 15/16 bpp to 32bpp RGB (instead of 24) for the same reasons. 2007-01-18 Sebastien Pouliot * icocodec.c: Add support for 24bpp icons with the alpha 1-bit. * image.c: GdipGetImageGraphicsContext only works for 24bpp and more. 2007-01-17 Sebastien Pouliot * bmpcodec.c: Add support for loading 16bpp bitmaps (555 or 565). Cairo deprecated CAIRO_FORMAT_RGB16_565 so we promote the bitmaps into 24bpp RGB bitmaps. * bmpcodec.h: Add new structures for V4 bitmap headers. 2007-01-17 Sebastien Pouliot * bmpcodec.c: Avoid potential double-free if the image is invalid. 2007-01-15 Sebastien Pouliot * bitmap.c: Clone the bitmap on GdipCreateBitmapFromHBITMAP too. This ensure multiple GpBitmap objects can be created from a single HBITMAP. * icocodec.c: Add support for 32bpp icons (aka XP icons). 2007-01-12 Sebastien Pouliot * icocodec.c: Fix another endian issue and free the bitmap (not just the palette) in case of an error. 2007-01-12 Sebastien Pouliot * bitmap.c: Fix HBITMAP support in GdipCreateBitmapFromHBITMAP and GdipCreateHBITMAPFromBitmap functions so an HBITMAP can survive the deletion of the GpBitmap structure. Implement GdipCreateBitmapFromHICON and GdipCreateHICONFromBitmap functions. See comments about freeing the memory associated with HBITMAP and HICON. * gdip.h: Add new undocumented ImageFlag to match MS results. * icocodec.c: Fix endianess when reading the ICONDIRENTRY. 2007-01-11 Sebastien Pouliot * bitmap.c: Fix GdipCreateBitmapFromScan0 to initialize the flags to 2 (HasAlpha) if the format supports alpha; * image.c: Copy all palette (including flags and count) in function GdipSetImagePalette. Re-adjust the size if the palette size is different. Fix palette handling not to return errors for an unexisting palette (but return a default empty one). 2007-01-10 Sebastien Pouliot * bmpcodec.c|h: Refactor some decoding code to share with the ICON decoder. * icocodec.c|h: Implement icon decoder, reusing some parts of the BMP codec. * image.c: Add ICON format support to GdipLoadImageFromDelegate_linux. 2007-01-08 Sebastien Pouliot * bmpcodec.c: Add missing SigPattern and SigMask to codec; * emfcodec.c|h: New. Plumbing to add the new EMF codec; * gdip.h: Add SHORT type. Add new GUID for ICO, WMF and EMF codecs; * gdipImage.h: Add include files for new codecs; * general.c: Update call to codecs initialization; * gifcodec.c: Add missing SigPattern and SigMask to codec; * icocodec.c|h: New. Plumbing to add the new ICO codec; * image.c: CHange codecs structure to allow a different number of encoders and decoders. * jpegcodec.c: Add missing SigPattern and SigMask to codec; * pngcodec.c: Add missing SigPattern and SigMask to codec; * wmfcodec.c|h: New. Plumbing to add the new WMF codec; * Makefile.am: Add new files for codecs; 2007-01-03 Sebastien Pouliot * alpha-premul-table.inc: New. Table that contains all values of 256x256 divised by 255. This allows to avoid a division and three multiplications for each pixel that requires alpha to be pre-multiplied into the RGB values. * general.c|h: Include/make available the premultiplied table. * imageattributes.c: Use the table when applying a ColorMatrix; * pngcodec.c: Use the table when loading PNG images with alpha. Also ensure we're setting the alpha flag correctly for non-palette bitmaps. Fix bug #79297 and #80366. 2007-01-02 Chris Toshok * general.c (gdip_get_display_dpi): we don't want to get what the rest of X assumes is the dpi. we want the actual dpi of the screen, so that we can correctly map to the actual size of fonts when the user asks for a particular size. This removes the need for the hack of setting the SWF DefaultFont to be 8pt instead of 8.25pt to get things to line up. 2006-12-21 Sebastien Pouliot * imageattributes.c: Fix bug #80323 for ColorMatrix containing alpha values (Cairo uses pre-multiplied alpha which we weren't providing). Improved performance by about 30% (in the supplied sample). 2006-12-16 Miguel de Icaza * jpegcodec.c: Do not load exif information if there was an error loading the file. 2006-11-10 Sebastien Pouliot * general.c: Fix utf8_to_ucs2 to process all the first 65536 chars (not just the first 4096). Patch by choe.hwanjin@gmail.com * graphics.c: When measuring a string and if data is provided, initialize data->has_hotkeys to FALSE. 2006-10-20 Sebastien Pouliot * general.c: Don't delete the font cache hash table unless it was created (which removes the glib runtime errors). This can occurs when doing a C application using libgdiplus. 2006-10-18 Sebastien Pouliot * graphics.c: In MeasureString check for bounding box height when calculating the number of characters to be drawn. 2006-10-17 Sebastien Pouliot * graphics.c: Another fix to StringAlignmentCenter when a single character is drawn (#79685). This adjust the band-aid done for #79573 awaiting a bigger rewrite (to move alignement from drawing to measure) 2006-10-16 Sebastien Pouliot * graphics.h: Define G_MAXINT32 ourselves (if undefined). 2006-10-12 Sebastien Pouliot * gdip.h: Remove stuff related to string measurements. * graphics.h: New. Add stuff specific to string measurements. * graphics.c: Refactor the string measurement code. There are now one (not two) methods to measure a string and one (splitted from measure) to draw the string. Doesn't fix any bug in itself but it already makes it much clearer what some problems are (e.g. alignment). * Makefile.am: Add new graphics.h file to the build. 2006-10-12 Sebastien Pouliot * graphics.c: Remove parts of r60164 added for LinkLabel. It can't work because we're loosing the start lines in the ranges. Actually we are still duplicating some measurement code and we'll need to merge both routine if we want accuracy. 2006-10-11 Sebastien Pouliot * general.h: Add SAFE_FLOAT_TO_INT32 macro. * graphics.c: Fix the cases where we convert an int to float (inside System.Drawing) then reconvert this value to an integer inside libgdiplus. Values like Int32.MaxValue would return as negative due to overflow. Fix bug #79643. 2006-10-06 Sebastien Pouliot * font.c: Always zeroize LOGFONT facename even when we error out. This removes a lot of warnings from valgrind when running unit tests. * graphics.c: '.' can also be used as a wrap point. Fix bug #79594. 2006-10-05 Sebastien Pouliot * graphics.c: Fix StringAlignmentCenter in GdipDrawString. Half fix (#79573) and half band-aid against possible random memory access. 2006-10-02 Sebastien Pouliot * graphics-path.c: Use correct function to free memory (spotted by Gonzalo). * image.c: Fix compiler warning (signess); * texturebrush.c: Fix compiler warning (undefined symbol); 2006-09-29 Sebastien Pouliot * graphics-path.c: Fixed GdipReverse loop, don't reverse path types and free the original point list being replaced. 2006-09-28 Jackson Harper * jpegcodec.c: Fix signature for the #if no libjpeg block. 2006-09-28 Sebastien Pouliot * graphics.c: Re-fix the wrapping case (r58401) if bug #77699 (causing an endless loop in DrawString) to avoid memory corruption. 2006-09-22 Sebastien Pouliot * graphics.c: (GdipMeasureCharacterRanges) Ensure we're always freeing strDetails when we return. Don't return Ok unless the status is Ok. Optimize conversions (done only if required). Handle HotKeyPrefix 2006-09-21 Sebastien Pouliot * stringformat.c: Don't clone by pointer assignement (sigh). Reuse GdipCreateStringFormat to implement GdipStringFormatGetGenericDefault and GdipStringFormatGetGenericTypographic. Fix negative count in GdipSetStringFormatTabStops to reset values properly. 2006-09-21 Sebastien Pouliot * stringformat.c: In GdipSetStringFormatMeasurableCharacterRanges we now check for negative rangeCount (InvalidParameter) and rangeCount over 32 (ValueOverflow). * texturebrush.c: Only apply the inverted texture matrix if one is set (i.e. don't multiply by the graphic matrix). This should fix parts of #79300 (looks right like the old patch) and the texture sample still works correctly. 2006-09-20 Sebastien Pouliot * texturebrush.c: Revert last patch as it breaks the texture sample and didn't fix the original issue #79300. 2006-09-19 Sebastien Pouliot * graphics.c: Fix parameters checking order and remove duplicates checks in GdipMeasureCharacterRanges. * stringformat.c: Set defaults to match MS GDI+. 2006-09-18 Sebastien Pouliot * graphics.c: Avoid unit conversions, when possible, when measuring or drawing strings. Fix both charactersFitted (not total string length, see bug #76664) and linesFitted (floor) in MeasureOrDrawString 2006-09-16 Sebastien Pouliot * pngcodec.c: Fix 24bbp saving for big endian architectures. 2006-09-15 Sebastien Pouliot * bmpcodec.c: Remove non working code for big endian architectures. * graphics.c: Fix bug #79173 (multi-line labels/DrawText) by reverting part of r62329 for bug #78777 (MeasureCharacterRanges bug). 2006-09-15 Sebastien Pouliot * pngcodec.c: Format32bppRgb is a 4bpp format. * tiffcodec.c: Format32bppRgb is a 4bpp format. 2006-09-14 Sebastien Pouliot * bitmap.c: Fix error reporting in GdipBitmapUnlockBits. 2006-09-13 Sebastien Pouliot * general.h: Add/Move macros gdip_near_zero and gdip_near_one (from matrix.h) to avoid comparison between floating points value. * graphics.c: (make_arcs) Make sure the additional angle isn't near zero as this will results in NaN values and break rendering (#78999) * graphics-path.c: (append_arcs) Make sure the additional angle isn't near zero as this will results in NaN values and break rendering * matrix.h: Remove macros and include general.h 2006-09-12 Sebastien Pouliot * general.c: Don't apply the anti-aliasing offsets if we asked Cairo to scale it's rendering (not the best solution but better than the current one where 0 scaled 100 times equals 50). 2006-09-08 Jonathan Gilbert * bmpcodec.c: Fix the pixel format used when loading 32-bit BMP files -- they were being loaded as Format32bppArgb, but MS's GDIPLUS.DLL returns Format32bppRgb Bitmap objects. The alpha data is still loaded, and work-arounds involving copying the raw data over to another Bitmap object with the Format32bppArgb pixel format should work here too. 2006-09-07 Chris Toshok * texturebrush.c (gdip_texture_setup): remove the matrix manipulation here. fixes 79300. 2006-08-31 Sebastien Pouliot * jpegcodec.c: Avoid memory overwrite in the processing loop - this messed up the first two lines (processed backward) of most JPEG files. * texturebrush.c: Test application shows the rotation to be identical between Cairo and GDI+. 2006-08-30 Sebastien Pouliot * texturebrush.c: Fix image copying when only a part of the original image is required for the brush (no cloning here). 2006-08-29 Sebastien Pouliot * bitmap.c: Reintroduce WORDS_BIGENDIAN for performance reasons. * general.c: Remove duplicate macros. * graphics.c: Fix stupid typo in make_curve :( 2006-08-28 Sebastien Pouliot * bitmap.c: Remove WORDS_BIGENDIAN block and use endian-correct macro. * texturebrush.c: Fix three cases (CID #249-251) where we didn't free memory correctly when a error (like an out of memory) occured. 2006-08-27 Sebastien Pouliot * bitmap.c: Fix endianess issues in locked bitmap. 2006-08-25 Sebastien Pouliot * gdip.h: Macro get_pixel_bgra is endian safe. 2006-08-25 Sebastien Pouliot * gdi.h: Add missing GDIPCONST to both GpColorMatrix parameters for function GdipSetImageAttributesColorMatrix; * imageattributes.c: Fix parameter validation on function GdipSetImageAttributesColorMatrix, as colorMatrix can only be NULL if enableFlag is FALSE. Added TODO for unimplemented features. 2006-08-24 Sebastien Pouliot * region-path-tree.c: Fix some endian bug when deserializing a tree. * texturebrush.c: Adjust source for matrix and rectangle changes. Ensure we're always cloning (correctly) the image (i.e. no pointer assignment). Review parameter checks. Fix GdipGetTextureImage to return a clone of the image. Fix some leaks detected with valgrind. * texturebrush.h: Changed GpTexture not to require extra memory allocations for the matrix and the rectangle (it simplifies the code and help avoid leaks). 2006-08-24 Gonzalo Paniagua Javier * dstream.c: (read_from_buffer) return the number of bytes actually copied from the stream buffer. 2006-08-23 Sebastien Pouliot * general.c: Don't manipulate individual bytes when converting ucs4 to ucs2. * graphics.c: In GdipFillRegion ensure the GpGraphics and GpImage are correctly freed even if their allocation function didn't return Ok. * region.c: Fix endian bug when reading region data type; 2006-08-22 Sebastien Pouliot * bitmap.c: Added annotations for allocation functions. * brush.c: Added annotations for allocation functions. * imageattributes.c: Added annotations for allocation functions. Added some out of memory checks. * image.c: Added annotations for allocation functions. Fixed some parameters checks. * pathgradientbrush.c: Added annotations for allocation functions. * stringformat.c: Added annotations for allocation functions. * texturebrush.c: Added annotations for allocation functions. 2006-08-22 Sebastien Pouliot * graphics-path.c: Ensure (3) that we delete a GraphicsPath even if it's cloning failed (e.g. memory could have been allocated). * pathgradientbrush.c: Ensure that we delete a GraphicsPath even if it's creation failed (e.g. memory could have been allocated). * region.c: Ensure that we delete a GraphicsPath even if it's creation failed (e.g. memory could have been allocated). 2006-08-21 Sebastien Pouliot * graphics-path.h: Export gdip_path_has_curve to avoid code duplication. * graphics-path.c: Remove all g_return_val_if_fail. Added annotations for allocation function. * graphics-pathiterator.c: Simplify GdipPathIterHasCurve by reusing code from graphics.c. 2006-08-19 Sebastien Pouliot * graphics-pathiterator.c: Fix all function to deal with a NULL path supplied when creating an iterator. Remove all g_return_val_if_fail. Added annotations for allocation function. 2006-08-18 Sebastien Pouliot * matrix.c: Fix a division by zero case when a rectangle is supplied. 2006-08-17 Sebastien Pouliot * matrix.c: Remove use of g_return_val_if_fail. Added annotations for allocation functions. 2006-08-16 Sebastien Pouliot * graphics-path.c: In GdipAddPathString ensure we are freeing the font even if the creation call status code isn't Ok. * jpegcodec.c: Remove use of g_return_val_if_fail. Add annotations about dead code which isn't totally dead (setjmp/goto). * pngcodec.c: Add annotation about dead code which isn't totally dead (setjmp/goto). * tiffcodec.c: Add annotation about dead code. 2006-08-16 Peter Dennis Bartok * tiffcodec.c: Fixed c+p error. Thanks to coverity for catching that 2006-08-16 Sebastien Pouliot * graphics.c: Try an annotation inside a function. * image.c: Remove use of g_return_val_if_fail. 2006-08-15 Sebastien Pouliot * adjustablearrowcap.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. * font.c: In create_fontfamily_from_name changed default status code to FamilyNotFound (instead of OutOfMemory). Added more checks for OutOfMemory conditions (e.g. after calls to ucs2_to_utf8). Added annotation for allocation functions. * hatchbrush.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. * lineargradientbrush.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. 2006-08-14 Sebastien Pouliot * customlinecap.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. Fix cloning. * gdip.h|image.c: Fix some public API signatures (int -> UINT); * graphics.c: Replace two forgotten g_return_val_if_fail. * pen.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. Fixed allocations to make sure an allocated pen is returned only if status == Ok. * solidbrush.c: Remove use of g_return_val_if_fail. Added annotation for allocation functions. 2006-08-13 Sebastien Pouliot * graphics.c: In GdipSetClipRect, ensure the temporary region gets deleted even if it's creation has failed. Added annotation for allocation functions. * region.c: Fix annotation for GdipCreateRegion. 2006-08-13 Gonzalo Paniagua Javier * dstream.[ch]: read from a stream using delegates, buffers the input and keeps EXIF data buffer around. * bmpcodec.[ch]: use dstream_t to take advantage of the buffering capabilities, as this codec does a lot of small reads. * image.c: use dstream_t for BMP and JPEG stream reading. * jpegcodec.[ch]: use dstream. Load EXIF data if available. * gdipImage.h: fill the gaps for PropertyTagType. * Makefile.am: added new files. 2006-08-12 Duncan Mak * graphics.c (GdipDrawPolygon, GdipDrawClosedCurve2): Add checks for cases when count is less than two, that's an InvalidParameter. * graphics.c: In all cases where convert_points is used, check that count must be greater than zero. 2006-08-11 Duncan Mak * graphics.c (GdipSetTextContrast): The accepted range for 'contrast' was between 0 and 14 before. The docs on MSDN says it should be between 0 and 12 instead. 2006-08-10 Duncan Mak * graphics.c: Rewrote all NULL checks without using g_return_val_if_fail. 2006-08-11 Sebastien Pouliot * font.c: Yet another fix to gdip_logfont_from_font to match MS behaviour more closely (and hopefully fix unit tests under Windows) * region.c: Coverity function annotation worked (it removed a false positive) and found more possible problems (like the unlikely case where we return an error but did allocate memory). Added more annotations. 2006-08-10 Sebastien Pouliot * region.c: Test to see if this help remove a false positive. * graphics.c: Don't loose track of user supplied tension in function GdipDrawClosedCurve2I. * graphics-path.c: Fix stupid typo made after removing that unrequired line. 2006-08-10 Sebastien Pouliot * graphics-path.c: Avoid temporary memory allocation to convert int into floats in GdipAddPathLine2I, GdipAddPathBeziersI and GdipAddPathBeziersI functions. Remove (now) unnecessary int_to_floats function. Replace calloc calls with GdipCalloc. Remove useless line in GdipAddPathCurve2. * pathgradientbrush.c: Fix GdipCreatePathGradientFromPath to return the same value as GDI+. 2006-08-10 Sebastien Pouliot * graphics.c: s/CONVERTION/CONVERSION/ (alp) * general.c: s/CONVERTION/CONVERSION/ (alp) * image.c: s/CONVERTION/CONVERSION/ (alp) * general.h: s/CONVERTION/CONVERSION/ (alp) * region.c: s/CONVERTION/CONVERSION/ (alp) * region-bitmap.c: s/CONVERTION/CONVERSION/ (alp) * matrix.c: Changed some null checks not to print warnings during unit tests. * graphics-path.c: Fix GdipWidenPath to return the same value as GDI+. Changed some null checks not to print warnings during unit tests. 2006-08-10 Sebastien Pouliot * font.c: Deal with gdip_unit_conversion being a function. * general.c: Add OPTIMIZE_CONVERTION to help avoid a floating point division and multiplication when converting units (in the case where source == target). Added gdip_cairo_rectangle, gdip_cairo_move_to, gdip_cairo_line_to and gdip_cairo_curve_to to deal with the 15bits width/height limits (more to come). Added checks for memory allocation failures. * general.h: New. Stop polluting gdip.h with internal macros and prototypes. * graphics.c: Use OPTIMIZE_CONVERTION before doing unit convertions. Removed gdip_unit[x|y]_convgr and gdip_convgr_unit[x|y] functions. They are now macros inside general.h. Changed gdip_unit_conversion to be a function (cleaner and easier for macros). Updated all calls to cairo_move_to, cairo_line_to, cairo_curve_to and cairo_rectangle to use the new gdip_* functions (that deals with coordinate limits, unit convertion and antialiasing). * image.c: Use OPTIMIZE_CONVERTION (or similar) before doing unit convertions. Fix typo in GdipDrawImageRectRect where srcwidth wasn't set and destoryed the dstwidth value. * Makefile.am: Add general.h to the build. 2006-08-09 Sebastien Pouliot * graphics.c: Added more memory allocation failure checks. Be more careful when disposing resources inside GdipDeleteGraphics. * graphics-path.c: Changed null check not to print warnings during unit tests. Added more memory allocation failure checks. * general.c: Added more memory allocation failure checks. * font.c: Remove deadcode (CID 234) introduced by the last fix. 2006-08-08 Sebastien Pouliot * region.c: Fix exclude on rectangular region to work with negative positions (X, Y). 2006-08-07 Gonzalo Paniagua Javier * image.c: don't leak file_name if we fail to open it. 2006-08-07 Sebastien Pouliot * general.c: Avoid double initialization (e.g. multiple appdomains) which would, for example, double the number of image codecs. 2006-08-05 Sebastien Pouliot * graphics.c: Changed null check not to print warnings during unit tests. * font.c: logFont->lfCharSet is always 0 from GDI+ (but it's returned as 1 inside System.Drawing). Fix Mono/Windows test failure. 2006-08-04 Gonzalo Paniagua Javier * bitmap.c: allocate 32-bits space for 24bpp when locking as ReadOnly or ReadWrite too. 2006-08-04 Gonzalo Paniagua Javier * bitmap.c: the destination format for a 24bpp RGB image has 32 bits internally. 2006-08-04 Sebastien Pouliot * graphics-path.c: match GDI+ return value (requires fix to SD); * pathgradientbrush.c: match GDI+ return value (requires fix to SD); * pen.c: match GDI+ return value (requires fix to SD). Changed some null checks not to print warnings during unit tests. 2006-08-03 Sebastien Pouliot * font.c: match GDI+ return value (requires fix to SD); * region.c: match GDI+ return value (requires fix to SD); 2006-08-03 Chris Toshok * graphics.c (make_arc): this was a pain in the butt to find. fix the weird drawing bugs we've been seeing in the ellipse code by using fabs() instead of abs(), as the latter truncates to an int. (make_arcs): more abs -> fabs. (make_pie): same. * graphics-path.c: make analogous s/abs/fabs changes here. 2006-08-03 Duncan Mak * graphics.c (make_pie): * graphics-path.c (GdipAddPathPie): Don't draw pie edges when we will be drawing an ellipse (i.e. when sweepAngle >= 360). 2006-08-01 Sebastien Pouliot * tiffcodec.c: Fix typo to cause crashes when a tiff file has properties (#78886). Fix a leak by calling TIFFRGBAImageEnd. 2006-07-31 Peter Dennis Bartok * gifcodec.c (gdip_save_gif_image): Remove unneeded line causing buffer overflow. 2006-07-24 Alexander Olk * graphics.c: Don't SIGSEGV when making polygons. The last point in the array is count-1 not count. 2006-07-21 Chris Toshok * image.c: include cairo-features.h so CAIRO_HAS_PS_SURFACE will be defined if we have it. 2006-07-07 Sebastien Pouliot * gifcodec.c: Return a GenericError in gdip_save_gif_image if the pixel_format isn't a know value. This makes sure cmap_size is always initialized (before being used). * region-bitmap.c: Don't show up a warning if we're cloning a region containing an empty graphicpath (as it is normal that no bitmap would be required); * tiffcodec.c: Make sure we don't dereference a NULL pointer inside gdip_load_tiff_image (and properly return OutOfMemory). 2006-07-06 Chris Toshok * graphics.c (CalculateStringWidths): don't do the cairo call if we're dealing with a \n, as cairo says its extent is 7 pixels wide. (MeasureOrDrawString): add LineHeight to CursorY on a NEWLINE, not LineHeight * LineFeeds. (MeasureString): same. (GdipMeasureCharacterRanges): don't add strDetail[j].X/Y twice when creating the charRect. 2006-07-06 Sebastien Pouliot * brush.c: Remove empty and unused gdip_brush_destroy; * image.c: Add missing calls to cairo_pattern_destroy when a previous call to cairo_pattern_reference is made on a pattern; * solidbrush.c: Add missing NULL checks for GdipCreateSolidFill and GdipGetSolidFillColor functions and remove duplicate checks for gdip_solidfill_destroy and gdip_solidfill_clone functions. 2006-07-06 Sebastien Pouliot * image.c: Add missing NULL check to GdipDisposeImage. 2006-07-04 Sebastien Pouliot * pen.c: Fix #78742 where an error occurs when we use a pen's width of 0 (not a real value) with a dash style. 2006-06-29 Sebastien Pouliot * region.c: Report OutOfMemory condition in GdipCloneRegion. Ensure all memory is freed from the tree used in GdipCombineRegion* functions and avoid some memory alloc/free when possible. 2006-06-28 Sebastien Pouliot * font.c: Make sure GdipGetLogFont[A|W] always initialize the LOGFONT structure correctly - even if it must return an error. Fix #78721. 2006-06-27 Gonzalo Paniagua Javier * bitmap.c: avoid invalid read when we have a 24bpp format. 2006-06-26 Sebastien Pouliot * font.c: Don't read past allocated memory. * hatchbrush.c: Don't both add a reference when cloning and set base.changed to TRUE (kept the latter); * pen.c: (Again) Don't free, but delete, the brush to ensure it's own data gets freed (e.g. the pattern for hatch brushes). 2006-06-22 Sebastien Pouliot * pathgradientbrush.c: Avoid memory allocations (that were never freed anyway) when creating path gradients. Fix valgrind detected leaks when running unit tests. * pen.c: Don't free, but delete, the brush to ensure it's own data gets freed (e.g. the pattern for hatch brushes). 2006-06-15 Wade Berrier * general.c: Remove dlfnc.h since it's currently not used (this was also a deprecated api on mac 10.4) * Makefile.am: Remove -Werror (Originally for the above issue in general.c, but twas decided to remove it anyway) 2006-06-12 Gonzalo Paniagua Javier * bitmap.c: align the stride to pixman_bits_t in LockBits. 2006-06-08 Sebastien Pouliot * graphics-path.c: Implemented GdipIsVisiblePathPoint[I] functions (except for some cases where a GpGraphics is supplied and used). * hatchbrush.c|h: Fix parts of #78159 where the hatches visual output doesn't match MS. This works better with newer X version (e.g. SuSE10) than older ones (e.g. NLD9). 2006-06-07 Sebastien Pouliot * graphics-path.c|h: Implemented GdipIsOutlineVisiblePathPoint[I] functions (except for some cases where a GpGraphics is supplied). 2006-06-06 Sebastien Pouliot * graphics-path.c|h: Fix declarations (missing GpPen parameter) for GdipIsOutlineVisiblePathPoint[I] functions. 2006-06-05 Sebastien Pouliot * region.c: Fix region-region intersection with infinity (can't have an infinite bitmap but this is identical to unioning with empty ;-) and add some shortcuts for other special cases. 2006-06-02 Sebastien Pouliot * graphics-path.c: Changed GdipWidenPath and GdipWrapPath to show a warning and return Ok instead of NotImplemented (to avoid crash in PDN). * region.c: Fixed clone when the region is empty. Added error checking in GdipCombineRegionRect if path creation fails. 2006-06-01 Sebastien Pouliot * general.c: FcFini was introduced in fontconfig 2.2.91 and we support earlier versions. 2006-05-31 Sebastien Pouliot * font.c: Added a cache for FcPattern to avoid calling (the very slow) FcFontMatch over and over again when no FontCollection is supplied. * general.c: Added code to clear and free the cache at shutdown. * gdip.h: Added prototype for gdip_font_clear_pattern_cache. 2006-05-31 Sebastien Pouliot * font.c: Added mutexes for handling the generic (reference counted) fonts (serif, sans-serif, monospace) and when dealing the fontconfig's FcConfig (which isn't thread-safe and fails under heavy usage in ASP.NET). * general.c: Added calls to fontconfig's FcInit and FcFini in GdiplusStartup and GdiplusShutdown functions. 2006-05-30 Sebastien Pouliot * font.c: Added more error checking when calling fontconfig API. 2006-05-29 Sebastien Pouliot * hatchbrush.c: Ensure we're freeing everything if no more memory can be allocated. 2006-05-26 Sebastien Pouliot * font.c: (GdipCreateFontFamilyFromName) Don't free string before calling FcPatternDestroy. This fix an occasional SIGSEGV (only seen under XSP2). 2006-05-25 Sebastien Pouliot * graphics.c: Implemented GdipSetClipHrgn before finding out (at test time that it's not exposed thru System.Drawing.dll). * region.c: Implement GdipGetRegionHRgn and GdipCreateRegionHrgn. This fix a possible double dispose in S.D. 2006-05-24 Gonzalo Paniagua Javier * image.c: * bitmap.c: * gdip.h: added MEMBMP, its GUID and the mapping from that in-memory format to file type when saving. This changes the default bitmap RawFormat to MemoryBmp and its default file format to PNG. 2006-05-24 Sebastien Pouliot * graphics.c: Remove some warning display from S.D. unit tests. * lineargradientbrush.c: Remove some warning display from S.D. unit tests. 2006-05-24 Sebastien Pouliot * hatchbrush.c|h: Large patch to reduce code duplication and add missing (and fix bad) error checking. *No* visual changes (or fixes) in the hatch output (yet) and valgrinded. 2006-05-24 Sebastien Pouliot * bitmap.c: Zeroize allocated bitmap memory. Fix #78478 * brush.c: Make sure we check for NULL before using any pointer. * pen.c: Clone the supplied brush in the GdipCreatePen2 function (as the user may dispose of it anytime). 2006-05-23 Gonzalo Paniagua Javier * gifcodec.c: support 'combine' animated gifs and top/left positioning of frames. Last part of the fixes for bug #77247. 2006-05-23 Jordi Mas i Hernandez * font.c: removes libgdiplus dependency against Cairo _cairo_toy_font_face_create API function. Change to make Cairo 1.2 linkable with libgdiplus. 2006-05-22 Gonzalo Paniagua Javier * gifcodec.c: null terminate the byte array passed to gdip_bitmapdata_property_add_ASCII to avoid an invalid memory read. 2006-05-21 Sebastien Pouliot * hatchbrush.c: Check all pointers for NULL. 2006-05-19 Gonzalo Paniagua Javier * bmpcodec.c: fix bfSize for 24bpp. 2006-05-19 Gonzalo Paniagua Javier * bmpcodec.c: now we're able to roundtrip a 24bpp bmp file. Don't create the cairo surface when loading the image. Remove unused (obsolete?) gdip_bitmap_save_bmp(). 2006-05-19 Gonzalo Paniagua Javier * bitmap.c: don't leak the allocated 'scan0' when converting indexed to RGB. 2006-05-18 Gonzalo Paniagua Javier * bmpcodec.c: don't change the PixelFormat to 32bpp when it's a 24bpp. * image.c: 24bpp bitmaps are 4-bytes (cairo dixit). Fixes the 24bpp test again. 2006-05-17 Gonzalo Paniagua Javier * bitmap.c: speed up the 8bppIndexed -> 32bpp conversion. 2006-05-17 Sebastien Pouliot * gdip.h: Added GpDashCap dash_cap to GpPen. It's not used (visually) but this way we can keep track of it (unit tests). * pen.c: Multiple fixes to match new unit tests: - fix DashStyleCustom style to use the current DashPattern (no reset); - don't accept non-invertible matrices in GdipMultiplyPenTransform and GdipSetPenTransform; - set the minimum miter limit to 1.0 in GdipSetPenMiterLimit (whatever the value supplied); - fix some error conditions to return the correct error code and also track some unimplemented stuff (rather than throwing); 2006-05-15 Sebastien Pouliot * pen.c: Added an hack to keep the "bad" behaviour in the most common MWF usage (i.e. where the badness isn't visible). 2006-05-15 Sebastien Pouliot * pen.c: Revert the change from r52463. This looks better only when the pen's width is 1 (but looks worse in other cases). This fix both bug #77976 (dash style) and #78059 (double pixel). Also remove a FIXME which is no more required with this fix. 2006-05-12 Sebastien Pouliot * image.c: (GdipSaveImageToFile) don't access image->type before the NULL check for image. (GdipLoadImageFromDelegate_linux, GdipLoadImageFromFile) ensure result isn't NULL before using it. * graphics-path.c: Fix misnamed GdipAdd*Path*String[I] API (#78383) * region.c: Fixed the case where an infinite region was unioned with a rectangle (and didn't result in infinity). 2006-05-12 Peter Dennis Bartok * graphics.c (MeasureOrDrawString): Only make every character a wrappoint if we're single-line and have char trimming (#78336) 2006-05-12 Peter Dennis Bartok * region.c (gdip_combine_union): Hack to allow adding rectangles with negative x/y coordinates. This method should probably be reworked properly, not assuming negative values have a special meaning. 2006-05-12 Sebastien Pouliot * bitmap.c: (GdipCreateBitmapFromScan0) make sure we're not gonna use the default_palette if NULL. (GdipBitmapLockBits) don't use srcRect pointer before it's NULL check. (gdip_propertyitems_clone) free result before returning OutOfMemory. (GdipCloneBitmapAreaI) add missing call to gdip_bitmap_dispose in fail. * gdip.h: Change GpPen.matrix to cairo_matrix_t (to avoid unrequired allocation/free). * graphics-path.c: (GdipGetPathWorldBounds) free workpath in the special case where weonly have a single element after flattening. (GdipAddString) added checks for invalid font and NULL layoutRect. (gdip_convert_bezier_to_lines) removed impossible special case. * lineargradientbrush.c: Ensure we always free the structures we allocated in case we hit an error. * pathgradientbrush.c: Ensure we always free the structures we allocated in case we hit an error. * pen.c: Updated code to avoid multiple dynamic creation and deletion of GpMatrix. * region.c: (GdipCreateRegionRgnData) make sure we free the GpRegion in all error cases. (gdip_combine_complement) avoid possible double free. * stringformat.c: (GdipGetStringFormatTabStops) don't use the format pointer before it's NULL check. 2006-05-11 Sebastien Pouliot * graphics.c: (GdipCreateFromHDC) check for memory allocation failure before using the pointer. (GdipSetClipGraphics) honor the combineMode parameter (in this case by reusing the GdipSetClipRegion function). * graphics-path.c: (GdipAddString) it is possible that some memory is allocated by cairo even if the *_create call fails - so we must call the corresponding *_destroy function on failure to create. * matrix.c: (GdipCreateMatrix3) Ensure we call GdipFree in case of an error (where we do not return the allocated matrix). 2006-05-10 Sebastien Pouliot * pathgradientbrush.c: Sadly Cairo doesn't support path-based gradients. Added support for a special case where we can use cairo's radial gradient. Otherwise we continue to fill using the center color. 2006-05-09 Sebastien Pouliot * pathgradientbrush.c: Apply tricks, knowledge and unit tests from lineargradientbrush as a starting point (i.e. it doesn't fix anything visually but I like those foundations better ;-) * pathgradientbrush.h: Change transform and rectangle not to require extra memory allocations (always allocated, static size). 2006-05-08 Sebastien Pouliot * graphics-path.c: Added pen support to GdipGetPathWorldBounds as the result doesn't have to be very precise (see test cases). Fixed GdipWidenPath to return OutOfMemory if the supplied path as a single point (seems to be a bug, reported as FDBK49685). Fixed GdipWarpPath to reset (empty) the path in the same case (again to match MS); 2006-05-05 Sebastien Pouliot * lineargradientbrush.c: Changed atanf for atan (for older SunOS); * graphics-path.c: Changed GdipGetPathWorldBounds to get better results when curves are used (much better than MS GDI+). Reduced memory allocations. Pen support is still missing. 2006-05-04 Sebastien Pouliot * graphics.c: Fix the default (parameter-less) BeginContainer by introducing a previous_matrix inside GpGraphics. Keeping the effective matrix from the previous container (or the original graphics) allow us to substract it when a call to GdipGetWorldTransform is made. 2006-05-04 Sebastien Pouliot * graphics.c: Removed the reset on the matrix when begining a new container (this is half-right, but better vistually than the current reset). Added a FIXME in GdipGetWorldTransform as it won't return the correct results inside a container. Added MonoTODO to Gdip[Get|Set] PixelOffsetMode as we do not use the value inside libgdiplus (and changing it should affect other values). * region.c: Fixed bug #78284 when doing a transform on an empty region. Also ensure we convert empty region as the some structures are assumed to be allocated after the conversion. * region-bitmap.c: Allow region bitmaps with 0 width and/or height as this is a valid case (i.e. they aren't too big to render ;-). 2006-05-03 Sebastien Pouliot * lineargradientbrush.c: Applied patch for #78185 from Bill Holmes to add support for scalable angle. Changed a bit to use the new matrix function. * matrix.c|h: Added a new function to avoid code duplication when creating a matrix from a rectangle and 3 points. 2006-05-02 Peter Dennis Bartok * bitmap.cs: Only mark the bitmap as own if we actually allocated it (fixes crash exposed by pdn) 2006-05-02 Sebastien Pouliot * gdip.h: Changed GpGraphicsContainer to uint (so it match how we are using the Save/Restore functions). Added text_contrast to GpState and GpGraphics (even if it's not really used ATM). Added missing prototypes for GdipBeginContainer[2][I] functions. * graphics.c: Implemented GdipBeginContainer2 and GdipEndContainer functions. Added partial implementation for GdipBeginContainer2 and GdipBeginContainerI as they don't support the extra parameters (rectangle and units). Added the code to set/get text contrast with Gdip[Get|Set]TextContrast to help the unit test (but it's not being "visually" used). 2006-05-01 Peter Dennis Bartok * graphics.c (GdipMeasureCharacterRanges): Now considers string alignment (which is needed for properly aligned LinkLabels) 2006-05-01 Peter Dennis Bartok * bitmap.c (gdip_pixel_stream_set_next): Fixed wrong shifting. 2006-05-01 Gonzalo Paniagua Javier * pngcodec.c: don't loop forever on truncated images. Fixes bug #78213. Patch by Pavel Sakowski. 2006-05-01 Sebastien Pouliot * graphics.c: Updated and completed Duncan's patch for #76907. We now support the offset and numOfSegments parameters of GdipAddPathCurve3. 2006-05-01 Sebastien Pouliot * graphics.c: Updated and completed Duncan's patch for #76907. We now support the offset and numOfSegments parameters of GdipDrawCurve3. * lineargradientbrush.c: Applied patch for #78179 from Bill Holmes which fixes gradients created using 2 points (and not a rectangle). Also removed two (now) unused functions in the source code. 2006-04-30 Peter Dennis Bartok * image.c: If an attribute changes scan0, it will (now) also change the pixel_format. Save the original so we can properly restore when done. * imageattributes.c: Set the pixel_format of our work-bitmap to 32bppArgb (since most our methods need alpha and the provided format might not have alpha) 2006-04-30 Peter Dennis Bartok * pngcodec.c: Make sure the alpha bit makes it over to the bitmapdata 2006-04-30 Peter Dennis Bartok * pngcodec.c: We were handling transparency wrong. The transtable runs alongside the palette (but possibly shorter), providing the alpha value for the corresponding palette entry 2006-04-29 Peter Dennis Bartok * pngcodec.c: Added reading of select png properties. I might have missed some additional we can support, but for the images I had for testing we return all the same properties as MS. Still need to add saving so we can roundtrip. This replaces the previous hack * bitmap.c (gdip_bitmapdata_property_add_short): Fixed to match other xxx_add_xxx methods, removed length and pointer requirement * gdip.h: Updated prototype * tiffcodec: - Fixed whitepoint reading; we were only readying X - Fixed storage type and size for TransferFunction 2006-04-29 Peter Dennis Bartok * pngcodec.c: Returning fake comment (for pdn) until we read real properties in png 2006-04-29 Peter Dennis Bartok * bitmap.c (gdip_pixel_stream_set_next): The previous 24bit patch ignored that for 32bit copies we need to fill 4 bytes and the first is not blue, but the alpha value, everything is shifted one byte. 2006-04-29 Peter Dennis Bartok * tiffcodec.c: Added a workaround for a broken TIFF I've encountered (winforms/img/multipage.tif) to prevent us from crashing 2006-04-29 Peter Dennis Bartok * gifcodec.c: Comments are not null-terminated, we need to copy the string into a buffer with a null terminator before storing them in our properties (Fixes #78181) 2006-04-29 Sebastien Pouliot * font.c: gdip_cairo_ft_font_lock_face can return NULL is some cases, like when the file fonts.conf is missing. We now check for the NULL value eveywhere the lock is used and issue a warning (console) about the failure. Fix bug #78237. * graphics.c: Check for NULL from gdip_cairo_ft_font_lock_face. 2006-04-27 Sebastien Pouliot * graphics.c: Added MonoTODO because we're not using the numberOfSegments parameter in GdipDrawCurve3[I] functions. * graphics-path.c: Fixed AddPathCurve* functions to deal (in some cases) with curve specified with two points (with strangely not the same behaviour as DrawCurve). Added more checks for memory allocation failures. Added MonoTODO because we're not using the numberOfSegments parameter in GdipAddPathCurve3[I] functions. 2006-04-27 Sebastien Pouliot * graphics.c: Add missing checks in GdipDrawCurve3. Also add a corner case where GdipDrawCurve[2][I] (but not GdipDrawCurve3) functions allows to draw lines (curves with two points). 2006-04-27 Peter Dennis Bartok * pngcodec.c, bmpcodec.c: Missed a few vars in BIG_ENDIAN codepath when doing the image rewrite 2006-04-27 Sebastien Pouliot * gdip.h, graphics.c: Fix prototypes for GdipDrawCurve3 and GdipDrawCurve3I functions (float to int). The System.Drawing wrappers are correct. This is the first part of Duncan's patch for #76907. 2006-04-27 Sebastien Pouliot * graphics-path.h: Add prototypes for GdipAddString and GdipAddStringI * graphics-path.c: Add a basic implementation for GdipAddString[I] which use the path Cairo builds to get the font path outlines. Some options aren't yet supported (e.g. StringFormat) and would require some refactoring of the DrawString code. 2006-04-26 Sebastien Pouliot * image.c: GdipLoadImageFromFile returns OutOfMemory when a file format is unkown (like a text file, an EXE...). This makes S.D. throw an OutOfMemoryException (which is MS compatible). 2006-04-26 Sebastien Pouliot * image.c: Patch by Bill Holmes to fix bug #75063. This correctly implement all cases (including rotation) when points are given as positions to draw an image. 2006-04-26 Gonzalo Paniagua Javier * bmpcodec.c: for 32bpp on little endian platforms, we can use memcpy here. * bitmap.c: special case for 24bppRgb in LockBits, as gdip_get_pixel_format_bpp returns 32bpp for it. Fixes bug #76193. 2006-04-26 Sebastien Pouliot * lineargradientbrush.c: Fix some angles that were still in degrees (when converted from LinearGradientMode). 2006-04-26 Sebastien Pouliot * lineargradientbrush.c: Applied patch for #78185 from Bill Holmes (billholmes54@gmail.com). This implements correctly the FlipX, FlipY and FlipXY modes and removes an incorrect check in GdipGetLineTransform. 2006-04-24 Sebastien Pouliot * lineargradientbrush.c: Second patch from Bill Holmes (and friends) which redo my complex matrix setup into a simpler one with much better results. 2006-04-24 Sebastien Pouliot * lineargradientbrush.c: Avoid the unrequired allocations for the rectangle and the matrix. Avoid multiple convertion of the angle from degrees to radians. Fix angle calculation when the gradient is built from two points. 2006-04-24 Sebastien Pouliot * lineargradientbrush.c: Gradients are now much better looking using a patch from Bill Holmes. 2006-04-22 Alexander Olk * image.c: Fixed build for warning: control reaches end of non-void function in GdipGetPropertyIdList 2006-04-21 Peter Dennis Bartok * bitmap.c (gdip_bitmap_clone_data_rect): Now calculating the size of the new bitmap based on source parameters if the new bitmap is just being created. This fixes the failing Bitmap.Clone() unit test. 2006-04-21 Peter Dennis Bartok * image.c: Implemented GetPropertyIdList 2006-04-21 Sebastien Pouliot * graphics.c: Fixes to clipping when resetting (resets the clipping matrix) and when setting the matrix (to apply inverted matrix). * gdip.h: Added missing prototypes for clipping. 2006-04-21 Alexander Olk * tiffcodec.c: Fixed the build for "older" gcc versions. They don't like uint32 pointers when they expect guint32 pointers in gdip_property_get_long 2006-04-21 Gonzalo Paniagua Javier * imageattributes.c: don't apply the color matrix to transparent pixels. Now the disabled toolbar buttons in sharpchess are displayed correctly. 2006-04-20 Peter Dennis Bartok * tiffcodec.c: Cleaned up unused stuff 2006-04-20 Peter Dennis Bartok * tiffcodec.c: - Added reading and setting of dpi when loading image - Now distinguishes between images with or without alpha and sets the appropriate image flags when loading tiff images - Added ability to save images as RGB instead of ARGB if the flags indicate it's ok to do so - Added saving of properties associated with each picture (we now successfully roundrip images) - Setting the TIFF Error and Warning handler to NULL to suppress error and warning output on the console * gdip.h: Added prototypes for property getters * bitmap.c: Implemented property getter helper methods to allow codecs to easily translate saved properties for saving 2006-04-20 Peter Dennis Bartok * tiffcodec.c: - Switched from passing the file pointer to passing the filename for saving. Apparently when a FILE is fdreopen()ed it doesn't seek properly anymore, and we need the ability to seek when saving multi-file images - Moved page counter inside page loop - Added definition for the private Exif IFD tag (for those using older versions of TIFFLIB) * image.c: We no longer pass a file pointer for saving TIFF files, instead we pass the target filename * tiffcodec.h: Changed prototype to match tiffcodec.c 2006-04-20 Peter Dennis Bartok * gdipImage.h: Fixed typo in tag name * tiffcodec.c: Implemented reading of TIFF tags and translating them into properties. 2006-04-20 Sebastien Pouliot * lineargradientbrush.h: Added DEFAULT_GRADIENT_ANGLE constant. * lineargradientbrush.c: Simplify brush creation and fixed initial matrix calculations. Fixed matrix operations functions. Don't create an extra surface in create_tile_linear (other wrap mode still need to be updated). This is "closer" to the real thing (much better results in ZedGraph) but there are still issue mainly with rotations. 2006-04-20 Peter Dennis Bartok * gifcodec.c: Loader is now alpha/transparency aware and always sets up the palette with alpha set. If transparent color is specified, the the matching palette entry alpha is set to zero. * bitmap.c (gdip_bitmap_indexed_to_rgb): Now properly handles palettes with alpha values. 2006-04-20 Peter Dennis Bartok * gdip.h: Added transparent tracking field to BitmapData * bitmap.c: Added copying new transparent field to bitmap cloning * gifcodec.c: - Now reads transparency color from ext block and stores in BitmapData - Now writes transparency, loop, delay and comment properties back out when saving. We can now roundtrip our gif properties 2006-04-20 Peter Dennis Bartok * image.c: Implemented all GdipGetProperty, GdipSetProperty and GdipRemoveProperty functions. * gdipImage.h: - Added PropertyTag and PropertyTagType enums - Fixed wrong GdipGetPropertyItem prototype * bitmap.c: - Implemented gdip_bitmapdata_property_xxx helper methods for manipulating property data associated with a bitmap - gdip_bitmapdata_clone now sets appropriate image_flags * gdip.h: Added prototypes for new functions in bitmap.c * gifcodec.c: - Added GGifSlurpMono, AddExtensionBlockMono and FreeExtensionMono functions derived from libgif, to work around libgif bug that prevents us from retrieving any extensions after the last image block (where it seems certain apps place their comments) - Added handling of trailing extension block, adding comments in that block will cause all images in the frame to have the comment - Added reading of LoopCounter, and subsequent storing as property - Horizontal and vertical DPI are now retrieved from display 2006-04-20 Peter Dennis Bartok * bmpcodec.c, general.c, image.c, jpegcodec.c, tiffcodec.c, imageattributes.c, gdipImage.h, region-bitmap.c, gifcodec.c, texturebrush.c, pngcodec.c, gdip.h: - Changed BitmapData, FrameData, GpImage and GpBitmap structures to more accurately reflect gdiplus behaviour; removed broken dual frame and single bitmap concept, instead everything is organized into frames, with an active bitmap designating the currently used bitmap. - Added property components to BitmapData to allow implementing properties per bitmap - Updated all image related code to use new structures - Lots of added sanity checks and logic bug fixes - Fixed up sources to use tabs instead of spaces (png, jpeg) and removed buttloads of trailing whitespace on lines in all files - Rewrote gif load and save methods to properly deal with animation, transparency and reading/storing animation delay times - Streamlined many functions, removed deep nesting, introduced single point of error handling for each encoder and decoder - Now allows for disparate sizes of bitmaps in a single frame - Implemented ImageLockModeUserInputBuf for GdipBitmapLockBits and several other unimplemented features 2006-04-19 Gonzalo Paniagua Javier * bmpcodec.c: fixed same error that Peter fixed in his last commit, but different place. 2006-04-19 Sebastien Pouliot * graphics-path.c: Avoid, when possible (i.e. null/identity), matrix calculations in GdipTransformPath (which gets inherited by every call using it). Also added a OutOfMemory check in GdipTransformPath if points can't be allocated. Added common path preparation (flattening and/or matrix) to GdipWindingModeOutline, GdipWidenPath and GdipWarpPath. 2006-04-19 Peter Dennis Bartok * bmpcodec.c: Fixed common math error when adding values to pointers. Was causing nasty memory overwrites when saving bmps. 2006-04-18 Peter Dennis Bartok * general.cs (MeasureOrDrawString): Remove padding from bounding rectangle calculations. It is causing issues with AutoHeight controls not matching MS 2006-04-18 Sebastien Pouliot * gdip.h: Add prototype for gdip_get_pattern_status function. * general.c: Added a new function to check the status of a cairo pattern (check for NULL isn't enough). If invalid the pattern will be destroyed. 2006-04-13 Sebastien Pouliot * font.c: Keep a static collection for the system font that will be leaked (on purpose, see comments). Added missing initialization (allocation) and nullification (freeing) to avoid using bad references (which also helps to get better results from valgrind). Reworked GdipPrivateAddMemoryFont to return the error codes leading to the expected exceptions in the System.Drawing.dll unit tests. 2006-04-13 Sebastien Pouliot * matrix.c|h: Fix public API signatures to use BOOL (not int). * region.c: Give a better chance to revert to a simpler (rectangular) region in GdipCombineRegionRect. 2006-04-11 Gonzalo Paniagua Javier * pngcodec.c: don't use any filter (makes the saved image smaller) and generate sRGB,gAMA and cHRM information as MS does. 2006-04-11 Gonzalo Paniagua Javier * pngcodec.c: no need for gdip_stream_png_source, just pass the function pointer. 2006-04-11 Sebastien Pouliot * graphics.c: Fixed bug #77129 where we shouldn't draw (or fill) rectangle(s) with either a negative width or height. 2006-04-10 Sebastien Pouliot * matrix.c: Fixed misimplemented GdipCreateMatrix3[I]. Reworked allocations to report OutOfMemory conditions. 2006-04-07 Sebastien Pouliot * region-bitmap.c: Changed free for GdipFree. Removed unused variable. 2006-04-03 Gonzalo Paniagua Javier * imageattributes.c: (gdip_process_bitmap_attributes): the default fallback condition was wrong and caused the function to not process or incorrectly process the attributes, as it either used the default attributes or did nothing on the bitmap. It works now (tested with BitMap.MakeTransparent() and using "imageAttr.SetColorKey (color, color, ColorAdjustType.Bitmap);"). 2006-04-03 Gonzalo Paniagua Javier * bmpcodec.c: fix offset when saving to a file and speed up writing the palette (15% faster saving). 2006-03-31 Peter Dennis Bartok * graphics.c: - Removed reset of clip_matrix whenever the clip is reset, since the matrix still would apply were another clip rectangle set later - Fixed signature of several methods from UINT to int, to match MS signature. Fixes TextBox not displaying the first char 2006-03-31 Sebastien Pouliot * graphics-path.c: Don't read past the end of the allocated points structure. 2006-03-30 Sebastien Pouliot * graphics.c: Check that the matrix is invertible in function GdipMultiplyWorldTransform. Fix typo for return value in function GdipScaleWorldTransform. * lineargradientbrush.c: Avoid memory allocation for GpRectF in function GdipCreateLineBrushFromRectI. Reduce the number of calls between GdipCreateLineBrush* functions. 2006-03-30 Sebastien Pouliot * lineargradientbrush.c: Fixed cloning (points and count). Added better error handling for cairo_pattern_create_linear. Check that the matrix is invertible in GdipSetLineTransform. * matrix.c: Matrix identity isn't an equality test and accept a margin for errors/precision. 2006-03-29 Sebastien Pouliot * graphics-path.c: Ensure we start/close figures correctly in every GdipAddPath* functions. Unit tests confirms the new behaviours. 2006-03-28 Peter Dennis Bartok * graphics.c (GdipSetPageUnit): We should be able to set all units. Not sure why that code was there. (Fixes #77829) 2006-03-28 Sebastien Pouliot * gdip.h: Added new member clip_matrix for GpState; * graphics.c: Add the clipping matrix to the information saved by GdipSaveGraphics and restored by GdipRestoreGraphics. 2006-03-27 Sebastien Pouliot * gifcodec.c: Added missing DGifCloseFile to reclaim memory. 2006-03-27 Sebastien Pouliot * gdip.h: Added new member clip_matrix for GpGraphics; * graphics.c: Make sure the applied transforms to the graphics are also affecting the clipping; * matrix.h: New macro to reverse the order to apply the matrix; 2006-03-27 Sebastien Pouliot * matrix.c: GdipIsMatrixInvertible shouldn't invert the matrix! 2006-03-26 Sebastien Pouliot * graphics.c: Add support for complex (after binary operations) clipping paths. Hackish but I don't see any alternative... * matrix.h: New. Header file for private region functions. * matrix.c: Added private functions for gdip_is_matrix_empty (moved from region.c) and gdip_is_matrix_a_translation (to enable an optimization). * region.c: Adjusted code for the renamed gdip_is_matrix_empty. Added a optimization to call GdipTranslateRegion from GdipTransformRegion if the matrix only does a translation. This allows to skip "rectangle to path" convertion and the invalidation/creation of a region bitmap. * Makefile.am: Added the new matrix.h header file to the build. 2006-03-25 Sebastien Pouliot * gdip.h: Add missing prototypes for GdipTranslateClip[I] functions. * graphics.c: Adjust anti-aliasing so that graphics can draw thin lines in SmoothingModeAntiAlias and SmoothingModeHighQuality modes (thanks to Peter Bartok). * graphics-path.c: Fix GdipTransformPath when the path is empty (to return Ok, not an error). 2006-03-25 Sebastien Pouliot * gdip.h: Added new structures required for path tree (GpPathTree) and regions bitmaps (GpRegionBitmap). * gdipImage.h: Added prototype for GdipGetImageGraphicsContext. * graphics.c: Re-implement GdipFillRegion to use the alpha bitmap provided for by region-bitmap. Correct clipping wrt infinite regions. * region.c: Adjust existing API to use the bitmap regions for path based regions, while keeping the existing code for rectangular based regions. * region.h: New. Header file for private region functions. * region-bitmap.c|h: New. Code to generate bitmap for regions and the binary operators on them (union, intersection, exclude, complement, xor). * region-path-tree.c|h: New. Code to create and manipulate trees of path with binary operators. This allows to re-create any region from a small set of serialized data. * Makefile.am: Add the new files to the build. 2006-03-23 Peter Dennis Bartok * graphics.c (MeasureOrDrawString): Avoid trying to draw 0-length lines (fixes #77699) 2006-03-23 Sebastien Pouliot * lineargradientbrush.c: Set the count value when cloning and Free the matrix when destroying the brush. 2006-03-23 Sebastien Pouliot * lineargradientbrush.c: Don't lose the original context 'ct' when flipping and free the new context. Remove obsoleted comments. 2006-03-22 Peter Dennis Bartok * font.c: - GdipDeletePrivateFontCollection: No longer free's the passed variable but instead the memory the passed var points to, since that's what's been allocated. Sigh. - GdipDeletePrivateFontCollection: Only destroy the FcFontSet and FcConfig if we have one allocated. - GdipDeleteFontFamily: Only free the pattern if it's actually been allocated. - GdipGetFontCollectionFamilyList: Where do I begin? It was very much broken and memory was not handled right, with bad overwrites. It now properly writes the font families to the pointers it's supposed to. Got a bit simpler in the process. 2006-03-22 Peter Dennis Bartok * image.c: - GdipDrawImageRect: Dropping the save/restore and putting in the proper fix for Digger and other apps not drawing properly after drawing an image. - GdipDrawImagePoints: Saving/Restoring the original source pattern 2006-03-22 Peter Dennis Bartok * image.c (GdipDrawImageRectRect): We're now properly saving and restoring the original source pattern (fixes #77438) * imageattributes.c: Setting copied pointer to null to avoid double usage 2006-03-22 Peter Dennis Bartok * image.c: - GdipDisposeImage: Single-frame images will have the frameDimensionList[].frames pointer point to the image's BitmapData block. We now consider that fact and free the image BitmapData only if it wasn't also part of the frames list (and was free'd there) - Removed a useless call to cairo that caused a leak but had no effect on rendering * bitmap.c: - gdip_bitmap_clone: Resetting all pointers to null after copying BitmapData. Otherwise the surface will get used without proper refcounting, and we would illegally free the memory off the wrong object. - GdipCloneBitmapAreaI: Eliminated intermediate stack var and memcpy - GdipCreateBitmapFromHBITMAP: Cloning the whole image instead of just the bitmap part. That way we also get the palette, etc. 2006-03-22 Sebastien Pouliot * lineargradientbrush.c: Don't needlessly allocate GpPointF structures in GdipCreateLineBrushI. Fix pointers when accesing a brush matrix in GdipGetLineTransform and GdipSetLineTransform. Fix error handling in GdipMultiplyLineTransform (to match GDI+). 2006-03-21 Sebastien Pouliot * imageattributes.c: Allocate enough memory before copying GpColorMap in GdipSetImageAttributesRemapTable. Also handle mapSize ==0 case and OutOfMemory condition. * region.c: Calling gdip_add_rect_to_array reallocate the array so we must update the recttrg variable. 2006-03-21 Sebastien Pouliot * texturebrush.c: Don't keep a reference to the "image" (but Clone) in GdipCreateTexture (we're not the owner of it). Fixed all the _flip functions that were broken (since the cairo 1.0 update ?). * image.c: Add a comment for a leak (it leak for texture clones but crash elsewhere if freed). 2006-03-20 Peter Dennis Bartok * font.c (gdip_cairo_ft_font_lock_face): Initialize the matrix to avoid using uninitialized memory in cairo 2006-03-20 Sebastien Pouliot * texturebrush.c: Ensure we destroy the matrix and the surface when disposing the brush. Add a reference to the surface when cloning. 2006-03-20 Sebastien Pouliot * font.c: Re-work font locking not to leak memory (and not to create a scaled font when unlocking). * graphics.c: Use CleanString (as String has been freed). 2006-03-20 Sebastien Pouliot * graphics.c: Clear the clipping region before data copying into it. * region.c: Remove static from gdip_clear_region as we need it in graphics.c for clipping. 2006-03-20 Sebastien Pouliot * image.c: Free the filter in GdipGetImageGraphicsContext. * pen.c: Use the GDI+ call to create the matrix (GdipCreateMatrix). Delete the default (empty) matrix when cloning a pen. Delete the matrix when disposing of the pen. 2006-03-19 Sebastien Pouliot * lineargradientbrush.c: The GpRect structure was never freed in GdipCreateLineBrushFromRectWithAngleI. Now allocated on the stack. Temporary matrixes weren't freed in gdip_linear_gradient_setup and create_tile_linear functions. * image.c: Reordered code to avoid using memory we just freed in gdip_get_imageformat_from_codec_clsid. 2006-03-18 Sebastien Pouliot * image.c: Free the image palette on dispose. Also copy (not refer) the palette when cloning the image (so we don't double-free it). 2006-03-17 Sebastien Pouliot * general.c: Call XCloseDisplay after we convert the DPI string as we do not own the 'val' pointer. * image.c: Destroy (cairo_pattern_destroy) the pattern we use as a filter in GdipDrawImageRectRect. 2006-03-16 Sebastien Pouliot * pen.c: Delete the temporary matrix created during gdip_pen_setup. 2006-03-14 Sebastien Pouliot * matrix.c: Add missing validations on count parameters. Fix return value for an invalid GpMatrixOrder in GdipMultiplyMatrix. 2006-03-14 Peter Dennis Bartok * image.c (DrawImageRect): Added a cairo_save/cairo_restore to fix the issue exposed by Digger (title score board background not drawn when doing the FillRectangle) 2006-03-13 Sebastien Pouliot * graphics-path.c: Add missing checks for markers. This fixes some issues (e.g. accesing item -1) and also reduce memory allocations for empty paths. Return Ok and display a warning when GdipAddString[I] is called (instead of returning NotImplemented). 2006-03-06 Jonathan Gilbert * pngcodec.c: Added block to handle saving of 8:8:8 images without an alpha channel. The underlying encoding of the image includes a filler byte, so that even Format24bppRgb is 32 bpp under the hood, but when libpng is told to expect RGB data, it expects only 24 bits per pixel, which was corrupting PNG output for Format24bppRgb and Format32bppRgb. 2006-02-24 Sebastien Pouliot * graphics-path.c: Add missing free in a special case (only one element) of GdipGetPathWorldBounds. Fix typo (X->Y) in GdipGetPathWorldBoundsI. 2006-02-10 Peter Dennis Bartok * font.cs: - Switched GdipCreateFontFromHfont name to GdipCreateFontFromHfontA to allow support charset-based naming when marshaling - Implemented GdipCreateFontFromLogfontA and GdipCreateFontFromLogfontW 2006-02-08 Sebastien Pouliot * graphics.c: Added a missing cairo_set_fill_rule in FillPath (which fixes bug #77408. Changed DrawPath to use 0, 0 (like FillPath) so they both draw at the same place (no blanks) and also behave like DrawRectangle(s) and FillRectangle(s) when compared side-by-side. 2006-02-03 Sebastien Pouliot * region.c: Fixed a case where gdip_combine_exclude wasn't excluding a rectangle if it was identical to the excluding one (see bug #77408 for an example). Also in gdip_combine_xor we do not need to call gdip_combine_exclude if there's no intersection between the rectangles 2006-02-01 Sebastien Pouliot * image.c: Added some missing argument checks. Implemented GdipDrawImagePointRect to fix bug #77428. 2006-01-31 Sebastien Pouliot * region.c: Added gdip_copy_region to help reusing region copying in GdipCloneRegion and GdipGetClip. * graphics.c: Fixed GdipGetClipBoundsI to get (not set) the clip. GdipGetClip and GdipFillPath now works with non-rectangular regions. Implemented GdipSetClipPath function. Added null checks for parameters in many functions. 2006-01-27 Sebastien Pouliot * gdip.h: Remove duplicate (and identical) definition for LF_FACESIZE. * graphics.c: GdipFillRegion now works with non-rectangular regions by either calling GdipFillPath or GdipFillRectangles. * graphics-path.c: Implemented GdipFlattenPath be re-using Sodipodi's libnr nr_curve_flatten. * graphics-path.h: Added a recursion limit of 10 when flattening. * region.c: Added gdip_is_region_empty which works with any type of region (rectangular or path based). Added special case support (empty and/or infinite region) in GdipCombineRegionPath. The common case is still missing. GdipTranslateRegion now works with non-rectangular regions. 2006-01-27 Jordi Mas i Hernandez * graphics.c: - Fixes font size for printing - Fixes unit conversions from diferent units * font.c, gdip.h - Implements GdipGetFontHeight, GdipGetFontHeightGivenDPI and GdipGetFontSize. 2006-01-26 Sebastien Pouliot * font.c: Use the reference count to [re-]created the generic font family (as the pointer isn't null after it is disposed). 2006-01-18 Peter Dennis Bartok * jpegcodec.c: Upconvert an indexed image, to allow saving it; added 1 and 4 bit as supported formats as well. This fixes #77270 2006-01-18 Peter Dennis Bartok * gdip.h: Switched GpRection.Cnt to int, to avoid signedness mismatch problems 2006-01-18 Sebastien Pouliot * graphics.c: Started adapting functions to recognize path based regions (while keeping rectangular regions working). * region.c: Added function to convert a rectangle based region to a path based region. Started adapting functions to recognize path based regions (while keeping rectangular regions working). Implemented GdipCreateRegionRgnData, GdipGetRegionDataSize and GdipGetRegionData (for both path and rectangle based regions). * gdip.h: Reordered some typedef to include a GpPath inside GpRegion. Added export for GdipCreateRegionRgnData. 2006-01-17 Peter Dennis Bartok * graphics.c: If no trim flag is set we need to wrap, not trim. Every character can be used as wrap character in that case. Fixes #76034 2006-01-16 Sebastien Pouliot * graphics-path.c: Implemented GdipGetPathWorldBounds[I] minus Pen support. 2006-01-15 Jordi Mas i Hernandez * graphics.c, image.c, gdip.h, general.c: - Implements PageUnit functionality - Converts units to Cairo user-space (postscript or display) - Each surface has its own x and y dpi - Allows setting Postscript dpy's 2006-01-13 Sebastien Pouliot * graphics-path.c: Added checks for the number of points added when using AddBeziers (4 points for the first, 3 afterward) and the minimum of point required to add a Curve, ClosedCurve and a Polygon. 2006-01-01 Jordi Mas i Hernandez * bitmap.c: Fixes 77131 2005-12-23 Peter Dennis Bartok * texturebrush.c: Added handling for indexed texture images 2005-12-22 Peter Dennis Bartok * texturebrush.c: Fixed generation of texturebrushes. Was seriously broken 2005-12-22 Jordi Mas i Hernandez * graphics.c: Postscript support for handle * image.c: Postscript drawble support for printing * gdip.h: Postscript Drawable 2005-12-09 Jordi Mas i Hernandez * graphics.c, image.c: Unreference the surface properly. Now, we do not leak those and cairo_surface_finish is called. 2005-12-07 Jordi Mas i Hernandez * graphics.c: Fixes 76923 2005-12-06 Peter Dennis Bartok * gdip.h: - Removed old wine leftovers for bitmaps - Added GpStatus return value to gdip_bitmap_clone() * bitmap.c: - Added handling of failures to gdip_bitmap_clone(), including returning a status - Implemented the GdipCreateBitmapFromHBITMAP() and GdipCreateHBITMAPFromBitmap() functions. Like with other handles the handle is equivalent to the gdi+ memory pointer 2005-12-05 Peter Dennis Bartok * gdip.h: - Removed wine leftover - Added LOGFONTA and LOGFONTW structures (for GdipGetLogFontX) - Added face var to GpFont struct to remember face name * font.c: - Implemented GdipGetLogFontA() and GdipGetLogFontW() functions - Implemented GetGetFontFromHfont() function - Droped wine leftovers and added code to remember (and free) the face name of a font 2005-12-02 Jonathan Gilbert * bitmap.c: Fixed support for PixelFormat24bppRgb in pixel streams. The count of bytes per pixel for pixel formats with depths of more than 8 bits is now stored negated in the state->pixels_per_byte member of the StreamingState structure. * gdip.h: Added comment explaining the meaning of negative values in the pixels_per_byte member of struct StreamingState. * bitmap.c: Fixed the copying back of changed bitmap data in the GdipBitmapUnlockBits() method. The condition was erroneously checking for the presence of the GBD_READ_ONLY flag instead of its absence. 2005-11-29 Duncan Mak * graphics.c (make_arcs, make_pie): * graphics-path.c (append_arcs, GdipAddPathPie): Scale alpha and beta accordingly because GDI+ deals with elliptical arcs, instead of circular arcs. Thanks to Bertram Felgenhauer from #cairo for helping me figure this out. This fully fixes #76846. 2005-11-29 Duncan Mak * graphics.c (make_arcs): * graphics-path.c (append_arcs): Add a new flag 'enough' to signify that we're done drawing all the subarcs. This fixes #76846. Previously, the check for 'enough' incorrectly filters out sweep angles with a negative value (i.e. drawing 'backwards'). 2005-11-13 Miguel de Icaza * image.c: Implement a little bit of mandolin. 2005-11-10 Geoff Norton * pngcodec.c: Readd a removed but needed variable for big endian build 2005-11-08 Peter Dennis Bartok * gdip.h: Added aa offset vars and hatch origin vars * graphics.c: - For all x and y coordinates that are passed to cairo, but not used for fills we now add an offset if anti aliasing is turned off. - Fixed Get/SetRenderOrigin. It is supposed to track the origin for dithering and hatchbrushes. * hatchbrush.c: - hatch lines are no longer are antialiased, except for the diagonal hatches, which are required to (Removes some fixmes) - Using square cairo line caps for now, to get diagonal lines to connect - Switched some numbers to more closely match MS again now that we're turning AA off * pen.c: Work around cairo drawing a linecap for every element of a dashed line 2005-11-07 Jackson Harper * pen.c: Set the width of dashes when creating the dashed array, cairo uses the values in the dashed array as the size of the dash. This fixes dashed lines with a width greater then 1. 2005-11-07 Kornél Pál * bmpcodec.c: Load 32-bit bitmaps as Format32bppRgb. 2005-11-05 Jordi Mas i Hernandez * graphics.c: Fixes 76111 (DrawString does not honor NoWrap) 2005-11-01 Peter Dennis Bartok * graphics.c: Implemented smoothing mode support. Now defaulting to non-antialiased drawing 2005-11-01 Jonathan Chambers * pen.c: LineCapFlat needs to translate to square cairo line caps in order for line lengths to be correct when not aliased 2005-10-23 Jonathan Gilbert * image.c: Renamed gdip_FlipX() and gdip_rotate_180_FlipX() to gdip_flip_x() and gdip_flip_y() respectively. * image.c: Updated GdipDrawImageRectRect to call the functions by their new names. * image.c: Renamed copy_pixel()'s third argument 'components' to 'size', as pixel components can be more than one byte in size. * image.c: Rewrote gdip_flip_x() to use only a single scan of buffer space instead of redoing the entire image. Moved gdip_flip_x() to be adjacent to gdip_flip_y(). * image.c: Replaced gdip_rotate_90(), gdip_rotate_180(), and gdip_rotate_270() with gdip_rotate_orthogonal_flip_x() which handles all types of rotation and can also integrate a horizontal flip into the rotation. All of the RotateFlipTypes can be reduced to a clockwise rotation of a multiple of 90 degrees optionally followed by a horizontal flip. * image.c: Added gdip_rotate_flip_packed_indexed() which does what gdip_rotate_orthogonal_flip_x() does but for 1- and 4-bit Bitmaps, where a single byte contains more than one pixel. * image.c: Reworked GdipImageRotateFlip to determine the rotation and whether a flip is required first and then call one of the two core rotation functions to do the appropriate operation. * bitmap.c, gdip.h: Moved the definition of the pixel stream code's struct StreamingState from the middle of bitmap.c to gdip.h. The functions were already being exported (non-static), but the structure was inaccessible making pixel streams unusable outside of bitmap.c. * gdip.h: Added prototypes for pixel stream functions so that they could be used by gdip_rotate_flip_packed_indexed() in image.c. 2005-10-21 Miguel de Icaza * hatchbrush.c (gdip_hatch_clone): Also copy and reference the brush. This bug was identified by Zoltan's change to the runtime where segfaults in unmanaged code are not translated into NullReferences. 2005-10-19 Jordi Mas i Hernandez * font.c: Make us more resistant to situations like bug #74761 2005-10-17 Ruediger Oertel * gifcodec.c: Switching from libungif to libgif 2005-10-10 Jordi Mas i Hernandez * graphics.c: fixes line width issues when drawing underline/strikeout 2005-10-10 Jordi Mas i Hernandez * graphics.c: remove unused vars and dead code * font.c: remove unused vars * bmpcodec.c: remove unused vars * general.c: remove unused vars * pathgradientbrush.c: remove unused vars * image.c: remove unused vars * jpegcodec.c: remove unused vars * region.c: remove unused vars * tiffcodec.c: remove unused vars * imageattributes.c: remove unused vars * gifcodec.c: remove unused vars * texturebrush.c: remove unused vars * matrix.c: remove unused vars * customlinecap.c: remove unused vars * bitmap.c: remove unused vars * pen.c: remove unused vars * pngcodec.c: remove unused vars * graphics-path.c: remove unused vars * lineargradientbrush.c: remove unused vars 2005-10-06 Peter Dennis Bartok * adjustablearrowcap.c: Removed unused vars * bitmap.c: Removed unused vars * font.c: Switched 0 to NULL 2005-10-06 Peter Dennis Bartok * general.c: Fixed bug in ucs2 termation code; code assumed a byte array, so we always terminated twice as many bytes in as we wanted to. This was also causing 'random' crashes at much later times since depending on the situation we'd write 0 past the end of ucs2_len (This is half of the bugfix for #74871 and #75534) 2005-10-06 Jordi Mas i Hernandez * gifcodec.c: Fixes a warning (an error since we use -Werror) when using libgif 4.0) 2005-10-06 Jordi Mas i Hernandez * image.c: Partially fixes 75063 * matrix.c: Some documentation about matrices 2005-10-03 Duncan Mak * graphics.c (make_arcs): * graphics-path.c (append_arcs): Helper functions for dividing the arcs into smaller segments. Properly handles negative starting angles and sweep angles. * graphics-path.c (GdipAddPathArc, GdipAddPathPie): * graphics.c (GdipDrawArc, make_pie): Simplified to make use of the new helper functions. 2005-09-20 Jordi Mas i Hernandez * image.c, gdip.h, image.c: Creates the surface and then creates the graphics context. This is not only reduces the operations need it, also and more avoids to lose the values that we have init into cairo. 2005-09-21 Peter Dennis Bartok * bmpcodec.c: The alpha value in a indexed color table is never valid. Since the indexed bitmap code uses the color value from the table directly, we need to always set the alpha to 0xFF. This matches MS behaviour (Custom cursors are a good testcase for this, since they are generated through an intermediate BMP step) 2005-09-20 Jordi Mas i Hernandez * bitmap.c: Fixes bug 76152 2005-09-19 Peter Dennis Bartok * graphics.c: Remove AA setting; fixes bug #76135. Needs to have a save restore of previous AA settings 2005-09-15 Jordi Mas i Hernandez * region.c: Speed ups CombineModeReplace mode and fixes setting Infite 2005-09-13 Jordi Mas i Hernandez * graphics.c: * gdip.h: - Fixes some default values - Fixes bug 76089 - GdipRestoreGraphics and GdipSaveGraphics save all the status - Fixes pixelOffsetMode setting 2005-09-13 Jordi Mas i Hernandez * region.c: Fixes region for combine (used in clipping) 2005-09-12 Jordi Mas i Hernandez * font.c: Fixes font creation and italic issues, death code * general.c: Fixes font creation and italic issues, death code * gdip.h: Fixes font creation and italic issues, death code 2005-09-09 Jordi Mas i Hernandez * graphics.c: Implements GdipFlush 2005-09-08 Peter Dennis Bartok * graphics.c: - MeasureOrDrawString: Fixed underline/strikethrough calculations - Removed old conditional code attempting to avoid cairo AA problems - Implemented setting/getting of AntiAlias variables - MeasureOrDrawString: Added code to handle font antialiasing options; still inoperative * gdip.h: Added fields to support antialias settings 2005-09-07 Jordi Mas i Hernandez * graphics.c: fixes cairo handles leaks * image.c: optimise and fix leaks 2005-09-06 Jordi Mas i Hernandez * graphics.c: Makes DrawString clipping not destroy previous clipping 2005-09-06 Jordi Mas i Hernandez * graphics.c: removes non-ansi comments or not longer need it * font.c: removes non-ansi comments or not longer need it * general.c: removes non-ansi comments or not longer need it * image.c: removes non-ansi comments or not longer need it * pen.c: removes non-ansi comments or not longer need it * gdip.h: removes non-ansi comments or not longer need it * lineargradientbrush.c: removes non-ansi comments or not longer need it 2005-09-06 Jordi Mas i Hernandez * graphics.c: Clipping support 2005-09-06 Jordi Mas i Hernandez * graphics.c: several fixes to rect/region clipping operations * region.c: fixes and include CombineModeReplace mode 2005-09-05 Jordi Mas i Hernandez * image.c: fixes return parameter and GdipLoadImageFromFileICM call * gdipImage.h: include GdipLoadImageFromFileICM definition * bitmap.c: new GDI calls * gdip.h: definitions 2005-08-26 Geoff Norton * graphics.c: Update the Quartz constructors for the new Cairo 1.0 API calls 2005-08-26 Jordi Mas i Hernandez * lineargradientbrush.c: fixes issues with angle 2005-08-26 Peter Dennis Bartok * hatchbrush.c: Wouldn't it be nice to clean the cairo stuff when destroying the brush 2005-08-26 Peter Dennis Bartok * image.c: Now scales/resizes images to destination rectangle * gdip.h: Removed gdip_cairo_set_surface_pattern() prototype * general.c: Removed gdip_cairo_set_surface_pattern() method, it's no longer used 2005-08-26 Peter Dennis Bartok * gdip.h, general.c: Removed gdip_cairo_set_surface_pattern_with_extend since it's no longer needed (replaced with less code directly in hatchbrush) 2005-08-26 Peter Dennis Bartok * hatchbrush.c: Fixed context leaks (We're also no longer abusing the passed cairo_t context as the pattern context) 2005-08-26 Peter Dennis Bartok * hatchbrush.c: Fixed 40% and plaid drawing, resolved ct corruption and nesting bugs 2005-08-26 Hisham Mardam Bey * hatchbrush.c: remove extra paint calls and fix cairo_save/restore calls. 2005-08-25 Peter Bartok * hatchbrush.c: Preventing 50% hatch brush ct from getting whacked (need to do all other styles as well) * lineargradientbrush.c: - Fixed missing initialization of brush matrix - Preventing cairo context from getting whacked 2005-08-25 Jordi Mas i Hernandez * image.c: fixes issues of images drawn on the wrong place 2005-08-25 Jordi Mas i Hernandez * graphics.c: - Fixes leaking on GdipDeleteGraphics - Fixes GdipGetDC bug exposed by Marek changes into graphics.cs 2005-08-25 Jordi Mas i Hernandez * hatchbrush.c: use correct enumerator for cairo calls * matrix.c: fixes GdipShearMatrix method 2005-08-25 Hisham Mardam Bey * hatchbrush.c: removed cairo_paint calls, we still have a few, must look into them. Fixed remaining cairo_paint and patter problems. * general.c: added gdip_cairo_set_surface_pattern_with_extend * gdip.h: added gdip_cairo_set_surface_pattern_with_extend 2005-08-24 Peter Bartok * hatchbrush.c: Fixed 50% hatchbrush drawing. Still need to fix all other 50 gazillion hatchbrushes :-( 2005-08-24 Peter Bartok * gdip.h: Removed prototypes for internal strikethrough and underline functions; those are no longer used * font.c: - Cairo switched to positive font descent number, fixed code to match - Removed unused methods for strikethrough and underline; drawstring handles that behaviour internally * graphics.c (DrawString): Cairo switched to positive descent values for font extents, switched the code to handle that 2005-08-24 Jordi Mas i Hernandez * graphics.c: fixes gcc 4 warning * general.c: from_cairoformat_to_content function * texturebrush.c: fixes texture brushes * matrix.c: * All the create function allocate the memory * Fixes GdipCloneMatrix function * Fixes GdipIsMatrixEqual * Fixes GdipIsMatrixInvertible (always returned true) * Fixes GdipGetMatrixElements (wrong order) 2005-08-24 Hisham Mardam Bey * pen.c : remove debugging printf. 2005-08-24 Jordi Mas i Hernandez * hatchbrush.c, lineargradientbrush.c. Cairo has changed the format enum parameter for cairo_surface_create_similar. This fixes many samples not running. 2005-08-23 Peter Bartok * graphics.c: The original CalculateStringWidths method was dependent on FT and internal knowledge of cairo font matrix behaviour, and the function broke with the newer cairo due to changes to this behaviour. Renamed the original to CalculateStringWidthsUTF8 and wrote a new method which uses cairo_text_extents to calculate character widths. This is somewhat slower but works font-backend independent. * general.c: Added ucs2 to utf8 char encoder and decoder (allows faster calculations than the malloc-dependent utf8 string functions) * gdip.h: Added prototypes for utf8 character functions 2005-08-22 Jordi Mas i Hernandez * region.c: fixes memory leaks * pen.c: releases the solid brush when is owned by us * gdip.h: releases the solid brush when is owned by us 2005-08-19 Zoltan Varga * gifcodec.c (gdip_save_gif_image_to_file): Fix compilation without GIF support. 2005-08-19 Jordi Mas i Hernandez * graphics.c: Standarize mem alloc/free with GdipAlloc/GdipFree * font.c: Standarize mem alloc/free with GdipAlloc/GdipFree * bmpcodec.c: Standarize mem alloc/free with GdipAlloc/GdipFree * general.c: Implement linked list to keep track of leaks * image.c: Standarize mem alloc/free with GdipAlloc/GdipFree * region.c: Standarize mem alloc/free with GdipAlloc/GdipFree * jpegcodec.c: Standarize mem alloc/free with GdipAlloc/GdipFree * imageattributes.c: Standarize mem alloc/free with GdipAlloc/GdipFree * gifcodec.c: Standarize mem alloc/free with GdipAlloc/GdipFree * texturebrush.c: Standarize mem alloc/free with GdipAlloc/GdipFree * bitmap.c: Standarize mem alloc/free with GdipAlloc/GdipFree * stringformat.c: Standarize mem alloc/free with GdipAlloc/GdipFree * pen.c: Standarize mem alloc/free with GdipAlloc/GdipFree * gdip.h: define GdipCalloc * graphics-path.c: Standarize mem alloc/free with GdipAlloc/GdipFree 2005-08-19 Jordi Mas i Hernandez * bmpcodec.c: fixes codec for 24 bits bmps. It passes the tests again. 2005-08-18 Jordi Mas i Hernandez * graphics.c: C ANSI language fixes * bmpcodec.c: C ANSI language fixes * general.c: C ANSI language fixes * tiffcodec.c: C ANSI language fixes * bitmap.c: C ANSI language fixes 2005-08-17 Jordi Mas i Hernandez * region.c: Rewritten region support 2005-08-10 Jordi Mas i Hernandez * region.c: Rewritten gdip_combine_intersect method 2005-08-09 Jordi Mas i Hernandez * region.c: Optimise union operation 2005-07-21 Duncan Mak * graphics.c (make_pie): Fix #75475. Use sweepAngle (instead of endAngle) when drawing the arcs. "The arc always starts at 0. For the fill method the effect is that a pie ending at 360 will fill the whole circle..." Patch from Patrick Michel . 2005-07-01 Jonathan Gilbert * bitmap.c: Fixed bug in GdipCreateBitmapFromScan0's default palette initialization. Corrected GdipBitmapGetPixel to permit the operation on indexed bitmaps (uses pixel streams :-). 2005-06-30 Peter Bartok * general.c (ucs2_to_utf8): Added argument to allow specifying the string length (to allow converting substrings) * graphics.c (MeasureOrDrawString, MeasureString): Fixed handling of Tabs, now properly advances to the next valid tab stop, if tabs are specified. * font.c, image.c: Changed usage of ucs2_to_utf8 to match new prototype * gdip.h: - Removed TabWidth from GpStringDetailStruct, was obsoleted by tab-redo - Changed prototype of ucs2_to_utf8(), added length argument 2005-06-21 Geoff Norton * graphics.c (GdipCreateFromQuartz_macosx): Set the size of the context in the bounds structure. Fixes #75326 2005-06-13 Peter Bartok * bitmap.c, image.c, gdip.h, bmpcodec.c, jpegcodec.c, tiffcodec.c, gifcodec.c, gifcodec.h, pngcodec.c, pngcodec.h: Re-applied two previous changes, since #75254 is now fixed 2005-06-13 Peter Bartok * Rolled back last two checkins, to r45601, pre palette patch, due to the regression caused with Icons (bug #75254) 2005-06-07 Geoff Norton * bmpcodec.c: * image.c: Fix some (un)signed mismatch issues so that gdiplus will compile on gcc 4.0 again with -Werror 2005-05-30 Jonathan Gilbert * bitmap.c: Added indexed pixel formats to gdip_is_a_supported_pixelformat(). * bitmap.c: Added gdip_is_an_indexed_pixelformat(). Added its prototype to gdip.h; not sure if this is the correct place. * bitmap.c: Added support for PixelFormat.Format4bppIndexed to GdipCreateBitmapFromScan0 (maps to CAIRO_FORMAT_A8, like PixelFormat.Format8bppIndexed). Palettes will be created as needed. Bitmaps with a 4bpp indexed pixel format will be given 256-entry ColorPalette structures, as the cairo_format indicates 8-bit data. * bitmap.c: GdipCreateBitmapFromScan0 now computes stride for indexed pixel formats differently, and does not convert indexed pixel formats to 32-bit RGB. It also makes images with 32-bit pixel formats initially black instead of initially transparent and fills the palette with the default values for 1-, 4- and 8-bpp indexed images. * bitmap.c: Added support for indexed images to gdip_bitmap_clone_data_rect(). * bitmap.c: Rewrote GdipBitmapLockBits () to be maintainable while supporting indexed pixel formats. Added gdip_can_window_without_copy (), gdip_is_a_32bit_pixelformat (), gdip_make_alpha_opaque () and gdip_is_an_alpha_pixelformat (). * bitmap.c: Moved gdip_from_ARGB_to_RGB () and gdip_from_RGB_to_ARGB () above gdip_bitmap_change_rect_pixel_format (), so that gdip_bitmap_change_rect_pixel_format () can call them. * bitmap.c: Added struct StreamingState and methods gdip_init_pixel_stream (), gdip_pixel_stream_has_next (), gdip_pixel_stream_get_next () and gdip_pixel_stream_set_next () to work with Bitmaps of various formats in an abstract way. gdip_pixel_stream_get_next () returns and gdip_pixel_stream_set_next () accepts 32-bit ARGB values for 15, 16, 24, 32, 48 and 64 bit formats and palette indices for 1, 4 and 8 bit formats. gdip_pixel_stream_get_next () and gdip_pixel_stream_set_next () cannot be mixed; call either one or the other on a given stream, but never both. * bitmap.c: Rewrote gdip_bitmap_change_rect_pixel_format to use pixel streams, which adds support for indexed pixel formats and increases maintainability. * bitmap.c: Added check to GdipBitmapSetPixel ensuring that the bitmap is not indexed (despite what MSDN says, in practice Microsoft's implementation rejects SetPixel on indexed Bitmaps). * bitmap.c: Added gdip_convert_indexed_to_rgb (), which will be used by the functions implementing DrawImage, since gdip_bitmap_ensure_surface () is not compatible with indexed image data. * image.c: Added support for indexed pixel formats in GdipDrawImageRect and GdipDrawImageRectRect. The support is for the image being drawn to be indexed, not the image being drawn on. :-) * image.c: Implemented GdipGetImagePalette (), GdipSetImagePalette () and GdipGetImagePaletteSize (). * bmpcodec.c: Corrected gdip_bitmap_fill_info_header ()'s interpretation of pixel bit widths. * bmpcodec.c: Added include directive for gdipImage.h, for utility function gdip_get_pixel_format_bpp (). * bmpcodec.c: Updated gdip_bitmap_save_bmp () to save the palette for indexed bitmaps. Also modified the save function to not swap bytes for indexed pixel formats on big-endian architectures. * bmpcodec.c: Updated gdip_read_bmp_image_from_file_stream () to maintain 1, 4 and 8 bpp indexed data instead of converting it on-the-fly to 32 bpp RGB data. * bmpcodec.c: Updated gdip_get_pixelformat () to translate a bit width of 1 into Format1bppIndexed. * bmpcodec.c: Added support for decoding 4- and 8-bit RLE bitmaps. * gifcodec.c: Updated gdip_save_gif_image () to support saving indexed images. Also, an off-by-one error in the 32-bit ARGB side of the encoder was corrected (the image was translated left one pixel). * jpegcodec.c: Updated gdip_save_jpeg_image_internal () to reject 8bpp indexed images that are not grayscale (the previous behaviour was to assume all 8bpp indexed images are grayscale). * tiffcodec.c: Updated gdip_save_tiff_image () to reject indexed images as NotImplemented, for now at least. * pngcodec.c: Updated gdip_load_png_image_from_file_or_stream () to handle 1-, 4- and 8-bit PNG files separately, without upsampling the data to 32-bit RBG. * gdip.h: Fixed the set_pixel_bgra () macro; a lack of parentheses and no cast down to 'unsigned char' was making expressions like set_pixel_bgra (&array[i], ...) fail to compile, and it wasn't a proper statement; it could not be used in a construct like "if (...) set_pixel_bgra(...); else ...;". 2005-05-25 Peter Bartok * graphics.c, font.c, image.c, general.c, gdip.h: Replaced UTF8/UTF16 conversion with UCS2/UTF8 conversion (The MS APIs do not use UTF16) 2005-05-24 Duncan Mak * graphics-path.c (append_arc): Append PathPointTypeLine instead of PathPointTypeStart, so that arcs will be joint properly. This fixes bug #75015. Thanks to Elliot Paquette for reporting and fixing this bug. 2005-05-24 Duncan Mak * graphics.c (make_pie, GdipDrawArc): * graphics-path.cs (GdipAddPathArc, GdipAddPathPie): Rewrote the code for calculating arcs: instead of drawing two arcs via a mid-point, draw multiple arcs at intervals of 90 degrees. This results in prettier arcs/pies and a better match to the output produced by MS. 2005-05-20 Duncan Mak * graphics-path.c (GdipAddPathArc): Added a special case for drawing ellipses, and remember to use abs() with 'sweepAngle' to ensure correctness when the angle is negative. This is basically a port of the previous commit. 2005-05-09 Duncan Mak * graphics.c (make_pie, GdipDrawArc): when evaluating angles, always use abs(). This fixes the drawing of arcs and pies when the sweep angle is negative. Bug #63360 has also been fixed. This was a bug reported by Ravindra in August '04 about a hang when "the difference between width and height of rectangle is 1 and angles sum is close to 360". My change doesn't affect this bug. #63360 didn't hang in libgdiplus 1.1.7 as is, so it was actually fixed by the Cairo guys. 2005-05-06 Jordi Mas i Hernandez * image.c: Only free memory blocks that are owned by us 2005-05-05 Jordi Mas i Hernandez * graphics.c: - Empty the region before working with it - Move printf into debug bloc * region.c: - Fixes infinite regions 2005-04-28 Jordi Mas i Hernandez * tiffcodec.c: Inits Byte and ByteCount to avoid releasing not allocated blocks GdipDisposeImage. Fixes testgdi.c test. 2005-04-27 Jordi Mas i Hernandez * graphics.c: - Set bounds when using a X Drawable - Fixes GdipGraphicsClear to make it work with X Drawables * gdip.h: define new function 2005-04-20 Jackson Harper * hatchbrush.c: Don't require that hatch brushes be created on a context with an attached bitmap. 2005-04-07 Neale Ferguson * gifcodec.c: Eliminate warning message and optimize breakdown of RGB field. 2005-03-30 Peter Bartok * font.c: Added locking for font cache * general.c: Grab DPIs on startup, avoid potential race condition with multiple threads using gdiplus and trying to get dpi 2005-03-29 Peter Bartok * bitmap.c: Removed set_pixel_bgra() and get_pixel_bgra() functions, re-made them as macros, since inlining only works for static functions * gdip.h: Added set/get_pixel_bgra macros; removed prototypes * imageattributes.c: Fixed code to work with set/get_pixel_bgra macros * bmpcodec.c: Added code to deal with the (wrong) assumption that Stream.Read will always return the number of bytes requested if the stream end has not been hit (related to bug #72588) 2005-03-22 Jordi Mas i Hernandez * image.c, bitmap.c: implement gdip_image_clone to copy Image structs properly and fix GdipCloneImage memory corruption problems. * gdip.h: inline set_pixel_bgra/get_pixel_bgra functions 2005-03-22 Jordi Mas i Hernandez * bmpcodec.c: - Fixes 24 bits bitmap loading - Fixes leaks when exiting on error conditions - Sets the img->image.pixFormat propertly - Sets bmfh.bfOffBits when saving *before* start using it * imageattributes.c - Implements colour matrix processing and GdipSetImageAttributesColorMatrix * bitmap.c: - Fixes stride calculation (was causing many problems) - Moves set_pixel_bgra into bitmap.c and creates get_pixel_bgra 2005-03-18 Peter Bartok * graphics.c: Instead of throwing NotImpl exception, we display a message that the function isn't implemented yet on the TransformPoints functions 2005-03-18 Peter Bartok * imageattributes.c: Instead of throwing NotImpl exception, we display a message that the function isn't implemented yet on the SetColorMatrix function 2005-03-18 Peter Bartok * graphics-path.c: Instead of throwing NotImpl exception, we display a message that the function isn't implemented yet on the Bounds functions 2005-03-18 Peter Bartok * gifcodec.c: Fixed prototype for no gif lib codepath; was missed with GCC4 changes 2005-03-17 Jordi Mas i Hernandez * pngcodec.c: fixes warnings for GCC4 * gdip.h: fixes warnings for GCC4 * graphics.c: fixes warnings for GCC4 * font.c: fixes warnings for GCC4 * bmpcodec.c: fixes warnings for GCC4 * image.c: fixes warnings for GCC4 * jpegcodec.c: fixes warnings for GCC4 * tiffcodec.c: fixes warnings for GCC4 * gifcodec.c: fixes warnings for GCC4 * texturebrush.c: fixes warnings for GCC4 * gifcodec.h: fixes warnings for GCC4 * bitmap.c: fixes warnings for GCC4 * pngcodec.c: fixes warnings for GCC4 2005-03-17 Peter Bartok * image.c (iGdipLoadImageFromDelegate_linux): Now calls GetHeader delegate for determining the image type, instead of GetBytes, to allow usage with non-seekable streams * gdipImage.h: Changed GdipLoadImageFromDelegate_linux() prototype to include the new StreamGetHeader method * gdip.h: Added definition for new GetHeader delegate 2005-03-15 Jordi Mas i Hernandez * graphics.c: Fixes GdipSetWorldTransform. We should copy the passed matrix not to point to it 2005-02-24 Jordi Mas i Hernandez * region.c: Fixes IsVisible methods 2005-02-22 AJ Frantz * bitmap.c: 64bit stride fixes. 2005-02-20 Peter Bartok * bitmap.c: More 64bit stride fixes * pngcodec.c: 64bit stride fixes 2005-02-20 Peter Bartok * gdip.h: Added pixman.h include to get pixman_bits_t * bitmap.c: Made stride calculations based on pixman_bits_t, to properly work on 64bit platforms as well 2005-02-19 Peter Bartok * graphics.c: - Setting the appropriate cairo operator when GdipSetCompositingMode is called. - Added (very hacked) GdipMeasureCharRanges() 2005-02-19 Geoff Norton * bitmap.c: (GdipBitmapSetPixel) Make this endian aware. 2005-02-18 Miguel de Icaza * graphics.c: Implement GdipGetCompositingMode, GdipSetCompositingMode, GdipGetCompositingQuality, GdipSetCompositingQuality: The quality ones dont do anything. * solidbrush.c: Setup the alpha channel, only if the composite mode is set to ComposintingModeSourceOver (the default) that does alpha blending. * pen.c (GdipGetPenEndCap, GdipSetPenEndCap): Avoid crashing, even if we dont do anything with them yet. 2005-02-16 Peter Bartok * bitmap.c (gdip_bitmap_clone_data_rect): Patch suggested by Scott Mohekey, preventing use of uninitialized variable 2005-02-16 Miguel de Icaza * bitmap.c: Handle the case where GdipAlloc returns NULL, propagate the error everywhere. 2005-02-10 Geoff Norton * general.c: Drop the last usage of GDIPLUS_NOX, if we can't open the display fall back to 96.0f (changed new default to 96 from 72) 2005-02-06 Geoff Norton * gifcodec.c: Fix a typo 2005-02-03 Jordi Mas i Hernandez * region.c: Call GdipSetInfinite for empty regions 2005-01-28 Peter Bartok * gdip.h, graphics.c: Switched hDC type from int to void. That's what MS has for them, and also, it is required to compile on 64bit platforms (fixes bug #71823) 2005-01-28 Geoff Norton * bmpcodec.c: Make this endian aware for saving bitmaps. 2005-01-28 Peter Bartok * pathgradientbrush.c (GdipMultiplyPathGradientTransform): Don't destroy the matrix we're about to destroy. Fixes bug introduced in r39075. Patch by Peter Johanson 2005-01-27 Geoff Norton * tiffcodec.c: Make this endian aware for image saving as well 2005-01-26 Peter Bartok * pngcodec.c (gdip_save_png_image_to_file_or_stream): Moved definition of variable into new block, to keep Ansi compilers happy, also helped readability by giving both Big and Little endian their own loop 2005-01-26 Geoff Norton * tiffcodec.c: Fix problem with file callback writer. 2005-01-26 Geoff Norton * pngcodec.c: jpegcodec.c: gifcodec.c: Make these write files properly on big endian machines 2005-01-26 Peter Bartok * bmpcodec.c: We convert all images to 32bit, no longer need the palette 2005-01-26 Geoff Norton * tiffcodec.c: Use the tiff callback functions to allow tiff reading to work on Mac. 2005-01-26 Geoff Norton * gifcodec.c: Use set_pixel_bgra so that big endian machines can load gif and have them look right. 2005-01-26 Geoff Norton * jpgcodec.c: Use set_pixel_bgra so that big endian machines can load jpgs and have them look right. 2005-01-26 Geoff Norton * bmpcodec.c: Move set_pixel_bgra to gdip.h * gdip.h: Add set_pixel_bgra * pngcodec.c: Use set_pixel_bgra so that big endian machines can load pngs and have them look right. 2005-01-26 Peter Bartok * bmpcodec.c: Since we 'upgrade' all bitmaps to 32bit, make sure we store the format as such, too 2005-01-26 Peter Bartok * bmpcodec.c: Implemented 32bit support; while no 32bit BMP files exist, we will generate those internally, to support icons and cursors 2005-01-26 Peter Bartok * bmpcodec.c: - Fixed generation of color tables (RGBA order) - Fixed monochrome image translation 2005-01-26 Geoff Norton * bmpcodec.c: Swap from RGBA to ABGR on big endian systems. 2005-01-26 Peter Bartok * bmpcodec.c: Fixed R/B swap mistake 2005-01-26 Peter Bartok * bmpcodec.c: Cleaner version, also a bit faster 2005-01-26 Peter Bartok * bmpcodec.c: Added ability to read 1, 4 and 8 bit images as well as 24 bit images, simplified readying by doing the read/assignment and RGB to ARGB in one go 2005-01-20 Peter Bartok * graphics.c: - Using new macro to deal with post 0.3.0 cairo changes in font APIs - Added Geoff Norton's changes for Mac OS X support * font.c: Using new macro to deal with post 0.3.0 cairo changes in font APIs * gdip.h: - Changes to match cairo 0.3.0 release - Added code for post 0.3.0 cairo support 2005-01-20 Jackson Harper * graphics.c: These are floats. 2005-01-17 Peter Bartok * graphics.c: * lineargradientbrush.c * lineargradientbrush.h: * pathgradientbrush.c: * matrix.c: * texturebrush.c: * texturebrush.h: * pen.c: * gdip.h: Another attempt at dealing with the cairo change making the cairo_matrix_t type internal. I gave Jackson some wrong info in the previous attempt. 2005-01-14 Jackson Harper * graphics.c: * lineargradientbrush.c * lineargradientbrush.h: * pathgradientbrush.c: * matrix.c: * texturebrush.c: * texturebrush.h: * pen.c: * gdip.h: Current cairo in cvs has made the cairo_matrix_t variable internal. These are updates to compile with current cairo, all the changes should work with older versions of cairo as well. 2005-01-14 Jackson Harper * gdip.h: Remove the hdc stuff that was used with wine. Add fields for the x display and drawable so that they can be used when creating a graphics object from an hdc. * graphics.c (GdipCreateFromHDC): Implement, just create a new graphics object and copy the drawable from the old one. * graphics.c (GdipCreateFromXDrawable_linux): Copy the display and drawable params to the graphics structure so they can be used in CreateFromHDC. 2005-01-07 Peter Bartok * graphics-path.c, hatchbrush.c: Applied patch submitted by andersb@blacksun.ca to compile with gcc2, fixes bug #65708 2005-01-07 Peter Bartok * image.c (GdipDrawImageRect): Start a new path before calling cairo_translate, it seems thats what other cairo apps do, and it fixes the problem Jackson reported, where images would not show after text was drawn 2005-01-07 Peter Bartok * font.c: replaced tempnam() with mkstemp() as requested by tempnam() documentation * general.c: Removed c++ - ism * gdip.h: Added unistd.h for functions used in font.c 2005-01-06 Miguel de Icaza * tiffcodec.c: Cast the third argument to thandle_t to supress errors on certain distros. Fixes 70456 2005-01-05 Peter Bartok * graphics.c (MeasureOrDrawString): If the string doesn't fit in the bounding box and no breaks are allowed or possible, the code will now not loop anymore. 2005-01-04 Peter Bartok * graphics.c (MeasureOrDrawString): Return 0 instead of InvalidParameter if the string being measured has zero length, this matches MS behaviour; also added earlier check for zero length to avoid utf conversion overhead. 2005-01-02 Jordi Mas * graphics.c, font.c, general.c, bmpcodec.h, image.c, region.c, jpegcodec.h, imageattributes.c, gdipImage.h, tiffcodec.h, gifcodec.h,bitmap.c, stringformat.c, pngcodec.h, Makefile.am, gdip.h: removes old Wine glue code * gdip_win32.c, gdip_win32.h: remove it 2004-12-30 Miguel de Icaza * bitmap.c (gdip_bitmap_clone): Also clone the ->Bytes array which is fileld in by gifcodec.c and image.c as well 2004-12-28 Zoltan Varga * graphics.c (CalculateStringWidths): Fix 64 bit issues. 2004-12-27 Zoltan Varga * gdip.h: Make the members of various structures the same size as their managed counterparts on 64 bit platforms. * gdip_win32.h: Do not define __stdcall under amd64. 2004-12-16 Peter Bartok * graphics.c: - GdipGetDC(): Removed Wine logic - GdipReleaseDC(): Removed Wine logic * font.c: - Removed CreateFontFromHDCorHfont (Wine specific) - GdipCreateFontFromDC(): Removed Wine logic - GdipCreateFontFromHfont(): Removed Wine logic - GdipGetLogFontA(): Removed Wine logic - Added non gdi+ GetFontMetrics call to support MWF, since DrawString/MeasureString do not support retrieving the ascent/descent of a font * gdip_win32.c: Removed references to Wine GetTextMetrics 2004-12-16 Peter Bartok * graphics.c (MeasureOrDrawstring): Removed extra padding calc 2004-12-07 Geoff Norton * graphics.c, gdip_win32.h, gdip.h: Initial support for the Quartz backend to cairo. 2004-11-29 Jordi Mas * image.c: fixes bug #69089 2004-11-18 Ravindra * graphics.c (GdipGraphicsClear): Save and restore the existing graphics settings. Otherwise, we lose the cached brush settings. 2004-11-11 Jordi Mas * gdip.h, font.c, general.c: implements font caching 2004-11-10 Peter Bartok * graphics.c (MeasureOrDrawString): Enabled clipping again, cairo appears to have the required fixes for it now. 2004-11-10 Peter Bartok * graphics.c (MeasureOrDrawString): Cleanup of earlier fix 2004-11-10 Peter Bartok * graphics.c (MeasureOrDrawString): Removed some unneeded cairo calls to improve performance; added comments 2004-11-10 Peter Bartok * general.c: - Removed _install_font_matrix(), now in graphics.c - Removed _gdip_cairo_matrix_compute_scale_factors(), now part of the new _install_font_matrix() - Removed gdip_utf8_to_glyphs(), now combined with CalculateStringWidths * graphics.c: - Renamed CalculateStringSize to CalculateStringWidths - Streamlined CalculateStringSize, combined with gdip_utf8_to_glyphs - Removed unused parts of gdip_utf8_to_glyphs() and CalculateStringSize - Dropped unneeded allocation of glyph memory * gdip.h: - Removed gdip_utf8_to_glyphs prototype 2004-11-09 Peter Bartok * graphics.c (MeasureOrDrawString): Added check to prevent crash if bogus data is returned from freetype. (MeasureOrDrawString): Instead of calling GdipFillRectangle we call cairo directly to draw underlines and strikeouts (GdipDrawLine): Jackson's matrix patch to align pixels and effectively avoid AA lines (GdipDrawRectangle): Same patch as for GdipDrawLine 2004-11-04 Miguel de Icaza * graphics.c (CalculateStringSize): Free leaked Glyphs. 2004-10-29 Jordi Mas * gdip.h, font.c: cache fontfamily details. Performance enhancement. 2004-11-05 Ravindra * graphics-path.c: Fixed int_to_float () function. We should not increase the pointer that is to be returned. 2004-10-29 Jordi Mas * font.c gdip.h gdip_win32.h gifcodec.c graphics.c matrix.c pathgradientbrush.c texturebrush.c tiffcodec.c: fixes issues with strict C compilers 2004-10-29 Jordi Mas * bitmap.c font.c graphics-path.c graphics.c image.c imageattributes.c lineargradientbrush.c stringformat.c: fixes issues with strict C compilers 2004-10-28 Miguel de Icaza * graphics.c (GdipSetClipRegion): Fix the test, it should test for either value being null. 2004-10-28 Ravindra * tiffcodec.c: We should not close the MemoryStreams that we got from user. 2004-10-28 Ravindra * bitmap.c: Fix for bug #68270. We need to initialize frames for images created from MemoryStreams as well. 2004-10-19 Jordi Mas * image.c: Speeds up GdipDrawImageRect arround 10% 2004-10-19 Jordi Mas * imageattributes.c: fixes alpha color setting 2004-10-19 Ravindra * jpegcodec.c: Fixed bug #68117. Retrieves the proper resolution info from Jpeg image. 2004-10-17 Jordi Mas * image.c: bug fix, restores pattern after image drawing 2004-10-09 Ravindra * hatchbrush.h: Added 'pattern' member of cairo_pattern_t type to GpHatch struct. * hatchbrush.c: Added support for caching. * lineargradientbrush.h: Removed the 'changed' member from GpLineGradient struct. It is moved to GpBrush struct. * lineargradientbrush.c: Added support for caching. * pathgradientbrush.h: Removed the 'changed' member from GpPathGradient struct. It is moved to GpBrush struct. * pathgradientbrush.c: Added support for caching. * texturebrush.h: Removed the 'changed' member from GpTexture struct. It is moved to GpBrush struct. * texturebrush.c: Added support for caching. 2004-10-09 Ravindra * solidbrush.h: Added color components A,R,G,B to SolidFill struct for caching. * solidbrush.c: Added support for caching. * pen.c: Added support for caching. 2004-10-09 Ravindra * gdip.h: Added 'last_pen' and 'last_brush' members to GpGraphics struct for caching. * brush.h: Added a boolean type 'changed' member to GpBrush. * brush.c: Added caching, to avoid multiple brush setups. * graphics.c: Initialization of cached pen and brush. Removed unwanted calls to cairo_save/cairo_restore. 2004-10-08 Ravindra * image.c: Fixed GdipDisposeImage function. 2004-10-05 Ravindra * pen.c: Fix for the bug #66665. Using a dirty bit on pen to avoid multiple setups has a flaw. It does not work well when we use the different pens with the same graphics. 2004-09-27 Mart Roosmaa * general.c: Fallback to 72 dpis if we can not determine this information. 2004-09-22 Ravindra * jpegcodec.c: Set proper image flags for JPEG colorspaces. 2004-09-22 Ravindra * jpegcodec.c: Added support for CMYK and YCCK colorspaces. Fixes bug #50081. 2004-09-16 Ravindra * gdip.h: Removed the redundant graphics member from GpImage struct. * bmpcodec.c: Removed the unnecessary usage of GpImage->graphics. * gifcodec.c: Same as above. * graphics.c: Same as above. * jpegcodec.c: Same as above. * pngcodec.c: Same as above. * tiffcodec.c: Same as above. * image.c: Same as above and removed some commented code. Fixed GdipGetImageDimensions and GdipImageGetFrameDimensionsList functions. Applied a fix from David Mitchell for bug #66055 in GdipGetImageGraphicsContext function. 2004-09-15 Ravindra * graphics.c: Applied a fix from David Mitchell for bug #65963 in GdipDeleteGraphics function. 2004-09-10 Ravindra * image.c: Fixes a bug in DrawImageRect function. Reset the matrix after drawing the image. 2004-08-21 Ravindra * gifcodec.c: Return UnknownImageFormat instead of NotImplemented when required libraries are not installed. * jpegcodec.c: Same. * pngcodec.c: Same. * tiffcodec.c: Same. 2004-08-17 Ravindra * font.c: Fix for bug #63098. 2004-08-05 Ravindra * font.c: Fixed GdipDeleteFont function. 2004-08-02 Ravindra * graphics.c: Commented out cairo_clip calls from GdipDrawString, as these were causing problems. Thanks to Peter for suggesting this fix. This fixes, bug #60386, #60663, #61414. These bugs were actually because of some problem with Cairo clipping. And, these are not reproducable with Cairo cvs, because Cairo seems to have some changes which have solved the problem with clipping in Cairo. Also, fixed gdip_plot_path function to handle path point types properly. 2004-07-30 Ravindra * font.c: Fixed GdipGetEmHeight function. 2004-07-30 Sanjay Gupta * tiffcodec.c: Added page no information while saving a multi page tiff file. 2004-07-27 Sanjay Gupta * tiffcodec.c: Fixing issues in saving multiple images to a file. 2004-07-26 Sanjay Gupta * image.c: Some memory management. 2004-07-26 Sanjay Gupta * bitmap.c: Initialization of data members in gdip_bitmap_init(). * gdip.h: Corrected casing in BitmapData structure. * gifcodec.c: Casing changes, because of change in gdip.h. 2004-07-23 Sanjay Gupta * tiffcodec.c: Corrected the sequence of writing information to tiff file. 2004-07-23 Ravindra * stringformat.c: Fixed GdipCloneStringFormat function and some formatting (replaced 8 spaces by tabs). 2004-07-22 Sanjay Gupta * gdip.h: Modified GdipBitmapData structure to hold information about position and graphic control extension for a gif frame. * bitmap.c: Modified gdip_bitmap_dispose (). * gifcodec.c: Corrected memory handling while saving frames to a gif file, implemented reading and writing Graphic Control Extension data and added a cool hack from Raja, which reduced size of our gif file. (30% saving in size on my sample file with new implementation). 2004-07-22 Ravindra * gdip.h: Added CharacterRange stuct. Added 'charRanges' and 'charRangeCount' members in GpStringFormat struct. Added function declarations for GdipMeasureCharacterRanges, GdipGetStringFormatMeasurableCharacterRangeCount and GdipSetStringFormatMeasurableCharacterRanges. * graphics.c: Added stub for GdipMeasureCharacterRanges. * stringformat.c: Implemented following two functions, 1. GdipGetStringFormatMeasurableCharacterRangeCount and 2. GdipSetStringFormatMeasurableCharacterRanges. Corrected default values for substitute and trimming in GdipStringFormatGetGenericDefault function. Corrected default value for substitute in GdipStringFormatGetGenericTypographic function. Also, Added null checks. 2004-07-22 Sanjay Gupta * tiffcodec.c: Implemented saving multiple pages of an image to a tif file. 2004-07-21 Ravindra * gdip.h: Added position members to GpPathIterator stuct. Added start_new_fig flag to GpPath struct. * graphics-path.c: Fixed and implemented various functions. Added null checks and some code formatting. Fixed: (append) (GdipClonePath) (GdipAddPathClosedCurve2) (GdipAddPathRectangle) (GdipAddPathRectangles) (GdipAddPathRectanglesI) (GdipAddPathEllipse) (GdipAddPathPath). Implemented: (GdipStartPathFigure) (GdipClosePathFigures). * graphics-pathiterator.c: Some fixes and implemented missing subpath functions. 2004-07-21 Sanjay Gupta * gifcodec.c: Minor modifications. 2004-07-20 Sanjay Gupta * gifcodec.c: Implemented saving multiple frames of an image to a gif file. 2004-07-16 Ravindra * Makefile.am: Added graphics-pathiterator.c to the sources list. * gdip.h: Corrected GpPathPointEnum and added GpPathIterator stuct. * graphics-path.c: Fixed GdipDeletePath, GdipResetPath, GdipSetPathMarker, GdipGetPathLastPoint, GdipAddPathLine and implemented GdipClosePathFigure and some formatting. * graphics-path.h: Added function declarations for graphics-path iterator. * graphics-pathiterator.c: First implementation. 2004-07-16 Sanjay Gupta * image.c: Resolved a crash which was occuring because of attempting to free same memory twice. 2004-07-14 Ravindra * adjustablearrowcap.c: Added a note. * customlinecap.c: Added a note. * brush.h: Moved common internal structs in here from lineargradientbrush.c. These will be used by pathgradientbrush also. * graphics-path.h: Corrected some function signatures. * graphics-path.c: Corrected some function signatures and return 'NotImplemented' status instead of 'Ok' in unimplemented functions. * lineargradientbrush.[ch]: Moved common internal structs from here to brush.h. And, some minor corrections. * pathgradientbrush.[ch]: Tested and fixed all the properties and implemented all the missing functions. Now, we are missing only the setup function and it can be done only after cairo supporting the required pattern for this brush. Also, corrected indentation. 2004-07-13 Sanjay Gupta * tifcodec.c: Implemented functionality to read all the frames present. 2004-07-12 Ravindra * gdip.h: Added 'interpolation' member in GpGraphics struct. Fixing bug #61400. * bitmap.c: Check for null before initializing the GpBitmap. * general.c: Added a helper function for converting an InterpolationMode value to cairo_filter_t. Fixing bug #61400. * graphics.c: Set the cairo filter on the surface as per the interpolation mode set. Fixed GdipSet/GetInterpolationMode functions. Fixing bug #61400. * image.c: Set the cairo filter on the surface as per the interpolation mode set. Fixing bug #61400. 2004-07-09 Ravindra * lineargradientbrush.c: Implemented GdipSetLineSigmaBlend function. * general.c: Added gdip_erf function used for setting sigma blend by gradient brushes. 2004-07-09 Sanjay Gupta * gdip.h: Modified FrameDimensionInfo structure to carry data related to various frames of a multi frame image. The structure is now renamed to FrameInfo. * gifcodec.c: Implemented functionality to read all the frames present. * image.c: Implemented SelectActiveFrame() method. Modified associated memory disallocation and changes while reading single frame image. 2004-07-07 Ravindra * pngcodec.c: Fixes saving RGB file and one perf improvement in image loading. Fixes bug #61156. 2004-06-29 Jordi Mas * pngcodec.c: fixes saving 24-bit images (it was saving corrupted files before) 2004-06-29 Jordi Mas * tiffcodec.c: fixes saving images to stream. It was giving an exception before 2004-06-25 Ravindra * lineargradientbrush.c: Couple of fixes and some missing bits. Also implemented GdipSetLineLinearBlend function. * pen.c: Changed return status of GdipSetCompoundArray to Ok. 2004-06-24 Ravindra * graphics.c: Modified GdipFillXXX operations to make use of the matrix set by brush setup. Also, moved all the GdipFillXXX functions to one place. 2004-06-24 Sanjay Gupta * gdip.h: Changed function signature for SeekDelegate function. * tiffcodec.c: Minor modification in passing flags to libtiff. 2004-06-23 Jordi Mas * gdip.h, graphics.c: Implement Get/Set Unit and Scale. We will need when we implement GdipTransformPoints 2004-06-23 Jordi Mas * image.c: fixes bug 60601, simple images where not drawn on the right place 2004-06-22 Ravindra * lineargradientbrush.h: Added two members 'changed' and 'pattern' to GpLineGradient struct to avoid unnecessary multiple brush setup. * lineargradientbrush.c: Changes related to above and some fixes. 2004-06-22 Jordi Mas * gdip.h, graphics.c: implement Clip API function calls * region.c: remove unused vars 2004-06-22 Ravindra * texturebrush.c: We need to reset the 'changed' flag after doing brush setup. 2006-06-21 Sanjay Gupta * tiffcodec.c: Added dummy functions and changed the way we were reading/writing tif image from/to stream. 2006-06-17 Sanjay Gupta * tiffcodec.c: ABGR 2 ARGB conversion while saving. Default tiff format of ARGB was converted to our local format ABGR while reading, but in write operation we were not converting back to ARGB format and hence messy image. 2004-06-17 Sanjay Gupta * image.c: Removed a commented line of code. Got checked in by mistake. 2004-06-16 Sanjay Gupta * gdipImage.h: Modifed function signature GdipSaveImageToDelegate_linux(). * image.c : Modified call to save tiff image from stream delgate. * tiffcodec.c, tiffcodec.h : Modified API signature and implemented functions to save tiff images to stream. 2004-06-16 Sanjay Gupta * tiffcodec.c, tiffcodec.h: Implemented methods for loading tiff images from stream. 2004-06-16 Ravindra * graphics.c: Removed unnecessary calls to cairo_save and cairo_restore from GdipFillXXX functions. 2004-06-15 Ravindra * texturebrush.h: Added two members 'changed & pattern' to GpTexture struct to avoid unnecessary texture setup. * texturebrush.c: Fixed the code to avoid the seam. Setup related enhancement. Replaced cairo_show_surface by cairo_fill for creating pattern. This was required to fix the problem with Graphics.DrawXXX, as DrawXXX functions stopped working for texturebrush because of transformation matrix fix in pen.c (my previous checkin). 2004-06-15 Sanjay Gupta * gdip.h: Added function typedefs, (*CloseDelegate), (*SizeDelegate). * gdipImage.h: Modifed function signature GdipLoadImageFromDelegate_linux(). * image.c : Modified call to load tiff image from stream delgate. * tiffcodec.c, tiffcodec.h : Modified API signature for loading tiff images from stream. 2004-06-14 Peter Bartok * general.c: Fixed internal cairo function name to be gdi specific. 2004-06-10 Sanjay Gupta * gifcodec.c: Minor error handling. * tiffcodec.c, tiffcodec.h: Added function stubs for loading and saving images from/to streams. Also modified API to include encoder parameter. * image.c: Minor indentation fixes, fixed incorrect image format assignment in loading images from stream, error handling and including call to load/save tiff images from stream. 2004-06-10 Jordi Mas * gifcodec.c: fixes the stubs signatures when libgif is not installed 2004-06-09 Jordi Mas * font.c, gdip.h: implemtents cache for generic family fonts, and properly keep track of resources and deallocate them. 2004-06-08 Ravindra * graphics.c: Added notes to GdipDrawXXX functions. * pen.c: We need to take into account the graphics->matrix also when stroking. Fixed the same. 2004-06-04 Ravindra * graphics.c: Fixed GdipDrawXXX functions as per the fix in pen.c. * pen.c: Added a flag to avoid multiple unnecessary setups of the same pen and fixed transform matrix usage. * gdip.h: Added a 'changed' bool type to GpPen struct. 2004-06-04 Sanjay Gupta * bitmap.c: Resolved issue with saving of 24 bit bmps. 2004-06-03 Ravindra * graphics.c: Fixed GdipDeleteGraphics and gdip_graphics_attach_bitmap functions. 2004-06-01 Ravindra * hatchbrush.c: Peformance improvements in some of diagonal hatch styles. These were quite slow earlier. 2004-05-31 Ravindra * graphics.c: Fixed GdipResetWorldTransform, GdipDrawPie and GdipFillPie. ResetWorldTransform should set the copy_of_ctm as well as the graphics->ct matrix to identity. Draw/FillPie functions do not do anything, if sweep angle is zero deg. This is done to fix the crash that we face when we draw/fill pie with zero deg sweep angle. And, some formatting. 2004-05-28 Duncan Mak * graphics.c (GdipResetWorldTransform): Remember to synchronize graphics->copy_of_ctm with the graphics' matrix. 2004-05-28 Ravindra * hatchbrush.c: Completed the remaining hatch styles. 2004-05-28 Jordi Mas * tiffcodec.c, image.c: added support for saving TIFF files 2004-05-28 Jordi Mas * bitmap.c, image.c, tiffcodec.c: reformmated using Mono code style. No code changes made 2004-05-28 Ravindra * gdip.h: Added declarations for GdipDrawRectangles, GdipDrawRectanglesI, GdipFillRectangleI, GdipFillRectangles, GdipFillRectanglesI functions for Graphics. * graphics.c: Implemented the functions mentioned above. Added g_return_val_if_fail macro. Did some of formatting. I have tested this, hope I'm not going to break anything. 2004-05-28 Ravindra * graphics.c: Changed DrawLinesI and DrawLines functions not to call DrawLineI and DrawLine respectively, as it results in setting up pen so many times unnecessarily. * hatchbrush.c: Formatting. 2004-05-27 Duncan Mak * matrix.c (set_translate, set_scale, set_rotate, set_shear): Removed, we are not allocating a new GpMatrix * anymore. (TranslateMatrix, ScaleMatrix, RotateMatrix, ShearMatrix): All the functionality of set_foo has been moved back into here. 2004-05-27 Miguel de Icaza * pen.c (gdip_pen_setup): Fix indentation, and do not set the pen matrix. The pen matrix trumps any other transformations on the graphics->ct, someone must fix this properly. * matrix.c: Remove some heavy use of routines with something lighter, Duncan will look at this further. 2004-05-27 Ravindra * hatchbrush.c: Implemented couple of hatch styles. 2004-05-27 Jordi Mas * pngcodec.c: added stubs for when libpng is not present 2004-05-27 Sanjay Gupta * bmpcodec.c: Added support for converting 24BPP to 32 BPP for usage by cairo, in function for loading bmp. 2004-05-27 Sanjay Gupta * bmpcodec.c: Abstracted reading bmp from file and stream to single function. * bmpcodec.h: Added function declarations for above implementation. 2004-05-27 Jordi Mas * bitmap.c: added support for drawing 24-bits images tru DrawImage 2004-05-27 Sanjay Gupta * bmpcodec.c: Fixes in function to save bmp to stream. 2004-05-26 Sanjay Gupta * bmpcodec.c: Implemented function to save bmp to stream. * bmpcodec.h: Added function declarations for above implementation. 2004-05-26 Sanjay Gupta * bmpcodec.c: Resolved issue with saving images to bmp format. 2004-05-26 Sanjay Gupta *image.c: Resolved issue with wrong comparison between image format guid and enocder clsid in GdipSaveImageToDelegate_linux() fn. 2004-05-26 Jordi Mas * gifcodec.c, gifcodec.h, image.c: implemented saving GIF images to file, stream and loading them from a stream. 2004-05-26 Ravindra * hatchbrush.c: Implemented Plaid and Wave hatch styles. 2004-05-26 Ravindra * hatchbrush.c: Implemented Sphere hatch style. 2004-05-26 Jordi Mas * bitmap.c, gdip.h: remove death code * gifcodec: no code changes made, reformmating to be able to work with it 2004-05-25 Jordi Mas * bitmap.c, gdip.h, image.c, imageattributes.c: - Implemented SetImageAttributesWrapMode: Tile, TileFlipY, TileFlipY and TileFlipXY - ImageAttributes fails to default category if nothing is setup - Minor bug fixes 2004-05-25 Jordi Mas * bitmap.c: fixes bug in gdip_bitmap_clone. We were not cloning the bitmap data itself 2004-05-24 Jordi Mas * bitmap.c, gdip.h, image.c, imageattributes.c: implemented functions for ImageAttributtes 2004-05-21 Ravindra * pen.c: We draw a line of a pixel width, if pen width is set to zero or less than zero. 2004-05-20 Ravindra * hatchbrush.c: Implemented SolidDiamond hatch style. * pen.c: Minor fix in GdipSetPenDashArray function. * gdip.h: Added a comment and inserted #ifndef around uglify typedefs. * gdip_win32.h: Removed the mono dependency uglify.h. It was also breaking the build. 2004-05-19 Miguel de Icaza * gdip.h: Removed the dependency on Mono for uglify.h by copying here all the required things from mono/io-layer/uglify.h. 2004-05-15 Vladimir Vukicevic * image.c, jpegcodec.c, jpegcodec.h, gdip.h: Add support for EncoderParameters. Currently, only jpeg Quality is exported (MS doesn't support any params for anything but Jpeg and Tiff) * image.c, gdip.h, gdipImage.h: Renamed some things which were clsid to format_guid to avoid confusion (they're not clsids) 2004-05-14 Peter Bartok * gdip.h: Added various missing structs and enumerations required for the new stubs. * bitmap.c: Removed warning; added missing stubs * font.c: Implemented GdipGetLogFontA, GdipPrivateAddMemoryFont * graphics.c: Implemented GdipSetInterpolationMode, GdipGetPageScale, GdipGetPageUnit; added missing stubs * imageattributes.c: Added missing stubs * image.c: Added missing stubs 2004-05-14 Duncan Mak * gdip.h (GpPathPointType): Make all the elements use hex values for consistency. * graphics-path.c (append): Handle the CloseSubpath flag. This is needed for SetPathMarker. * graphics-path.c (GdipClearPathMarkers, GdipSetPathMarker): Implemented. (GdipAddPathCurveI, GdipAddPathCurve2I, GdipAddPathCurve3I): Implemented. The float versions were committed a long time ago, but I forgot to do the same to the integer overrides. * graphics-path.c (GdipStartPathFigure, GdipClosePathFigure, GdipClosePathFigures) (GdipAddString, GdipWindingModeOutline): (GdipFlattenPath, GdipWidenPath, GdipWarpPath) (GdipGetPathWorldBounds, GdipIsVisiblePathPoint) (GdipIsOutlineVisiblePathPoint): Stubbed, they all now return Ok, but we have a MonoTODO comment to remind us to implement them. 2004-05-14 Jordi Mas * adjustablearrowcap.c ,customlinecap.c, gifcodec.c, graphics-path, hatchbrush.c, jpegcodec.c, lineargradientbrush.c, matrix.c, pathgradientbrush.c, pngcodec.c,texturebrush.c,tiffcodec.c: added missing licenses. 2004-05-14 Jordi Mas * bmpcodec.c, gifcodec.c, jpegcodec.c, pngcodec.c, tiffcodec.c: remove redudant CLSID definitions and use global definitions 2004-05-14 Ravindra * Makefile.am: Added source file entries for customlinecap and adjustablearrowcap. * pen.c: A minor fix in SetPenDashArray () function. 2004-05-14 Ravindra * adjustablearrowcap.c: First implementation of AdjustableArrowCap. 2004-05-14 Ravindra * customlinecap.[ch]: First implementation of CustomLineCap. It needs further work. I need to get it working with pen. 2004-05-14 Ravindra * gdip.h: Added missing functions for Pen. Added compound array to GpPen struct. Fixed some of Pen function signatures. Moved around few enums for compilation. Added typedefs and functions for CustomLineCap and AdjustableArrowCap. * pen.c: Added compound array functions. Fixed dash array functions and added stubs for custom linecaps. 2004-05-13 Jordi Mas * does a proper pixelformat check 2004-05-13 Ravindra * gdip.h: Added GpPenType enum and moved GpBrushType enum here from brush.h. Added GdipGetPenFillType function declaration. * brush.h: Moved GpBrushType enum to gdip.h. * pen.c: Implemented GdipGetPenFillType function. 2004-05-12 Peter Bartok * pngcodec: Since the code handles interlace just fine I removed the error condition for interlaced pictures; this fixes bug #55934 2004-05-12 Peter Bartok * font.c: Implemented GdipCreateFontFromDC 2004-05-12 Duncan Mak * gdip.h (GpCoordinateSpace): Defined. * graphics.c (GdipScaleWorldTransform): Implemented. (GdipSetWorldTransform): Fixed memory management bug pointed out by Vlad. 2004-05-12 Miguel de Icaza * image.c (GdipLoadImageFromFile): Added error checking in case the codec fails to load a valid image. 2004-05-12 Jordi Mas i Hernandez * bitmap.c, image.c, gdpi.h: - Correct support for Format24bppRgb, Format32bppArgb, Format32bppPArgb, Format32bppRgb pixel formats - Fixed GdipBitmapLockBits to return the format and behavior than GDI+ - GetPixel/SetPixel do not work when the bitmap is locked 2004-05-10 Peter Bartok * gdip_win32.c: Added ObjectList to manage Win32 object that can be deleted. Solves problem of asynchronous deletion of object when GC kicks in. While we could also use Control.BeginInvoke this method allows us to keep private gdip handles away from System.Drawing. Currently handles fonts but any other object that could be subject to GC should also be managed through the ObjectList code. * gdip.h: Added prototype * general.c: Shutdown code now also calls the new gdip_win32 shutdown function. 2004-05-10 Duncan Mak * gdip.h (fcmp): Added. * general.c (fcmp): Use the fcmp function from fcmp.sf.net. * graphics-path.c (append): Check for point count before calling GetPathLastPoint. Use fcmp instead of == when comparison floating point numbers. 2004-05-09 Peter Bartok * graphics.c: Completely rewrote DrawString and MeasureString: - No longer only works for us-ascii - Now handles multiple sequential linefeeds in DrawString - Now properly calculates the bounding box size - Now handles StringFormat flags (NoWrap, Vertical, Ellipsis) - Now properly breaks lines at whitespace or characters - Now properly handles tabstops - Now properly allows multiple hotkey characters * stringformat.c: Changed trimming default to TrimWord (like MS) * gdip.h: Fixed DrawString prototypes, replaced DrawString support structs 2004-05-09 Jordi Mas i Hernandez * bmpcodec.c: Move BMP specific functions to bmpcodec * bitmap.c: Move BMP specific functions to bmpcodec 2004-05-07 Ravindra * hatchbrush.c: Implemented 11 hatching styles. * texturebrush.c: Fixed destroy function. 2004-05-04 Jordi Mas i Hernandez * bmpcodec.c: We use always RGB32 internally * bitmap.c: We use always RGB32 internally * image.c: We use always RGB32 internally 2004-05-06 Sanjay Gupta * image.c: Removed a printf stmt. * gifcodec.c: Implemented reading information about time and page based frames. 2004-05-05 Peter Bartok * gdip_win32.c: Added support for SetMapMode; fixed fontsize conversion for Cairo->Wine fonts * font.c: Added call to SetMapMode to have predictable units for font size * gdip_win32.h: Added support for SetMapMode 2004-05-04 Jordi Mas i Hernandez * bitmap.c: calculate strides as GDI+ 2004-05-05 Sanjay Gupta * gdipImage.h: Added CLSID for FrameDimensions. * image.c: FrameDimensionsCount, FrameDimensionList and ImageFrameCount taken into consideration while loading image. * gifcodec.c: Corrected implementation of reading no of image description records present. 2004-05-04 Sanjay Gupta * image.c: Implemented functions GdipImageGetFrameDimensionsCount(), GdipImageGetFrameDimensionsList(), GdipImageGetFrameCount(). UNTESTED * gdip.h: Modifieid GpImage structure and added FrameDimensionInfo struct. * gifcodec.c: Modified to read the no of image description records present. 2004-05-04 Jordi Mas i Hernandez * image.c: implements GdipImageRotateFlip: 90, 180, 270, degree, plus FlipX and combinations 2004-05-04 Ravindra * matrix.c: Added macros for checking null pointers. 2004-05-04 Ravindra * pen.c: Added assert macros for checking null pointers. Also fixed Get/Set/Reset PenTransform functions. * graphics.c: Fixed a mistake in Clear function. Cairo takes color values in the range [0.0, 1.0], instead of [0, 255]. * gdip.h: Added return type to gdip_pen_setup function. * lineargradientbrush.[ch]: Fixed Get/Set LineTranform functions. * texturebrush.c: Fixed Get/Set TextureTransform functions. 2004-05-03 Jordi Mas i Hernandez * bitmap.c: adds Format32bppRgb support for get/set pixel * graphics.c: fixes bug 56798 (RTL support) 2004-05-03 Jordi Mas i Hernandez * bitmap.c: fixes stride in GdipCloneBitmapAreaI, copy of different pixel formats, uninit data in Bitmap struct, etc. 2004-04-30 Ravindra * lineargradientbrush.[ch]: Few fixes. 2004-04-30 Jordi Mas i Hernandez * region.c: fixes bug at GdipSetInfinite detected by the tests 2004-04-30 Jordi Mas i Hernandez * bitmap.c: fixes bug causing a cloned imaged not been able to save it. 2004-04-29 Duncan Mak * graphics-path.c (append): Moved the aforementioned logic into here instead; append_point should still just only delegate to append. 2004-04-29 Duncan Mak * graphics-path.c (append_point): Add some logic here. Don't append a move_to (PathPointTypeStart) if we're already at the point we need to be in. This fixes problems we have with filling, as Cairo closes all subpaths before a fill op. (GdipAddPathLine, GdipAddPathLineI): Removed precaution checks for move_to, we're doing it once and for all in append_point. This should fix the drawing bug Miguel sees in the GraphicsPath in the test form. 2004-04-29 Peter Bartok * gdip.h: Added flag for multiline strings * graphics.cs: Fixed bug #56800, DrawString now handles \n (and ignores \r, like Microsoft) 2004-04-29 Jordi Mas i Hernandez * image.c: fixes GdipSaveImageToFile using FormatID as parameter instead of the coded Clsid 2004-04-28 Jordi Mas i Hernandez * bmpcodec.c: added codecInfo * gdip_win32.h: added ImageCodecInfo struct * general.c: init codecinfo * gifcodec.c: added codecInfo * image.c: added GDI+ encoder/decoder functions * jpegcodec.c: added codecInfo * pngcodec.c: added codecInfo * tiffcodec.c: added codecInfo 2004-04-27 Ravindra * lineargradientbrush.[ch]: First implementation of lineargradientbrush. * Makefile.am: Added lineargradientbrush sources to the list. 2004-04-27 Vladimir Vukicevic * gdip.h: Added EncoderParameterValueType enum * image.c (GdipDrawImageRectRect, GdipDrawImagePoints): implemented. (gdip_encoder_parameter_search_int): start of some encoder parameter stuff 2004-04-26 Duncan Mak * general.c (gdip_open_curve_tangents): (gdip_closed_curve_tangents): Simplified. Use only one coefficient, instead of a set of coefficients per each point on the curve. We now take care of tension when calculating tangents. (gdip_calculate_coefficients): Removed. Microsoft doesn't use such a nice way of calculating coefficients. Their implementation is a lot more simplistic. Thanks to Professor Rasala for figuring this out. * graphics.c (GdipDrawClosedCurve2, GdipDrawCurve3) (GdipFillClosedCurve2): Add tension paramater. * graphics-path.c (GdipAddPathCurve3): Implemented. (GdipAddPathCurve, GdipAddPathCurve2): Pass the work onto GdipAddPathCurve3. * gdip.h (gdip_closed_curve_tangents, gdip_open_curve_tangents): Updated function signature to include tension. 2004-04-26 Sanjay Gupta * image.c: Implemented function GdipGetImageRawFormat. * gdip.h: Modifieid GdipImage structure and added ImageFormat enum from gdipImage.h * gdipImage.h: Removed ImageFormat enum to gdip.h 2004-04-25 Vladimir Vukicevic * graphics.c (GdipCreateFromXDrawable_linux): added method, so that we can interface with Gtk (i.e. to draw to a DrawingArea) 2004-04-24 Ravindra * graphics.c: Fixed GdipGraphicsClear() function. * gdip.h: Removed some unwanted lines. 2004-04-23 Vladimir Vukicevic * bitmap.c (GdipCloneBitmapAreaI): wrong sense of assert test, oops * image.c (GdipDrawImagePoints): implemented. 2004-04-23 Peter Bartok * graphics.c: Fixed bug #57551. Hotkey prefix now properly placed no matter on what line it is or how the text is aligned. 2004-04-23 Peter Bartok * graphics.c: Implemented GdipCreateFromHWND() 2004-04-22 Vladimir Vukicevic * bitmap.c (GdipCloneBitmapAreaI): implemented with format conversion * image.c (GdipDrawImageRect): use gdip_bitmap_ensure_surface to create a surface if it's missing. Fixes 57323 * bitmap.c (gdip_bitmap_ensure_surface): added as a way to access a bitmap image's surface, creating it if it's missing 2004-04-21 Peter Bartok * font.c: Added private GdipCreateFontFromHfont function to support the System.Drawing.Font.FromHfont method. * gdip_win32.c: Added import of Wine GetTextMetrics and GetTextName functions * gdip_win32.h: Added some prototypes and LOGFONTA and TEXTMETRICA structures 2004-04-19 Sanjay Gupta * image.c: Added function call to load bmp image from stream in switch case stmt. 2004-04-20 Jordi Mas i Hernandez * region.c - more work on regions. New methods, fixes, and funtionality * graphics.c - Fixed font bug * gdip.h - new region functions 2004-04-19 Vladimir Vukicevic * graphics-path.c (GdipAddPathStringI): renamed GdipPathString -> GdipAddPathString (the real name); still NotImplemented * bitmap.c: Implemented new LockBits/UnlockBits that's consistent with MS semantics, and that can do conversions. (Also some random whitespace cleanup, mainly as I touched functions.) * gdip.h: Some ARGB access macros, also a cleanup of the PixelFormat enum (there is a method to the madness). Some missing prototypes also. * image.c: Got rid of unused gdip_getpixel_formatsize (it can be inferred from the pixel format). * pathgradientbrush.c: Sets the cairo rgb color to the center color of the gradient. Not pretty, but better than nothing. * Makefile.am: Added -Wall -Wno-unused -Wno-format. Lots of functions that should have been returning values weren't, functions used without prototypes, etc. Touched files to fix missing return issues: bmpcodec.c, brush.h, font.c, gdip_win32.h, general.c, graphics.c, hatchbrush.c, imageattributes.c, 2004-04-19 Sanjay Gupta * bmpcodec.c: Fixed function for loading image from stream 2004-04-16 Jordi Mas i Hernandez * region.c - more work on regions. New methods, fixes, and funtionality * graphics.c - GdipFillRegion implemented 2004-04-16 Ravindra * gdip.h: Included glib.h. * brush.h, solidbrush.h: Removed internal functions and added return type to vtable functions. * brush.c: Now we return status from internal functions also. * texturebrush.c, hatchbrush.c, solidbrush.c, pathgradientbrush.c: Now we return status from internal functions also and do check for null pointers. 2004-04-16 Sanjay Gupta * bmpcodec.c: Implemented function for loading image from stream 2004-04-15 Ravindra * general.c (gdip_cairo_set_surface_pattern): Check for null pattern and return the status. * gdip.h (gdip_cairo_set_surface_pattern): Return status. 2004-04-15 Ravindra * hatchbrush.h: Moved internal functions to hatchbrush.c. * hatchbrush.c: Moved some internal functions around. 2004-04-15 Ravindra * texturebrush.h: Moved internal functions to texturebrush.c. * texturebrush.c: Few fixes to handle scale/rotate functions. But, we still don't get scaling/rotation right. Seems to be some problem with Cairo. Checking in code now, will see this later when I'm sure that Cairo is doing right. 2004-04-14 Jordi Mas i Hernandez * bitmap.c - fixes biXPelsPerMeter fields * bmpcodec.c - fixes strides, fixes new WinNT BMP headers, support for OS/2 bitmaps, 8 and 24 bits, upside bitmaps, gets different pixelformats correct loading/saving, reformatted to 8 tabs, support for load/save palette if present (RGBTRIPLE and SQUADS), fixes bitmap writting to allow to work with more tools (saving it upside down), etc. 2004-04-14 Duncan Mak * graphics-path.c (GdipAddPathLine, GdipAddPathLineI): Only append a starting point if the current point is not the same as the point we're appending. This removes unnecessary subpaths, and fixes GdipFillPath. 2004-04-13 Vladimir Vukicevic * jpegcodec.c (gdip_save_jpeg_image_internal): Check for pixformat equal to Format24bppRgb, not 32bpp when deciding whether to do argb conversion. Fixes #56967. * texturebrush.h: Moved WrapMode enum to gdip.h, to share it with the pgbrush * general.c (gdip_rect_expand_by): Helper function to build bounding rects * gdip.h: Bunch of new prototypes * pathgradientbrush.c: Stub implementations of this. Real version will probably require me to add gouraud triangle shading to cairo, which will happen Real Soon Now. 2004-04-12 Vladimir Vukicevic * gdip.h, image.c: I misread the *I methods. Implement them correctly, keeping the corrent int/float distinction. Also added a bunch of GdipDrawImage* stubs. 2004-04-11 Vladimir Vukicevic * general.c (GdiplusStartup): I really meant $GDIPLUS_NOX to mean "no X" instead of "require X". * texturebrush.c, image.c: Use gdip_cairo_set_surface_pattern * general.c: (gdip_cairo_set_surface_pattern) helper function to create a new pattern from a surface and set it. (GdiplusStartup): Don't acquire an X display if GDIPLUS_NOX is set (gdip_get_display_dpi): use GDIP_display instead of creating a new XDisplay 2004-04-10 Vladimir Vukicevic * gdip.h, graphics.c: Added lots of Get/Set stuffs. 2004-04-12 Ravindra * texturebrush.h: Internal functions should not appear here. Removed internal functions. Uncommented few implemented functions. * texturebrush.c: Moved around few functions as per the change in header file. 2004-04-11 Peter Bartok * gdip_win32.c: Added fontsize translation when creating HFONT * font.c: Added private function to retrieve the HFONT handle 2004-04-10 Vladimir Vukicevic * image.c (GdipDrawImageRectI): put back version that handles scaling correctly and doesn't create an extra graphics context unnecessarily. * graphics.c (gdip_graphics_attach_bitmap): set the surface on a GpBitmap after setting it as the cairo target; each GpBitmap should always have an associated cairo surface. (fixes #56803) * image.c (gdip_image_init): can't call get_display_dpi(), because we might not have an X display at all. 2004-04-10 Peter Bartok * bitmap.c: Removed the hack that set the Win32 bitmap to white. Instead it now simulates alpha blending and merges the Win32 bitmap onto the cairo image surface. This makes drawing between cairo and Wine/Win32 fully compatible, albeit with two drawbacks: First, the copying of the bitmap is done pixel by pixel, and second, the color value of UNALTERED_PIXEL in a Win32 bitmap will be treated as transparent. * image.c: Removed the 'improved' GdipDrawImageRectI function. I lost a whole day tracking down why SWF stopped working. The 'improved' version doesn't seem to work (yet). Left the broken version with an #if 0 for future fixing. * gdip_win32.c: Added functions to create/delete HFONT handles tracking the cairo fonts. * gdip_win32.h: Added prototypes * font.c: Now also creates/deletes Wine font tracking the cairo font * gdip.h: Added HFONT element to GpFont structure 2004-04-10 Duncan Mak * graphics.c (GdipDrawCurve): (GdipDrawClosedCurve, GdipFillClosedCurve): Added all the overloads, properly delegate the work to avoid code duplication. Handle the case when tension = 0; in that case, we draw/fill a polygon for closed curves, and just draw straight lines for open curves. (GdipDrawCurve3): Fixed signature, there was a missing offset argument. * gdip.h: Added open and closed curve drawing and filling functions. 2004-04-10 Duncan Mak * general.c (gdip_open_curve_tangents): Fixed some more errors in the porting of the algorithm. We should be passing Z to gdip_calculate_coefficients instead of count. Z = 2 * count - 1. 2004-04-10 Duncan Mak * graphics.c (GdipDrawCurve): Doh! Use the ask for tangents for open curves, not closed curves. * graphics-path.c (GdipResetPath): Don't set them to NULL. That wouldn't work, doofus. * graphics.c (GdipDrawCurve2I): Fixed function signature and use convert_points to pass the work onto GdipDrawCurve2. (GdipDrawCurve3I): Fixed function signature. * general.c (gdip_open_curve_tangents): Fix typo. 2004-04-09 Peter Bartok * Makefile.am: Added region.c to list of sourcefiles 2004-04-09 Jordi Mas i Hernandez * region.c - fixes to regions 2004-04-09 Duncan Mak * graphics-path.c (append_curve): Moved it to the top along with the other append helper functions. (GdipAddPathCurve, GdipAddPathCurveI): Implemented using gdip_open_curve_tangents. (GdipAddString): Fixed signature. * general.c (gdip_open_curve_tangents): Implemented.o (gdip_closed_curve_tangents): Fixed memory leak here. * gdip.h (gdip_open_curve_tangents): Add here. To be shared between graphics.c and graphics-path.c. 2004-04-08 Jordi Mas i Hernandez * region.c - Started regions implementation * gdip.h - signature changes 2004-04-07 Ravindra * texturebrush.[ch]: Added the missing functionality of clipping a rectangle out of image provided. 2004-04-06 Vladimir Vukicevic * jpegcodec.c (gdip_save_jpeg_image_internal): remove stray JCS_GRAYSCALE setting, which was generating very bizzare images. * jpegcodec.c, pngcodec.c: Allow reading/writing non-RGBA data. The GpBitmap.data struct holds cairo-compatible data (always 32bpp RGBA), whereas the GpImage.pixFormat field holds what this data is actually supposed to be (i.e. grayscale). Still no support for colormapped images. 2004-04-07 Duncan Mak * graphics.c (make_pie): Retort to make_ellipse *after* drawing the line. 2004-04-06 Vladimir Vukicevic * jpegcodec.c (gdip_save_jpeg_image_internal): implement jpeg saving, both files and streams. Format options are ignored for now. * image.c (GdipSaveImageToFile, (GdipSaveImageToDelegate_linux): add JPEG * image.c (gdip_get_pixel_format_components): added function * jpegcodec.c (gdip_load_jpeg_image_internal): add missing jpeg_destroy_decompress() 2004-04-06 Duncan Mak * graphics.c (make_arc): Just follow what I did with GraphicsPath and use a boolean flag instead of doing FP comparison. It's not worth it. 2004-04-06 Vladimir Vukicevic * gdip.h: Added stream handling delegate prototypes, and some missing function protos * gdipImage.h: stream delegate loading/saving functions * image.c: stream loading/saving bits, implemented via linux-specific delegates. Added guids for various file formats, and a gdip_image_format_for_clsid() helper function * jpegcodec.c: supports reading from a stream * pngcodec.c: supports writing; also supports reading/writing with a stream * image.c: blit surface directly for painting images, instead of creating a graphics context for it first * gifcodec.c, jpegcodec.c, pngcodec.c, tifcodec.c: Write data with the correct flags and resolution bits, to (almost) match what win32 outputs 2004-04-04 Vladimir Vukicevic * gifcodec.c, tiffcodec.c, pngcodec.c: include config.h, which actually enables this code.. so that the glaring bugs as a result of it never having been compiled before can be fixed. *cough* * image.c (GdipDrawImageRectI): do correct scaling if source and dest width/height don't match. (GdipLoadImageFromFile): fseek back to the start before passing to the loader. 2004-04-04 Vladimir Vukicevic * image.c: Changed loader calls to use correct load prototypes * pngcodec.c, gifcodec.c: Implemented png and gif loading * gdip.h: Changed ColorPalette to match GDI+; Entries is part of the allocated struct, not a separate pointer. Also added some ARGB convenience macros. * bmpcodec.c, bmpcodec.h: Updated load prototypes to match usage 2004-04-04 Vladimir Vukicevic * src/image.c, src/gdip.h: Added GdipDrawImage/DrawImageRect * src/jpegcodec.c, src/tiffcodec.c: Implemented loading jpeg and tiff images. Need to test these out on windows, to see exactly what formats stuff gets retruned in, but I think we should be ok for the most common cases. No file saving yet. * src/bmpcodec.c, src/gifcodec.c, src/pngcodec.c: Remove calls to bogus (and undefined) gdip_image_new() 2004-04-04 Duncan Mak * graphics.c (make_curve): Renamed from gdip_make_closed_curve. Added a new _CurveType argument. (convert_points): Moved to general.c, as it's used in graphics-path.c as well. * graphics-path.c (append_curve): Add a _CurveType argument. Renamed from gdip_append_closed_curve for consistency. (GdipAddPathClosedCurve2I): Hook it up. * general.c (convert_points): Moved here from graphics.c (gdip_open_curve_tangents): Declare here. No code yet, need to investigate end tangents. * gdip.h (_CurveType): New (private) enum for distinguishing open and close curves. 2004-04-04 Duncan Mak * graphics-path.c (append_arc): Added a new boolean argument. to determine if we're continuing an existing curve. 2004-04-04 Duncan Mak * graphics.c (make_arc): Only call move_to when we're not already at that point. This fixes FillPie, as cairo_fill implicitly closes all subpaths before filling. The extraneous move_to call earlier was causing Cairo to close early. (make_pie): Removed the debug messages. 2004-04-02 Duncan Mak * graphics.c (make_pie, GdipDrawArc): If the delta is greater than or equal to 360 degrees, then we're effectively drawing an ellipse, so make it do so. 2004-04-02 Duncan Mak * graphics.c (GdipFillPieI, GdipDrawPieI): Instead of having another copy of the code, just use the float equivalent. (GdipDrawPie): Add restore/save pair. (make_pie): This is broken right now. Added some debugging messages. 2004-04-01 Duncan Mak * graphics.c (GdipFillClosedCurve, GdipFillClosedCurveI): Implemented. 2004-04-02 Ravindra * texturebrush.c: Implemented TileFlipXY wrapmode. 2004-04-01 Duncan Mak * graphics.c (convert_points): New helper function to turn a list of GpPoints into GpPointFs. (GdipDrawClosedCurveI): Implemented using convert_points, then just call GdipDrawClosedCurve. 2004-04-01 Duncan Mak Implemented drawing ClosedCurves in Graphics and GraphicsPath. These functions are implemented with the help of Prof. Rasala at Northeastern University. The algorithm is described in: Richard Rasala, Explicit Cubic Spline Interpolation Formulas, in Andrew S. Glassner, Graphics Gems, Academic Press, 1990, 579-584. Remaining TODO: Finish open curves and consider tension. * graphics.c (gdip_make_closed_curve): Translates vertices and tangents for cairo_curve_to. (GdipDrawClosedCurve): Implemented. * graphics-path.c (gdip_append_closed_curve): Translates vertices and tangents into append_bezier. (GdipAddPathClosedCurve2): Implemented. 2004-04-01 Duncan Mak * gdip.h: Added the new functions for calculating tangents. (CURVE_MIN_TERMS, CURVE_MAX_TERMS): Constants used in tangent calculations. * general.c (gdip_calculate_coefficients) (gdip_closed_curve_tangents): Two helper functions for drawing closed curves. 2004-03-30 Sanjay Gupta *pngcodec.c Implemented one more method. *gdip.h Modified ColorPalette structure. 2004-03-31 Sachin Kumar * Makefile.am: Updated file to make it work for 'make distcheck'. 2004-03-30 Jordi Mas i Hernandez * image.c - GdipGetImageBounds and fixes * bitmap.c - keep the witdh, height and pixel format in sync with the image struct 2004-03-30 Sanjay Gupta *pngcodec.c Added crc check *pngcodec.h Added crc check 2004-03-28 Sanjay Gupta * pngcodec.c implementing png encoder * pngcodec.h implementing png encoder 2004-03-26 Duncan Mak * graphics.c: Prepare for the Curve and CloseCurve work by stubbing out some functions. * graphics.c (gdip_plot_path): Fixed the handling of paths containing PathPointTypeBezier points. Previously, we were resetting the index to zero at the head of each loop, so we were never drawing Bezier curves correctly. Also, we need to draw the curve immediately once we've stored 3 points, instead of waiting till the next iteration (which may never come). This is an off-by-one error. * graphics-path.c (append_arc): Use floats instead of ints to hold the center points, use doubles to hold the trig points. 2004-03-26 Jordi Mas i Hernandez * image.c - dpis and parameter checking 2004-03-26 Ravindra * texturebrush.c: Implemented TileFlipY wrapmode and fixed TileFlipX wrapmode. 2004-03-26 Duncan Mak * graphics-path.c: Port the changes made to graphics here. (append_arc): New function, modeled after make_arc for appending arcs (a set of Bezier points) to the Path. (GdipAddPathArc): Calculate the middle angle correctly and call append_arc. (GdipAddPathPie): Removed duplication, call append_arc appropriately. 2004-03-26 Duncan Mak * graphics.c (make_arc): Use the end angle instead of the sweep angle. Previously, the code was misbehaving because I used the sweep angle as the end angle. (make_pie, DrawArc): Determine the middle angle correctly in cases where the delta > 180. Even though this sounds simple, it took a long time for me to figure out. (make_pie): Simplifed things a bit. Instead of replicating most of the arc-drawing algorithm here, use of make_arc instead. This reduced some of the duplicates in the code. (DrawArcI): I'm tired on maintaining so many copies of the same code, so just call DrawArc now. With this patch, we should be drawing Arcs and Pies correctly. 2004-03-25 Ravindra * texturebrush.[ch]: Fixing texture brush. Still needs some work. 2004-03-24 Jordi Mas i Hernandez * imageattributes.c - created and first methods 2004-03-23 Peter Bartok * gdip_win32.h: Added definitions for Wine X11DRV_ExtEscape function; removed definition and reference to internal wine structures * gdip_win32.c: Added import of X11DRV_ExtEscape to allow pulling the X11 Drawable without knowledge of internal structures * graphics.c: Now uses the X11DRV_ExtEscape function to retrieve the drawable from Wine * general.c: Made x11drvHandle accessible for other source files (needed for X11DRV_ExtEscape) 2004-03-23 Ravindra * gdip.h: Changed file format to Unix. 2004-03-22 Jordi Mas i Hernandez * graphics.c: added GdipFillPieI and GdipFillPie 2004-03-22 Sanjay Gupta * gdip.h: Typo error * gdipImage.h: Fixed issue because of typo * image.c: Fixed issue because of typo 2004-03-21 Sanjay Gupta * Makefile.am: Included codec files. * gdip.h: Added few structure definitions. * gdipImage.h: Included codecs .h files. * image.c: Work on codecs. 2004-03-18 Miguel de Icaza * graphics.c (GdipDrawString): Fixed what looked like a typo X and Y. (GdipFillPath): Implement this routine. Factor code into gdip_plot_path. Stub out a few more routines to avoid crashes when running. 2004-03-18 Peter Bartok * pen.c: Fixed leak and bug that returned wrong pointer for dash array 2004-03-15 Jordi Mas i Hernandez * graphics.c - Bug fixing, suport for hotkeys, code reoganisation * stringformat.c - string format tab support 2004-03-11 Peter Bartok * bitmap.c: Added temporary hack to always initialize the bitmap scan (pixel) data (for SWF) 2004-03-10 Ravindra * hatchbrush.c: Coding style fixes. 2004-03-10 Ravindra * hatchbrush.h: Modified few internal function signatures. * hatchbrush.c: Implemented couple of hatching styles. 2004-01-10 Alexandre Pigolkine * bitmap.c * gdip.h GdipBitmapData struct. Memory ownership stored in Reserved field * general.c small fix 2004-03-08 Ravindra * hatchbrush.c: Implemented cross hatch style. * hatchbrush.h: Modified a function signature. 2004-03-08 Ravindra * solidbrush.c: cairo_set_rgb_color bug fix. * hatchbrush.c: cairo_set_rgb_color bug fix. 2004-03-07 Sanjay Gupta * gdip.h: Included ImageFlag enum and moved certain enums from gdipImage.h * gdipImage.h: Moved few enums to gdip.h * image.c: Implemented few functions 2004-03-06 Ravindra * pen.c: Indentation. * solidbrush.c: Coding style. * hatchbrush.c: Coding style and removed printf. 2004-03-05 Duncan Mak * graphics-path.c (GdipAddPathPath): Fix index, it should be 0, not 1. (GdipAddPathPolygon): Add a line back to the starting point to complete the polygon if the first and last points are not the same. 2004-03-04 Duncan Mak * graphics-path.c (GdipAddPathPath): Implemented. 2004-03-04 Jordi Mas i Hernandez * stringformat.c - DigitSubstitution and TabStob methods 2004-03-03 Miguel de Icaza * gdip_win32.c (_load_gdi32, _load_user32): Use the _WINE_SHAREDLIB_PATH environment variable to locate our dynamic libraries. * general.c (_load_x11drv): Load the library from the special location provided by the Wine init function. 2004-03-03 Jordi Mas i Hernandez * stringformat.c - coding style 2004-03-02 Jordi Mas i Hernandez * graphics.c - Implemented font strikeout and underline * font.c - Implemented font strikeout and underline, allows multiple attributes 2004-03-01 Sanjay Gupta * bitmap.c: Access modification in Get/Set Pixel() 2004-02-29 Ravindra * hatchbrush.c: Implemented four vertical hatching styles and did few comment improvements. 2004-02-28 Miguel de Icaza * font.c: Coding style, ANSI-C-ification * Makefile.am: Add -ansi, -pedantic and -Werror, to keep this clean. * bitmap.c (GdipBitmapSetPixel): Optimize SetPixel, remove non-ANSI-isms. * region.c: Ansi C again. * hatchbrush.c: ANSI C again. * graphics.c: Clean up the mess in this file: Turn into ANSI C: No // for comments; No variable declarations in the middle of a file. Fix the coding style (spacing, indentation). 2004-02-28 Sanjay Gupta * bitmap.c: Implemented GetPixel and SetPixel method. * gdip.h: Added declaration for GetPixel and SetPixel method. * gdipImage.h: Removed typedef for ARGB 2004-02-27 Ravindra * hatchbrush.c: First implementation. Implementing only four hatching styles as of now. More to be added. * hatchbruush.h: Defines hatch struct, hatchstyle enum and also declaration for hatch brush functions. * Makefile.am: Added hatchbruch.[ch] to sources. 2004-02-26 Ravindra * graphics.c: Added cairo_save () and cairo_restore () function calls in Draw and Fill functions. 2004-02-25 Jordi Mas i Hernandez * StringFormat.c - new methods * Font.c - PrivateFontCollection methods 2004-02-24 Jordi Mas i Hernandez * font.c - added metrics for font families 2004-02-23 Jordi Mas i Hernandez * graphics.c - added GdipMeasureString 2004-02-22 Ravindra * texturebrush.c: First implementation. Needs some fixing. * texturebrush.h: Defines texture struct, wrapmode enum and also declaration for texture functions. * Makefile.am: Added texturebruch.[ch] to sources. 2004-02-21 Sanjay Gupta * gdip.h: Added typedef for UINT * Image.h: Added function stubs for image functions * gdipImage.h: Added new file containing image function declaration 2004-02-17 Jordi Mas i Hernandez * fonts.c - remove unnecesary code and fixes 2004-02-17 Jordi Mas i Hernandez * fonts.c suport for unit conversion * general.c - suport for unit conversion * graphics.c - single line drawing 2004-02-16 Ravindra * gdip.h: Moved GpStatus enum and GpGraphics struct back from brush.h in here. Thanks to Duncan, for pointing this out. * brush.h: Moved out GpStatus enum and GpGraphics struct back to gdip.h. 2004-02-13 Ravindra * brush.h: Added. For implementing brushes in OO-C, we have Brush and BrushClass (vtable) structs defined here and related functions are declared. * solidbrush.h: Added. For implementing brushes in OO-C, we have SolidBrush struct defined here. Also, solid brush functions are declared. * gdip.h: Moved out brush functions to brush.h and solidbrush functions to solidbrush.h. Also, moved GpStatus enum and GpGraphics struct to brush.h. (This is just to satisfy compiler). * brush.c: All functions are modified to call functions from vtable. * solidbrush.c: new(), init(), setup(), clone() and destroy() functions are modified. * pen.c: gdip_pen_setup(): Modified to call gdip_brush_setup irrespective of brush type. GdipCreatePen2(): Added status checks. Now we set color also when SolidBrush is in the question. This applies to GdipSetPenBrushFill() method also. * stringformat.c: Renaming method gdip_brush_init to gdip_stringformat_init. Because the method name is used in brush.c. 2004-02-13 Jordi Mas i Hernandez * fonts.c fixed re-use of the same font, fixed size problems * graphics.c - string format, aligment, etc * stringformat.c - initial implementation 2004-02-05 Duncan Mak * gdip.h (GpRect, GpRectF): Instead of storing coordinates in terms of top, left, right, bottom, changed it to use X, Y, Width and Height instead. This matches the requirements for GDI+ (Flat API and the C++ wrapper) as well as System.Drawing. * bitmap.c (GdipBitmapLockBits): * matrix.c (GdipCreateMatrix3, GdipCreateMatrix3I): * graphics.c (GdipDrawString): * graphics-path.c (GdipAddPathRectangles, GdipAddPathRectanglesI): Use X, Y, Width, Height coordinates instead of the old system. 2004-02-05 Duncan Mak * graphics.c: Fixed indentation. 2004-02-05 Jordi Mas i Hernandez * font.c - first implementation 2004-01-29 Duncan Mak * bitmap.c (gdip_bitmap_dispose): Add a check for own_scan0. (GdipCreateBitmapFromScan0): Set own_scan0 flag if we own the incoming buffer, scan0. * gdip.h (GdipBitmapData): Add new field, own_scan0. 2004-01-26 Duncan Mak * bitmap.c (GdipCreateBitmapFromScan0): Use GdipAlloc here instead of malloc. (gdip_bitmap_dispose): Call GdipFree on bitmap->data.scan0 here. Jordi did the work for this, not me; I'm just the messenger. 2004-01-26 Duncan Mak * graphics.c (GdipDrawPath): Doh! Added stupid breaks inside the switch, so we can draw simple paths (lines) now. For more complex curves, the array is holding some NaNs, so I'll need to look into that. * bitmap.c: (GdipCreateBitmapFromScan0): Set allocate memory for scan0 if it is NULL. Thanks to Jordi for fixing this, we can now write out to a file again. 2004-01-26 Duncan Mak * graphics.c: Use C style comments instead of C++ style. * pen.c (clone_dash_array): new helper function. (GdipClonePen): Copy matrix and dash_array, removed the FIXME. 2004-01-23 Duncan Mak * graphics.c (GdipDrawPath): Implemented. 2004-01-20 Ravindra * pen.c (GdipGetPenTransform): Fixed function signature, this fixes bug #52811. 2004-01-19 Duncan Mak * graphics-path.c (GdipGetPathPoints): Fixed. (GdipCreatePath): Remember to initialize the arrays instead of just setting them to NULL. (GdipGetPathTypes, GdipGetPathPoints): Fix signature. * Makefile (local_sources): Add graphics-path.c to the build. 2004-01-13 Duncan Mak * matrix.c (GdipCreateMatrix): Use gdip_get_status instead of just returning Ok; 2004-01-13 Bernie Solomon * graphics-path.c (append): fix struct initialization for old fashioned C compilers 2004-01-13 Ravindra * pen.c: Initialized pen.matrix field to identity matrix. 2004-01-10 Alexandre Pigolkine * bitmap.c * brush.c cosmetic changes * gdip.h new field added to GpPen structure * gdip_win32.h conditional compilation flag used to reflect changes in Cairo > 0.14 * graphics.c restore position in GRAPHICS_STATE stack * matrix.c order of matrices in GdipMultiplyMatrix changed * pen.c initialization of fields, protection in GdipDeletePen function added 2003-12-25 Duncan Mak * graphics-path.c (GdipAddPathLine): Use append instead of append_point. (GdipTransformPath): Remember to reset the points after the transformation. 2003-12-25 Duncan Mak * graphics.c (DrawBezier, DrawBezierI): Well, it's pretty obvious that the code was incorrect before. After Christmas, I'm gonna hook up the GraphicsPath code and work on testing and making sure this stuff is correct. I'm pretty sure, in a first pass, there are lots of littles bugs waiting to be fixed. * graphics-path.c (new_point): Removed, we now pack the point inside the append functions. (append): New function that takes the X, Y coordinates directly. (append_bezier): Take coordinates instead of GpPointFs. Use the new append function instead of append_point. 2003-12-23 Duncan Mak * graphics-path.c: * graphics-path.h: Implemented GraphicsPath. * Makefile: Added graphics-path.c. * gdip.h (GpPathPointType, GpWarpMode): Added. 2003-12-21 Duncan Mak * graphics.c (C1): Made it more precise. (make_pie): Fixed. (make_arc): New helper function for getting the right Bezier for an elliptical arc, based on an algorithm found in the comp.text.pdf FAQ. 2003-12-02 Bernie Solomon * pen.c (GdipSetPenLineCap): fix arg type so it compiles using HP compiler. * gdip.h: fix spelling of GdipSetPenLineJoin and add prototype for GdipGetPenLineJoin 2003-11-28 Duncan Mak * brush.c (gdip_brush_setup): Check on the type of the brush and delegate the implementation to the concrete Brushes, (GdipCloneBrush, GdipDeleteBrush, GdipGetBrushType): Implemented. * gdip.h (DashStyle): Fixed typo. (PenAlignment, BrushType): Added new enumerations. (GpBrush): Added new type field. (GpPen): Added new fields: color, brush, mode, dash_array and unit. Updated the header file to include new Pen functions. * pen.c (convert_dash_array): Utitlity function for converting from a float* from GDI+ to a double* for Cairo. (GdipCreatePen2, GdipClonePen): Implemented. (PenWidth, BrushFill, Color, PenMode, PenUnit, DashStyle): (DashOffset, DashCount, DashArray): Implemented the Get/Set function pairs for these properties. (GdipGetPenCompoundArray, GdipSetPenCompoundArray): (GdipGetPenCompoundArrayCount): Stubbed. * solidbrush.c (gdip_solidfill_init): Utility for initializing a SolidBrush. Sets type as BrushTypeSolidColor. (gdip_solidfill_setup): Moved from gdip_brush_setup. (gdip_solidfill_clone): Implementation for GdipCloneBrush for a GpSolidFill. (GdipSetSolidFillColor, GdipGetSolidFillColor): Implemented. 2003-11-22 Duncan Mak * matrix.c (GdipCreateMatrix3, GdipCreateMatrix3I): Implemented. (GdipCloneMatrix): Fixed. (GdipShearMatrix, set_shear): Implemented. * graphics.c: (GdipGetWorldTransform, GdipMultiplyWorldTransform): Implemented. (GdipRotatePenTransform, GdipTranslatePenTransform): Use GDI+ functions instead. * gdip.h (GdipRotatePenTransform, GdipTranslatePenTransform): Fix signature. (GdipCreateMatrix3, GdipCreateMatrix3I): Use const appropriately. 2003-11-17 Duncan Mak * matrix.c (matrix_equals): New helper function help test matrix equality. (GdipIsMatrixIdentity, GdipIsMatrixEqual): Use matrix_equals. (GdipGetMatrixElements): Don't malloc here, because the caller should hand us an allocated array. 2003-11-16 Duncan Mak * matrix.c (GdipCreateMatrix2, GdipCreateMatrix3) (GdipCreateMatrix3I): Implemented. * pen.c (GdipResetPenTransform): (GdipMultiplyPenTransform, GdipTranslatePenTransform): (GdipScalePenTransform, GdipRotatePenTransform): Implemented. * matrix.c (set_translate, set_scale, set_rotate): Helper functions copied from Cairo. We are doing this because you can specify the order of multiplcation in GDI+, but not in Cairo. 2003-11-15 Duncan Mak * graphics.c: Moved PI and GRADTORAD to gdip.h. * gdip.h: Renamed GRADTORAD to DEGTORAD. * matrix.c (GdipCloneMatrix): Fix argument order. * matrix.c (GdipMultiplyMatrix, GdipTranslateMatrix, GdipScaleMatrix): (GdipRotateMatrix, GdipInvertMatrix): (GdipTransformMatrixPoints, GdipVectorTransformMatrixPoints): (GdipSetMatrixElements, GdipGetMatrixElements): (GdipIsMatrixInvertible): Implemented. * matrix.c (GdipIsMatrixIdentity, GdipIsMatrixEqual): Implemented. 2003-11-14 Duncan Mak * general.c (gdip_get_status): Take cairo_status_t instead of cairo_t. We need this because this is used in matrix.c and we only have cairo_matrix_t there. * graphics.c: Updated calls to gdip_get_status. * pen.c (convert_line_cap, convert_line_join): Added static keyword. (GdipDeletePen): Implemented. * matrix.c (GdipCreateMatrix2, GdipCloneMatrix, GdipInvertMatrix): Use gdip_get_status instead of just returning Ok. (GdipRotateMatrix, GdipScaleMatrix, GdipTranslateMatrix): Implemented. 2003-11-12 Duncan Mak * bitmap.c, brush.c, general.c: * graphics.c, image.c, matrix.c: * pen.c, solidbrush.c: Use gdip.h instead of gdip_main.h. * gdip.h: New header file, merged from gdip_main.h and gdip_defs.h. * gdip_main.h, gdip_defs.h: Removed. * pen.c (convert_line_join, convert_line_cap): new function for converting enumerations between GDI+ and Cairo. (gdip_pen_setup): set miter limit and line join. (GdipSetPenMiterLimit, GdipGetPenMiterLimit): (GdipSetPenLineJoin, GdipGetPenLineJoin): (GdipSetPenLineJoin, GdipGetPenTransform): implemented. 2003-11-12 Alexandre Pigolkine * bitmap.c copy image funciton added 2003-11-06 Duncan Mak * graphics.c (GdipDrawRectangle): Add call to gdip_pen_setup so that we stroke with the right color. 2003-11-05 Duncan Mak * graphics.c (make_pie, make_ellipse, make_polygon): Add static keyword. * gdip_defs.h: Update headers to include DrawBezier, DrawBeziers, DrawEllipse, DrawPie, DrawPolygon, DrawRectangle, FillEllipse, FillPolygon and the RenderingOrigin property. * Makefile (install-local): Added missing semi-colons. 2003-11-03 Bernie Solomon * gdip_main.h, gdip_win32.h, gdip_win32.c: fixes for non-GCC compilers 2003-11-02 Alexandre Pigolkine * bitmap.c convert 24/32 bpp images in LockBits 2003-11-01 Duncan Mak * matrix.c (GdipCreateMatrix, GdipCreateMatrix2, GdipCloneMatrix): (GdipDeleteMatrix, GdipInvertMatrix): Implemented; the rest of the functions are stubbed out. * gdip_defs.h (GpMatrixOrder): Added. * gdip_main.h (GpRect, GpRectF): Synonyms for Rect and RectF. (GpMatrix): An alias of cairo_matrix_t. * Makefile: Added matrix.c. 2003-10-28 Duncan Mak * gdip_main.h, gdip_def.h: Renamed all gdip_foo_ptr types are now GpFoo *. Renamed Status to GpStatus. Reformatted all C++ style comments to C style comments. Reformatted all C function prototypes to the style used by GTK+. * gdip_main.h (GpPoint, GpPointF): Added. * gdip_defs.h (GpFillMode): Added. * graphics.c (make_ellipse): (make_polygon, make_polygon_from_integers): (make_pie): private functions (make_foo) to be reused by DrawFoo and FillFoo. (convert_fill_mode): Converts a GpFillMode to a cairo_fill_rule_t. (GdipDrawPie, GdipFillEllipse, GdipFillPolygon): Implemented. 2003-10-26 Duncan Mak * graphics.c (GdipSetRenderingOrigin, GdipGetRenderingOrigin): Implemented. 2003-10-25 Duncan Mak * graphics.c (GdipDrawBezier, GdipDrawBezierI): (GdipDrawBeziers, GdipDrawBeziersI): (GdipDrawLine, GdipDrawLineI): (GdipDrawLines, GdipDrawLinesI): implemented. (GdipFillRectangle): (GdipDrawString): Make use of gdip_get_status. * general.c (gdip_get_status): A new function for retrieving a Status from a cairo_t. 2003-10-23 Miguel de Icaza * bitmap.c (GdipCreateBitmapFromScan0): Do not allocate buffer here, expect that our caller to allocate that. Do not compute the stride here, expect our caller to do this properly. * Use the Mono coding conventions. 2003-10-15 Alexandre Pigolkine * image.c GdipDrawImageRectI changed 2003-10-14 Alexandre Pigolkine * gdip_defs.h * graphics.c * gdip_main.h DrawString function added 2003-10-12 Alexandre Pigolkine * bitmap.c * brush.c * gdip_defs.h * gdip_win32.c * gdip_win32.h * gdip_main.h * general.c * graphics.c * image.c * Makefile * pen.c * solidbrush.c Added libgdiplus-2.11/src/gdip.h0000664000175000017500000000260212225470167012407 00000000000000/* * gdip.h - THIS FILE IS DEPRECATED - please use the new GdiPlusFlat.h header file * * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #warning The file gdip.h will eventually disappear, please directly include GdiPlusFlat.h instead #include "GdiPlusFlat.h" libgdiplus-2.11/src/solidbrush.h0000664000175000017500000000274512225470167013652 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * Copyright (C) 2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef __SOLIDBRUSH_H__ #define __SOLIDBRUSH_H__ #include "brush.h" GpStatus GdipCreateSolidFill (ARGB color, GpSolidFill **brush); GpStatus GdipGetSolidFillColor (GpSolidFill *brush, ARGB *color); GpStatus GdipSetSolidFillColor (GpSolidFill *brush, ARGB color); #endif libgdiplus-2.11/src/text.c0000664000175000017500000001072212225470167012445 00000000000000/* * text.c * * Copyright (c) 2003 Alexandre Pigolkine, Novell Inc. * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #include "gdiplus-private.h" #ifdef USE_PANGO_RENDERING #include "text-pango-private.h" #else #include "text-cairo-private.h" #endif #include "text-metafile-private.h" /* * Text API - validate and delegate */ GpStatus GdipDrawString (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GpBrush *brush) { GDIPCONST WCHAR *ptr = NULL; if (length == 0) { return Ok; } else if (length == -1) { ptr = string; length = 0; while (*ptr != 0) { length++; ptr++; } } if (!graphics || !string || !font || !layoutRect) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return text_DrawString (graphics, string, length, font, layoutRect, stringFormat, brush); case GraphicsBackEndMetafile: return metafile_DrawString (graphics, string, length, font, layoutRect, stringFormat, brush); default: return GenericError; } } GpStatus GdipMeasureString (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, RectF *boundingBox, int *codepointsFitted, int *linesFilled) { GDIPCONST WCHAR *ptr = NULL; if (length == 0) { if (boundingBox) { if (layoutRect) { boundingBox->X = layoutRect->X; boundingBox->Y = layoutRect->Y; } else { boundingBox->X = 0; boundingBox->Y = 0; } boundingBox->Width = 0; boundingBox->Height = 0; } if (linesFilled) { *linesFilled = 0; } if (codepointsFitted) { *codepointsFitted = 0; } return Ok; } else if (length == -1) { ptr = string; length = 0; while (*ptr != 0) { length++; ptr++; } } if (!graphics || !string || !font || !layoutRect) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: /* a metafile-based graphics returns the correct measures but doesn't record anything */ case GraphicsBackEndMetafile: return text_MeasureString (graphics, string, length, font, layoutRect, stringFormat, boundingBox, codepointsFitted, linesFilled); default: return GenericError; } } GpStatus GdipMeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, int regionCount, GpRegion **regions) { /* note: a NULL format is invalid */ if (!graphics || !string || (length == 0) || !font || !layoutRect || !stringFormat || !regions) return InvalidParameter; /* No char range or bounding rect is set for measurements */ if (stringFormat->charRangeCount == 0) { *regions = NULL; return Ok; } /* if non-zero (previous check) format->charRangeCount must match regionCount */ if (regionCount != stringFormat->charRangeCount) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: /* a metafile-based graphics returns the correct measures but doesn't record anything */ case GraphicsBackEndMetafile: return text_MeasureCharacterRanges (graphics, string, length, font, layoutRect, stringFormat, regionCount, regions); default: return GenericError; } } libgdiplus-2.11/src/icocodec.c0000664000175000017500000002462212225470167013235 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "gdiplus-private.h" #include "icocodec.h" GUID gdip_ico_image_format_guid = {0xb96b3cb5U, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; /* Codecinfo related data*/ static ImageCodecInfo ico_codec; static const WCHAR ico_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'I', 'C', 'O', 0}; /* Built-in ICO */ static const WCHAR ico_extension[] = {'*','.','I', 'C', 'O', 0}; /* *.ICO */ static const WCHAR ico_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'x', '-', 'i', 'c', 'o', 'n', 0}; /* image/x-icon */ static const WCHAR ico_format[] = {'I', 'C', 'O', 0}; /* ICO */ static const BYTE ico_sig_pattern[] = { 0x00, 0x00, 0x01, 0x00 }; static const BYTE ico_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF }; ImageCodecInfo* gdip_getcodecinfo_ico () { ico_codec.Clsid = (CLSID) { 0x557cf407, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; ico_codec.FormatID = gdip_ico_image_format_guid; ico_codec.CodecName = (const WCHAR*) ico_codecname; ico_codec.DllName = NULL; ico_codec.FormatDescription = (const WCHAR*) ico_format; ico_codec.FilenameExtension = (const WCHAR*) ico_extension; ico_codec.MimeType = (const WCHAR*) ico_mimetype; ico_codec.Flags = ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; ico_codec.Version = 1; ico_codec.SigCount = 1; ico_codec.SigSize = 4; ico_codec.SigPattern = ico_sig_pattern; ico_codec.SigMask = ico_sig_mask; return &ico_codec; } static BYTE get_ico_data (BYTE *data, int x, int y, int bpp, int line_length) { BYTE result = 0; BYTE *line_data = data + y * line_length; switch (bpp) { case 1: result = (line_data [x >> 3] >> (7 - (x & 7))) & 0x01; break; case 4: result = line_data [x >> 1]; if ((x & 1) == 1) result &= 0x0F; else result >>= 4; break; case 8: result = line_data [x]; break; } return result; } static BOOL read_ICONDIRENTRY (void *pointer, ICONDIRENTRY *entry, ImageSource source, BOOL decode) { if (gdip_read_ico_data (pointer, (void*)entry, sizeof (ICONDIRENTRY), source) != sizeof (ICONDIRENTRY)) return FALSE; #if WORDS_BIGENDIAN if (decode) { BYTE *b; /* entry->bWidth, bHeight, bColorCount, bReserved are all BYTE, no change required */ b = (BYTE*)&entry->wPlanes; entry->wPlanes = (b[1] << 8) | b[0]; b = (BYTE*)&entry->wBitCount; entry->wBitCount = (b[1] << 8) | b[0]; b = (BYTE*)&entry->dwBytesInRes; entry->dwBytesInRes = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0]; b = (BYTE*)&entry->dwImageOffset; entry->dwImageOffset = (b[3] << 24) | (b[2] << 16) | (b[1] << 8) | b[0]; } #endif return TRUE; } static GpStatus gdip_read_ico_image_from_file_stream (void *pointer, GpImage **image, ImageSource source) { GpStatus status = InvalidParameter; GpBitmap *result = NULL; BYTE *pixels = NULL; WORD w, count; void *p = &w; BYTE *b = (BYTE*)&w; ICONDIRENTRY entry; int i, pos; BOOL upsidedown = TRUE; BOOL os2format = FALSE; BITMAPINFOHEADER bih; int palette_entries = -1; ARGB *colors = NULL; int x, y; int line_xor_length, xor_size; int line_and_length, and_size; BYTE *xor_data = NULL, *and_data = NULL; /* WORD ICONDIR.idReserved / reversed, MUST be 0 */ if (gdip_read_ico_data (pointer, p, sizeof (WORD), source) != sizeof (WORD)) goto error; if (w != 0) goto error; /* WORD ICONDIR.idType / resource type, MUST be 1 for icons */ if (gdip_read_ico_data (pointer, p, sizeof (WORD), source) != sizeof (WORD)) goto error; i = (b[1] << 8 | b[0]); if (i != 1) goto error; /* WORD ICONDIR.idCount / number of icons, must be greater than 0 */ if (gdip_read_ico_data (pointer, p, sizeof (WORD), source) != sizeof (WORD)) goto error; count = (b[1] << 8 | b[0]); if (count < 1) goto error; pos = 6; /* * NOTE: it looks like (from unit tests) that we get the last icon * (e.g. it can return the 16 pixel version, instead of the 32 or 48 pixels available in the same file) */ for (i = 0; i < count - 1; i++) { if (!read_ICONDIRENTRY (pointer, &entry, source, FALSE)) goto error; pos += sizeof (ICONDIRENTRY); } /* last one is important, so we must decode (endianess) it's values */ if (!read_ICONDIRENTRY (pointer, &entry, source, TRUE)) goto error; pos += sizeof (ICONDIRENTRY); while (pos < entry.dwImageOffset) { if (gdip_read_ico_data (pointer, p, sizeof (WORD), source) != sizeof (WORD)) goto error; pos += sizeof (WORD); } /* BITMAPINFOHEADER */ status = gdip_read_BITMAPINFOHEADER (pointer, &bih, source, &os2format, &upsidedown); if (status != Ok) goto error; result = gdip_bitmap_new_with_frame (NULL, TRUE); result->type = ImageTypeBitmap; result->image_format = ICON; result->active_bitmap->pixel_format = PixelFormat32bppARGB; /* icons are always promoted to 32 bbp */ result->active_bitmap->width = entry.bWidth; result->active_bitmap->height = entry.bHeight; result->active_bitmap->stride = result->active_bitmap->width * 4; /* Ensure 32bits alignment */ gdip_align_stride (result->active_bitmap->stride); result->active_bitmap->dpi_horz = 96.0f; result->active_bitmap->dpi_vert = 96.0f; switch (bih.biBitCount) { case 1: case 4: case 8: /* support 2, 16 and 256 colors icons, with palettes, no compression */ if (bih.biCompression == 0) palette_entries = 1 << bih.biBitCount; break; case 24: /* support 24bits + alpha bitmap, this is not documented anywhere but Windows accept them as valid */ case 32: /* support 24bits + 8 bits alpha (aka "XP" icons), no palette, no compression */ if (bih.biCompression == 0) palette_entries = 0; break; } if (palette_entries < 0) { g_warning ("Unknown icon format, bitcount = %d, compression = %d", bih.biBitCount, bih.biCompression); status = InvalidParameter; goto error; } /* * Strangely, even if we're supplying a 32bits ARGB image, * the icon's palette is also supplied with the image. */ result->active_bitmap->palette = GdipAlloc (sizeof(ColorPalette) + sizeof(ARGB) * palette_entries); if (result->active_bitmap->palette == NULL) { status = OutOfMemory; goto error; } result->active_bitmap->palette->Flags = 0; result->active_bitmap->palette->Count = palette_entries; for (i = 0; i < palette_entries; i++) { /* colors are stored as R, G, B and reserved (always 0) */ BYTE color[4]; void *p = &color; if (gdip_read_ico_data (pointer, p, 4, source) < 4) { status = InvalidParameter; goto error; } set_pixel_bgra (result->active_bitmap->palette->Entries, i * 4, (color[0] & 0xFF), /* B */ (color[1] & 0xFF), /* G */ (color[2] & 0xFF), /* R */ 0xFF); /* Alpha */ } /* * Let's build the 32bpp ARGB bitmap from the icon's XOR and AND bitmaps * notes: * - XORBitmap can be a 1, 4 or 8 bpp bitmap * - ANDBitmap is *always* a monochrome (1bpp) bitmap * - in every case each line is padded to 32 bits boundary */ pixels = GdipAlloc (result->active_bitmap->stride * result->active_bitmap->height); if (pixels == NULL) { status = OutOfMemory; goto error; } result->active_bitmap->scan0 = pixels; result->active_bitmap->reserved = GBD_OWN_SCAN0; result->active_bitmap->image_flags = ImageFlagsReadOnly | ImageFlagsHasRealPixelSize | ImageFlagsColorSpaceRGB | ImageFlagsHasAlpha; line_xor_length = (((bih.biBitCount * entry.bWidth + 31) & ~31) >> 3); xor_size = line_xor_length * entry.bHeight; xor_data = (BYTE*) GdipAlloc (xor_size); if (!xor_data) { status = OutOfMemory; goto error; } if (gdip_read_ico_data (pointer, xor_data, xor_size, source) < xor_size) { status = InvalidParameter; goto error; } line_and_length = (((entry.bWidth + 31) & ~31) >> 3); and_size = line_and_length * entry.bHeight; and_data = (BYTE*) GdipAlloc (and_size); if (!and_data) { status = OutOfMemory; goto error; } if (gdip_read_ico_data (pointer, and_data, and_size, source) < and_size) { status = InvalidParameter; goto error; } colors = result->active_bitmap->palette->Entries; for (y = 0; y < entry.bHeight; y++) { for (x = 0; x < entry.bWidth; x++) { ARGB color; if (palette_entries > 0) { color = colors [get_ico_data (xor_data, x, y, bih.biBitCount, line_xor_length)]; if (get_ico_data (and_data, x, y, 1, line_and_length) == 1) color &= 0x00FFFFFF; } else if (bih.biBitCount == 24) { /* take 1bpp alpha from the and_data */ if (get_ico_data (and_data, x, y, 1, line_and_length) == 1) { color = 0; } else { BYTE *line_data = xor_data + y * line_xor_length + x * 3; color = 0xFF000000 | (line_data [0] | line_data [1] << 8| line_data [2] << 16); } } else { BYTE *line_data = xor_data + y * line_xor_length + x * 4; /* ARGB to BRGA */ color = (line_data [0] | line_data [1] << 8 | line_data [2] << 16 | line_data [3] << 24); } /* image is reversed (y) */ GdipBitmapSetPixel (result, x, entry.bHeight - y - 1, color); } } GdipFree (xor_data); GdipFree (and_data); *image = result; return Ok; error: if (result) GdipDisposeImage (result); if (xor_data) GdipFree (xor_data); if (and_data) GdipFree (and_data); return status; } GpStatus gdip_load_ico_image_from_file (FILE *fp, GpImage **image) { return gdip_read_ico_image_from_file_stream ((void*)fp, image, File); } GpStatus gdip_load_ico_image_from_stream_delegate (dstream_t *loader, GpImage **image) { return gdip_read_ico_image_from_file_stream ((void *)loader, image, DStream); } libgdiplus-2.11/src/fontfamily.h0000664000175000017500000000520412225470167013635 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __FONTFAMILY_H__ #define __FONTFAMILY_H__ /* FontFamily public API (only!) */ GpStatus GdipCreateFontFamilyFromName (GDIPCONST WCHAR *name, GpFontCollection *fontCollection, GpFontFamily **FontFamily); GpStatus GdipCloneFontFamily (GpFontFamily *fontFamily, GpFontFamily **clonedFontFamily); GpStatus GdipDeleteFontFamily (GpFontFamily *fontFamily); GpStatus GdipGetCellAscent (GDIPCONST GpFontFamily *family, int style, guint16 *CellAscent); GpStatus GdipGetCellDescent (GDIPCONST GpFontFamily *family, int style, guint16 *CellDescent); GpStatus GdipGetGenericFontFamilySansSerif (GpFontFamily **nativeFamily); GpStatus GdipGetGenericFontFamilySerif (GpFontFamily **nativeFamily); GpStatus GdipGetGenericFontFamilyMonospace (GpFontFamily **nativeFamily); GpStatus GdipGetEmHeight (GDIPCONST GpFontFamily *family, int style, guint16 *EmHeight); GpStatus GdipGetFamilyName (GDIPCONST GpFontFamily *family, WCHAR name[LF_FACESIZE], LANGID language); GpStatus GdipGetLineSpacing (GDIPCONST GpFontFamily *family, int style, guint16 *LineSpacing); GpStatus GdipIsStyleAvailable (GDIPCONST GpFontFamily *family, int style, BOOL *IsStyleAvailable); #endif libgdiplus-2.11/src/graphics.c0000664000175000017500000017176312225470167013276 00000000000000/* * graphics.c * * Copyright (c) 2003 Alexandre Pigolkine, Novell Inc. * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #include "graphics-private.h" #include "graphics-cairo-private.h" #include "graphics-metafile-private.h" #include "region-private.h" #include "graphics-path-private.h" #include "brush-private.h" #include "matrix-private.h" #include "bitmap-private.h" #include "metafile-private.h" #include #define NO_CAIRO_AA #define MAX_GRAPHICS_STATE_STACK 512 float gdip_unit_conversion (Unit from, Unit to, float dpi, GraphicsType type, float nSrc) { float inchs = 0; switch (from) { case UnitDocument: inchs = nSrc / 300.0f; break; case UnitInch: inchs = nSrc; break; case UnitMillimeter: inchs = nSrc / 25.4f; break; case UnitDisplay: if (type == gtPostScript) { /* Uses 1/100th on printers */ inchs = nSrc / 100; } else { /* Pixel for video display */ inchs = nSrc / dpi; } break; case UnitPixel: case UnitWorld: inchs = nSrc / dpi; break; case UnitPoint: inchs = nSrc / 72.0f; break; case UnitCairoPoint: if (type == gtPostScript) { /* Uses 1/100th on printers */ inchs = nSrc / 72.0f; } else { /* Pixel for video display */ inchs = nSrc / dpi; } break; default: return nSrc; } switch (to) { case UnitDocument: return inchs * 300.0f; case UnitInch: return inchs; case UnitMillimeter: return inchs * 25.4f; case UnitDisplay: if (type == gtPostScript) { /* Uses 1/100th on printers */ return inchs * 100; } else { /* Pixel for video display */ return inchs * dpi; } case UnitPixel: case UnitWorld: return inchs * dpi; case UnitPoint: return inchs * 72.0f; case UnitCairoPoint: if (type == gtPostScript) { /* Uses 1/100th on printers */ return inchs * 72.0f; } else { /* Pixel for video display */ return inchs * dpi; } default: return nSrc; } } static void gdip_graphics_reset (GpGraphics *graphics) { /* if required, previous_matrix will be assigned later (e.g. containers) */ cairo_matrix_init_identity (&graphics->previous_matrix); GdipResetClip (graphics); cairo_matrix_init_identity (graphics->clip_matrix); graphics->page_unit = UnitDisplay; graphics->scale = 1.0f; graphics->interpolation = InterpolationModeBilinear; graphics->composite_quality = CompositingQualityDefault; graphics->composite_mode = CompositingModeSourceOver; graphics->text_mode = TextRenderingHintSystemDefault; graphics->pixel_mode = PixelOffsetModeDefault; graphics->text_contrast = DEFAULT_TEXT_CONTRAST; GdipSetSmoothingMode(graphics, SmoothingModeNone); } static void gdip_graphics_common_init (GpGraphics *graphics) { graphics->image = NULL; graphics->type = gtUndefined; cairo_identity_matrix (graphics->ct); GdipCreateMatrix (&graphics->copy_of_ctm); cairo_matrix_init_identity (graphics->copy_of_ctm); GdipCreateRegion (&graphics->clip); GdipCreateMatrix (&graphics->clip_matrix); graphics->bounds.X = graphics->bounds.Y = graphics->bounds.Width = graphics->bounds.Height = 0; graphics->last_pen = NULL; graphics->last_brush = NULL; graphics->saved_status = NULL; graphics->saved_status_pos = 0; graphics->render_origin_x = 0; graphics->render_origin_y = 0; graphics->dpi_x = graphics->dpi_y = 0; graphics->display = NULL; graphics->drawable = NULL; gdip_graphics_reset (graphics); } static void gdip_graphics_cairo_init (GpGraphics *graphics, cairo_surface_t *surface) { graphics->backend = GraphicsBackEndCairo; graphics->metafile = NULL; graphics->ct = cairo_create (surface); #ifndef NO_CAIRO_AA cairo_set_shape_format (graphics->ct, CAIRO_FORMAT_A1); #endif /* cairo_select_font_face (graphics->ct, "serif:12"); */ cairo_select_font_face (graphics->ct, "serif:12", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); gdip_graphics_common_init (graphics); } GpGraphics * gdip_graphics_new (cairo_surface_t *surface) { GpGraphics *result = (GpGraphics *) GdipAlloc (sizeof (GpGraphics)); if (result) gdip_graphics_cairo_init (result, surface); return result; } static void gdip_graphics_metafile_init (GpGraphics *graphics, GpMetafile *metafile) { graphics->backend = GraphicsBackEndMetafile; /* some API requires a valid cairo context (even on a metafile-based graphics) */ graphics->metasurface = cairo_image_surface_create (CAIRO_FORMAT_A1, 1, 1); graphics->ct = cairo_create (graphics->metasurface); graphics->metafile = metafile; gdip_graphics_common_init (graphics); } GpGraphics* gdip_metafile_graphics_new (GpMetafile *metafile) { GpGraphics *result = (GpGraphics *) GdipAlloc (sizeof (GpGraphics)); if (result) gdip_graphics_metafile_init (result, metafile); return result; } // coverity[+alloc : arg-*1] GpStatus GdipCreateFromHDC (void *hDC, GpGraphics **graphics) { GpGraphics *clone = (GpGraphics *) hDC; cairo_surface_t *surface; int x, y; unsigned int w, h, border_w, depth; Window root; if (!hDC) return OutOfMemory; #ifdef CAIRO_HAS_PS_SURFACE if (clone->type == gtPostScript) { *graphics = clone; return Ok; } #endif if (clone->type == gtMemoryBitmap) return GdipGetImageGraphicsContext (clone->image, graphics); #ifdef CAIRO_HAS_XLIB_SURFACE XGetGeometry (clone->display, clone->drawable, &root, &x, &y, &w, &h, &border_w, &depth); surface = cairo_xlib_surface_create(clone->display, clone->drawable, DefaultVisual(clone->display, DefaultScreen(clone->display)), w, h); *graphics = gdip_graphics_new (surface); if (!*graphics) return OutOfMemory; (*graphics)->dpi_x = (*graphics)->dpi_y = gdip_get_display_dpi (); cairo_surface_destroy (surface); if ((*graphics)->drawable) (*graphics)->drawable = clone->drawable; if ((*graphics)->display) (*graphics)->display = clone->display; return Ok; #endif return NotImplemented; } GpStatus GdipCreateFromHWND (void *hwnd, GpGraphics **graphics) { return NotImplemented; } #ifdef CAIRO_HAS_QUARTZ_SURFACE // coverity[+alloc : arg-*3] GpStatus GdipCreateFromContext_macosx (void *ctx, int width, int height, GpGraphics **graphics) { cairo_surface_t *surface; if (!graphics) return InvalidParameter; surface = cairo_quartz_surface_create (0, width, height); *graphics = gdip_graphics_new(surface); (*graphics)->dpi_x = (*graphics)->dpi_y = gdip_get_display_dpi (); cairo_surface_destroy (surface); (*graphics)->bounds.Width = width; (*graphics)->bounds.Height = height; (*graphics)->type = gtOSXDrawable; (*graphics)->cg_context = ctx; return Ok; } #endif #ifdef CAIRO_HAS_XLIB_SURFACE // coverity[+alloc : arg-*2] GpStatus GdipCreateFromXDrawable_linux(Drawable d, Display *dpy, GpGraphics **graphics) { Window root_ignore; GpRect bounds; int bwidth_ignore, depth_ignore; cairo_surface_t *surface; if (!graphics) return InvalidParameter; XGetGeometry (dpy, d, &root_ignore, &bounds.X, &bounds.Y, (unsigned int *)&bounds.Width, (unsigned int *)&bounds.Height, (unsigned int *)&bwidth_ignore, (unsigned int *)&depth_ignore); surface = cairo_xlib_surface_create(dpy, d, DefaultVisual(dpy, DefaultScreen(dpy)), bounds.Width, bounds.Height); *graphics = gdip_graphics_new(surface); (*graphics)->dpi_x = (*graphics)->dpi_y = gdip_get_display_dpi (); cairo_surface_destroy (surface); (*graphics)->type = gtX11Drawable; (*graphics)->display = dpy; (*graphics)->drawable = d; GdipSetVisibleClip_linux (*graphics, &bounds); return Ok; } #endif #ifdef CAIRO_HAS_XLIB_SURFACE static int ignore_error_handler (Display *dpy, XErrorEvent *event) { return Success; } #endif GpStatus GdipDeleteGraphics (GpGraphics *graphics) { if (!graphics) return InvalidParameter; /* We don't destroy image because we did not create one. */ if (graphics->copy_of_ctm) { GdipDeleteMatrix (graphics->copy_of_ctm); graphics->copy_of_ctm = NULL; } if (graphics->clip) { GdipDeleteRegion (graphics->clip); graphics->clip = NULL; } if (graphics->clip_matrix) { GdipDeleteMatrix (graphics->clip_matrix); graphics->clip_matrix = NULL; } if (graphics->ct) { #ifdef CAIRO_HAS_XLIB_SURFACE int (*old_error_handler)(Display *dpy, XErrorEvent *ev) = NULL; if (graphics->type == gtX11Drawable) old_error_handler = XSetErrorHandler (ignore_error_handler); #endif cairo_destroy (graphics->ct); graphics->ct = NULL; #ifdef CAIRO_HAS_XLIB_SURFACE if (graphics->type == gtX11Drawable) XSetErrorHandler (old_error_handler); #endif } if (graphics->backend == GraphicsBackEndMetafile) { /* if recording this is where we save the metafile (stream or file) */ if (graphics->metafile->recording) gdip_metafile_stop_recording (graphics->metafile); cairo_surface_destroy (graphics->metasurface); graphics->metasurface = NULL; } if (graphics->saved_status) { GpState* pos_state = graphics->saved_status; int i; for (i = 0; i < MAX_GRAPHICS_STATE_STACK; i++, pos_state++) { if (pos_state->clip) GdipDeleteRegion (pos_state->clip); } GdipFree (graphics->saved_status); graphics->saved_status = NULL; } GdipFree (graphics); return Ok; } GpStatus GdipGetDC (GpGraphics *graphics, HDC *hDC) { /* For our gdi+ the hDC is equivalent to the graphics handle */ if (hDC) { *hDC = (void *)graphics; } return Ok; } GpStatus GdipReleaseDC (GpGraphics *graphics, HDC hDC) { if (hDC != (void *)graphics) { return InvalidParameter; } return Ok; } GpStatus GdipRestoreGraphics (GpGraphics *graphics, unsigned int graphicsState) { GpState* pos_state; if (!graphics) return InvalidParameter; ///printf("[%s %d] GdipRestoreGraphics called\n", __FILE__, __LINE__); if (graphicsState >= MAX_GRAPHICS_STATE_STACK || graphicsState > graphics->saved_status_pos) return InvalidParameter; pos_state = graphics->saved_status; pos_state += graphicsState; /* Save from GpState to Graphics */ gdip_cairo_matrix_copy (graphics->copy_of_ctm, &pos_state->matrix); gdip_cairo_matrix_copy (&graphics->previous_matrix, &pos_state->previous_matrix); GdipSetRenderingOrigin (graphics, pos_state->org_x, pos_state->org_y); if (graphics->clip) GdipDeleteRegion (graphics->clip); GdipCloneRegion (pos_state->clip, &graphics->clip); gdip_cairo_matrix_copy (graphics->clip_matrix, &pos_state->clip_matrix); graphics->composite_mode = pos_state->composite_mode; graphics->composite_quality = pos_state->composite_quality; graphics->interpolation = pos_state->interpolation; graphics->page_unit = pos_state->page_unit; graphics->scale = pos_state->scale; GdipSetSmoothingMode(graphics, pos_state->draw_mode); graphics->text_mode = pos_state->text_mode; graphics->pixel_mode = pos_state->pixel_mode; graphics->text_contrast = pos_state->text_contrast; graphics->saved_status_pos = graphicsState; /* re-adjust clipping (region and matrix) */ cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); /* GdipCloneRegion was called, but for some reason, not registred as an allocation */ /* coverity[freed_arg] */ return cairo_SetGraphicsClip (graphics); } GpStatus GdipSaveGraphics (GpGraphics *graphics, unsigned int *state) { GpState* pos_state; if (!graphics || !state) return InvalidParameter; ///printf("[%s %d] GdipSaveGraphics called\n", __FILE__, __LINE__); if (graphics->saved_status == NULL) { graphics->saved_status = gdip_calloc (MAX_GRAPHICS_STATE_STACK, sizeof (GpState)); graphics->saved_status_pos = 0; } if (graphics->saved_status_pos >= MAX_GRAPHICS_STATE_STACK) return OutOfMemory; pos_state = graphics->saved_status; pos_state += graphics->saved_status_pos; /* Save from Graphics to GpState */ gdip_cairo_matrix_copy (&pos_state->matrix, graphics->copy_of_ctm); GdipGetRenderingOrigin (graphics, &pos_state->org_x, &pos_state->org_y); gdip_cairo_matrix_copy (&pos_state->previous_matrix, &graphics->previous_matrix); if (pos_state->clip) GdipDeleteRegion (pos_state->clip); GdipCloneRegion (graphics->clip, &pos_state->clip); gdip_cairo_matrix_copy (&pos_state->clip_matrix, graphics->clip_matrix); pos_state->composite_mode = graphics->composite_mode; pos_state->composite_quality = graphics->composite_quality; pos_state->interpolation = graphics->interpolation; pos_state->page_unit = graphics->page_unit; pos_state->scale = graphics->scale; pos_state->draw_mode = graphics->draw_mode; pos_state->text_mode = graphics->text_mode; pos_state->pixel_mode = graphics->pixel_mode; pos_state->text_contrast = graphics->text_contrast; *state = graphics->saved_status_pos; graphics->saved_status_pos++; return Ok; } GpStatus GdipResetWorldTransform (GpGraphics *graphics) { if (!graphics) return InvalidParameter; cairo_matrix_init_identity (graphics->copy_of_ctm); cairo_matrix_init_identity (graphics->clip_matrix); switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_ResetWorldTransform (graphics); case GraphicsBackEndMetafile: return metafile_ResetWorldTransform (graphics); default: return GenericError; } } GpStatus GdipSetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) { GpStatus status; BOOL invertible; if (!graphics || !matrix) return InvalidParameter; /* optimization - inverting an identity matrix result in the identity matrix */ if (gdip_is_matrix_empty (matrix)) return GdipResetWorldTransform (graphics); /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible (matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; gdip_cairo_matrix_copy (graphics->copy_of_ctm, matrix); gdip_cairo_matrix_copy (graphics->clip_matrix, matrix); /* we already know it's invertible */ GdipInvertMatrix (graphics->clip_matrix); switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_SetWorldTransform (graphics, matrix); case GraphicsBackEndMetafile: return metafile_SetWorldTransform (graphics, matrix); default: return GenericError; } } GpStatus GdipGetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) { if (!graphics || !matrix) return InvalidParameter; /* get the effective matrix from cairo */ gdip_cairo_matrix_copy (matrix, graphics->copy_of_ctm); /* if we're inside a container then the previous matrix are hidden */ if (!gdip_is_matrix_empty (&graphics->previous_matrix)) { cairo_matrix_t inverted; /* substract the previous matrix from the effective matrix */ gdip_cairo_matrix_copy (&inverted, &graphics->previous_matrix); cairo_matrix_invert (&inverted); return GdipMultiplyMatrix (matrix, &inverted, MatrixOrderAppend); } return Ok; } static GpStatus apply_world_to_bounds (GpGraphics *graphics) { GpStatus status; GpPointF pts[2]; pts[0].X = graphics->bounds.X; pts[0].Y = graphics->bounds.Y; pts[1].X = graphics->bounds.X + graphics->bounds.Width; pts[1].Y = graphics->bounds.Y + graphics->bounds.Height; status = GdipTransformMatrixPoints (graphics->clip_matrix, (GpPointF*)&pts, 2); if (status != Ok) return status; if (pts[0].X > pts[1].X) { graphics->bounds.X = pts[1].X; graphics->bounds.Width = iround (pts[0].X - pts[1].X); } else { graphics->bounds.X = pts[0].X; graphics->bounds.Width = iround (pts[1].X - pts[0].X); } if (pts[0].Y > pts[1].Y) { graphics->bounds.Y = pts[1].Y; graphics->bounds.Height = iround (pts[0].Y - pts[1].Y); } else { graphics->bounds.Y = pts[0].Y; graphics->bounds.Height = iround (pts[1].Y - pts[0].Y); } return Ok; } GpStatus GdipMultiplyWorldTransform (GpGraphics *graphics, GpMatrix *matrix, GpMatrixOrder order) { GpStatus s; BOOL invertible; GpMatrix inverted; if (!graphics) return InvalidParameter; /* the matrix MUST be invertible to be used */ s = GdipIsMatrixInvertible (matrix, &invertible); if (!invertible || (s != Ok)) return InvalidParameter; s = GdipMultiplyMatrix (graphics->copy_of_ctm, matrix, order); if (s != Ok) return s; /* Multiply the inverted matrix with the clipping matrix */ gdip_cairo_matrix_copy (&inverted, matrix); s = GdipInvertMatrix (&inverted); if (s != Ok) return s; s = GdipMultiplyMatrix (graphics->clip_matrix, &inverted, order); if (s != Ok) return s; apply_world_to_bounds (graphics); switch (graphics->backend) { case GraphicsBackEndCairo: /* not a typo - we apply to calculated matrix to cairo context */ return cairo_SetWorldTransform (graphics, graphics->copy_of_ctm); case GraphicsBackEndMetafile: return metafile_MultiplyWorldTransform (graphics, matrix, order); default: return GenericError; } } GpStatus GdipRotateWorldTransform (GpGraphics *graphics, float angle, GpMatrixOrder order) { GpStatus s; if (!graphics) return InvalidParameter; s = GdipRotateMatrix (graphics->copy_of_ctm, angle, order); if (s != Ok) return s; s = GdipRotateMatrix (graphics->clip_matrix, -angle, gdip_matrix_reverse_order (order)); if (s != Ok) return s; apply_world_to_bounds (graphics); switch (graphics->backend) { case GraphicsBackEndCairo: /* not a typo - we apply to calculated matrix to cairo context */ return cairo_SetWorldTransform (graphics, graphics->copy_of_ctm); case GraphicsBackEndMetafile: return metafile_RotateWorldTransform (graphics, angle, order); default: return GenericError; } } GpStatus GdipScaleWorldTransform (GpGraphics *graphics, float sx, float sy, GpMatrixOrder order) { GpStatus s; if (!graphics || (sx == 0.0f) || (sy == 0.0f)) return InvalidParameter; s = GdipScaleMatrix (graphics->copy_of_ctm, sx, sy, order); if (s != Ok) return s; s = GdipScaleMatrix (graphics->clip_matrix, (1.0f / sx), (1.0f / sy), gdip_matrix_reverse_order (order)); if (s != Ok) return s; apply_world_to_bounds (graphics); switch (graphics->backend) { case GraphicsBackEndCairo: /* not a typo - we apply to calculated matrix to cairo context */ return cairo_SetWorldTransform (graphics, graphics->copy_of_ctm); case GraphicsBackEndMetafile: return metafile_ScaleWorldTransform (graphics, sx, sy, order); default: return GenericError; } } GpStatus GdipTranslateWorldTransform (GpGraphics *graphics, float dx, float dy, GpMatrixOrder order) { GpStatus s; if (!graphics) return InvalidParameter; s = GdipTranslateMatrix (graphics->copy_of_ctm, dx, dy, order); if (s != Ok) return s; s = GdipTranslateMatrix (graphics->clip_matrix, -dx, -dy, gdip_matrix_reverse_order (order)); if (s != Ok) return s; apply_world_to_bounds (graphics); switch (graphics->backend) { case GraphicsBackEndCairo: /* not a typo - we apply to calculated matrix to cairo context */ return cairo_SetWorldTransform (graphics, graphics->copy_of_ctm); case GraphicsBackEndMetafile: return metafile_TranslateWorldTransform (graphics, dx, dy, order); default: return GenericError; } } /* * Draw operations - validate parameters and delegate to cairo/metafile backends */ GpStatus GdipDrawArc (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawArc (graphics, pen, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_DrawArc (graphics, pen, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipDrawArcI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawArcI (graphics, pen, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_DrawArcI (graphics, pen, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipDrawBezier (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawBezier (graphics, pen, x1, y1, x2, y2, x3, y3, x4, y4); case GraphicsBackEndMetafile: return metafile_DrawBezier (graphics, pen, x1, y1, x2, y2, x3, y3, x4, y4); default: return GenericError; } } GpStatus GdipDrawBezierI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawBezierI (graphics, pen, x1, y1, x2, y2, x3, y3, x4, y4); case GraphicsBackEndMetafile: return metafile_DrawBezierI (graphics, pen, x1, y1, x2, y2, x3, y3, x4, y4); default: return GenericError; } } GpStatus GdipDrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { if (count == 0) return Ok; if (!graphics || !pen || !points) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawBeziers (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawBeziers (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { if (count == 0) return Ok; if (!graphics || !pen || !points) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawBeziersI (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawBeziersI (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawEllipse (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawEllipse (graphics, pen, x, y, width, height); case GraphicsBackEndMetafile: return metafile_DrawEllipse (graphics, pen, x, y, width, height); default: return GenericError; } } GpStatus GdipDrawEllipseI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawEllipseI (graphics, pen, x, y, width, height); case GraphicsBackEndMetafile: return metafile_DrawEllipseI (graphics, pen, x, y, width, height); default: return GenericError; } } GpStatus GdipDrawLine (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawLine (graphics, pen, x1, y1, x2, y2); case GraphicsBackEndMetafile: return metafile_DrawLine (graphics, pen, x1, y1, x2, y2); default: return GenericError; } } GpStatus GdipDrawLineI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2) { if (!graphics || !pen) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawLineI (graphics, pen, x1, y1, x2, y2); case GraphicsBackEndMetafile: return metafile_DrawLineI (graphics, pen, x1, y1, x2, y2); default: return GenericError; } } GpStatus GdipDrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { if (!graphics || !pen || !points || count < 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawLines (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawLines (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { if (!graphics || !pen || !points || count < 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawLinesI (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawLinesI (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path) { if (!graphics || !pen || !path) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawPath (graphics, pen, path); case GraphicsBackEndMetafile: return metafile_DrawPath (graphics, pen, path); default: return GenericError; } } GpStatus GdipDrawPie (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) { if (!graphics || !pen) return InvalidParameter; /* We don't do anything, if sweep angle is zero. */ if (sweepAngle == 0) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawPie (graphics, pen, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_DrawPie (graphics, pen, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipDrawPieI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) { if (!graphics || !pen) return InvalidParameter; /* We don't do anything, if sweep angle is zero. */ if (sweepAngle == 0) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawPieI (graphics, pen, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_DrawPieI (graphics, pen, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipDrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { if (!graphics || !pen || !points || count < 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawPolygon (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawPolygon (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { if (!graphics || !pen || !points || count < 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawPolygonI (graphics, pen, points, count); case GraphicsBackEndMetafile: return metafile_DrawPolygonI (graphics, pen, points, count); default: return GenericError; } } GpStatus GdipDrawRectangle (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) { if (!graphics || !pen) return InvalidParameter; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((width < 0) || (height < 0)) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawRectangle (graphics, pen, x, y, width, height); case GraphicsBackEndMetafile: return metafile_DrawRectangle (graphics, pen, x, y, width, height); default: return GenericError; } } GpStatus GdipDrawRectangleI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) { if (!graphics || !pen) return InvalidParameter; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((width < 0) || (height < 0)) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawRectangle (graphics, pen, x, y, width, height); case GraphicsBackEndMetafile: return metafile_DrawRectangle (graphics, pen, x, y, width, height); default: return GenericError; } } GpStatus GdipDrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, int count) { if (!graphics || !pen || !rects || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawRectangles (graphics, pen, rects, count); case GraphicsBackEndMetafile: return metafile_DrawRectangles (graphics, pen, rects, count); default: return GenericError; } } GpStatus GdipDrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, int count) { if (!graphics || !pen || !rects || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawRectanglesI (graphics, pen, rects, count); case GraphicsBackEndMetafile: return metafile_DrawRectanglesI (graphics, pen, rects, count); default: return GenericError; } } GpStatus GdipDrawClosedCurve (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { return GdipDrawClosedCurve2 (graphics, pen, points, count, 0.5f); } GpStatus GdipDrawClosedCurveI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { return GdipDrawClosedCurve2I (graphics, pen, points, count, 0.5f); } GpStatus GdipDrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count, float tension) { /* when tension is 0, draw straight lines */ if (tension == 0) return GdipDrawPolygon (graphics, pen, points, count); if (!graphics || !pen || !points || count <= 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawClosedCurve2 (graphics, pen, points, count, tension); case GraphicsBackEndMetafile: return metafile_DrawClosedCurve2 (graphics, pen, points, count, tension); default: return GenericError; } } GpStatus GdipDrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count, float tension) { /* when tension is 0, draw straight lines */ if (tension == 0) return GdipDrawPolygonI (graphics, pen, points, count); if (!graphics || !pen || !points || count <= 2) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawClosedCurve2I (graphics, pen, points, count, tension); case GraphicsBackEndMetafile: return metafile_DrawClosedCurve2I (graphics, pen, points, count, tension); default: return GenericError; } } GpStatus GdipDrawCurve (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) { if (count == 2) { return GdipDrawLines (graphics, pen, points, count); } else { int segments = (count > 3) ? (count - 1) : (count - 2); return GdipDrawCurve3 (graphics, pen, points, count, 0, segments, 0.5f); } } GpStatus GdipDrawCurveI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) { if (count == 2) { return GdipDrawLinesI (graphics, pen, points, count); } else { int segments = (count > 3) ? (count - 1) : (count - 2); return GdipDrawCurve3I (graphics, pen, points, count, 0, segments, 0.5f); } } GpStatus GdipDrawCurve2 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, float tension) { if (count == 2) { return GdipDrawLines (graphics, pen, points, count); } else { int segments = (count > 3) ? (count - 1) : (count - 2); return GdipDrawCurve3 (graphics, pen, points, count, 0, segments, tension); } } GpStatus GdipDrawCurve2I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, float tension) { if (count == 2) { return GdipDrawLinesI (graphics, pen, points, count); } else { int segments = (count > 3) ? (count - 1) : (count - 2); return GdipDrawCurve3I (graphics, pen, points, count, 0, segments, tension); } } GpStatus GdipDrawCurve3 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, int offset, int numOfSegments, float tension) { /* draw lines if tension = 0 */ if (tension == 0) return GdipDrawLines (graphics, pen, points, count); if (!graphics || !pen || !points || numOfSegments < 1) return InvalidParameter; /* we need 3 points for the first curve, 2 more for each curves */ /* and it's possible to use a point prior to the offset (to calculate) */ if ((offset == 0) && (numOfSegments == 1) && (count < 3)) return InvalidParameter; else if (numOfSegments >= count - offset) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawCurve3 (graphics, pen, points, count, offset, numOfSegments, tension); case GraphicsBackEndMetafile: return metafile_DrawCurve3 (graphics, pen, points, count, offset, numOfSegments, tension); default: return GenericError; } } GpStatus GdipDrawCurve3I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, int offset, int numOfSegments, float tension) { /* draw lines if tension = 0 */ if (tension == 0) return GdipDrawLinesI (graphics, pen, points, count); if (!graphics || !pen || !points || numOfSegments < 1) return InvalidParameter; /* we need 3 points for the first curve, 2 more for each curves */ /* and it's possible to use a point prior to the offset (to calculate) */ if ((offset == 0) && (numOfSegments == 1) && (count < 3)) return InvalidParameter; else if (numOfSegments >= count - offset) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_DrawCurve3I (graphics, pen, points, count, offset, numOfSegments, tension); case GraphicsBackEndMetafile: return metafile_DrawCurve3I (graphics, pen, points, count, offset, numOfSegments, tension); default: return GenericError; } } /* * Fills */ GpStatus GdipFillEllipse (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { if (!graphics || !brush) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillEllipse (graphics, brush, x, y, width, height); case GraphicsBackEndMetafile: return metafile_FillEllipse (graphics, brush, x, y, width, height); default: return GenericError; } } GpStatus GdipFillEllipseI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) { if (!graphics || !brush) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillEllipseI (graphics, brush, x, y, width, height); case GraphicsBackEndMetafile: return metafile_FillEllipseI (graphics, brush, x, y, width, height); default: return GenericError; } } GpStatus GdipFillRectangle (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) { if (!graphics || !brush) return InvalidParameter; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((width < 0) || (height < 0)) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillRectangle (graphics, brush, x, y, width, height); case GraphicsBackEndMetafile: return metafile_FillRectangle (graphics, brush, x, y, width, height); default: return GenericError; } } GpStatus GdipFillRectangleI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) { if (!graphics || !brush) return InvalidParameter; /* don't draw/fill rectangles with negative width/height (bug #77129) */ if ((width < 0) || (height < 0)) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillRectangleI (graphics, brush, x, y, width, height); case GraphicsBackEndMetafile: return metafile_FillRectangleI (graphics, brush, x, y, width, height); default: return GenericError; } } GpStatus GdipFillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, int count) { if (!graphics || !brush || !rects || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillRectangles (graphics, brush, rects, count); case GraphicsBackEndMetafile: return metafile_FillRectangles (graphics, brush, rects, count); default: return GenericError; } } GpStatus GdipFillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, int count) { if (!graphics || !brush || !rects || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillRectanglesI (graphics, brush, rects, count); case GraphicsBackEndMetafile: return metafile_FillRectanglesI (graphics, brush, rects, count); default: return GenericError; } } GpStatus GdipFillPie (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height, float startAngle, float sweepAngle) { if (!graphics || !brush) return InvalidParameter; /* We don't do anything, if sweep angle is zero. */ if (sweepAngle == 0) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillPie (graphics, brush, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_FillPie (graphics, brush, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipFillPieI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height, float startAngle, float sweepAngle) { if (!graphics || !brush) return InvalidParameter; /* We don't do anything, if sweep angle is zero. */ if (sweepAngle == 0) return Ok; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillPieI (graphics, brush, x, y, width, height, startAngle, sweepAngle); case GraphicsBackEndMetafile: return metafile_FillPieI (graphics, brush, x, y, width, height, startAngle, sweepAngle); default: return GenericError; } } GpStatus GdipFillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path) { if (!graphics || !brush || !path) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillPath (graphics, brush, path); case GraphicsBackEndMetafile: return metafile_FillPath (graphics, brush, path); default: return GenericError; } } GpStatus GdipFillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, FillMode fillMode) { if (!graphics || !brush || !points) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillPolygon (graphics, brush, points, count, fillMode); case GraphicsBackEndMetafile: return metafile_FillPolygon (graphics, brush, points, count, fillMode); default: return GenericError; } } GpStatus GdipFillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, FillMode fillMode) { if (!graphics || !brush || !points) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillPolygonI (graphics, brush, points, count, fillMode); case GraphicsBackEndMetafile: return metafile_FillPolygonI (graphics, brush, points, count, fillMode); default: return GenericError; } } GpStatus GdipFillPolygon2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count) { return GdipFillPolygon (graphics, brush, points, count, FillModeAlternate); } GpStatus GdipFillPolygon2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count) { return GdipFillPolygonI (graphics, brush, points, count, FillModeAlternate); } GpStatus GdipFillClosedCurve (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count) { return GdipFillClosedCurve2 (graphics, brush, points, count, 0.5f); } GpStatus GdipFillClosedCurveI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count) { return GdipFillClosedCurve2I (graphics, brush, points, count, 0.5f); } GpStatus GdipFillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, float tension) { /* when tension is 0, the edges are straight lines */ if (tension == 0) return GdipFillPolygon2 (graphics, brush, points, count); if (!graphics || !brush || !points || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillClosedCurve2 (graphics, brush, points, count, tension); case GraphicsBackEndMetafile: return metafile_FillClosedCurve2 (graphics, brush, points, count, tension); default: return GenericError; } } GpStatus GdipFillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, float tension) { /* when tension is 0, the edges are straight lines */ if (tension == 0) return GdipFillPolygon2I (graphics, brush, points, count); if (!graphics || !brush || !points || count <= 0) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillClosedCurve2I (graphics, brush, points, count, tension); case GraphicsBackEndMetafile: return metafile_FillClosedCurve2I (graphics, brush, points, count, tension); default: return GenericError; } } GpStatus GdipFillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region) { if (!graphics || !brush || !region) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_FillRegion (graphics, brush, region); case GraphicsBackEndMetafile: return metafile_FillRegion (graphics, brush, region); default: return GenericError; } } GpStatus GdipSetRenderingOrigin (GpGraphics *graphics, int x, int y) { if (!graphics) return InvalidParameter; graphics->render_origin_x = x; graphics->render_origin_y = y; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: return metafile_SetRenderingOrigin (graphics, x, y); default: return GenericError; } } GpStatus GdipGetRenderingOrigin (GpGraphics *graphics, int *x, int *y) { if (!graphics || !x || !y) return InvalidParameter; *x = graphics->render_origin_x; *y = graphics->render_origin_y; return Ok; } GpStatus GdipGetDpiX (GpGraphics *graphics, float *dpi) { if (!graphics || !dpi) return InvalidParameter; *dpi = graphics->dpi_x; return Ok; } GpStatus GdipGetDpiY (GpGraphics *graphics, float *dpi) { if (!graphics || !dpi) return InvalidParameter; *dpi = graphics->dpi_y; return Ok; } GpStatus GdipGraphicsClear (GpGraphics *graphics, ARGB color) { if (!graphics) return InvalidParameter; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_GraphicsClear (graphics, color); case GraphicsBackEndMetafile: return metafile_GraphicsClear (graphics, color); default: return GenericError; } } GpStatus GdipSetInterpolationMode (GpGraphics *graphics, InterpolationMode interpolationMode) { if (!graphics) return InvalidParameter; graphics->interpolation = interpolationMode; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: return metafile_SetInterpolationMode (graphics, interpolationMode); default: return GenericError; } } GpStatus GdipGetInterpolationMode (GpGraphics *graphics, InterpolationMode *imode) { if (!graphics || !imode) return InvalidParameter; *imode = graphics->interpolation; return Ok; } GpStatus GdipSetTextRenderingHint (GpGraphics *graphics, TextRenderingHint mode) { if (!graphics) return InvalidParameter; graphics->text_mode = mode; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: return metafile_SetTextRenderingHint (graphics, mode); default: return GenericError; } } GpStatus GdipGetTextRenderingHint (GpGraphics *graphics, TextRenderingHint *mode) { if (!graphics || !mode) return InvalidParameter; *mode = graphics->text_mode; return Ok; } /* MonoTODO - pixel offset mode isn't supported */ GpStatus GdipSetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode pixelOffsetMode) { if (!graphics || (pixelOffsetMode == PixelOffsetModeInvalid)) return InvalidParameter; graphics->pixel_mode = pixelOffsetMode; switch (graphics->backend) { case GraphicsBackEndCairo: /* FIXME: changing pixel mode affects other properties (e.g. the visible clip bounds) */ return Ok; case GraphicsBackEndMetafile: return metafile_SetPixelOffsetMode (graphics, pixelOffsetMode); default: return GenericError; } } /* MonoTODO - pixel offset mode isn't supported */ GpStatus GdipGetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode *pixelOffsetMode) { if (!graphics || !pixelOffsetMode) return InvalidParameter; *pixelOffsetMode = graphics->pixel_mode; return Ok; } /* MonoTODO - text contrast isn't supported */ GpStatus GdipSetTextContrast (GpGraphics *graphics, UINT contrast) { /** The gamma correction value must be between 0 and 12. * The default value is 4. */ if (!graphics || contrast < 0 || contrast > 12) return InvalidParameter; graphics->text_contrast = contrast; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: return metafile_SetTextContrast (graphics, contrast); default: return GenericError; } } /* MonoTODO - text contrast isn't supported */ GpStatus GdipGetTextContrast (GpGraphics *graphics, UINT *contrast) { if (!graphics || !contrast) return InvalidParameter; *contrast = graphics->text_contrast; return Ok; } GpStatus GdipSetSmoothingMode (GpGraphics *graphics, SmoothingMode mode) { if (!graphics) return InvalidParameter; graphics->draw_mode = mode; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_SetSmoothingMode (graphics, mode); case GraphicsBackEndMetafile: return metafile_SetSmoothingMode (graphics, mode); default: return GenericError; } } GpStatus GdipGetSmoothingMode (GpGraphics *graphics, SmoothingMode *mode) { if (!graphics || !mode) return InvalidParameter; *mode = graphics->draw_mode; return Ok; } /* MonoTODO - dstrect, srcrect and unit support isn't implemented */ GpStatus GdipBeginContainer (GpGraphics *graphics, GDIPCONST GpRectF* dstrect, GDIPCONST GpRectF *srcrect, GpUnit unit, GraphicsContainer *state) { if (!graphics || !dstrect || !srcrect || (unit < UnitPixel) || (unit > UnitMillimeter)) return InvalidParameter; return GdipBeginContainer2 (graphics, state); } GpStatus GdipBeginContainer2 (GpGraphics *graphics, GraphicsContainer* state) { GpStatus status; if (!graphics || !state) return InvalidParameter; status = GdipSaveGraphics (graphics, state); if (status == Ok) { /* reset most properties to defaults after saving them */ gdip_graphics_reset (graphics); /* copy the current effective matrix as the preivous matrix */ gdip_cairo_matrix_copy (&graphics->previous_matrix, graphics->copy_of_ctm); } return status; } /* MonoTODO - depends on incomplete GdipBeginContainer */ GpStatus GdipBeginContainerI (GpGraphics *graphics, GDIPCONST GpRect* dstrect, GDIPCONST GpRect *srcrect, GpUnit unit, GraphicsContainer *state) { GpRectF dr, sr; if (!dstrect || !srcrect) return InvalidParameter; dr.X = dstrect->X; dr.Y = dstrect->Y; dr.Width = dstrect->Width; dr.Height = dstrect->Height; sr.X = srcrect->X; sr.Y = srcrect->Y; sr.Width = srcrect->Width; sr.Height = srcrect->Height; return GdipBeginContainer (graphics, &dr, &sr, unit, state); } GpStatus GdipEndContainer (GpGraphics *graphics, GraphicsContainer state) { if (!graphics) return InvalidParameter; return GdipRestoreGraphics (graphics, state); } GpStatus GdipFlush (GpGraphics *graphics, GpFlushIntention intention) { cairo_surface_t* surface; if (!graphics) return InvalidParameter; surface = cairo_get_target (graphics->ct); cairo_surface_flush (surface); #ifdef CAIRO_HAS_QUARTZ_SURFACE if (graphics->type == gtOSXDrawable) { CGRect rect; rect.origin.x = 0; rect.origin.y = 0; rect.size.width = graphics->bounds.Width; rect.size.height = graphics->bounds.Height; void *image = CGBitmapContextCreateImage (cairo_quartz_surface_get_cg_context (surface)); CGContextDrawImage (graphics->cg_context, rect, image); CGImageRelease (image); } #endif return Ok; } GpStatus GdipSetClipGraphics (GpGraphics *graphics, GpGraphics *srcgraphics, CombineMode combineMode) { if (!graphics || !srcgraphics) return InvalidParameter; return GdipSetClipRegion (graphics, srcgraphics->clip, combineMode); } GpStatus GdipSetClipRect (GpGraphics *graphics, float x, float y, float width, float height, CombineMode combineMode) { GpStatus status; GpRectF rect; GpRegion *region = NULL; if (!graphics) return InvalidParameter; rect.X = x; rect.Y = y; rect.Width = width; rect.Height = height; status = GdipCreateRegionRect (&rect, ®ion); if (status != Ok) goto cleanup; /* if the matrix is empty, avoid region transformation */ if (!gdip_is_matrix_empty (graphics->clip_matrix)) { cairo_matrix_t inverted; gdip_cairo_matrix_copy (&inverted, graphics->clip_matrix); cairo_matrix_invert (&inverted); GdipTransformRegion (region, &inverted); } status = GdipCombineRegionRegion (graphics->clip, region, combineMode); if (status != Ok) goto cleanup; switch (graphics->backend) { case GraphicsBackEndCairo: /* adjust cairo clipping according to graphics->clip */ status = cairo_SetGraphicsClip (graphics); break; case GraphicsBackEndMetafile: status = metafile_SetClipRect (graphics, x, y, width, height, combineMode); break; default: status = GenericError; break; } cleanup: if (region) GdipDeleteRegion (region); return status; } GpStatus GdipSetClipRectI (GpGraphics *graphics, int x, int y, int width, int height, CombineMode combineMode) { return GdipSetClipRect (graphics, x, y, width, height, combineMode); } GpStatus GdipSetClipPath (GpGraphics *graphics, GpPath *path, CombineMode combineMode) { GpStatus status; if (!graphics || !path) return InvalidParameter; status = GdipCombineRegionPath (graphics->clip, path, combineMode); if (status != Ok) return status; switch (graphics->backend) { case GraphicsBackEndCairo: /* adjust cairo clipping according to graphics->clip */ return cairo_SetGraphicsClip (graphics); case GraphicsBackEndMetafile: return metafile_SetClipPath (graphics, path, combineMode); default: return GenericError; } } GpStatus GdipSetClipRegion (GpGraphics *graphics, GpRegion *region, CombineMode combineMode) { GpStatus status; GpRegion *work; if (!graphics || !region) return InvalidParameter; /* if the matrix is empty, avoid region cloning and transform */ if (gdip_is_matrix_empty (graphics->clip_matrix)) { work = region; } else { cairo_matrix_t inverted; gdip_cairo_matrix_copy (&inverted, graphics->clip_matrix); cairo_matrix_invert (&inverted); GdipCloneRegion (region, &work); GdipTransformRegion (work, &inverted); } status = GdipCombineRegionRegion (graphics->clip, work, combineMode); if (status != Ok) goto cleanup; switch (graphics->backend) { case GraphicsBackEndCairo: /* adjust cairo clipping according to graphics->clip */ status = cairo_SetGraphicsClip (graphics); break; case GraphicsBackEndMetafile: status = metafile_SetClipRegion (graphics, region, combineMode); break; default: status = GenericError; break; } cleanup: if (work != region) GdipDeleteRegion (work); return status; } /* Note: not exposed in System.Drawing.dll */ GpStatus GdipSetClipHrgn (GpGraphics *graphics, void *hRgn, CombineMode combineMode) { GpStatus status; if (!graphics) return InvalidParameter; if (hRgn) { status = GdipSetClipRegion (graphics, (GpRegion*)hRgn, combineMode); } else { /* hRng == NULL means an infinite region */ GpRegion *work; status = GdipCreateRegion (&work); if (status == Ok) { status = GdipSetClipRegion (graphics, work, combineMode); GdipDeleteRegion (work); } } return status; } GpStatus GdipResetClip (GpGraphics *graphics) { if (!graphics) return InvalidParameter; GdipSetInfinite (graphics->clip); cairo_matrix_init_identity (graphics->clip_matrix); switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_ResetClip (graphics); case GraphicsBackEndMetafile: return metafile_ResetClip (graphics); default: return GenericError; } } GpStatus GdipTranslateClip (GpGraphics *graphics, float dx, float dy) { GpStatus status; if (!graphics) return InvalidParameter; status = GdipTranslateRegion (graphics->clip, dx, dy); if (status != Ok) return status; switch (graphics->backend) { case GraphicsBackEndCairo: /* adjust cairo clipping according to graphics->clip */ return cairo_SetGraphicsClip (graphics); case GraphicsBackEndMetafile: return metafile_TranslateClip (graphics, dx, dy); default: return GenericError; } } GpStatus GdipTranslateClipI (GpGraphics *graphics, int dx, int dy) { return GdipTranslateClip (graphics, dx, dy); } GpStatus GdipGetClip (GpGraphics *graphics, GpRegion *region) { if (!graphics || !region) return InvalidParameter; gdip_clear_region (region); gdip_copy_region (graphics->clip, region); if (gdip_is_matrix_empty (graphics->clip_matrix)) return Ok; return GdipTransformRegion (region, graphics->clip_matrix); } GpStatus GdipGetClipBounds (GpGraphics *graphics, GpRectF *rect) { GpStatus status; GpRegion *work; if (!graphics || !rect) return InvalidParameter; /* if the matrix is empty, avoid region cloning and transform */ if (gdip_is_matrix_empty (graphics->clip_matrix)) { work = graphics->clip; } else { GdipCloneRegion (graphics->clip, &work); GdipTransformRegion (work, graphics->clip_matrix); } status = GdipGetRegionBounds (work, graphics, rect); if (work != graphics->clip) GdipDeleteRegion (work); return status; } GpStatus GdipGetClipBoundsI (GpGraphics *graphics, GpRect *rect) { GpRectF rectF; GpStatus status; if (!graphics || !rect) return InvalidParameter; status = GdipGetRegionBounds (graphics->clip, graphics, &rectF); if (status != Ok) return status; rect->X = rectF.X; rect->Y = rectF.Y; rect->Width = rectF.Width; rect->Height = rectF.Height; return Ok; } GpStatus GdipIsClipEmpty (GpGraphics *graphics, BOOL *result) { if (!graphics) return InvalidParameter; return GdipIsEmptyRegion (graphics->clip, graphics, result); } GpStatus GdipSetVisibleClip_linux (GpGraphics *graphics, GpRect *rect) { if (!graphics || !rect) return InvalidParameter; graphics->bounds.X = rect->X; graphics->bounds.Y = rect->Y; graphics->bounds.Width = rect->Width; graphics->bounds.Height = rect->Height; return Ok; } GpStatus GdipGetVisibleClipBounds (GpGraphics *graphics, GpRectF *rect) { if (!graphics || !rect) return InvalidParameter; if (!gdip_is_InfiniteRegion (graphics->clip)) { GpRectF clipbound; GpStatus status = GdipGetClipBounds (graphics, &clipbound); if (status != Ok) return status; /* intersect clipping with bounds (for clips bigger than the graphics) */ rect->X = (clipbound.X > graphics->bounds.X) ? clipbound.X : graphics->bounds.X; rect->Y = (clipbound.Y > graphics->bounds.Y) ? clipbound.Y : graphics->bounds.Y; rect->Width = (((clipbound.X + clipbound.Width) < (graphics->bounds.X + graphics->bounds.Width)) ? (clipbound.X + clipbound.Width) : (graphics->bounds.X + graphics->bounds.Width)) - rect->X; rect->Height = (((clipbound.Y + clipbound.Height) < (graphics->bounds.Y + graphics->bounds.Height)) ? (clipbound.Y + clipbound.Height) : (graphics->bounds.Y + graphics->bounds.Height)) - rect->Y; } else { rect->X = graphics->bounds.X; rect->Y = graphics->bounds.Y; rect->Width = graphics->bounds.Width; rect->Height = graphics->bounds.Height; } return Ok; } GpStatus GdipGetVisibleClipBoundsI (GpGraphics *graphics, GpRect *rect) { GpStatus status; GpRectF rectF; if (!graphics || !rect) return InvalidParameter; status = GdipGetVisibleClipBounds (graphics, &rectF); if (status != Ok) return status; rect->X = rectF.X; rect->Y = rectF.Y; rect->Width = rectF.Width; rect->Height = rectF.Height; return Ok; } GpStatus GdipIsVisibleClipEmpty (GpGraphics *graphics, BOOL *result) { if (!graphics || !result) return InvalidParameter; *result = (graphics->bounds.Width == 0 || graphics->bounds.Height == 0); return Ok; } GpStatus GdipIsVisiblePoint (GpGraphics *graphics, float x, float y, BOOL *result) { GpRectF rectF; if (!graphics || !result) return InvalidParameter; rectF.X = graphics->bounds.X; rectF.Y = graphics->bounds.Y; rectF.Width = graphics->bounds.Width; rectF.Height = graphics->bounds.Height; *result = gdip_is_Point_in_RectF_inclusive (x, y, &rectF); return Ok; } GpStatus GdipIsVisiblePointI (GpGraphics *graphics, int x, int y, BOOL *result) { return GdipIsVisiblePoint (graphics, x, y, result); } GpStatus GdipIsVisibleRect (GpGraphics *graphics, float x, float y, float width, float height, BOOL *result) { BOOL found = FALSE; float posy, posx; GpRectF recthit, boundsF; if (!graphics || !result) return InvalidParameter; if (width ==0 || height ==0) { *result = FALSE; return Ok; } boundsF.X = graphics->bounds.X; boundsF.Y = graphics->bounds.Y; boundsF.Width = graphics->bounds.Width; boundsF.Height = graphics->bounds.Height; recthit.X = x; recthit.Y = y; recthit.Width = width; recthit.Height = height; /* Any point of intersection ?*/ for (posy = 0; posy < recthit.Height+1; posy++) { for (posx = 0; posx < recthit.Width +1; posx++) { if (gdip_is_Point_in_RectF_inclusive (recthit.X + posx , recthit.Y + posy, &boundsF) == TRUE) { found = TRUE; break; } } } *result = found; return Ok; } GpStatus GdipIsVisibleRectI (GpGraphics *graphics, int x, int y, int width, int height, BOOL *result) { return GdipIsVisibleRect (graphics, x, y, width, height, result); } GpStatus GdipSetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode) { if (!graphics) return InvalidParameter; graphics->composite_mode = compositingMode; switch (graphics->backend) { case GraphicsBackEndCairo: return cairo_SetCompositingMode (graphics, compositingMode); case GraphicsBackEndMetafile: return metafile_SetCompositingMode (graphics, compositingMode); default: return GenericError; } } GpStatus GdipGetCompositingMode (GpGraphics *graphics, CompositingMode *compositingMode) { if (!graphics || !compositingMode) return InvalidParameter; *compositingMode = graphics->composite_mode; return Ok; } GpStatus GdipSetCompositingQuality (GpGraphics *graphics, CompositingQuality compositingQuality) { if (!graphics) return InvalidParameter; graphics->composite_quality = compositingQuality; switch (graphics->backend) { case GraphicsBackEndCairo: /* In Cairo there is no way of setting this, always use high quality */ return Ok; case GraphicsBackEndMetafile: return metafile_SetCompositingQuality (graphics, compositingQuality); default: return GenericError; } } GpStatus GdipGetCompositingQuality (GpGraphics *graphics, CompositingQuality *compositingQuality) { if (!graphics || !compositingQuality) return InvalidParameter; *compositingQuality = graphics->composite_quality; return Ok; } GpStatus GdipGetNearestColor (GpGraphics *graphics, ARGB *argb) { return Ok; } GpStatus GdipSetPageScale (GpGraphics *graphics, float scale) { if (!graphics) return InvalidParameter; graphics->scale = scale; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: /* page unit and scale are in the same EMF+ record */ return metafile_SetPageTransform (graphics, graphics->page_unit, scale); default: return GenericError; } } GpStatus GdipGetPageScale (GpGraphics *graphics, float *scale) { if (!graphics | !scale) return InvalidParameter; *scale = graphics->scale; return Ok; } GpStatus GdipSetPageUnit (GpGraphics *graphics, GpUnit unit) { if (!graphics) return InvalidParameter; graphics->page_unit = unit; switch (graphics->backend) { case GraphicsBackEndCairo: return Ok; case GraphicsBackEndMetafile: /* page unit and scale are in the same EMF+ record */ return metafile_SetPageTransform (graphics, unit, graphics->scale); default: return GenericError; } } GpStatus GdipGetPageUnit (GpGraphics *graphics, GpUnit *unit) { if (!graphics || !unit) return InvalidParameter; *unit = graphics->page_unit; return Ok; } GpStatus GdipTransformPoints (GpGraphics *graphics, GpCoordinateSpace destSpace, GpCoordinateSpace srcSpace, GpPointF *points, int count) { static int called = 0; if (!called) { printf("NOT IMPLEMENTED YET:GdipTransformPoints (GpGraphics *graphics, GpCoordinateSpace destSpace %d, GpCoordinateSpace srcSpace %d, GpPointF *points, int count %d)\n", destSpace, srcSpace, count); } /* return NotImplemented; */ return Ok; } GpStatus GdipTransformPointsI (GpGraphics *graphics, GpCoordinateSpace destSpace, GpCoordinateSpace srcSpace, GpPoint *points, int count) { static int called = 0; if (!called) { printf("NOT IMPLEMENTED YET:GdipTransformPointsI (GpGraphics *graphics, GpCoordinateSpace destSpace, GpCoordinateSpace srcSpace, GpPoint *points, int count)\n"); } /* return NotImplemented; */ return Ok; } libgdiplus-2.11/src/lineargradientbrush-private.h0000664000175000017500000000423212225470167017171 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __LINEARGRADIENT_PRIVATE_H__ #define __LINEARGRADIENT_PRIVATE_H__ #include "gdiplus-private.h" #include "brush-private.h" #include "matrix-private.h" #define DEFAULT_GRADIENT_ANGLE 45.0f typedef struct _LineGradient { GpBrush base; ARGB lineColors [2]; GpPointF points [2]; GpRectF rectangle; GpMatrix matrix; GpWrapMode wrapMode; float angle; Blend *blend; InterpolationColors *presetColors; cairo_pattern_t *pattern; BOOL isAngleScalable; BOOL gammaCorrection; /* FIXME: Not used */ } LineGradient; #include "lineargradientbrush.h" #endif libgdiplus-2.11/src/icocodec.h0000664000175000017500000000357712225470167013250 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __ICOCODEC_H__ #define __ICOCODEC_H__ #include "bitmap-private.h" #include "bmpcodec.h" /* Information about the icon format can be found @ http://www.daubnet.com/formats/ICO.html */ typedef struct { BYTE bWidth; BYTE bHeight; BYTE bColorCount; BYTE bReserved; WORD wPlanes; WORD wBitCount; DWORD dwBytesInRes; DWORD dwImageOffset; } ICONDIRENTRY; #define gdip_read_ico_data gdip_read_bmp_data GpStatus gdip_load_ico_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_ico_image_from_stream_delegate (dstream_t *loader, GpImage **image) GDIP_INTERNAL; /* no save functions as the ICO "codec" is a decoder only */ ImageCodecInfo* gdip_getcodecinfo_ico () GDIP_INTERNAL; #endif libgdiplus-2.11/src/region.c0000664000175000017500000014516112225470167012752 00000000000000/* * Copyright (c) 2004-2005 Ximian * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Jordi Mas i Hernandez , 2004-2005 * Sebastien Pouliot * */ #include "region-private.h" #include "graphics-path-private.h" /* Helper functions */ static void gdip_from_Rect_To_RectF (GpRect* rect, GpRectF* rectf) { rectf->X = rect->X; rectf->Y = rect->Y; rectf->Width = rect->Width; rectf->Height = rect->Height; } static void gdip_add_rect_to_array (GpRectF** srcarray, int* elements, GpRectF* rect) { GpRectF *array, *next; array = GdipAlloc (sizeof (GpRectF) * (*elements + 1)); memcpy (array, *srcarray, sizeof (GpRectF) * (*elements)); if (*srcarray) GdipFree (*srcarray); next = array; next += (*elements); memcpy (next, rect, sizeof (GpRectF)); *srcarray = array; *elements = *elements + 1; } static BOOL gdip_is_Point_in_RectF_Visible (float x, float y, GpRectF* rect) { if ((x >= rect->X && x < (rect->X + rect->Width)) && (y >= rect->Y && y < (rect->Y + rect->Height))) return TRUE; else return FALSE; } static BOOL gdip_is_Point_in_RectFs_Visible (float x, float y, GpRectF* r, int cnt) { GpRectF* rect = r; int i; for (i = 0; i < cnt; i++, rect++) { if (gdip_is_Point_in_RectF_Visible (x, y, rect)) { return TRUE; } } return FALSE; } static void gdip_get_bounds (GpRectF *allrects, int allcnt, GpRectF *bound) { float nx, ny, fx, fy; int i; GpRectF *rect; if (allrects == NULL || allcnt == 0) { bound->X = bound->Y = bound->Width = bound->Height = 0; return; } /* Build a rect that contains all the rects inside. Smallest x,y and biggest x,y*/ nx = allrects->X; ny = allrects->Y; fx = allrects->X + allrects->Width; fy = allrects->Y + allrects->Height; for (i = 0, rect = allrects; i < allcnt; i++, rect++) { if (rect->X < nx) nx = rect->X; if (rect->Y < ny) ny = rect->Y; if (rect->X + rect->Width > fx) fx = rect->X + rect->Width; if (rect->Y + rect->Height > fy) fy = rect->Y + rect->Height; } bound->X = nx; bound->Y = ny; bound->Width = fx - nx; bound->Height = fy - ny; } /* This internal version doesn't require a Graphic object to work */ static BOOL gdip_is_region_empty (GpRegion *region) { GpRectF rect; if (!region) return FALSE; if (region->type == RegionTypePath) { /* check for an existing, but empty, path list */ if (!region->tree) return TRUE; if (region->tree->path) return (region->tree->path->count == 0); return FALSE; } if (!region->rects || (region->cnt == 0)) return TRUE; gdip_get_bounds (region->rects, region->cnt, &rect); return ((rect.Width == 0) || (rect.Height == 0)); } static BOOL gdip_is_rect_infinite (GpRectF *rect) { return (rect && (rect->X == REGION_INFINITE_POSITION) && (rect->Y == REGION_INFINITE_POSITION) && (rect->Width == REGION_INFINITE_LENGTH) && (rect->Height == REGION_INFINITE_LENGTH)); } BOOL gdip_is_InfiniteRegion (GpRegion *region) { switch (region->type) { case RegionTypeRectF: if (region->cnt != 1) return FALSE; return gdip_is_rect_infinite (region->rects); case RegionTypePath: /* FIXME: incomplete and not 100% accurate (curves) - but cover the most common case */ if (region->tree && region->tree->path && (region->tree->path->count == 4)) { GpRectF bounds; if (GdipGetPathWorldBounds (region->tree->path, &bounds, NULL, NULL) != Ok) return gdip_is_rect_infinite (&bounds); } break; default: g_warning ("unknown type %d", region->type); break; } return FALSE; } static BOOL gdip_intersects (GpRectF *rect1, GpRectF *rect2) { if (rect1->X + rect1->Width == rect2->X) { return TRUE; } return (rect1->X < rect2->X + rect2->Width && rect1->X + rect1->Width > rect2->X && rect1->Y < rect2->Y + rect2->Height && rect1->Y + rect1->Height > rect2->Y); } /* Is source contained in target ? */ static BOOL gdip_contains (GpRectF *rect1, GpRectF *rect2) { return (rect1->X >= rect2->X && rect1->X + rect1->Width <= rect2->X + rect2->Width && rect1->Y >= rect2->Y && rect1->Y + rect1->Height <= rect2->Y + rect2->Height); } static BOOL gdip_add_rect_to_array_notcontained (GpRectF** srcarray, int* elements, GpRectF* rect) { int i; GpRectF* rectarray = *srcarray; if (rect->Height <= 0 || rect->Width <= 0) return FALSE; for (i = 0; i < *elements; i++, rectarray++) { if (gdip_contains (rect, rectarray) == TRUE) { return FALSE; } } gdip_add_rect_to_array (srcarray, elements, rect); return TRUE; } static BOOL gdip_equals (GpRectF *rect1, GpRectF *rect2) { if (!rect1) return (rect2 == NULL); return (rect1->X == rect2->X && rect1->Width == rect2->Width && rect1->Y == rect2->Y && rect1->Height == rect2->Height); } BOOL gdip_is_Point_in_RectF_inclusive (float x, float y, GpRectF* rect) { if ((x >= rect->X && x <= (rect->X + rect->Width)) && (y >= rect->Y && y <= (rect->Y + rect->Height))) return TRUE; else return FALSE; } /* Finds a rect that has the lowest x and y after the src rect provided */ static BOOL gdip_getlowestrect (GpRectF *rects, int cnt, GpRectF* src, GpRectF* rslt) { int i; GpRectF *current; GpRectF *lowest = NULL; for (i = 0, current = rects; i < cnt; i++, current++) { if (current->Width <= 0 || current->Height <= 0) continue; if (current->Y > src->Y || (current->Y == src->Y && current->X > src->X)) { if (lowest == NULL) { lowest = current; } else { if (current->Y < lowest->Y || (current->Y == lowest->Y && current->X < lowest->X)) { lowest = current; } } } } if (lowest == NULL) { return FALSE; } rslt->X = lowest->X; rslt->Y = lowest->Y; rslt->Width = lowest->Width; rslt->Height = lowest->Height; return TRUE; } void gdip_clear_region (GpRegion *region) { region->type = RegionTypeEmpty; if (region->rects) { GdipFree (region->rects); region->rects = NULL; } if (region->tree) { gdip_region_clear_tree (region->tree); GdipFree (region->tree); region->tree = NULL; } if (region->bitmap) { gdip_region_bitmap_free (region->bitmap); region->bitmap = NULL; } region->cnt = 0; } void gdip_copy_region (GpRegion *source, GpRegion *dest) { dest->type = source->type; if (source->rects) { dest->cnt = source->cnt; dest->rects = (GpRectF *) GdipAlloc (sizeof (GpRectF) * source->cnt); memcpy (dest->rects, source->rects, sizeof (GpRectF) * source->cnt); } else { dest->cnt = 0; dest->rects = NULL; } if (source->tree) { dest->tree = (GpPathTree *) GdipAlloc (sizeof (GpPathTree)); gdip_region_copy_tree (source->tree, dest->tree); } else { dest->tree = NULL; } if (source->bitmap) { dest->bitmap = gdip_region_bitmap_clone (source->bitmap); } else { dest->bitmap = NULL; } } /* convert a rectangle-based region to a path based region */ static void gdip_region_convert_to_path (GpRegion *region) { int i; GpRectF *rect; /* no conversion is required for complex regions */ if (!region || (region->type != RegionTypeRectF)) return; region->type = RegionTypePath; region->tree = (GpPathTree *) GdipAlloc (sizeof (GpPathTree)); GdipCreatePath (FillModeAlternate, ®ion->tree->path); /* all rectangles are converted into a single path */ for (i = 0, rect = region->rects; i < region->cnt; i++, rect++) { GdipAddPathRectangle (region->tree->path, rect->X, rect->Y, rect->Width, rect->Height); } if (region->rects) { GdipFree (region->rects); region->rects = NULL; } } /* * Create a region (path-tree) from a path. */ static GpStatus gdip_region_create_from_path (GpRegion *region, GpPath *path) { region->type = RegionTypePath; region->tree = (GpPathTree *) GdipAlloc (sizeof (GpPathTree)); return GdipClonePath (path, ®ion->tree->path); } static GpStatus gdip_createRegion (GpRegion **region, RegionType type, void *src) { GpRegion *result; GpRectF rect; result = (GpRegion *) GdipAlloc (sizeof (GpRegion)); result->type = type; result->cnt = 0; result->rects = NULL; result->tree = NULL; result->bitmap = NULL; switch (type) { case RegionTypeRect: gdip_from_Rect_To_RectF ((GpRect *)src, &rect); gdip_add_rect_to_array (&result->rects, &result->cnt, &rect); result->type = RegionTypeRectF; break; case RegionTypeRectF: gdip_add_rect_to_array (&result->rects, &result->cnt, (GpRectF *)src); break; case RegionTypeEmpty: GdipSetInfinite (result); /* note: GdipSetInfinite converts type to RegionTypeRectF */ break; case RegionTypePath: gdip_region_create_from_path (result, (GpPath*)src); break; default: g_warning ("unknown type %d", result->type); return NotImplemented; } *region = result; return Ok; } /* API implementation */ // coverity[+alloc : arg-*0] GpStatus GdipCreateRegion (GpRegion **region) { if (!region) return InvalidParameter; return gdip_createRegion (region, RegionTypeEmpty, NULL); } // coverity[+alloc : arg-*1] GpStatus GdipCreateRegionRect (GDIPCONST GpRectF *rect, GpRegion **region) { if (!region || !rect) return InvalidParameter; return gdip_createRegion (region, RegionTypeRectF, (void*) rect); } // coverity[+alloc : arg-*1] GpStatus GdipCreateRegionRectI (GDIPCONST GpRect *rect, GpRegion **region) { if (!region || !rect) return InvalidParameter; return gdip_createRegion (region, RegionTypeRect, (void*) rect); } // coverity[+alloc : arg-*2] GpStatus GdipCreateRegionRgnData (GDIPCONST BYTE *regionData, int size, GpRegion **region) { GpRegion *result; if (!region || !regionData) return InvalidParameter; if (size < 8) return GenericError; result = (GpRegion *) GdipAlloc (sizeof (GpRegion)); memcpy (&result->type, regionData, sizeof (guint32)); result->cnt = 0; result->rects = NULL; result->tree = NULL; result->bitmap = NULL; switch (result->type) { case RegionTypeRectF: { guint32 count; GpRectF *rect; int i; memcpy (&count, regionData + 4, sizeof (guint32)); if (count != (size - 8) / sizeof (GpRectF)) { GdipFree (result); return InvalidParameter; } for (i = 0, rect = (GpRectF*)(regionData + 8); i < count; i++, rect++) gdip_add_rect_to_array (&result->rects, &result->cnt, rect); } break; case RegionTypePath: if (size < 16) { GdipFree (result); return InvalidParameter; } result->tree = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); if (!gdip_region_deserialize_tree ((BYTE*)(regionData + 4), (size - 4), result->tree)) { GdipFree (result); return InvalidParameter; } break; default: g_warning ("unknown type %d", result->type); GdipFree (result); return NotImplemented; } *region = result; return Ok; } // coverity[+alloc : arg-*1] GpStatus GdipCloneRegion (GpRegion *region, GpRegion **cloneRegion) { GpRegion *result; if (!region || !cloneRegion) return InvalidParameter; result = (GpRegion *) GdipAlloc (sizeof (GpRegion)); if (!result) return OutOfMemory; gdip_copy_region (region, result); *cloneRegion = result; return Ok; } GpStatus GdipDeleteRegion (GpRegion *region) { if (!region) return InvalidParameter; gdip_clear_region (region); GdipFree (region); return Ok; } GpStatus GdipSetInfinite (GpRegion *region) { GpRectF rect; if (!region) return InvalidParameter; gdip_clear_region (region); region->type = RegionTypeRectF; rect.X = rect.Y = REGION_INFINITE_POSITION; rect.Width = rect.Height = REGION_INFINITE_LENGTH; gdip_add_rect_to_array (®ion->rects, ®ion->cnt, &rect); return Ok; } GpStatus GdipSetEmpty (GpRegion *region) { if (!region) return InvalidParameter; gdip_clear_region (region); region->type = RegionTypeRectF; return Ok; } /* pre-process negative width and height, without modifying the originals, see bug #383878 */ static void gdip_normalize_rectangle (GpRectF *rect, GpRectF *normalized) { if (rect->Width < 0) { normalized->X = rect->X + rect->Width; normalized->Width = fabs (rect->Width); } else { normalized->X = rect->X; normalized->Width = rect->Width; } if (rect->Height < 0) { normalized->Y = rect->Y + rect->Height; normalized->Height = fabs (rect->Height); } else { normalized->Y = rect->Y; normalized->Height = rect->Height; } } /* Exclude */ static void gdip_combine_exclude (GpRegion *region, GpRectF *rtrg, int cntt) { GpRectF *allsrcrects = NULL, *rects = NULL; GpRectF *alltrgrects = NULL, *rect, *rectop, *recttrg; int allsrccnt = 0, cnt = 0, i, n, alltrgcnt = 0; GpRectF current, rslt, newrect; BOOL storecomplete; /* Create the list of source rectangles to process, it will contain splitted ones later */ for (i = 0, rect = region->rects; i < region->cnt; i++, rect++) gdip_add_rect_to_array (&allsrcrects, &allsrccnt, rect); /* Create the list of target rectangles to process, it will contain splitted ones later */ for (i = 0, rect = rtrg; i < cntt; i++, rect++) { /* normalize */ GpRectF normal; gdip_normalize_rectangle (rect, &normal); gdip_add_rect_to_array (&alltrgrects, &alltrgcnt, &normal); } /* Init current with the first element in the array */ current.X = REGION_INFINITE_POSITION - 1; current.Y = REGION_INFINITE_POSITION - 1; current.Width = 0; current.Height = 0; while (gdip_getlowestrect (allsrcrects, allsrccnt, ¤t, &rslt)) { current.X = rslt.X; current.Y = rslt.Y; current.Width = rslt.Width; current.Height = rslt.Height; storecomplete = TRUE; /* Current rect with lowest y and X against the target ones */ for (i = 0, recttrg = alltrgrects; i < alltrgcnt; i++, recttrg++) { if (gdip_intersects (¤t, recttrg) == FALSE || gdip_equals (¤t, recttrg) == TRUE || recttrg->Height < 0 || recttrg->Width < 0) { continue; } /* Once a rect is splitted, we do not want to take into account anymore */ for (rectop = allsrcrects, n = 0; n < allsrccnt; n++, rectop++) { if (gdip_equals (¤t, rectop)) { rectop->X = 0; rectop->Y = 0; rectop->Width = 0; rectop->Height = 0; break; } } /* Result rect */ newrect.Y = current.Y; if (current.Y >= recttrg->Y) { /* Our rect intersects in the upper part with another rect */ newrect.Height = MIN (recttrg->Y + recttrg->Height - current.Y, current.Height); if (newrect.Height < 0) newrect.Height = current.Height; if (current.X >= recttrg->X) { /* Hit from behind */ newrect.X = recttrg->X + recttrg->Width; newrect.Width = MAX (current.X + current.Width - newrect.X, 0); } else { newrect.X = current.X; newrect.Width = MAX (recttrg->X - current.X, 0); } } else { newrect.Height = MIN (recttrg->Y - current.Y, current.Height); newrect.X = current.X; newrect.Width = current.Width; } gdip_add_rect_to_array_notcontained (&rects, &cnt, &newrect); /* What's left to process from the source region */ if (current.Y >= recttrg->Y) { /* Our rect intersects in the upper part with another rect */ /* A whole part from the top has been taken*/ if (recttrg->X <= current.X && recttrg->X + recttrg->Width >= current.X + current.Width) rslt.Y = recttrg->Y + recttrg->Height; else rslt.Y = newrect.Y + newrect.Height; rslt.Height = current.Y + current.Height - rslt.Y; } else { rslt.Y = recttrg->Y; rslt.Height = current.Y + current.Height - recttrg->Y; } rslt.X = current.X; rslt.Width = current.Width; if (rslt.Height > 0 && rslt.Width > 0) { gdip_add_rect_to_array (&allsrcrects, &allsrccnt, &rslt); } /* Special case where our rect is hit and split in two parts IIIUIII */ if (recttrg->X >= current.X && recttrg->X + recttrg->Width <= current.X + current.Width) { /* Generate extra right rect, keep previous values of Y and Height */ newrect.Width = current.X + current.Width - (recttrg->X + recttrg->Width); newrect.X = recttrg->X + recttrg->Width; gdip_add_rect_to_array_notcontained (&rects, &cnt, &newrect); } storecomplete = FALSE; break; } /* don't include a rectangle identical to the excluded one! */ if (storecomplete && !gdip_equals (rtrg, ¤t)) { gdip_add_rect_to_array_notcontained (&rects, &cnt, ¤t); } } GdipFree (allsrcrects); GdipFree (alltrgrects); if (region->rects) GdipFree (region->rects); region->rects = rects; region->cnt = cnt; } /* Complement: the part of the second region not shared with the first region. Scans the region to be combined and store the rects not present in the region */ static void gdip_combine_complement (GpRegion *region, GpRectF *rtrg, int cntt) { GpRegion regsrc; GpRectF* trg, *rect; GpRectF* allsrcrects = NULL; int allsrccnt = 0, i, trgcnt; /* Create the list of source rectangles to process */ for (i = 0, rect = rtrg; i < cntt; i++, rect++) { /* normalize */ GpRectF normal; gdip_normalize_rectangle (rect, &normal); gdip_add_rect_to_array (&allsrcrects, &allsrccnt, &normal); } regsrc.rects = allsrcrects; regsrc.cnt = allsrccnt; trg = region->rects; trgcnt = region->cnt; gdip_combine_exclude (®src, trg, trgcnt); if ((regsrc.rects != allsrcrects) || (regsrc.cnt != allsrccnt)) { if (region->rects) GdipFree (region->rects); region->rects = regsrc.rects; region->cnt = regsrc.cnt; } } /* Union */ static void gdip_combine_union (GpRegion *region, GpRectF *rtrg, int cnttrg) { GpRectF *allrects = NULL, *rects = NULL; GpRectF *recttrg, *rect, *rectop; int allcnt = 0, cnt = 0, i, n; GpRectF current, rslt, newrect; BOOL storecomplete, contained; /* All the src and trg rects in a single array*/ for (i = 0, rect = region->rects; i < region->cnt; i++, rect++) gdip_add_rect_to_array (&allrects, &allcnt, rect); for (i = 0, rect = rtrg; i < cnttrg; i++, rect++) { /* normalize */ GpRectF normal; gdip_normalize_rectangle (rect, &normal); gdip_add_rect_to_array (&allrects, &allcnt, &normal); } if (allcnt == 0) { GdipFree (allrects); return; } /* Init current with the first element in the array */ current.X = REGION_INFINITE_POSITION; current.Y = REGION_INFINITE_POSITION; current.Width = 0; current.Height = 0; while (gdip_getlowestrect (allrects, allcnt, ¤t, &rslt)) { current.X = rslt.X; current.Y = rslt.Y; current.Width = rslt.Width; current.Height = rslt.Height; storecomplete = TRUE; /* Current rect with lowest y and X againt the stored ones */ for (i = 0, recttrg = allrects; i < allcnt; i++, recttrg++) { /* If it has lower coordinates it has been already processed */ if (current.Y > recttrg->Y || (current.Y == recttrg->Y && current.X > recttrg->X)) { continue; } if (gdip_intersects (¤t, recttrg) == FALSE || gdip_equals (¤t, recttrg) == TRUE || recttrg->Height < 0 || recttrg->Width < 0) { continue; } if (gdip_contains (recttrg, ¤t) == TRUE) { continue; } /* Once a rect is splitted, we do not want to take into account anymore */ for (rectop = allrects, n = 0; n < allcnt; n++, rectop++) { if (gdip_equals (¤t, rectop)) { rectop->X = 0; rectop->Y = 0; rectop->Width = 0; rectop->Height = 0; break; } } /* Our rect intersects in the lower part with another rect */ newrect.Y = current.Y; if (current.Y == recttrg->Y) { newrect.X = MIN (current.X, recttrg->X); newrect.Width = MAX (current.X + current.Width, recttrg->X + recttrg->Width) - newrect.X; newrect.Height = MIN (current.Height, recttrg->Height); } else { newrect.X = current.X; newrect.Width = current.Width; newrect.Height = recttrg->Y - current.Y; /* If it's contained inside, get the > height */ if (recttrg->X >= current.X && recttrg->X + recttrg->Width <= current.X + current.Width) newrect.Height = MAX (current.Height, recttrg->Height); } gdip_add_rect_to_array_notcontained (&rects, &cnt, &newrect); /* Push what's left from the current the rect in the list of rects to process if it's already not contained in other rects except the current (we just split from there) */ rslt.X = current.X; rslt.Y = newrect.Y + newrect.Height; rslt.Width = current.Width; rslt.Height = current.Height - newrect.Height; contained = FALSE; for (rectop = allrects, n = 0; n < allcnt; n++, rectop++) { if (gdip_equals (rectop, ¤t)) /* If it's contained with the current does not count */ continue; if (gdip_contains (&rslt, rectop)) { contained = TRUE; break; } } if (contained == FALSE && rslt.Height > 0 && rslt.Width > 0) { gdip_add_rect_to_array (&allrects, &allcnt, &rslt); recttrg = allrects; } /* If both we at the same Y when take into account the X also to process the following that exceeds the X also */ if (recttrg->Y == current.Y) { if (recttrg->Height <= current.Height) { /* Takes all part */ recttrg->Width = recttrg->X + recttrg->Width - (recttrg->X + recttrg->Width); recttrg->X = newrect.X + newrect.Width; recttrg->Y += newrect.Height; recttrg->Height -= newrect.Height; } else { if (newrect.X + newrect.Width >= recttrg->X + recttrg->Width) { recttrg->Y += newrect.Height; recttrg->Height -= newrect.Height; } } } /* If it's contained inside, get the > height */ if (recttrg->X >= current.X && recttrg->X + recttrg->Width <= current.X + current.Width) { recttrg->Height = MAX (recttrg->Y + recttrg->Height - (current.Y + current.Height), 0); recttrg->Y = newrect.Y + newrect.Height; } storecomplete = FALSE; break; } if (storecomplete) { gdip_add_rect_to_array_notcontained (&rects, &cnt, ¤t); } } GdipFree (allrects); if (region->rects) GdipFree (region->rects); region->rects = rects; region->cnt = cnt; } /* Intersect */ static void gdip_combine_intersect (GpRegion *region, GpRectF *rtrg, int cnttrg) { GpRectF *rectsrc; int src, trg; GpRectF rectcur; GpRegion regunion; GpRectF *recttrg; regunion.rects = NULL; regunion.cnt = 0; for (rectsrc = region->rects, src = 0; src < region->cnt; src++, rectsrc++) { for (recttrg = rtrg, trg = 0; trg < cnttrg; trg++, recttrg++) { /* normalize */ GpRectF normal; gdip_normalize_rectangle (recttrg, &normal); /* Intersects With */ if ((rectsrc->X >= normal.X + normal.Width) || (rectsrc->X + rectsrc->Width <= normal.X) || (rectsrc->Y >= normal.Y + normal.Height) || (rectsrc->Y + rectsrc->Height <= normal.Y)) { continue; } /* Area that intersects */ rectcur.X = rectsrc->X > normal.X ? rectsrc->X : normal.X; rectcur.Y = rectsrc->Y > normal.Y ? rectsrc->Y : normal.Y; rectcur.Width = rectsrc->X + rectsrc->Width < normal.X + normal.Width ? rectsrc->X + rectsrc->Width - rectcur.X : normal.X + normal.Width - rectcur.X; rectcur.Height = rectsrc->Y + rectsrc->Height < normal.Y + normal.Height ? rectsrc->Y + rectsrc->Height - rectcur.Y : normal.Y + normal.Height - rectcur.Y; /* Combine with previous areas that intersect with rect */ gdip_combine_union (®union, &rectcur, 1); } } if (region->rects) GdipFree (region->rects); region->rects = regunion.rects; region->cnt = regunion.cnt; } /* Xor */ static void gdip_combine_xor (GpRegion *region, GpRectF *recttrg, int cnttrg) { GpRegion *rgnsrc; /* All rectangles of both regions*/ GpRegion *rgntrg; /* Only the ones that intersect*/ GpRectF *allrects = NULL, *rect; int allcnt = 0, i; /* All the src and trg rects in a single array*/ for (i = 0, rect = region->rects; i < region->cnt; i++, rect++) gdip_add_rect_to_array (&allrects, &allcnt, rect); for (i = 0, rect = recttrg; i < cnttrg; i++, rect++) { /* normalize */ GpRectF normal; gdip_normalize_rectangle (rect, &normal); gdip_add_rect_to_array (&allrects, &allcnt, &normal); } rgnsrc = (GpRegion *) GdipAlloc (sizeof (GpRegion)); rgnsrc->type = RegionTypeRectF; rgnsrc->cnt = allcnt; rgnsrc->rects = allrects; GdipCloneRegion (region, &rgntrg); gdip_combine_intersect (rgntrg, recttrg, cnttrg); /* exclude the intersecting rectangles (if any) */ if (rgntrg->cnt > 0) gdip_combine_exclude (rgnsrc, rgntrg->rects, rgntrg->cnt); if (region->rects) GdipFree (region->rects); region->rects = rgnsrc->rects; region->cnt = rgnsrc->cnt; GdipFree (rgnsrc); GdipDeleteRegion (rgntrg); } GpStatus GdipCombineRegionRect (GpRegion *region, GDIPCONST GpRectF *rect, CombineMode combineMode) { if (!region || !rect) return InvalidParameter; /* allow the current region to "revert" to a simple RegionTypeRect if possible */ if (combineMode == CombineModeReplace) GdipSetEmpty (region); /* Union with infinity is a no-op (still an infinite region) */ if ((combineMode == CombineModeUnion) && gdip_is_InfiniteRegion (region)) return Ok; if (region->type == RegionTypePath) { GpPath *path = NULL; GpStatus status; /* Convert GpRectF to GpPath and use GdipCombineRegionPath */ status = GdipCreatePath (FillModeAlternate, &path); if (status != Ok) { if (path) GdipDeletePath (path); return status; } GdipAddPathRectangle (path, rect->X, rect->Y, rect->Width, rect->Height); status = GdipCombineRegionPath (region, path, combineMode); GdipDeletePath (path); return status; } /* region is rectangle-based */ switch (combineMode) { case CombineModeExclude: gdip_combine_exclude (region, (GpRectF *) rect, 1); break; case CombineModeComplement: gdip_combine_complement (region, (GpRectF *) rect, 1); break; case CombineModeIntersect: gdip_combine_intersect (region, (GpRectF *) rect, 1); break; case CombineModeUnion: gdip_combine_union (region, (GpRectF *) rect, 1); break; case CombineModeXor: gdip_combine_xor (region, (GpRectF *) rect, 1); break; case CombineModeReplace: /* Used by Graphics clipping */ gdip_add_rect_to_array (®ion->rects, ®ion->cnt, (GpRectF *)rect); break; default: return NotImplemented; } return Ok; } GpStatus GdipCombineRegionRectI (GpRegion *region, GDIPCONST GpRect *recti, CombineMode combineMode) { GpRectF rect; if (!region || !recti) return InvalidParameter; gdip_from_Rect_To_RectF ((GpRect *) recti, &rect); return GdipCombineRegionRect (region, (GDIPCONST GpRectF *) &rect, combineMode); } /* Exclude path from infinite region */ static BOOL gdip_combine_exclude_from_infinite (GpRegion *region, GpPath *path) { /* * We combine the path with the infinite region's, then reverse it. */ GpPath *region_path; GpStatus status; if (path->count == 0) return TRUE; if (region->type == RegionTypeRectF) gdip_region_convert_to_path (region); g_assert (region->tree->path); region_path = region->tree->path; status = GdipClonePath (path, ®ion->tree->path); if (status != Ok) { region->tree->path = region_path; return FALSE; } status = GdipAddPathPath (region->tree->path, region_path, FALSE); if (status != Ok) { GdipDeletePath (region->tree->path); region->tree->path = region_path; return FALSE; } status = GdipReversePath (region->tree->path); if (status != Ok) { GdipDeletePath (region->tree->path); region->tree->path = region_path; return FALSE; } return TRUE; } GpStatus GdipCombineRegionPath (GpRegion *region, GpPath *path, CombineMode combineMode) { GpRegionBitmap *path_bitmap, *result; if (!region || !path) return InvalidParameter; /* special case #1 - replace */ if (combineMode == CombineModeReplace) { gdip_clear_region (region); gdip_region_create_from_path (region, path); return Ok; } /* special case #2 - the region is empty */ if (gdip_is_region_empty (region)) { switch (combineMode) { case CombineModeComplement: case CombineModeUnion: case CombineModeXor: /* this is like "adding" the path */ gdip_clear_region (region); gdip_region_create_from_path (region, path); break; default: /* Intersect and Exclude are no-op on an empty region */ break; } return Ok; } /* special case #3 - the region is infinite */ if (gdip_is_InfiniteRegion (region)) { /* additional shortcuts are possible if path is empty */ BOOL empty = (path->count == 0); switch (combineMode) { case CombineModeUnion: /* Union with infinity is a no-op (still an infinite region) */ return Ok; case CombineModeComplement: /* Complement of infinity is empty - whatever the path is */ gdip_clear_region (region); region->type = RegionTypeRectF; return Ok; case CombineModeIntersect: /* Intersection with infinity is the path itself */ gdip_clear_region (region); if (empty) region->type = RegionTypeRectF; else gdip_region_create_from_path (region, path); return Ok; case CombineModeExclude: if (gdip_combine_exclude_from_infinite (region, path)) return Ok; break; default: /* Xor must be treated as a "normal" case unless the path is empty */ if (empty) return Ok; break; } } if (region->type == RegionTypeRectF) gdip_region_convert_to_path (region); /* make sure the region's bitmap is available */ gdip_region_bitmap_ensure (region); g_assert (region->bitmap); /* create a bitmap for the path to combine into the region */ path_bitmap = gdip_region_bitmap_from_path (path); result = gdip_region_bitmap_combine (region->bitmap, path_bitmap, combineMode); gdip_region_bitmap_free (path_bitmap); if (!result) return NotImplemented; gdip_region_bitmap_free (region->bitmap); region->bitmap = result; /* add a copy of path into region1 tree */ if (region->tree->path) { /* move the existing path into a new tree (branch1) ... */ region->tree->branch1 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); region->tree->branch1->path = region->tree->path; region->tree->branch2 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); } else { /* move the current base tree into branch1 of a new tree ... */ GpPathTree* tmp = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); tmp->branch1 = region->tree; tmp->branch2 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); region->tree = tmp; } /* ... and clone the specified path into branch2 */ region->tree->mode = combineMode; region->tree->path = NULL; GdipClonePath (path, ®ion->tree->branch2->path); return Ok; } static GpStatus gdip_combine_pathbased_region (GpRegion *region1, GpRegion *region2, CombineMode combineMode) { GpRegionBitmap *result; GpPathTree* tmp; /* if not available, construct the bitmaps for both regions */ gdip_region_bitmap_ensure (region1); gdip_region_bitmap_ensure (region2); if (!region1->bitmap || !region2->bitmap) return OutOfMemory; result = gdip_region_bitmap_combine (region1->bitmap, region2->bitmap, combineMode); if (!result) return NotImplemented; gdip_region_bitmap_free (region1->bitmap); region1->bitmap = result; /* re-structure region1 to allow adding a copy of region2 inside it */ if (region1->tree->path) { region1->tree->branch1 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); region1->tree->branch1->path = region1->tree->path; region1->tree->branch2 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); } else { /* move the current base tree into branch1 of a new tree ... */ GpPathTree* tmp = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); tmp->branch1 = region1->tree; tmp->branch2 = (GpPathTree*) GdipAlloc (sizeof (GpPathTree)); region1->tree = tmp; } region1->tree->mode = combineMode; region1->tree->path = NULL; /* add a copy of region2 tree into region1 tree */ if (region2->tree->path) { GdipClonePath (region2->tree->path, ®ion1->tree->branch2->path); } else { gdip_region_copy_tree (region2->tree, region1->tree->branch2); } return Ok; } GpStatus GdipCombineRegionRegion (GpRegion *region, GpRegion *region2, CombineMode combineMode) { if (!region || !region2) return InvalidParameter; /* special case to deal with copying empty and infinity regions */ /* CombineModeReplace is used by Graphics clipping */ if (combineMode == CombineModeReplace) { GdipSetEmpty (region); gdip_copy_region (region2, region); return Ok; } else if (gdip_is_region_empty (region)) { switch (combineMode) { case CombineModeIntersect: case CombineModeExclude: /* Intersect and Exclude are no-op on an empty region */ return Ok; default: /* for Complement, Union and Xor this is normal processing */ break; } } else if (gdip_is_InfiniteRegion (region)) { /* additional shortcuts are possible if path is empty */ BOOL empty = gdip_is_region_empty (region2); switch (combineMode) { case CombineModeUnion: /* Union with infinity is a no-op (still an infinite region) */ return Ok; case CombineModeComplement: /* Complement of infinity is empty - whatever the path is */ gdip_clear_region (region); region->type = RegionTypeRectF; return Ok; case CombineModeIntersect: /* Intersection with infinity is the path itself (like an Union with Empty) */ gdip_clear_region (region); region->type = RegionTypeRectF; if (empty) return Ok; combineMode = CombineModeUnion; break; case CombineModeExclude: if (empty) return Ok; if ((region2->type == RegionTypePath) && region2->tree && region2->tree->path && gdip_combine_exclude_from_infinite (region, region2->tree->path)) return Ok; break; default: /* Xor must be treated as a "normal" case unless the path is empty */ if (empty) return Ok; } } if (region->type == RegionTypePath) { gdip_region_convert_to_path (region2); return gdip_combine_pathbased_region (region, region2, combineMode); } else if (region2->type == RegionTypePath) { gdip_region_convert_to_path (region); return gdip_combine_pathbased_region (region, region2, combineMode); } /* at this stage we are sure that BOTH region and region2 are rectangle * based, so we can use the old rectangle-based code to combine regions */ switch (combineMode) { case CombineModeExclude: gdip_combine_exclude (region, region2->rects, region2->cnt); break; case CombineModeComplement: gdip_combine_complement (region, region2->rects, region2->cnt); break; case CombineModeIntersect: gdip_combine_intersect (region, region2->rects, region2->cnt); break; case CombineModeUnion: gdip_combine_union (region, region2->rects, region2->cnt); break; case CombineModeXor: gdip_combine_xor (region, region2->rects, region2->cnt); break; default: return NotImplemented; } return Ok; } GpStatus GdipGetRegionBounds (GpRegion *region, GpGraphics *graphics, GpRectF *rect) { if (!region || !graphics || !rect) return InvalidParameter; if (region->type == RegionTypePath) { GpRect bounds; gdip_region_bitmap_ensure (region); if (!region->bitmap) return OutOfMemory; /* base the bounds on the reduced bitmap of the paths */ gdip_region_bitmap_get_smallest_rect (region->bitmap, &bounds); /* small loss of precision when converting the bitmap coord to float */ rect->X = bounds.X; rect->Y = bounds.Y; rect->Width = bounds.Width; rect->Height = bounds.Height; } else { gdip_get_bounds (region->rects , region->cnt, rect); } return Ok; } GpStatus GdipIsEmptyRegion (GpRegion *region, GpGraphics *graphics, BOOL *result) { if (!region || !graphics || !result) return InvalidParameter; *result = gdip_is_region_empty (region); return Ok; } GpStatus GdipIsInfiniteRegion (GpRegion *region, GpGraphics *graphics, BOOL *result) { if (!region || !graphics || !result) return InvalidParameter; *result = gdip_is_InfiniteRegion (region); return Ok; } GpStatus GdipIsVisibleRegionPoint (GpRegion *region, float x, float y, GpGraphics *graphics, BOOL *result) { if (!region || !result) return InvalidParameter; if (region->type == RegionTypePath) { gdip_region_bitmap_ensure (region); g_assert (region->bitmap); *result = gdip_region_bitmap_is_point_visible (region->bitmap, x, y); } else { *result = gdip_is_Point_in_RectFs_Visible (x, y, region->rects, region->cnt); } return Ok; } GpStatus GdipIsVisibleRegionPointI (GpRegion *region, int x, int y, GpGraphics *graphics, BOOL *result) { return GdipIsVisibleRegionPoint (region, x, y, graphics, result); } GpStatus GdipIsVisibleRegionRect (GpRegion *region, float x, float y, float width, float height, GpGraphics *graphics, BOOL *result) { BOOL found = FALSE; if (!region || !result) return InvalidParameter; if (width ==0 || height ==0) { *result = FALSE; return Ok; } if (region->type == RegionTypePath) { GpRect rect; rect.X = x; rect.Y = y; rect.Width = width; rect.Height = height; gdip_region_bitmap_ensure (region); g_assert (region->bitmap); found = gdip_region_bitmap_is_rect_visible (region->bitmap, &rect); } else { float posy, posx; GpRectF recthit; recthit.X = x; recthit.Y = y; recthit.Width = width; recthit.Height = height; /* Any point of intersection ?*/ for (posy = 0; posy < recthit.Height && found == FALSE; posy++) { for (posx = 0; posx < recthit.Width ; posx++) { if (gdip_is_Point_in_RectFs_Visible (recthit.X + posx , recthit.Y + posy, region->rects, region->cnt) == TRUE) { found = TRUE; break; } } } } *result = found; return Ok; } GpStatus GdipIsVisibleRegionRectI (GpRegion *region, int x, int y, int width, int height, GpGraphics *graphics, BOOL *result) { return GdipIsVisibleRegionRect (region, x, y, width, height, graphics, result); } GpStatus GdipGetRegionScansCount (GpRegion *region, int* count, GpMatrix* matrix) { GpRegion *work = NULL; GpStatus status; if (!region || !count) return InvalidParameter; /* apply any user supplied matrix transformation */ if (!gdip_is_matrix_empty (matrix)) { int i; /* the matrix doesn't affect the original region - only the result */ status = GdipCloneRegion (region, &work); if (status != Ok) { if (work) GdipDeleteRegion (work); return status; } /* if required convert into a path-based region */ if (work->type != RegionTypePath) gdip_region_convert_to_path (work); /* transform all the paths */ status = gdip_region_transform_tree (work->tree, matrix); if (status != Ok) { GdipDeleteRegion (work); return status; } /* note: any existing bitmap has been invalidated */ gdip_region_bitmap_invalidate (work); } else { work = region; } if (work->type == RegionTypePath) { /* ensure the bitmap is usable */ gdip_region_bitmap_ensure (work); /* check if region is too large to render */ if (work->bitmap) *count = gdip_region_bitmap_get_scans (work->bitmap, NULL, -1); else *count = 0; } else { *count = work->cnt; } /* delete the clone */ if (work != region) GdipDeleteRegion (work); return Ok; } GpStatus GdipGetRegionScans (GpRegion *region, GpRectF* rects, int* count, GpMatrix* matrix) { GpRegion *work = NULL; GpStatus status; if (!region || !rects|| !count) return InvalidParameter; /* apply any user supplied matrix transformation */ if (!gdip_is_matrix_empty (matrix)) { int i; /* the matrix doesn't affect the original region - only the result */ status = GdipCloneRegion (region, &work); if (status != Ok) { if (work) GdipDeleteRegion (work); return status; } /* if required convert into a path-based region */ if (work->type != RegionTypePath) gdip_region_convert_to_path (work); /* transform all the paths */ status = gdip_region_transform_tree (work->tree, matrix); if (status != Ok) { GdipDeleteRegion (work); return status; } /* note: any existing bitmap has been invalidated */ gdip_region_bitmap_invalidate (work); } else { work = region; } if (region->type == RegionTypePath) { /* ensure the bitmap is usable */ gdip_region_bitmap_ensure (work); /* check if region is too large to render */ if (work->bitmap) *count = gdip_region_bitmap_get_scans (work->bitmap, rects, *count); else *count = 0; } else { memcpy (rects, work->rects, sizeof (GpRectF) * *count); *count = work->cnt; } /* delete the clone */ if (work != region) GdipDeleteRegion (work); return Ok; } GpStatus GdipIsEqualRegion (GpRegion *region, GpRegion *region2, GpGraphics *graphics, BOOL *result) { int i; GpRectF *rectsrc, *recttrg; if (!region || !region2 || !graphics || !result) return InvalidParameter; /* quick case: same pointer == same region == equals */ if (region == region2) { *result = TRUE; return Ok; } if ((region->type == RegionTypePath) || (region2->type == RegionTypePath)) { /* if required convert one region to a path based region */ if (region->type != RegionTypePath) gdip_region_convert_to_path (region); gdip_region_bitmap_ensure (region); g_assert (region->bitmap); if (region2->type != RegionTypePath) gdip_region_convert_to_path (region2); gdip_region_bitmap_ensure (region2); g_assert (region2->bitmap); *result = gdip_region_bitmap_compare (region->bitmap, region2->bitmap); return Ok; } /* rectangular-based region quality test */ if (region->cnt != region2->cnt) { *result = FALSE; return Ok; } for (i = 0, rectsrc = region->rects, recttrg = region2->rects; i < region->cnt; i++, rectsrc++, recttrg++) { if (rectsrc->X != recttrg->X || rectsrc->Y != recttrg->Y || rectsrc->Width != recttrg->Width || rectsrc->Height != recttrg->Height) { *result = FALSE; return Ok; } } *result = TRUE; return Ok; } GpStatus GdipTranslateRegion (GpRegion *region, float dx, float dy) { if (!region) return InvalidParameter; /* can't transforman infinite region to anything else than an infinite region * (even if you scale it by half it's still infinite ;-) see unit tests */ if (gdip_is_InfiniteRegion (region)) return Ok; if (region->type == RegionTypePath) { gdip_region_translate_tree (region->tree, dx, dy); /* any existing bitmap is still valid _if_ we update it's origin */ if (region->bitmap) { region->bitmap->X += dx; region->bitmap->Y += dy; } } else if ((region->type == RegionTypeRectF) && region->rects) { int i; GpRectF *rect; for (i = 0, rect = region->rects ; i < region->cnt; i++, rect++) { rect->X += dx; rect->Y += dy; } } return Ok; } GpStatus GdipTranslateRegionI (GpRegion *region, int dx, int dy) { return GdipTranslateRegion (region, dx, dy); } /* this call doesn't exists in GDI+ */ static GpStatus ScaleRegion (GpRegion *region, float sx, float sy) { if (!region) return InvalidParameter; if ((region->type == RegionTypeRectF) && region->rects) { int i; GpRectF *rect; for (i = 0, rect = region->rects ; i < region->cnt; i++, rect++) { rect->X *= sx; rect->Y *= sy; rect->Width *= sx; rect->Height *= sy; } } return Ok; } GpStatus GdipTransformRegion (GpRegion *region, GpMatrix *matrix) { GpStatus status = Ok; if (!region || !matrix) return InvalidParameter; /* no transformation to do on an empty region */ if ((region->cnt == 0) && (region->type == RegionTypeRectF)) return Ok; /* don't (possibly) convert to a bitmap if the matrix is empty (a no-op) */ if (gdip_is_matrix_empty (matrix)) return Ok; /* can't transforman infinite region to anything else than an infinite region * (even if you scale it by half it's still infinite ;-) see unit tests */ if (gdip_is_InfiniteRegion (region)) return Ok; /* try to avoid heavy stuff (e.g. conversion to path, invalidating * bitmap...) if the transform is: * - a translation + scale operations (for rectangle ebased region) * - only to do a scale operation (for a rectangle based region) * - only to do a simple translation (for both rectangular and bitmap based regions) */ if ((matrix->xy == 0.0f) && (matrix->yx == 0.0f)) { BOOL s = (((matrix->xx != 1.0f) || (matrix->yy != 1.0f)) && (region->type == RegionTypeRectF)); BOOL t = ((matrix->x0 != 0.0f) || (matrix->yx != 0.0f)); if (s) { status = ScaleRegion (region, gdip_matrix_get_x_scale (matrix), gdip_matrix_get_y_scale (matrix)); } if (t && (status == Ok)) { status = GdipTranslateRegion (region, gdip_matrix_get_x_translation (matrix), gdip_matrix_get_y_translation (matrix)); } /* return now if we could optimize the transform (to avoid bitmaps) */ if (t || s) return status; } /* most matrix operations would change the rectangles into path so we always preempt this */ if (region->type != RegionTypePath) gdip_region_convert_to_path (region); /* apply the same transformation matrix to all paths */ status = gdip_region_transform_tree (region->tree, matrix); /* invalidate the bitmap so it will get re-created on the next gdip_region_bitmap_ensure call */ gdip_region_bitmap_invalidate (region); return status; } // coverity[+alloc : arg-*1] GpStatus GdipCreateRegionPath (GpPath *path, GpRegion **region) { if (!region || !path) return InvalidParameter; return gdip_createRegion (region, RegionTypePath, (void*) path); } /* * The internal data representation for RegionData depends on the type of region. * * Type 0 (RegionTypeEmpty) * Note: There is no type 0. RegionTypeEmpty are converted into * RegionTypeRectF (type 2) when a region is created. * * Type 1 (RegionTypeRect) * Note: There is no type 1. RegionTypeRect are converted into * RegionTypeRectF (type 2) when a region is created. * * Type 2 (RegionTypeRectF), variable size * guint32 RegionType Always 2 * guint32 Count 0-2^32 * GpRectF[Count] Points * * Type 3 (RegionTypePath), variable size * guint32 RegionType Always 3 * GpPathTree tree * * where GpPathTree is * guint32 Tag 1 = Path, 2 = Tree * data[n] * * where data is for tag 1 (Path) * guint32 Count 0-2^32 * GpFillMode FillMode * guint8[Count] Types * GpPointF[Count] Points * or * where data is for tag 2 (Tree) * guint32 Operation see CombineMode * guint32 Size1 0-2^32 * byte[Size1] branch #1 * guint32 Size2 0-2^32 * byte[Size2] branch #2 */ GpStatus GdipGetRegionDataSize (GpRegion *region, UINT *bufferSize) { if (!region || !bufferSize) return InvalidParameter; switch (region->type) { case RegionTypeRectF: *bufferSize = (sizeof (guint32) * 2) + (region->cnt * sizeof (GpRectF)); break; case RegionTypePath: /* regiontype, tree */ *bufferSize = sizeof (guint32) + gdip_region_get_tree_size (region->tree); break; default: g_warning ("unknown type %d", region->type); return NotImplemented; } return Ok; } GpStatus GdipGetRegionData (GpRegion *region, BYTE *buffer, UINT bufferSize, UINT *sizeFilled) { GpStatus status; UINT size; int len; if (!region || !buffer || !sizeFilled) return InvalidParameter; status = GdipGetRegionDataSize (region, &size); if (status != Ok) return status; if (size > bufferSize) return InsufficientBuffer; /* type of region */ len = sizeof (guint32); memcpy (buffer, ®ion->type, len); buffer += len; *sizeFilled += len; switch (region->type) { case RegionTypeRectF: /* count (# rectangles) */ memcpy (buffer, ®ion->cnt, len); buffer += len; *sizeFilled += len; /* rectangles */ len = sizeof (GpRectF) * (region->cnt); memcpy (buffer, region->rects, len); *sizeFilled += len; break; case RegionTypePath: bufferSize -= len; if (!gdip_region_serialize_tree (region->tree, buffer, bufferSize, sizeFilled)) return InsufficientBuffer; break; default: g_warning ("unknown type %d", region->type); return NotImplemented; } return Ok; } GpStatus GdipGetRegionHRgn (GpRegion *region, GpGraphics *graphics, HRGN *hRgn) { if (!region || !graphics || !hRgn) return InvalidParameter; /* infinite region returns NULL */ if (gdip_is_InfiniteRegion (region)) { *hRgn = NULL; return Ok; } /* calling GdipGetRegionHRgn multiple times returns a different HRNG value (i.e. each to be freed separately) */ return GdipCloneRegion (region, (GpRegion**)hRgn); } // coverity[+alloc : arg-*1] GpStatus GdipCreateRegionHrgn (HRGN hRgn, GpRegion **region) { if (!hRgn || !region) return InvalidParameter; return GdipCloneRegion ((GpRegion*) hRgn, region); } libgdiplus-2.11/src/matrix-private.h0000664000175000017500000000461212225470167014443 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __MATRIX_PRIVATE_H__ #define __MATRIX_PRIVATE_H__ #include "gdiplus-private.h" typedef cairo_matrix_t GpMatrix; #define gdip_matrix_get_x_translation(matrix) (matrix->x0) #define gdip_matrix_get_y_translation(matrix) (matrix->y0) #define gdip_matrix_get_x_scale(matrix) (matrix->xx) #define gdip_matrix_get_y_scale(matrix) (matrix->yy) #define gdip_matrix_reverse_order(order) ((order == MatrixOrderPrepend) ? MatrixOrderAppend : MatrixOrderPrepend) #define gdip_cairo_matrix_copy(m1,m2) memcpy (m1, m2, sizeof (cairo_matrix_t)) BOOL gdip_is_matrix_a_translation (GpMatrix *matrix) GDIP_INTERNAL; BOOL gdip_is_matrix_empty (GpMatrix* matrix) GDIP_INTERNAL; GpStatus gdip_matrix_init_from_rect_3points (GpMatrix *matrix, const GpRectF *rect, const GpPointF *dstplg) GDIP_INTERNAL; #include "matrix.h" #endif libgdiplus-2.11/src/alpha-premul-table.inc0000664000175000017500000121014712225470167015470 00000000000000/* precomputed table for alpha*value divised by 255 */ const BYTE pre_multiplied_table[256][256] = { /* 000 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* 001 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, /* 002 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2 }, /* 003 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3 }, /* 004 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4 }, /* 005 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5 }, /* 006 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6 }, /* 007 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7 }, /* 008 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8 }, /* 009 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9 }, /* 010 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10 }, /* 011 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11 }, /* 012 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12 }, /* 013 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13 }, /* 014 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14 }, /* 015 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15 }, /* 016 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16 }, /* 017 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17 }, /* 018 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18 }, /* 019 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19 }, /* 020 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20 }, /* 021 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21 }, /* 022 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22 }, /* 023 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23 }, /* 024 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24 }, /* 025 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25 }, /* 026 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26 }, /* 027 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27 }, /* 028 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28 }, /* 029 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29 }, /* 030 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30 }, /* 031 */ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31 }, /* 032 */ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32 }, /* 033 */ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33 }, /* 034 */ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34 }, /* 035 */ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35 }, /* 036 */ { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 36 }, /* 037 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37 }, /* 038 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38 }, /* 039 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39 }, /* 040 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40 }, /* 041 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41 }, /* 042 */ { 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42 }, /* 043 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43 }, /* 044 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44 }, /* 045 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45 }, /* 046 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46 }, /* 047 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47 }, /* 048 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48 }, /* 049 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49 }, /* 050 */ { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50 }, /* 051 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51 }, /* 052 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 52 }, /* 053 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 53 }, /* 054 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54 }, /* 055 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55 }, /* 056 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56 }, /* 057 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57 }, /* 058 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58 }, /* 059 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59 }, /* 060 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60 }, /* 061 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61 }, /* 062 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62 }, /* 063 */ { 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63 }, /* 064 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64 }, /* 065 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 65 }, /* 066 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66 }, /* 067 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67 }, /* 068 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 68 }, /* 069 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69 }, /* 070 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 70 }, /* 071 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 71 }, /* 072 */ { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72 }, /* 073 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 68, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73 }, /* 074 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 71, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74 }, /* 075 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75 }, /* 076 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76 }, /* 077 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77 }, /* 078 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78 }, /* 079 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79 }, /* 080 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80 }, /* 081 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81 }, /* 082 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82 }, /* 083 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83 }, /* 084 */ { 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84 }, /* 085 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85 }, /* 086 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 86 }, /* 087 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 87 }, /* 088 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 88 }, /* 089 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 89 }, /* 090 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 90 }, /* 091 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 91 }, /* 092 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 92 }, /* 093 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 91, 92, 92, 93 }, /* 094 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 75, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 94 }, /* 095 */ { 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 95 }, /* 096 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 45, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 80, 81, 81, 82, 82, 82, 83, 83, 83, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96 }, /* 097 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 63, 64, 64, 65, 65, 65, 66, 66, 66, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97 }, /* 098 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98 }, /* 099 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99 }, /* 100 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100 }, /* 101 */ { 0, 0, 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101 }, /* 102 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102 }, /* 103 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103 }, /* 104 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104 }, /* 105 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 102, 103, 103, 104, 104, 105 }, /* 106 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 51, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 103, 104, 104, 105, 105, 106 }, /* 107 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107 }, /* 108 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 52, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 102, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108 }, /* 109 */ { 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 103, 104, 104, 105, 105, 106, 106, 106, 107, 107, 108, 108, 109 }, /* 110 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 103, 104, 104, 105, 105, 106, 106, 106, 107, 107, 108, 108, 109, 109, 110 }, /* 111 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107, 107, 107, 108, 108, 109, 109, 110, 110, 111 }, /* 112 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 108, 109, 109, 110, 110, 111, 111, 112 }, /* 113 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 111, 112, 112, 113 }, /* 114 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114 }, /* 115 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115 }, /* 116 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116 }, /* 117 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117 }, /* 118 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118 }, /* 119 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119 }, /* 120 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120 }, /* 121 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121 }, /* 122 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122 }, /* 123 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123 }, /* 124 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124 }, /* 125 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125 }, /* 126 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126 }, /* 127 */ { 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127 }, /* 128 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 128 }, /* 129 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 129 }, /* 130 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 130 }, /* 131 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 131 }, /* 132 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 132 }, /* 133 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 133 }, /* 134 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 134 }, /* 135 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 135 }, /* 136 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 136 }, /* 137 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 135, 136, 137 }, /* 138 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 106, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 117, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 134, 135, 135, 136, 136, 137, 138 }, /* 139 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 83, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 139 }, /* 140 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 45, 46, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 122, 123, 124, 124, 125, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 137, 138, 138, 139, 140 }, /* 141 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 124, 125, 126, 126, 127, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 138, 139, 139, 140, 141 }, /* 142 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 43, 44, 45, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 64, 64, 65, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 86, 87, 87, 88, 89, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 98, 98, 99, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 110, 111, 111, 112, 113, 113, 114, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 126, 126, 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, 133, 133, 134, 134, 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, 140, 141, 142 }, /* 143 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 109, 110, 111, 111, 112, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 132, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, 143 }, /* 144 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 49, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 90, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 142, 143, 144 }, /* 145 */ { 0, 0, 1, 1, 2, 2, 3, 3, 4, 5, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 46, 46, 47, 47, 48, 48, 49, 50, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, 69, 69, 70, 71, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 90, 91, 92, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 131, 132, 133, 133, 134, 134, 135, 135, 136, 137, 137, 138, 138, 139, 139, 140, 141, 141, 142, 142, 143, 143, 144, 145 }, /* 146 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 46, 47, 48, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 64, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 93, 94, 95, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 109, 110, 111, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 117, 118, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146 }, /* 147 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 29, 30, 31, 31, 32, 32, 33, 34, 34, 35, 35, 36, 36, 37, 38, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 93, 94, 95, 95, 96, 96, 97, 98, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 104, 105, 106, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147 }, /* 148 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 98, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 132, 133, 134, 134, 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, 141, 141, 142, 142, 143, 143, 144, 145, 145, 146, 146, 147, 148 }, /* 149 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 44, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 75, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 96, 97, 98, 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 120, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 147, 148, 149 }, /* 150 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 62, 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 122, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 148, 149, 150 }, /* 151 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 45, 45, 46, 46, 47, 47, 48, 49, 49, 50, 50, 51, 52, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 60, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 76, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 119, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 142, 142, 143, 143, 144, 145, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151 }, /* 152 */ { 0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 98, 99, 100, 100, 101, 101, 102, 103, 103, 104, 104, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 147, 148, 149, 149, 150, 150, 151, 152 }, /* 153 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 78, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 135, 135, 136, 136, 137, 138, 138, 139, 139, 140, 141, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 148, 149, 150, 150, 151, 151, 152, 153 }, /* 154 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 51, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 76, 76, 77, 77, 78, 79, 79, 80, 80, 81, 82, 82, 83, 83, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 126, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 147, 148, 149, 149, 150, 150, 151, 152, 152, 153, 154 }, /* 155 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 63, 64, 65, 65, 66, 66, 67, 68, 68, 69, 69, 70, 71, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 80, 81, 82, 82, 83, 83, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 103, 104, 105, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 114, 115, 116, 116, 117, 117, 118, 119, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 125, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 133, 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 148, 149, 150, 150, 151, 151, 152, 153, 153, 154, 155 }, /* 156 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, 78, 78, 79, 80, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 116, 117, 118, 118, 119, 119, 120, 121, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 138, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 152, 153, 154, 154, 155, 156 }, /* 157 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 41, 42, 43, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 65, 66, 67, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 73, 74, 75, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 81, 82, 83, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 108, 109, 110, 110, 111, 112, 112, 113, 113, 114, 115, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 129, 130, 131, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 137, 138, 139, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 153, 154, 155, 155, 156, 157 }, /* 158 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 40, 41, 42, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 58, 59, 60, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 71, 72, 73, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 84, 85, 86, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 110, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 123, 124, 125, 125, 126, 127, 127, 128, 128, 129, 130, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 154, 155, 156, 156, 157, 158 }, /* 159 */ { 0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 107, 108, 109, 109, 110, 110, 111, 112, 112, 113, 114, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 125, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 159 }, /* 160 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 112, 113, 114, 114, 115, 116, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160 }, /* 161 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 114, 115, 116, 116, 117, 118, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161 }, /* 162 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 127, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 155, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162 }, /* 163 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163 }, /* 164 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164 }, /* 165 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165 }, /* 166 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166 }, /* 167 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 127, 127, 128, 129, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167 }, /* 168 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 112, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 166, 167, 168 }, /* 169 */ { 0, 0, 1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 112, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 119, 120, 121, 121, 122, 123, 123, 124, 125, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 167, 168, 169 }, /* 170 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 112, 112, 113, 114, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 166, 167, 168, 168, 169, 170 }, /* 171 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 166, 167, 168, 168, 169, 170, 171 }, /* 172 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 167, 168, 169, 169, 170, 171, 172 }, /* 173 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 130, 131, 132, 132, 133, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 166, 167, 168, 168, 169, 170, 170, 171, 172, 173 }, /* 174 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 42, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 103, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 116, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 139, 139, 140, 141, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 167, 168, 169, 169, 170, 171, 171, 172, 173, 174 }, /* 175 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 153, 153, 154, 155, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 166, 167, 168, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175 }, /* 176 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 86, 87, 88, 89, 89, 90, 91, 91, 92, 93, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 109, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 144, 145, 146, 147, 147, 148, 149, 149, 150, 151, 151, 152, 153, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176 }, /* 177 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 22, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 45, 46, 47, 47, 48, 49, 49, 50, 51, 52, 52, 53, 54, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 70, 71, 72, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 79, 80, 81, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 95, 96, 97, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 138, 139, 140, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 163, 164, 165, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 172, 173, 174, 174, 175, 176, 177 }, /* 178 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 32, 33, 34, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 69, 70, 71, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 85, 86, 87, 87, 88, 89, 90, 90, 91, 92, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 106, 107, 108, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 141, 141, 142, 143, 143, 144, 145, 145, 146, 147, 147, 148, 149, 150, 150, 151, 152, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 175, 176, 177, 178 }, /* 179 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 136, 137, 138, 138, 139, 140, 141, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 148, 149, 150, 150, 151, 152, 153, 153, 154, 155, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 176, 177, 178, 179 }, /* 180 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 98, 99, 100, 100, 101, 102, 103, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 141, 142, 143, 144, 144, 145, 146, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 153, 154, 155, 156, 156, 157, 158, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 180 }, /* 181 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46, 47, 48, 48, 49, 50, 51, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 107, 108, 109, 110, 110, 111, 112, 112, 113, 114, 114, 115, 116, 117, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 141, 142, 143, 144, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 151, 152, 153, 154, 154, 155, 156, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181 }, /* 182 */ { 0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 49, 50, 51, 52, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 79, 80, 81, 82, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 109, 110, 111, 112, 112, 113, 114, 114, 115, 116, 117, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 144, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 179, 180, 181, 182 }, /* 183 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 50, 51, 52, 53, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 106, 107, 108, 109, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 144, 145, 146, 147, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182, 183 }, /* 184 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 75, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 103, 104, 105, 106, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 147, 148, 149, 150, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184 }, /* 185 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 103, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 113, 114, 115, 116, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 150, 151, 152, 153, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 169, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185 }, /* 186 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 72, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 107, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 150, 151, 152, 153, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182, 183, 183, 184, 185, 186 }, /* 187 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 79, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 110, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 187 }, /* 188 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 72, 73, 74, 75, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 86, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 103, 104, 105, 106, 106, 107, 108, 109, 109, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 188 }, /* 189 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 103, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 148, 149, 150, 151, 151, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182, 183, 183, 184, 185, 186, 186, 187, 188, 189 }, /* 190 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 125, 125, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 154, 155, 156, 157, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 187, 187, 188, 189, 190 }, /* 191 */ { 0, 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 125, 125, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 188, 188, 189, 190, 191 }, /* 192 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 103, 103, 104, 105, 106, 106, 107, 108, 109, 109, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 127, 128, 128, 129, 130, 131, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 188, 188, 189, 190, 191, 192 }, /* 193 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 52, 52, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 77, 78, 79, 80, 80, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 130, 130, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 139, 140, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 158, 158, 159, 160, 161, 161, 162, 163, 164, 164, 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182, 183, 183, 184, 185, 186, 186, 187, 188, 189, 189, 190, 191, 192, 193 }, /* 194 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 82, 82, 83, 84, 85, 85, 86, 87, 88, 89, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 104, 104, 105, 106, 107, 108, 108, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 130, 130, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 168, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 187, 187, 188, 189, 190, 190, 191, 192, 193, 194 }, /* 195 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 64, 65, 65, 66, 67, 68, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 87, 87, 88, 89, 90, 91, 91, 92, 93, 94, 94, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 123, 123, 124, 125, 126, 126, 127, 128, 129, 130, 130, 131, 132, 133, 133, 134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 142, 143, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 165, 166, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 175, 175, 176, 177, 178, 178, 179, 180, 181, 182, 182, 183, 184, 185, 185, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 194, 195 }, /* 196 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 19, 19, 20, 21, 22, 23, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 33, 33, 34, 35, 36, 36, 37, 38, 39, 39, 40, 41, 42, 43, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 59, 59, 60, 61, 62, 63, 63, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 89, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 106, 106, 107, 108, 109, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 125, 126, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 135, 136, 136, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 162, 163, 164, 165, 166, 166, 167, 168, 169, 169, 170, 171, 172, 172, 173, 174, 175, 176, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 186, 186, 187, 188, 189, 189, 190, 191, 192, 192, 193, 194, 195, 196 }, /* 197 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 23, 24, 25, 26, 27, 27, 28, 29, 30, 30, 31, 32, 33, 33, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, 56, 57, 57, 58, 59, 60, 61, 61, 62, 63, 64, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 84, 85, 86, 87, 88, 88, 89, 90, 91, 91, 92, 93, 94, 95, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 104, 105, 105, 106, 107, 108, 108, 109, 110, 111, 112, 112, 113, 114, 115, 115, 116, 117, 118, 118, 119, 120, 121, 122, 122, 123, 124, 125, 125, 126, 127, 128, 129, 129, 130, 131, 132, 132, 133, 134, 135, 135, 136, 137, 138, 139, 139, 140, 141, 142, 142, 143, 144, 145, 146, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 169, 169, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 179, 180, 180, 181, 182, 183, 183, 184, 185, 186, 186, 187, 188, 189, 190, 190, 191, 192, 193, 193, 194, 195, 196, 197 }, /* 198 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 10, 10, 11, 12, 13, 13, 14, 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33, 34, 34, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 48, 49, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 59, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 75, 76, 76, 77, 78, 79, 79, 80, 81, 82, 83, 83, 84, 85, 86, 86, 87, 88, 89, 90, 90, 91, 92, 93, 93, 94, 95, 96, 97, 97, 98, 99, 100, 100, 101, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 110, 111, 111, 112, 113, 114, 114, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 125, 125, 126, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 135, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 166, 167, 168, 169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 177, 177, 178, 179, 180, 180, 181, 182, 183, 184, 184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 194, 194, 195, 196, 197, 198 }, /* 199 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 14, 15, 16, 17, 17, 18, 19, 20, 21, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 56, 57, 58, 59, 60, 60, 61, 62, 63, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 93, 94, 95, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 103, 104, 105, 106, 106, 107, 108, 109, 110, 110, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 119, 120, 120, 121, 122, 123, 124, 124, 125, 126, 127, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 145, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 174, 174, 175, 176, 177, 177, 178, 179, 180, 181, 181, 182, 183, 184, 184, 185, 186, 187, 188, 188, 189, 190, 191, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199 }, /* 200 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 58, 59, 60, 61, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 69, 70, 71, 72, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 87, 87, 88, 89, 90, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 98, 99, 100, 101, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 120, 121, 122, 123, 123, 124, 125, 126, 127, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 140, 141, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 178, 179, 180, 181, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200 }, /* 201 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 12, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 52, 53, 54, 55, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 63, 64, 65, 66, 67, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 93, 94, 95, 96, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 104, 105, 106, 107, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 121, 122, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 145, 146, 147, 148, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 186, 187, 188, 189, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201 }, /* 202 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 80, 81, 82, 83, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 99, 100, 101, 102, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 118, 119, 120, 121, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 179, 180, 181, 182, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202 }, /* 203 */ { 0, 0, 1, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 78, 79, 80, 81, 81, 82, 83, 84, 85, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 121, 122, 123, 124, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 179, 180, 181, 182, 183, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203 }, /* 204 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204 }, /* 205 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 139, 140, 141, 142, 143, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205 }, /* 206 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 63, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206 }, /* 207 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207 }, /* 208 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208 }, /* 209 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209 }, /* 210 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 210 }, /* 211 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 139, 140, 141, 142, 143, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211 }, /* 212 */ { 0, 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212 }, /* 213 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212, 213 }, /* 214 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214 }, /* 215 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 139, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215 }, /* 216 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216 }, /* 217 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 85, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 102, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 204, 205, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217 }, /* 218 */ { 0, 0, 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 153, 154, 155, 156, 157, 158, 159, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218 }, /* 219 */ { 0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 85, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 139, 140, 141, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, 219 }, /* 220 */ { 0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212, 213, 213, 214, 215, 216, 217, 218, 219, 220 }, /* 221 */ { 0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 71, 71, 72, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 214, 215, 216, 217, 218, 219, 220, 221 }, /* 222 */ { 0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 53, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 215, 215, 216, 217, 218, 219, 220, 221, 222 }, /* 223 */ { 0, 0, 1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 139, 139, 140, 141, 142, 143, 144, 145, 146, 146, 147, 148, 149, 150, 151, 152, 153, 153, 154, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 221, 222, 223 }, /* 224 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 124, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 172, 173, 173, 174, 175, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 221, 222, 223, 224 }, /* 225 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 141, 142, 142, 143, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 156, 157, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 193, 194, 195, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 217, 218, 219, 220, 221, 222, 223, 224, 225 }, /* 226 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 83, 84, 85, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 179, 180, 181, 182, 183, 184, 185, 186, 187, 187, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 224, 225, 226 }, /* 227 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 113, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 145, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 168, 169, 170, 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227 }, /* 228 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 135, 136, 137, 138, 139, 140, 141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228 }, /* 229 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 132, 133, 134, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229 }, /* 230 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230 }, /* 231 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231 }, /* 232 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232 }, /* 233 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233 }, /* 234 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234 }, /* 235 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235 }, /* 236 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236 }, /* 237 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237 }, /* 238 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238 }, /* 239 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 }, /* 240 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240 }, /* 241 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241 }, /* 242 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242 }, /* 243 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243 }, /* 244 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244 }, /* 245 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245 }, /* 246 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246 }, /* 247 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247 }, /* 248 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248 }, /* 249 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249 }, /* 250 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250 }, /* 251 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251 }, /* 252 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252 }, /* 253 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253 }, /* 254 */ { 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254 }, /* 255 */ { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255 } }; libgdiplus-2.11/src/text-metafile.c0000664000175000017500000000310112225470167014222 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "text-metafile-private.h" /* * NOTE: all parameter's validations are done inside text.c */ /* * http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/DrawString.html */ GpStatus metafile_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) { /* TODO */ return Ok; } libgdiplus-2.11/src/general.c0000664000175000017500000003644412225470167013107 00000000000000/* * general.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2006, 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine(pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #include "general-private.h" #include "codecs-private.h" #include "graphics-private.h" #include "font-private.h" #include "carbon-private.h" /* large table to avoid a division and three multiplications when premultiplying alpha into R, G and B */ #include "alpha-premul-table.inc" static BOOL startup = FALSE; GpStatus GdiplusStartup (ULONG_PTR *token, const GdiplusStartupInput *input, GdiplusStartupOutput *output) { GpStatus status = Ok; /* don't initialize multiple time, e.g. for each appdomain */ if (!startup) { startup = TRUE; status = initCodecList (); if (status != Ok) return status; FcInit (); *token = 1; gdip_get_display_dpi(); } return status; } void GdiplusShutdown (ULONG_PTR token) { if (startup) { releaseCodecList (); gdip_font_clear_pattern_cache (); #if HAVE_FCFINI FcFini (); #endif startup = FALSE; /* in case we want to restart it */ } } /* Memory */ void * GdipAlloc (size_t size) { return malloc (size); } void * gdip_calloc (size_t nelem, size_t elsize) { return calloc (nelem, elsize); } void * gdip_realloc (void *org, int size) { return realloc (org, size); } void GdipFree (void *ptr) { free (ptr); } /* Helpers */ GpStatus gdip_get_status (cairo_status_t status) { if (status == CAIRO_STATUS_SUCCESS) return Ok; else { switch (status) { case CAIRO_STATUS_NO_MEMORY: return OutOfMemory; case CAIRO_STATUS_INVALID_MATRIX: case CAIRO_STATUS_INVALID_RESTORE: case CAIRO_STATUS_INVALID_POP_GROUP: return InvalidParameter; case CAIRO_STATUS_NO_CURRENT_POINT: return WrongState; default: return GenericError; } } } float gdip_get_display_dpi () { static float dpis = 0; Display* display; if (dpis == 0) { #if __APPLE__ float h_dpi, v_dpi; gdip_get_display_dpi_carbon (&h_dpi, &v_dpi); dpis = h_dpi; return dpis; #else char *val; display = XOpenDisplay (0); /* If the display is openable lets try to read dpi from it; otherwise use a default of 96.0f */ if (display) { val = XGetDefault (display, "Xft", "dpi"); if (val) { dpis = atof (val); } else { dpis = 96.0f; } XCloseDisplay (display); } else { dpis = 96.0f; } #endif } return dpis; } /* Curve handling * * See Richard Rasala, Explicit Cubic Spline Interpolation Formulas, in * Andrew S. Glassner, Graphics Gems, Academic Press, 1990, 579-584. * * and the Tangent class in JPT (http://www.ccs.neu.edu/jpt/jpt_2_3/index.htm) * */ GpPointF * convert_points (const GpPoint *point, int count) { int i; GpPointF *retval = (GpPointF *) GdipAlloc (sizeof (GpPointF) * count); if (!retval) return NULL; for (i = 0; i < count; i++) { retval [i].X = (float) point [i].X; retval [i].Y = (float) point [i].Y; } return retval; } GpPointF * gdip_open_curve_tangents (int terms, const GpPointF *points, int count, float tension) { float coefficient = tension / 3.0; int i; GpPointF *tangents = (GpPointF *) GdipAlloc (sizeof (GpPointF) * count); if (!tangents) return NULL; /* initialize everything to zero to begin with */ for (i = 0; i < count; i++) { tangents [i].X = 0; tangents [i].Y = 0; } if (count <= 2) return tangents; for (i = 0; i < count; i++) { int r = i + 1; int s = i - 1; if (r >= count) r = count - 1; if (s < 0) s = 0; tangents [i].X += (coefficient * (points [r].X - points [s].X)); tangents [i].Y += (coefficient * (points [r].Y - points [s].Y)); } return tangents; } GpPointF * gdip_closed_curve_tangents (int terms, const GpPointF *points, int count, float tension) { float coefficient = tension / 3.0; int i; GpPointF *tangents = (GpPointF *) GdipAlloc (sizeof (GpPointF) * count); if (!tangents) return NULL; /* initialize everything to zero to begin with */ for (i = 0; i < count; i++) { tangents [i].X = 0; tangents [i].Y = 0; } if (count <= 2) return tangents; for (i = 0; i < count; i++) { int r = i + 1; int s = i - 1; if (r >= count) r -= count; if (s < 0) s += count; tangents [i].X += (coefficient * (points [r].X - points [s].X)); tangents [i].Y += (coefficient * (points [r].Y - points [s].Y)); } return tangents; } /* re-enabled if/when required */ #if FALSE /* this function comes from fcmp.sf.net */ int fcmp (double x1, double x2, double epsilon) { int exponent; double delta; double difference; /* Get exponent(max(fabs(x1), fabs(x2))) and store it in exponent. */ /* If neither x1 nor x2 is 0, */ /* this is equivalent to max(exponent(x1), exponent(x2)). */ /* If either x1 or x2 is 0, its exponent returned by frexp would be 0, */ /* which is much larger than the exponents of numbers close to 0 in */ /* magnitude. But the exponent of 0 should be less than any number */ /* whose magnitude is greater than 0. */ /* So we only want to set exponent to 0 if both x1 and */ /* x2 are 0. Hence, the following works for all x1 and x2. */ frexp (fabs (x1) > fabs (x2) ? x1 : x2, &exponent); /* Do the comparison. */ /* delta = epsilon * pow(2, exponent) */ /* Form a neighborhood around x2 of size delta in either direction. */ /* If x1 is within this delta neighborhood of x2, x1 == x2. */ /* Otherwise x1 > x2 or x1 < x2, depending on which side of */ /* the neighborhood x1 is on. */ delta = ldexp (epsilon, exponent); difference = x1 - x2; if (difference > delta) return 1; /* x1 > x2 */ else if (difference < -delta) return -1; /* x1 < x2 */ else /* -delta <= difference <= delta */ return 0; /* x1 == x2 */ } #endif /* note: round[f] is C99 */ int iround (float d) { double int_part = floor (d); return ((d - int_part) >= 0.5) ? int_part + 1.0 : int_part; } /* This function is used by gradient brushes for calculating the erf required for * calculating the integral of the normal distribution equation. */ float gdip_erf (float x, float std, float mean) { /* std refers to standard deviation * * ERF: http://mathworld.wolfram.com/Erf.html * * erf (z) = (2 / sqrt (pi)) * infinite sum of [(pow (-1, n) * pow (z, 2n+1))/(n! * (2n+1))] * using Maclaurin series. */ float series; float constant = 2.0 / sqrt (PI); float z = (x - mean) / std; z /= sqrt (2.0); series = (z - pow (z, 3) / 3.0 + pow (z, 5) / 10.0 - pow (z, 7) / 42.0 + pow (z, 9) / 216.0 - pow (z, 11) / 1420.0); return constant * series; } /* convert a ucs2 string to utf8 length = number of characters to convert, -1 to indicate the whole string */ gchar * ucs2_to_utf8(const gunichar2 *ucs2, int length) { const gunichar2 *ptr; const gunichar2 *end; gunichar *dest; gunichar *uni; gchar *utf8; /* Count length */ if (length == -1) { ptr = ucs2; length = 0; while (*ptr != 0) { ptr++; length++; } } uni = GdipAlloc((length + 1) * sizeof(gunichar)); if (uni == NULL) { return NULL; } dest = uni; ptr = ucs2; end = ptr + length; while (ptr != end) { if (*ptr < 0xd800 || *ptr >= 0xe000) { *dest = *ptr; dest++; } ptr++; } *dest = 0; dest++; utf8 = (gchar *) g_ucs4_to_utf8 ((const gunichar *)uni, -1, NULL, NULL, NULL); GdipFree(uni); return utf8; } BOOL utf8_to_ucs2(const gchar *utf8, gunichar2 *ucs2, int ucs2_len) { int i; glong items_read; glong count; gunichar *ucs4; gunichar2 *ptr; items_read = 0; count = 0; ucs2_len--; /* Space for null terminator */ ucs4 = g_utf8_to_ucs4(utf8, -1, &items_read, &count, NULL); if (ucs4 == NULL) { return FALSE; } ptr = (gunichar2 *)ucs2; for (i = 0; (i < count) && (i < ucs2_len); i++) { if (ucs4[i] < 0x10000 && !(ucs4[i] >= 0xd800 && ucs4[i] < 0xe000)) { *ptr = (gunichar2)ucs4[i]; ptr++; } /* we're simply ignoring any chars that don't fit into ucs2 */ } ucs2[i] = 0; /* terminate */ /* free the intermediate ucs4 string */ GdipFree(ucs4); return TRUE; } int utf8_encode_ucs2char(gunichar2 unichar, BYTE *dest) { if (unichar < 0x0080) { /* 0000-007F */ dest[0] = (BYTE)(unichar); return (1); } if(unichar < 0x0800) { /* 0080-07FF */ dest[0] = (BYTE)(0xC0 | ((unichar & 0x07C0) >> 6)); dest[1] = (BYTE)(0x80 | (unichar & 0x003F)); return (2); } /* 0800-FFFF */ dest[0] = (BYTE)(0xE0 | ((unichar & 0xF000) >> 12)); dest[1] = (BYTE)(0x80 | ((unichar & 0x0FC0) >> 6)); dest[2] = (BYTE)(0x80 | (unichar & 0x003F)); return (3); } /* re-enabled if/when required */ #if FALSE /* This function only handles UCS-2 */ int utf8_decode_ucs2char (const BYTE *src, gunichar2 *uchar) { if (src[0] <= 0x7F) { /* 0000-007F: one byte (0xxxxxxx) */ *uchar = (gunichar2)src[0]; return (1); } if (src[0] <= 0xDF) { /* 0080-07FF: two bytes (110xxxxx 10xxxxxx) */ *uchar = ((((gunichar2)src[0]) & 0x001F) << 6) | ((((gunichar2)src[1]) & 0x003F) << 0); return (2); } /* 0800-FFFF: three bytes (1110xxxx 10xxxxxx 10xxxxxx) */ *uchar = ((((gunichar2)src[0]) & 0x000F) << 12) | ((((gunichar2)src[1]) & 0x003F) << 6) | ((((gunichar2)src[2]) & 0x003F) << 0); return (3); } #endif GpStatus gdip_get_pattern_status (cairo_pattern_t *pat) { if (!pat) return OutOfMemory; switch (cairo_pattern_status (pat)) { case CAIRO_STATUS_SUCCESS: return Ok; case CAIRO_STATUS_NO_MEMORY: cairo_pattern_destroy (pat); return OutOfMemory; default: cairo_pattern_destroy (pat); return InvalidParameter; } } /* * Our anti-aliasing hack (adding an X and Y offset when drawing) cannot work if the current matrix * scales the coordinates. E.g. 0 scale 100 == 0, while (0 + 0.5) scale 100 == 50. */ BOOL gdip_is_scaled (GpGraphics *graphics) { cairo_matrix_t matrix; cairo_get_matrix (graphics->ct, &matrix); return ((matrix.xx != 1.0f) || (matrix.yy != 1.0f)); } /* cairo has a (signed) 15(1)/16(2)bits pixel positioning, while GDI+ use (signed) 23 bits (infinity). * Using larger values confuse the bits used for subpixel positioning. * (1) http://lists.freedesktop.org/archives/cairo/2006-June/007251.html * (2) testing shows artefacts if using more than 15 *signed* bits (i.e. -16384 to 16383) */ void gdip_cairo_rectangle (GpGraphics *graphics, double x, double y, double width, double height, BOOL antialiasing) { double x2, y2; /* avoid unit conversion whenever possible */ if (!OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); width = gdip_unitx_convgr (graphics, width); height = gdip_unity_convgr (graphics, height); } /* apply antialiasing offset (if required and if no scaling is in effect) */ if (antialiasing && !gdip_is_scaled (graphics)) { x += graphics->aa_offset_x; y += graphics->aa_offset_y; } /* ensure that each point (x,y and x+width,y+height) are within the 16 bits bounds */ x2 = x + width; y2 = y + height; /* put everything between cairo limits */ x = CAIRO_LIMIT (x); y = CAIRO_LIMIT (y); x2 = CAIRO_LIMIT (x2); y2 = CAIRO_LIMIT (y2); /* and recompute the final width and length */ cairo_rectangle (graphics->ct, x, y, (x2 - x), (y2 - y)); } void gdip_cairo_move_to (GpGraphics *graphics, double x, double y, BOOL convert_units, BOOL antialiasing) { /* avoid unit conversion whenever possible */ if (convert_units && !OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); } /* apply antialiasing offset (if required and if no scaling is in effect) */ if (antialiasing && !gdip_is_scaled (graphics)) { /* note that we can't add AA to a 0 position (or scaling will not work) */ x += graphics->aa_offset_x; y += graphics->aa_offset_y; } /* put everything between cairo limits */ x = CAIRO_LIMIT (x); y = CAIRO_LIMIT (y); cairo_move_to (graphics->ct, x, y); } void gdip_cairo_line_to (GpGraphics *graphics, double x, double y, BOOL convert_units, BOOL antialiasing) { /* avoid unit conversion whenever possible */ if (convert_units && !OPTIMIZE_CONVERSION (graphics)) { x = gdip_unitx_convgr (graphics, x); y = gdip_unity_convgr (graphics, y); } /* apply antialiasing offset (if required and if no scaling is in effect) */ if (antialiasing && !gdip_is_scaled (graphics)) { x += graphics->aa_offset_x; y += graphics->aa_offset_y; } /* put everything between cairo limits */ x = CAIRO_LIMIT (x); y = CAIRO_LIMIT (y); cairo_line_to (graphics->ct, x, y); } void gdip_cairo_curve_to (GpGraphics *graphics, double x1, double y1, double x2, double y2, double x3, double y3, BOOL convert_units, BOOL antialiasing) { /* avoid unit conversion whenever possible */ if (convert_units && !OPTIMIZE_CONVERSION (graphics)) { x1 = gdip_unitx_convgr (graphics, x1); y1 = gdip_unity_convgr (graphics, y1); x2 = gdip_unitx_convgr (graphics, x2); y2 = gdip_unity_convgr (graphics, y2); x3 = gdip_unitx_convgr (graphics, x3); y3 = gdip_unity_convgr (graphics, y3); } /* apply antialiasing offset (if required and if no scaling is in effect) */ if (antialiasing && !gdip_is_scaled (graphics)) { x1 += graphics->aa_offset_x; y1 += graphics->aa_offset_y; x2 += graphics->aa_offset_x; y2 += graphics->aa_offset_y; x3 += graphics->aa_offset_x; y3 += graphics->aa_offset_y; } /* put everything between cairo limits */ x1 = CAIRO_LIMIT (x1); y1 = CAIRO_LIMIT (y1); x2 = CAIRO_LIMIT (x2); y2 = CAIRO_LIMIT (y2); x3 = CAIRO_LIMIT (x3); y3 = CAIRO_LIMIT (y3); cairo_curve_to (graphics->ct, x1, y1, x2, y2, x3, y3); } libgdiplus-2.11/src/solidbrush.c0000664000175000017500000001032512225470167013636 00000000000000/* * solidbrush.c * * Copyright (c) 2003 Alexandre Pigolkine * Copyright (C) 2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine(pigolkine@gmx.de) * Ravindra (rkumar@novell.com) */ #include "solidbrush-private.h" #include "graphics-private.h" static GpStatus gdip_solidfill_setup (GpGraphics *graphics, GpBrush *brush); static GpStatus gdip_solidfill_clone (GpBrush *brush, GpBrush **clonedBrush); static GpStatus gdip_solidfill_destroy (GpBrush *brush); /* * we have a single copy of vtable for * all instances of solidbrush. */ static BrushClass vtable = { BrushTypeSolidColor, gdip_solidfill_setup, gdip_solidfill_clone, gdip_solidfill_destroy }; static void gdip_solidfill_init (GpSolidFill *brush) { gdip_brush_init (&brush->base, &vtable); brush->color = 0; } static GpSolidFill* gdip_solidfill_new (void) { GpSolidFill *result = (GpSolidFill *) GdipAlloc (sizeof (GpSolidFill)); if (result) gdip_solidfill_init (result); return result; } GpStatus gdip_solidfill_setup (GpGraphics *graphics, GpBrush *brush) { GpSolidFill *solid; int A, R, G, B; if (!graphics || !brush) return InvalidParameter; solid = (GpSolidFill *) brush; /* We extract the ARGB components of the color, only if the * brush is changed. */ if (solid->base.changed) { A = (solid->color & 0xFF000000) >> 24; R = (solid->color & 0x00FF0000) >> 16; G = (solid->color & 0x0000FF00) >> 8; B = (solid->color & 0x000000FF); solid->A = (double) A / 255.0; solid->R = (double) R / 255.0; solid->G = (double) G / 255.0; solid->B = (double) B / 255.0; } /* * Controls whether to use the alpha component in the color * or not. */ if (graphics->composite_mode == CompositingModeSourceOver) cairo_set_source_rgba (graphics->ct, solid->R, solid->G, solid->B, solid->A); else cairo_set_source_rgb (graphics->ct, solid->R, solid->G, solid->B); return Ok; } GpStatus gdip_solidfill_clone (GpBrush *brush, GpBrush **clonedBrush) { GpSolidFill *result; GpSolidFill *solid; /* the NULL checks for brush and clonedBrush are done by the caller, GdipCloneBrush */ result = (GpSolidFill *) GdipAlloc (sizeof (GpSolidFill)); if (!result) return OutOfMemory; solid = (GpSolidFill *) brush; result->base = solid->base; result->color = solid->color; result->base.changed = TRUE; *clonedBrush = (GpBrush *) result; return Ok; } GpStatus gdip_solidfill_destroy (GpBrush *brush) { /* a. the NULL check for brush is done by the caller, GdipDeleteBrush */ /* b. brush itself is freed by the caller */ return Ok; } // coverity[+alloc : arg-*1] GpStatus GdipCreateSolidFill (ARGB color, GpSolidFill **brush) { if (!brush) return InvalidParameter; *brush = gdip_solidfill_new (); if (!*brush) return OutOfMemory; (*brush)->color = color; return Ok; } GpStatus GdipSetSolidFillColor (GpSolidFill *brush, ARGB color) { if (!brush) return InvalidParameter; brush->color = color; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetSolidFillColor (GpSolidFill *brush, ARGB *color) { if (!brush || !color) return InvalidParameter; *color = brush->color; return Ok; } libgdiplus-2.11/src/pngcodec.h0000664000175000017500000000163212225470167013250 00000000000000/* * pngcodec.h : Contains function declarations for encoding decoding png images * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * * Copyright (C) 2003-2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef _PNGCODEC_H #define _PNGCODEC_H #include "bitmap-private.h" #include "bmpcodec.h" GpStatus gdip_load_png_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_png_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seeknFunc, GpImage **image) GDIP_INTERNAL; GpStatus gdip_save_png_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; GpStatus gdip_save_png_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; ImageCodecInfo *gdip_getcodecinfo_png () GDIP_INTERNAL; #endif /* _PNGCODEC_H */ libgdiplus-2.11/src/graphics-metafile-private.h0000664000175000017500000002070712225470167016526 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __GRAPHICS_METAFILE_PRIVATE_H__ #define __GRAPHICS_METAFILE_PRIVATE_H__ #include "gdiplus-private.h" #include "matrix-private.h" GpStatus metafile_DrawArc (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_DrawArcI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_DrawBezier (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) GDIP_INTERNAL; GpStatus metafile_DrawBezierI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) GDIP_INTERNAL; GpStatus metafile_DrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus metafile_DrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus metafile_DrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count, float tension) GDIP_INTERNAL; GpStatus metafile_DrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count, float tension) GDIP_INTERNAL; GpStatus metafile_FillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, float tension) GDIP_INTERNAL; GpStatus metafile_FillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, float tension) GDIP_INTERNAL; GpStatus metafile_DrawCurve3 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, int offset, int numOfSegments, float tension) GDIP_INTERNAL; GpStatus metafile_DrawCurve3I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, int offset, int numOfSegments, float tension) GDIP_INTERNAL; GpStatus metafile_DrawEllipse (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus metafile_DrawEllipseI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus metafile_FillEllipse (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus metafile_FillEllipseI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus metafile_DrawLine (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) GDIP_INTERNAL; GpStatus metafile_DrawLineI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2) GDIP_INTERNAL; GpStatus metafile_DrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus metafile_DrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus metafile_DrawRectangle (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus metafile_DrawRectangleI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus metafile_FillRectangle (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus metafile_FillRectangleI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus metafile_DrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, int count) GDIP_INTERNAL; GpStatus metafile_DrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, int count) GDIP_INTERNAL; GpStatus metafile_FillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, int count) GDIP_INTERNAL; GpStatus metafile_FillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, int count) GDIP_INTERNAL; GpStatus metafile_DrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path) GDIP_INTERNAL; GpStatus metafile_FillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path) GDIP_INTERNAL; GpStatus metafile_DrawPie (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_DrawPieI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_FillPie (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_FillPieI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus metafile_DrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus metafile_DrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus metafile_FillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, FillMode fillMode) GDIP_INTERNAL; GpStatus metafile_FillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, FillMode fillMode) GDIP_INTERNAL; GpStatus metafile_FillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region) GDIP_INTERNAL; GpStatus metafile_GraphicsClear (GpGraphics *graphics, ARGB color) GDIP_INTERNAL; GpStatus metafile_SetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode) GDIP_INTERNAL; GpStatus metafile_SetCompositingQuality (GpGraphics *graphics, CompositingQuality compositingQuality) GDIP_INTERNAL; GpStatus metafile_SetInterpolationMode (GpGraphics *graphics, InterpolationMode interpolationMode) GDIP_INTERNAL; GpStatus metafile_SetPixelOffsetMode (GpGraphics *graphics, PixelOffsetMode pixelOffsetMode) GDIP_INTERNAL; GpStatus metafile_SetRenderingOrigin (GpGraphics *graphics, int x, int y) GDIP_INTERNAL; GpStatus metafile_SetPageTransform (GpGraphics *graphics, GpUnit unit, float scale) GDIP_INTERNAL; GpStatus metafile_SetSmoothingMode (GpGraphics *graphics, SmoothingMode mode) GDIP_INTERNAL; GpStatus metafile_SetTextContrast (GpGraphics *graphics, UINT contrast) GDIP_INTERNAL; GpStatus metafile_SetTextRenderingHint (GpGraphics *graphics, TextRenderingHint mode) GDIP_INTERNAL; GpStatus metafile_ResetClip (GpGraphics *graphics) GDIP_INTERNAL; GpStatus metafile_SetClipPath (GpGraphics *graphics, GpPath *path, CombineMode combineMode) GDIP_INTERNAL; GpStatus metafile_SetClipRect (GpGraphics *graphics, float x, float y, float width, float height, CombineMode combineMode) GDIP_INTERNAL; GpStatus metafile_SetClipRegion (GpGraphics *graphics, GpRegion *region, CombineMode combineMode) GDIP_INTERNAL; GpStatus metafile_TranslateClip (GpGraphics *graphics, float dx, float dy) GDIP_INTERNAL; GpStatus metafile_ResetWorldTransform (GpGraphics *graphics) GDIP_INTERNAL; GpStatus metafile_SetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) GDIP_INTERNAL; GpStatus metafile_MultiplyWorldTransform (GpGraphics *graphics, GpMatrix *matrix, GpMatrixOrder order) GDIP_INTERNAL; GpStatus metafile_RotateWorldTransform (GpGraphics *graphics, float angle, GpMatrixOrder order) GDIP_INTERNAL; GpStatus metafile_ScaleWorldTransform (GpGraphics *graphics, float sx, float sy, GpMatrixOrder order) GDIP_INTERNAL; GpStatus metafile_TranslateWorldTransform (GpGraphics *graphics, float dx, float dy, GpMatrixOrder order) GDIP_INTERNAL; #endif libgdiplus-2.11/src/graphics-pathiterator.h0000664000175000017500000000511612225470167015773 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Duncan Mak (duncan@ximian.com) * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * Copyright (C) 2003, 2006-2007 Novell, Inc (http://www.novell.com) */ #ifndef __GRAPHICS_PATHITERATOR_H__ #define __GRAPHICS_PATHITERATOR_H__ GpStatus GdipCreatePathIter (GpPathIterator **iterator, GpPath *path); GpStatus GdipDeletePathIter (GpPathIterator *iterator); GpStatus GdipPathIterGetCount (GpPathIterator *iterator, INT *count); GpStatus GdipPathIterGetSubpathCount (GpPathIterator *iterator, INT *count); GpStatus GdipPathIterCopyData (GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT startIndex, INT endIndex); GpStatus GdipPathIterHasCurve (GpPathIterator *iterator, BOOL *hasCurve); GpStatus GdipPathIterNextMarkerPath (GpPathIterator *iterator, INT *resultCount, GpPath *path); GpStatus GdipPathIterNextMarker (GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex); GpStatus GdipPathIterNextPathType (GpPathIterator *iterator, INT *resultCount, BYTE *pathType, INT *startIndex, INT *endIndex); GpStatus GdipPathIterNextSubpathPath (GpPathIterator *iterator, INT *resultCount, GpPath *path, BOOL *isClosed); GpStatus GdipPathIterNextSubpath (GpPathIterator *iterator, INT *resultCount, INT *startIndex, INT *endIndex, BOOL *isClosed); GpStatus GdipPathIterEnumerate (GpPathIterator *iterator, INT *resultCount, GpPointF *points, BYTE *types, INT count); GpStatus GdipPathIterRewind (GpPathIterator *iterator); /* missing API GdipPathIterIsValid */ #endif libgdiplus-2.11/src/carbon-private.h0000664000175000017500000000247212225470167014405 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Geoff Norton (gnorton@novell.com) * * Copyright (C) 2008 Novell, Inc (http://www.novell.com) */ #ifndef __CARBON_PRIVATE_H__ #define __CARBON_PRIVATE_H__ #ifdef __APPLE__ void gdip_get_display_dpi_carbon (float *h_dpi, float *v_dpi); #endif #endif libgdiplus-2.11/src/stringformat.c0000664000175000017500000002162612225470167014205 00000000000000/* * Copyright (C) 2004 Ximian inc. http://www.ximian.com * Copyright (C) 2004,2006-2007 Novell Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Jordi Mas i Hernandez , 2004 * Ravindra * Sebastien Pouliot * */ #include "stringformat-private.h" /* coverity[+alloc : arg-*2] */ GpStatus GdipCreateStringFormat (INT formatAttributes, LANGID language, GpStringFormat **format) { GpStringFormat *result; if (!format) return InvalidParameter; result = (GpStringFormat *) GdipAlloc (sizeof (GpStringFormat)); if (!result) return OutOfMemory; result->alignment = StringAlignmentNear; result->lineAlignment = StringAlignmentNear; result->hotkeyPrefix = HotkeyPrefixNone; result->formatFlags = formatAttributes; result->trimming = StringTrimmingCharacter; result->substitute = StringDigitSubstituteUser; result->firstTabOffset = 0; result->tabStops = NULL; result->numtabStops = 0; result->charRanges = NULL; result->charRangeCount = 0; *format = result; return Ok; } /* coverity[+alloc : arg-*0] */ GpStatus GdipStringFormatGetGenericDefault (GpStringFormat **format) { return GdipCreateStringFormat (0, 0, format); } /* coverity[+alloc : arg-*0] */ GpStatus GdipStringFormatGetGenericTypographic (GpStringFormat **format) { int formatFlags = StringFormatFlagsNoFitBlackBox | StringFormatFlagsLineLimit | StringFormatFlagsNoClip; GpStatus status = GdipCreateStringFormat (formatFlags, 0, format); if (status == Ok) (*format)->trimming = StringTrimmingNone; return status; } /* coverity[+alloc : arg-*1] */ GpStatus GdipCloneStringFormat (GDIPCONST GpStringFormat *format, GpStringFormat **newFormat) { int i; GpStringFormat *result; if (!format || !newFormat) return InvalidParameter; result = (GpStringFormat *) GdipAlloc (sizeof (GpStringFormat)); if (!result) return OutOfMemory; result->alignment = format->alignment; result->lineAlignment = format->lineAlignment; result->hotkeyPrefix = format->hotkeyPrefix; result->formatFlags = format->formatFlags; result->trimming = format->trimming; result->substitute = format->substitute; result->firstTabOffset = format->firstTabOffset; result->numtabStops = format->numtabStops; result->charRangeCount = format->charRangeCount; /* Create a copy of tab stops for the clone */ result->tabStops = (float *) GdipAlloc (sizeof (float) * format->numtabStops); if (result->tabStops == NULL) { GdipFree (result); return OutOfMemory; } for (i = 0; i < format->numtabStops; i++) result->tabStops [i] = format->tabStops [i]; /* Create a copy of char ranges for the clone */ result->charRanges = (CharacterRange *) GdipAlloc (format->charRangeCount * sizeof (CharacterRange)); if (result->charRanges == NULL) { GdipFree (result->tabStops); GdipFree (result); return OutOfMemory; } for (i = 0; i < format->charRangeCount; i++) { result->charRanges [i].First = format->charRanges [i].First; result->charRanges [i].Length = format->charRanges [i].Length; } *newFormat = result; return Ok; } GpStatus GdipDeleteStringFormat (GpStringFormat *format) { if (!format) return InvalidParameter; if (format->tabStops) { GdipFree (format->tabStops); format->tabStops = NULL; } if (format->charRanges) { GdipFree (format->charRanges); format->charRanges = NULL; } GdipFree (format); return Ok; } GpStatus GdipSetStringFormatAlign (GpStringFormat *format, StringAlignment align) { if (!format) return InvalidParameter; format->alignment = align; return Ok; } GpStatus GdipGetStringFormatAlign (GDIPCONST GpStringFormat *format, StringAlignment *align) { if (!format || !align) return InvalidParameter; *align = format->alignment; return Ok; } GpStatus GdipSetStringFormatLineAlign (GpStringFormat *format, StringAlignment align) { if (!format) return InvalidParameter; format->lineAlignment = align; return Ok; } GpStatus GdipGetStringFormatLineAlign (GDIPCONST GpStringFormat *format, StringAlignment *align) { if (!format || !align) return InvalidParameter; *align = format->lineAlignment; return Ok; } GpStatus GdipSetStringFormatHotkeyPrefix (GpStringFormat *format, INT hotkeyPrefix) { if (!format) return InvalidParameter; format->hotkeyPrefix = hotkeyPrefix; return Ok; } GpStatus GdipGetStringFormatHotkeyPrefix (GDIPCONST GpStringFormat *format, INT *hotkeyPrefix) { if (!format || !hotkeyPrefix) return InvalidParameter; *hotkeyPrefix = format->hotkeyPrefix; return Ok; } GpStatus GdipSetStringFormatFlags (GpStringFormat *format, INT flags) { if (!format) return InvalidParameter; format->formatFlags = flags; return Ok; } GpStatus GdipGetStringFormatFlags (GDIPCONST GpStringFormat *format, INT *flags) { if (!format || !flags) return InvalidParameter; *flags = format->formatFlags; return Ok; } GpStatus GdipSetStringFormatTrimming (GpStringFormat *format, StringTrimming trimming) { if (!format) return InvalidParameter; format->trimming = trimming; return Ok; } GpStatus GdipGetStringFormatTrimming (GDIPCONST GpStringFormat *format, StringTrimming *trimming) { if (!format || !trimming) return InvalidParameter; *trimming = format->trimming; return Ok; } GpStatus GdipSetStringFormatTabStops (GpStringFormat *format, float firstTabOffset, int count, GDIPCONST float *tabStops) { int i; float *pItemSrc = (float*) tabStops; float *pItemTrg; if (!format || !tabStops) return InvalidParameter; if (format->tabStops) GdipFree (format->tabStops); format->firstTabOffset = (count >= 0) ? firstTabOffset : 0.0f; if (count <= 0) { format->tabStops = NULL; format->numtabStops = 0; return Ok; } pItemTrg = format->tabStops = GdipAlloc (sizeof(float) * count); if (!pItemTrg) return OutOfMemory; for (i = 0; i < count; i++, pItemSrc++, pItemTrg++) *pItemTrg = *pItemSrc; format->numtabStops = count; return Ok; } GpStatus GdipGetStringFormatDigitSubstitution (GDIPCONST GpStringFormat *format, LANGID *language, StringDigitSubstitute *substitute) { if (!format || !substitute) return InvalidParameter; *substitute = format->substitute; return Ok; } GpStatus GdipSetStringFormatDigitSubstitution (GpStringFormat *format, LANGID language, StringDigitSubstitute substitute) { if (!format) return InvalidParameter; format->substitute = substitute; return Ok; } GpStatus GdipGetStringFormatTabStopCount (GDIPCONST GpStringFormat *format, int *count) { if (!format || !count) return InvalidParameter; *count = format->numtabStops; return Ok; } GpStatus GdipGetStringFormatTabStops (GDIPCONST GpStringFormat *format, int count, float *firstTabOffset, float *tabStops) { int i; float *pItemSrc; float *pItemTrg = tabStops; int elems; if (!format || !firstTabOffset || !tabStops) return InvalidParameter; pItemSrc = format->tabStops; elems = countnumtabStops ? count : format->numtabStops; for (i = 0; i < elems; i++, pItemSrc++, pItemTrg++) *pItemTrg = *pItemSrc; *firstTabOffset = format->firstTabOffset; return Ok; } GpStatus GdipGetStringFormatMeasurableCharacterRangeCount (GDIPCONST GpStringFormat *format, int *count) { if (! format || !count) return InvalidParameter; *count = format->charRangeCount; return Ok; } GpStatus GdipSetStringFormatMeasurableCharacterRanges (GpStringFormat *format, int rangeCount, GDIPCONST CharacterRange *ranges) { if (!format || !ranges || (rangeCount < 0)) return InvalidParameter; if (rangeCount == 0) return Ok; else if (rangeCount > 32) return ValueOverflow; if (format->charRanges && format->charRangeCount != rangeCount) { GdipFree (format->charRanges); format->charRanges = NULL; } if (format->charRanges == NULL) { format->charRanges = (CharacterRange *) GdipAlloc (rangeCount * sizeof (CharacterRange)); if (format->charRanges == NULL) return OutOfMemory; } memcpy (format->charRanges, ranges, rangeCount * sizeof (CharacterRange)); format->charRangeCount = rangeCount; return Ok; } libgdiplus-2.11/src/fontcollection.h0000664000175000017500000000437312225470167014515 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __FONTCOLLECTION_H__ #define __FONTCOLLECTION_H__ /* FontCollection public API (only!) */ GpStatus GdipDeletePrivateFontCollection (GpFontCollection** fontCollection); GpStatus GdipGetFontCollectionFamilyCount (GpFontCollection* fontCollection, INT* numFound); GpStatus GdipGetFontCollectionFamilyList (GpFontCollection* fontCollection, INT numSought, GpFontFamily* gpfamilies[], INT* numFound); GpStatus GdipNewInstalledFontCollection (GpFontCollection** fontCollection); GpStatus GdipNewPrivateFontCollection (GpFontCollection** fontCollection); GpStatus GdipPrivateAddFontFile (GpFontCollection* fontCollection, GDIPCONST WCHAR* filename); GpStatus GdipPrivateAddMemoryFont (GpFontCollection *fontCollection, GDIPCONST void *memory, INT length); #endif libgdiplus-2.11/src/graphics-path.h0000664000175000017500000001566312225470167014231 00000000000000/* * graphics-path.h * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Duncan Mak (duncan@ximian.com) * Ravindra (rkumar@novell.com) * Sebastien Pouliot * * Copyright (C) 2003, 2006-2007 Novell, Inc (http://www.novell.com) */ #ifndef __GRAPHICS_PATH_H__ #define __GRAPHICS_PATH_H__ GpStatus GdipCreatePath (GpFillMode brushMode, GpPath **path); GpStatus GdipCreatePath2 (GDIPCONST GpPointF *points, GDIPCONST BYTE *types, INT count, GpFillMode fillMode, GpPath **path); GpStatus GdipCreatePath2I (GDIPCONST GpPoint *points, GDIPCONST BYTE *types, INT count, GpFillMode fillMode, GpPath **path); GpStatus GdipClonePath (GpPath *path, GpPath **clonePath); GpStatus GdipDeletePath (GpPath *path); GpStatus GdipResetPath (GpPath *path); GpStatus GdipGetPointCount (GpPath *path, INT *count); GpStatus GdipGetPathTypes (GpPath *path, BYTE *types, INT count); GpStatus GdipGetPathPoints (GpPath *path, GpPointF *points, INT count); GpStatus GdipGetPathPointsI (GpPath *path, GpPoint *points, INT count); GpStatus GdipGetPathData (GpPath *path, GpPathData *pathData); GpStatus GdipGetPathFillMode (GpPath *path, GpFillMode *fillmode); GpStatus GdipSetPathFillMode (GpPath *path, GpFillMode fillmode); GpStatus GdipStartPathFigure (GpPath *path); GpStatus GdipClosePathFigure (GpPath *path); GpStatus GdipClosePathFigures (GpPath *path); GpStatus GdipSetPathMarker (GpPath *path); GpStatus GdipClearPathMarker (GpPath *path); GpStatus GdipReversePath (GpPath *path); GpStatus GdipGetPathLastPoint (GpPath *path, GpPointF *lastPoint); GpStatus GdipAddPathLine (GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2); GpStatus GdipAddPathLine2 (GpPath *path, GDIPCONST GpPointF *points, INT count); GpStatus GdipAddPathArc (GpPath *path, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle); GpStatus GdipAddPathBezier (GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4); GpStatus GdipAddPathBeziers (GpPath *path, GDIPCONST GpPointF *points, INT count); GpStatus GdipAddPathCurve (GpPath *path, GDIPCONST GpPointF *points, INT count); GpStatus GdipAddPathCurve2 (GpPath *path, GDIPCONST GpPointF *points, INT count, REAL tension); GpStatus GdipAddPathCurve3 (GpPath *path, GDIPCONST GpPointF *points, INT count, INT offset, INT numberOfSegments, REAL tension); GpStatus GdipAddPathClosedCurve (GpPath *path, GDIPCONST GpPointF *points, INT count); GpStatus GdipAddPathClosedCurve2 (GpPath *path, GDIPCONST GpPointF *points, INT count, REAL tension); GpStatus GdipAddPathRectangle (GpPath *path, REAL x, REAL y, REAL width, REAL height); GpStatus GdipAddPathRectangles (GpPath *path, GDIPCONST GpRectF *rects, INT count); GpStatus GdipAddPathEllipse (GpPath *path, REAL x, REAL y, REAL width, REAL height); GpStatus GdipAddPathPie (GpPath *path, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle); GpStatus GdipAddPathPolygon (GpPath *path, GDIPCONST GpPointF *points, INT count); GpStatus GdipAddPathPath (GpPath *path, GDIPCONST GpPath *addingPath, BOOL connect); GpStatus GdipAddPathString (GpPath *path, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFontFamily *family, INT style, REAL emSize, GDIPCONST GpRectF *layoutRect, GDIPCONST GpStringFormat *format); GpStatus GdipAddPathLineI (GpPath *path, INT x1, INT y1, INT x2, INT y2); GpStatus GdipAddPathLine2I (GpPath *path, GDIPCONST GpPoint *points, INT count); GpStatus GdipAddPathArcI (GpPath *path, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle); GpStatus GdipAddPathBezierI (GpPath *path, INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4); GpStatus GdipAddPathBeziersI (GpPath *path, GDIPCONST GpPoint *points, INT count); GpStatus GdipAddPathCurveI (GpPath *path, GDIPCONST GpPoint *points, INT count); GpStatus GdipAddPathCurve2I (GpPath *path, GDIPCONST GpPoint *points, INT count, REAL tension); GpStatus GdipAddPathCurve3I (GpPath *path, GDIPCONST GpPoint *points, INT count, INT offset, INT numberOfSegments, REAL tension); GpStatus GdipAddPathClosedCurveI (GpPath *path, GDIPCONST GpPoint *points, INT count); GpStatus GdipAddPathClosedCurve2I (GpPath *path, GDIPCONST GpPoint *points, INT count, REAL tension); GpStatus GdipAddPathRectangleI (GpPath *path, INT x, INT y, INT width, INT height); GpStatus GdipAddPathRectanglesI (GpPath *path, GDIPCONST GpRect *rects, INT count); GpStatus GdipAddPathEllipseI (GpPath *path, INT x, INT y, INT width, INT height); GpStatus GdipAddPathPieI (GpPath *path, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle); GpStatus GdipAddPathPolygonI (GpPath *path, GDIPCONST GpPoint *points, INT count); GpStatus GdipAddPathStringI (GpPath *path, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFontFamily *family, INT style, REAL emSize, GDIPCONST GpRect *layoutRect, GDIPCONST GpStringFormat *format); GpStatus GdipFlattenPath (GpPath *path, GpMatrix *matrix, REAL flatness); GpStatus GdipWindingModeOutline (GpPath *path, GpMatrix *matrix, REAL flatness); GpStatus GdipWidenPath (GpPath *nativePath, GpPen *pen, GpMatrix *matrix, REAL flatness); GpStatus GdipWarpPath (GpPath *nativePath, GpMatrix *matrix, GDIPCONST GpPointF *points, INT count, REAL srcx, REAL srcy, REAL srcwidth, REAL srcheight, WarpMode warpMode, REAL flatness); GpStatus GdipTransformPath (GpPath* path, GpMatrix *matrix); GpStatus GdipGetPathWorldBounds (GpPath *path, GpRectF *bounds, GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen); GpStatus GdipGetPathWorldBoundsI (GpPath *path, GpRect *bounds, GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen); GpStatus GdipIsVisiblePathPoint (GpPath *path, REAL x, REAL y, GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisiblePathPointI (GpPath *path, INT x, INT y, GpGraphics *graphics, BOOL *result); GpStatus GdipIsOutlineVisiblePathPoint (GpPath *path, REAL x, REAL y, GpPen *pen, GpGraphics *graphics, BOOL *result); GpStatus GdipIsOutlineVisiblePathPointI (GpPath *path, INT x, INT y, GpPen *pen, GpGraphics *graphics, BOOL *result); #endif libgdiplus-2.11/src/font.h0000664000175000017500000000473012225470167012436 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __FONT_H__ #define __FONT_H__ /* Font public API (only!) */ GpStatus GdipCreateFont (GDIPCONST GpFontFamily* family, float emSize, int style, Unit unit, GpFont **font); GpStatus GdipCreateFontFromDC (void *hdc, GpFont **font); GpStatus GdipDeleteFont (GpFont* font); GpStatus GdipGetLogFontA (GpFont *font, GpGraphics *graphics, LOGFONTA *logfontA); GpStatus GdipGetLogFontW (GpFont *font, GpGraphics *graphics, LOGFONTW *logfontW); GpStatus GdipGetFontHeight (GDIPCONST GpFont *font, GDIPCONST GpGraphics *graphics, float *height); GpStatus GdipGetFontHeightGivenDPI (GDIPCONST GpFont *font, float dpi, float *height); GpStatus GdipGetFontSize (GpFont *font, float *size); /* missing API GdipCreateFontFromLogfontA GdipCreateFontFromLogfontW GdipCloneFont GdipGetFamily GdipGetFontStyle GdipGetFontUnit */ /* libgdiplus extra API (not availble in MSGDI+ but exported from libgdiplus) */ GpStatus GdipCreateFontFromHfontA (HFONT hfont, GpFont **font, void *lf); #endif libgdiplus-2.11/src/region-private.h0000664000175000017500000000471612225470167014427 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __REGION_PRIVATE_H__ #define __REGION_PRIVATE_H__ #include "gdiplus-private.h" #include "matrix-private.h" #include "region-bitmap.h" #include "region-path-tree.h" /* In the integer world infinity has limited bounds ;-) */ #define REGION_INFINITE_POSITION -4194304 #define REGION_INFINITE_LENGTH 8388608 typedef enum { RegionTypeEmpty = 0, RegionTypeRect = 1, RegionTypeRectF = 2, RegionTypePath = 3 } RegionType; struct _Region { guint32 type; int cnt; GpRectF* rects; GpPathTree* tree; GpRegionBitmap* bitmap; }; BOOL gdip_is_InfiniteRegion (GpRegion *region) GDIP_INTERNAL; BOOL gdip_is_Point_in_RectF_inclusive (float x, float y, GpRectF* rect) GDIP_INTERNAL; void gdip_clear_region (GpRegion *region) GDIP_INTERNAL; void gdip_copy_region (GpRegion *source, GpRegion *dest) GDIP_INTERNAL; #include "region.h" #endif libgdiplus-2.11/src/pen.h0000664000175000017500000001075012225470167012251 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __PEN_H__ #define __PEN_H__ GpStatus GdipCreatePen1 (ARGB argb, REAL width, GpUnit unit, GpPen **pen); GpStatus GdipCreatePen2 (GpBrush *brush, REAL width, GpUnit unit, GpPen **pen); GpStatus GdipClonePen (GpPen *pen, GpPen **clonedpen); GpStatus GdipDeletePen (GpPen *pen); GpStatus GdipSetPenWidth (GpPen *pen, REAL width); GpStatus GdipGetPenWidth (GpPen *pen, REAL *width); GpStatus GdipSetPenBrushFill (GpPen *pen, GpBrush *brush); GpStatus GdipGetPenBrushFill (GpPen *pen, GpBrush **brush); GpStatus GdipGetPenFillType (GpPen *pen, GpPenType *penType); GpStatus GdipSetPenColor (GpPen *pen, ARGB color); GpStatus GdipGetPenColor (GpPen *pen, ARGB *color); GpStatus GdipSetPenDashStyle (GpPen *pen, GpDashStyle dashStyle); GpStatus GdipGetPenDashStyle (GpPen *pen, GpDashStyle *dashStyle); GpStatus GdipSetPenDashOffset (GpPen *pen, REAL offset); GpStatus GdipGetPenDashOffset (GpPen *pen, REAL *offset); GpStatus GdipGetPenDashCount (GpPen *pen, INT *count); GpStatus GdipSetPenDashArray (GpPen *pen, GDIPCONST REAL *dash, INT count); GpStatus GdipGetPenDashArray (GpPen *pen, REAL *dash, INT count); GpStatus GdipSetPenCompoundArray (GpPen *pen, GDIPCONST REAL *dash, INT count); GpStatus GdipGetPenCompoundArray (GpPen *pen, REAL *dash, INT count); GpStatus GdipGetPenCompoundCount (GpPen *pen, INT *count); GpStatus GdipSetPenMode (GpPen *pen, GpPenAlignment penMode); GpStatus GdipGetPenMode (GpPen *pen, GpPenAlignment *penMode); GpStatus GdipSetPenMiterLimit (GpPen *pen, REAL miterLimit); GpStatus GdipGetPenMiterLimit (GpPen *pen, REAL *miterLimit); GpStatus GdipSetPenLineCap197819 (GpPen *pen, GpLineCap startCap, GpLineCap endCap, GpDashCap dashCap); GpStatus GdipSetPenStartCap (GpPen *pen, GpLineCap startCap); GpStatus GdipGetPenStartCap (GpPen *pen, GpLineCap *startCap); GpStatus GdipSetPenEndCap (GpPen *pen, GpLineCap endCap); GpStatus GdipGetPenEndCap (GpPen *pen, GpLineCap *endCap); GpStatus GdipSetPenDashCap197819 (GpPen *pen, GpDashCap dashCap); GpStatus GdipGetPenDashCap197819 (GpPen *pen, GpDashCap *dashCap); GpStatus GdipSetPenLineJoin (GpPen *pen, GpLineJoin lineJoin); GpStatus GdipGetPenLineJoin (GpPen *pen, GpLineJoin *lineJoin); GpStatus GdipSetPenCustomStartCap (GpPen *pen, GpCustomLineCap *customCap); GpStatus GdipGetPenCustomStartCap (GpPen *pen, GpCustomLineCap **customCap); GpStatus GdipSetPenCustomEndCap (GpPen *pen, GpCustomLineCap *customCap); GpStatus GdipGetPenCustomEndCap (GpPen *pen, GpCustomLineCap **customCap); GpStatus GdipSetPenTransform (GpPen *pen, GpMatrix *matrix); GpStatus GdipGetPenTransform (GpPen *pen, GpMatrix *matrix); GpStatus GdipResetPenTransform (GpPen *pen); GpStatus GdipMultiplyPenTransform (GpPen *pen, GpMatrix *matrix, GpMatrixOrder order); GpStatus GdipTranslatePenTransform (GpPen *pen, REAL dx, REAL dy, GpMatrixOrder order); GpStatus GdipScalePenTransform (GpPen *pen, REAL sx, REAL sy, GpMatrixOrder order); GpStatus GdipRotatePenTransform (GpPen *pen, REAL angle, GpMatrixOrder order); /* missing API GdipGetPenUnit GdipSetPenUnit */ #endif libgdiplus-2.11/src/emfplus.c0000664000175000017500000001311612225470167013134 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "emfplus.h" //#define DEBUG_EMFPLUS_ALL #ifdef DEBUG_EMFPLUS_ALL #define DEBUG_EMFPLUS #define DEBUG_EMFPLUS_2 #define DEBUG_EMFPLUS_3 #define DEBUG_EMFPLUS_NOTIMPLEMENTED #endif /* http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/Header.html */ static GpStatus EmfPlusHeader (MetafilePlayContext *context, WORD flags, BYTE* data, int size) { #ifdef DEBUG_EMFPLUS /* if flags == 1, EmfPlusDual (GDI and GDI+), else EmfPlusOnly (GDI+) */ printf ("\nEmfPlusHeader flags %X", flags); printf ("\n\tData Size %d", GETDW(DWP1)); printf ("\n\tObject Header %X", GETDW(DWP2)); printf ("\n\tVersion %d", GETDW(DWP3)); printf ("\n\tHorizontal Resolution %d", GETDW(DWP4)); printf ("\n\tVertical Resolution %d", GETDW(DWP5)); #endif context->metafile->metafile_header.Type = (flags & 1) ? METAFILETYPE_EMFPLUSDUAL : METAFILETYPE_EMFPLUSONLY; /* ObjectHeader, not Version, is returned to be compatible with GDI+ */ context->metafile->metafile_header.Version = GETDW(DWP2); /* Horizontal and Vertical Resolution aren't reported correctly by GDI+ (generally 0) */ return Ok; } /* http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/EndOfFile.html */ static GpStatus EmfPlusEndOfFile (MetafilePlayContext *context, WORD flags, BYTE* data, int size) { #ifdef DEBUG_EMFPLUS printf ("EmfPlusRecordTypeEndOfFile flags %X", flags); #endif return Ok; } /* http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/FillRects.html */ static GpStatus EmfPlusFillRects (MetafilePlayContext *context, WORD flags, BYTE* data, int size) { GpStatus status = Ok; GpSolidFill *solid = NULL; GpBrush *brush = NULL; #ifdef DEBUG_EMFPLUS printf ("EmfPlusRecordTypeFillRects flags %X", flags, size); printf ("\n\tColor: 0x%X", GETDW(DWP2)); printf ("\n\t#rect: %d", GETDW(DWP3)); #endif BOOL use_int16 = (flags & 0x4000); BOOL use_color = (flags & 0x8000); DWORD num = GETDW(DWP3); int i = 0; int n = 3; if (use_color) { status = GdipCreateSolidFill (GETDW(DWP2), &solid); if (status != Ok) return status; brush = (GpBrush*)solid; } else { /* TODO - get brush from index */ } while ((i++ < num) && (status == Ok)) { float x, y, w, h; if (use_int16) { DWORD xy = GETDW(DWP(n)); n++; x = (xy >> 16); y = (WORD)xy; DWORD wh = GETDW(DWP(n)); n++; w = (wh >> 16); h = (WORD)wh; } else { x = (float) GETDW(DWP(n)); n++; y = (float) GETDW(DWP(n)); n++; w = (float) GETDW(DWP(n)); n++; h = (float) GETDW(DWP(n)); n++; } #ifdef DEBUG_EMFPLUS_2 printf ("\n\t\t%d - x %g, y %g, w %g, h %g", i, x, y, w, h); #endif status = GdipFillRectangle (context->graphics, brush, x, y, w, h); } if (solid) GdipDeleteBrush (brush); /* brush == a GpBrush* typecasted solid, if used */ return status; } GpStatus gdip_metafile_play_emfplus_block (MetafilePlayContext *context, BYTE* data, int length) { GpStatus status = Ok; BYTE *end = data + length; #ifdef DEBUG_EMFPLUS int i = 1, j; #endif /* special case to update the header informations (we're not really playing the metafile) */ if (!context->graphics) { DWORD record = GETDW(EMF_FUNCTION); WORD func = (WORD)record; if (func == EmfPlusRecordTypeHeader) { WORD flags = (record >> 16); DWORD size = GETDW(EMF_RECORDSIZE); return EmfPlusHeader (context, flags, data, size); } /* no header, continue */ return Ok; } /* reality check - each record is, at minimum, 8 bytes long (when size == 0) */ while (data < end - EMF_MIN_RECORD_SIZE) { DWORD record = GETDW(EMF_FUNCTION); WORD func = (WORD)record; WORD flags = (record >> 16); DWORD size = GETDW(EMF_RECORDSIZE); int params = (size - EMF_MIN_RECORD_SIZE) / sizeof (DWORD); #ifdef DEBUG_EMFPLUS printf ("\n\tEMF+[#%d] size %d ", i++, size); #endif switch (func) { case EmfPlusRecordTypeHeader: status = EmfPlusHeader (context, flags, data, size); break; case EmfPlusRecordTypeEndOfFile: return EmfPlusEndOfFile (context, flags, data, size); case EmfPlusRecordTypeFillRects: status = EmfPlusFillRects (context, flags, data, size); break; default: /* unprocessed records, ignore the data */ #ifdef DEBUG_EMFPLUS_NOTIMPLEMENTED printf ("Unimplemented_%d (", func); for (j = 0; j < params; j++) { printf (" %d", GETDW(DWP(j))); } printf (" )"); #endif break; } if (status != Ok) { g_warning ("EMF+ parsing interupted, status %d returned from function %d.", status, func); goto cleanup; } data += size; } cleanup: return status; } libgdiplus-2.11/src/dstream.c0000664000175000017500000001063012225470167013116 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ #include "gdiplus-private.h" #include "dstream.h" struct _dstream_pvt { GetBytesDelegate read; SeekDelegate seek; BYTE *buffer; int allocated; int position; int used; /* EXIF APP1 buffer */ BYTE *exif_buffer; unsigned int exif_datasize; BOOL keep_exif_buffer; }; /* dstream_t */ dstream_t * dstream_input_new (GetBytesDelegate read, SeekDelegate seek) { dstream_t *st; st = GdipAlloc (sizeof (dstream_t)); if (st == NULL) return NULL; st->pvt = GdipAlloc (sizeof (dstream_private)); if (st->pvt == NULL) { GdipFree (st); return NULL; } memset (st->pvt, 0, sizeof (dstream_private)); st->pvt->read = read; st->pvt->seek = seek; return st; } void dstream_free (dstream_t *st) { if (st) { dstream_private *loader = st->pvt; if (loader->buffer) GdipFree (loader->buffer); if (loader->exif_buffer) GdipFree (loader->exif_buffer); memset (loader, 0, sizeof (dstream_t)); GdipFree (loader); GdipFree (st); } } static int read_from_buffer (dstream_private *loader, void *buffer, int size) { int nbytes = loader->used - loader->position; if (nbytes > size) nbytes = size; memcpy (buffer, loader->buffer + loader->position, nbytes); loader->position += nbytes; return nbytes; } static void fill_buffer (dstream_private *loader) { int offset; int nbytes = loader->used - loader->position; if (nbytes > 0) return; if (loader->allocated == 0) { loader->allocated = 65536; loader->buffer = GdipAlloc (loader->allocated); if (loader->buffer == NULL) { /* what? */ return; } } offset = 0; do { nbytes = loader->read (loader->buffer + offset, loader->allocated - offset, 0); if (nbytes > 0) offset += nbytes; } while (nbytes > 0 && ((loader->allocated - offset) > 0)); if (offset != 0) { loader->position = 0; loader->used = offset; } /* First chunk read */ if (nbytes > 0 && loader->keep_exif_buffer && loader->exif_buffer == NULL) { loader->exif_buffer = GdipAlloc (offset); loader->exif_datasize = offset; memcpy (loader->exif_buffer, loader->buffer, offset); } } int dstream_read (dstream_t *st, void *buffer, int size, char peek) { int nbytes; int offset; dstream_private *loader = st->pvt; offset = 0; do { fill_buffer (loader); nbytes = read_from_buffer (loader, buffer + offset, size); offset += nbytes; size -= nbytes; } while (size > 0 && nbytes > 0); return offset; } void dstream_skip (dstream_t *st, int nbytes) { dstream_private *loader = st->pvt; if (loader->seek != NULL) { loader->seek (nbytes, SEEK_CUR); } else { int remain = loader->used - loader->position; if (remain > 0) { if (nbytes >= remain) { nbytes -= remain; loader->used = 0; loader->position = 0; } else { loader->position += nbytes; nbytes = 0; } } /* 'read' ignores reads into a NULL buffer */ while (nbytes > 0) { nbytes -= loader->read (NULL, nbytes, 0); } } /* Invalidate buffer */ loader->used = 0; loader->position = 0; } void dstream_keep_exif_buffer (dstream_t *st) { dstream_private *loader = st->pvt; loader->keep_exif_buffer = TRUE; } void dstream_get_exif_buffer (dstream_t *st, BYTE **ptr, unsigned int *length) { dstream_private *loader = st->pvt; if (loader->keep_exif_buffer) { *ptr = loader->exif_buffer; *length = loader->exif_datasize; } else { *ptr = NULL; *length = 0; } } libgdiplus-2.11/src/matrix.h0000664000175000017500000000562412225470167012777 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __MATRIX_H__ #define __MATRIX_H__ GpStatus GdipCreateMatrix (GpMatrix **matrix); GpStatus GdipCreateMatrix2 (float m11, float m12, float m21, float m22, float dx, float dy, GpMatrix **matrix); GpStatus GdipCreateMatrix3 (GDIPCONST GpRectF *rect, GDIPCONST GpPointF *dstplg, GpMatrix **matrix); GpStatus GdipCreateMatrix3I (GDIPCONST GpRect *rect, GDIPCONST GpPoint *dstplg, GpMatrix **matrix); GpStatus GdipCloneMatrix (GpMatrix *matrix, GpMatrix **cloneMatrix); GpStatus GdipDeleteMatrix (GpMatrix *matrix); GpStatus GdipSetMatrixElements (GpMatrix *matrix, float m11, float m12, float m21, float m22, float dx, float dy); GpStatus GdipMultiplyMatrix (GpMatrix *matrix, GpMatrix *matrix2, GpMatrixOrder order); GpStatus GdipTranslateMatrix (GpMatrix *matrix, float offsetX, float offsetY, GpMatrixOrder order); GpStatus GdipScaleMatrix (GpMatrix *matrix, float scaleX, float scaleY, GpMatrixOrder order); GpStatus GdipRotateMatrix (GpMatrix *matrix, float angle, GpMatrixOrder order); GpStatus GdipShearMatrix (GpMatrix *matrix, float shearX, float shearY, GpMatrixOrder order); GpStatus GdipInvertMatrix (GpMatrix *matrix); GpStatus GdipTransformMatrixPoints (GpMatrix *matrix, GpPointF *pts, int count); GpStatus GdipTransformMatrixPointsI (GpMatrix *matrix, GpPoint *pts, int count); GpStatus GdipVectorTransformMatrixPoints (GpMatrix *matrix, GpPointF *pts, int count); GpStatus GdipVectorTransformMatrixPointsI (GpMatrix *matrix, GpPoint *pts, int count); GpStatus GdipGetMatrixElements (GpMatrix *matrix, float *matrixOut); GpStatus GdipIsMatrixInvertible (GpMatrix *matrix, BOOL *result); GpStatus GdipIsMatrixIdentity (GpMatrix *matrix, BOOL *result); GpStatus GdipIsMatrixEqual (GpMatrix *matrix, GpMatrix *matrix2, BOOL *result); #endif libgdiplus-2.11/src/gdiplus-private.h0000664000175000017500000000553612225470167014614 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __LIBGDIPLUS_H__ #define __LIBGDIPLUS_H__ #include #include #include #include #include #include #include "config.h" #if HAVE_VISIBILITY_HIDDEN #define GDIP_INTERNAL __attribute__((visibility ("hidden"))) #else #define GDIP_INTERNAL #endif #ifdef USE_INCLUDED_CAIRO #include "cairo-embed.h" #include "cairo.h" #ifdef CAIRO_HAS_FT_FONT #include "cairo-ft.h" #endif #ifdef CAIRO_HAS_XLIB_SURFACE #include "cairo-xlib.h" #endif #else #include #ifdef CAIRO_HAS_FT_FONT #include #endif #ifdef CAIRO_HAS_XLIB_SURFACE #include #endif #endif #include #include "win32structs.h" #include "gdipenums.h" #include "gdipstructs.h" #include "general-private.h" typedef struct _AdjustableArrowCap GpAdjustableArrowCap; typedef struct _Brush GpBrush; typedef struct _CustomLineCap GpCustomLineCap; typedef struct _Font GpFont; typedef struct _FontCollection GpFontCollection; typedef struct _FontFamily GpFontFamily; typedef struct _Graphics GpGraphics; typedef struct _Hatch GpHatch; typedef struct _Image GpImage; typedef struct _ImageAttributes GpImageAttributes; typedef struct _LineGradient GpLineGradient; typedef struct _Metafile GpMetafile; typedef struct _Path GpPath; typedef struct _PathIterator GpPathIterator; typedef struct _PathGradient GpPathGradient; typedef struct _Pen GpPen; typedef struct _Region GpRegion; typedef struct _SolidFill GpSolidFill; typedef struct _StringFormat GpStringFormat; typedef struct _Texture GpTexture; #endif libgdiplus-2.11/src/graphics-cairo-private.h0000664000175000017500000001607212225470167016035 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __GRAPHICS_CAIRO_PRIVATE_H__ #define __GRAPHICS_CAIRO_PRIVATE_H__ #include "gdiplus-private.h" #include "brush-private.h" #include "matrix-private.h" /* constant for make_ellipse */ #define C1 0.552285 /* * Cairo use doubles almost everywhere so we can define most int-based functions to the float based one */ #define cairo_DrawLineI cairo_DrawLine #define cairo_DrawPieI cairo_DrawPie #define cairo_FillPieI cairo_FillPie #define cairo_DrawRectangleI cairo_DrawRectangle #define cairo_FillRectangleI cairo_FillRectangle /* * Handling of pens with a width greater than 1 is not identical between GDI+ and Cairo * * On apple pen adjustment is not required or tons of tests senstive to this break. */ #ifdef __APPLE__ #define gdip_cairo_pen_width_needs_adjustment(pen) (0) #else #define gdip_cairo_pen_width_needs_adjustment(pen) (((int)(pen->width) & 1) == 0) #endif cairo_fill_rule_t gdip_convert_fill_mode (FillMode fill_mode) GDIP_INTERNAL; GpStatus gdip_plot_path (GpGraphics *graphics, GpPath *path, BOOL antialiasing) GDIP_INTERNAL; GpStatus cairo_DrawArc (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus cairo_DrawArcI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus cairo_DrawBezier (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) GDIP_INTERNAL; GpStatus cairo_DrawBezierI (GpGraphics *graphics, GpPen *pen, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) GDIP_INTERNAL; GpStatus cairo_DrawBeziers (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus cairo_DrawBeziersI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus cairo_DrawClosedCurve2 (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count, float tension) GDIP_INTERNAL; GpStatus cairo_DrawClosedCurve2I (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count, float tension) GDIP_INTERNAL; GpStatus cairo_FillClosedCurve2 (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, float tension) GDIP_INTERNAL; GpStatus cairo_FillClosedCurve2I (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, float tension) GDIP_INTERNAL; GpStatus cairo_DrawCurve3 (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPointF *points, int count, int offset, int numOfSegments, float tension) GDIP_INTERNAL; GpStatus cairo_DrawCurve3I (GpGraphics *graphics, GpPen* pen, GDIPCONST GpPoint *points, int count, int offset, int numOfSegments, float tension) GDIP_INTERNAL; GpStatus cairo_DrawEllipse (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus cairo_DrawEllipseI (GpGraphics *graphics, GpPen *pen, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus cairo_FillEllipse (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus cairo_FillEllipseI (GpGraphics *graphics, GpBrush *brush, int x, int y, int width, int height) GDIP_INTERNAL; GpStatus cairo_DrawLine (GpGraphics *graphics, GpPen *pen, float x1, float y1, float x2, float y2) GDIP_INTERNAL; GpStatus cairo_DrawLines (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus cairo_DrawLinesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus cairo_DrawRectangle (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus cairo_FillRectangle (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height) GDIP_INTERNAL; GpStatus cairo_DrawRectangles (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRectF *rects, int count) GDIP_INTERNAL; GpStatus cairo_DrawRectanglesI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpRect *rects, int count) GDIP_INTERNAL; GpStatus cairo_FillRectangles (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRectF *rects, int count) GDIP_INTERNAL; GpStatus cairo_FillRectanglesI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpRect *rects, int count) GDIP_INTERNAL; GpStatus cairo_DrawPath (GpGraphics *graphics, GpPen *pen, GpPath *path) GDIP_INTERNAL; GpStatus cairo_FillPath (GpGraphics *graphics, GpBrush *brush, GpPath *path) GDIP_INTERNAL; GpStatus cairo_DrawPie (GpGraphics *graphics, GpPen *pen, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus cairo_FillPie (GpGraphics *graphics, GpBrush *brush, float x, float y, float width, float height, float startAngle, float sweepAngle) GDIP_INTERNAL; GpStatus cairo_DrawPolygon (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPointF *points, int count) GDIP_INTERNAL; GpStatus cairo_DrawPolygonI (GpGraphics *graphics, GpPen *pen, GDIPCONST GpPoint *points, int count) GDIP_INTERNAL; GpStatus cairo_FillPolygon (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPointF *points, int count, FillMode fillMode) GDIP_INTERNAL; GpStatus cairo_FillPolygonI (GpGraphics *graphics, GpBrush *brush, GDIPCONST GpPoint *points, int count, FillMode fillMode) GDIP_INTERNAL; GpStatus cairo_FillRegion (GpGraphics *graphics, GpBrush *brush, GpRegion *region) GDIP_INTERNAL; GpStatus cairo_GraphicsClear (GpGraphics *graphics, ARGB color) GDIP_INTERNAL; GpStatus cairo_SetCompositingMode (GpGraphics *graphics, CompositingMode compositingMode) GDIP_INTERNAL; GpStatus cairo_SetSmoothingMode (GpGraphics *graphics, SmoothingMode mode) GDIP_INTERNAL; GpStatus cairo_SetGraphicsClip (GpGraphics *graphics) GDIP_INTERNAL; GpStatus cairo_ResetClip (GpGraphics *graphics) GDIP_INTERNAL; GpStatus cairo_ResetWorldTransform (GpGraphics *graphics) GDIP_INTERNAL; GpStatus cairo_SetWorldTransform (GpGraphics *graphics, GpMatrix *matrix) GDIP_INTERNAL; #endif libgdiplus-2.11/src/hatchbrush.c0000664000175000017500000014320112225470167013613 00000000000000/* * hatchbrush.c * * Copyright (C) 2004,2006-2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Ravindra (rkumar@novell.com) * */ /* FIXME - match hatchbrush use the RenderOrigin stored in graphics */ #include "hatchbrush-private.h" #include "graphics-private.h" static GpStatus gdip_hatch_setup (GpGraphics *graphics, GpBrush *brush); static GpStatus gdip_hatch_clone (GpBrush *brush, GpBrush **clonedBrush); static GpStatus gdip_hatch_destroy (GpBrush *brush); /* * We keep a single copy of vtable for * all instances of hatchbrush. */ static BrushClass vtable = { BrushTypeHatchFill, gdip_hatch_setup, gdip_hatch_clone, gdip_hatch_destroy }; static void gdip_hatch_init (GpHatch *hatch) { gdip_brush_init (&hatch->base, &vtable); hatch->backColor = 0; hatch->pattern = NULL; } static GpHatch* gdip_hatch_new (void) { GpHatch *result = (GpHatch *) GdipAlloc (sizeof (GpHatch)); if (result) gdip_hatch_init (result); return result; } /* helper functions */ static cairo_t* create_hatch_context (cairo_surface_t *hatch, cairo_line_cap_t line_cap, BOOL antialias) { cairo_t *ct = cairo_create (hatch); if (cairo_status (ct) != CAIRO_STATUS_SUCCESS) { cairo_destroy (ct); return NULL; } cairo_set_line_cap (ct, line_cap); if (!antialias) cairo_set_antialias (ct, CAIRO_ANTIALIAS_NONE); return ct; } static void set_color (cairo_t *ct, int color) { int R = (color & 0x00FF0000) >> 16; int G = (color & 0x0000FF00) >> 8; int B = (color & 0x000000FF); cairo_set_source_rgb (ct, (double) R / 255.0, (double) G / 255.0, (double) B / 255.0); } static void draw_background (cairo_t *ct, int backcolor, int width, int height) { set_color (ct, backcolor); cairo_rectangle (ct, 0, 0, width, height); cairo_fill (ct); } /* The values used below are obtained by hit and trial to get the results similar to that of MS. */ static const double hatches_const[][3] = { /* HatchStyleHorizontal */ { HATCH_SIZE, HATCH_SIZE, LINE_WIDTH }, /* HatchStyleVertical */ { HATCH_SIZE, HATCH_SIZE, LINE_WIDTH }, /* HatchStyleForwardDiagonal */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleBackwardDiagonal */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleCross */ { HATCH_SIZE + 2.0, HATCH_SIZE + 2.0, LINE_WIDTH }, /* HatchStyleDiagonalCross */ { HATCH_SIZE, HATCH_SIZE, LINE_WIDTH }, /* HatchStyle05Percent */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyle10Percent */ { HATCH_SIZE + 1.0, 4.0, LINE_WIDTH }, /* HatchStyle20Percent */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyle25Percent */ { 4.0, 2.0, LINE_WIDTH }, /* HatchStyle30Percent */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyle40Percent */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyle50Percent */ { 2.0, 2.0, LINE_WIDTH }, /* HatchStyle60Percent */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyle70Percent */ { 4.0, 2.0, LINE_WIDTH }, /* HatchStyle75Percent */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyle80Percent */ { HATCH_SIZE + 1.0, 4.0, LINE_WIDTH }, /* HatchStyle90Percent */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleLightDownwardDiagonal */ { (HATCH_SIZE + 1.0) * 0.5, (HATCH_SIZE + 1.0) * 0.5, LINE_WIDTH }, /* HatchStyleLightUpwardDiagonal */ { (HATCH_SIZE + 1.0) * 0.5, (HATCH_SIZE + 1.0) * 0.5, LINE_WIDTH }, /* HatchStyleDarkDownwardDiagonal */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyleDarkUpwardDiagonal */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyleWideDownwardDiagonal */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH * 2.0 }, /* HatchStyleWideUpwardDiagonal */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH * 2.0 }, /* HatchStyleLightVertical */ { HATCH_SIZE * 0.7, HATCH_SIZE * 0.7, LINE_WIDTH }, /* HatchStyleLightHorizontal */ { HATCH_SIZE * 0.7, HATCH_SIZE * 0.7, LINE_WIDTH }, /* HatchStyleNarrowVertical */ { 2.0, 2.0, LINE_WIDTH }, /* HatchStyleNarrowHorizontal */ { 2.0, 2.0, LINE_WIDTH }, /* HatchStyleDarkVertical */ { HATCH_SIZE * 0.6, HATCH_SIZE * 0.6, LINE_WIDTH * 2.0 }, /* HatchStyleDarkHorizontal */ { HATCH_SIZE * 0.6, HATCH_SIZE * 0.6, LINE_WIDTH * 2.0 }, /* HatchStyleDashedDownwardDiagonal */ { 4.0, 8.0, LINE_WIDTH }, /* HatchStyleDashedUpwardDiagonal */ { 4.0, 8.0, LINE_WIDTH }, /* HatchStyleDashedHorizontal */ { 8.0, 8.0, LINE_WIDTH }, /* HatchStyleDashedVertical */ { 8.0, 8.0, LINE_WIDTH }, /* HatchStyleSmallConfetti */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleLargeConfetti */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleZigZag */ { HATCH_SIZE + 1.0, 4.0, LINE_WIDTH }, /* HatchStyleWave */ { HATCH_SIZE + 2.0, (HATCH_SIZE + 2.0) / 2.0, LINE_WIDTH }, /* HatchStyleDiagonalBrick */ { HATCH_SIZE + 0.0, HATCH_SIZE + 0.0, LINE_WIDTH }, /* HatchStyleHorizontalBrick */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleWeave */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStylePlaid */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleDivot */ { 9.0, 9.0, LINE_WIDTH }, /* HatchStyleDottedGrid */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleDottedDiamond */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleShingle */ { HATCH_SIZE + 1.0, HATCH_SIZE - 1.0, LINE_WIDTH }, /* HatchStyleTrellis */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyleSphere */ { 9.0, 9.0, LINE_WIDTH }, /* HatchStyleSmallGrid */ { (HATCH_SIZE + 2.0) * 0.6, (HATCH_SIZE + 2.0) * 0.6, LINE_WIDTH }, /* HatchStyleSmallCheckerBoard */ { 4.0, 4.0, LINE_WIDTH }, /* HatchStyleLargeCheckerBoard */ { 8.0, 8.0, LINE_WIDTH }, /* HatchStyleOutlinedDiamond */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH }, /* HatchStyleSolidDiamond */ { HATCH_SIZE + 1.0, HATCH_SIZE + 1.0, LINE_WIDTH } }; /* * functions to draw different hatch styles. */ static cairo_status_t draw_horizontal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw horizontal line in the foreground color */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, 0, hatch_size / 2.0); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_vertical_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw vertical line in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_forward_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, TRUE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw forward diagonal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, 0, hatch_size / 2.0); cairo_line_to (ct2, hatch_size / 2.0, hatch_size); cairo_move_to (ct2, hatch_size / 2.0, 0); cairo_line_to (ct2, hatch_size, hatch_size / 2.0); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_backward_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, TRUE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw backward diagonal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, hatch_size / 2.0, 0); cairo_line_to (ct2, 0, hatch_size / 2.0 ); cairo_move_to (ct2, hatch_size, hatch_size / 2.0); cairo_line_to (ct2, hatch_size / 2.0, hatch_size); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_cross_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); double dash [] = {1.0}; /* used for drawing dotted grid */ BOOL dotted = (hbr->hatchStyle == HatchStyleDottedGrid); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, dotted ? CAIRO_LINE_CAP_BUTT : CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw lines in the foregound */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); if (hbr->hatchStyle == HatchStyleDottedGrid) cairo_set_dash (ct2, dash, 1, 0); /* draw a horizontal line */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); /* draw a vertical line */ cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_diagonal_cross_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, TRUE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw diagonal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* draw a forward diagonal line */ cairo_move_to (ct2, 0, 0); cairo_line_to (ct2, hatch_size, hatch_size); /* draw a backward diagonal line */ cairo_move_to (ct2, hatch_size, 0); cairo_line_to (ct2, 0, hatch_size); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_percent_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* some patterns requires to reverse the colors */ switch (hbr->hatchStyle) { case HatchStyle05Percent: case HatchStyle10Percent: case HatchStyle20Percent: case HatchStyle25Percent: draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); set_color (ct2, hbr->foreColor); break; default: draw_background (ct2, hbr->foreColor, hatch_wd, hatch_ht); set_color (ct2, hbr->backColor); } /* draw four dots */ /* left middle */ gdip_cairo_pixel (ct2, 0, hatch_ht / 2.0); /* top middle */ gdip_cairo_pixel (ct2, hatch_wd / 2.0, 0); /* bottom middle */ gdip_cairo_pixel (ct2, hatch_wd / 2.0, hatch_ht); /* right middle */ gdip_cairo_pixel (ct2, hatch_wd, hatch_ht / 2.0); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_30_percent_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* HatchStyle30Percent and HatchStyle60Percent are identical, but the colors are reversed */ if (hbr->hatchStyle == HatchStyle60Percent) { draw_background (ct2, hbr->foreColor, hatch_size, hatch_size); set_color (ct2, hbr->backColor); } else { draw_background (ct2, hbr->backColor, hatch_size, hatch_size); set_color (ct2, hbr->foreColor); } /* draw two diagonal lines in the foreground */ cairo_set_line_width (ct2, line_width); /* near top left corner */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); /* near top right corner */ cairo_move_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* simulate the dots by drawing lines in background color */ if (hbr->hatchStyle == HatchStyleDottedDiamond) { double i; set_color (ct2, hbr->backColor); for (i = 0.0; i <= hatch_size; i += 2.0) { cairo_move_to (ct2, i, 0.0); cairo_line_to (ct2, i, hatch_size); } cairo_stroke (ct2); } /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_40_percent_hatch (cairo_t *ct, cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); cairo_pattern_t *pattern; cairo_t *ct2; double temp_size = 2; /* calculate radius using, pi * square (r) = % of hatch area */ double rad = sqrt ((10.0 * hatch_size * hatch_size) / (2 * PI * 100.0)); cairo_surface_t *temp = cairo_surface_create_similar (cairo_get_target (ct), CAIRO_CONTENT_COLOR_ALPHA, temp_size, temp_size); if (cairo_surface_status (temp) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (temp); return CAIRO_STATUS_NO_MEMORY; } /* draw a 50% hatch */ ct2 = create_hatch_context (temp, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) { cairo_surface_destroy (temp); return CAIRO_STATUS_NO_MEMORY; } /* draw background */ draw_background (ct2, hbr->backColor, temp_size, temp_size); /* draw two diagonal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_rectangle (ct2, 0, 0, temp_size / 2.0, temp_size / 2.0); cairo_rectangle (ct2, temp_size / 2.0, temp_size / 2.0, temp_size, temp_size); cairo_fill (ct2); /* set the pattern for the consequent fill or stroke */ pattern = cairo_pattern_create_for_surface (temp); if (cairo_pattern_status (pattern) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (temp); cairo_destroy (ct2); cairo_pattern_destroy (pattern); return CAIRO_STATUS_NO_MEMORY; } cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); /* Clean up 50% */ cairo_surface_destroy (temp); cairo_destroy (ct2); /* temp hatch is used as background, so we get 50% hatch */ ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) { cairo_pattern_destroy (pattern); return CAIRO_STATUS_NO_MEMORY; } cairo_set_source (ct2, pattern); cairo_rectangle (ct2, 0, 0, hatch_size, hatch_size); cairo_fill (ct2); /* foreground is filled with 10% hatch of background color */ set_color (ct2, hbr->backColor); /* 0.5 is added for pixel adjustment. It's ugly but it makes output better. */ /* draw four semi circles in the foregound to make dots */ /* left middle */ cairo_arc (ct2, 0, hatch_size / 2.0, rad, - PI / 2.0, PI / 2.0); cairo_fill (ct2); /* top middle */ cairo_arc (ct2, hatch_size / 2.0, 0, rad, 0, PI); cairo_fill (ct2); /* bottom middle */ cairo_arc (ct2, hatch_size / 2.0, hatch_size, rad, - PI, 0); cairo_fill (ct2); /* right middle */ cairo_arc (ct2, hatch_size, hatch_size / 2.0, rad, PI / 2.0, - PI / 2.0); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); cairo_pattern_destroy (pattern); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_50_percent_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw two rectangles in the foreground */ set_color (ct2, hbr->foreColor); cairo_rectangle (ct2, 0, 0, hatch_size / 2.0, hatch_size / 2.0); cairo_rectangle (ct2, hatch_size / 2.0, hatch_size / 2.0, hatch_size, hatch_size); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_downward_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw diagonal line in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_dark_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw diagonal line in the foreground */ set_color (ct2, hbr->foreColor); if (hbr->hatchStyle == HatchStyleDarkDownwardDiagonal) { cairo_rectangle (ct2, 0, 0, 2, 1); cairo_rectangle (ct2, 1, 1, 2, 1); cairo_rectangle (ct2, 2, 2, 2, 1); cairo_rectangle (ct2, 0, 3, 1, 1); cairo_rectangle (ct2, 3, 3, 1, 1); } else { cairo_rectangle (ct2, 1, 3, 2, 1); cairo_rectangle (ct2, 2, 2, 2, 1); cairo_rectangle (ct2, 3, 1, 1, 1); cairo_rectangle (ct2, 0, 1, 1, 1); cairo_rectangle (ct2, 0, 0, 2, 1); } cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_upward_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw diagonal line in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_move_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_dashed_diagonal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); /* draw slant line in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); if (hbr->hatchStyle == HatchStyleDashedUpwardDiagonal) { /* 45 deg slant line */ cairo_move_to (ct2, hatch_wd + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, hatch_wd + CAIRO_AA_OFFSET_Y); } else { /* HatchStyleDashedDownwardDiagonal */ /* -45 deg slant line */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_wd, hatch_wd - CAIRO_AA_OFFSET_Y); } cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_dashed_horizontal_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); double line_width = gdip_hatch_get_line_width (hbr); double line_space = 4; double dash_len = 4; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); /* draw horizontal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* upper left dash */ cairo_move_to (ct2, 0, line_space / 2 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, dash_len, line_space / 2 + CAIRO_AA_OFFSET_Y); /* lower right dash */ cairo_move_to (ct2, hatch_wd - dash_len + CAIRO_AA_OFFSET_X, hatch_ht - line_space / 2 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_wd, hatch_ht - line_space / 2 + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_dashed_vertical_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); double line_width = gdip_hatch_get_line_width (hbr); double line_space = 4; double dash_len = 4; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); /* draw vertical lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* upper left dash */ cairo_move_to (ct2, line_space / 2 + CAIRO_AA_OFFSET_X, 0); cairo_line_to (ct2, line_space / 2 + CAIRO_AA_OFFSET_X, dash_len - CAIRO_AA_OFFSET_Y); /* lower right dash */ cairo_move_to (ct2, hatch_wd - line_space / 2 + CAIRO_AA_OFFSET_X, hatch_ht - dash_len + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_wd - line_space / 2 + CAIRO_AA_OFFSET_X, hatch_ht); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_confetti_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double confetti_size = (hbr->hatchStyle == HatchStyleLargeConfetti) ? 1.5 : 1.0; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw small rectangles in the foreground */ set_color (ct2, hbr->foreColor); /* draw four rectangles on the left reversed 'L' shape */ cairo_rectangle (ct2, 0, 0, confetti_size, confetti_size); cairo_rectangle (ct2, hatch_size / 8.0, hatch_size / 4.0, confetti_size, confetti_size); cairo_rectangle (ct2, 3 * hatch_size / 8.0, hatch_size / 2.0, confetti_size, confetti_size); cairo_rectangle (ct2, hatch_size / 4.0, 3 * hatch_size / 4.0, confetti_size, confetti_size); /* draw four rectangles on the other left reversed 'L' shape */ cairo_rectangle (ct2, hatch_size / 2.0, hatch_size / 8.0, confetti_size, confetti_size); cairo_rectangle (ct2, 3 * hatch_size / 4.0, 3 * hatch_size / 8.0, confetti_size, confetti_size); cairo_rectangle (ct2, 7 * hatch_size / 8.0, 5 * hatch_size / 8.0, confetti_size, confetti_size); cairo_rectangle (ct2, 5 * hatch_size / 8.0, 7 * hatch_size / 8.0, confetti_size, confetti_size); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_zigzag_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); set_color (ct2, hbr->foreColor); /* draw two diagonal lines in the foreground */ cairo_set_line_width (ct2, line_width); /* first half*/ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); /* second half */ cairo_move_to (ct2, hatch_size - 1 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, 1 - CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_wave_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); /* set foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* draw a horizontal 'S' shape */ cairo_move_to (ct2, 1.0 + CAIRO_AA_OFFSET_X, 1.0 + CAIRO_AA_OFFSET_Y); cairo_curve_to (ct2, 1.0 + CAIRO_AA_OFFSET_X, 1.0 + CAIRO_AA_OFFSET_Y, hatch_wd / 4.0 + CAIRO_AA_OFFSET_X, hatch_ht + CAIRO_AA_OFFSET_Y, hatch_wd / 2.0 + CAIRO_AA_OFFSET_X, hatch_ht / 2.0 + CAIRO_AA_OFFSET_Y); cairo_curve_to (ct2, hatch_wd / 2.0 + CAIRO_AA_OFFSET_X, hatch_ht / 2.0 + CAIRO_AA_OFFSET_Y, 3 * hatch_wd / 4.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y, hatch_wd - 1.0 + CAIRO_AA_OFFSET_X, hatch_ht - 1.0 + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_diagonal_brick_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* set foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* draw one full diagonal line and half of another diagonal line */ gdip_cairo_pixel (ct2, 0, 0); cairo_fill (ct2); cairo_move_to (ct2, CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_horizontal_brick_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* set foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* draw a 'C' shape */ cairo_move_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); /* draw lower connector */ cairo_move_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_weave_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); double dash [] = {0.5}; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* set foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); cairo_set_dash (ct2, dash, 1, 0); /* draw a reversed 'C' shape diagonally with one connector towards * one of the other two vertices of the square and three connectors * towards the fourth vertex. */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); /* this makes up one of the lower connectors also */ cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); /* complete the diagonal 'C' shape */ cairo_move_to (ct2, 3 * hatch_size / 4.0 + CAIRO_AA_OFFSET_X, hatch_size / 4.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); /* draw one upper connector */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 4.0 + CAIRO_AA_OFFSET_X, hatch_size / 4.0 + CAIRO_AA_OFFSET_Y); /* draw lower connectors */ cairo_move_to (ct2, hatch_size / 4.0 + CAIRO_AA_OFFSET_X, 3 * hatch_size / 4.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_move_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_plaid_hatch (cairo_t *ct, cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double temp_size = 2; cairo_t *ct2; cairo_pattern_t *pattern; /* draw one hatch that has 50% of area as 50% hatch and remaining area * equally covered by each of foreground and background colors. */ cairo_surface_t *temp = cairo_surface_create_similar (cairo_get_target (ct), CAIRO_CONTENT_COLOR_ALPHA, temp_size, temp_size); if (cairo_surface_status (temp) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (temp); return CAIRO_STATUS_NO_MEMORY; } /* draw a 50% hatch */ ct2 = create_hatch_context (temp, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) { cairo_surface_destroy (temp); return CAIRO_STATUS_NO_MEMORY; } /* draw background */ draw_background (ct2, hbr->backColor, temp_size, temp_size); /* draw two diagonal lines in the foreground */ set_color (ct2, hbr->foreColor); cairo_rectangle (ct2, 0, 0, temp_size / 2.0, temp_size / 2.0); cairo_rectangle (ct2, temp_size / 2.0, temp_size / 2.0, temp_size, temp_size); cairo_fill (ct2); /* create the pattern for the consequent fill or stroke */ pattern = cairo_pattern_create_for_surface (temp); if (cairo_pattern_status (pattern) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (temp); cairo_destroy (ct2); cairo_pattern_destroy (pattern); return CAIRO_STATUS_NO_MEMORY; } cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT); /* Clean up the 50% objects */ cairo_surface_destroy (temp); cairo_destroy (ct2); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) { cairo_pattern_destroy (pattern); return CAIRO_STATUS_NO_MEMORY; } /* temp hatch is used to fill 50% of area */ cairo_set_source(ct2, pattern); cairo_rectangle (ct2, 0, 0, hatch_size, hatch_size / 2.0); cairo_fill (ct2); /* draw two rectangle in the foregound to make up 50% of plaid */ /* foreground is filled with 25% of background color and 25% of foreground color */ set_color (ct2, hbr->foreColor); cairo_rectangle (ct2, 0, hatch_size / 2.0, hatch_size / 2.0, hatch_size / 2.0); cairo_fill (ct2); set_color (ct2, hbr->backColor); cairo_rectangle (ct2, hatch_size / 2.0, hatch_size / 2.0, hatch_size / 2.0, hatch_size / 2.0); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); cairo_pattern_destroy (pattern); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_divot_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); double x, y; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* set foreground */ set_color (ct2, hbr->foreColor); cairo_set_line_width (ct2, line_width); /* draw two angle brackets in the foreground */ x = hatch_size / 8.0 + CAIRO_AA_OFFSET_X; y = hatch_size / 8.0 + CAIRO_AA_OFFSET_Y; gdip_cairo_pixel (ct2, x, y); gdip_cairo_pixel (ct2, x + 1, y + 1); gdip_cairo_pixel (ct2, x, y + 2); x += 5; y += 6; gdip_cairo_pixel (ct2, x, y); gdip_cairo_pixel (ct2, x - 1, y - 1); gdip_cairo_pixel (ct2, x, y - 2); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_solid_diamond_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_wd = gdip_hatch_get_width (hbr); double hatch_ht = gdip_hatch_get_height (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_BUTT, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_wd, hatch_ht); /* draw two triangles in the foreground with left and right sides as their bases */ set_color (ct2, hbr->foreColor); /* draw left triangle */ cairo_move_to (ct2, -0.5, 0.5); cairo_line_to (ct2, hatch_wd / 2.0 - 0.5, hatch_ht / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, 0, hatch_ht); cairo_close_path (ct2); cairo_fill (ct2); /* draw right triangle */ cairo_move_to (ct2, hatch_wd, 0.5); cairo_line_to (ct2, hatch_wd / 2.0 + 0.5, hatch_ht / 2.0); cairo_line_to (ct2, hatch_wd, hatch_ht); cairo_close_path (ct2); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_shingle_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); double dash [] = {1.0}; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw two curves in the foreground */ set_color (ct2, hbr->foreColor); cairo_set_dash (ct2, dash, 1, 0); cairo_set_line_width (ct2, line_width); /* draw a curve thru left top, center and right top corners */ cairo_move_to (ct2, CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size / 4.0 + CAIRO_AA_OFFSET_X, hatch_size / 4.0 + CAIRO_AA_OFFSET_Y); cairo_curve_to (ct2, hatch_size / 4.0 + CAIRO_AA_OFFSET_X, hatch_size / 4.0 + CAIRO_AA_OFFSET_Y, hatch_size / 2.0 + CAIRO_AA_OFFSET_X, hatch_size / 2.0 + CAIRO_AA_OFFSET_Y, 3 * hatch_size / 4.0 + CAIRO_AA_OFFSET_X, hatch_size / 4.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size + CAIRO_AA_OFFSET_X, CAIRO_AA_OFFSET_Y); /* draw a quarter circle thru center and right bottom corner */ cairo_arc (ct2, CAIRO_AA_OFFSET_X, hatch_size + CAIRO_AA_OFFSET_Y, hatch_size, -PI/4.0, 0); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_trellis_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* note: we swap the colors (easier to draw this way) */ /* draw background */ draw_background (ct2, hbr->foreColor, hatch_size, hatch_size); /* draw rectangles in the foreground */ set_color (ct2, hbr->backColor); /* upper left rectangle */ cairo_rectangle (ct2,0, hatch_size / 4.0, hatch_size / 2.0, hatch_size / 4.0); /* lower right rectangle */ cairo_rectangle (ct2, hatch_size / 2.0, 3 * hatch_size / 4.0, hatch_size / 2.0, hatch_size / 4.0); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_sphere_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); double line_width = gdip_hatch_get_line_width (hbr); double rad = hatch_size / 4.0 + 0.5; /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw half circles in the foreground */ set_color (ct2, hbr->foreColor); /* left middle */ cairo_arc (ct2, 0, hatch_size / 2.0, rad, - PI / 2.0, PI / 2.0); cairo_fill (ct2); /* top middle */ cairo_arc (ct2, hatch_size / 2.0, 0, rad, 0, PI); cairo_fill (ct2); /* bottom middle */ cairo_arc (ct2, hatch_size / 2.0, hatch_size, rad, - PI, 0); cairo_fill (ct2); /* right middle */ cairo_arc (ct2, hatch_size, hatch_size / 2.0, rad, PI / 2.0, - PI / 2.0); cairo_fill (ct2); /* draw lines to mark sphere shining */ set_color (ct2, hbr->backColor); cairo_set_line_width (ct2, line_width); /* first line */ cairo_move_to (ct2, hatch_size - 1.0, hatch_size / 2.0 - rad / 2.0 + CAIRO_AA_OFFSET_Y); cairo_line_to (ct2, hatch_size - rad / 2.0 + CAIRO_AA_OFFSET_X, hatch_size / 2.0 - rad / 2.0 + CAIRO_AA_OFFSET_Y); /* second line */ cairo_move_to (ct2, hatch_size / 2.0 - rad / 4.0, hatch_size - rad / 2.0); cairo_line_to (ct2, hatch_size / 2.0 + rad / 4.0 - 1.0, hatch_size - rad / 2.0); cairo_stroke (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t draw_checker_hatch (cairo_surface_t *hatch, GpHatch *hbr) { double hatch_size = gdip_hatch_get_width (hbr); /* draw one hatch that has two colored squares at upper left and lower right corners */ /* hatch is not supposed to be affected by user matrix (so we create a new context) */ cairo_t *ct2 = create_hatch_context (hatch, CAIRO_LINE_CAP_SQUARE, FALSE); if (ct2 == NULL) return CAIRO_STATUS_NO_MEMORY; /* draw background */ draw_background (ct2, hbr->backColor, hatch_size, hatch_size); /* draw squares in the foreground */ set_color (ct2, hbr->foreColor); /* upper left square */ cairo_rectangle (ct2, 0, 0, hatch_size / 2.0, hatch_size / 2.0); /* lower right square */ cairo_rectangle (ct2, hatch_size / 2.0, hatch_size / 2.0, hatch_size, hatch_size); cairo_fill (ct2); /* clean up */ cairo_destroy (ct2); return CAIRO_STATUS_SUCCESS; } GpStatus gdip_hatch_setup (GpGraphics *graphics, GpBrush *brush) { GpHatch *hbr; cairo_t *ct; cairo_status_t status; if (!graphics || !brush) return InvalidParameter; ct = graphics->ct; if (!ct) return InvalidParameter; /* We create the new pattern for brush, if the brush is changed * or if pattern has not been created yet. */ hbr = (GpHatch *) brush; if (hbr->base.changed || (hbr->pattern) == NULL) { cairo_surface_t *hatch; cairo_antialias_t alias; int width = gdip_hatch_get_width (hbr); int height = gdip_hatch_get_height (hbr); /* destroy the existing pattern */ if (hbr->pattern) cairo_pattern_destroy (hbr->pattern); hatch = cairo_surface_create_similar (cairo_get_target (ct), CAIRO_CONTENT_COLOR_ALPHA, width, height); status = cairo_surface_status (hatch); if (status != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (hatch); return gdip_get_status (status); } alias = cairo_get_antialias (ct); cairo_set_antialias(ct, CAIRO_ANTIALIAS_NONE); switch (hbr->hatchStyle) { /* case HatchStyleMin: */ case HatchStyleHorizontal: case HatchStyleLightHorizontal: case HatchStyleNarrowHorizontal: case HatchStyleDarkHorizontal: status = draw_horizontal_hatch (hatch, hbr); break; case HatchStyleVertical: case HatchStyleLightVertical: case HatchStyleNarrowVertical: case HatchStyleDarkVertical: status = draw_vertical_hatch (hatch, hbr); break; case HatchStyleForwardDiagonal: status = draw_forward_diagonal_hatch (hatch, hbr); break; case HatchStyleBackwardDiagonal: status = draw_backward_diagonal_hatch (hatch, hbr); break; /* case HatchStyleCross: */ case HatchStyleLargeGrid: case HatchStyleSmallGrid: case HatchStyleDottedGrid: status = draw_cross_hatch (hatch, hbr); break; case HatchStyleDiagonalCross: status = draw_diagonal_cross_hatch (hatch, hbr); break; case HatchStyle05Percent: case HatchStyle10Percent: case HatchStyle20Percent: case HatchStyle25Percent: case HatchStyle70Percent: /* same as 25% but colors will be reversed (not a typo for 75) */ case HatchStyle75Percent: /* same as 20% but colors will be reversed (not a typo for 80) */ case HatchStyle80Percent: /* same as 10% but colors will be reversed (not a typo for 90) */ case HatchStyle90Percent: /* same as 5% but colors will be reversed (not a typo) */ status = draw_percent_hatch (hatch, hbr); break; case HatchStyle30Percent: case HatchStyle60Percent: /* same as 30% but colors will be reversed (not a typo for 70) */ case HatchStyleOutlinedDiamond: /* hack: perfect width */ case HatchStyleDottedDiamond: /* hack */ status = draw_30_percent_hatch (hatch, hbr); break; case HatchStyle40Percent: status = draw_40_percent_hatch (ct, hatch, hbr); break; case HatchStyle50Percent: status = draw_50_percent_hatch (hatch, hbr); break; case HatchStyleLightDownwardDiagonal: case HatchStyleWideDownwardDiagonal: status = draw_downward_diagonal_hatch (hatch, hbr); break; case HatchStyleDarkUpwardDiagonal: case HatchStyleDarkDownwardDiagonal: status = draw_dark_diagonal_hatch (hatch, hbr); break; case HatchStyleLightUpwardDiagonal: case HatchStyleWideUpwardDiagonal: status = draw_upward_diagonal_hatch (hatch, hbr); break; case HatchStyleDashedDownwardDiagonal: case HatchStyleDashedUpwardDiagonal: status = draw_dashed_diagonal_hatch (hatch, hbr); break; case HatchStyleDashedHorizontal: status = draw_dashed_horizontal_hatch (hatch, hbr); break; case HatchStyleDashedVertical: status = draw_dashed_vertical_hatch (hatch, hbr); break; case HatchStyleSmallConfetti: case HatchStyleLargeConfetti: status = draw_confetti_hatch (hatch, hbr); break; case HatchStyleZigZag: status = draw_zigzag_hatch (hatch, hbr); break; case HatchStyleWave: status = draw_wave_hatch (hatch, hbr); break; case HatchStyleDiagonalBrick: status = draw_diagonal_brick_hatch (hatch, hbr); break; case HatchStyleHorizontalBrick: status = draw_horizontal_brick_hatch (hatch, hbr); break; case HatchStyleWeave: status = draw_weave_hatch (hatch, hbr); break; case HatchStylePlaid: status = draw_plaid_hatch (ct, hatch, hbr); break; case HatchStyleDivot: status = draw_divot_hatch (hatch, hbr); break; case HatchStyleShingle: status = draw_shingle_hatch (hatch, hbr); break; case HatchStyleTrellis: status = draw_trellis_hatch (hatch, hbr); break; case HatchStyleSphere: status = draw_sphere_hatch (hatch, hbr); break; case HatchStyleSmallCheckerBoard: case HatchStyleLargeCheckerBoard: status = draw_checker_hatch (hatch, hbr); break; /* case HatchStyleMax: */ case HatchStyleSolidDiamond: status = draw_solid_diamond_hatch (hatch, hbr); break; default: status = CAIRO_STATUS_INVALID_RESTORE; /* will be converted into InvalidParameter */ break; } cairo_set_antialias (ct, alias); if (status != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (hatch); return gdip_get_status (status); } /* create and verity the pattern created from the surface */ hbr->pattern = cairo_pattern_create_for_surface (hatch); status = cairo_pattern_status (hbr->pattern); if (status != CAIRO_STATUS_SUCCESS) { cairo_pattern_destroy (hbr->pattern); hbr->pattern = NULL; cairo_surface_destroy (hatch); return gdip_get_status (status); } /* finally set the pattern into the context and destroy the hatch surface */ cairo_pattern_set_extend (hbr->pattern, CAIRO_EXTEND_REPEAT); cairo_surface_destroy (hatch); } cairo_set_source (ct, hbr->pattern); return gdip_get_status (cairo_status (ct)); } GpStatus gdip_hatch_clone (GpBrush *brush, GpBrush **clonedBrush) { GpHatch *result; GpHatch *hatch; if (!brush || !clonedBrush) return InvalidParameter; result = (GpHatch *) GdipAlloc (sizeof (GpHatch)); if (!result) { *clonedBrush = NULL; return OutOfMemory; } hatch = (GpHatch *) brush; result->base = hatch->base; result->hatchStyle = hatch->hatchStyle; result->foreColor = hatch->foreColor; result->backColor = hatch->backColor; result->base.changed = TRUE; result->pattern = NULL; *clonedBrush = (GpBrush *) result; return Ok; } GpStatus gdip_hatch_destroy (GpBrush *brush) { /* a. the NULL check for brush is done by the caller, GdipDeleteBrush */ /* b. brush itself is freed by the caller */ GpHatch *hbr = (GpHatch *) brush; if (hbr->pattern) { cairo_pattern_destroy (hbr->pattern); hbr->pattern = NULL; } return Ok; } // coverity[+alloc : arg-*3] GpStatus GdipCreateHatchBrush (GpHatchStyle hatchstyle, ARGB forecolor, ARGB backcolor, GpHatch **brush) { if (!brush) return InvalidParameter; *brush = gdip_hatch_new (); if (!*brush) return OutOfMemory; (*brush)->hatchStyle = hatchstyle; (*brush)->foreColor = forecolor; (*brush)->backColor = backcolor; return Ok; } GpStatus GdipGetHatchStyle (GpHatch *brush, GpHatchStyle *hatchstyle) { if (!brush || !hatchstyle) return InvalidParameter; *hatchstyle = brush->hatchStyle; return Ok; } GpStatus GdipGetHatchForegroundColor (GpHatch *brush, ARGB *forecolor) { if (!brush || !forecolor) return InvalidParameter; *forecolor = brush->foreColor; return Ok; } GpStatus GdipGetHatchBackgroundColor (GpHatch *brush, ARGB *backcolor) { if (!brush || !backcolor) return InvalidParameter; *backcolor = brush->backColor; return Ok; } libgdiplus-2.11/src/gifcodec.h0000664000175000017500000000161512225470167013232 00000000000000/* * gifcodec.h : Contains function declarations for encoding decoding gif images * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * * Copyright (C) 2003-2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef _GIFCODEC_H #define _GIFCODEC_H #include "bitmap-private.h" #include "bmpcodec.h" GpStatus gdip_load_gif_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_gif_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seekFunc, GpImage **image) GDIP_INTERNAL; GpStatus gdip_save_gif_image_to_file (unsigned char *filename, GpImage *image) GDIP_INTERNAL; GpStatus gdip_save_gif_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) GDIP_INTERNAL; ImageCodecInfo *gdip_getcodecinfo_gif () GDIP_INTERNAL; #endif /* _GIFCODEC_H */ libgdiplus-2.11/src/imageattributes.c0000664000175000017500000003245612225470167014662 00000000000000/* * Copyright (c) 2004-2005 Ximian * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Jordi Mas i Hernandez , 2004-2005 * Sebastien Pouliot * */ #include "imageattributes-private.h" #include "bitmap-private.h" static void gdip_init_image_attribute (GpImageAttribute* attr) { attr->colormap = NULL; attr->colormap_elem = 0; attr->gamma_correction = 0.0f; attr->key_colorlow = 0; attr->key_colorhigh = 0; attr->key_enabled = FALSE; attr->colormatrix = NULL; attr->graymatrix = NULL; attr->colormatrix_flags = ColorMatrixFlagsDefault; attr->colormatrix_enabled = FALSE; } static void gdip_dispose_image_attribute (GpImageAttribute* attr) { if (attr->colormap) { GdipFree (attr->colormap); attr->colormap = NULL; } if (attr->colormatrix) { GdipFree (attr->colormatrix); attr->colormatrix = NULL; } if (attr->graymatrix) { GdipFree (attr->graymatrix); attr->graymatrix = NULL; } } static GpImageAttribute* gdip_get_image_attribute (GpImageAttributes* attr, ColorAdjustType type) { switch (type) { case ColorAdjustTypeDefault: return &attr->def; case ColorAdjustTypeBitmap: return &attr->bitmap; case ColorAdjustTypeBrush: return &attr->brush; case ColorAdjustTypePen: return &attr->pen; case ColorAdjustTypeText: return &attr->text; default: return NULL; } } void gdip_process_bitmap_attributes (GpBitmap *bitmap, void **dest, GpImageAttributes* attr, BOOL *allocated) { GpImageAttribute *imgattr, *def; GpImageAttribute *colormap, *gamma, *trans, *cmatrix; GpBitmap *bmpdest; int x,y, cnt; ARGB color; BYTE *color_p = (BYTE*) &color; *allocated = FALSE; bmpdest = NULL; if (!bitmap || !dest || !attr) return; imgattr = gdip_get_image_attribute (attr, ColorAdjustTypeBitmap); if (!imgattr) return; def = gdip_get_image_attribute (attr, ColorAdjustTypeDefault); if (imgattr->colormap_elem) { colormap = imgattr; } else { colormap = def; } if (imgattr->gamma_correction) { gamma = imgattr; } else { gamma = def; } if (imgattr->key_enabled) { trans = imgattr; } else { trans = def; } if (imgattr->colormatrix_enabled && imgattr->colormatrix) { cmatrix = imgattr; } else { cmatrix = def; } if (colormap->colormap_elem || gamma->gamma_correction || trans->key_enabled || (cmatrix->colormatrix_enabled && cmatrix->colormatrix != NULL)) { bitmap->active_bitmap->pixel_format = PixelFormat32bppARGB; bmpdest = gdip_bitmap_new_with_frame(NULL, FALSE); gdip_bitmapdata_clone(bitmap->active_bitmap, &bmpdest->frames[0].bitmap, 1); bmpdest->frames[0].count = 1; gdip_bitmap_setactive(bmpdest, NULL, 0); *dest = bmpdest->active_bitmap->scan0; *allocated = TRUE; } /* We use get/set pixel instead of direct buffer manipulation because it's a good way of keeping the pixel logic in a single place */ /* Color mapping */ if (colormap->colormap_elem) { for (y = 0; y active_bitmap->height; y++) { for (x = 0; x active_bitmap->width; x++) { ColorMap* clrmap = colormap->colormap; int found; GdipBitmapGetPixel (bmpdest, x, y, &color); for (cnt = 0; cnt < colormap->colormap_elem; cnt++, clrmap++) { if (color == clrmap->oldColor.Argb) { color = clrmap->newColor.Argb; GdipBitmapSetPixel (bmpdest, x, y, color); break; } } } } } /* Gamma correction */ if (gamma->gamma_correction) { for (y = 0; y < bitmap->active_bitmap->height; y++) { for (x = 0; x < bitmap->active_bitmap->width; x++) { BYTE r,g,b,a; GdipBitmapGetPixel (bmpdest, x, y, &color); a = (color & 0xff000000) >> 24; r = (color & 0x00ff0000) >> 16; g = (color & 0x0000ff00) >> 8; b = (color & 0x000000ff); /* FIXME: This is not the right gamma GDI + correction algorithm */ /* r = (int) powf (r, (1 / gamma->gamma_correction)); g = (int) powf (g, (1 / gamma->gamma_correction)); b = (int) powf (b, (1 / gamma->gamma_correction)); a = (int) powf (a, (1 / gamma->gamma_correction));*/ color = b | (g << 8) | (r << 16) | (a << 24); GdipBitmapSetPixel (bmpdest, x, y, color); } } } /* Apply transparency range */ if (trans->key_enabled) { for (y = 0; y < bitmap->active_bitmap->height; y++) { for (x = 0; x < bitmap->active_bitmap->width; x++) { GdipBitmapGetPixel (bmpdest, x, y, &color); if (color >= trans->key_colorlow && color <= trans->key_colorhigh) { color = color & 0x00ffffff; /* Alpha = 0 */ GdipBitmapSetPixel (bmpdest, x, y, color); } } } } /* Apply Color Matrix */ if (cmatrix->colormatrix_enabled && cmatrix->colormatrix) { BitmapData *data = bmpdest->active_bitmap; BYTE *v = ((BYTE*)data->scan0); ARGB *scan; ColorMatrixFlags flags = cmatrix->colormatrix_flags; ColorMatrix *cm; for (y = 0; y < data->height; y++) { scan = (ARGB*) v; for (x = 0; x < data->width; x++) { BYTE r,g,b,a; int r_new,g_new,b_new,a_new; get_pixel_bgra (*scan, b, g, r, a); /* by default the matrix applies to all colors, including grays */ if ((flags != ColorMatrixFlagsDefault) && (b == g) && (b == r)) { if (flags == ColorMatrixFlagsSkipGrays) { /* does not apply */ scan++; continue; } /* ColorMatrixFlagsAltGray */ cm = cmatrix->graymatrix; } else { cm = cmatrix->colormatrix; } a_new = (r * cm->m[0][3] + g * cm->m[1][3] + b * cm->m[2][3] + a * cm->m[3][3] + (255 * cm->m[4][3])); if (a_new == 0) { /* 100% transparency, don't waste time computing other values (pre-mul will always be 0) */ *scan++ = 0; } else { r_new = (r * cm->m[0][0] + g * cm->m[1][0] + b * cm->m[2][0] + a * cm->m[3][0] + (255 * cm->m[4][0])); g_new = (r * cm->m[0][1] + g * cm->m[1][1] + b * cm->m[2][1] + a * cm->m[3][1] + (255 * cm->m[4][1])); b_new = (r * cm->m[0][2] + g * cm->m[1][2] + b * cm->m[2][2] + a * cm->m[3][2] + (255 * cm->m[4][2])); r = (r_new > 0xff) ? 0xff : (BYTE) r_new; g = (g_new > 0xff) ? 0xff : (BYTE) g_new; b = (b_new > 0xff) ? 0xff : (BYTE) b_new; /* remember that Cairo use pre-multiplied alpha, e.g. 50% red == 0x80800000 not 0x80ff0000 */ a = (BYTE) a_new; if (a < 0xff) { r = pre_multiplied_table [r][a]; g = pre_multiplied_table [g][a]; b = pre_multiplied_table [b][a]; } set_pixel_bgra (color_p, 0, b, g, r, a); *scan++ = color; } } v += data->stride; } } if (bmpdest != NULL) { bmpdest->active_bitmap->scan0 = NULL; gdip_bitmap_dispose(bmpdest); } } /* coverity[+alloc : arg-*0] */ GpStatus GdipCreateImageAttributes (GpImageAttributes **imageattr) { GpImageAttributes *result; if (!imageattr) return InvalidParameter; result = (GpImageAttributes *) GdipAlloc (sizeof (GpImageAttributes)); if (!result) { *imageattr = NULL; return OutOfMemory; } gdip_init_image_attribute (&result->def); gdip_init_image_attribute (&result->bitmap); gdip_init_image_attribute (&result->brush); gdip_init_image_attribute (&result->pen); gdip_init_image_attribute (&result->text); result->color = 0; result->wrapmode = WrapModeClamp; *imageattr = result; return Ok; } /* coverity[+alloc : arg-*1] */ GpStatus GdipCloneImageAttributes (GDIPCONST GpImageAttributes *imageattr, GpImageAttributes **cloneImageattr) { GpImageAttributes *result; if (!imageattr || !cloneImageattr) return InvalidParameter; result = (GpImageAttributes *) GdipAlloc (sizeof (GpImageAttributes)); if (!result) { *cloneImageattr = NULL; return OutOfMemory; } memcpy (result, imageattr, sizeof (GpImageAttributes)); *cloneImageattr = result; return Ok; } GpStatus GdipDisposeImageAttributes (GpImageAttributes *imageattr) { if (!imageattr) return InvalidParameter; gdip_dispose_image_attribute (&imageattr->def); gdip_dispose_image_attribute (&imageattr->bitmap); gdip_dispose_image_attribute (&imageattr->brush); gdip_dispose_image_attribute (&imageattr->pen); gdip_dispose_image_attribute (&imageattr->text); GdipFree (imageattr); return Ok; } GpStatus GdipSetImageAttributesThreshold ( GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, float threshold) { return NotImplemented; } GpStatus GdipSetImageAttributesGamma (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, float gamma) { GpImageAttribute *imgattr; if (!imageattr) return InvalidParameter; imgattr = gdip_get_image_attribute (imageattr, type); if (!imgattr) return InvalidParameter; if (enableFlag) imgattr->gamma_correction = gamma; else imgattr->gamma_correction = 0.0f; return Ok; } GpStatus GdipSetImageAttributesNoOp (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag) { GpImageAttribute *imgattr; if (!imageattr) return InvalidParameter; imgattr = gdip_get_image_attribute (imageattr, type); if (!imgattr) return InvalidParameter; imgattr->no_op = enableFlag; return Ok; } GpStatus GdipSetImageAttributesColorKeys (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, ARGB colorLow, ARGB colorHigh) { GpImageAttribute *imgattr; if (!imageattr) return InvalidParameter; imgattr = gdip_get_image_attribute (imageattr, type); if (!imgattr) return InvalidParameter; imgattr->key_colorlow = colorLow; imgattr->key_colorhigh = colorHigh; imgattr->key_enabled = enableFlag; return Ok; } GpStatus GdipSetImageAttributesOutputChannelColorProfile (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, GDIPCONST WCHAR *colorProfileFilename) { return NotImplemented; } GpStatus GdipSetImageAttributesRemapTable (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, UINT mapSize, GDIPCONST ColorMap *map) { GpImageAttribute *imgattr; if (!imageattr || !map) return InvalidParameter; imgattr = gdip_get_image_attribute (imageattr, type); if (!imgattr) return InvalidParameter; if (!enableFlag) { /* Acts as clean */ GdipFree (imgattr->colormap); imgattr->colormap = NULL; imgattr->colormap_elem = 0; return Ok; } if (imgattr->colormap) GdipFree (imgattr->colormap); /* Copy colormap table*/ if (mapSize > 0) { int size = mapSize * sizeof (ColorMap); imgattr->colormap = GdipAlloc (size); if (!imgattr->colormap) return OutOfMemory; memcpy (imgattr->colormap, map, size); } else { imgattr->colormap = NULL; } imgattr->colormap_elem = mapSize; return Ok; } /* According to Microsoft documentation: clamp: This parameter has no effect in Microsoft® Windows® GDI+ version 1.0 */ GpStatus GdipSetImageAttributesWrapMode (GpImageAttributes *imageattr, WrapMode wrap, ARGB argb, BOOL clamp) { if (!imageattr) return InvalidParameter; imageattr->wrapmode = wrap; imageattr->color = argb; return Ok; } GpStatus GdipGetImageAttributesAdjustedPalette (GpImageAttributes *imageattr, ColorPalette *colorPalette, ColorAdjustType type) { return NotImplemented; } GpStatus GdipSetImageAttributesColorMatrix (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, GDIPCONST ColorMatrix* colorMatrix, GDIPCONST ColorMatrix* grayMatrix, ColorMatrixFlags flags) { GpImageAttribute *imgattr; if (!imageattr || (!colorMatrix && enableFlag) || (flags < ColorMatrixFlagsDefault)) return InvalidParameter; if (flags > (grayMatrix ? ColorMatrixFlagsAltGray : ColorMatrixFlagsSkipGrays)) return InvalidParameter; imgattr = gdip_get_image_attribute (imageattr, type); if (!imgattr) return InvalidParameter; if (colorMatrix) { if (!imgattr->colormatrix) { imgattr->colormatrix = GdipAlloc (sizeof (ColorMatrix)); if (!imgattr->colormatrix) return OutOfMemory; } memcpy (imgattr->colormatrix, colorMatrix, sizeof (ColorMatrix)); } if (grayMatrix) { if (!imgattr->graymatrix) { imgattr->graymatrix = GdipAlloc (sizeof (ColorMatrix)); if (!imgattr->graymatrix) return OutOfMemory; } memcpy (imgattr->graymatrix, grayMatrix, sizeof (ColorMatrix)); } imgattr->colormatrix_flags = flags; imgattr->colormatrix_enabled = enableFlag; return Ok; } GpStatus GdipSetImageAttributesOutputChannel (GpImageAttributes *imageattr, ColorAdjustType type, BOOL enableFlag, ColorChannelFlags channelFlags) { return NotImplemented; } libgdiplus-2.11/src/lineargradientbrush.c0000664000175000017500000010326512225470167015522 00000000000000/* * lineargradientbrush.c * * Copyright (C) 2003-2004,2007 Novell, Inc. http://www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Author: * Ravindra (rkumar@novell.com) * */ #include "lineargradientbrush-private.h" #include "graphics-private.h" #include "matrix-private.h" static GpStatus gdip_linear_gradient_setup (GpGraphics *graphics, GpBrush *brush); static GpStatus gdip_linear_gradient_clone_brush (GpBrush *brush, GpBrush **clonedBrush); static GpStatus gdip_linear_gradient_destroy (GpBrush *brush); /* * we have a single copy of vtable for * all instances of lineargradient brush. */ static BrushClass vtable = { BrushTypeLinearGradient, gdip_linear_gradient_setup, gdip_linear_gradient_clone_brush, gdip_linear_gradient_destroy }; static void gdip_linear_gradient_init (GpLineGradient *linear) { gdip_brush_init (&linear->base, &vtable); linear->wrapMode = WrapModeTile; cairo_matrix_init_identity (&linear->matrix); linear->rectangle.X = linear->rectangle.Y = linear->rectangle.Width = linear->rectangle.Height = 0.0f; linear->gammaCorrection = FALSE; linear->angle = 0.0; linear->isAngleScalable = FALSE; linear->presetColors = (InterpolationColors *) GdipAlloc (sizeof (InterpolationColors)); linear->presetColors->count = 0; linear->blend = (Blend *) GdipAlloc (sizeof (Blend)); linear->blend->count = 1; linear->blend->factors = (float *) GdipAlloc (sizeof (float)); linear->blend->positions = (float *) GdipAlloc (sizeof (float)); linear->blend->factors [0] = 1.0; linear->blend->positions[0] = 0.0; linear->pattern = NULL; } static GpLineGradient* gdip_linear_gradient_new (void) { GpLineGradient *result = (GpLineGradient *) GdipAlloc (sizeof (GpLineGradient)); if (result) gdip_linear_gradient_init (result); return result; } GpStatus gdip_linear_gradient_clone_brush (GpBrush *brush, GpBrush **clonedBrush) { GpLineGradient *linear; GpLineGradient *newbrush; if (!brush || !clonedBrush) return InvalidParameter; newbrush = (GpLineGradient *) GdipAlloc (sizeof (GpLineGradient)); if (!newbrush) return OutOfMemory; linear = (GpLineGradient *) brush; newbrush->base = linear->base; newbrush->wrapMode = linear->wrapMode; gdip_cairo_matrix_copy (&newbrush->matrix, &linear->matrix); memcpy (&newbrush->rectangle, &linear->rectangle, sizeof (GpRectF)); newbrush->gammaCorrection = linear->gammaCorrection; newbrush->angle = linear->angle; newbrush->isAngleScalable = linear->isAngleScalable; /* cloned brush needs to have its own pattern */ newbrush->base.changed = TRUE; newbrush->pattern = NULL; newbrush->lineColors [0] = linear->lineColors [0]; newbrush->lineColors [1] = linear->lineColors [1]; newbrush->points [0].X = linear->points [0].X; newbrush->points [0].Y = linear->points [0].Y; newbrush->points [1].X = linear->points [1].X; newbrush->points [1].Y = linear->points [1].Y; newbrush->presetColors = (InterpolationColors *) GdipAlloc (sizeof (InterpolationColors)); if (newbrush->presetColors == NULL) goto NO_PRESET; newbrush->presetColors->count = linear->presetColors->count; if (linear->presetColors->count > 0) { newbrush->presetColors->colors = (ARGB *) GdipAlloc (linear->presetColors->count * sizeof (ARGB)); if (newbrush->presetColors->colors == NULL) goto NO_PRESET_COLORS; memcpy (newbrush->presetColors->colors, linear->presetColors->colors, linear->presetColors->count * sizeof (ARGB)); newbrush->presetColors->positions = (float *) GdipAlloc (linear->presetColors->count * sizeof (float)); if (newbrush->presetColors->positions == NULL) goto NO_PRESET_POSITIONS; memcpy (newbrush->presetColors->positions, linear->presetColors->positions, linear->presetColors->count * sizeof (float)); } else { memcpy (newbrush->presetColors, linear->presetColors, sizeof (InterpolationColors)); } newbrush->blend = (Blend *) GdipAlloc (sizeof (Blend)); if (newbrush->blend == NULL) goto NO_BLEND; newbrush->blend->count = linear->blend->count; if (linear->blend->count > 0) { newbrush->blend->factors = (float *) GdipAlloc (linear->blend->count * sizeof (float)); if (newbrush->blend->factors == NULL) goto NO_BLEND_FACTORS; memcpy (newbrush->blend->factors, linear->blend->factors, linear->blend->count * sizeof (ARGB)); newbrush->blend->positions = (float *) GdipAlloc (linear->blend->count * sizeof (float)); if (newbrush->blend->positions == NULL) goto NO_BLEND_POSITIONS; memcpy (newbrush->blend->positions, linear->blend->positions, linear->blend->count * sizeof (float)); } else { memcpy (newbrush->blend, linear->blend, sizeof (Blend)); } goto SUCCESS; NO_BLEND_POSITIONS: GdipFree (newbrush->blend->factors); NO_BLEND_FACTORS: GdipFree (newbrush->blend); NO_BLEND: NO_PRESET_POSITIONS: GdipFree (newbrush->presetColors->colors); NO_PRESET_COLORS: GdipFree (newbrush->presetColors); NO_PRESET: GdipFree (newbrush); *clonedBrush = NULL; return OutOfMemory; SUCCESS: *clonedBrush = (GpBrush *) newbrush; return Ok; } GpStatus gdip_linear_gradient_destroy (GpBrush *brush) { /* a. the NULL check for brush is done by the caller, GdipDeleteBrush */ /* b. brush itself is freed by the caller */ GpLineGradient *linear = (GpLineGradient *) brush; if (linear->blend) { if (linear->blend->count > 0) { GdipFree (linear->blend->factors); GdipFree (linear->blend->positions); } GdipFree (linear->blend); linear->blend = NULL; } if (linear->presetColors) { if (linear->presetColors->count > 0) { GdipFree (linear->presetColors->colors); GdipFree (linear->presetColors->positions); } GdipFree (linear->presetColors); linear->presetColors = NULL; } if (linear->pattern) { cairo_pattern_destroy (linear->pattern); linear->pattern = NULL; } return Ok; } static void add_color_stops_from_blend (cairo_pattern_t *pattern, Blend *blend, ARGB *colors) { int index; double sr, sg, sb, sa; double er, eg, eb, ea; double offset, factor; sa = (colors[0] >> 24) & 0xFF; sr = (colors[0] >> 16) & 0xFF; sg = (colors[0] >> 8) & 0xFF; sb = colors[0] & 0xFF; ea = (colors[1] >> 24) & 0xFF; er = (colors[1] >> 16) & 0xFF; eg = (colors[1] >> 8) & 0xFF; eb = colors[1] & 0xFF; for (index = 0; index < blend->count; index++) { factor = blend->factors [index]; offset = blend->positions [index]; cairo_pattern_add_color_stop_rgba (pattern, offset, ((sr * (1 - factor)) + (er * factor)) / 255, ((sg * (1 - factor)) + (eg * factor)) / 255, ((sb * (1 - factor)) + (eb * factor)) / 255, ((sa * (1 - factor)) + (ea * factor)) / 255); } } static void add_color_stops_from_interpolation_colors (cairo_pattern_t *pattern, InterpolationColors *presetColors) { int index; double r, g, b, a; double offset; ARGB color; /* MS accecpts positions above 1.0 also. Cairo assumes the values above 1.0 as 1.0 * and values below 0 are assumed as 0. So we get different results if any of the * offset values is out of [0.0, 1.0]. */ for (index = 0; index < presetColors->count; index++) { color = presetColors->colors [index]; a = (color >> 24) & 0xFF; r = (color >> 16) & 0xFF; g = (color >> 8) & 0xFF; b = color & 0xFF; offset = presetColors->positions [index]; cairo_pattern_add_color_stop_rgba (pattern, offset, r / 255, g / 255, b / 255, a / 255); } } static void add_color_stops (cairo_pattern_t *pattern, ARGB *colors) { double r, g, b, a; a = (colors[0] >> 24) & 0xFF; r = (colors[0] >> 16) & 0xFF; g = (colors[0] >> 8) & 0xFF; b = colors[0] & 0xFF; /* set start color */ cairo_pattern_add_color_stop_rgba (pattern, 0.0, r / 255, g / 255, b / 255, a / 255); a = (colors[1] >> 24) & 0xFF; r = (colors[1] >> 16) & 0xFF; g = (colors[1] >> 8) & 0xFF; b = colors[1] & 0xFF; /* set end color */ cairo_pattern_add_color_stop_rgba (pattern, 1.0, r / 255, g / 255, b / 255, a / 255); } static GpStatus create_tile_linear (GpGraphics *graphics, cairo_t *ct, GpLineGradient *linear) { GpStatus status; cairo_pattern_t *pat; cairo_matrix_t matrix; GpRectF *rect; if (!graphics || !ct || !linear) return InvalidParameter; rect = &linear->rectangle; gdip_cairo_matrix_copy (&matrix, &linear->matrix); status = GdipInvertMatrix (&matrix); if (status != Ok) return status; pat = cairo_pattern_create_linear (linear->points [0].X, linear->points [0].Y, linear->points [1].X, linear->points [1].Y); status = gdip_get_pattern_status (pat); if (status != Ok) return status; cairo_pattern_set_matrix (pat, &matrix); if (linear->blend->count > 1) add_color_stops_from_blend (pat, linear->blend, linear->lineColors); else if (linear->presetColors->count > 1) add_color_stops_from_interpolation_colors (pat, linear->presetColors); else add_color_stops (pat, linear->lineColors); linear->pattern = pat; return Ok; } GpStatus gdip_linear_gradient_setup (GpGraphics *graphics, GpBrush *brush) { cairo_t *ct; GpLineGradient *linear; GpMatrix *product = NULL; GpStatus status = Ok; if (!graphics || !brush) return InvalidParameter; ct = graphics->ct; if (!ct) return InvalidParameter; linear = (GpLineGradient *) brush; /* We create the new pattern for brush, if the brush is changed * or if pattern has not been created yet. */ if (linear->base.changed || !linear->pattern) { /* destroy the existing pattern */ if (linear->pattern) { cairo_pattern_destroy (linear->pattern); linear->pattern = NULL; } if (linear->wrapMode == WrapModeClamp) return InvalidParameter; status = create_tile_linear (graphics, ct, linear); if ((status == Ok) && linear->pattern) { switch (linear->wrapMode) { case WrapModeTile: case WrapModeTileFlipY: cairo_pattern_set_extend (linear->pattern, CAIRO_EXTEND_REPEAT); break; case WrapModeTileFlipX: case WrapModeTileFlipXY: cairo_pattern_set_extend (linear->pattern, CAIRO_EXTEND_REFLECT); break; default : return InvalidParameter; // we will never get here but I hate warnings! } cairo_set_source (ct, linear->pattern); return gdip_get_status (cairo_status (ct)); } } if ((status == Ok) && linear->pattern) { cairo_set_source (ct, linear->pattern); return gdip_get_status (cairo_status (ct)); } return status; } static void gdip_linear_gradient_setup_initial_matrix (GpLineGradient *linear) { float cosAngle, sinAngle, absCosAngle, absSinAngle; float transX, transY, wRatio, hRatio, slope, rectRight, rectBottom; GpPointF pts[3]; GpRectF *rectf = &linear->rectangle; cosAngle = cos (linear->angle); sinAngle = sin (linear->angle); absCosAngle = fabs (cosAngle); absSinAngle = fabs (sinAngle); cairo_matrix_init_identity (&linear->matrix); transX = rectf->X + (rectf->Width / 2.0f); transY = rectf->Y + (rectf->Height / 2.0f); wRatio = (absCosAngle * rectf->Width + absSinAngle * rectf->Height) / rectf->Width; hRatio = (absSinAngle * rectf->Width + absCosAngle * rectf->Height) / rectf->Height; cairo_matrix_translate (&linear->matrix, transX, transY); cairo_matrix_rotate (&linear->matrix, linear->angle); cairo_matrix_scale (&linear->matrix, wRatio, hRatio); cairo_matrix_translate (&linear->matrix, -transX, -transY); if (linear->isAngleScalable && !gdip_near_zero (cosAngle) && !gdip_near_zero (sinAngle)) { rectRight = rectf->X + rectf->Width; rectBottom = rectf->Y + rectf->Height; pts[0].X = rectf->X; pts[0].Y = rectf->Y; pts[1].X = rectRight; pts[1].Y = rectf->Y; pts[2].X = rectf->X; pts[2].Y = rectBottom; GdipTransformMatrixPoints (&linear->matrix, pts, 3); if (sinAngle > 0 && cosAngle > 0) { slope = -1.0f / ((rectf->Width / rectf->Height) * tan (linear->angle)); pts[0].Y = (slope * (pts[0].X - rectf->X)) + rectf->Y; pts[1].X = ((pts[1].Y - rectBottom) / slope) + rectRight; pts[2].X = ((pts[2].Y - rectf->Y) / slope) + rectf->X; } else if (sinAngle > 0 && cosAngle < 0) { slope = -1.0f / ((rectf->Width / rectf->Height) * tan (linear->angle - PI / 2)); pts[0].X = ((pts[0].Y - rectBottom) / slope) + rectRight; pts[1].Y = (slope * (pts[1].X - rectRight)) + rectBottom; pts[2].Y = (slope * (pts[2].X - rectf->X)) + rectf->Y; } else if (sinAngle < 0 && cosAngle < 0) { slope = -1.0f / (((rectf->Width / rectf->Height) * tan (linear->angle))); pts[0].Y = (slope * (pts[0].X - rectRight)) + rectBottom; pts[1].X = ((pts[1].Y - rectf->Y) / slope) + rectf->X; pts[2].X = ((pts[2].Y - rectBottom) / slope) + rectRight; } else { slope = -1.0f / ((rectf->Width / rectf->Height) * tan (linear->angle - 3 * PI / 2)); pts[0].X = ((pts[0].Y - rectf->Y) / slope) + rectf->X; pts[1].Y = (slope * (pts[1].X - rectf->X)) + rectf->Y; pts[2].Y = (slope * (pts[2].X - rectRight)) + rectBottom; } gdip_matrix_init_from_rect_3points (&linear->matrix, rectf, (GpPointF*)&pts); } } // coverity[+alloc : arg-*5] GpStatus GdipCreateLineBrushI (GDIPCONST GpPoint *point1, GDIPCONST GpPoint *point2, ARGB color1, ARGB color2, GpWrapMode wrapMode, GpLineGradient **lineGradient) { GpPointF p1, p2; if (!point1 || !point2 || !lineGradient) return InvalidParameter; p1.X = point1->X; p1.Y = point1->Y; p2.X = point2->X; p2.Y = point2->Y; return GdipCreateLineBrush (&p1, &p2, color1, color2, wrapMode, lineGradient); } // coverity[+alloc : arg-*5] GpStatus GdipCreateLineBrush (GDIPCONST GpPointF *point1, GDIPCONST GpPointF *point2, ARGB color1, ARGB color2, GpWrapMode wrapMode, GpLineGradient **lineGradient) { GpLineGradient *linear; BOOL xFlipped = FALSE; BOOL yFlipped = FALSE; if (!point1 || !point2 || !lineGradient) return InvalidParameter; linear = gdip_linear_gradient_new (); if (!linear) return OutOfMemory; linear->wrapMode = wrapMode; linear->lineColors [0] = color1; linear->lineColors [1] = color2; linear->isAngleScalable = FALSE; linear->rectangle.Width = point2->X - point1->X; linear->rectangle.Height = point2->Y - point1->Y; linear->rectangle.X = linear->rectangle.Width < 0 ? point2->X : point1->X; linear->rectangle.Y = linear->rectangle.Height < 0 ? point2->Y : point1->Y; if (linear->rectangle.Width < 0) { linear->rectangle.Width = -linear->rectangle.Width; xFlipped = TRUE; } if (linear->rectangle.Height < 0) { linear->rectangle.Height = -linear->rectangle.Height; yFlipped = TRUE; } if (linear->rectangle.Height == 0) { linear->rectangle.Height = linear->rectangle.Width; linear->rectangle.Y = linear->rectangle.Y - (linear->rectangle.Height / 2.0f); linear->angle = xFlipped ? 180 : 0; } else if (linear->rectangle.Width == 0) { linear->rectangle.Width = linear->rectangle.Height; linear->rectangle.X = linear->rectangle.X - (linear->rectangle.Width / 2.0f); linear->angle = yFlipped ? 270 : 90; } else { float slope = linear->rectangle.Height / linear->rectangle.Width; float newAngleRad = atan (slope); float newAngle = (newAngleRad / (DEGTORAD)); if (xFlipped) newAngle = 180 - newAngle; if (yFlipped) newAngle = 360 - newAngle; linear->angle = newAngle; } linear->points [0].X = linear->rectangle.X; linear->points [0].Y = linear->rectangle.Y; linear->points [1].X = linear->rectangle.X + linear->rectangle.Width; linear->points [1].Y = linear->rectangle.Y; linear->angle = linear->angle * DEGTORAD; gdip_linear_gradient_setup_initial_matrix (linear); *lineGradient = linear; return Ok; } static float get_angle_from_linear_gradient_mode (LinearGradientMode mode) { switch (mode) { case LinearGradientModeVertical: return 90.0; case LinearGradientModeForwardDiagonal: return 45.0; case LinearGradientModeBackwardDiagonal: return 135.0; case LinearGradientModeHorizontal: default: return 0; } } // coverity[+alloc : arg-*5] GpStatus GdipCreateLineBrushFromRectI (GDIPCONST GpRect *rect, ARGB color1, ARGB color2, LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient) { GpRectF rectf; if (!rect || !lineGradient) return InvalidParameter; rectf.X = rect->X; rectf.Y = rect->Y; rectf.Width = rect->Width; rectf.Height = rect->Height; /* FIXME: Check whether angle has to be scalable or not in case of lineargradient mode. */ return GdipCreateLineBrushFromRectWithAngle (&rectf, color1, color2, get_angle_from_linear_gradient_mode (mode), FALSE, wrapMode, lineGradient); } // coverity[+alloc : arg-*5] GpStatus GdipCreateLineBrushFromRect (GDIPCONST GpRectF *rect, ARGB color1, ARGB color2, LinearGradientMode mode, GpWrapMode wrapMode, GpLineGradient **lineGradient) { /* FIXME: Check whether angle has to be scalable or not in case of lineargradient mode. */ return GdipCreateLineBrushFromRectWithAngle (rect, color1, color2, get_angle_from_linear_gradient_mode (mode), FALSE, wrapMode, lineGradient); } // coverity[+alloc : arg-*6] GpStatus GdipCreateLineBrushFromRectWithAngleI (GDIPCONST GpRect *rect, ARGB color1, ARGB color2, float angle, BOOL isAngleScalable, GpWrapMode wrapMode, GpLineGradient **lineGradient) { GpRectF rectf; if (!rect || !lineGradient) return InvalidParameter; rectf.X = rect->X; rectf.Y = rect->Y; rectf.Width = rect->Width; rectf.Height = rect->Height; return GdipCreateLineBrushFromRectWithAngle (&rectf, color1, color2, angle, isAngleScalable, wrapMode, lineGradient); } // coverity[+alloc : arg-*6] GpStatus GdipCreateLineBrushFromRectWithAngle (GDIPCONST GpRectF *rect, ARGB color1, ARGB color2, float angle, BOOL isAngleScalable, GpWrapMode wrapMode, GpLineGradient **lineGradient) { GpLineGradient *linear; if (!rect || !lineGradient || rect->Width == 0.0 || rect->Height == 0.0) return InvalidParameter; linear = gdip_linear_gradient_new (); linear->wrapMode = wrapMode; linear->lineColors [0] = color1; linear->lineColors [1] = color2; linear->angle = fmod (angle, 360) * DEGTORAD; linear->isAngleScalable = isAngleScalable; linear->points [0].X = rect->X; linear->points [0].Y = rect->Y; linear->points [1].X = rect->X + rect->Width + 1; linear->points [1].Y = rect->Y; memcpy (&linear->rectangle, rect, sizeof (GpRectF)); gdip_linear_gradient_setup_initial_matrix (linear); *lineGradient = linear; return Ok; } GpStatus GdipGetLineBlendCount (GpLineGradient *brush, int *count) { if (!brush || !count) return InvalidParameter; /* If count is less than 1, we are not in a proper state * to return blend property. By default, we have one blend * set. Therefore, count of 1 is acceptible. */ if (brush->blend->count < 1) return WrongState; *count = brush->blend->count; return Ok; } GpStatus GdipSetLineBlend (GpLineGradient *brush, GDIPCONST float *blend, GDIPCONST float *positions, int count) { float *blendFactors; float *blendPositions; int index; if (!brush || !blend || !positions || (count < 2)) return InvalidParameter; if (brush->blend->count != count) { blendFactors = (float *) GdipAlloc (count * sizeof (float)); if (!blendFactors) return OutOfMemory; blendPositions = (float *) GdipAlloc (count * sizeof (float)); if (!blendPositions) { GdipFree (blendFactors); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blendFactors; brush->blend->positions = blendPositions; } for (index = 0; index < count; index++) { brush->blend->factors [index] = blend [index]; brush->blend->positions [index] = positions [index]; } brush->blend->count = count; /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 0) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 0; } brush->base.changed = TRUE; return Ok; } GpStatus GdipGetLineBlend (GpLineGradient *brush, float *blend, float *positions, int count) { if (!brush || !blend || !positions || (brush->blend->count != count)) return InvalidParameter; /* If count is less than 1, we are not in a proper state * to return blend property. By default, we have one blend * set. Therefore, count of 1 is acceptible. */ if (brush->blend->count < 1) return WrongState; memcpy (blend, brush->blend->factors, count * sizeof (float)); memcpy (positions, brush->blend->positions, count * sizeof (float)); return Ok; } GpStatus GdipSetLineGammaCorrection (GpLineGradient *brush, BOOL useGammaCorrection) { if (!brush) return InvalidParameter; brush->gammaCorrection = useGammaCorrection; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetLineGammaCorrection (GpLineGradient *brush, BOOL *useGammaCorrection) { if (!brush || !useGammaCorrection) return InvalidParameter; *useGammaCorrection = brush->gammaCorrection; return Ok; } GpStatus GdipGetLinePresetBlendCount (GpLineGradient *brush, int *count) { if (!brush || !count) return InvalidParameter; /* If count is less than 2, we are not in a proper state * to return presetblend property. */ if (brush->presetColors->count < 2) return WrongState; *count = brush->presetColors->count; return Ok; } GpStatus GdipSetLinePresetBlend (GpLineGradient *brush, GDIPCONST ARGB *blend, GDIPCONST float *positions, int count) { ARGB *blendColors; float *blendPositions; int index; if (!brush || !blend || !positions || (count < 2)) return InvalidParameter; if (brush->presetColors->count != count) { blendColors = (ARGB *) GdipAlloc (count * sizeof (ARGB)); if (!blendColors) return OutOfMemory; blendPositions = (float *) GdipAlloc (count * sizeof (float)); if (!blendPositions) { GdipFree (blendColors); return OutOfMemory; } /* free the existing values */ if (brush->presetColors->count != 0) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); } brush->presetColors->colors = blendColors; brush->presetColors->positions = blendPositions; } for (index = 0; index < count; index++) { brush->presetColors->colors [index] = blend [index]; brush->presetColors->positions [index] = positions [index]; } brush->presetColors->count = count; /* we clear the blend when setting preset colors */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); brush->blend->count = 0; } brush->base.changed = TRUE; return Ok; } GpStatus GdipGetLinePresetBlend (GpLineGradient *brush, ARGB *blend, float *positions, int count) { if (!brush || !blend || !positions || (brush->presetColors->count != count)) return InvalidParameter; /* If count is less than 2, we are not in a proper state * to return presetblend property. */ if (brush->presetColors->count < 2) return WrongState; memcpy (blend, brush->presetColors->colors, count * sizeof (ARGB)); memcpy (positions, brush->presetColors->positions, count * sizeof (float)); return Ok; } GpStatus GdipSetLineColors (GpLineGradient *brush, ARGB color1, ARGB color2) { if (!brush) return InvalidParameter; brush->lineColors[0] = color1; brush->lineColors[1] = color2; brush->base.changed = TRUE; return Ok; } GpStatus GdipGetLineColors (GpLineGradient *brush, ARGB *colors) { if (!brush || !colors) return InvalidParameter; colors [0] = brush->lineColors[0]; colors [1] = brush->lineColors[1]; return Ok; } GpStatus GdipGetLineRectI (GpLineGradient *brush, GpRect *rect) { if (!brush || !rect) return InvalidParameter; rect->X = (int) brush->rectangle.X; rect->Y = (int) brush->rectangle.Y; rect->Width = (int) brush->rectangle.Width; rect->Height = (int) brush->rectangle.Height; return Ok; } GpStatus GdipGetLineRect (GpLineGradient *brush, GpRectF *rect) { if (!brush || !rect) return InvalidParameter; memcpy (rect, &brush->rectangle, sizeof (GpRectF)); return Ok; } GpStatus GdipGetLineTransform (GpLineGradient *brush, GpMatrix *matrix) { if (!brush || !matrix) return InvalidParameter; gdip_cairo_matrix_copy (matrix, &brush->matrix); return Ok; } GpStatus GdipSetLineTransform (GpLineGradient *brush, GDIPCONST GpMatrix *matrix) { GpStatus status; BOOL invertible; if (!brush || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; gdip_cairo_matrix_copy (&brush->matrix, matrix); brush->base.changed = TRUE; return Ok; } GpStatus GdipGetLineWrapMode (GpLineGradient *brush, GpWrapMode *wrapMode) { if (!brush || !wrapMode) return InvalidParameter; *wrapMode = brush->wrapMode; return Ok; } GpStatus GdipSetLineWrapMode (GpLineGradient *brush, GpWrapMode wrapMode) { if (!brush || (wrapMode == WrapModeClamp)) return InvalidParameter; brush->wrapMode = wrapMode; brush->base.changed = TRUE; return Ok; } GpStatus GdipSetLineLinearBlend (GpLineGradient *brush, float focus, float scale) { float *blends; float *positions; int count = 3; if (!brush) return InvalidParameter; if (focus == 0 || focus == 1) { count = 2; } if (brush->blend->count != count) { blends = (float *) GdipAlloc (count * sizeof (float)); if (!blends) return OutOfMemory; positions = (float *) GdipAlloc (count * sizeof (float)); if (!positions) { GdipFree (blends); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blends; brush->blend->positions = positions; } /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 0) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 0; } /* set the blend colors */ if (focus == 0) { brush->blend->positions [0] = focus; brush->blend->factors [0] = scale; brush->blend->positions [1] = 1; brush->blend->factors [1] = 0; } else if (focus == 1) { brush->blend->positions [0] = 0; brush->blend->factors [0] = 0; brush->blend->positions [1] = focus; brush->blend->factors [1] = scale; } else { brush->blend->positions [0] = 0; brush->blend->factors [0] = 0; brush->blend->positions [1] = focus; brush->blend->factors [1] = scale; brush->blend->positions [2] = 1; brush->blend->factors [2] = 0; } brush->blend->count = count; brush->base.changed = TRUE; return Ok; } GpStatus GdipSetLineSigmaBlend (GpLineGradient *brush, float focus, float scale) { float *blends; float *positions; float pos = 0.0; int count = 511; /* total no of samples */ int index; float sigma; float mean; float fall_off_len = 2.0; /* curve fall off length in terms of SIGMA */ float delta; /* distance between two samples */ /* we get a curve not starting from 0 and not ending at 1. * so we subtract the starting value and divide by the curve * height to make it fit in the 0 to scale range */ float curve_bottom; float curve_top; float curve_height; if (!brush) return InvalidParameter; if (focus == 0 || focus == 1) { count = 256; } if (brush->blend->count != count) { blends = (float *) GdipAlloc (count * sizeof (float)); if (!blends) return OutOfMemory; positions = (float *) GdipAlloc (count * sizeof (float)); if (!positions) { GdipFree (blends); return OutOfMemory; } /* free the existing values */ if (brush->blend->count != 0) { GdipFree (brush->blend->factors); GdipFree (brush->blend->positions); } brush->blend->factors = blends; brush->blend->positions = positions; } /* we clear the preset colors when setting the blend */ if (brush->presetColors->count != 0) { GdipFree (brush->presetColors->colors); GdipFree (brush->presetColors->positions); brush->presetColors->count = 0; } /* Set the blend colors. We use integral of the Normal Distribution, * i.e. Cumulative Distribution Function (CFD). * * Normal distribution: * * y (x) = (1 / sqrt (2 * PI * sq (sigma))) * exp (-sq (x - mu)/ (2 * sq (sigma))) * * where, y = height of normal curve, * sigma = standard deviation * mu = mean * OR * y (x) = peak * exp ( - z * z / 2) * where, z = (x - mu) / sigma * * In this curve, peak would occur at mean i.e. for x = mu. This results in * a peak value of peak = (1 / sqrt (2 * PI * sq (sigma))). * * Cumulative distribution function: * Ref: http://mathworld.wolfram.com/NormalDistribution.html * * D (x) = (1 / 2) [1 + erf (z)] * where, z = (x - mu) / (sigma * sqrt (2)) * */ if (focus == 0) { /* right part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = 1.0 / fall_off_len; mean = 0.5; delta = 1.0 / 255.0; curve_bottom = 0.5 * (1.0 - gdip_erf (1.0, sigma, mean)); curve_top = 0.5 * (1.0 - gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; /* set the start */ brush->blend->positions [0] = focus; brush->blend->factors [0] = scale; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 - gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = 1.0; brush->blend->factors [count - 1] = 0.0; } else if (focus == 1) { /* left part of the curve with a complete rise in fall_off_len * SIGMAs */ sigma = 1.0 / fall_off_len; mean = 0.5; delta = 1.0 / 255.0; curve_bottom = 0.5 * (1.0 + gdip_erf (0.0, sigma, mean)); curve_top = 0.5 * (1.0 + gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; /* set the start */ brush->blend->positions [0] = 0.0; brush->blend->factors [0] = 0.0; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 + gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = focus; brush->blend->factors [count - 1] = scale; } else { /* left part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = focus / (2 * fall_off_len); mean = focus / 2.0; delta = focus / 255.0; /* set the start */ brush->blend->positions [0] = 0.0; brush->blend->factors [0] = 0.0; curve_bottom = 0.5 * (1.0 + gdip_erf (0.0, sigma, mean)); curve_top = 0.5 * (1.0 + gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; for (index = 1, pos = delta; index < 255; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 + gdip_erf (pos, sigma, mean)) - curve_bottom); } brush->blend->positions [index] = focus; brush->blend->factors [index] = scale; /* right part of the curve with a complete fall in fall_off_len * SIGMAs */ sigma = (1.0 - focus) / (2 * fall_off_len); mean = (1.0 + focus) / 2.0; delta = (1.0 - focus) / 255.0; curve_bottom = 0.5 * (1.0 - gdip_erf (1.0, sigma, mean)); curve_top = 0.5 * (1.0 - gdip_erf (focus, sigma, mean)); curve_height = curve_top - curve_bottom; index ++; pos = focus + delta; for (; index < 510; index++, pos += delta) { brush->blend->positions [index] = pos; brush->blend->factors [index] = (scale / curve_height) * (0.5 * (1.0 - gdip_erf (pos, sigma, mean)) - curve_bottom); } /* set the end */ brush->blend->positions [count - 1] = 1.0; brush->blend->factors [count - 1] = 0.0; } brush->blend->count = count; brush->base.changed = TRUE; return Ok; } GpStatus GdipMultiplyLineTransform (GpLineGradient *brush, GpMatrix *matrix, GpMatrixOrder order) { GpStatus status; BOOL invertible; if (!brush || !matrix) return InvalidParameter; /* the matrix MUST be invertible to be used */ status = GdipIsMatrixInvertible ((GpMatrix*) matrix, &invertible); if (!invertible || (status != Ok)) return InvalidParameter; /* note: error handling is different from GdipMultiplyMatrix */ if (order == MatrixOrderAppend) cairo_matrix_multiply (&brush->matrix, &brush->matrix, matrix); else cairo_matrix_multiply (&brush->matrix, matrix, &brush->matrix); brush->base.changed = TRUE; return Ok; } GpStatus GdipResetLineTransform (GpLineGradient *brush) { if (!brush) return InvalidParameter; cairo_matrix_init_identity (&brush->matrix); brush->base.changed = TRUE; return Ok; } GpStatus GdipRotateLineTransform (GpLineGradient *brush, float angle, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipRotateMatrix (&brush->matrix, angle, order)) == Ok) brush->base.changed = TRUE; return status; } GpStatus GdipScaleLineTransform (GpLineGradient *brush, float sx, float sy, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipScaleMatrix (&brush->matrix, sx, sy, order)) == Ok) brush->base.changed = TRUE; return status; } GpStatus GdipTranslateLineTransform (GpLineGradient *brush, float dx, float dy, GpMatrixOrder order) { GpStatus status; if (!brush) return InvalidParameter; if ((status = GdipTranslateMatrix (&brush->matrix, dx, dy, order)) == Ok) brush->base.changed = TRUE; return status; } libgdiplus-2.11/src/bmpcodec.h0000664000175000017500000000572512225470167013251 00000000000000/* * bmpcodec.h : Contains function declarations for encoding decoding bmp images * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Mark Steele (ms@rapidsys.com) * * Copyright (C) 2003-2004, 2007 Novell, Inc (http://www.novell.com) */ #ifndef _BMPCODEC_H #define _BMPCODEC_H #include "bitmap-private.h" //#include "codecs-private.h" #include "dstream.h" #define BI_RGB 0 #define BI_RLE8 1 #define BI_RLE4 2 #define BI_BITFIELDS 3 #define BITMAPINFOHEADER_SIZE 40 #define BITMAPCOREHEADER_SIZE 12 #ifndef __GNUC__ #pragma pack(2) #endif typedef struct #ifdef __GNUC__ __attribute__ ((packed)) #endif { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER, *LPBITMAPFILEHEADER; #ifndef __GNUC__ #pragma pack() #endif #define BFT_BITMAP 0x4d42 typedef struct { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD, *LPRGBQUAD; typedef struct { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, *PBITMAPINFOHEADER, *LPBITMAPINFOHEADER; typedef long FXPT2DOT30; typedef struct { FXPT2DOT30 ciexyzX; FXPT2DOT30 ciexyzY; FXPT2DOT30 ciexyzZ; } CIEXYZ; typedef struct { CIEXYZ ciexyzRed; CIEXYZ ciexyzGreen; CIEXYZ ciexyzBlue; } CIEXYZTRIPLE; typedef struct { DWORD bV4Size; LONG bV4Width; LONG bV4Height; WORD bV4Planes; WORD bV4BitCount; DWORD bV4Compression; DWORD bV4SizeImage; LONG bV4XPelsPerMeter; LONG bV4YPelsPerMeter; DWORD bV4ClrUsed; DWORD bV4ClrImportant; DWORD bV4RedMask; DWORD bV4GreenMask; DWORD bV4BlueMask; DWORD bV4AlphaMask; DWORD bV4CSType; CIEXYZTRIPLE bV4Endpoints; DWORD bV4GammaRed; DWORD bV4GammaGreen; DWORD bV4GammaBlue; } BITMAPV4HEADER, *PBITMAPV4HEADER; typedef struct { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO, *PBITMAPINFO, *LPBITMAPINFO; #include "gdiplus-private.h" GpStatus gdip_read_bmp_image (void *pointer, GpImage **image, ImageSource source) GDIP_INTERNAL; GpStatus gdip_load_bmp_image_from_file (FILE *fp, GpImage **image) GDIP_INTERNAL; GpStatus gdip_load_bmp_image_from_stream_delegate (dstream_t *loader, GpImage **image) GDIP_INTERNAL; GpStatus gdip_save_bmp_image_to_file (FILE *fp, GpImage *image) GDIP_INTERNAL; GpStatus gdip_save_bmp_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image) GDIP_INTERNAL; ImageCodecInfo *gdip_getcodecinfo_bmp () GDIP_INTERNAL; /* helper functions / shared with ICOn codec */ GpStatus gdip_read_BITMAPINFOHEADER (void *pointer, BITMAPINFOHEADER *bmi, ImageSource source, BOOL *os2format, BOOL *upsidedown) GDIP_INTERNAL; int gdip_read_bmp_data (void *pointer, BYTE *data, int size, ImageSource source) GDIP_INTERNAL; #endif /* _BMPCODEC_H */ libgdiplus-2.11/src/bmpcodec.c0000664000175000017500000011724012225470167013240 00000000000000/* * Copyright (c) 2004 Ximian * Copyright (C) 2003-2004,2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * bmpcodec.c : Contains function definitions for encoding decoding bmp images * * Authors: * Jordi Mas i Hernandez (jordi@ximian.com) * Sanjay Gupta (gsanjay@novell.com) * Mark Steele (ms@rapidsys.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Useful documentation about bitmaps * * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_4v1h.asp * http://www.csdn.net/Dev/Format/windows/Bmp.html * http://www.fortunecity.com/skyscraper/windows/364/bmpffrmt.html * * Header structure * BITMAPFILEHEADER * BITMAPINFOHEADER or BITMAPV4HEADER or BITMAPV5HEADER or BITMAPCOREHEADER * RGBQUADS or RGBTRIPLE (optional) * Bitmap data */ #include "gdiplus-private.h" #include "bmpcodec.h" GUID gdip_bmp_image_format_guid = {0xb96b3cabU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; /* Codecinfo related data*/ static ImageCodecInfo bmp_codec; static const WCHAR bmp_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'B', 'M', 'P', 0}; /* Built-in BMP */ static const WCHAR bmp_extension[] = {'*','.','B', 'M', 'P',';', '*','.', 'D','I', 'B',';', '*','.', 'R', 'L', 'E',0}; /* *.BMP;*.DIB;*.RLE */ static const WCHAR bmp_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'b', 'm', 'p', 0}; /* image/bmp */ static const WCHAR bmp_format[] = {'B', 'M', 'P', 0}; /* BMP */ static const BYTE bmp_sig_pattern[] = { 0x42, 0x4D }; static const BYTE bmp_sig_mask[] = { 0xFF, 0xFF }; ImageCodecInfo * gdip_getcodecinfo_bmp () { bmp_codec.Clsid = (CLSID) { 0x557cf400, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; bmp_codec.FormatID = gdip_bmp_image_format_guid; bmp_codec.CodecName = (const WCHAR*) bmp_codecname; bmp_codec.DllName = NULL; bmp_codec.FormatDescription = (const WCHAR*) bmp_format; bmp_codec.FilenameExtension = (const WCHAR*) bmp_extension; bmp_codec.MimeType = (const WCHAR*) bmp_mimetype; bmp_codec.Flags = ImageCodecFlagsEncoder | ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; bmp_codec.Version = 1; bmp_codec.SigCount = 1; bmp_codec.SigSize = 2; bmp_codec.SigPattern = bmp_sig_pattern; bmp_codec.SigMask = bmp_sig_mask; return &bmp_codec; } static GpStatus gdip_get_bmp_pixelformat (BITMAPINFOHEADER *bih, PixelFormat *dest) { int bitCount = bih->biBitCount; int compression = bih->biCompression; switch (compression) { case BI_RLE4: if (bitCount != 4) return InvalidParameter; *dest = PixelFormat4bppIndexed; break; case BI_RLE8: if (bitCount != 8) return InvalidParameter; *dest = PixelFormat8bppIndexed; break; case BI_BITFIELDS: if (bitCount != 16) return InvalidParameter; /* note: incomplete at this stage */ *dest = PixelFormat16bppRGB565; break; default: switch (bitCount) { case 32: *dest = PixelFormat32bppRGB; break; case 24: *dest = PixelFormat24bppRGB; break; case 16: /* MS produce such files (i.e. bad header) for storing ImageList bitmaps, see bug #80797 */ *dest = PixelFormat16bppRGB565; break; case 8: *dest = PixelFormat8bppIndexed; break; case 4: *dest = PixelFormat4bppIndexed; break; case 1: *dest = PixelFormat1bppIndexed; break; default: g_warning ("Unsupported bitcount (%d) and/or compression (%d).", bitCount, compression); return InvalidParameter; } } return Ok; } static void gdip_bitmap_fill_info_header (GpBitmap *bitmap, PBITMAPINFOHEADER bmi) { PixelFormat format = bitmap->active_bitmap->pixel_format; memset (bmi, 0, sizeof (BITMAPINFOHEADER)); #ifdef WORDS_BIGENDIAN bmi->biSize = GUINT32_FROM_LE (sizeof (BITMAPINFOHEADER)); bmi->biWidth = GULONG_FROM_LE (bitmap->active_bitmap->width); bmi->biHeight = GULONG_FROM_LE (bitmap->active_bitmap->height); bmi->biPlanes = GUINT16_FROM_LE (1); if (format != PixelFormat24bppRGB) bmi->biBitCount = GUINT16_FROM_LE (gdip_get_pixel_format_bpp (bitmap->active_bitmap->pixel_format)); else bmi->biBitCount = GUINT16_FROM_LE (24); bmi->biCompression = GUINT32_FROM_LE (BI_RGB); bmi->biSizeImage = GUINT32_FROM_LE (0); /* Many tools expect this may be set to zero for BI_RGB bitmaps */ bmi->biXPelsPerMeter = GULONG_FROM_LE ((int) (0.5f + ((gdip_get_display_dpi() * 3937) / 100))); bmi->biYPelsPerMeter = GULONG_FROM_LE ((int) (0.5f + ((gdip_get_display_dpi() * 3937) / 100))); /* 1 meter is = 39.37 */ #else bmi->biSize = sizeof (BITMAPINFOHEADER); bmi->biWidth = bitmap->active_bitmap->width; bmi->biHeight = bitmap->active_bitmap->height; bmi->biPlanes = 1; if (format != PixelFormat24bppRGB) bmi->biBitCount = gdip_get_pixel_format_bpp (bitmap->active_bitmap->pixel_format); else bmi->biBitCount = 24; bmi->biCompression = BI_RGB; bmi->biSizeImage = 0; /* Many tools expect this may be set to zero for BI_RGB bitmaps */ bmi->biXPelsPerMeter = (int) (0.5f + ((gdip_get_display_dpi() * 3937) / 100)); bmi->biYPelsPerMeter = (int) (0.5f + ((gdip_get_display_dpi() * 3937) / 100)); /* 1 meter is = 39.37 */ #endif } static GpStatus gdip_read_bmp_rle_8bit (void *pointer, BYTE *scan0, BOOL upsidedown, int stride, int scanWidth, int scanCount, ImageSource source) { BYTE code; int bytes_read; int col_offset = 0; int row_offset = (upsidedown ? (scanCount - 1) * stride : 0); int row_delta = (upsidedown ? -stride : +stride); int rows_remaining = scanCount; BOOL new_row = FALSE; if (scanWidth > stride) return InvalidParameter; while ((rows_remaining > 0) || ((row_offset == 0) && (col_offset < scanWidth))) { bytes_read = gdip_read_bmp_data (pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ if (code == 0) { /* RLE escape code */ bytes_read = gdip_read_bmp_data (pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ switch (code) { case 0: /* skip remainder of scan */ { if (new_row) new_row = FALSE; else { row_offset += row_delta; rows_remaining--; col_offset = 0; } break; } case 1: /* skip remainder of image -- in other words, we're finished :-) */ { return Ok; } case 2: /* jump forward (dx, dy) coordinates */ { BYTE dx, dy; bytes_read = gdip_read_bmp_data (pointer, &dx, 1, source); bytes_read += gdip_read_bmp_data (pointer, &dy, 1, source); if (bytes_read < 2) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ /* not really sure how to handle the case where the X delta goes * past the end of the scan. in the interest of not crashing, * let's wrap it back around. */ col_offset = (col_offset + dx) % scanWidth; row_offset -= dy * stride; /* BMPs go from bottom to top */ new_row = FALSE; break; } default: /* an uncompressed section, 'code' pixels wide */ { /* uncompressed sections must be an even number of bytes long, * even if they are an odd number of *pixels* long. */ BOOL pad_byte_present = ((code & 1) != 0); int bytes_to_read = code; /* wrap rows properly, even though they are inverted in memory */ while (bytes_to_read > 0) { int bytes_to_read_this_scan = scanWidth - col_offset; if (bytes_to_read_this_scan > bytes_to_read) bytes_to_read_this_scan = bytes_to_read; bytes_read = gdip_read_bmp_data ( pointer, &scan0[row_offset + col_offset], bytes_to_read_this_scan, source); if (bytes_read < bytes_to_read_this_scan) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ col_offset += bytes_read; bytes_to_read -= bytes_read; if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; } else new_row = FALSE; } if (pad_byte_present) { bytes_read = gdip_read_bmp_data(pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ } break; } } } else { /* we have a run of length 'code'. the colour of the run is the next byte in the file. */ int run_length = code; BYTE pixel_value; bytes_read = gdip_read_bmp_data(pointer, &pixel_value, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ while (run_length > 0) { int bytes_to_run_this_scan = scanWidth - col_offset; if (bytes_to_run_this_scan > run_length) bytes_to_run_this_scan = run_length; memset (scan0 + row_offset + col_offset, pixel_value, bytes_to_run_this_scan); col_offset += bytes_to_run_this_scan; run_length -= bytes_to_run_this_scan; if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; } else new_row = FALSE; } } } return Ok; } static GpStatus gdip_read_bmp_rle_4bit (void *pointer, BYTE *scan0, BOOL upsidedown, int stride, int scanWidth, int scanCount, ImageSource source) { BYTE code; int bytes_read; int col_offset = 0; int row_offset = (upsidedown ? (scanCount - 1) * stride : 0); int row_delta = (upsidedown ? -stride : +stride); int rows_remaining = scanCount; BOOL new_row = FALSE; if ((scanWidth & 1) != 0) scanWidth++; if (scanWidth > stride * 2) return InvalidParameter; while (rows_remaining > 0) { bytes_read = gdip_read_bmp_data (pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ if (code == 0) { /* RLE escape code */ bytes_read = gdip_read_bmp_data (pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ switch (code) { case 0: /* skip remainder of scan */ { if (new_row) new_row = FALSE; else { row_offset += row_delta; rows_remaining--; col_offset = 0; } break; } case 1: /* skip remainder of image -- in other words, we're finished :-) */ { return Ok; } case 2: /* jump forward (dx, dy) coordinates */ { BYTE dx, dy; bytes_read = gdip_read_bmp_data (pointer, &dx, 1, source); bytes_read += gdip_read_bmp_data (pointer, &dy, 1, source); if (bytes_read < 2) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ /* not really sure how to handle the case where the X delta goes * past the end of the scan. in the interest of not crashing, * let's wrap it back around. */ col_offset = (col_offset + dx) % scanWidth; row_offset -= dy * stride; /* BMPs go from bottom to top */ new_row = FALSE; break; } default: /* an uncompressed section, 'code' pixels wide */ { int pixels_to_read = code; int bytes_of_data = (pixels_to_read + 1) / 2; /* uncompressed sections must be an even number of bytes long, * even if they are an odd number of *pixels* long. */ BOOL pad_byte_present = ((bytes_of_data & 1) != 0); int bytes_to_read = pixels_to_read / 2; /* leave off the last pixel for now */ /* wrap rows properly, even though they are inverted in memory */ while (bytes_to_read > 0) { if ((scanWidth - col_offset) == 1) { /* special case: a pair of pixels is split across two rows. */ BYTE pixels, same_row_pixel, next_row_pixel; bytes_read = gdip_read_bmp_data (pointer, &pixels, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ same_row_pixel = (pixels >> 4) & 0x0F; next_row_pixel = pixels & 0x0F; if ((col_offset & 1) != 0) { BYTE old_pixel = 0xF0 & scan0[row_offset + col_offset / 2]; scan0[row_offset + col_offset / 2] = (old_pixel & 0xF0) | same_row_pixel; } else scan0[row_offset + col_offset / 2] = same_row_pixel << 4; col_offset = 1; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; scan0[row_offset] = next_row_pixel << 4; new_row = FALSE; } else if ((col_offset & 1) == 0) { /* alignment is good; we can read pairs of pixels as bytes. * if there are an odd number of pixels in a scan, though, * then the last pixel will need to be special-cased. also, * if the scan width is odd, then a byte will be split * across a row ending. I don't know if this is in the spec, * but it is the most resistant to crashing. */ int bytes_to_read_this_scan = (scanWidth - col_offset) / 2; if (bytes_to_read_this_scan > bytes_to_read) bytes_to_read_this_scan = bytes_to_read; bytes_read = gdip_read_bmp_data ( pointer, &scan0[row_offset + col_offset / 2], bytes_to_read_this_scan, source); if (bytes_read < bytes_to_read_this_scan) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ col_offset += bytes_read * 2; bytes_to_read -= bytes_read; new_row = FALSE; } else { /* bad alignment; nybble-swapping will be required */ BYTE last_high_nybble = 0xF0 & scan0[row_offset + col_offset / 2]; int bytes_to_read_this_scan = (scanWidth - col_offset) / 2; if (bytes_to_read_this_scan > bytes_to_read) bytes_to_read_this_scan = bytes_to_read; while (bytes_to_read_this_scan >= 0) { BYTE pixels; bytes_read = gdip_read_bmp_data (pointer, &pixels, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ scan0[row_offset + col_offset / 2] = last_high_nybble | (pixels >> 4); last_high_nybble = (pixels << 4) & 0xF0; col_offset += 2; /* two pixels processed */ bytes_to_read_this_scan--; } new_row = FALSE; } if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; } } if ((pixels_to_read & 1) != 0) { /* half of a byte remains to be inserted into the correct nybble */ BYTE pixel; bytes_read = gdip_read_bmp_data (pointer, &pixel, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ pixel >>= 4; /* the last pixel is in the high nybble */ if ((col_offset & 1) != 0) { BYTE old_pixel = 0xF0 & scan0[row_offset + col_offset / 2]; scan0[row_offset + col_offset / 2] = (old_pixel & 0xF0) | pixel; } else scan0[row_offset + col_offset / 2] = pixel << 4; col_offset++; if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; } else new_row = FALSE; } if (pad_byte_present) { bytes_read = gdip_read_bmp_data(pointer, &code, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ } break; } } } else { /* we have a run of length 'code'. the colour of the run is the next byte in the file. * something weird is happening here in 4-bit land, though; a byte stores two pixels. * what happens is rather odd: the run is actually of two alternating colours (which * may, of course, be the same, but are not required to be). we need to make sure that * the colours end up in the right nybbles of the output bytes. */ int run_pixels = code; int run_length = run_pixels / 2; BYTE pixel_values; BYTE inverted_pixel_values; bytes_read = gdip_read_bmp_data(pointer, &pixel_values, 1, source); if (bytes_read < 1) return GenericError; /* TODO?: Add an "unexpected end of file" error code */ inverted_pixel_values = ((pixel_values & 0x0F) << 4) | ((pixel_values & 0xF0) >> 4); if ((col_offset & 1) != 0) { BYTE temp = inverted_pixel_values; inverted_pixel_values = pixel_values; pixel_values = temp; } while (run_length > 0) { if ((scanWidth - col_offset) == 1) { /* special case: a pair of pixels is split across two rows. */ BYTE same_row_pixel = (pixel_values >> 4) & 0x0F; BYTE next_row_pixel = pixel_values & 0x0F; if ((col_offset & 1) != 0) { BYTE old_pixel = 0xF0 & scan0[row_offset + col_offset / 2]; scan0[row_offset + col_offset / 2] = (old_pixel & 0xF0) | same_row_pixel; } else scan0[row_offset + col_offset / 2] = same_row_pixel << 4; col_offset = 1; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; scan0[row_offset] = next_row_pixel << 4; new_row = FALSE; if ((scanWidth & 1) != 0) { /* if the width of the scan is odd, then the nybbles swap * places each time they cross from one row to the next */ BYTE temp = inverted_pixel_values; inverted_pixel_values = pixel_values; pixel_values = temp; } } else { int bytes_to_run_this_scan; /* make sure we're byte-aligned; if we're not, we need to store a nybble first */ if ((col_offset & 1) != 0) { BYTE old_pixel = 0xF0 & scan0[row_offset + col_offset / 2]; scan0[row_offset + col_offset / 2] = (old_pixel & 0xF0) | (pixel_values & 0x0F); col_offset++; } bytes_to_run_this_scan = (scanWidth - col_offset) / 2; if (bytes_to_run_this_scan > run_length) bytes_to_run_this_scan = run_length; memset (scan0 + row_offset + col_offset / 2, pixel_values, bytes_to_run_this_scan); col_offset += bytes_to_run_this_scan * 2; run_length -= bytes_to_run_this_scan; if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; if ((scanWidth & 1) != 0) { /* if the width of the scan is odd, then the nybbles swap * places each time they cross from one row to the next */ BYTE temp = inverted_pixel_values; inverted_pixel_values = pixel_values; pixel_values = temp; } } else new_row = FALSE; } } if ((run_pixels & 1) != 0) { /* half of a byte remains to be inserted into the correct nybble */ BYTE pixel = pixel_values >> 4; /* the last pixel is in the high nybble */ if ((col_offset & 1) != 0) { BYTE old_pixel = 0xF0 & scan0[row_offset + col_offset / 2]; scan0[row_offset + col_offset / 2] = (old_pixel & 0xF0) | pixel; } else scan0[row_offset + col_offset / 2] = pixel << 4; col_offset++; if (col_offset >= scanWidth) { col_offset = 0; row_offset += row_delta; rows_remaining--; if (rows_remaining <= 0) /* more data than expected -- let's not make this a fatal error */ return Ok; new_row = TRUE; } else new_row = FALSE; } } } return Ok; } GpStatus gdip_read_BITMAPINFOHEADER (void *pointer, BITMAPINFOHEADER *bmi, ImageSource source, BOOL *os2format, BOOL *upsidedown) { DWORD dw = 0; BYTE *data_read = (BYTE*)&dw; int size = sizeof (DWORD); int size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biSize = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); if (bmi->biSize > BITMAPCOREHEADER_SIZE){ /* New Windows headers can be bigger */ dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biWidth = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biHeight = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); } else if (bmi->biSize == BITMAPCOREHEADER_SIZE) { /* Old OS/2 format. Width and Height fields are WORDs instead of DWORDS */ dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biWidth = (data_read[1]<<8 | data_read[0]); bmi->biHeight = (data_read[3]<<8 | data_read[2]); *os2format = TRUE; } else { return UnknownImageFormat; } dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biPlanes = (data_read[1]<<8 | data_read[0]); bmi->biBitCount = (data_read[3]<<8 | data_read[2]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biCompression = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); if (bmi->biHeight < 0) { /* Negative height indicates that the bitmap is sideup*/ *upsidedown = FALSE; bmi->biHeight = -bmi->biHeight; } dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biSizeImage = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biXPelsPerMeter = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biYPelsPerMeter = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biClrUsed = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); dw = 0; size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) return InvalidParameter; bmi->biClrImportant = (data_read[3]<<24 | data_read[2]<<16 | data_read[1]<<8 | data_read[0]); return Ok; } /* For use with in-memory bitmaps, where the BITMAPFILEHEADER doesn't exists */ GpStatus gdip_read_bmp_image (void *pointer, GpImage **image, ImageSource source) { BITMAPINFOHEADER bmi; GpBitmap *result = NULL; BYTE *pixels = NULL; int i; PixelFormat format; int colours; BOOL os2format = FALSE; BOOL upsidedown = TRUE; int size_read; BYTE *data_read = NULL; int line; int loop; long index; GpStatus status; ARGB alpha_mask = 0; ARGB red_mask = 0; ARGB green_mask = 0; ARGB blue_mask = 0; int red_shift = 0; unsigned long long int size; status = gdip_read_BITMAPINFOHEADER (pointer, &bmi, source, &os2format, &upsidedown); if (status != Ok) goto error; colours = (bmi.biClrUsed == 0 && bmi.biBitCount <= 8) ? (1 << bmi.biBitCount) : bmi.biClrUsed; status = gdip_get_bmp_pixelformat (&bmi, &format); if (status != Ok) { /* bit count mismatch */ goto error; } /* for 16bbp images we need to be more precise */ if (format == PixelFormat16bppRGB565) { /* check if we're dealing with a BITMAPV4HEADER (or later) structure */ if (bmi.biSize >= sizeof (BITMAPV4HEADER)) { /* the new structure contains the ARGB masks */ void *p = &bmi; BITMAPV4HEADER *v4 = p; alpha_mask = v4->bV4AlphaMask; red_mask = v4->bV4RedMask; green_mask = v4->bV4GreenMask; blue_mask = v4->bV4BlueMask; } else if (bmi.biSize == sizeof (BITMAPINFOHEADER)) { // next three DWORD are the R,G,B masks, like bmiColors in BITMAPINFO int size = sizeof (RGBQUAD); size_read = gdip_read_bmp_data (pointer, (void*)&red_mask, size, source); if (size_read != size) goto error; size_read = gdip_read_bmp_data (pointer, (void*)&green_mask, size, source); if (size_read != size) goto error; size_read = gdip_read_bmp_data (pointer, (void*)&blue_mask, size, source); if (size_read != size) goto error; } if ((red_mask == 0x7C00) && (green_mask == 0x3E0) && (blue_mask == 0x1F)) { /* five red bits, five green bits and five blue bits (0x7FFF) */ red_shift = 10; } else if ((red_mask == 63488) && (green_mask == 2016) && (blue_mask == 31)) { /* five red bits, six green bits and five blue bits (0xFFFF) */ red_shift = 11; } else { /* MS produce such files (i.e. missing masks) for storing ImageList bitmaps, see bug #80797 */ red_mask = 0x7C00; green_mask = 0x3E0; blue_mask = 0x1F; red_shift = 10; } /* note: CAIRO_FORMAT_RGB16_565 is deprecated so we're promoting the bitmap to 32RGB */ /* why 32bpp when 24 would be enough ? because MS GDI+ loads them as such, but can't display them (empty) */ format = PixelFormat32bppRGB; /* 16bbp bitmap don't seems reversed like their height indicates */ upsidedown = FALSE; } result = gdip_bitmap_new_with_frame (NULL, TRUE); result->type = ImageTypeBitmap; result->image_format = BMP; result->active_bitmap->pixel_format = format; result->active_bitmap->width = bmi.biWidth; result->active_bitmap->height = bmi.biHeight; /* biWidth and biHeight are LONG (32 bits signed integer) */ size = bmi.biWidth; switch (result->active_bitmap->pixel_format) { case PixelFormat1bppIndexed: result->active_bitmap->stride = (size + 7) / 8; break; case PixelFormat4bppIndexed: result->active_bitmap->stride = (size + 1) / 2; break; case PixelFormat8bppIndexed: result->active_bitmap->stride = size; break; default: /* For other types, we assume 32 bit and translate into 32 bit from source format */ result->active_bitmap->pixel_format = PixelFormat32bppRGB; /* fall-thru */ case PixelFormat24bppRGB: /* stride is a (signed) _int_ and once multiplied by 4 it should hold a value that can be allocated by GdipAlloc * this effectively limits 'width' to 536870911 pixels */ size *= 4; if (size > G_MAXINT32) goto error; result->active_bitmap->stride = size; break; } /* Ensure 32bits alignment */ gdip_align_stride (result->active_bitmap->stride); if (colours) { int palette_entries = colours; if (result->active_bitmap->pixel_format == PixelFormat4bppIndexed) { palette_entries = 256; } result->active_bitmap->palette = GdipAlloc (sizeof(ColorPalette) + sizeof(ARGB) * palette_entries); if (result->active_bitmap->palette == NULL) { status = OutOfMemory; goto error; } result->active_bitmap->palette->Flags = 0; result->active_bitmap->palette->Count = palette_entries; /* Read optional colour table */ size = (os2format) ? 3 /* RGBTRIPLE */ : 4 /* RGBquads */; data_read = (BYTE*) GdipAlloc(size); if (data_read == NULL) { status = OutOfMemory; goto error; } for (i = 0; i < colours; i++) { size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) { status = InvalidParameter; goto error; } set_pixel_bgra (result->active_bitmap->palette->Entries, i * 4, (data_read[0] & 0xFF), /* B */ (data_read[1] & 0xFF), /* G */ (data_read[2] & 0xFF), /* R */ 0xFF); /* Alpha */ } GdipFree(data_read); data_read = NULL; } size = result->active_bitmap->stride; /* ensure total 'size' does not overflow an integer and fits inside our 2GB limit */ size *= result->active_bitmap->height; if (size > G_MAXINT32) { status = OutOfMemory; goto error; } pixels = GdipAlloc (size); if (pixels == NULL) { status = OutOfMemory; goto error; } if ((bmi.biCompression == BI_RLE4) || (bmi.biCompression == BI_RLE8)) { switch (bmi.biCompression) { case BI_RLE4: gdip_read_bmp_rle_4bit (pointer, pixels, upsidedown, result->active_bitmap->stride, result->active_bitmap->width, result->active_bitmap->height, source); break; case BI_RLE8: gdip_read_bmp_rle_8bit (pointer, pixels, upsidedown, result->active_bitmap->stride, result->active_bitmap->width, result->active_bitmap->height, source); break; } } else { /* Size contains the size of the lines on disk */ switch (bmi.biBitCount) { case 1: { size = ((result->active_bitmap->width + 31) & ~31) / 8; loop = result->active_bitmap->width / 8; /* we assume 0s for 1 bit, only setting 1s */ memset(pixels, 0, result->active_bitmap->stride * result->active_bitmap->height); break; } case 4: { size = ((bmi.biBitCount * result->active_bitmap->width + 31) & ~31) / 8; loop = ((result->active_bitmap->width + 1) &~1) / 2; break; } case 8: { size = (((bmi.biBitCount * result->active_bitmap->width) + 31) & ~31) / 8; loop = result->active_bitmap->width; break; } default: { size = (((bmi.biBitCount * result->active_bitmap->width) + 31) & ~31) / 8; loop = (bmi.biBitCount * result->active_bitmap->width) / 8; break; } } data_read = (BYTE*) GdipAlloc(size); if (data_read == NULL) { status = OutOfMemory; goto error; } for (i = 0; i < result->active_bitmap->height; i++){ if (upsidedown) { line = result->active_bitmap->height - i - 1; } else { line = i; } size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) { /* special case for missing data in the last line */ if (line == result->active_bitmap->height - 1) { /* MS produce such files for storing ImageList bitmaps, see bug #80797 */ int missing_size = size - size_read; memset (data_read + size_read, 0, missing_size); } else { status = InvalidParameter; goto error; } } switch(bmi.biBitCount) { case 1: case 4: case 8: memcpy(pixels + line * result->active_bitmap->stride, data_read, size); continue; case 16: { int src = 0; int dest = 0; SHORT *pix = (SHORT*) data_read; index = (line * result->active_bitmap->stride); while (src < loop) { BYTE r = ((*pix & red_mask) >> (red_shift - 3)); BYTE g = ((*pix & green_mask) >> (red_shift - 8)); BYTE b = (*pix & blue_mask) << 3; set_pixel_bgra (pixels, index + dest, b, g, r, 0xff); dest += 4; src += 2; pix++; } continue; } case 24: case 32: { int src = 0; int dest = 0; int skip = (bmi.biBitCount >> 3); index = (line * result->active_bitmap->stride); while (src < loop) { set_pixel_bgra(pixels, index + dest, data_read[src+0], data_read[src+1], data_read[src+2], 0xff); dest += 4; src += skip; } continue; } } } GdipFree(data_read); data_read = NULL; } result->active_bitmap->scan0 = pixels; result->active_bitmap->reserved = GBD_OWN_SCAN0; result->active_bitmap->image_flags = ImageFlagsReadOnly | ImageFlagsHasRealPixelSize | ImageFlagsColorSpaceRGB; *image = result; return Ok; error: if (data_read != NULL) { GdipFree(data_read); } if (pixels != NULL) { GdipFree(pixels); } if (result != NULL) { gdip_bitmap_dispose(result); } return InvalidParameter; } /* BMP read from files have a BITMAPFILEHEADER but this isn't the case for the GDI API * (e.g. displaying a bitmap) */ static GpStatus gdip_read_bmp_image_from_file_stream (void *pointer, GpImage **image, ImageSource source) { GpStatus status; BITMAPFILEHEADER bmfh; int size_read; int size = sizeof (bmfh); BYTE* data_read = (BYTE*) GdipAlloc (size); if (!data_read) return OutOfMemory; memset (data_read, 0, size); size_read = gdip_read_bmp_data (pointer, data_read, size, source); if (size_read < size) { status = InvalidParameter; goto error; } bmfh.bfType = ((data_read[1]<<8)|data_read[0]); if (bmfh.bfType != BFT_BITMAP) { status = UnknownImageFormat; goto error; } bmfh.bfSize = (data_read[5]<<24 | data_read[4]<<16 | data_read[3]<<8 | data_read[2]); bmfh.bfReserved1 = ((data_read[7]<<8)|data_read[6]); bmfh.bfReserved1 = ((data_read[9]<<8)|data_read[8]); bmfh.bfOffBits = (data_read[13]<<24 | data_read[12]<<16 | data_read[11]<<8 | data_read[10]); GdipFree (data_read); return gdip_read_bmp_image (pointer, image, source); error: if (data_read != NULL) GdipFree(data_read); return status; } GpStatus gdip_load_bmp_image_from_file (FILE *fp, GpImage **image) { return gdip_read_bmp_image_from_file_stream ((void*)fp, image, File); } GpStatus gdip_load_bmp_image_from_stream_delegate (dstream_t *loader, GpImage **image) { return gdip_read_bmp_image_from_file_stream ((void*)loader, image, DStream); } int gdip_read_bmp_data (void *pointer, BYTE *data, int size, ImageSource source) { switch (source) { case File: return fread (data, 1, size, (FILE*) pointer); case DStream: { /* Streams are not required to return the number of bytes requested, they could return less yet our code seems to assume it will always get what it's asking for; lets loop until we get what was requested or we get an error */ int got; int total; dstream_t *loader; loader = (dstream_t *) pointer; total = 0; do { got = dstream_read (loader, data + total, size - total, 0); if (got < 1) { /* 0 = end of stream, -1 = error */ return total; } total += got; } while (total < size); return total; } case Memory: { MemorySource *ms = (MemorySource*)pointer; int len = (ms->pos + size < ms->size) ? size : ms->size - ms->pos; if (len > 0) { memcpy (data, ms->ptr + ms->pos, len); ms->pos += len; } return size; } default: return -1; } } static void gdip_write_bmp_data (void *pointer, BYTE *data, int size, BOOL useFile) { if (useFile) fwrite (data, 1, size, (FILE*) pointer); else ((PutBytesDelegate)(pointer))(data, size); } static GpStatus gdip_save_bmp_image_to_file_stream (void *pointer, GpImage *image, BOOL useFile) { BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmi; int bitmapLen; int i; ARGB color; int colours = 0; BYTE *entries; int palette_entries; BitmapData *activebmp; BYTE *scan0; activebmp = image->active_bitmap; if (activebmp->pixel_format != PixelFormat24bppRGB) { bitmapLen = activebmp->stride * activebmp->height; } else { bitmapLen = activebmp->width * 3; bitmapLen += 3; bitmapLen &= ~3; bitmapLen *= activebmp->height; } if (activebmp->palette) { colours = activebmp->palette->Count; } #ifdef WORDS_BIGENDIAN bmfh.bfReserved1 = bmfh.bfReserved2 = GUINT16_FROM_LE (0); bmfh.bfType = GUINT16_FROM_LE (BFT_BITMAP); bmfh.bfOffBits = GUINT32_FROM_LE (14 + 40 + colours * 4); bmfh.bfSize = GUINT32_FROM_LE (bmfh.bfOffBits + bitmapLen); #else bmfh.bfReserved1 = bmfh.bfReserved2 = 0; bmfh.bfType = BFT_BITMAP; bmfh.bfOffBits = (14 + 40 + colours * 4); bmfh.bfSize = (bmfh.bfOffBits + bitmapLen); #endif gdip_write_bmp_data (pointer, (BYTE*) &bmfh, sizeof (bmfh), useFile); gdip_bitmap_fill_info_header (image, &bmi); gdip_write_bmp_data (pointer, (BYTE*) &bmi, sizeof (bmi), useFile); if (colours) { int idx; palette_entries = activebmp->palette->Count; if (activebmp->pixel_format == PixelFormat4bppIndexed) { palette_entries = 16; } entries = (BYTE*) GdipAlloc (palette_entries*4); if (entries == NULL) return OutOfMemory; idx = 0; for (i = 0; i < palette_entries; i++) { color = activebmp->palette->Entries[i]; #ifdef WORDS_BIGENDIAN entries [idx] = color & 0xff; entries [idx + 1] = (color >> 8) & 0xff; entries [idx + 2] = (color >> 16) & 0xff; entries [idx + 3] = color >> 24; idx += 4; #else *((guint32 *) entries + i) = color; #endif } gdip_write_bmp_data (pointer, entries, palette_entries * 4, useFile); GdipFree (entries); } scan0 = activebmp->scan0; if (activebmp->pixel_format == PixelFormat24bppRGB) { int width = activebmp->width; int height = activebmp->height; int mystride; int k; BYTE *current_line; /* rows need to be padded up to the next multiple of 4 */ mystride = width * 3; mystride += 3; mystride &= ~3; current_line = (BYTE*) GdipAlloc (mystride); memset (current_line, 0, mystride); /* Zero padding at the end if needed */ for (i = height - 1; i >= 0; i--) { BYTE *ptr; guint32 *iptr; iptr = (guint32 *) (scan0 + i * activebmp->stride); ptr = current_line; for (k = 0; k < width; k++) { guint32 color = *iptr++; *ptr++ = (color & 0x000000ff); *ptr++ = ((color & 0x0000ff00) >> 8); *ptr++ = ((color & 0x00ff0000) >> 16); } gdip_write_bmp_data (pointer, current_line, mystride, useFile); } GdipFree (current_line); return Ok; } /* Writes bitmap upside down. Many tools can only process bmp stored this way*/ #ifdef WORDS_BIGENDIAN if (gdip_is_an_indexed_pixelformat (activebmp->pixel_format) == FALSE) { int j; BYTE *row_pointer = GdipAlloc (activebmp->width * 4); if (row_pointer == NULL) { return OutOfMemory; } for (i = activebmp->height -1; i >= 0; i--) { for (j = 0; j < activebmp->width; j++) { row_pointer[j*4] = *((BYTE*)scan0 + (activebmp->stride * i) + (j*4) + 3); row_pointer[j*4+1] = *((BYTE*)scan0 + (activebmp->stride * i) + (j*4) + 2); row_pointer[j*4+2] = *((BYTE*)scan0 + (activebmp->stride * i) + (j*4) + 1); row_pointer[j*4+3] = *((BYTE*)scan0 + (activebmp->stride * i) + (j*4) + 0); } gdip_write_bmp_data (pointer, row_pointer, activebmp->stride, useFile); } GdipFree (row_pointer); } else #endif /* WORDS_BIGENDIAN */ for (i = activebmp->height - 1; i >= 0; i--) { gdip_write_bmp_data (pointer, scan0 + i * activebmp->stride, activebmp->stride, useFile); } return Ok; } GpStatus gdip_save_bmp_image_to_file (FILE *fp, GpImage *image) { return gdip_save_bmp_image_to_file_stream ( (void *)fp, image, TRUE); } GpStatus gdip_save_bmp_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image) { return gdip_save_bmp_image_to_file_stream ( (void *)putBytesFunc, image, FALSE); } libgdiplus-2.11/src/general-private.h0000664000175000017500000001223312225470167014552 00000000000000/* * general-private.h * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __GENERAL_PRIVATE_H__ #define __GENERAL_PRIVATE_H__ #include "gdiplus-private.h" #define PI 3.14159265358979323846 #define DEGTORAD (PI / 180.0) /* looks like they are not available everywhere :( */ #ifndef G_MAXINT32 #define G_MAXINT32 2147483647 #define G_MININT16 -32768 #define G_MAXINT16 32767 #endif #define MAKE_ARGB_RGB(r,g,b) (((r&0xff) << 16) | ((g&0xff) << 8) | (b&0xff)) #define MAKE_ARGB_ARGB(a,r,g,b) (((a&0xff) << 24) | ((r&0xff) << 16) | ((g&0xff) << 8) | (b&0xff)) #define min(a,b) (a < b ? a : b) #define max(a,b) (a > b ? a : b) /* avoid direct floating point comparison */ #define gdip_near_zero(value) ((value >= -0.0001f) && (value <= 0.0001f)) #define gdip_near_one(value) ((value >= 0.9999f) && (value <= 1.0001f)) /* avoid integer overflows when int/float/int conversion are used (see #79643) */ #define SAFE_FLOAT_TO_UINT32(value) ((value < 0) ? 0 : (value >= G_MAXINT32) ? G_MAXINT32 : value) /* avoid fp division and multiplication that would return the same number */ #define OPTIMIZE_CONVERSION(g) ((g->type != gtPostScript) && ((g->page_unit == UnitPixel) || (g->page_unit == UnitWorld))) /* macros for common conversions, i.e. to or from UnitCairoPoint */ #define gdip_unitx_convgr(g,f) (gdip_unit_conversion (g->page_unit, UnitCairoPoint, g->dpi_x, g->type, f)) #define gdip_unity_convgr(g,f) (gdip_unit_conversion (g->page_unit, UnitCairoPoint, g->dpi_y, g->type, f)) #define gdip_convgr_unitx(g,f) (gdip_unit_conversion (UnitCairoPoint, g->page_unit, g->dpi_x, g->type, f)) #define gdip_convgr_unity(g,f) (gdip_unit_conversion (UnitCairoPoint, g->page_unit, g->dpi_y, g->type, f)) /* pixman always use 32bits for pixman_bits_t */ #define gdip_align_stride(s) { s += (sizeof(guint32)-1); s &= ~(sizeof(guint32)-1); } /* avoid floating point division/multiplications when pre-multiplying the alpha channel with R, G and B values */ extern const BYTE pre_multiplied_table[256][256]; #if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1,6,0) /* older cairo has a (signed) 15(1)/16(2)bits pixel positioning, while GDI+ use (signed) 23 bits (infinity). * Using larger values confuse the bits used for subpixel positioning. * (1) http://lists.freedesktop.org/archives/cairo/2006-June/007251.html * (2) testing shows artefacts if using more than 15 bits */ #define CAIRO_LOW_LIMIT -16384 #define CAIRO_HIGH_LIMIT 16383 #define CAIRO_LIMIT(v) ((v < CAIRO_LOW_LIMIT) ? CAIRO_LOW_LIMIT : (v > CAIRO_HIGH_LIMIT) ? CAIRO_HIGH_LIMIT : v) #else /* since cairo 1.6 values are split 24/8 */ #define CAIRO_LIMIT(v) v #endif /* other shared functions */ int iround (float d) GDIP_INTERNAL; float gdip_erf (float x, float std, float mean) GDIP_INTERNAL; float gdip_get_display_dpi () GDIP_INTERNAL; GpStatus gdip_get_status (cairo_status_t status) GDIP_INTERNAL; GpStatus gdip_get_pattern_status (cairo_pattern_t *pat) GDIP_INTERNAL; gchar *ucs2_to_utf8 (const gunichar2 *ucs2, int length) GDIP_INTERNAL; BOOL utf8_to_ucs2 (const gchar *utf8, gunichar2 *ucs2, int ucs2_len) GDIP_INTERNAL; int utf8_encode_ucs2char (gunichar2 unichar, unsigned char *dest) GDIP_INTERNAL; /* for drawing curves */ GpPointF *convert_points (const GpPoint *points, int count) GDIP_INTERNAL; GpPointF *gdip_closed_curve_tangents (int terms, const GpPointF *points, int count, float tension) GDIP_INTERNAL; GpPointF *gdip_open_curve_tangents (int terms, const GpPointF *points, int count, float tension) GDIP_INTERNAL; /* memory */ void* gdip_realloc (void *org, int size) GDIP_INTERNAL; void* gdip_calloc (size_t nelem, size_t elsize) GDIP_INTERNAL; #include "general.h" #endif libgdiplus-2.11/src/hatchbrush-private.h0000664000175000017500000000423712225470167015275 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __HATCHBRUSH_PRIVATE__ #define __HATCHBRUSH_PRIVATE__ #include "brush-private.h" #define HATCH_SIZE 7 #define LINE_WIDTH 1 #define gdip_hatch_get_width(hbr) (hatches_const[hbr->hatchStyle][0]) #define gdip_hatch_get_height(hbr) (hatches_const[hbr->hatchStyle][1]) #define gdip_hatch_get_line_width(hbr) (hatches_const[hbr->hatchStyle][2]) #define gdip_cairo_pixel(ct,x,y) cairo_rectangle (ct, x, y, 1, 1) typedef struct _Hatch { GpBrush base; GpHatchStyle hatchStyle; ARGB foreColor; ARGB backColor; cairo_pattern_t *pattern; } Hatch; #include "hatchbrush.h" #endif libgdiplus-2.11/src/adjustablearrowcap.c0000664000175000017500000001440112225470167015334 00000000000000/* * adjustablearrowcap.c * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Author: * Ravindra (rkumar@novell.com) * * Copyright (C) 2003-2007 Novell, Inc. http://www.novell.com */ #include "adjustablearrowcap-private.h" #include "graphics-private.h" static GpStatus gdip_adjust_arrowcap_setup (GpGraphics *graphics, GpCustomLineCap *cap); static GpStatus gdip_adjust_arrowcap_clone_cap (GpCustomLineCap *cap, GpCustomLineCap **clonedCap); static GpStatus gdip_adjust_arrowcap_destroy (GpCustomLineCap *cap); static GpStatus gdip_adjust_arrowcap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *Cap, float x, float y, float otherend_x, float otherend_y); /* * we have a single copy of vtable for * all instances of adjustable arrowcap. */ static CapClass vtable = { CustomLineCapTypeAdjustableArrow, gdip_adjust_arrowcap_setup, gdip_adjust_arrowcap_clone_cap, gdip_adjust_arrowcap_destroy, gdip_adjust_arrowcap_draw }; static void gdip_adjust_arrowcap_init (GpAdjustableArrowCap *arrow) { gdip_custom_linecap_init (&arrow->base, &vtable); arrow->fill_state = TRUE; arrow->middle_inset = 0.0; arrow->width = 0.0; arrow->height = 0.0; } static GpAdjustableArrowCap* gdip_adjust_arrowcap_new (void) { GpAdjustableArrowCap *result = (GpAdjustableArrowCap *) GdipAlloc (sizeof (GpAdjustableArrowCap)); if (result) gdip_adjust_arrowcap_init (result); return result; } GpStatus gdip_adjust_arrowcap_clone_cap (GpCustomLineCap *cap, GpCustomLineCap **clonedCap) { GpAdjustableArrowCap *newcap; if (!cap || !clonedCap) return InvalidParameter; newcap = (GpAdjustableArrowCap *) GdipAlloc (sizeof (GpAdjustableArrowCap)); if (!newcap) return OutOfMemory; memcpy (newcap, cap, sizeof (GpAdjustableArrowCap)); *clonedCap = (GpCustomLineCap *) newcap; return Ok; } GpStatus gdip_adjust_arrowcap_destroy (GpCustomLineCap *cap) { if (!cap) return InvalidParameter; GdipFree (cap); return Ok; } /* MonoTODO: Implement this when cairo supports cairo_stroke_path API */ GpStatus gdip_adjust_arrowcap_setup (GpGraphics *graphics, GpCustomLineCap *customCap) { if (!graphics || !customCap) return InvalidParameter; return NotImplemented; } GpStatus gdip_adjust_arrowcap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *customCap, float x, float y, float otherend_x, float otherend_y) { double angle; GpAdjustableArrowCap *arrowcap; float w; float h; float penwidth; if (!graphics || !customCap) return InvalidParameter; penwidth = pen->width; if (penwidth < 2.0) { /* Seems to be a minimum */ penwidth = 2.0; } arrowcap = (GpAdjustableArrowCap *)customCap; w = arrowcap->width / 2; h = arrowcap->height; angle = gdip_custom_linecap_angle (x, y, otherend_x, otherend_y); cairo_save (graphics->ct); /* FIXME: handle base_inset (including set/get!) */ cairo_translate (graphics->ct, x, y); cairo_rotate (graphics->ct, angle); gdip_cairo_move_to (graphics, 0, 0, TRUE, TRUE); gdip_cairo_line_to (graphics, -w * penwidth, -h * penwidth, TRUE, TRUE); gdip_cairo_line_to (graphics, w * penwidth, -h * penwidth, TRUE, TRUE); gdip_cairo_line_to (graphics, 0, 0, TRUE, TRUE); if (arrowcap->fill_state) { /* FIXME: handle middle_inset */ cairo_fill_preserve (graphics->ct); } cairo_stroke (graphics->ct); cairo_restore (graphics->ct); return Ok; } /* AdjustableArrowCap functions */ // coverity[+alloc : arg-*3] GpStatus GdipCreateAdjustableArrowCap (float height, float width, BOOL isFilled, GpAdjustableArrowCap **arrowCap) { GpAdjustableArrowCap *cap; if (!arrowCap) return InvalidParameter; cap = gdip_adjust_arrowcap_new (); if (!cap) { *arrowCap = NULL; return OutOfMemory; } cap->fill_state = isFilled; cap->width = width; cap->height = height; *arrowCap = cap; return Ok; } GpStatus GdipSetAdjustableArrowCapHeight (GpAdjustableArrowCap *arrowCap, float height) { if (!arrowCap) return InvalidParameter; arrowCap->height = height; return Ok; } GpStatus GdipGetAdjustableArrowCapHeight (GpAdjustableArrowCap *arrowCap, float *height) { if (!arrowCap || !height) return InvalidParameter; *(height) = arrowCap->height; return Ok; } GpStatus GdipSetAdjustableArrowCapWidth (GpAdjustableArrowCap *arrowCap, float width) { if (!arrowCap) return InvalidParameter; arrowCap->width = width; return Ok; } GpStatus GdipGetAdjustableArrowCapWidth (GpAdjustableArrowCap *arrowCap, float *width) { if (!arrowCap || !width) return InvalidParameter; *(width) = arrowCap->width; return Ok; } GpStatus GdipSetAdjustableArrowCapMiddleInset (GpAdjustableArrowCap *arrowCap, float middleInset) { if (!arrowCap) return InvalidParameter; arrowCap->middle_inset = middleInset; return Ok; } GpStatus GdipGetAdjustableArrowCapMiddleInset (GpAdjustableArrowCap *arrowCap, float *middleInset) { if (!arrowCap || !middleInset) return InvalidParameter; *(middleInset) = arrowCap->middle_inset; return Ok; } GpStatus GdipSetAdjustableArrowCapFillState (GpAdjustableArrowCap *arrowCap, BOOL isFilled) { if (!arrowCap) return InvalidParameter; arrowCap->fill_state = isFilled; return Ok; } GpStatus GdipGetAdjustableArrowCapFillState (GpAdjustableArrowCap *arrowCap, BOOL *isFilled) { if (!arrowCap || !isFilled) return InvalidParameter; *(isFilled) = arrowCap->fill_state; return Ok; } libgdiplus-2.11/src/graphics-pathiterator-private.h0000664000175000017500000000403712225470167017444 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __GRAPHICS_PATHITERATOR_PRIVATE__ #define __GRAPHICS_PATHITERATOR_PRIVATE__ #include "gdiplus-private.h" struct _PathIterator { GpPath *path; int markerPosition; /* The start position of next marker, index of (marker type) + 1 */ int subpathPosition; /* The start position of next subpath, index of (start type) */ int pathTypePosition; /* The position to get the next path type inside a subpath */ }; #include "graphics-pathiterator.h" #endif libgdiplus-2.11/src/pngcodec.c0000664000175000017500000006017612225470167013253 00000000000000/* * pngcodec.c : Contains function definitions for encoding decoding png images * * Copyright (C) 2003-2004,2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic * Jonathan Gilbert (logic@deltaq.org) * */ #if HAVE_CONFIG_H #include #endif #include "win32structs.h" GUID gdip_png_image_format_guid = {0xb96b3cafU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; #ifdef HAVE_LIBPNG #include #include "gdiplus-private.h" #include "pngcodec.h" #include /* Codecinfo related data*/ static ImageCodecInfo png_codec; static const WCHAR png_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'P', 'N', 'G', 0}; /* Built-in PNG */ static const WCHAR png_extension[] = {'*', '.', 'P', 'N', 'G', 0}; /* *.PNG */ static const WCHAR png_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'p', 'n', 'g', 0}; /* image/png */ static const WCHAR png_format[] = {'P', 'N', 'G', 0}; /* PNG */ static const BYTE png_sig_pattern[] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }; static const BYTE png_sig_mask[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; ImageCodecInfo * gdip_getcodecinfo_png () { png_codec.Clsid = (CLSID) { 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; png_codec.FormatID = gdip_png_image_format_guid; png_codec.CodecName = (const WCHAR*) png_codecname; png_codec.DllName = NULL; png_codec.FormatDescription = (const WCHAR*) png_format; png_codec.FilenameExtension = (const WCHAR*) png_extension; png_codec.MimeType = (const WCHAR*) png_mimetype; png_codec.Flags = ImageCodecFlagsEncoder | ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; png_codec.Version = 1; png_codec.SigCount = 1; png_codec.SigSize = 8; png_codec.SigPattern = png_sig_pattern; png_codec.SigMask = png_sig_mask; return &png_codec; } #if !defined(HAVE_SIGSETJMP) && !defined(sigsetjmp) #define sigjmp_buf jmp_buf #define sigsetjmp(jb, x) setjmp(jb) #define siglongjmp longjmp #endif static void _gdip_png_stream_read_data (png_structp png_ptr, png_bytep data, png_size_t length) { GetBytesDelegate getBytesFunc; int bytesRead; int res; getBytesFunc = (GetBytesDelegate) png_get_io_ptr (png_ptr); /* In png parlance, it is an error to read less than length */ bytesRead = 0; while (bytesRead != length) { res = getBytesFunc (data + bytesRead, length - bytesRead, 0); if (res <= 0) { png_error(png_ptr, "Read failed"); } bytesRead += res; } } static void _gdip_png_stream_write_data (png_structp png_ptr, png_bytep data, png_size_t length) { PutBytesDelegate putBytesFunc = (PutBytesDelegate) png_get_io_ptr (png_ptr); putBytesFunc (data, length); } static void _gdip_png_stream_flush_data (png_structp png_ptr) { /* nothing */ } static GpStatus gdip_load_png_properties (png_structp png_ptr, png_infop info_ptr, png_infop end_ptr, BitmapData *bitmap_data) { #if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) bitmap_data->image_flags |= ImageFlagsHasRealDPI; bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr); bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr); #elif defined(PNG_pHYs_SUPPORTED) { int unit_type; png_uint_32 res_x; png_uint_32 res_y; png_get_pHYs( png_ptr, info_ptr, &res_x, &res_y, &unit_type ); if (unit_type == PNG_RESOLUTION_METER) { bitmap_data->image_flags |= ImageFlagsHasRealDPI; bitmap_data->dpi_horz = res_x * 0.0254; bitmap_data->dpi_vert = res_y * 0.0254; } } #endif /* default to screen resolution (if nothing was provided or available) */ if (bitmap_data->dpi_horz == 0 || bitmap_data->dpi_vert == 0) { bitmap_data->dpi_horz = bitmap_data->dpi_vert = gdip_get_display_dpi (); } #if defined(PNG_iCCP_SUPPORTED) { png_charp name; png_bytep profile; png_uint_32 proflen; int compression_type; if (png_get_iCCP(png_ptr, info_ptr, &name, &compression_type, &profile, &proflen)) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagICCProfileDescriptor, (BYTE*)name); gdip_bitmapdata_property_add_byte(bitmap_data, PropertyTagICCProfile, (BYTE)compression_type); } } #endif #if defined(PNG_gAMA_SUPPORTED) { double gamma; if (png_get_gAMA(png_ptr, info_ptr, &gamma)) { gdip_bitmapdata_property_add_rational(bitmap_data, PropertyTagGamma, 100000, gamma * 100000); } } #endif #if defined(PNG_cHRM_SUPPORTED) { double white_x; double white_y; double red_x; double red_y; double green_x; double green_y; double blue_x; double blue_y; if (png_get_cHRM(png_ptr, info_ptr, &white_x, &white_y, &red_x, &red_y, &green_x, &green_y, &blue_x, &blue_y)) { BYTE *buffer; guint32 *ptr; buffer = GdipAlloc(6 * (sizeof(png_uint_32) + sizeof(png_uint_32))); if (buffer != NULL) { ptr = (guint32 *)buffer; ptr[0] = (guint32)(red_x * 100000); ptr[1] = 1000000; ptr[2] = (guint32)(red_y * 100000); ptr[3] = 100000; ptr[4] = (guint32)(green_x * 100000); ptr[5] = 1000000; ptr[6] = (guint32)(green_y * 100000); ptr[7] = 100000; ptr[8] = (guint32)(blue_x * 100000); ptr[9] = 100000; ptr[10] = (guint32)(blue_y * 100000); ptr[11] = 100000; gdip_bitmapdata_property_add (bitmap_data, PropertyTagPrimaryChromaticities, 6 * (sizeof(guint32) + sizeof(guint32)), PropertyTagTypeRational, buffer); ptr[0] = (guint32)(white_x * 100000); ptr[1] = 1000000; ptr[2] = (guint32)(white_y * 100000); ptr[3] = 100000; gdip_bitmapdata_property_add (bitmap_data, PropertyTagWhitePoint, 2 * (sizeof(guint32) + sizeof(guint32)), PropertyTagTypeRational, buffer); GdipFree(buffer); } } } #endif #if defined(PNG_pHYs_SUPPORTED) { int unit_type; png_uint_32 res_x; png_uint_32 res_y; if (png_get_pHYs(png_ptr, info_ptr, &res_x, &res_y, &unit_type)) { gdip_bitmapdata_property_add_byte(bitmap_data, PropertyTagPixelUnit, (BYTE)unit_type); gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagPixelPerUnitX, res_x); gdip_bitmapdata_property_add_long(bitmap_data, PropertyTagPixelPerUnitY, res_y); } } #endif #if defined(PNG_TEXT_SUPPORTED) { int num_text; png_textp text_ptr; if (png_get_text(png_ptr, info_ptr, &text_ptr, &num_text)) { if (num_text > 0) { gdip_bitmapdata_property_add_ASCII(bitmap_data, PropertyTagExifUserComment, (BYTE*)text_ptr[0].text); } } } #endif return Ok; } static GpStatus gdip_load_png_image_from_file_or_stream (FILE *fp, GetBytesDelegate getBytesFunc, GpImage **image) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; png_infop end_info_ptr = NULL; BYTE *rawdata = NULL; GpImage *result = NULL; GpStatus status = InvalidParameter; int bit_depth; int channels; BYTE color_type; int num_palette; png_colorp png_palette; png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { goto error; } if (setjmp(png_jmpbuf(png_ptr))) { /* png detected error occured */ goto error; } info_ptr = png_create_info_struct (png_ptr); if (info_ptr == NULL) { goto error; } end_info_ptr = png_create_info_struct (png_ptr); if (end_info_ptr == NULL) { goto error; } if (fp != NULL) { png_init_io (png_ptr, fp); } else { png_set_read_fn (png_ptr, getBytesFunc, _gdip_png_stream_read_data); } png_read_png (png_ptr, info_ptr, 0, NULL); bit_depth = png_get_bit_depth (png_ptr, info_ptr); channels = png_get_channels (png_ptr, info_ptr); color_type = png_get_color_type (png_ptr, info_ptr); /* 2bpp is a special case (promoted to 32bpp ARGB by MS GDI+) */ if ((bit_depth <= 8) && (bit_depth != 2) && (channels == 1) && ((color_type == PNG_COLOR_TYPE_PALETTE) || (color_type == PNG_COLOR_TYPE_GRAY))) { int width; int height; int source_stride; int dest_stride; png_bytep *row_pointers; BYTE *rawptr; int num_colours; int palette_entries; ColorPalette *palette; ImageFlags colourspace_flag; int i; int j; width = png_get_image_width (png_ptr, info_ptr); height = png_get_image_height (png_ptr, info_ptr); source_stride = (width * bit_depth + 7) / 8; dest_stride = source_stride; gdip_align_stride (dest_stride); /* Copy image data. */ row_pointers = png_get_rows (png_ptr, info_ptr); rawdata = GdipAlloc(dest_stride * height); for (i=0; i < height; i++) { memcpy (rawdata + i * dest_stride, row_pointers[i], source_stride); } /* Copy palette. */ num_colours = 1 << bit_depth; if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) { /* A gray-scale image; generate a palette fading from black to white. */ colourspace_flag = ImageFlagsColorSpaceGRAY; palette = gdip_create_greyscale_palette (num_colours); palette->Flags = PaletteFlagsGrayScale; } else { /* Copy the palette data into the GDI+ structure. */ colourspace_flag = ImageFlagsColorSpaceRGB; png_get_PLTE( png_ptr, info_ptr, &png_palette, &num_palette ); palette_entries = num_colours; if (palette_entries > num_palette) { palette_entries = num_palette; } palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB)); palette->Flags = 0; palette->Count = num_colours; for (i=0; i < palette_entries; i++) { set_pixel_bgra (&palette->Entries[i], 0, png_palette[i].blue, png_palette[i].green, png_palette[i].red, 0xFF); /* alpha */ } } { png_bytep trans_alpha; int num_trans; png_color_16p trans_color; /* Make sure transparency is respected. */ png_get_tRNS( png_ptr, info_ptr, &trans_alpha, &num_trans, &trans_color ); if (num_trans > 0) { palette->Flags |= PaletteFlagsHasAlpha; colourspace_flag |= ImageFlagsHasAlpha; if (num_trans > num_palette) { num_trans = num_palette; } for (i=0; i < num_trans; i++) { set_pixel_bgra(&palette->Entries[i], 0, png_palette[i].blue, png_palette[i].green, png_palette[i].red, #if PNG_LIBPNG_VER > 10399 trans_alpha [i]); /* alpha */ #else info_ptr->trans[i]); /* alpha */ #endif } } } result = gdip_bitmap_new_with_frame (&gdip_image_frameDimension_page_guid, TRUE); result->type = ImageTypeBitmap; result->active_bitmap->stride = dest_stride; result->active_bitmap->width = width; result->active_bitmap->height = height; result->active_bitmap->scan0 = rawdata; result->active_bitmap->reserved = GBD_OWN_SCAN0; switch (bit_depth) { case 1: result->active_bitmap->pixel_format = PixelFormat1bppIndexed; result->cairo_format = CAIRO_FORMAT_A1; break; // note: 2bpp is a special case as the format is "promoted" to PixelFormat32bppARGB / CAIRO_FORMAT_ARGB32 // we deal with this later... case 4: result->active_bitmap->pixel_format = PixelFormat4bppIndexed; result->cairo_format = CAIRO_FORMAT_A8; break; case 8: result->active_bitmap->pixel_format = PixelFormat8bppIndexed; result->cairo_format = CAIRO_FORMAT_A8; break; } result->active_bitmap->image_flags = ImageFlagsReadOnly | ImageFlagsHasRealPixelSize | colourspace_flag; /* assigned when the palette is loaded */ result->active_bitmap->dpi_horz = 0; result->active_bitmap->dpi_vert = 0; result->active_bitmap->palette = palette; } /* 2bpp needs to enter here too */ if (!result) { int width; int height; BYTE bit_depth; int stride; int interlace; png_bytep *row_pointers; BYTE *rawptr; int i, j; width = png_get_image_width (png_ptr, info_ptr); height = png_get_image_height (png_ptr, info_ptr); /* 24 and 32bpp are supported, 48, 64bpp aren't, see http://bugzilla.ximian.com/show_bug.cgi?id=80693 */ bit_depth = png_get_bit_depth (png_ptr, info_ptr); if (bit_depth > 8) { g_warning ("PNG images with %dbpp aren't supported by libgdiplus.", channels * bit_depth); status = UnknownImageFormat; goto error; } interlace = png_get_interlace_type (png_ptr, info_ptr); /* According to the libpng manual, this sequence is equivalent to * using the PNG_TRANSFORM_EXPAND flag in png_read_png. */ if (color_type == PNG_COLOR_TYPE_PALETTE) { png_set_palette_to_rgb (png_ptr); } if ((color_type == PNG_COLOR_TYPE_GRAY) && (bit_depth < 8)) { #if PNG_LIBPNG_VER > 10399 png_set_expand_gray_1_2_4_to_8 (png_ptr); #else png_set_gray_1_2_4_to_8(png_ptr); #endif } if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) { png_set_tRNS_to_alpha(png_ptr); } stride = (width * 4); gdip_align_stride (stride); row_pointers = png_get_rows (png_ptr, info_ptr); rawdata = GdipAlloc (stride * height); rawptr = rawdata; switch (channels) { case 4: { for (i = 0; i < height; i++) { png_bytep rowp = row_pointers[i]; for (j = 0; j < width; j++) { BYTE a = rowp[3]; if (a == 0) { set_pixel_bgra (rawptr, 0, 0, 0, 0, 0); } else { BYTE b = rowp[2]; BYTE g = rowp[1]; BYTE r = rowp[0]; set_pixel_bgra (rawptr, 0, b, g, r, a); } rowp += 4; rawptr += 4; } } break; } case 3: { for (i = 0; i < height; i++) { png_bytep rowp = row_pointers[i]; for (j = 0; j < width; j++) { set_pixel_bgra (rawptr, 0, rowp[2], rowp[1], rowp[0], 0xff); rowp += 3; rawptr += 4; } } break; } case 1: for (i = 0; i < height; i++) { png_bytep rowp = row_pointers[i]; if (bit_depth == 2) { // 4 pixels for each byte for (j = 0; j < (width >> bit_depth); j++) { png_byte palette = 0; png_byte pix = *rowp++; palette = (pix >> 6) & 0x03; set_pixel_bgra (rawptr, 0, png_palette[palette].blue, png_palette[palette].green, png_palette[palette].red, 0xFF); /* alpha */ palette = (pix >> 4) & 0x03; set_pixel_bgra (rawptr, 4, png_palette[palette].blue, png_palette[palette].green, png_palette[palette].red, 0xFF); /* alpha */ palette = (pix >> 2) & 0x03; set_pixel_bgra (rawptr, 8, png_palette[palette].blue, png_palette[palette].green, png_palette[palette].red, 0xFF); /* alpha */ palette = pix & 0x03; set_pixel_bgra (rawptr, 12, png_palette[palette].blue, png_palette[palette].green, png_palette[palette].red, 0xFF); /* alpha */ rawptr += 16; } } else { for (j = 0; j < width; j++) { png_byte pix = *rowp++; set_pixel_bgra (rawptr, 0, pix, pix, pix, 0xff); rawptr += 4; } } } break; } result = gdip_bitmap_new_with_frame (&gdip_image_frameDimension_page_guid, TRUE); result->type = ImageTypeBitmap; result->cairo_format = CAIRO_FORMAT_ARGB32; result->active_bitmap->stride = stride; result->active_bitmap->pixel_format = PixelFormat32bppARGB; result->active_bitmap->width = width; result->active_bitmap->height = height; result->active_bitmap->scan0 = rawdata; result->active_bitmap->reserved = GBD_OWN_SCAN0; result->surface = cairo_image_surface_create_for_data ((BYTE*)rawdata, result->cairo_format, result->active_bitmap->width, result->active_bitmap->height, result->active_bitmap->stride); if (channels == 3) { result->active_bitmap->pixel_format = PixelFormat24bppRGB; result->active_bitmap->image_flags = ImageFlagsColorSpaceRGB; } else if (channels == 4) { result->active_bitmap->pixel_format = PixelFormat32bppARGB; result->active_bitmap->image_flags = ImageFlagsColorSpaceRGB; } else if ((channels == 1) && (color_type == PNG_COLOR_TYPE_GRAY)) { // doesn't apply to 2bpp images result->active_bitmap->pixel_format = PixelFormat8bppIndexed; result->active_bitmap->image_flags = ImageFlagsColorSpaceGRAY; } if (color_type & PNG_COLOR_MASK_ALPHA) result->active_bitmap->image_flags |= ImageFlagsHasAlpha; result->active_bitmap->image_flags |= ImageFlagsReadOnly | ImageFlagsHasRealPixelSize; result->active_bitmap->dpi_horz = 0; result->active_bitmap->dpi_vert = 0; } gdip_load_png_properties(png_ptr, info_ptr, end_info_ptr, result->active_bitmap); png_destroy_read_struct (&png_ptr, &info_ptr, &end_info_ptr); *image = result; return Ok; error: /* coverity[dead_error_line] */ if (rawdata) { GdipFree (rawdata); } if (png_ptr) { png_destroy_read_struct (&png_ptr, info_ptr ? &info_ptr : (png_infopp) NULL, end_info_ptr ? &end_info_ptr : (png_infopp) NULL); } *image = NULL; return status; } GpStatus gdip_load_png_image_from_file (FILE *fp, GpImage **image) { return gdip_load_png_image_from_file_or_stream (fp, NULL, image); } GpStatus gdip_load_png_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seeknFunc, GpImage **image) { return gdip_load_png_image_from_file_or_stream (NULL, getBytesFunc, image); } static GpStatus gdip_save_png_image_to_file_or_stream (FILE *fp, PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { png_structp png_ptr = NULL; png_infop info_ptr = NULL; int i; int bit_depth; int color_type; png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) { goto error; } if (setjmp(png_jmpbuf(png_ptr))) { /* png detected error occured */ goto error; } info_ptr = png_create_info_struct(png_ptr); if (!info_ptr) { goto error; } if (fp != NULL) { png_init_io (png_ptr, fp); } else { png_set_write_fn (png_ptr, putBytesFunc, _gdip_png_stream_write_data, _gdip_png_stream_flush_data); } switch (image->active_bitmap->pixel_format) { case PixelFormat32bppARGB: case PixelFormat32bppPARGB: case PixelFormat32bppRGB: color_type = PNG_COLOR_TYPE_RGB_ALPHA; bit_depth = 8; break; case PixelFormat24bppRGB: color_type = PNG_COLOR_TYPE_RGB; /* FIXME - we should be able to write grayscale PNGs */ bit_depth = 8; break; case PixelFormat8bppIndexed: color_type = PNG_COLOR_TYPE_PALETTE; bit_depth = 8; break; case PixelFormat4bppIndexed: color_type = PNG_COLOR_TYPE_PALETTE; bit_depth = 4; break; case PixelFormat1bppIndexed: color_type = PNG_COLOR_TYPE_PALETTE; bit_depth = 1; break; /* We're not going to even try to save these images, for now */ case PixelFormat64bppARGB: case PixelFormat64bppPARGB: case PixelFormat48bppRGB: case PixelFormat16bppARGB1555: case PixelFormat16bppGrayScale: case PixelFormat16bppRGB555: case PixelFormat16bppRGB565: default: color_type = -1; bit_depth = -1; break; } if (bit_depth == -1) { goto error; } png_set_IHDR (png_ptr, info_ptr, image->active_bitmap->width, image->active_bitmap->height, bit_depth, color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format)) { png_color palette[256]; int palette_entries = image->active_bitmap->palette->Count; if (image->active_bitmap->pixel_format == PixelFormat4bppIndexed) { palette_entries = 16; } for (i=0; i < palette_entries; i++) { ARGB entry = image->active_bitmap->palette->Entries[i]; int dummy; get_pixel_bgra(entry, palette[i].blue, palette[i].green, palette[i].red, dummy); } png_set_PLTE (png_ptr, info_ptr, palette, palette_entries); } png_set_filter (png_ptr, 0, PNG_NO_FILTERS); png_set_sRGB_gAMA_and_cHRM (png_ptr, info_ptr, PNG_sRGB_INTENT_PERCEPTUAL); png_write_info (png_ptr, info_ptr); #if 0 if ((image->active_bitmap->pixel_format == Format24bppRGB) || (image->active_bitmap->pixel_format == Format32bppRGB)) { png_set_filler (png_ptr, 0, PNG_FILLER_AFTER); } else if (image->active_bitmap->pixel_format == Format8bppIndexed) { png_set_filler (png_ptr, 0, PNG_FILLER_AFTER); } #endif png_set_bgr(png_ptr); if (gdip_is_an_indexed_pixelformat (image->active_bitmap->pixel_format)) { for (i = 0; i < image->active_bitmap->height; i++) { png_write_row (png_ptr, image->active_bitmap->scan0 + i * image->active_bitmap->stride); } } else if (image->active_bitmap->pixel_format == PixelFormat24bppRGB) { int j; BYTE *row_pointer = GdipAlloc (image->active_bitmap->width * 3); for (i = 0; i < image->active_bitmap->height; i++) { for (j = 0; j < image->active_bitmap->width; j++) { #ifdef WORDS_BIGENDIAN row_pointer[j*3 ] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 3); row_pointer[j*3+1] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 2); row_pointer[j*3+2] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 1); #else row_pointer[j*3 ] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 0); row_pointer[j*3+1] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 1); row_pointer[j*3+2] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 2); #endif /* WORDS_BIGENDIAN */ } png_write_row (png_ptr, row_pointer); } GdipFree (row_pointer); } else { #ifdef WORDS_BIGENDIAN int j; BYTE *row_pointer = GdipAlloc (image->active_bitmap->width * 4); for (i = 0; i < image->active_bitmap->height; i++) { for (j = 0; j < image->active_bitmap->width; j++) { row_pointer[j*4] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 3); row_pointer[j*4+1] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 2); row_pointer[j*4+2] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 1); row_pointer[j*4+3] = *((BYTE*)image->active_bitmap->scan0 + (image->active_bitmap->stride * i) + (j*4) + 0); } png_write_row (png_ptr, row_pointer); } GdipFree (row_pointer); #else for (i = 0; i < image->active_bitmap->height; i++) { png_write_row (png_ptr, image->active_bitmap->scan0 + (image->active_bitmap->stride * i)); } #endif } png_write_end (png_ptr, NULL); png_destroy_write_struct (&png_ptr, &info_ptr); return Ok; error: if (png_ptr) { png_destroy_write_struct (&png_ptr, info_ptr ? &info_ptr : NULL); } return GenericError; } GpStatus gdip_save_png_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) { return gdip_save_png_image_to_file_or_stream (fp, NULL, image, params); } GpStatus gdip_save_png_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return gdip_save_png_image_to_file_or_stream (NULL, putBytesFunc, image, params); } #else #include "pngcodec.h" GpStatus gdip_load_png_image_from_file (FILE *fp, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_load_png_image_from_stream_delegate (GetBytesDelegate getBytesFunc, SeekDelegate seeknFunc, GpImage **image) { *image = NULL; return UnknownImageFormat; } GpStatus gdip_save_png_image_to_file (FILE *fp, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } GpStatus gdip_save_png_image_to_stream_delegate (PutBytesDelegate putBytesFunc, GpImage *image, GDIPCONST EncoderParameters *params) { return UnknownImageFormat; } ImageCodecInfo * gdip_getcodecinfo_png () { return NULL; } #endif /* HAVE_LIBPNG */ libgdiplus-2.11/src/text-pango.c0000664000175000017500000003153512225470167013554 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "gdiplus-private.h" #ifdef USE_PANGO_RENDERING #include "text-pango-private.h" #include "graphics-private.h" #include "graphics-cairo-private.h" #include "brush-private.h" #include "font-private.h" /* * NOTE: all parameter's validations are done inside text.c */ static PangoAttrList* gdip_get_layout_attributes (PangoLayout *layout) { PangoAttrList *list = pango_layout_get_attributes (layout); if (!list) list = pango_attr_list_new (); else pango_attr_list_ref (list); return list; } static void gdip_process_accelerators (gchar *text, int length, PangoAttrList *list) { int i; for (i = 0; i < length; i++) { if (*(text + i) == GDIP_WINDOWS_ACCELERATOR) { /* don't show the prefix character */ *(text + i) = GDIP_PANGOHACK_ACCELERATOR; /* if the next character is an accelerator then skip over it (&& == &) */ if ((i < length - 1) && (*(text + i + 1) == GDIP_WINDOWS_ACCELERATOR)) { i++; } else if (list) { /* add an attribute on the next character */ PangoAttribute *attr = pango_attr_underline_new (PANGO_UNDERLINE_LOW); attr->start_index = i + 1; attr->end_index = i + 2; pango_attr_list_insert (list, attr); } } } } PangoLayout* gdip_pango_setup_layout (cairo_t *ct, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, RectF *box, GDIPCONST GpStringFormat *format) { GpStringFormat *fmt; PangoLayout *layout; PangoContext *context; PangoMatrix matrix = PANGO_MATRIX_INIT; PangoRectangle logical; PangoAttrList *list = NULL; gchar *text = ucs2_to_utf8 (stringUnicode, length); if (!text) return NULL; //g_warning ("layout >%s< (%d) [x %g, y %g, w %g, h %g] [font %s, %g points]", text, length, rc->X, rc->Y, rc->Width, rc->Height, font->face, font->emSize); /* a NULL format is valid, it means get the generic default values (and free them later) */ if (!format) { GpStatus status = GdipStringFormatGetGenericDefault ((GpStringFormat **)&fmt); if (status != Ok) { GdipFree (text); return NULL; } } else { fmt = (GpStringFormat *)format; } /* unless specified we don't consider the trailing spaces, unless there is just one space (#80680) */ if ((fmt->formatFlags & StringFormatFlagsMeasureTrailingSpaces) == 0) { while ((length > 0) && (isspace (*(text + length - 1)))) length--; if (length == 0) length = 1; } layout = pango_cairo_create_layout (ct); /* context is owned by Pango (i.e. not referenced counted) do not free */ context = pango_layout_get_context (layout); pango_layout_set_font_description (layout, gdip_get_pango_font_description ((GpFont*) font)); if ((rc->Width <= 0.0) || (fmt->formatFlags & StringFormatFlagsNoWrap)) { pango_layout_set_width (layout, -1); } else { /* minus one to deal with our AA offset */ int width = rc->Width - 1; /* TODO incomplete (missing height adjustment) */ if ((fmt->formatFlags & StringFormatFlagsNoFitBlackBox) == 0) width -= 2; pango_layout_set_width (layout, width * PANGO_SCALE); } if (fmt->formatFlags & StringFormatFlagsDirectionRightToLeft) { /* with GDI+ the API not the renderer makes the direction decision */ pango_layout_set_auto_dir (layout, FALSE); pango_context_set_base_dir (context, PANGO_DIRECTION_RTL); pango_layout_context_changed (layout); /* horizontal alignment */ switch (fmt->alignment) { case StringAlignmentNear: pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT); break; case StringAlignmentCenter: pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); break; case StringAlignmentFar: pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT); break; } } else { /* horizontal alignment */ switch (fmt->alignment) { case StringAlignmentNear: pango_layout_set_alignment (layout, PANGO_ALIGN_LEFT); break; case StringAlignmentCenter: pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); break; case StringAlignmentFar: pango_layout_set_alignment (layout, PANGO_ALIGN_RIGHT); break; } } #ifdef PANGO_VERSION_CHECK #if PANGO_VERSION_CHECK(1,16,0) if (fmt->formatFlags & StringFormatFlagsDirectionVertical) { /* only since Pango 1.16 */ pango_context_set_base_gravity (context, PANGO_GRAVITY_EAST); pango_context_set_gravity_hint (context, PANGO_GRAVITY_HINT_STRONG); pango_layout_context_changed (layout); } #endif #endif /* TODO - StringFormatFlagsDisplayFormatControl scan and replace them ??? */ /* TODO - StringFormatFlagsLineLimit */ if ((rc->Width != 0) && (rc->Height != 0) && ((fmt->formatFlags & StringFormatFlagsNoClip) == 0)) { //g_warning ("\tclip [%g %g %g %g]", rc->X, rc->Y, rc->Width, rc->Height); /* We do not call cairo_reset_clip because we want to take previous clipping into account */ cairo_rectangle (ct, rc->X, rc->Y, rc->Width + 0.5, rc->Height + 0.5); cairo_clip (ct); } switch (fmt->trimming) { case StringTrimmingNone: pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_NONE); break; case StringTrimmingCharacter: pango_layout_set_wrap (layout, PANGO_WRAP_CHAR); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_NONE); break; case StringTrimmingWord: pango_layout_set_wrap (layout, PANGO_WRAP_WORD); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_NONE); break; case StringTrimmingEllipsisCharacter: pango_layout_set_wrap (layout, PANGO_WRAP_CHAR); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); break; case StringTrimmingEllipsisWord: pango_layout_set_wrap (layout, PANGO_WRAP_WORD); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_END); break; case StringTrimmingEllipsisPath: pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR); pango_layout_set_ellipsize (layout, PANGO_ELLIPSIZE_MIDDLE); break; } /* some stuff can only be done by manipulating the attributes (but we can avoid this most of the time) */ if ((fmt->formatFlags & StringFormatFlagsNoFontFallback) || (font->style & (FontStyleUnderline | FontStyleStrikeout))) { list = gdip_get_layout_attributes (layout); /* StringFormatFlagsNoFontFallback */ if (fmt->formatFlags & StringFormatFlagsNoFontFallback) { PangoAttribute *attr = pango_attr_fallback_new (FALSE); attr->start_index = 0; attr->end_index = length; pango_attr_list_insert (list, attr); } if (font->style & FontStyleUnderline) { PangoAttribute *attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE); attr->start_index = 0; attr->end_index = length; pango_attr_list_insert (list, attr); } if (font->style & FontStyleStrikeout) { PangoAttribute *attr = pango_attr_strikethrough_new (TRUE); attr->start_index = 0; attr->end_index = length; pango_attr_list_insert (list, attr); } } switch (fmt->hotkeyPrefix) { case HotkeyPrefixHide: /* we need to remove any accelerator from the string */ gdip_process_accelerators (text, length, NULL); break; case HotkeyPrefixShow: /* optimization: is seems that we never see the hotkey when using an underline font */ if (font->style & FontStyleUnderline) { /* so don't bother drawing it (and simply add the '&' character) */ gdip_process_accelerators (text, length, NULL); } else { /* find accelerator and add attribute to the next character (unless it's the prefix too) */ if (!list) list = gdip_get_layout_attributes (layout); gdip_process_accelerators (text, length, list); } break; default: break; } if (list) { pango_layout_set_attributes (layout, list); pango_attr_list_unref (list); } pango_layout_set_text (layout, text, length); GdipFree (text); pango_layout_get_pixel_extents (layout, NULL, &logical); //g_warning ("\tlogical\t[x %d, y %d, w %d, h %d]", logical.x, logical.y, logical.width, logical.height); box->X = rc->X; box->Y = rc->Y; box->Height = logical.height; /* add an extra pixel for our AA hack + 2 more if we don't draw on the box itself */ box->Width = logical.width + (fmt->formatFlags & StringFormatFlagsNoFitBlackBox) ? 1 : 3; //g_warning ("\tbox\t[x %g, y %g, w %g, h %g]", box->X, box->Y, box->Width, box->Height); /* vertical alignment*/ switch (fmt->lineAlignment) { case StringAlignmentNear: break; case StringAlignmentCenter: box->Y += (rc->Height - logical.height) / 2; break; case StringAlignmentFar: box->Y += (rc->Height - logical.height); break; } //g_warning ("va-box\t[x %g, y %g, w %g, h %g]", box->X, box->Y, box->Width, box->Height); pango_cairo_update_layout (ct, layout); return layout; } GpStatus pango_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) { PangoLayout *layout; RectF box; cairo_save (graphics->ct); layout = gdip_pango_setup_layout (graphics->ct, stringUnicode, length, font, rc, &box, format); if (!layout) { cairo_restore (graphics->ct); return OutOfMemory; } /* Setup cairo */ if (brush) { gdip_brush_setup (graphics, brush); } else { cairo_set_source_rgb (graphics->ct, 0., 0., 0.); } gdip_cairo_move_to (graphics, box.X, box.Y, FALSE, TRUE); pango_cairo_show_layout (graphics->ct, layout); g_object_unref (layout); cairo_restore (graphics->ct); return Ok; } GpStatus pango_MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, RectF *boundingBox, int *codepointsFitted, int *linesFilled) { PangoLayout *layout; cairo_save (graphics->ct); layout = gdip_pango_setup_layout (graphics->ct, stringUnicode, length, font, rc, boundingBox, format); if (!layout) { cairo_restore (graphics->ct); return OutOfMemory; } if (codepointsFitted) { // TODO - dummy (total) value returned *codepointsFitted = length; } if (linesFilled) { *linesFilled = pango_layout_get_line_count (layout); //g_warning ("linesFilled %d", *linesFilled); } //else g_warning ("linesFilled %d", pango_layout_get_line_count (layout)); g_object_unref (layout); cairo_restore (graphics->ct); return Ok; } GpStatus pango_MeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layoutRect, GDIPCONST GpStringFormat *format, int regionCount, GpRegion **regions) { PangoLayout *layout; GpStatus status = Ok; int i, j; GpRectF boundingBox; cairo_save (graphics->ct); layout = gdip_pango_setup_layout (graphics->ct, stringUnicode, length, font, layoutRect, &boundingBox, format); if (!layout) { cairo_restore (graphics->ct); return OutOfMemory; } /* Create a region for every char range */ for (i = 0; i < format->charRangeCount; i++) { int start, end; CharacterRange range = format->charRanges [i]; GdipSetEmpty (regions [i]); if (range.Length > 0) start = range.First; else start = range.First + range.Length; end = start + range.Length; /* sanity check on charRange. negative lengths are allowed */ if (range.First < 0) { status = InvalidParameter; goto cleanup; } if ((start < 0) || (end > length)) { status = InvalidParameter; goto cleanup; } /* calculate the regions */ for (j = start; j < end; j++) { PangoRectangle box; GpRectF charRect; pango_layout_index_to_pos (layout, j, &box); charRect.X = (float)box.x / PANGO_SCALE; charRect.Y = (float)box.y / PANGO_SCALE; charRect.Width = (float)box.width / PANGO_SCALE; charRect.Height = (float)box.height / PANGO_SCALE; //g_warning ("[%d] [%d : %d-%d] %c [x %g y %g w %g h %g]", i, j, start, end, (char)stringUnicode[j], charRect.X, charRect.Y, charRect.Width, charRect.Height); status = GdipCombineRegionRect (regions [i], &charRect, CombineModeUnion); if (status != Ok) break; } if (status != Ok) break; } cleanup: cairo_restore (graphics->ct); return status; } #endif libgdiplus-2.11/src/emfcodec.c0000664000175000017500000004605112225470167013232 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "emfcodec.h" //#define DEBUG_EMF_ALL #ifdef DEBUG_EMF_ALL #define DEBUG_EMF #define DEBUG_EMF_2 #define DEBUG_EMF_3 #define DEBUG_EMF_NOTIMPLEMENTED #endif #ifdef DEBUG_EMF_NOTIMPLEMENTED #define NOTIMPLEMENTED(s) printf(s) #define NOTIMPLEMENTED1(s,p1) printf(s, (p1)) #define NOTIMPLEMENTED2(s,p1,p2) printf(s, (p1), (p2)) #define NOTIMPLEMENTED3(s,p1,p2,p3) printf(s, (p1), (p2), (p3)) #define NOTIMPLEMENTED4(s,p1,p2,p3,p4) printf(s, (p1), (p2), (p3), (p4)) #define NOTIMPLEMENTED5(s,p1,p2,p3,p4,p5) printf(s, (p1), (p2), (p3), (p4), (p5)) #define NOTIMPLEMENTED6(s,p1,p2,p3,p4,p5,p6) printf(s, (p1), (p2), (p3), (p4), (p5), (p6)) #else #define NOTIMPLEMENTED(s) #define NOTIMPLEMENTED1(s,p1) #define NOTIMPLEMENTED2(s,p1,p2) #define NOTIMPLEMENTED3(s,p1,p2,p3) #define NOTIMPLEMENTED4(s,p1,p2,p3,p4) #define NOTIMPLEMENTED5(s,p1,p2,p3,p4,p5) #define NOTIMPLEMENTED6(s,p1,p2,p3,p4,p5,p6) #endif GUID gdip_emf_image_format_guid = {0xb96b3cacU, 0x0728U, 0x11d3U, {0x9d, 0x7b, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e}}; /* Codecinfo related data*/ static ImageCodecInfo emf_codec; static const WCHAR emf_codecname[] = {'B', 'u', 'i','l', 't', '-','i', 'n', ' ', 'E', 'M', 'F', 0}; /* Built-in EMF */ static const WCHAR emf_extension[] = {'*','.','E', 'M', 'F', 0}; /* *.EMF */ static const WCHAR emf_mimetype[] = {'i', 'm', 'a','g', 'e', '/', 'x', '-', 'e', 'm', 'f', 0}; /* image/x-emf */ static const WCHAR emf_format[] = {'E', 'M', 'F', 0}; /* EMF */ static const BYTE emf_sig_pattern[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x45, 0x4D, 0x46 }; static const BYTE emf_sig_mask[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF }; ImageCodecInfo* gdip_getcodecinfo_emf () { emf_codec.Clsid = (CLSID) { 0x557cf403, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }; emf_codec.FormatID = gdip_emf_image_format_guid; emf_codec.CodecName = (const WCHAR*) emf_codecname; emf_codec.DllName = NULL; emf_codec.FormatDescription = (const WCHAR*) emf_format; emf_codec.FilenameExtension = (const WCHAR*) emf_extension; emf_codec.MimeType = (const WCHAR*) emf_mimetype; emf_codec.Flags = ImageCodecFlagsDecoder | ImageCodecFlagsSupportBitmap | ImageCodecFlagsBuiltin; emf_codec.Version = 1; emf_codec.SigCount = 1; emf_codec.SigSize = 44; emf_codec.SigPattern = emf_sig_pattern; emf_codec.SigMask = emf_sig_mask; return &emf_codec; } #if G_BYTE_ORDER == G_LITTLE_ENDIAN #define GETDW(x) (*(DWORD*)(data + (x))) #define GETFLOAT(x) (*(float*)(data + (x))) #else #define GETDW(x) (GUINT32_FROM_LE(*(DWORD*)(data + (x)))) #define GETFLOAT(x) ((float)GETDW(x)) #endif static DWORD GetColor (DWORD color) { BYTE *p = (BYTE*)&color; BYTE temp = p[0]; p[0] = p[2]; p[2] = temp; return color; } static GpStatus PolyBezier (MetafilePlayContext *context, BYTE *data, int len, BOOL compact) { DWORD num; GpPointF *points, *pt; GpStatus status; int p, n = 0; RECTL bounds; bounds.left = GETDW(DWP(n)); n++; bounds.top = GETDW(DWP(n)); n++; bounds.right = GETDW(DWP(n)); n++; bounds.bottom = GETDW(DWP(n)); n++; /* make sure we're not reading more data than what's available in this record */ num = GETDW(DWP(n)); n++; if (compact) { /* len = bounds (4 * DWORD) + num (DWORD) + 2 * num * (x WORD + y WORD) */ if (num > ((len - 5 * sizeof (DWORD)) >> 2)) return InvalidParameter; } else { /* len = bounds (4 * DWORD) + num (DWORD) + 2 * num * (x DWORD + y DWORD) */ if (num > ((len - 5 * sizeof (DWORD)) >> 3)) return InvalidParameter; } #ifdef DEBUG_EMF printf ("PolyBezier%s bounds [%d, %d, %d, %d] with %d points", (compact ? "16" : ""), bounds.left, bounds.top, bounds.right, bounds.bottom, num); #endif /* we need to supply the current x,y position */ points = (GpPointF*) GdipAlloc ((num + 1) * sizeof (GpPointF)); if (!points) return OutOfMemory; pt = points; pt->X = context->current_x; pt->Y = context->current_y; #ifdef DEBUG_EMF_2 printf ("\n\tmoveto to %g,%g", pt->X, pt->Y); #endif context->path_x = pt->X; context->path_y = pt->Y; pt++; for (p = 0; p < num; p++, pt++) { if (compact) { DWORD xy = GETDW(DWP(n)); n++; pt->X = (xy & 0x0000FFFF); pt->Y = (xy >> 16); } else { pt->X = GETDW(DWP(n)); n++; pt->Y = GETDW(DWP(n)); n++; } #ifdef DEBUG_EMF_2 printf ("\n\tbezier to %g,%g", pt->X, pt->Y); #endif } /* keep last point of the path so we can close the figure as GDI does (line) */ pt--; context->current_x = pt->X; context->current_y = pt->Y; /* PolyBezier doesn't use the current point (GDI wise) but metafiles seems different */ status = gdip_metafile_PolyBezier (context, points, num + 1); GdipFree (points); return status; } /* the structure is different from WMF (16 or 32bits, RECTL bounds) */ static GpStatus Polygon (MetafilePlayContext *context, BYTE *data, int len, BOOL compact) { DWORD num; GpPointF *points, *pt; GpStatus status; int p, n = 0; RECTL bounds; bounds.left = GETDW(DWP(n)); n++; bounds.top = GETDW(DWP(n)); n++; bounds.right = GETDW(DWP(n)); n++; bounds.bottom = GETDW(DWP(n)); n++; /* make sure we're not reading more data than what's available in this record */ num = GETDW(DWP(n)); n++; if (compact) { /* len = bounds (4 * DWORD) + num (DWORD) + 2 * num * (x WORD + y WORD) */ if (num > ((len - 5 * sizeof (DWORD)) >> 2)) return InvalidParameter; } else { /* len = bounds (4 * DWORD) + num (DWORD) + 2 * num * (x DWORD + y DWORD) */ if (num > ((len - 5 * sizeof (DWORD)) >> 3)) return InvalidParameter; } #ifdef DEBUG_EMF printf ("Polygon%s bounds [%d, %d, %d, %d] with %d points", (compact ? "16" : ""), bounds.left, bounds.top, bounds.right, bounds.bottom, num); #endif points = (GpPointF*) GdipAlloc (num * sizeof (GpPointF)); if (!points) return OutOfMemory; for (p = 0, pt = points; p < num; p++, pt++) { if (compact) { DWORD xy = GETDW(DWP(n)); n++; pt->X = (xy & 0x0000FFFF); pt->Y = (xy >> 16); } else { pt->X = GETDW(DWP(n)); n++; pt->Y = GETDW(DWP(n)); n++; } #ifdef DEBUG_EMF_2 printf ("\n\tpoly to %g,%g", pt->X, pt->Y); #endif } status = gdip_metafile_Polygon (context, points, num); GdipFree (points); return status; } /* the structure is different from WMF */ static GpStatus PolyPolygon (MetafilePlayContext *context, BYTE *data, BOOL compact) { GpStatus status = Ok; int poly_num; int n = 0; RECTL bounds; bounds.left = GETDW(DWP(n)); n++; bounds.top = GETDW(DWP(n)); n++; bounds.right = GETDW(DWP(n)); n++; bounds.bottom = GETDW(DWP(n)); n++; /* variable number of polygons */ poly_num = GETDW(DWP(n)); n++; /* total number of points (in all polygons)*/ int total = GETDW(DWP(n)); n++; int i; PointFList *list = GdipAlloc (poly_num * sizeof (PointFList)); PointFList *current = list; #ifdef DEBUG_EMF printf ("PolyPolygon%s bounds [%d, %d, %d, %d] with %d polygons", (compact ? "16" : ""), bounds.left, bounds.top, bounds.right, bounds.bottom, poly_num); #endif /* read size of each polygon and allocate the required memory */ for (i = 0; i < poly_num; i++) { current->num = GETDW(DWP(n)); n++; current->points = (GpPointF*) GdipAlloc (current->num * sizeof (GpPointF)); #ifdef DEBUG_EMF_2 printf ("\n\tSub Polygon #%d has %d points", i, current->num); #endif current++; } /* read the points for each polygons */ current = list; for (i = 0; i < poly_num; i++) { GpPointF *pt = current->points; int p; for (p = 0; p < current->num; p++) { if (compact) { DWORD xy = GETDW(DWP(n)); n++; pt->X = (xy & 0x0000FFFF); pt->Y = (xy >> 16); } else { pt->X = GETDW(DWP(n)); n++; pt->Y = GETDW(DWP(n)); n++; } #ifdef DEBUG_EMF_3 printf ("\n\t\tpoly to %g,%g", pt->X, pt->Y); #endif pt++; } GpStatus s = gdip_metafile_Polygon (context, current->points, current->num); if (s != Ok) status = s; /* free points */ GdipFree (current->points); current++; } /* all points were freed, after being drawn, so we just have to free the polygon list*/ GdipFree (list); return status; } static GpStatus EndOfFile (MetafilePlayContext *context, DWORD value, BYTE* data) { /* TODO - process extra stuff if any */ return Ok; } /* http://wvware.sourceforge.net/caolan/ora-wmf.html */ GpStatus GdiComment (MetafilePlayContext *context, BYTE* data, DWORD size) { #ifdef DEBUG_EMF printf ("GdiComment record size %d", size); #endif DWORD length = GETDW(DWP1); if (length >= 4) { DWORD header = GETDW(DWP2); if ((header == 0x2B464D45) && (size >= 8)) { #ifdef DEBUG_EMF_2 printf (", EMF+ length %d", length); #endif /* move past func, size, comment length, remove EMF+ comment header */ data += sizeof (DWORD) * 4; /* remove EMF+ header from length */ length -= sizeof (DWORD); /* play the EMF+ comment-embedded block */ return gdip_metafile_play_emfplus_block (context, data, length); } } #ifdef DEBUG_EMF_NOTIMPLEMENTED int i; printf (" - "); for (i = 0; i < size; i++) printf ("%2X ", *data++); #endif return Ok; } static GpStatus ExtCreatePen (MetafilePlayContext *context, BYTE *data, int size) { LOGBRUSH lb; #ifdef DEBUG_EMF printf ("EMR_EXTCREATEPEN"); #endif if ((GETDW(DWP2) != size) || (GETDW(DWP3) != 0) || (GETDW(DWP4) != size) || (GETDW(DWP5) != 0)) return InvalidParameter; lb.lbStyle = GETDW(DWP8); lb.lbColor = GetColor(GETDW(DWP9)); lb.lbHatch = GETDW(DWP10); return gdip_metafile_ExtCreatePen (context, GETDW(DWP6), GETDW(DWP7), &lb, GETDW(DWP11), NULL); } static GpStatus ModifyWorldTransform (MetafilePlayContext *context, float eM11, float eM12, float eM21, float eM22, float eDx, float eDy, DWORD iMode) { XFORM xf; xf.eM11 = eM11; xf.eM12 = eM12; xf.eM21 = eM21; xf.eM22 = eM22; xf.eDx = eDx; xf.eDy = eDy; return gdip_metafile_ModifyWorldTransform (context, &xf, iMode); } /* * This is very similar in design to the WMF parser, the biggest changes being... * * - The EMF records are based on 32bits units (unlike WMF records which are 16bits); * - The order the size and function parameter is reversed (from WMF); * - The size parameter is represented in bytes (not in WORD like WMF); * - Minimum record size is 8 bytes (function DWORD + size DWORD); * - There are now a record types to start (1) and end (14) the metafiles; */ GpStatus gdip_metafile_play_emf (MetafilePlayContext *context) { GpStatus status = Ok; GpMetafile *metafile = context->metafile; GpGraphics *graphics = context->graphics; BYTE *data = metafile->data; BYTE *end = data + metafile->length; #ifdef DEBUG_EMF int i = 1, j; #endif /* check for empty or recording metafile */ if (!data) return Ok; /* reality check - each record is, at minimum, 8 bytes long (when size == 0) */ while (data < end - EMF_MIN_RECORD_SIZE) { /* record */ DWORD func = GETDW(EMF_FUNCTION); DWORD size = GETDW(EMF_RECORDSIZE); int params = (size - EMF_MIN_RECORD_SIZE) / sizeof (DWORD); #ifdef DEBUG_EMF printf ("\n[#%d] size %d ", i++, size); #endif switch (func) { case EMR_POLYBEZIER: status = PolyBezier (context, data, size - EMF_MIN_RECORD_SIZE, FALSE); break; case EMR_POLYGON: status = Polygon (context, data, size - EMF_MIN_RECORD_SIZE, FALSE); break; case EMR_POLYPOLYGON: status = PolyPolygon (context, data, FALSE); break; case EMR_SETWINDOWEXTEX: EMF_CHECK_PARAMS(2); status = gdip_metafile_SetWindowExt (context, GETDW(DWP1), GETDW(DWP2)); break; case EMR_SETWINDOWORGEX: EMF_CHECK_PARAMS(2); status = gdip_metafile_SetWindowOrg (context, GETDW(DWP1), GETDW(DWP2)); break; case EMR_SETVIEWPORTEXTEX: EMF_CHECK_PARAMS(2); NOTIMPLEMENTED2("EMR_SETVIEWPORTEXTEX not implemented %d, %d", GETDW(DWP1), GETDW(DWP2)); break; case EMR_SETVIEWPORTORGEX: EMF_CHECK_PARAMS(2); NOTIMPLEMENTED2("EMR_SETVIEWPORTORGEX not implemented %d, %d", GETDW(DWP1), GETDW(DWP2)); break; case EMR_SETBRUSHORGEX: EMF_CHECK_PARAMS(2); NOTIMPLEMENTED2("EMR_SETBRUSHORGEX not implemented %d, %d", GETDW(DWP1), GETDW(DWP2)); break; case EMR_EOF: EMF_CHECK_PARAMS(3); #ifdef DEBUG_EMF printf ("EndOfRecord %d %d %d", GETDW(DWP1), GETDW(DWP2), GETDW(DWP3)); #endif status = Ok; /* rest of the metafile can contains other stuff than records (e.g. palette information) */ data += size; goto cleanup; case EMR_SETMAPMODE: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetMapMode (context, GETDW(DWP1)); break; case EMR_SETBKMODE: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetBkMode (context, GETDW(DWP1)); break; case EMR_SETPOLYFILLMODE: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetPolyFillMode (context, GETDW(DWP1)); break; case EMR_SETROP2: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetROP2 (context, GETDW(DWP1)); break; case EMR_SETSTRETCHBLTMODE: NOTIMPLEMENTED("EMR_SETSTRETCHBLTMODE not implemented"); break; case EMR_SETTEXTALIGN: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetTextAlign (context, GETDW(DWP1)); break; case EMR_SETTEXTCOLOR: EMF_CHECK_PARAMS(1); NOTIMPLEMENTED1("EMR_SETTEXTCOLOR %d not implemented", GETDW(DWP1)); break; case EMR_MOVETOEX: EMF_CHECK_PARAMS(2); status = gdip_metafile_MoveTo (context, GETDW(DWP1), GETDW(DWP2)); break; case EMR_INTERSECTCLIPRECT: EMF_CHECK_PARAMS(4); NOTIMPLEMENTED4("EMR_INTERSECTCLIPRECT %d, %d, %d, %d not implemented", GETDW(DWP1), GETDW(DWP1), GETDW(DWP3), GETDW(DWP4)); break; case EMR_SAVEDC: EMF_CHECK_PARAMS(0); NOTIMPLEMENTED("EMR_SAVEDC not implemented"); break; case EMR_RESTOREDC: EMF_CHECK_PARAMS(1); NOTIMPLEMENTED1("EMR_RESTOREDC %d not implemented", GETDW(DWP1)); break; case EMR_SETWORLDTRANSFORM: EMF_CHECK_PARAMS(6); NOTIMPLEMENTED6("EMR_SETWORLDTRANSFORM %d not implemented", GETDW(DWP1), GETDW(DWP2), GETDW(DWP3), GETDW(DWP4), GETDW(DWP5), GETDW(DWP6)); break; case EMR_MODIFYWORLDTRANSFORM: EMF_CHECK_PARAMS(7); status = ModifyWorldTransform (context, GETFLOAT(DWP1), GETFLOAT(DWP2), GETFLOAT(DWP3), GETFLOAT(DWP4), GETFLOAT(DWP5), GETFLOAT(DWP6), GETDW(DWP7)); break; case EMR_SELECTOBJECT: EMF_CHECK_PARAMS(1); status = gdip_metafile_SelectObject (context, GETDW(DWP1)); break; case EMR_CREATEPEN: EMF_CHECK_PARAMS(5); status = gdip_metafile_CreatePenIndirect (context, GETDW(DWP2), GETDW(DWP3), GETDW(DWP4)); break; case EMR_CREATEBRUSHINDIRECT: EMF_CHECK_PARAMS(4); /* 4 parameters provided, only 3 required in LOGBRUSH structure used in CreateBrushIndirect */ status = gdip_metafile_CreateBrushIndirect (context, GETDW(DWP4), GetColor(GETDW(DWP3)), GETDW(DWP2)); break; case EMR_DELETEOBJECT: EMF_CHECK_PARAMS(1); status = gdip_metafile_DeleteObject (context, GETDW(DWP1)); break; case EMR_LINETO: EMF_CHECK_PARAMS(2); status = gdip_metafile_LineTo (context, GETDW(DWP1), GETDW(DWP2)); break; case EMR_SETMITERLIMIT: EMF_CHECK_PARAMS(1); status = gdip_metafile_SetMiterLimit (context, GETDW(DWP1), NULL); break; case EMR_BEGINPATH: EMF_CHECK_PARAMS(0); status = gdip_metafile_BeginPath (context); break; case EMR_ENDPATH: EMF_CHECK_PARAMS(0); status = gdip_metafile_EndPath (context); break; case EMR_CLOSEFIGURE: EMF_CHECK_PARAMS(0); status = gdip_metafile_CloseFigure (context); break; case EMR_FILLPATH: EMF_CHECK_PARAMS(4); /* TODO - deal with all parameters, we have what looks like a rectangle (bounds?) */ status = gdip_metafile_FillPath (context); break; case EMR_STROKEANDFILLPATH: EMF_CHECK_PARAMS(4); /* TODO - deal with all parameters, we have what looks like a rectangle (bounds?) */ status = gdip_metafile_StrokeAndFillPath (context); break; case EMR_STROKEPATH: EMF_CHECK_PARAMS(4); /* TODO - deal with all parameters, we have what looks like a rectangle (bounds?) */ status = gdip_metafile_StrokePath (context); break; case EMR_SELECTCLIPPATH: EMF_CHECK_PARAMS(1); NOTIMPLEMENTED1("EMR_SELECTCLIPPATH %d not implemented", GETDW(DWP1)); break; case EMR_GDICOMMENT: EMF_CHECK_PARAMS(1); /* record contains at least the size of the comment */ status = GdiComment (context, data, size); break; case EMR_EXTSELECTCLIPRGN: EMF_CHECK_PARAMS(2); NOTIMPLEMENTED2("EMR_EXTSELECTCLIPRGN %d, %d not implemented", GETDW(DWP1), GETDW(DWP2)); break; case EMR_EXTCREATEFONTINDIRECTW: NOTIMPLEMENTED("EMR_EXTCREATEFONTINDIRECTW"); break; case EMR_EXTTEXTOUTA: NOTIMPLEMENTED("EMR_EXTTEXTOUTA"); break; case EMR_EXTTEXTOUTW: NOTIMPLEMENTED("EMR_EXTTEXTOUTW"); break; case EMR_POLYGON16: status = Polygon (context, data, size - EMF_MIN_RECORD_SIZE, TRUE); break; case EMR_POLYBEZIERTO16: status = PolyBezier (context, data, size - EMF_MIN_RECORD_SIZE, TRUE); break; case EMR_POLYPOLYGON16: status = PolyPolygon (context, data, TRUE); break; case EMR_EXTCREATEPEN: EMF_CHECK_PARAMS(11); status = ExtCreatePen (context, data, size); break; default: /* unprocessed records, ignore the data */ #ifdef DEBUG_EMF_NOTIMPLEMENTED printf ("Unimplemented_%d (", func); for (j = 0; j < params; j++) { printf (" %d", GETDW(DWP(j))); } printf (" )"); #endif break; } if (status != Ok) { g_warning ("Parsing interupted, status %d returned from function %d.", status, func); goto cleanup; } data += size; } cleanup: return status; end_of_record: /* TODO : process extra stuff residing after the records */ return status; } GpStatus gdip_load_emf_image_from_file (FILE *fp, GpImage **image) { return gdip_get_metafile_from ((void*)fp, (GpMetafile**)image, File); } GpStatus gdip_load_emf_image_from_stream_delegate (dstream_t *loader, GpImage **image) { return gdip_get_metafile_from ((void *)loader, (GpMetafile**)image, DStream); } libgdiplus-2.11/src/emfplus.h0000664000175000017500000000274312225470167013145 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __EMFPLUS_H__ #define __EMFPLUS_H__ #include "gdiplus-private.h" #include "metafile-private.h" #include "emfcodec.h" #include "graphics.h" #include "solidbrush-private.h" /* * Some interesting links... * [EMF+ Metafile Record Format Documentation] http://www.aces.uiuc.edu/~jhtodd/Metafile/ */ #endif libgdiplus-2.11/src/text-pango-private.h0000664000175000017500000000515512225470167015230 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot * * Copyright (C) 2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __TEXT_PANGO_PRIVATE_H__ #define __TEXT_PANGO_PRIVATE_H__ #include "gdiplus-private.h" #ifdef USE_PANGO_RENDERING #include #include #include "graphics-private.h" #include "stringformat-private.h" #define GDIP_WINDOWS_ACCELERATOR '&' #define GDIP_PANGOHACK_ACCELERATOR ((char)1) #define text_DrawString pango_DrawString #define text_MeasureString pango_MeasureString #define text_MeasureCharacterRanges pango_MeasureCharacterRanges PangoLayout* gdip_pango_setup_layout (cairo_t *ct, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, RectF *box, GDIPCONST GpStringFormat *format); GpStatus pango_DrawString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, GpBrush *brush) GDIP_INTERNAL; GpStatus pango_MeasureString (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST RectF *rc, GDIPCONST GpStringFormat *format, RectF *boundingBox, int *codepointsFitted, int *linesFilled) GDIP_INTERNAL; GpStatus pango_MeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *stringUnicode, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layout, GDIPCONST GpStringFormat *format, int regionCount, GpRegion **regions) GDIP_INTERNAL; #endif #endif libgdiplus-2.11/src/region-bitmap.c0000664000175000017500000007766012225470167014234 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #include "region-private.h" #include "graphics-path-private.h" #if FALSE /* * Debugging helpers */ static void display32 (BYTE *shape, int width, int height) { int i, j; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { printf ("%s", (shape [(i*width + j) * 4] == 0) ? "." : "X"); } printf ("\n"); } printf ("\n"); } void display (char* message, GpRegionBitmap *bitmap) { int i = 0, j = 0, k; printf ("\n%s\n\tbitmap X: %d, Y: %d, Width: %d, Height %d, Mask %p\n", message, bitmap->X, bitmap->Y, bitmap->Width, bitmap->Height, bitmap->Mask); if (!bitmap->Mask) return; while (i < SHAPE_SIZE(bitmap)) { BYTE b = bitmap->Mask [i++]; for (k = 0; k < 8; k++) { if (j++ == bitmap->Width) { j = 1; printf ("\n"); } printf ("%s", ((b & (1 << k)) == 0) ? "." : "X"); } } printf ("\n"); } #endif /* Helpers */ /* * rect_union: * @bitmap1: a GpRegionBitmap * @bitmap2: a GpRegionBitmap * @rect: a pointer to a GpRect * * Calculate a rectangle, @rect, that contains both @bitmap1 and @bitmap2 * rectangles. */ static void rect_union (GpRegionBitmap *bitmap1, GpRegionBitmap *bitmap2, GpRect *rect) { int max_x_1 = bitmap1->X + bitmap1->Width; int max_x_2 = bitmap2->X + bitmap2->Width; int max_y_1 = bitmap1->Y + bitmap1->Height; int max_y_2 = bitmap2->Y + bitmap2->Height; rect->X = (bitmap1->X < bitmap2->X) ? bitmap1->X : bitmap2->X; rect->Y = (bitmap1->Y < bitmap2->Y) ? bitmap1->Y : bitmap2->Y; rect->Width = ((max_x_1 > max_x_2) ? max_x_1 : max_x_2) - rect->X; rect->Height = ((max_y_1 > max_y_2) ? max_y_1 : max_y_2) - rect->Y; } /* * rect_intersect: * @bitmap1: a GpRegionBitmap * @bitmap2: a GpRegionBitmap * @rect: a pointer to a GpRect * * Calculate a rectangle, @rect, that represent the area shared by both * @bitmap1 and @bitmap2 rectangles. */ static void rect_intersect (GpRegionBitmap *bitmap1, GpRegionBitmap *bitmap2, GpRect *rect) { rect->X = (bitmap1->X > bitmap2->X) ? bitmap1->X : bitmap2->X; rect->Y = (bitmap1->Y > bitmap2->Y) ? bitmap1->Y : bitmap2->Y; rect->Width = (((bitmap1->X + bitmap1->Width) < (bitmap2->X + bitmap2->Width)) ? (bitmap1->X + bitmap1->Width) : (bitmap2->X + bitmap2->Width)) - rect->X; rect->Height = (((bitmap1->Y + bitmap1->Height) < (bitmap2->Y + bitmap2->Height)) ? (bitmap1->Y + bitmap1->Height) : (bitmap2->Y + bitmap2->Height)) - rect->Y; } /* * rect_adjust_horizontal: * @x: a pointer to an integer * @width: a pointer to an integer * * Adjust the @x and @width values so that they both are multiples of eight * and still encompass, at least, the same data as their original value. */ static void rect_adjust_horizontal (int *x, int *width) { /* ensure that X is a multiple of 8 */ int i = (*x & 7); if (i > 0) { /* reduce X to be a multiple of 8*/ *x -= i; /* but keep the "true" Width constant */ *width += i; } /* ensure that Width is a multiple of 8 */ i = (*width & 7); if (i > 0) { *width += (8 - i); } } /* * alloc_bitmap_memory: * @size: the size of the required allocation * @clear: a BOOL * * Allocate the alpha (1bpp) memory required for storing a bitmap and return * a pointer to this memory. @clear decides if the memory will be zeroized * after being allocated. NULL can be returned if too much memory is * requested (very large region) or if the memory couldn't be allocated (low * memory). */ static BYTE* alloc_bitmap_memory (int size, BOOL clear) { BYTE *buffer; if ((size < 1) || (size > REGION_MAX_BITMAP_SIZE)) { g_warning ("Requested %d bytes. Maximum size for region is %d bytes.", size, REGION_MAX_BITMAP_SIZE); return NULL; } buffer = (BYTE*) GdipAlloc (size); if (clear) memset (buffer, 0, size); return buffer; } /* * alloc_bitmap_with_buffer: * @x: an integer representing the X coordinate of the bitmap * @y: an integer representing the Y coordinate of the bitmap * @width: an integer representing the Width of the bitmap * @height: an integer representing the Height of the bitmap * @buffer: a byte array of the bitmap data * * Allocate and return a new GpRegionBitmap structure using the supplied * @buffer. * * Notes: * - The allocated structure must be freed using gdip_region_bitmap_free. * - The bitmap @x and @width MUST BE multiple of 8. * - The supplied @buffer MUST match the supplied width and height parameters. */ static GpRegionBitmap* alloc_bitmap_with_buffer (int x, int y, int width, int height, BYTE *buffer) { GpRegionBitmap *result = (GpRegionBitmap*) GdipAlloc (sizeof (GpRegionBitmap)); result->X = x; result->Y = y; result->Width = width; result->Height = height; result->Mask = buffer; result->reduced = FALSE; /* bitmap size isn't optimal wrt contents */ return result; } /* * alloc_bitmap: * @x: an integer representing the X coordinate of the bitmap * @y: an integer representing the Y coordinate of the bitmap * @width: an integer representing the Width of the bitmap * @height: an integer representing the Height of the bitmap * * Allocate and return a new GpRegionBitmap structure. * * Notes: * - The allocated structure must be freed using gdip_region_bitmap_free. * - The bitmap @x and @width will be adjusted to a multiple of 8. */ static GpRegionBitmap* alloc_bitmap (int x, int y, int width, int height) { BYTE *buffer; int size; /* ensure X and Width are multiple of 8 */ rect_adjust_horizontal (&x, &width); size = (width * height >> 3); /* 1 bit per pixel */ buffer = alloc_bitmap_memory (size, TRUE); return alloc_bitmap_with_buffer (x, y, width, height, buffer); } /* * alloc_merged_bitmap: * @bitmap1: a GpRegionBitmap * @bitmap2: a GpRegionBitmap * * Allocate and return a new GpRegionBitmap that covers the total area * (single rectangle) of both @bitmap1 and @bitmap2. * * Notes: * - The allocated structure must be freed using gdip_region_bitmap_free. */ static GpRegionBitmap* alloc_merged_bitmap (GpRegionBitmap *bitmap1, GpRegionBitmap *bitmap2) { GpRect rect; rect_union (bitmap1, bitmap2, &rect); return alloc_bitmap (rect.X, rect.Y, rect.Width, rect.Height); } /* * alloc_intersected_bitmap: * @bitmap1: a GpRegionBitmap * @bitmap2: a GpRegionBitmap * * Allocate and return a new GpRegionBitmap that covers only the shared * rectangle area of both @bitmap1 and @bitmap2. * * Notes: * - The allocated structure must be freed using gdip_region_bitmap_free. * - The bitmap width will be adjusted to a multiple of 8. */ static GpRegionBitmap* alloc_intersected_bitmap (GpRegionBitmap *bitmap1, GpRegionBitmap *bitmap2) { GpRect rect; rect_intersect (bitmap1, bitmap2, &rect); return alloc_bitmap (rect.X, rect.Y, rect.Width, rect.Height); } /* * gdip_region_bitmap_clone: * @bitmap: a GpRegionBitmap * * Allocate and return new GpRegionBitmap containing a copy of @bitmap. * * Note: the allocated structure must be freed using gdip_region_bitmap_free. */ GpRegionBitmap* gdip_region_bitmap_clone (GpRegionBitmap *bitmap) { BYTE *buffer; int size = (bitmap->Width * bitmap->Height >> 3); /* 1 bit per pixel */ if (size > 0) { buffer = alloc_bitmap_memory (size, FALSE); if (buffer) memcpy (buffer, bitmap->Mask, size); } else { buffer = NULL; } return alloc_bitmap_with_buffer (bitmap->X, bitmap->Y, bitmap->Width, bitmap->Height, buffer); } /* * empty_bitmap: * @bitmap: a GpRegionBitmap * * Clear and, if required, free the mask of @bitmap. Note that the allocated * GpRegionBitmap structure MUST still be freed using gdip_region_bitmap_free. */ static void empty_bitmap (GpRegionBitmap *bitmap) { bitmap->X = 0; bitmap->Y = 0; bitmap->Width = 0; bitmap->Height = 0; if (bitmap->Mask) { GdipFree (bitmap->Mask); bitmap->Mask = NULL; } } /* * gdip_region_bitmap_free: * @bitmap: a GpRegionBitmap * * Free the region bitmap @bitmap. */ void gdip_region_bitmap_free (GpRegionBitmap *bitmap) { empty_bitmap (bitmap); GdipFree (bitmap); } /* * reduce: * @source: a byte array containing the 32bpp bitmap * @width: the width of the bitmap * @height: the height of the bitmap * @dest: a byte array for the reduced (1bpp) bitmap * * Reduce a 32bpp bitmap @source into a 1bbp bitmap @dest. */ static void reduce (BYTE* source, int width, int height, BYTE *dest) { int i, j, n = 0, value = 0; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { int pos = (i * width + j) * 4; BYTE combine = source [pos] | source [pos + 1] | source [pos + 2] | source [pos + 3]; if (combine != 0) value |= 128; if (++n == 8) { *dest++ = value; n = 0; value = 0; } else { value >>= 1; } } } } /* * gdip_region_bitmap_apply_alpha: * @bitmap: a GpBitmap (not a GpRegionBitmap!) * @alpha: a GpRegionBitmap * * Apply the alpha bits (from @alpha) to a ARGB32 (or RGB24) @bitmap. */ void gdip_region_bitmap_apply_alpha (GpBitmap *bitmap, GpRegionBitmap *alpha) { int x, y, p = 0, n = 3; /* FIXME - is it endian safe ? */ for (y = 0; y < alpha->Height; y++) { for (x = 0; x < alpha->Width; x += 8) { // ARGB32 bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x01) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x02) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x04) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x08) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x10) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x20) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x40) ? 0xFF : 0x00; n += 4; bitmap->active_bitmap->scan0 [n] = (alpha->Mask [p] & 0x80) ? 0xFF : 0x00; n += 4; p++; } } } /* * gdip_region_bitmap_from_tree: * @tree: a GpPathTree * * Return a new GpRegionBitmap containing the bitmap recomposed from the * @tree. * * Note: the allocated structure must be freed using gdip_region_bitmap_free. */ static GpRegionBitmap* gdip_region_bitmap_from_tree (GpPathTree *tree) { GpRegionBitmap *result; if (!tree) return NULL; /* each item has... */ if (tree->path) { /* (a) only a path (the most common case) */ result = gdip_region_bitmap_from_path (tree->path); } else { /* (b) two items with an binary operation */ GpRegionBitmap *bitmap1 = gdip_region_bitmap_from_tree (tree->branch1); GpRegionBitmap *bitmap2 = gdip_region_bitmap_from_tree (tree->branch2); result = gdip_region_bitmap_combine (bitmap1, bitmap2, tree->mode); if (bitmap1) gdip_region_bitmap_free (bitmap1); if (bitmap2) gdip_region_bitmap_free (bitmap2); } return result; } /* * gdip_region_bitmap_ensure: * @region: a GpRegion * * Ensure the @region bitmap is available (as it isn't created until it is * actually needed). */ void gdip_region_bitmap_ensure (GpRegion *region) { /* we already have the bitmap */ if (region->bitmap) return; /* redraw the bitmap from the original path + all other operations/paths */ region->bitmap = gdip_region_bitmap_from_tree (region->tree); } /* * gdip_region_bitmap_invalidate: * @region: a GpRegion * * Invalidate (and free) the bitmap (if any) associated with @region. The * bitmap will need to be re-created before begin used. */ void gdip_region_bitmap_invalidate (GpRegion *region) { /* it's possible that the bitmap hasn't yet been created (e.g. if a rectangle region has just been converted to a path region) */ if (!region->bitmap) return; empty_bitmap (region->bitmap); region->bitmap = NULL; } /* * gdip_region_bitmap_from_path: * @path: a GpPath * * Return a new GpRegionBitmap containing the bitmap representing the @path. * NULL will be returned if the bitmap cannot be created (e.g. too big). * * Note: the allocated structure must be freed using gdip_region_bitmap_free. */ GpRegionBitmap* gdip_region_bitmap_from_path (GpPath *path) { GpRect bounds; GpRegionBitmap *bitmap; BYTE* buffer; int i, idx, stride; int length = path->count; unsigned long size; cairo_surface_t *surface = NULL; cairo_t *cr = NULL; /* empty path == empty bitmap */ if (length == 0) return alloc_bitmap_with_buffer (0, 0, 0, 0, NULL); /* get the limits of the bitmap we need to allocate */ if (GdipGetPathWorldBoundsI (path, &bounds, NULL, NULL) != Ok) return NULL; /* ensure X and Width are multiple of 8 */ rect_adjust_horizontal (&bounds.X, &bounds.Width); /* an empty width or height is valid, even if no bitmap can be produced */ if ((bounds.Width == 0) || (bounds.Height == 0)) return alloc_bitmap_with_buffer (bounds.X, bounds.Y, bounds.Width, bounds.Height, NULL); /* replay the path list and the operations to reconstruct the bitmap */ stride = bounds.Width * 4; /* RGBA -> 32 bpp, 4 Bbp */ size = stride * bounds.Height; /* here the memory is allocated for a ARGB bitmap - so 32 times bigger than our normal alpha bitmap */ if ((size < 1) || (size > REGION_MAX_BITMAP_SIZE << 5)) { g_warning ("Path conversion requested %d bytes (%d x %d). Maximum size is %d bytes.", size, bounds.Width, bounds.Height, REGION_MAX_BITMAP_SIZE << 5); return NULL; } buffer = (BYTE*) GdipAlloc (size); if (!buffer) return NULL; memset (buffer, 0, size); surface = cairo_image_surface_create_for_data (buffer, CAIRO_FORMAT_ARGB32, bounds.Width, bounds.Height, stride); cr = cairo_create (surface); idx = 0; for (i = 0; i < length; ++i) { GpPointF pt = g_array_index (path->points, GpPointF, i); BYTE type = g_array_index (path->types, BYTE, i); GpPointF pts [3]; /* mask the bits so that we get only the type value not the other flags */ switch (type & PathPointTypePathTypeMask) { case PathPointTypeStart: cairo_move_to (cr, pt.X - bounds.X, pt.Y - bounds.Y); break; case PathPointTypeLine: cairo_line_to (cr, pt.X - bounds.X, pt.Y - bounds.Y); break; case PathPointTypeBezier: /* make sure we only add at most 3 points to pts */ if (idx < 3) { pts [idx] = pt; idx ++; } /* once we've added 3 pts, we can draw the curve */ if (idx == 3) { cairo_curve_to (cr, pts [0].X - bounds.X, pts [0].Y - bounds.Y, pts [1].X - bounds.X, pts [1].Y - bounds.Y, pts [2].X - bounds.X, pts [2].Y - bounds.Y); idx = 0; } break; } /* close the subpath */ if (type & PathPointTypeCloseSubpath) cairo_close_path (cr); } cairo_clip (cr); cairo_set_source_rgba (cr, 1, 1, 1, 1); cairo_paint (cr); cairo_destroy (cr); cairo_surface_destroy (surface); bitmap = alloc_bitmap (bounds.X, bounds.Y, bounds.Width, bounds.Height); reduce (buffer, bounds.Width, bounds.Height, bitmap->Mask); GdipFree (buffer); return bitmap; } /* * gdip_region_bitmap_get_smallest_rect: * @bitmap: a GpRegionBitmap * @rect: a pointer to a GpRect * * Return the minimal used space in the bitmap inside @rect. */ void gdip_region_bitmap_get_smallest_rect (GpRegionBitmap *bitmap, GpRect *rect) { int first_y = bitmap->Height + 1; /* empty (top) lines */ int last_y = -1; /* empty (bottom) lines */ int first_x = bitmap->Width + 1; /* empty (left) columns */ int last_x = -1; /* empty (right) columns */ int i = 0; int original_size = SHAPE_SIZE(bitmap); int old_width_byte = bitmap->Width >> 3; int x = 0, y = 0; while (i < original_size) { if (bitmap->Mask [i++] != 0) { if (x < first_x) first_x = x; if (x > last_x) last_x = x; if (y < first_y) first_y = y; if (y > last_y) last_y = y; } if (++x == old_width_byte) { x = 0; y++; } } /* did we found some bits ? */ if ((last_x == -1) && (last_y == -1) && (first_x == bitmap->Width + 1) && (first_y == bitmap->Height + 1)) { rect->X = rect->Y = rect->Width = rect->Height = 0; } else { // convert to pixel values rect->X = bitmap->X + (first_x << 3); rect->Y = bitmap->Y + first_y; rect->Width = abs (((last_x + 1) << 3) - first_x); rect->Height = last_y - first_y + 1; } } /* * is_worth_shrinking: * @original_size: the original size of a bitmap * @new_size: the _potential_ new size of the bitmap (if shrinked) * * Decide if the current bitmap, based on it's current size, is worth * shrinking to a lesser size. * * Note: Many binary operations (e.g. intersection) can greatly reduce the * size of the final bitmap. */ static BOOL is_worth_shrinking (int original_size, int new_size) { /* FIXME - we can do better than checking if we "save" 4kb */ return ((original_size - new_size) > 4096); } /* * gdip_region_bitmap_shrink: * @bitmap: a GpRegionBitmap * @always_shrink: a BOOL * * Shrink the @bitmap if either @always_shrink is TRUE, or if it is decided * to be worth the CPU time (see is_worth_shrinking). * * Reducing the bitmap size permit (a) to reduce the memory footprint and * (b) makes it more likely to apply certain optimizations using rectangle * intersections. * * Notes: * 1. we don't call this after an union (because the result will never be * smaller) but other operations can result in a smaller bitmap. * 2. we keep the bitmap width in multiple of 8 - it's simpler and faster */ void gdip_region_bitmap_shrink (GpRegionBitmap *bitmap, BOOL always_shrink) { int original_size, new_size; BOOL can_be_reduced; GpRect rect; /* bitmap (a) was already shrinked, or (b) is empty */ if (bitmap->reduced || !bitmap->Mask) return; gdip_region_bitmap_get_smallest_rect (bitmap, &rect); if ((rect.Width == 0) || (rect.Height == 0)) { /* no, the the bitmap is empty */ empty_bitmap (bitmap); return; } /* ensure X and Width are multiple of 8 */ rect_adjust_horizontal (&rect.X, &rect.Width); original_size = SHAPE_SIZE(bitmap); new_size = (rect.Height * rect.Width) >> 3; /* bits->bytes */ can_be_reduced = (new_size < original_size); /* shrink if: * a. the caller asked for it (and there is a size change) * b. the caller didn't ask for it but "we" decided it's worth it */ if ((always_shrink && can_be_reduced) || is_worth_shrinking (original_size, new_size)) { /* reallocate a new bitmap buffer */ BYTE *new_mask = alloc_bitmap_memory (new_size, FALSE); int new_width, new_height; int x, y; int old_width_byte, new_width_byte; BYTE* newline = NULL; BYTE* oldline = NULL; if (!new_mask) return; new_width = rect.Width; new_height = rect.Height; old_width_byte = bitmap->Width >> 3; new_width_byte = new_width >> 3; newline = new_mask; oldline = bitmap->Mask + ((rect.Y - bitmap->Y) * old_width_byte) + ((rect.X - bitmap->X) >> 3); /* copy the interesting portion in the new bitmap */ for (y = 0; y < new_height; y++) { memcpy (newline, oldline, new_width_byte); newline += new_width_byte; oldline += old_width_byte; } /* replace current data */ bitmap->X = rect.X; bitmap->Y = rect.Y; bitmap->Width = rect.Width; bitmap->Height = rect.Height; GdipFree (bitmap->Mask); bitmap->Mask = new_mask; bitmap->reduced = TRUE; } } /* * is_point_visible: * @bitmap: a GpRegionBitmap * @x: the horizontal position * @y: the vertical position * * Return TRUE if the @x,@y point is set on the bitmap. * * Note: No bounds check are done this internal shared function. */ static BOOL is_point_visible (GpRegionBitmap *bitmap, int x, int y) { int pixel, pos, mask; /* is the pixel set ? */ x -= bitmap->X; y -= bitmap->Y; pixel = (y * bitmap->Width + x); pos = (pixel >> 3); mask = (pixel & 7); return ((bitmap->Mask [pos] & (1 << mask)) != 0); } /* * gdip_region_bitmap_is_point_visible: * @bitmap: a GpRegionBitmap * @x: the horizontal position * @y: the vertical position * * Return TRUE if the @x,@y point is set on the bitmap. * * Note: Using a bitmap reduce the precision to integers. */ BOOL gdip_region_bitmap_is_point_visible (GpRegionBitmap *bitmap, int x, int y) { /* is this an empty bitmap ? */ if ((bitmap->Width == 0) || (bitmap->Height == 0)) return FALSE; /* is the point inside the bitmap ? */ if ((x < bitmap->X) || (x >= bitmap->X + bitmap->Width)) return FALSE; if ((y < bitmap->Y) || (y >= bitmap->Y + bitmap->Height)) return FALSE; return is_point_visible (bitmap, x, y); } /* * gdip_region_bitmap_is_point_visible: * @bitmap: a GpRegionBitmap * @rect: a pointer to a GpRect * * Return TRUE is _any_ part of @rect is inside the region. */ BOOL gdip_region_bitmap_is_rect_visible (GpRegionBitmap *bitmap, GpRect *rect) { int x, y; /* is this an empty bitmap ? */ if ((bitmap->Width == 0) || (bitmap->Height == 0)) return FALSE; /* quick intersection checks */ if (bitmap->X < rect->X + rect->Width) return FALSE; if (bitmap->X + bitmap->Width > rect->X) return FALSE; if (bitmap->Y < rect->Y + rect->Height) return FALSE; if (bitmap->Y + bitmap->Height > rect->Y) return FALSE; /* TODO - optimize */ for (y = rect->Y; y < rect->Y + rect->Height; y++) { for (x = rect->X; x < rect->X + rect->Width; x++) { if (is_point_visible (bitmap, x, y)) return TRUE; } } return FALSE; } /* * get_buffer_pos: * @shape: a GpRegionBitmap * @x: the horizontal position * @y: the vertical position * * Return the index, inside the @shape buffer, corresponding to the @x,@y * point. */ static int get_buffer_pos (GpRegionBitmap *shape, int x, int y) { /* check for out of bounds */ if ((x < shape->X) || (x >= shape->X + shape->Width)) return -1; if ((y < shape->Y) || (y >= shape->Y + shape->Height)) return -1; x -= shape->X; y -= shape->Y; return ((y * shape->Width + x) >> 3); } /* * get_byte: * @shape: a GpRegionBitmap * @x: the horizontal position * @y: the vertical position * * Return the byte, from the @shape buffer, corresponding to the @x,@y point. * Note that this byte contains 8 pixels. */ static int get_byte (GpRegionBitmap *shape, int x, int y) { /* out of bounds == empty (no pixel) */ int pos = get_buffer_pos (shape, x, y); return (pos == -1) ? 0 : shape->Mask [pos]; } /* * Process a single line for gdip_region_bitmap_get_scans. */ static BOOL process_line (GpRegionBitmap *bitmap, int y, int *x, int *w) { int pos = *x; *x = -1; *w = -1; while (pos < bitmap->X + bitmap->Width) { BOOL visible = gdip_region_bitmap_is_point_visible (bitmap, pos, y); if (*x == -1) { if (visible) { *x += pos + 1; } } else { if (!visible) { *w = pos - *x; return TRUE; } } pos++; } /* end of line - have we started a rect ? */ if (*x != -1) { *w = pos - *x; return TRUE; } return FALSE; } /* * gdip_region_bitmap_get_scans: * @bitmap: a GpRegionBitmap * @rect: a pointer to an array of GpRectF * @count: the number of GpRectF in the array * * Convert the scan lines of the bitmap into an array of GpRectF. The return * value represents the actual number of GpRectF entries that were generated. */ int gdip_region_bitmap_get_scans (GpRegionBitmap *bitmap, GpRectF *rect, int count) { GpRect actual; int x, y, w; int n = 0; actual.X = REGION_INFINITE_POSITION; actual.Width = REGION_INFINITE_LENGTH; /* for each line in the bitmap */ for (y = bitmap->Y; y < bitmap->Y + bitmap->Height; y++) { /* until we processed the whole line */ x = bitmap->X; while (process_line (bitmap, y, &x, &w)) { /* FIXME - we only look at the last rectangle but we could check all rectangles in the previous line (and retain perfect rendering with, possibly, less rectangle. We could also allow non exact match for X and Width (e.g. +/- 1 pixel). MS doesn't seems to return perfect rectangles for all shapes. */ /* if position (X) and Width are identical to previous rectangle */ if ((x == actual.X) && (w == actual.Width)) { /* then augment it's Height by one */ if (rect && (n > 0)) { rect [n - 1].Height++; } } else { actual.X = x; actual.Y = y; actual.Width = w; actual.Height = 1; if (rect && (n < count)) { rect [n].X = actual.X; rect [n].Y = actual.Y; rect [n].Width = actual.Width; rect [n].Height = actual.Height; } n++; } /* continue on the same line */ x += w + 1; } } return n; } /* * Binary operators helper functions */ /* * bitmap_intersect: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * This function checks if the rectangle containing @shape1 intersect with * the rectangle containing @shape2. It is used to optimize certain code * path in the binary operations. */ static BOOL bitmap_intersect (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { return ((shape1->X < shape2->X + shape2->Width) && (shape1->X + shape1->Width > shape2->X) && (shape1->Y < shape2->Y + shape2->Height) && (shape1->Y + shape1->Height > shape2->Y)); } /* * gdip_region_bitmap_compare: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * This function checks if the data inside @shape1 is identical to the data * inside @shape2 - even if their respective rectangles are different. */ BOOL gdip_region_bitmap_compare (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRect rect; int x, y; /* if the rectangles containing shape1 and shape2 DO NOT intersect, then there is no possible intersection */ if (!bitmap_intersect (shape1, shape2)) return FALSE; rect_union (shape1, shape2, &rect); for (y = rect.Y; y < rect.Y + rect.Height; y++) { for (x = rect.X; x < rect.X + rect.Width; x += 8) { if (get_byte (shape1, x, y) != get_byte (shape2, x, y)) return FALSE; } } return TRUE; } /* * Binary operators on bitmap regions * * Notes * - All operations requires the bitmap x origin and it's width to be multiple * of 8. */ /* * gdip_region_bitmap_union: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * Return a new bitmap containing the union of the two specified region * bitmaps. */ static GpRegionBitmap* gdip_region_bitmap_union (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRegionBitmap *op = alloc_merged_bitmap (shape1, shape2); int x, y; for (y = op->Y; y < op->Y + op->Height; y++) { int p = get_buffer_pos (op, op->X, y); for (x = op->X; x < op->X + op->Width; x += 8) { op->Mask [p++] = get_byte (shape1, x, y) | get_byte (shape2, x, y); } } /* no need to call reduce_bitmap (it will never shrink, unless the original bitmap were oversized) */ return op; } /* * gdip_region_bitmap_intersection: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * Return a new bitmap containing the intersection of the two specified region * bitmaps. */ static GpRegionBitmap* gdip_region_bitmap_intersection (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRegionBitmap *op; int x, y; /* if the rectangles containing shape1 and shape2 DO NOT intersect, then there is no possible intersection */ if (!bitmap_intersect (shape1, shape2)) return alloc_bitmap_with_buffer (0, 0, 0, 0, NULL); /* the bitmap size cannot be bigger than a rectangle intersection of both bitmaps */ op = alloc_intersected_bitmap (shape1, shape2); for (y = op->Y; y < op->Y + op->Height; y++) { int p = get_buffer_pos (op, op->X, y); for (x = op->X; x < op->X + op->Width; x += 8) { op->Mask [p++] = get_byte (shape1, x, y) & get_byte (shape2, x, y); } } /* reduce bitmap size - if it make sense */ gdip_region_bitmap_shrink (op, FALSE); return op; } /* * gdip_region_bitmap_exclude: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * Return a new bitmap containing the first shape minus the second shape. */ static GpRegionBitmap* gdip_region_bitmap_exclude (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRegionBitmap *op; int x, y; /* if the rectangles containing shape1 and shape2 DO NOT intersect, then the result is identical shape1 */ if (!bitmap_intersect (shape1, shape2)) return gdip_region_bitmap_clone (shape1); /* the new bitmap size cannot be bigger than shape1 */ op = alloc_bitmap (shape1->X, shape1->Y, shape1->Width, shape1->Height); for (y = op->Y; y < op->Y + op->Height; y++) { int p = get_buffer_pos (op, op->X, y); for (x = op->X; x < op->X + op->Width; x += 8) { BYTE b1 = get_byte (shape1, x, y); op->Mask [p++] = b1 - (b1 & get_byte (shape2, x, y)); } } /* reduce bitmap size - if it make sense */ gdip_region_bitmap_shrink (op, FALSE); return op; } /* * gdip_region_bitmap_complement: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * Return a new bitmap containing the second shape minus the first shape. */ static GpRegionBitmap* gdip_region_bitmap_complement (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRegionBitmap *op; int x, y; /* if the rectangles containing shape1 and shape2 DO NOT intersect, then the result is identical shape2 */ if (!bitmap_intersect (shape1, shape2)) return gdip_region_bitmap_clone (shape2); /* the new bitmap size cannot be bigger than shape2 */ op = alloc_bitmap (shape2->X, shape2->Y, shape2->Width, shape2->Height); for (y = op->Y; y < op->Y + op->Height; y++) { int p = get_buffer_pos (op, op->X, y); for (x = op->X; x < op->X + op->Width; x += 8) { BYTE b2 = get_byte (shape2, x, y); op->Mask [p++] = b2 - (b2 & get_byte (shape1, x, y)); } } /* reduce bitmap size - if it make sense */ gdip_region_bitmap_shrink (op, FALSE); return op; } /* * gdip_region_bitmap_xor: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * * Return a new bitmap containing the exclusive-or of the two specified region * bitmaps. */ static GpRegionBitmap* gdip_region_bitmap_xor (GpRegionBitmap *shape1, GpRegionBitmap *shape2) { GpRegionBitmap *op; int x, y; /* if the rectangles containing shape1 and shape2 DO NOT intersect, then the result is identical an union of shape1 and shape2. Code is almost similar but no reduction is required for an union. */ if (!bitmap_intersect (shape1, shape2)) return gdip_region_bitmap_union (shape1, shape2); /* the new bitmap is potentially as big as the two merged bitmaps */ op = alloc_merged_bitmap (shape1, shape2); for (y = op->Y; y < op->Y + op->Height; y++) { int p = get_buffer_pos (op, op->X, y); for (x = op->X; x < op->X + op->Width; x += 8) { op->Mask [p++] = get_byte (shape1, x, y) ^ get_byte (shape2, x, y); } } /* reduce bitmap size - if it make sense */ gdip_region_bitmap_shrink (op, FALSE); return op; } /* * gdip_region_bitmap_combine: * @shape1: a GpRegionBitmap * @shape2: a GpRegionBitmap * @combineMode: the binary operator to apply between the two shapes * * Return a new GpRegionBitmap containing a new bitmap resulting from applying * the @combineMode to @shape1 and @shape2 bitmaps. */ GpRegionBitmap* gdip_region_bitmap_combine (GpRegionBitmap *bitmap1, GpRegionBitmap* bitmap2, CombineMode combineMode) { GpRegionBitmap *result = NULL; if (!bitmap1 || !bitmap2) return NULL; switch (combineMode) { case CombineModeComplement: return gdip_region_bitmap_complement (bitmap1, bitmap2); case CombineModeExclude: return gdip_region_bitmap_exclude (bitmap1, bitmap2); case CombineModeIntersect: return gdip_region_bitmap_intersection (bitmap1, bitmap2); case CombineModeUnion: return gdip_region_bitmap_union (bitmap1, bitmap2); case CombineModeXor: return gdip_region_bitmap_xor (bitmap1, bitmap2); default: g_warning ("Unkown combine mode specified (%d)", combineMode); return NULL; } } libgdiplus-2.11/src/graphics-path.c0000664000175000017500000014470112225470167014220 00000000000000/* * graphics-path.c * * Copyright (C) 2003-2007, Novell Inc. (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Duncan Mak (duncan@ximian.com) * Ravindra (rkumar@novell.com) * Sebastien Pouliot */ #include "graphics-path-private.h" #include "matrix-private.h" #include "font-private.h" #include "graphics-cairo-private.h" #ifdef USE_PANGO_RENDERING #include "text-pango-private.h" #endif static GArray * array_to_g_array (const GpPointF *pt, int length) { GArray *p = g_array_sized_new (FALSE, TRUE, sizeof (GpPointF), length); g_array_append_vals (p, pt, length); return p; } static GpPointF * g_array_to_array (GArray *p) { int length = p->len; GpPointF *pts = (GpPointF *) GdipAlloc (sizeof (GpPointF) * length); if (!pts) return NULL; memcpy (pts, p->data, p->len * sizeof (GpPointF)); return pts; } static BYTE * g_byte_array_to_array (GByteArray *p) { int length = p->len; BYTE *types = (BYTE*) GdipAlloc (sizeof (BYTE) * length); if (!types) return NULL; memcpy (types, p->data, p->len * sizeof (BYTE)); return types; } static GByteArray * array_to_g_byte_array (const BYTE *types, int count) { GByteArray *p = g_byte_array_sized_new (count); g_byte_array_append (p, types, count); return p; } /* return TRUE if the specified path has (at least one) curves, FALSE otherwise */ BOOL gdip_path_has_curve (GpPath *path) { int i; if (!path) return FALSE; for (i = 0; i < path->count; i++) { if (g_array_index (path->types, BYTE, i) == PathPointTypeBezier) return TRUE; } return FALSE; } /* * Return the correct point type when adding a new shape to the path. */ static PathPointType gdip_get_first_point_type (GpPath *path) { PathPointType type; /* check for a new figure flag or an empty path */ if (path->start_new_fig || (path->count == 0)) return PathPointTypeStart; /* check if the previous point is a closure */ type = g_array_index (path->types, BYTE, path->count - 1); if (type & PathPointTypeCloseSubpath) return PathPointTypeStart; else return PathPointTypeLine; } static void append (GpPath *path, float x, float y, PathPointType type, BOOL compress) { BYTE t = (BYTE) type; GpPointF pt; /* in some case we're allowed to compress identical points */ if (compress && (path->count > 0)) { /* points (X, Y) must be identical */ GpPointF lastPoint = g_array_index (path->points, GpPointF, path->count - 1); if ((lastPoint.X == x) && (lastPoint.Y == y)) { /* types need not be identical but must handle closed subpaths */ PathPointType last_type = g_array_index (path->types, BYTE, path->count - 1); if ((last_type & PathPointTypeCloseSubpath) != PathPointTypeCloseSubpath) return; } } if (path->start_new_fig) t = PathPointTypeStart; /* if we closed a subpath, then start new figure and append */ else if (path->count > 0) { type = g_array_index (path->types, BYTE, path->count - 1); if (type & PathPointTypeCloseSubpath) t = PathPointTypeStart; } pt.X = x; pt.Y = y; g_array_append_val (path->points, pt); g_byte_array_append (path->types, &t, 1); path->count++; path->start_new_fig = FALSE; } static void append_point (GpPath *path, GpPointF pt, PathPointType type, BOOL compress) { append (path, pt.X, pt.Y, type, compress); } static void append_bezier (GpPath *path, float x1, float y1, float x2, float y2, float x3, float y3) { append (path, x1, y1, PathPointTypeBezier3, FALSE); append (path, x2, y2, PathPointTypeBezier3, FALSE); append (path, x3, y3, PathPointTypeBezier3, FALSE); } static void append_curve (GpPath *path, const GpPointF *points, GpPointF *tangents, int offset, int length, _CurveType type) { int i; PathPointType ptype = ((type == CURVE_CLOSE) || (path->count == 0)) ? PathPointTypeStart : PathPointTypeLine; append_point (path, points [offset], ptype, TRUE); for (i = offset; i < offset + length; i++) { int j = i + 1; double x1 = points [i].X + tangents [i].X; double y1 = points [i].Y + tangents [i].Y; double x2 = points [j].X - tangents [j].X; double y2 = points [j].Y - tangents [j].Y; double x3 = points [j].X; double y3 = points [j].Y; append_bezier (path, x1, y1, x2, y2, x3, y3); } if (type == CURVE_CLOSE) { /* complete (close) the curve using the first point */ double x1 = points [i].X + tangents [i].X; double y1 = points [i].Y + tangents [i].Y; double x2 = points [0].X - tangents [0].X; double y2 = points [0].Y - tangents [0].Y; double x3 = points [0].X; double y3 = points [0].Y; append_bezier (path, x1, y1, x2, y2, x3, y3); GdipClosePathFigure (path); } } /* coverity[+alloc : arg-*1] */ GpStatus GdipCreatePath (FillMode fillMode, GpPath **path) { if (!path) return InvalidParameter; *path = (GpPath *) GdipAlloc (sizeof (GpPath)); if (!*path) return OutOfMemory; (*path)->fill_mode = fillMode; (*path)->points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); (*path)->types = g_byte_array_new (); (*path)->count = 0; (*path)->start_new_fig = TRUE; return Ok; } /* coverity[+alloc : arg-*4] */ GpStatus GdipCreatePath2 (const GpPointF *points, const BYTE *types, int count, FillMode fillMode, GpPath **path) { GArray *pts; GByteArray *t; if (!path || !points || !types || (count < 0)) return InvalidParameter; /* FIXME: Check whether path types are valid before adding them. MS does * some checking and does not use the points passed in, if they look * invalid. Some cases are like last type being PathPointTypeStart or * PathPointTypeCloseSubpath etc. */ pts = array_to_g_array (points, count); if (!pts) return OutOfMemory; t = array_to_g_byte_array (types, count); *path = (GpPath *) GdipAlloc (sizeof (GpPath)); if (!*path) return OutOfMemory; (*path)->fill_mode = fillMode; (*path)->count = count; (*path)->points = pts; (*path)->types = t; return Ok; } /* coverity[+alloc : arg-*4] */ GpStatus GdipCreatePath2I (const GpPoint *points, const BYTE *types, int count, FillMode fillMode, GpPath **path) { GpPointF *pt; GpStatus s; if (!points || !types || !path) return InvalidParameter; pt = convert_points (points, count); if (!pt) return OutOfMemory; s = GdipCreatePath2 (pt, types, count, fillMode, path); GdipFree (pt); return s; } /* coverity[+alloc : arg-*1] */ GpStatus GdipClonePath (GpPath *path, GpPath **clonePath) { int i; BYTE type; GpPointF point; if (!path || !clonePath) return InvalidParameter; *clonePath = (GpPath *) GdipAlloc (sizeof (GpPath)); if (!*clonePath) return OutOfMemory; (*clonePath)->fill_mode = path->fill_mode; (*clonePath)->count = path->count; (*clonePath)->points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); (*clonePath)->types = g_byte_array_new (); for (i = 0; i < path->count; i++) { point = g_array_index (path->points, GpPointF, i); type = g_array_index (path->types, BYTE, i); g_array_append_val ((*clonePath)->points, point); g_byte_array_append ((*clonePath)->types, &type, 1); } (*clonePath)->start_new_fig = path->start_new_fig; return Ok; } GpStatus GdipDeletePath (GpPath *path) { if (path == NULL) return InvalidParameter; if (path->points != NULL) g_array_free (path->points, TRUE); path->points = NULL; if (path->types != NULL) g_byte_array_free (path->types, TRUE); path->types = NULL; GdipFree (path); return Ok; } GpStatus GdipResetPath (GpPath *path) { if (path == NULL) return InvalidParameter; if (path->points != NULL) g_array_free (path->points, TRUE); if (path->types != NULL) g_byte_array_free (path->types, TRUE); path->count = 0; path->points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); path->types = g_byte_array_new (); path->fill_mode = FillModeAlternate; path->start_new_fig = TRUE; return Ok; } GpStatus GdipGetPointCount (GpPath *path, int *count) { if (!path || !count) return InvalidParameter; *count = path->count; return Ok; } GpStatus GdipGetPathTypes (GpPath *path, BYTE *types, int count) { int i; if (!path || !types || (count < 1)) return InvalidParameter; if (count > path->count) count = path->count; for (i = 0; i < count; i++) types [i] = path->types->data [i]; return Ok; } GpStatus GdipGetPathPoints (GpPath *path, GpPointF *points, int count) { int i; if (!path || !points || (count < 1)) return InvalidParameter; if (count > path->count) count = path->count; for (i = 0; i < count; i++) { GpPointF point = g_array_index (path->points, GpPointF, i); points [i].X = point.X; points [i].Y = point.Y; } return Ok; } GpStatus GdipGetPathPointsI (GpPath *path, GpPoint *points, int count) { int i; if (!path || !points || (count < 1)) return InvalidParameter; for (i = 0; i < count; i++) { GpPoint point = g_array_index (path->points, GpPoint, i); points [i].X = (int) point.X; points [i].Y = (int) point.Y; } return Ok; } GpStatus GdipGetPathFillMode (GpPath *path, FillMode *fillMode) { if (!path || !fillMode) return InvalidParameter; *fillMode = path->fill_mode; return Ok; } GpStatus GdipSetPathFillMode (GpPath *path, FillMode fillMode) { if (!path) return InvalidParameter; path->fill_mode = fillMode; return Ok; } GpStatus GdipGetPathData (GpPath *path, GpPathData *pathData) { if (!path || !pathData) return InvalidParameter; pathData->Points = g_array_to_array (path->points); if (!pathData->Points) return OutOfMemory; pathData->Types = g_byte_array_to_array (path->types); if (!pathData->Types) { GdipFree (pathData->Points); pathData->Points = NULL; return OutOfMemory; } /* don't return the count unless we have the data */ pathData->Count = path->count; return Ok; } GpStatus GdipStartPathFigure (GpPath *path) { if (!path) return InvalidParameter; path->start_new_fig = TRUE; return Ok; } GpStatus GdipClosePathFigure (GpPath *path) { if (!path) return InvalidParameter; if (path->count > 0) { BYTE *last = &g_array_index (path->types, BYTE, path->count - 1); *last |= PathPointTypeCloseSubpath; } path->start_new_fig = TRUE; return Ok; } GpStatus GdipClosePathFigures (GpPath *path) { int index = 0; BYTE currentType; BYTE lastType; GByteArray *oldTypes; if (!path) return InvalidParameter; /* first point is not closed */ if (path->count <= 1) return Ok; oldTypes = path->types; path->types = g_byte_array_new (); lastType = g_array_index (oldTypes, BYTE, index); index++; for (index = 1; index < path->count; index++) { currentType = g_array_index (oldTypes, BYTE, index); /* we dont close on the first point */ if ((currentType == PathPointTypeStart) && (index > 1)) { lastType |= PathPointTypeCloseSubpath; g_byte_array_append (path->types, &lastType, 1); } else g_byte_array_append (path->types, &lastType, 1); lastType = currentType; } /* close at the end */ lastType |= PathPointTypeCloseSubpath; g_byte_array_append (path->types, &lastType, 1); path->start_new_fig = TRUE; g_byte_array_free (oldTypes, TRUE); return Ok; } GpStatus GdipSetPathMarker (GpPath *path) { BYTE current; if (!path) return InvalidParameter; if (path->count == 0) return Ok; current = g_array_index (path->types, BYTE, path->count - 1); g_byte_array_remove_index (path->types, path->count - 1); current |= PathPointTypePathMarker; g_byte_array_append (path->types, ¤t, 1); return Ok; } GpStatus GdipClearPathMarkers (GpPath *path) { int i; BYTE current; GByteArray *cleared; if (!path) return InvalidParameter; /* shortcut to avoid allocations */ if (path->count == 0) return Ok; cleared = g_byte_array_new (); for (i = 0; i < path->count; i++) { current = g_array_index (path->types, BYTE, i); /* take out the marker if there is one */ if (current & PathPointTypePathMarker) current &= ~PathPointTypePathMarker; g_byte_array_append (cleared, ¤t, 1); } /* replace the existing with the cleared array */ g_byte_array_free (path->types, TRUE); path->types = cleared; return Ok; } /* * Append old_types[start, end] to new_types, adjusting flags. */ static void reverse_subpath_adjust_flags (int start, int end, GByteArray *old_types, GByteArray *new_types, BOOL *prev_had_marker) { BYTE t, prev_first, prev_last; int i; /* Copy all but PathPointTypeStart */ if (end != start) g_byte_array_append (new_types, old_types->data + start + 1, end - start); /* Append PathPointTypeStart */ t = PathPointTypeStart; g_byte_array_append (new_types, &t, 1); g_assert (new_types->len == end + 1); prev_first = g_array_index (old_types, BYTE, start); prev_last = g_array_index (old_types, BYTE, end); /* Remove potential flags from our future start point */ if (end != start) new_types->data[end - 1] &= PathPointTypePathTypeMask; /* Set the flags on our to-be-last point */ if (prev_last & PathPointTypeDashMode) new_types->data[start] |= PathPointTypeDashMode; if (prev_last & PathPointTypeCloseSubpath) new_types->data[start] |= PathPointTypeCloseSubpath; /* * Swap markers */ for (i = start + 1; i < end; i++) { if (g_array_index (old_types, BYTE, i - 1) & PathPointTypePathMarker) new_types->data[i] |= PathPointTypePathMarker; else new_types->data[i] &= ~PathPointTypePathMarker; } /* If the last point of the previous subpath had a marker, we inherit it */ if (*prev_had_marker) new_types->data[start] |= PathPointTypePathMarker; else new_types->data[start] &= ~PathPointTypePathMarker; *prev_had_marker = ((prev_last & PathPointTypePathMarker) == PathPointTypePathMarker); } GpStatus GdipReversePath (GpPath *path) { int length, i; GArray *points; GByteArray *types; int start = 0; BOOL prev_had_marker = FALSE; if (!path) return InvalidParameter; length = path->count; /* shortcut */ if (length <= 1) return Ok; /* PathTypes reversal */ /* First adjust the flags for each subpath */ types = g_byte_array_sized_new (length); if (!types) return OutOfMemory; for (i = 1; i < length; i++) { BYTE t = g_array_index (path->types, BYTE, i); if ((t & PathPointTypePathTypeMask) == PathPointTypeStart) { reverse_subpath_adjust_flags (start, i - 1, path->types, types, &prev_had_marker); start = i; } } if (start < length - 1) reverse_subpath_adjust_flags (start, length - 1, path->types, types, &prev_had_marker); /* Then reverse the resulting array */ for (i = 0; i < (length >> 1); i++) { BYTE *a = &g_array_index (types, BYTE, i); BYTE *b = &g_array_index (types, BYTE, length - i - 1); BYTE temp = *a; *a = *b; *b = temp; } g_byte_array_free (path->types, TRUE); path->types = types; /* PathPoints reversal * note: if length is odd then the middle point doesn't need to switch side */ for (i = 0; i < (length >> 1); i++) { GpPointF *first = &g_array_index (path->points, GpPointF, i); GpPointF *last = &g_array_index (path->points, GpPointF, length - i - 1); GpPointF temp; temp.X = first->X; temp.Y = first->Y; first->X = last->X; first->Y = last->Y; last->X = temp.X; last->Y = temp.Y; } return Ok; } GpStatus GdipGetPathLastPoint (GpPath *path, GpPointF *lastPoint) { if (!path || !lastPoint || (path->count <= 0)) return InvalidParameter; *lastPoint = g_array_index (path->points, GpPointF, path->count - 1); return Ok; } GpStatus GdipAddPathLine (GpPath *path, float x1, float y1, float x2, float y2) { if (!path) return InvalidParameter; /* only the first point can be compressed (i.e. removed if identical to previous) */ append (path, x1, y1, PathPointTypeLine, TRUE); append (path, x2, y2, PathPointTypeLine, FALSE); return Ok; } GpStatus GdipAddPathLine2 (GpPath *path, const GpPointF *points, int count) { int i; GpPointF *tmp; if (!path || !points || (count < 0)) return InvalidParameter; /* only the first point can be compressed (i.e. removed if identical to previous) */ for (i = 0, tmp = (GpPointF*) points; i < count; i++, tmp++) append (path, tmp->X, tmp->Y, PathPointTypeLine, (i == 0)); return Ok; } static void append_arc (GpPath *path, BOOL start, float x, float y, float width, float height, float startAngle, float endAngle) { float delta, bcp; double sin_alpha, sin_beta, cos_alpha, cos_beta; float rx = width / 2; float ry = height / 2; /* center */ float cx = x + rx; float cy = y + ry; /* angles in radians */ float alpha = startAngle * PI / 180; float beta = endAngle * PI / 180; /* adjust angles for ellipses */ alpha = atan2 (rx * sin (alpha), ry * cos (alpha)); beta = atan2 (rx * sin (beta), ry * cos (beta)); if (fabs (beta - alpha) > M_PI){ if (beta > alpha) beta -= 2 * PI; else alpha -= 2 * PI; } delta = beta - alpha; // http://www.stillhq.com/ctpfaq/2001/comp.text.pdf-faq-2001-04.txt (section 2.13) bcp = 4.0 / 3 * (1 - cos (delta / 2)) / sin (delta / 2); sin_alpha = sin (alpha); sin_beta = sin (beta); cos_alpha = cos (alpha); cos_beta = cos (beta); /* move to the starting point if we're not continuing a curve */ if (start) { /* starting point */ double sx = cx + rx * cos_alpha; double sy = cy + ry * sin_alpha; append (path, sx, sy, PathPointTypeLine, FALSE); } append_bezier (path, cx + rx * (cos_alpha - bcp * sin_alpha), cy + ry * (sin_alpha + bcp * cos_alpha), cx + rx * (cos_beta + bcp * sin_beta), cy + ry * (sin_beta - bcp * cos_beta), cx + rx * cos_beta, cy + ry * sin_beta); } static void append_arcs (GpPath *path, float x, float y, float width, float height, float startAngle, float sweepAngle) { int i; float drawn = 0; int increment; float endAngle; BOOL enough = FALSE; if (fabs (sweepAngle) >= 360) { GdipAddPathEllipse (path, x, y, width, height); return; } endAngle = startAngle + sweepAngle; increment = (endAngle < startAngle) ? -90 : 90; /* i is the number of sub-arcs drawn, each sub-arc can be at most 90 degrees.*/ /* there can be no more then 4 subarcs, ie. 90 + 90 + 90 + (something less than 90) */ for (i = 0; i < 4; i++) { float current = startAngle + drawn; float additional; if (enough) return; additional = endAngle - current; /* otherwise, add the remainder */ if (fabs (additional) > 90) { additional = increment; } else { /* a near zero value will introduce bad artefact in the drawing (#78999) */ if (gdip_near_zero (additional)) return; enough = TRUE; } append_arc (path, (i == 0), /* only move to the starting pt in the 1st iteration */ x, y, width, height, /* bounding rectangle */ current, current + additional); drawn += additional; } } GpStatus GdipAddPathArc (GpPath *path, float x, float y, float width, float height, float startAngle, float sweepAngle) { if (!path) return InvalidParameter; /* draw the arcs */ append_arcs (path, x, y, width, height, startAngle, sweepAngle); return Ok; } GpStatus GdipAddPathBezier (GpPath *path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4) { if (!path) return InvalidParameter; append (path, x1, y1, PathPointTypeLine, TRUE); append_bezier (path, x2, y2, x3, y3, x4, y4); return Ok; } GpStatus GdipAddPathBeziers (GpPath *path, const GpPointF *points, int count) { int i; GpPointF *tmp = (GpPointF *) points; if (!path || !points) return InvalidParameter; /* first bezier requires 4 points, other 3 more points */ if ((count < 4) || ((count % 3) != 1)) return InvalidParameter; append_point (path, *tmp, PathPointTypeLine, TRUE); tmp++; for (i = 1; i < count; i++, tmp++) append_point (path, *tmp, PathPointTypeBezier3, FALSE); return Ok; } GpStatus GdipAddPathCurve (GpPath *path, const GpPointF *points, int count) { return GdipAddPathCurve2 (path, points, count, 0.5); } GpStatus GdipAddPathCurve2 (GpPath *path, const GpPointF *points, int count, float tension) { GpPointF *tangents; /* special case, here we support a curve with 2 points */ if (!path || !points || (count < 2)) return InvalidParameter; tangents = gdip_open_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; append_curve (path, points, tangents, 0, count - 1, CURVE_OPEN); GdipFree (tangents); return Ok; } GpStatus GdipAddPathCurve3 (GpPath *path, const GpPointF *points, int count, int offset, int numberOfSegments, float tension) { GpPointF *tangents; if (!path || !points || (numberOfSegments < 1)) return InvalidParameter; /* we need 3 points for the first curve, 2 more for each curves */ /* and it's possible to use a point prior to the offset (to calculate) */ if ((offset == 0) && (numberOfSegments == 1) && (count < 3)) return InvalidParameter; else if (numberOfSegments >= count - offset) return InvalidParameter; tangents = gdip_open_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; append_curve (path, points, tangents, offset, numberOfSegments, CURVE_OPEN); GdipFree (tangents); return Ok; } GpStatus GdipAddPathClosedCurve (GpPath *path, const GpPointF *points, int count) { return GdipAddPathClosedCurve2 (path, points, count, 0.5); } GpStatus GdipAddPathClosedCurve2 (GpPath *path, const GpPointF *points, int count, float tension) { GpPointF *tangents; if (!path || !points || (count < 3)) return InvalidParameter; tangents = gdip_closed_curve_tangents (CURVE_MIN_TERMS, points, count, tension); if (!tangents) return OutOfMemory; append_curve (path, points, tangents, 0, count - 1, CURVE_CLOSE); /* close the path */ GdipClosePathFigure (path); GdipFree (tangents); return Ok; } GpStatus GdipAddPathRectangle (GpPath *path, float x, float y, float width, float height) { if (!path) return InvalidParameter; if ((width == 0.0) || (height == 0.0)) return Ok; append (path, x, y, PathPointTypeStart, FALSE); append (path, x + width, y, PathPointTypeLine, FALSE); append (path, x + width, y + height, PathPointTypeLine, FALSE); append (path, x, y + height, PathPointTypeLine | PathPointTypeCloseSubpath, FALSE); return Ok; } GpStatus GdipAddPathRectangles (GpPath *path, const GpRectF *rects, int count) { int i; if (!path || !rects) return InvalidParameter; for (i = 0; i < count; i++) { float x = rects[i].X; float y = rects[i].Y; float width = rects[i].Width; float height = rects[i].Height; GdipAddPathRectangle (path, x, y, width, height); } return Ok; } GpStatus GdipAddPathEllipse (GpPath *path, float x, float y, float width, float height) { double rx = width / 2; double ry = height / 2; double cx = x + rx; double cy = y + ry; if (!path) return InvalidParameter; /* origin */ append (path, cx + rx, cy, PathPointTypeStart, FALSE); /* quadrant I */ append_bezier (path, cx + rx, cy - C1 * ry, cx + C1 * rx, cy - ry, cx, cy - ry); /* quadrant II */ append_bezier (path, cx - C1 * rx, cy - ry, cx - rx, cy - C1 * ry, cx - rx, cy); /* quadrant III */ append_bezier (path, cx - rx, cy + C1 * ry, cx - C1 * rx, cy + ry, cx, cy + ry); /* quadrant IV */ append_bezier (path, cx + C1 * rx, cy + ry, cx + rx, cy + C1 * ry, cx + rx, cy); /* close the path */ GdipClosePathFigure (path); return Ok; } GpStatus GdipAddPathPie (GpPath *path, float x, float y, float width, float height, float startAngle, float sweepAngle) { float sin_alpha, cos_alpha; float rx = width / 2; float ry = height / 2; /* center */ int cx = x + rx; int cy = y + ry; /* angles in radians */ float alpha = startAngle * PI / 180; /* adjust angle for ellipses */ alpha = atan2 (rx * sin (alpha), ry * cos (alpha)); sin_alpha = sin (alpha); cos_alpha = cos (alpha); if (!path) return InvalidParameter; /* move to center */ append (path, cx, cy, PathPointTypeStart, FALSE); /* draw pie edge */ if (fabs (sweepAngle) < 360) append (path, cx + rx * cos_alpha, cy + ry * sin_alpha, PathPointTypeLine, FALSE); /* draw the arcs */ append_arcs (path, x, y, width, height, startAngle, sweepAngle); /* draw pie edge */ if (fabs (sweepAngle) < 360) append (path, cx, cy, PathPointTypeLine, FALSE); /* close the path */ return GdipClosePathFigure (path); } GpStatus GdipAddPathPolygon (GpPath *path, const GpPointF *points, int count) { int i; GpPointF *tmp = (GpPointF *) points; if (!path || !points || (count < 3)) return InvalidParameter; /* note: polygon points are never compressed (i.e. removed if identical) */ append_point (path, *tmp, PathPointTypeStart, FALSE); tmp ++; for (i = 1; i < count; i++, tmp++) append_point (path, *tmp, PathPointTypeLine, FALSE); /* * Add a line from the last point back to the first point if * they're not the same */ if (points [0].X != points [count - 1].X && points [0].Y != points [count - 1].Y) append_point (path, points [0], PathPointTypeLine, FALSE); /* close the path */ return GdipClosePathFigure (path); } GpStatus GdipAddPathPath (GpPath *path, GDIPCONST GpPath *addingPath, BOOL connect) { int i, length; PathPointType first; GpPointF *pts; BYTE *types; if (!path || !addingPath) return InvalidParameter; length = addingPath->count; if (length < 1) return Ok; pts = gdip_calloc (sizeof (GpPointF), length); if (!pts) return OutOfMemory; types = gdip_calloc (sizeof (BYTE), length); if (!types) { GdipFree (pts); return OutOfMemory; } GdipGetPathPoints ((GpPath*)addingPath, pts, length); GdipGetPathTypes ((GpPath*)addingPath, types, length); /* We can connect only open figures. If first figure is closed * it can't be connected. */ first = connect ? gdip_get_first_point_type (path) : PathPointTypeStart; append_point (path, pts [0], first, FALSE); for (i = 1; i < length; i++) append_point (path, pts [i], types [i], FALSE); GdipFree(pts); GdipFree(types); return Ok; } /* MonoTODO - deal with layoutRect, format... */ GpStatus GdipAddPathString (GpPath *path, GDIPCONST WCHAR *string, int length, GDIPCONST GpFontFamily *family, int style, float emSize, GDIPCONST GpRectF *layoutRect, GDIPCONST GpStringFormat *format) { cairo_surface_t *cs; cairo_t *cr; cairo_path_t *cp; cairo_text_extents_t extents; cairo_matrix_t matrix; GpFont *font = NULL; GpStatus status; BYTE *utf8 = NULL; if (length == 0) return Ok; if (length < 0) return InvalidParameter; cs = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); if (cairo_surface_status (cs) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy (cs); return OutOfMemory; } cr = cairo_create (cs); if (cairo_status (cr) != CAIRO_STATUS_SUCCESS) { cairo_destroy (cr); cairo_surface_destroy (cs); return OutOfMemory; } utf8 = (BYTE*) ucs2_to_utf8 ((const gunichar2 *)string, -1); if (!utf8) { cairo_destroy (cr); cairo_surface_destroy (cs); return OutOfMemory; } status = GdipCreateFont (family, emSize, style, UnitPixel, &font); if (status != Ok) { if (font) GdipDeleteFont (font); GdipFree (utf8); cairo_destroy (cr); cairo_surface_destroy (cs); return status; } if (layoutRect) cairo_move_to (cr, layoutRect->X, layoutRect->Y + font->sizeInPixels); #ifdef USE_PANGO_RENDERING { GpRectF box; PangoLayout* layout; cairo_save (cr); layout = gdip_pango_setup_layout (cr, string, length, font, layoutRect, &box, format); pango_cairo_layout_path (cr, layout); g_object_unref (layout); cairo_restore (cr); } #else cairo_set_font_face (cr, gdip_get_cairo_font_face (font)); cairo_set_font_size (cr, font->sizeInPixels); /* TODO - deal with layoutRect, format... ideally we would be calling a subset of GdipDrawString that already does everything *and* preserve the whole path */ cairo_text_path (cr, (const char*)utf8); #endif /* get the font data from the cairo path and translate it as a gdi+ path */ cp = cairo_copy_path (cr); if (cp) { int i; for (i=0; i < cp->num_data; i += cp->data[i].header.length) { PathPointType type = PathPointTypeStart; cairo_path_data_t *data = &cp->data[i]; if ((i < cp->num_data - 1) && (data->header.type == CAIRO_PATH_CLOSE_PATH)) type |= PathPointTypeCloseSubpath; switch (data->header.type) { case CAIRO_PATH_MOVE_TO: append (path, data[1].point.x, data[1].point.y, type, FALSE); break; case CAIRO_PATH_LINE_TO: append (path, data[1].point.x, data[1].point.y, type | PathPointTypeLine, FALSE); break; case CAIRO_PATH_CURVE_TO: append (path, data[1].point.x, data[1].point.y, PathPointTypeBezier, FALSE); append (path, data[2].point.x, data[2].point.y, PathPointTypeBezier, FALSE); append (path, data[3].point.x, data[3].point.y, type | PathPointTypeBezier, FALSE); break; case CAIRO_PATH_CLOSE_PATH: break; } } cairo_path_destroy (cp); } if (font) { GdipDeleteFont (font); } GdipFree (utf8); cairo_destroy (cr); cairo_surface_destroy (cs); return Ok; } /* MonoTODO - same limitations as GdipAddString */ GpStatus GdipAddPathStringI (GpPath *path, GDIPCONST WCHAR *string, int length, GDIPCONST GpFontFamily *family, int style, float emSize, GDIPCONST GpRect *layoutRect, GDIPCONST GpStringFormat *format) { GpRectF *r = NULL; if (layoutRect) { GpRectF rect; rect.X = layoutRect->X; rect.Y = layoutRect->Y; rect.Width = layoutRect->Width; rect.Height = layoutRect->Height; r = ▭ } return GdipAddPathString (path, string, length, family, style, emSize, r, format); } GpStatus GdipAddPathLineI (GpPath *path, int x1, int y1, int x2, int y2) { return GdipAddPathLine (path, x1, y1, x2, y2); } GpStatus GdipAddPathLine2I (GpPath* path, const GpPoint *points, int count) { GpPoint *tmp; int i; if (!path || !points || (count < 0)) return InvalidParameter; /* only the first point can be compressed (i.e. removed if identical to previous) */ for (i = 0, tmp = (GpPoint*) points; i < count; i++, tmp++) append (path, tmp->X, tmp->Y, PathPointTypeLine, (i == 0)); return Ok; } GpStatus GdipAddPathArcI (GpPath *path, int x, int y, int width, int height, float startAngle, float sweepAngle) { return GdipAddPathArc (path, x, y, width, height, startAngle, sweepAngle); } GpStatus GdipAddPathBezierI (GpPath *path, int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) { return GdipAddPathBezier (path, x1, y1, x2, y2, x3, y3, x4, y4); } GpStatus GdipAddPathBeziersI (GpPath *path, const GpPoint *points, int count) { GpPoint *tmp; int i; if (!path || !points) return InvalidParameter; /* first bezier requires 4 points, other 3 more points */ if ((count < 4) || ((count % 3) != 1)) return InvalidParameter; tmp = (GpPoint*) points; append (path, tmp->X, tmp->Y, PathPointTypeLine, TRUE); tmp++; for (i = 1; i < count; i++, tmp++) append (path, tmp->X, tmp->Y, PathPointTypeBezier3, FALSE); return Ok; } GpStatus GdipAddPathCurveI (GpPath *path, const GpPoint *points, int count) { return GdipAddPathCurve2I (path, points, count, 0.5); } GpStatus GdipAddPathCurve2I (GpPath *path, const GpPoint *points, int count, float tension) { GpPointF *pt; GpStatus s; if (!points) return InvalidParameter; pt = convert_points (points, count); if (!pt) return OutOfMemory; /* here we must deal/accept curve with 2 points, GdipAddPathCurve3I doesn't */ s = GdipAddPathCurve2 (path, pt, count, tension); GdipFree (pt); return s; } GpStatus GdipAddPathCurve3I (GpPath *path, const GpPoint *points, int count, int offset, int numberOfSegments, float tension) { GpPointF *pt; GpStatus s; if (!points) return InvalidParameter; pt = convert_points (points, count); if (!pt) return OutOfMemory; s = GdipAddPathCurve3 (path, pt, count, offset, numberOfSegments, tension); GdipFree (pt); return s; } GpStatus GdipAddPathClosedCurveI (GpPath *path, const GpPoint *points, int count) { return GdipAddPathClosedCurve2I (path, points, count, 0.5); } GpStatus GdipAddPathClosedCurve2I (GpPath *path, const GpPoint *points, int count, float tension) { GpPointF *pt; GpStatus s; if (!path || !points) return InvalidParameter; pt = convert_points (points, count); if (!pt) return OutOfMemory; s = GdipAddPathClosedCurve2 (path, pt, count, tension); GdipFree (pt); return s; } GpStatus GdipAddPathRectangleI (GpPath *path, int x, int y, int width, int height) { return GdipAddPathRectangle (path, x, y, width, height); } GpStatus GdipAddPathRectanglesI (GpPath *path, const GpRect *rects, int count) { int i; if (!path || !rects) return InvalidParameter; for (i = 0; i < count; i++) { float x = (float) rects[i].X; float y = (float) rects[i].Y; float width = (float) rects[i].Width; float height = (float) rects[i].Height; GdipAddPathRectangle (path, x, y, width, height); } return Ok; } GpStatus GdipAddPathEllipseI (GpPath *path, int x, int y, int width, int height) { return GdipAddPathEllipse (path, x, y, width, height); } GpStatus GdipAddPathPieI (GpPath *path, int x, int y, int width, int height, float startAngle, float sweepAngle) { return GdipAddPathPie (path, x, y, width, height, startAngle, sweepAngle); } GpStatus GdipAddPathPolygonI (GpPath *path, const GpPoint *points, int count) { int i; GpPoint *tmp; if (!path || !points || (count < 3)) return InvalidParameter; /* note: polygon points are never compressed (i.e. removed if identical) */ tmp = (GpPoint *) points; append (path, tmp->X, tmp->Y, PathPointTypeStart, FALSE); tmp++; for (i = 1; i < count; i++, tmp++) append (path, tmp->X, tmp->Y, PathPointTypeLine, FALSE); /* * Add a line from the last point back to the first point if * they're not the same */ if (points [0].X != points [count - 1].X && points [0].Y != points [count - 1].Y) append (path, points [0].X, points [0].Y, PathPointTypeLine, FALSE); /* close the path */ return GdipClosePathFigure (path); } /* nr_curve_flatten comes from Sodipodi's libnr (public domain) available from http://www.sodipodi.com/ */ /* Mono changes: converted to float (from double), added recursion limit, use GArray */ static BOOL nr_curve_flatten (float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float flatness, int level, GArray *points) { float dx1_0, dy1_0, dx2_0, dy2_0, dx3_0, dy3_0, dx2_3, dy2_3, d3_0_2; float s1_q, t1_q, s2_q, t2_q, v2_q; float f2, f2_q; float x00t, y00t, x0tt, y0tt, xttt, yttt, x1tt, y1tt, x11t, y11t; dx1_0 = x1 - x0; dy1_0 = y1 - y0; dx2_0 = x2 - x0; dy2_0 = y2 - y0; dx3_0 = x3 - x0; dy3_0 = y3 - y0; dx2_3 = x3 - x2; dy2_3 = y3 - y2; f2 = flatness; d3_0_2 = dx3_0 * dx3_0 + dy3_0 * dy3_0; if (d3_0_2 < f2) { float d1_0_2, d2_0_2; d1_0_2 = dx1_0 * dx1_0 + dy1_0 * dy1_0; d2_0_2 = dx2_0 * dx2_0 + dy2_0 * dy2_0; if ((d1_0_2 < f2) && (d2_0_2 < f2)) { goto nosubdivide; } else { goto subdivide; } } f2_q = f2 * d3_0_2; s1_q = dx1_0 * dx3_0 + dy1_0 * dy3_0; t1_q = dy1_0 * dx3_0 - dx1_0 * dy3_0; s2_q = dx2_0 * dx3_0 + dy2_0 * dy3_0; t2_q = dy2_0 * dx3_0 - dx2_0 * dy3_0; v2_q = dx2_3 * dx3_0 + dy2_3 * dy3_0; if ((t1_q * t1_q) > f2_q) goto subdivide; if ((t2_q * t2_q) > f2_q) goto subdivide; if ((s1_q < 0.0) && ((s1_q * s1_q) > f2_q)) goto subdivide; if ((v2_q < 0.0) && ((v2_q * v2_q) > f2_q)) goto subdivide; if (s1_q >= s2_q) goto subdivide; nosubdivide: { GpPointF pt; pt.X = x3; pt.Y = y3; g_array_append_val (points, pt); return TRUE; } subdivide: /* things gets *VERY* memory intensive without a limit */ if (level >= FLATTEN_RECURSION_LIMIT) return FALSE; x00t = (x0 + x1) * 0.5; y00t = (y0 + y1) * 0.5; x0tt = (x0 + 2 * x1 + x2) * 0.25; y0tt = (y0 + 2 * y1 + y2) * 0.25; x1tt = (x1 + 2 * x2 + x3) * 0.25; y1tt = (y1 + 2 * y2 + y3) * 0.25; x11t = (x2 + x3) * 0.5; y11t = (y2 + y3) * 0.5; xttt = (x0tt + x1tt) * 0.5; yttt = (y0tt + y1tt) * 0.5; if (!nr_curve_flatten (x0, y0, x00t, y00t, x0tt, y0tt, xttt, yttt, flatness, level+1, points)) return FALSE; if (!nr_curve_flatten (xttt, yttt, x1tt, y1tt, x11t, y11t, x3, y3, flatness, level+1, points)) return FALSE; return TRUE; } static BOOL gdip_convert_bezier_to_lines (GpPath *path, int index, float flatness, GArray *flat_points, GByteArray *flat_types) { GArray *points; GpPointF start, first, second, end; GpPointF pt; BYTE type; int i; if ((index <= 0) || (index + 2 >= path->count)) return FALSE; /* bad path data */ start = g_array_index (path->points, GpPointF, index - 1); first = g_array_index (path->points, GpPointF, index); second = g_array_index (path->points, GpPointF, index + 1); end = g_array_index (path->points, GpPointF, index + 2); /* we can't add points directly to the original list as we could end up with too much recursion */ points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); if (!nr_curve_flatten (start.X, start.Y, first.X, first.Y, second.X, second.Y, end.X, end.Y, flatness, 0, points)) { /* curved path is too complex (i.e. would result in too many points) to render as a polygon */ g_array_free (points, TRUE); return FALSE; } /* recursion was within limits, append the result to the original supplied list */ if (points->len > 0) { g_array_append_val (flat_points, g_array_index (points, GpPointF, 0)); type = PathPointTypeLine; g_byte_array_append (flat_types, &type, 1); } /* always PathPointTypeLine */ type = PathPointTypeLine; for (i = 1; i < points->len; i++) { pt = g_array_index (points, GpPointF, i); g_array_append_val (flat_points, pt); g_byte_array_append (flat_types, &type, 1); } g_array_free (points, TRUE); return TRUE; } GpStatus GdipFlattenPath (GpPath *path, GpMatrix *matrix, float flatness) { GpStatus status = Ok; GArray *points; GByteArray *types; int i; if (!path) return InvalidParameter; /* apply matrix before flattening (as there's less points at this stage) */ if (matrix) { status = GdipTransformPath (path, matrix); if (status != Ok) return status; } /* if no bezier are present then the path doesn't need to be flattened */ if (!gdip_path_has_curve (path)) return status; points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); types = g_byte_array_new (); /* Iterate the current path and replace each bezier with multiple lines */ for (i = 0; i < path->count; i++) { GpPointF point = g_array_index (path->points, GpPointF, i); BYTE type = g_array_index (path->types, BYTE, i); /* PathPointTypeBezier3 has the same value as PathPointTypeBezier */ if ((type & PathPointTypeBezier) == PathPointTypeBezier) { if (!gdip_convert_bezier_to_lines (path, i, fabs (flatness), points, types)) { /* uho, too much recursion - do not pass go, do not collect 200$ */ GpPointF pt; /* free the the partial flat */ g_array_free (points, TRUE); g_byte_array_free (types, TRUE); /* mimic MS behaviour when recursion becomes a problem */ /* note: it's not really an empty rectangle as the last point isn't closing */ points = g_array_new (FALSE, FALSE, sizeof (GpPointF)); types = g_byte_array_new (); pt.X = pt.Y = 0; type = PathPointTypeStart; g_array_append_val (points, pt); g_byte_array_append (types, &type, 1); type = PathPointTypeLine; g_array_append_val (points, pt); g_byte_array_append (types, &type, 1); g_array_append_val (points, pt); g_byte_array_append (types, &type, 1); g_array_append_val (points, pt); g_byte_array_append (types, &type, 1); break; } /* beziers have 4 points: the previous one, the current and the next two */ i += 2; } else { /* no change required, just copy the point */ g_array_append_val (points, point); g_byte_array_append (types, &type, 1); } } /* free original path points and types */ if (path->points != NULL) g_array_free (path->points, TRUE); if (path->types != NULL) g_byte_array_free (path->types, TRUE); /* transfer new path informations */ path->points = points; path->types = types; path->count = points->len; /* note: no error code is given for excessive recursion */ return Ok; } static GpStatus gdip_prepare_path (GpPath *path, GpMatrix *matrix, float flatness) { /* convert any curve into lines */ if (gdip_path_has_curve (path)) { /* this will apply the matrix too (before flattening) */ return GdipFlattenPath (path, matrix, flatness); } else if (!gdip_is_matrix_empty (matrix)) { /* no curve, but we still have a matrix to apply... */ return GdipTransformPath (path, matrix); } /* no preparation required */ return Ok; } /* MonoTODO - doesn't seems to be exposed in System.Drawing.dll */ GpStatus GdipWindingModeOutline (GpPath *path, GpMatrix *matrix, float flatness) { GpStatus status; if (!path) return InvalidParameter; /* quick out */ if (path->count == 0) return Ok; status = gdip_prepare_path (path, matrix, flatness); if (status != Ok) return status; /* TODO */ return NotImplemented; } /* MonoTODO */ GpStatus GdipWidenPath (GpPath *nativePath, GpPen *pen, GpMatrix *matrix, float flatness) { static int called = 0; GpStatus status; if (!nativePath || !pen) return InvalidParameter; /* (0) is deal within System.Drawing */ /* (1) for compatibility with MS GDI+ (reported as FDBK49685) */ if (nativePath->count <= 1) return OutOfMemory; status = gdip_prepare_path (nativePath, matrix, flatness); if (status != Ok) return status; /* TODO inner path (same number of points as the prepared path) */ /* TODO outer path (twice the number of points as the prepared path) */ if (!called) { g_warning ("NOT IMPLEMENTED: GdipWidenPath"); called = 1; } return Ok; } /* MonoTODO */ GpStatus GdipWarpPath (GpPath *path, GpMatrix *matrix, const GpPointF *points, int count, float srcx, float srcy, float srcwidth, float srcheight, WarpMode warpMode, float flatness) { static int called = 0; GpStatus status; if (!path || !points || (count < 1)) return InvalidParameter; /* quick out */ if (path->count == 0) return Ok; /* an invalid warp mode resets the current path */ /* a path with a single point will reset it too */ if (((warpMode != WarpModePerspective) && (warpMode != WarpModeBilinear)) || (path->count == 1)) return GdipResetPath (path); status = gdip_prepare_path (path, matrix, flatness); if (status != Ok) return status; /* TODO */ if (!called) { g_warning ("NOT IMPLEMENTED: GdipWarpPath"); called = 1; } return Ok; } GpStatus GdipTransformPath (GpPath* path, GpMatrix *matrix) { PointF *points; int count; GpStatus s; if (!path) return InvalidParameter; count = path->count; if (count == 0) return Ok; /* GdipTransformMatrixPoints would fail */ /* avoid allocation/free/calculation for null/identity matrix */ if (gdip_is_matrix_empty (matrix)) return Ok; points = g_array_to_array (path->points); if (!points) return OutOfMemory; s = GdipTransformMatrixPoints (matrix, points, count); path->points = array_to_g_array (points, count); GdipFree (points); if (!path->points) return OutOfMemory; return s; } GpStatus GdipGetPathWorldBounds (GpPath *path, GpRectF *bounds, const GpMatrix *matrix, const GpPen *pen) { GpStatus status; GpPath *workpath = NULL; if (!path || !bounds) return InvalidParameter; if (path->count < 1) { /* special case #1 - Empty */ bounds->X = 0.0f; bounds->Y = 0.0f; bounds->Width = 0.0f; bounds->Height = 0.0f; return Ok; } status = GdipClonePath (path, &workpath); if (status != Ok) { if (workpath) GdipDeletePath (workpath); return status; } /* We don't need a very precise flat value to get the bounds (GDI+ isn't, big time) - * however flattening helps by removing curves, making the rest of the algorithm a * lot simpler. */ /* note: only the matrix is applied if no curves are present in the path */ status = GdipFlattenPath (workpath, (GpMatrix*)matrix, 25.0f); if (status == Ok) { int i; GpPointF points; points = g_array_index (workpath->points, GpPointF, 0); bounds->X = points.X; /* keep minimum X here */ bounds->Y = points.Y; /* keep minimum Y here */ if (workpath->count == 1) { /* special case #2 - Only one element */ bounds->Width = 0.0f; bounds->Height = 0.0f; GdipDeletePath (workpath); return Ok; } bounds->Width = points.X; /* keep maximum X here */ bounds->Height = points.Y; /* keep maximum Y here */ for (i = 1; i < workpath->count; i++) { points = g_array_index (workpath->points, GpPointF, i); if (points.X < bounds->X) bounds->X = points.X; if (points.Y < bounds->Y) bounds->Y = points.Y; if (points.X > bounds->Width) bounds->Width = points.X; if (points.Y > bounds->Height) bounds->Height = points.Y; } /* convert maximum values (width/height) as length */ bounds->Width -= bounds->X; bounds->Height -= bounds->Y; if (pen) { /* in calculation the pen's width is at least 1.0 */ float width = (pen->width < 1.0f) ? 1.0f : pen->width; float halfw = (width / 2); bounds->X -= halfw; bounds->Y -= halfw; bounds->Width += width; bounds->Height += width; } } GdipDeletePath (workpath); return status; } GpStatus GdipGetPathWorldBoundsI (GpPath *path, GpRect *bounds, const GpMatrix *matrix, const GpPen *pen) { GpRectF rect; GpStatus status; if (!path || !bounds) return InvalidParameter; status = GdipGetPathWorldBounds (path, &rect, matrix, pen); if (status != Ok) return status; bounds->X = (int) rect.X; bounds->Y = (int) rect.Y; bounds->Width = (int) rect.Width; bounds->Height = (int) rect.Height; return Ok; } GpStatus GdipIsVisiblePathPoint (GpPath *path, float x, float y, GpGraphics *graphics, BOOL *result) { GpStatus status = Ok; cairo_surface_t* s = NULL; GpGraphics *g; GpUnit page_unit = UnitPixel; if (!path || !result) return InvalidParameter; if (graphics) { g = graphics; cairo_save (g->ct); page_unit = g->page_unit; } else { /* create a temporary context */ s = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 1, 1); g = gdip_graphics_new (s); } cairo_new_path (g->ct); /* unit tests shows that PageUnit isn't consireded (well x, y are probably considered to be the same unit format ) */ g->page_unit = UnitPixel; status = gdip_plot_path (g, path, FALSE); if (status == Ok) { cairo_set_fill_rule (g->ct, gdip_convert_fill_mode (path->fill_mode)); cairo_set_antialias (g->ct, CAIRO_ANTIALIAS_NONE); *result = cairo_in_fill (g->ct, x + 1.0 /* CAIRO_AA_OFFSET_X */, y + CAIRO_AA_OFFSET_Y); } else { *result = FALSE; } if (graphics) { /* restore GpGraphics to original state */ cairo_restore (graphics->ct); g->page_unit = page_unit; } else { /* delete temporary context */ cairo_surface_destroy (s); GdipDeleteGraphics (g); } return status; } GpStatus GdipIsVisiblePathPointI (GpPath *path, int x, int y, GpGraphics *graphics, BOOL *result) { return GdipIsVisiblePathPoint (path, x, y, graphics, result); } GpStatus GdipIsOutlineVisiblePathPoint (GpPath *path, float x, float y, GpPen *pen, GpGraphics *graphics, BOOL *result) { GpStatus status = Ok; cairo_surface_t* s = NULL; GpGraphics *g; GpUnit page_unit = UnitPixel; if (!path || !pen || !result) return InvalidParameter; if (graphics) { g = graphics; cairo_save (graphics->ct); page_unit = g->page_unit; } else { /* create a temporary context */ s = cairo_image_surface_create (CAIRO_FORMAT_A1, 1, 1); g = gdip_graphics_new (s); } cairo_new_path (g->ct); /* unit tests shows that PageUnit isn't consireded (well x, y are probably considered to be the same unit format ) */ g->page_unit = UnitPixel; status = gdip_plot_path (g, path, FALSE); if (status == Ok) { /* we must fight around cairo AA */ cairo_set_antialias (g->ct, CAIRO_ANTIALIAS_NONE); cairo_set_line_width (g->ct, pen->width - CAIRO_AA_OFFSET_Y); *result = cairo_in_stroke (g->ct, x, y); } else { *result = FALSE; } if (graphics) { /* restore GpGraphics to original state */ cairo_restore (graphics->ct); g->page_unit = page_unit; } else { /* delete temporary context */ cairo_surface_destroy (s); GdipDeleteGraphics (g); } return status; } GpStatus GdipIsOutlineVisiblePathPointI (GpPath *path, int x, int y, GpPen *pen, GpGraphics *graphics, BOOL *result) { return GdipIsOutlineVisiblePathPoint (path, x, y, pen, graphics, result); } libgdiplus-2.11/src/customlinecap.c0000664000175000017500000002554512225470167014340 00000000000000/* * customlinecap.c * * Copyright (C) Novell, Inc. 2003-2004. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Author: * Ravindra (rkumar@novell.com) * * Copyright (C) 2004 Novell, Inc. http://www.novell.com */ #include "customlinecap-private.h" #include "graphics-path-private.h" #include "graphics-private.h" #include "graphics-cairo-private.h" static GpStatus gdip_custom_linecap_setup (GpGraphics *graphics, GpCustomLineCap *cap); static GpStatus gdip_custom_linecap_clone_cap (GpCustomLineCap *cap, GpCustomLineCap **clonedCap); static GpStatus gdip_custom_linecap_destroy (GpCustomLineCap *cap); static GpStatus gdip_custom_linecap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *cap, float x, float y, float otherend_x, float otherend_y); /* * we have a single copy of vtable for * all instances of custom linecap. */ static CapClass vtable = { CustomLineCapTypeDefault, gdip_custom_linecap_setup, gdip_custom_linecap_clone_cap, gdip_custom_linecap_destroy, gdip_custom_linecap_draw }; void gdip_custom_linecap_init (GpCustomLineCap *cap, CapClass *vt) { cap->vtable = vt; cap->base_cap = LineCapFlat; cap->start_cap = LineCapFlat; cap->end_cap = LineCapFlat; cap->stroke_join = LineJoinMiter; cap->base_inset = 0.0; /* LAMESPEC: Default value is documented as 1.0, but actually it is 0.0 */ cap->width_scale = 0.0; cap->fill_path = NULL; cap->stroke_path = NULL; } static GpCustomLineCap* gdip_custom_linecap_new (void) { GpCustomLineCap *result = (GpCustomLineCap *) GdipAlloc (sizeof (GpCustomLineCap)); if (result) gdip_custom_linecap_init (result, &vtable); return result; } GpStatus gdip_custom_linecap_clone_cap (GpCustomLineCap *cap, GpCustomLineCap **clonedCap) { GpCustomLineCap *newcap; GpPath *fillpath = NULL, *strokepath = NULL; if (!cap || !clonedCap) return InvalidParameter; newcap = (GpCustomLineCap *) GdipAlloc (sizeof (GpCustomLineCap)); if (!newcap) return OutOfMemory; newcap->vtable = cap->vtable; newcap->base_cap = cap->base_cap; newcap->start_cap = cap->start_cap; newcap->end_cap = cap->end_cap; newcap->stroke_join = cap->stroke_join; newcap->base_inset = cap->base_inset; newcap->width_scale = cap->width_scale; if (cap->fill_path) { if (GdipClonePath (cap->fill_path, &fillpath) != Ok) { if (fillpath != NULL) GdipFree (fillpath); GdipFree (newcap); return OutOfMemory; } } newcap->fill_path = fillpath; if (cap->stroke_path) { if (GdipClonePath (cap->stroke_path, &strokepath) != Ok) { if (strokepath != NULL) GdipFree (strokepath); GdipFree (fillpath); GdipFree (newcap); return OutOfMemory; } } newcap->stroke_path = strokepath; *clonedCap = newcap; return Ok; } GpStatus gdip_custom_linecap_destroy (GpCustomLineCap *cap) { if (!cap) return InvalidParameter; if (cap->fill_path) { GdipDeletePath (cap->fill_path); cap->fill_path = NULL; } if (cap->stroke_path) { GdipDeletePath (cap->stroke_path); cap->stroke_path = NULL; } GdipFree (cap); return Ok; } /* MonoTODO: Implement this function when cairo supports cairo_stroke_path API */ static GpStatus gdip_custom_linecap_setup (GpGraphics *graphics, GpCustomLineCap *customCap) { if (!graphics || !customCap) return InvalidParameter; return NotImplemented; } double gdip_custom_linecap_angle (float x, float y, float otherend_x, float otherend_y) { float slope; double angle; if (x == otherend_x) { slope = 0; if (y < otherend_y) { angle = PI; } else { angle = PI * 2; } } else if (y == otherend_y) { slope = 0; if (x < otherend_x) { angle = PI/2; } else { angle = PI/-2; } } else { if (y < otherend_y) { slope = (otherend_y - y) / (otherend_x - x); if (x < otherend_x) { angle = PI/2; } else { angle = PI/-2; } } else { slope = (otherend_x - x) / (y - otherend_y); angle = 0; } } angle += atan (slope); return angle; } GpStatus gdip_custom_linecap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *customCap, float x, float y, float otherend_x, float otherend_y) { double angle; int points; int i, idx = 0; float penwidth; if (!graphics || !pen || !customCap) return InvalidParameter; penwidth = pen->width; angle = gdip_custom_linecap_angle (x, y, otherend_x, otherend_y); cairo_save (graphics->ct); /* FIXME: handle base_inset (including set/get!) */ cairo_translate (graphics->ct, x, y); cairo_rotate (graphics->ct, angle); if (customCap->stroke_path) { GpPath *path = customCap->stroke_path; points = path->count; for (i = 0; i < points; i++) { /* Adapted from gdip_plot_path() */ GpPointF point = g_array_index (path->points, GpPointF, i); BYTE type = g_array_index (path->types, BYTE, i); GpPointF pts [3]; /* mask the bits so that we get only the type value not the other flags */ switch (type & PathPointTypePathTypeMask) { case PathPointTypeStart: gdip_cairo_move_to (graphics, point.X * penwidth, point.Y * penwidth, TRUE, TRUE); break; case PathPointTypeLine: gdip_cairo_line_to (graphics, point.X * penwidth, point.Y * penwidth, TRUE, TRUE); break; case PathPointTypeBezier: /* make sure we only add at most 3 points to pts */ if (idx < 3) { pts [idx] = point; idx ++; } /* once we've added 3 pts, we can draw the curve */ if (idx == 3) { gdip_cairo_curve_to (graphics, pts[0].X * penwidth, pts[0].Y * penwidth, pts[1].X * penwidth, pts[1].Y * penwidth, pts[2].X * penwidth, pts[2].Y * penwidth, TRUE, TRUE); idx = 0; } break; default: g_warning ("Unknown PathPointType %d", type); return NotImplemented; } /* close the subpath */ if (type & PathPointTypeCloseSubpath) { cairo_close_path (graphics->ct); } } gdip_pen_setup (graphics, pen); cairo_stroke (graphics->ct); cairo_set_matrix (graphics->ct, graphics->copy_of_ctm); } /* FIXME: handle fill_path */ cairo_restore (graphics->ct); return gdip_get_status (cairo_status (graphics->ct)); } /* this setup function gets called from pen */ GpStatus gdip_linecap_setup (GpGraphics *graphics, GpCustomLineCap *customCap) { if (!graphics || !customCap) return InvalidParameter; return customCap->vtable->setup (graphics, customCap); } /* this draw function gets called from pen */ GpStatus gdip_linecap_draw (GpGraphics *graphics, GpPen *pen, GpCustomLineCap *customCap, float x, float y, float otherend_x, float otherend_y) { if (!graphics || !pen || !customCap) return InvalidParameter; return customCap->vtable->draw (graphics, pen, customCap, x, y, otherend_x, otherend_y); } /* CustomLineCap functions */ // coverity[+alloc : arg-*4] GpStatus GdipCreateCustomLineCap (GpPath *fillPath, GpPath *strokePath, GpLineCap baseCap, float baseInset, GpCustomLineCap **customCap) { GpCustomLineCap *cap; GpPath *fillpath_clone = NULL, *strokepath_clone = NULL; if ((!fillPath && !strokePath) || !customCap) return InvalidParameter; cap = gdip_custom_linecap_new (); if (!cap) return OutOfMemory; if (fillPath) { if (GdipClonePath (fillPath, &fillpath_clone) != Ok) { if (fillpath_clone != NULL) GdipFree (fillpath_clone); GdipFree (cap); return OutOfMemory; } } cap->fill_path = fillpath_clone; if (strokePath) { if (GdipClonePath (strokePath, &strokepath_clone) != Ok) { if (strokepath_clone != NULL) GdipFree (strokepath_clone); GdipFree (fillpath_clone); GdipFree (cap); return OutOfMemory; } } cap->stroke_path = strokepath_clone; cap->base_cap = baseCap; cap->base_inset = baseInset; *customCap = cap; return Ok; } GpStatus GdipDeleteCustomLineCap (GpCustomLineCap *customCap) { if (!customCap) return InvalidParameter; return customCap->vtable->destroy (customCap); } GpStatus GdipCloneCustomLineCap (GpCustomLineCap *customCap, GpCustomLineCap **clonedCap) { if (!customCap || !clonedCap) return InvalidParameter; return customCap->vtable->clone_cap (customCap, clonedCap); } GpStatus GdipSetCustomLineCapStrokeCaps (GpCustomLineCap *customCap, GpLineCap startCap, GpLineCap endCap) { if (!customCap) return InvalidParameter; customCap->start_cap = startCap; customCap->end_cap = endCap; return Ok; } GpStatus GdipGetCustomLineCapStrokeCaps (GpCustomLineCap *customCap, GpLineCap *startCap, GpLineCap *endCap) { if (!customCap || !startCap || !endCap) return InvalidParameter; *(startCap) = customCap->start_cap; *(endCap) = customCap->end_cap; return Ok; } GpStatus GdipSetCustomLineCapStrokeJoin (GpCustomLineCap *customCap, GpLineJoin lineJoin) { if (!customCap) return InvalidParameter; customCap->stroke_join = lineJoin; return Ok; } GpStatus GdipGetCustomLineCapStrokeJoin (GpCustomLineCap *customCap, GpLineJoin *lineJoin) { if (!customCap || !lineJoin) return InvalidParameter; *(lineJoin) = customCap->stroke_join; return Ok; } GpStatus GdipSetCustomLineCapBaseCap (GpCustomLineCap *customCap, GpLineCap baseCap) { if (!customCap) return InvalidParameter; customCap->base_cap = baseCap; return Ok; } GpStatus GdipGetCustomLineCapBaseCap (GpCustomLineCap *customCap, GpLineCap *baseCap) { if (!customCap || !baseCap) return InvalidParameter; *(baseCap) = customCap->base_cap; return Ok; } GpStatus GdipSetCustomLineCapBaseInset (GpCustomLineCap *customCap, float inset) { if (!customCap) return InvalidParameter; customCap->base_inset = inset; return Ok; } GpStatus GdipGetCustomLineCapBaseInset (GpCustomLineCap *customCap, float *inset) { if (!customCap || !inset) return InvalidParameter; *(inset) = customCap->base_inset; return Ok; } GpStatus GdipSetCustomLineCapWidthScale (GpCustomLineCap *customCap, float widthScale) { if (!customCap) return InvalidParameter; customCap->width_scale = widthScale; return Ok; } GpStatus GdipGetCustomLineCapWidthScale (GpCustomLineCap *customCap, float *widthScale) { if (!customCap || !widthScale) return InvalidParameter; *(widthScale) = customCap->width_scale; return Ok; } libgdiplus-2.11/src/texturebrush-private.h0000664000175000017500000000366512225470167015712 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __TEXTUREBRUSH_PRIVATE_H__ #define __TEXTUREBRUSH_PRIVATE_H__ #include "gdiplus-private.h" #include "brush-private.h" #include "matrix-private.h" typedef struct _Texture { GpBrush base; GpImage *image; cairo_matrix_t matrix; GpRect rectangle; GpWrapMode wrapMode; cairo_pattern_t *pattern; } Texture; #include "texturebrush.h" #endif libgdiplus-2.11/src/region.h0000664000175000017500000000675612225470167012765 00000000000000/* * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Sebastien Pouliot */ #ifndef __REGION_H__ #define __REGION_H__ GpStatus GdipCreateRegion (GpRegion **region); GpStatus GdipCreateRegionRect (GDIPCONST GpRectF *rect, GpRegion **region); GpStatus GdipCreateRegionRectI (GDIPCONST GpRect *rect, GpRegion **region); GpStatus GdipCreateRegionPath (GpPath *path, GpRegion **region); GpStatus GdipCreateRegionRgnData (GDIPCONST BYTE *regionData, INT size, GpRegion **region); GpStatus GdipCloneRegion(GpRegion *region, GpRegion **cloneRegion); GpStatus GdipDeleteRegion(GpRegion *region); GpStatus GdipSetInfinite(GpRegion *region); GpStatus GdipSetEmpty(GpRegion *region); GpStatus GdipCombineRegionRect(GpRegion *region, GDIPCONST GpRectF *rect, CombineMode combineMode); GpStatus GdipCombineRegionRectI(GpRegion *region, GDIPCONST GpRect *rect, CombineMode combineMode); GpStatus GdipCombineRegionPath(GpRegion *region, GpPath *path, CombineMode combineMode); GpStatus GdipCombineRegionRegion(GpRegion *region, GpRegion *region2, CombineMode combineMode); GpStatus GdipGetRegionBounds(GpRegion *region, GpGraphics *graphics, GpRectF *rect); GpStatus GdipIsEmptyRegion(GpRegion *region, GpGraphics *graphics, BOOL *result); GpStatus GdipIsInfiniteRegion(GpRegion *region, GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisibleRegionPoint(GpRegion *region, float x, float y, GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisibleRegionPointI(GpRegion *region, int x, int y, GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisibleRegionRect(GpRegion *region, float x, float y, float width, float height, GpGraphics *graphics, BOOL *result); GpStatus GdipIsVisibleRegionRectI(GpRegion *region, int x, int y, int width, int height, GpGraphics *graphics, BOOL *result); GpStatus GdipGetRegionScansCount(GpRegion *region, int* count, GpMatrix* matrix); GpStatus GdipGetRegionScans(GpRegion *region, GpRectF* rects, int* count, GpMatrix* matrix); GpStatus GdipIsEqualRegion(GpRegion *region, GpRegion *region2, GpGraphics *graphics, BOOL *result); GpStatus GdipGetRegionDataSize(GpRegion *region, UINT * bufferSize); GpStatus GdipGetRegionData(GpRegion *region, BYTE * buffer, UINT bufferSize, UINT *sizeFilled); GpStatus GdipTranslateRegion(GpRegion *region, float dx, float dy); GpStatus GdipTranslateRegionI(GpRegion *region, int dx, int dy); GpStatus GdipTransformRegion(GpRegion *region, GpMatrix *matrix); #endif libgdiplus-2.11/src/bitmap-private.h0000664000175000017500000001775512225470167014427 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __BITMAP_PRIVATE_H__ #define __BITMAP_PRIVATE_H__ #include "gdiplus-private.h" #include "image-private.h" #define COLOR_PALETTE_FLAGS_DEFAULT 0 #define COLOR_PALETTE_FLAGS_HAS_ALPHA 1 #define COLOR_PALETTE_FLAGS_GREYSCALE 2 #define COLOR_PALETTE_FLAGS_HALFTONE 4 /* LockMode (reserved) flags */ #define GBD_OWN_SCAN0 (1<<8) #define GBD_WRITE_OK (1<<9) #define GBD_LOCKED (1<<10) #define GBD_TRUE24BPP (1<<11) #ifdef WORDS_BIGENDIAN #define set_pixel_bgra(pixel,index,b,g,r,a) do { \ ((unsigned char *)(pixel))[index] = a; \ ((unsigned char *)(pixel))[index+1] = r; \ ((unsigned char *)(pixel))[index+2] = g; \ ((unsigned char *)(pixel))[index+3] = b; \ } while (0) #else #define set_pixel_bgra(pixel,index,b,g,r,a) do { \ ((unsigned char *)(pixel))[index] = b; \ ((unsigned char *)(pixel))[index+1] = g; \ ((unsigned char *)(pixel))[index+2] = r; \ ((unsigned char *)(pixel))[index+3] = a; \ } while (0) #endif #define get_pixel_bgra(color, b, g, r, a) do { \ a = ((color & 0xff000000) >> 24); \ r = ((color & 0x00ff0000) >> 16); \ g = ((color & 0x0000ff00) >> 8); \ b = (color & 0x000000ff); \ } while(0) /* This structure is mirrored in System.Drawing.Imaging.BitmapData. Any changes here must also be made to BitmapData.cs */ typedef struct { unsigned int width; unsigned int height; int stride; int pixel_format; BYTE *scan0; unsigned int reserved; /* the rest of the structure isn't part of MS GDI+ definition */ ColorPalette *palette; int property_count; /* Number of properties */ PropertyItem *property; /* Properties associated with image */ float dpi_horz; /* */ float dpi_vert; /* */ ImageFlags image_flags; /* Alpha, ColorSpace, etc. */ unsigned int left; /* left display coordinate of frame */ unsigned int top; /* top display coordinate of frame */ unsigned int x; /* LockBits: left coordinate of locked rectangle */ unsigned int y; /* LockBits: top coordinate of locked rectangle */ int transparent; /* Index of transparent color (<24bit only) */ } BitmapData; typedef struct { int count; /* Number of bitmaps contained in this frame */ BitmapData *bitmap; /* Bitmaps for this frame */ GUID frame_dimension; /* GUID describing the frame type */ } FrameData; typedef struct _Image { /* Image Description */ ImageType type; /* Undefined, Bitmap, MetaFile */ ImageFormat image_format; /* BMP, TIF, GIF, PNG, etc. */ /* Image Data */ int num_of_frames; /* Number of frames */ FrameData *frames; /* Array of frames (Page, Time, Resolution) for the image */ /* Tracking of active image */ int active_frame; /* Index of frame currently used */ int active_bitmap_no; /* Index of active bitmap in current frame */ BitmapData *active_bitmap; /* Pointer to active frame/bitmap; DO NOT free() */ /* Internal fields */ int cairo_format; cairo_surface_t *surface; } GpBitmap; void gdip_bitmap_init (GpBitmap *bitmap) GDIP_INTERNAL; GpBitmap *gdip_bitmap_new (void) GDIP_INTERNAL; GpBitmap *gdip_bitmap_new_with_frame (const GUID *dimension, BOOL add_bitmapdata) GDIP_INTERNAL; FrameData *gdip_frame_add(GpBitmap *bitmap, const GUID *dimension) GDIP_INTERNAL; BitmapData *gdip_frame_add_bitmapdata(FrameData *frame) GDIP_INTERNAL; GpStatus gdip_bitmap_dispose (GpBitmap *bitmap) GDIP_INTERNAL; GpStatus gdip_bitmap_clone (GpBitmap *bitmap, GpBitmap **clonedbitmap) GDIP_INTERNAL; GpStatus gdip_bitmap_setactive (GpBitmap *bitmap, const GUID *dimension, int index) GDIP_INTERNAL; GpStatus gdip_bitmapdata_clone (BitmapData *src, BitmapData **dest, int count) GDIP_INTERNAL; ColorPalette *gdip_palette_clone(ColorPalette *original) GDIP_INTERNAL; GpStatus gdip_property_get_short (int offset, void *value, unsigned short *result) GDIP_INTERNAL; GpStatus gdip_property_get_long (int offset, void *value, guint32 *result) GDIP_INTERNAL; GpStatus gdip_property_get_srational (int offset, void *value, unsigned short *numerator, unsigned short *denominator) GDIP_INTERNAL; GpStatus gdip_property_get_rational (int offset, void *value, guint32 *numerator, guint32 *denominator) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add (BitmapData *bitmap_data, PROPID id, ULONG length, WORD type, VOID *value) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_byte (BitmapData *bitmap_data, PROPID id, BYTE value) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_short (BitmapData *bitmap_data, PROPID id, unsigned short value) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_long (BitmapData *bitmap_data, PROPID id, guint32 value) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_ASCII (BitmapData *bitmap_data, PROPID id, unsigned char *value) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_rational (BitmapData *bitmap_data, PROPID id, guint32 numerator, guint32 denominator) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_add_srational (BitmapData *bitmap_data, PROPID id, unsigned short numerator, unsigned short denominator) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_remove_id (BitmapData *bitmap_data, PROPID id) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_remove_index (BitmapData *bitmap_data, int index) GDIP_INTERNAL; GpStatus gdip_bitmapdata_property_find_id (BitmapData *bitmap_data, PROPID id, int *index) GDIP_INTERNAL; cairo_surface_t* gdip_bitmap_ensure_surface (GpBitmap *bitmap) GDIP_INTERNAL; GpBitmap* gdip_convert_indexed_to_rgb (GpBitmap *bitmap) GDIP_INTERNAL; BOOL gdip_bitmap_format_needs_premultiplication (GpBitmap *bitmap) GDIP_INTERNAL; BYTE* gdip_bitmap_get_premultiplied_scan0 (GpBitmap *bitmap) GDIP_INTERNAL; void gdip_process_bitmap_attributes (GpBitmap *bitmap, void **dest, GpImageAttributes* attr, BOOL *allocated) GDIP_INTERNAL; ColorPalette* gdip_create_greyscale_palette (int num_colors) GDIP_INTERNAL; typedef struct { Rect region; int x, y; /* the offset of the next byte that will be loaded, once the buffer is depleted */ unsigned short buffer; int p; /* index of pixel within 'buffer' that was returned by the last call to gdip_pixel_stream_get_next () */ int one_pixel_mask; int one_pixel_shift; int pixels_per_byte; /* a negative value is used to indicate a count of bytes per pixel for depths of more than 8 bits */ BitmapData *data; BYTE *scan; } StreamingState; GpStatus gdip_init_pixel_stream (StreamingState *state, BitmapData *data, int x, int y, int w, int h) GDIP_INTERNAL; unsigned int gdip_pixel_stream_get_next (StreamingState *state) GDIP_INTERNAL; #include "bitmap.h" #endif libgdiplus-2.11/src/graphics-private.h0000664000175000017500000001416512225470167014743 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __GRAPHICS_PRIVATE_H__ #define __GRAPHICS_PRIVATE_H__ #include "gdiplus-private.h" #include "imageattributes-private.h" #include "pen-private.h" #include "region-private.h" #include "metafile.h" #if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1,6,0) #define CAIRO_AA_OFFSET_X 1 #define CAIRO_AA_OFFSET_Y 0.5 #else #define CAIRO_AA_OFFSET_X 0.5 #define CAIRO_AA_OFFSET_Y 0.5 #endif #define CURVE_MIN_TERMS 1 #define CURVE_MAX_TERMS 7 #define DEFAULT_TEXT_CONTRAST 4 /* Recursion depth of the flattening algorithm */ #define FLATTEN_RECURSION_LIMIT 10 /* not 100% identical to MS GDI+ which varies a little from int and float, but still around 0x40000000 */ #define GDIP_MAX_COORD 1073741824 #define gdip_is_overflow(a) (((a) < -GDIP_MAX_COORD) || ((a) > GDIP_MAX_COORD)) typedef enum { CURVE_OPEN, CURVE_CLOSE } _CurveType; typedef enum { gtUndefined, gtX11Drawable, gtMemoryBitmap, gtOSXDrawable, gtPostScript } GraphicsType; typedef enum { GraphicsBackEndInvalid = -1, GraphicsBackEndCairo = 0, GraphicsBackEndMetafile = 1 } GraphicsBackEnd; typedef struct { cairo_matrix_t matrix; cairo_matrix_t previous_matrix; GpRegion* clip; cairo_matrix_t clip_matrix; CompositingMode composite_mode; CompositingQuality composite_quality; InterpolationMode interpolation; GpUnit page_unit; float scale; SmoothingMode draw_mode; TextRenderingHint text_mode; PixelOffsetMode pixel_mode; int org_x; int org_y; int text_contrast; } GpState; typedef struct _Graphics { GraphicsBackEnd backend; /* cairo-specific stuff */ cairo_t *ct; GpMatrix *copy_of_ctm; cairo_matrix_t previous_matrix; Display *display; Drawable drawable; void *image; int type; GpPen* last_pen; /* caching pen and brush to avoid unnecessary sets */ GpBrush* last_brush; float aa_offset_x; float aa_offset_y; /* metafile-specific stuff */ EmfType emf_type; GpMetafile *metafile; cairo_surface_t *metasurface; /* bogus surface to satisfy some API calls */ /* common-stuff */ GpRegion* clip; GpMatrix* clip_matrix; GpRect bounds; GpUnit page_unit; float scale; InterpolationMode interpolation; SmoothingMode draw_mode; TextRenderingHint text_mode; GpState* saved_status; int saved_status_pos; CompositingMode composite_mode; CompositingQuality composite_quality; PixelOffsetMode pixel_mode; int render_origin_x; int render_origin_y; float dpi_x; float dpi_y; int text_contrast; #ifdef CAIRO_HAS_QUARTZ_SURFACE void *cg_context; #endif } Graphics; float gdip_unit_conversion (Unit from, Unit to, float dpi, GraphicsType type, float nSrc) GDIP_INTERNAL; void gdip_set_cairo_clipping (GpGraphics *graphics) GDIP_INTERNAL; GpGraphics* gdip_graphics_new (cairo_surface_t *surface) GDIP_INTERNAL; GpGraphics* gdip_metafile_graphics_new (GpMetafile *metafile) GDIP_INTERNAL; BOOL gdip_is_scaled (GpGraphics *graphics) GDIP_INTERNAL; /* prototypes for cairo wrappers to deal with coordonates limits, unit conversion and antialiasing) */ void gdip_cairo_rectangle (GpGraphics *graphics, double x, double y, double width, double height, BOOL antialiasing) GDIP_INTERNAL; void gdip_cairo_move_to (GpGraphics *graphics, double x, double y, BOOL convert_units, BOOL antialiasing) GDIP_INTERNAL; void gdip_cairo_line_to (GpGraphics *graphics, double x, double y, BOOL convert_units, BOOL antialiasing) GDIP_INTERNAL; void gdip_cairo_curve_to (GpGraphics *graphics, double x1, double y1, double x2, double y2, double x3, double y3, BOOL convert_units, BOOL antialiasing) GDIP_INTERNAL; #ifdef CAIRO_HAS_QUARTZ_SURFACE // For the Quartz backend to function we need a few structures and function declarations. // Unfortunately including the headers causes conflicts with internal types. This must // be kept in sync with any changes that might happen (albeit unlikely) to apples structures struct CGPoint { float x; float y; }; typedef struct CGPoint CGPoint; struct CGSize { float width; float height; }; typedef struct CGSize CGSize; struct CGRect { CGPoint origin; CGSize size; }; typedef struct CGRect CGRect; void *CGBitmapContextCreateImage (void *context); void CGContextDrawImage (void *context, CGRect rect, void *image); void CGImageRelease (void *image); void *cairo_quartz_surface_get_cg_context(cairo_surface_t *surface); cairo_surface_t *cairo_quartz_surface_create (int format, int width, int height); cairo_surface_t *cairo_quartz_surface_create_for_cg_context (void *ctx, int width, int height); #endif /* include public API */ #include "image.h" #include "graphics.h" #endif libgdiplus-2.11/src/solidbrush-private.h0000664000175000017500000000354512225470167015321 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __SOLIDBRUSH_PRIVATE_H__ #define __SOLIDBRUSH_PRIVATE_H__ #include "brush-private.h" typedef struct _SolidFill { Brush base; int color; /* We cache the color components */ double A; double R; double G; double B; } SolidFill; #include "solidbrush.h" #endif libgdiplus-2.11/src/text.h0000664000175000017500000000415612225470167012456 00000000000000/* * Copyright (c) 2003 Alexandre Pigolkine, Novell Inc. * Copyright (C) 2006-2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Sebastien Pouliot */ #ifndef __TEXT_H__ #define __TEXT_H__ /* Text public API (only!) */ GpStatus GdipDrawString (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, GpBrush *brush); GpStatus GdipMeasureString (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, RectF *boundingBox, int *codepointsFitted, int *linesFilled); GpStatus GdipMeasureCharacterRanges (GpGraphics *graphics, GDIPCONST WCHAR *string, int length, GDIPCONST GpFont *font, GDIPCONST GpRectF *layoutRect, GDIPCONST GpStringFormat *stringFormat, int regionCount, GpRegion **regions); /* missing API GdipDrawDriverString GdipMeasureDriverString */ #endif libgdiplus-2.11/src/graphics-path-private.h0000664000175000017500000000401112225470167015662 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ /* * NOTE: This is a private header files and everything is subject to changes. */ #ifndef __GRAPHICS_PATH_PRIVATE_H__ #define __GRAPHICS_PATH_PRIVATE_H__ #include "gdiplus-private.h" #include "graphics-private.h" #include "stringformat-private.h" typedef struct _Path { FillMode fill_mode; int count; GByteArray *types; GArray *points; BOOL start_new_fig; /* Flag to keep track if we need to start a new figure */ } Path; BOOL gdip_path_has_curve (GpPath *path) GDIP_INTERNAL; #include "graphics-path.h" #endif libgdiplus-2.11/src/image.h0000664000175000017500000001315212225470167012550 00000000000000/* * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Alexandre Pigolkine (pigolkine@gmx.de) * Duncan Mak (duncan@ximian.com) * Miguel de Icaza (miguel@ximian.com) * Ravindra (rkumar@novell.com) * Sanjay Gupta (gsanjay@novell.com) * Vladimir Vukicevic (vladimir@pobox.com) * Geoff Norton (gnorton@customerdna.com) * Jonathan Gilbert (logic@deltaq.org) * Sebastien Pouliot * * Copyright (C) 2003-2007 Novell, Inc (http://www.novell.com) */ #ifndef __IMAGE_H__ #define __IMAGE_H__ #include "codecs.h" /* * libgdiplus-specific types that needs to be exported to replace the COM-based IStream stuff GDI+ provides */ typedef int (*GetHeaderDelegate) (BYTE*, int); typedef int (*GetBytesDelegate) (BYTE*, int, BOOL); typedef long (*SeekDelegate) (int, int); typedef int (*PutBytesDelegate) (BYTE*, int); typedef void (*CloseDelegate) (); typedef long (*SizeDelegate) (); GpStatus GdipLoadImageFromDelegate_linux (GetHeaderDelegate getHeaderFunc, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GpImage **image); GpStatus GdipSaveImageToDelegate_linux (GpImage *image, GetBytesDelegate getBytesFunc, PutBytesDelegate putBytesFunc, SeekDelegate seekFunc, CloseDelegate closeFunc, SizeDelegate sizeFunc, GDIPCONST CLSID *encoderCLSID, GDIPCONST EncoderParameters *params); /* GDI+ exported Image functions */ GpStatus GdipLoadImageFromStream (void /*IStream*/ *stream, GpImage **image); GpStatus GdipLoadImageFromFile (GDIPCONST WCHAR *file, GpImage **image); GpStatus GdipLoadImageFromFileICM (GDIPCONST WCHAR* filename, GpImage **image); GpStatus GdipSaveImageToFile (GpImage *image, GDIPCONST WCHAR *file, GDIPCONST CLSID *clsidEncoder, GDIPCONST EncoderParameters *encoderParams); GpStatus GdipSaveImageToStream (GpImage *image, void /*IStream*/ *stream, GDIPCONST CLSID *clsidEncoder, GDIPCONST EncoderParameters *encoderParams); GpStatus GdipSaveAdd (GpImage *image, GDIPCONST EncoderParameters* encoderParams); GpStatus GdipSaveAddImage (GpImage *image, GpImage *newImage, GDIPCONST EncoderParameters *params); GpStatus GdipGetImageBounds (GpImage *image, GpRectF *srcRect, GpUnit *srcUnit); GpStatus GdipGetImageDimension (GpImage *image, REAL *width, REAL *height); GpStatus GdipGetImageType (GpImage *image, ImageType *type); GpStatus GdipGetImageWidth (GpImage *image, UINT *width); GpStatus GdipGetImageHeight (GpImage *image, UINT *heigth); GpStatus GdipGetImageHorizontalResolution (GpImage *image, REAL *resolution); GpStatus GdipGetImageVerticalResolution (GpImage *image, REAL *resolution); GpStatus GdipGetImageFlags (GpImage *image, UINT *flags); GpStatus GdipGetImageRawFormat (GpImage *image, GUID *format); GpStatus GdipGetImagePixelFormat (GpImage *image, PixelFormat *format); GpStatus GdipGetImageThumbnail (GpImage *image, UINT thumbWidth, UINT thumbHeight, GpImage **thumbImage, GetThumbnailImageAbort callback, VOID* callBackData); GpStatus GetEncoderParameterListSize (GpImage *image, GDIPCONST CLSID *clsidEncoder, UINT *size); GpStatus GetEncoderParameterList (GpImage *image, GDIPCONST CLSID *clsidEncoder, UINT size, EncoderParameters *buffer); GpStatus GdipImageGetFrameDimensionsCount (GpImage *image, UINT *count); GpStatus GdipImageGetFrameDimensionsList (GpImage *image, GUID *dimensionGUID, UINT count); GpStatus GdipImageGetFrameCount (GpImage *image, GDIPCONST GUID *dimensionGUID, UINT* count); GpStatus GdipImageSelectActiveFrame (GpImage *image, GDIPCONST GUID *dimensionGUID, UINT frameIndex); GpStatus GdipImageRotateFlip (GpImage *image, RotateFlipType rfType); GpStatus GdipGetImageGraphicsContext (GpImage *image, GpGraphics **graphics); GpStatus GdipGetImagePalette (GpImage *image, ColorPalette *palette, INT size); GpStatus GdipSetImagePalette (GpImage *image, GDIPCONST ColorPalette *palette); GpStatus GdipGetImagePaletteSize (GpImage *image, INT* size); GpStatus GdipGetPropertyCount (GpImage *image, UINT *numOfProperty); GpStatus GdipGetPropertyIdList (GpImage *image, UINT numOfProperty, PROPID *list); GpStatus GdipGetPropertyItemSize (GpImage *image, PROPID propID, UINT *size); GpStatus GdipGetPropertyItem (GpImage *image, PROPID propID, UINT size, PropertyItem *buffer); GpStatus GdipGetPropertySize (GpImage *image, UINT *totalBufferSize, UINT *numProperties); GpStatus GdipRemoveProperyItem (GpImage *image, PROPID propID); GpStatus GdipSetProperyItem (GpImage *image, GDIPCONST PropertyItem *item); GpStatus GdipCloneImage(GpImage *image, GpImage **cloneImage); GpStatus GdipDisposeImage (GpImage *image); /* missing API GdipLoadImageFromStreamICM GdipImageForceValidation */ #endif libgdiplus-2.11/cairo/0000775000175000017500000000000012225470635011701 500000000000000libgdiplus-2.11/cairo/INSTALL0000664000175000017500000001445612225470167012664 00000000000000Quick-start build instructions ------------------------------ 1) Configure the package: ./configure 2) Compile it: make 3) Install it: make install This final step may require temporary root access (eg. with sudo) if you don't have write permission to the directory in which cairo will be installed. NOTE: If you are working with source from git/cvs rather than from a tar file, then you should use ./autogen.sh in place of ./configure anywhere it is mentioned in these instructions. More detailed build instructions -------------------------------- 1) Configure the package The first step in building cairo is to configure the package by running the configure script. [Note: if you don't have a configure script, skip down below to the Extremely detailed build instructions.] The configure script attempts to automatically detect as much as possible about your system. So, you should primarily just accept its defaults by running: ./configure The configure script does accept a large number of options for fine-tuning its behavior. See "./configure --help" for a complete list. The most commonly used options are discussed here. --prefix=PREFIX This option specifies the directory under which the software should be installed. By default configure will choose a directory such as /usr/local. If you would like to install cairo to some other location, pass the director to configure with the --prefix option. For example: ./configure --prefix=/opt/cairo would install cairo into the /opt/cairo directory. You could also choose a prefix directory within your home directory if you don't have write access to any system-wide directory. After installing into a custom prefix, you will need to set some environment variables to allow the software to be found. Assuming the /opt/cairo prefix and assuming you are using the bash shell, the following environment variables should be set: PKG_CONFIG_PATH=/opt/cairo/lib/pkgconfig LD_LIBRARY_PATH=/opt/cairo/lib export PKG_CONFIG_PATH LD_LIBRARY_PATH (NOTE: On Mac OS X, at least, use DYLD_LIBRARY_PATH in place of LD_LIBRARY_PATH above.) --enable-quartz --enable-atsui --enable-xcb --enable-glitz --enable-beos --enable-os2 --enable-directfb Some of cairo's backends are marked as experimental and will not be built by default. If you would like to build and experiment with these backends, you will need to pass one of the above options to the configure script. You may need to have certain libraries installed first as discussed in the dependencies section of the README file. --disable-xlib --disable-win32 --disable-png --disable-freetype --disable-ps --disable-pdf --disable-svg Cairo's configure script detects the libraries needed to build each stable backend, and when it finds them, enables each backend. If you would like to override this detection and disable a backend, (even when it would be possible to build it), use one of the options above to disable the backend. 2) Compile the package: This step is very simple. Just: make The Makefiles included with cairo are designed to work on as many different systems as possible. When cairo is compiled, you can also run some automated tests of cairo with: make check NOTE: Some versions of X servers will cause the -xlib tests to report failures in make check even when cairo is working just fine. If you see failures in nothing but -xlib tests, please examine the corresponding -xlib-out.png images and compare them to the -ref.png reference images (the -xlib-diff.png images might also be useful). If the results seem "close enough" please do not report a bug against cairo as the "failures" you are seeing are just due to subtle variations in X server implementations. 3) Install the package: The final step is to install the package with: make install If you are installing to a system-wide location you may need to temporarily acquire root access in order to perform this operation. A good way to do this is to use the sudo program: sudo make install Extremely detailed build instructions ------------------------------------- So you want to build cairo but it didn't come with a configure script. This is probably because you have checked out the latest in-development code via git. If you need to be on the bleeding edge, (for example, because you're wanting to develop some aspect of cairo itself), then you're in the right place and should read on. However, if you don't need such a bleeding-edge version of cairo, then you might prefer to start by building the latest stable cairo release: http://cairographics.org/releases or perhaps the latest (unstable) development snapshot: http://cairographics.org/snapshots There you'll find nicely packaged tar files that include a configure script so you can go back the the simpler instructions above. But you're still reading, so you're someone that loves to learn. Excellent! We hope you'll learn enough to make some excellent contributions to cairo. Since you're not using a packaged tar file, you're going to need some additional tools beyond just a C compiler in order to compile cairo. Specifically, you need the following utilities: automake (1.8 or newer) autoconf libtool Hopefully your platform of choice has packages readily available so that you can easily install things with your system's package management tool, (such as "apt-get install automake" on Debian or "yum install automake" on Fedora, etc.). Note that Mac OS X ships with it's own utility called libtool which is not what you want, (the one you do want goes by the name of glibtool). Once you have all of those packages installed, the next step is to run the autogen.sh script. That can be as simple as: ./autogen.sh Or, if you're using Mac OS X, you'll have to let it know to use glibtool by instead doing: LIBTOOLIZE=glibtoolize ./autogen.sh But before you run that command, note that the autogen.sh script accepts all the same arguments as the configure script, (and in fact, will generate the configure script and run it with the arguments you provide). So go back up to step (1) above and see what additional arguments you might want to pass, (such as prefix). Then continue with the instructions, simply using ./autogen.sh in place of ./configure. Happy hacking! libgdiplus-2.11/cairo/README0000664000175000017500000001502112225470167012500 00000000000000Cairo - Multi-platform 2D graphics library http://cairographics.org What is cairo ============= Cairo is a 2D graphics library with support for multiple output devices. Currently supported output targets include the X Window System, win32, and image buffers, as well as PDF, PostScript, and SVG file output. Experimental backends include OpenGL (through glitz), Quartz, XCB, BeOS, OS/2, and DirectFB. Cairo is designed to produce consistent output on all output media while taking advantage of display hardware acceleration when available (for example, through the X Render Extension). The cairo API provides operations similar to the drawing operators of PostScript and PDF. Operations in cairo include stroking and filling cubic Bézier splines, transforming and compositing translucent images, and antialiased text rendering. All drawing operations can be transformed by any affine transformation (scale, rotation, shear, etc.). Cairo has been designed to let you draw anything you want in a modern 2D graphical user interface. At the same time, the cairo API has been designed to be as fun and easy to learn as possible. If you're not having fun while programming with cairo, then we have failed somewhere---let us know and we'll try to fix it next time around. Cairo is free software and is available to be redistributed and/or modified under the terms of either the GNU Lesser General Public License (LGPL) version 2.1 or the Mozilla Public License (MPL) version 1.1. Where to get more information about cairo ========================================= The primary source of information about cairo is: http://cairographics.org/ The latest versions of cairo can always be found at: http://cairographics.org/download Documentation on using cairo and frequently-asked questions: http://cairographics.org/documentation http://cairographics.org/FAQ Mailing lists for contacting cairo users and developers: http://cairographics.org/lists Roadmap and unscheduled things to do, (please feel free to help out): http://cairographics.org/roadmap http://cairographics.org/todo Dependencies ============ The set of libraries needed to compile cairo depends on which backends are enabled when cairo is configured. So look at the list below to determine which dependencies are needed for the backends of interest. For the surface backends, we have both "supported" and "experimental" backends. Further, the supported backends can be divided into the "standard" backends which can be easily built on any platform, and the "platform" backends which depend on some underlying platform-specific system, (such as the X Window System or some other window system). As an example, for a standard Linux build, (with image, png, pdf, PostScript, svg, and xlib surface backends, and the freetype font backend), the following sample commands will install necessary dependencies: Debian (and similar): apt-get install libpng12-dev libz-dev libxrender-dev libfontconfig1-dev Fedora (and similar): yum install libpng-devel zlib-devel libXrender-devel fontconfig-devel (Those commands intentionally don't install pixman from a distribution package since if you're manually compiling cairo, then you likely want to grab pixman from the same place at the same time and compile it as well.) Supported, "standard" surface backends ------------------------------------ image backend (required) ------------------------ pixman >= 0.10.0 http://cairographics.org/releases png support (can be left out if desired, but many ----------- applications expect it to be present) libpng http://www.libpng.org/pub/png/libpng.html pdf backend ----------- zlib http://www.gzip.org/zlib postscript backend ------------------ zlib http://www.gzip.org/zlib svg backend ----------- [none] Supported, "platform" surface backends ----------------------------------- xlib backend ------------ X11 http://freedesktop.org/Software/xlibs xlib-xrender backend -------------------- Xrender >= 0.6 http://freedesktop.org/Software/xlibs quartz backend -------------- MacOS X >= 10.4 with Xcode >= 2.4 win32 backend ------------- Microsoft Windows 2000 or newer[*]. Font backends (required to have at least one) --------------------------------------------- freetype font backend --------------------- freetype >= 2.1.9 http://freetype.org fontconfig http://fontconfig.org quartz-font backend ------------------- MacOS X >= 10.4 with Xcode >= 2.4 win32 font backend ------------------ Microsoft Windows 2000 or newer[*]. [*] The Win32 backend should work on Windows 2000 and newer (excluding Windows Me.) Most testing has been done on Windows XP. While some portions of the code have been adapted to work on older versions of Windows, considerable work still needs to be done to get cairo running in those environments. Cairo can be compiled on Windows with either the gcc toolchain (see http://www.mingw.org) or with Microsoft Visual C++. If the gcc toolchain is used, the standard build instructions using configure apply, (see INSTALL). If Visual C++ is desired, GNU make is required and Makefile.win32 can be used via 'make -f Makefile.win32'. The compiler, include paths, and library paths must be set up correctly in the environment. MSVC versions earlier than 7.1 are known to miscompile parts of cairo and pixman, and so should be avoided. MSVC 7.1 or later, including the free Microsoft Visual Studio Express editions, produce correct code. Experimental surface backends ----------------------------- glitz ------------- glitz >= 0.4.4 http://freedesktop.org/Software/glitz xcb backend ----------- XCB http://xcb.freedesktop.org beos backend ------------ No dependencies in itself other than an installed BeOS system, but cairo requires a font backend. See the freetype dependency list. os2 backend ----------- Cairo should run on any recent version of OS/2 or eComStation, but it requires a font backend. See the freetype dependency list. Ready to use packages and developer dependencies are available at Netlabs: ftp://ftp.netlabs.org/pub/cairo Compiling ========= See the INSTALL document for build instructions. History ======= Cairo was originally developed by Carl Worth and Keith Packard . Many thanks are due to Lyle Ramshaw without whose patient help our ignorance would be much more apparent. Since the original development, many more people have contributed to cairo. See the AUTHORS files for as complete a list as we've been able to compile so far. libgdiplus-2.11/cairo/Makefile.in0000664000175000017500000011243512225470356013674 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Creating ChangeLog files from git log: # We always create a ChangeLog that contains the most recent changes, and # multiple others for changes between major releases (other than the last such # segment that we put in 'ChangeLog'. The old ones are named # ChangeLog.pre-X.Y where X.Y is the version number of the major release. VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/../config.guess \ $(srcdir)/../config.sub $(srcdir)/../install-sh \ $(srcdir)/../ltmain.sh $(srcdir)/../missing \ $(srcdir)/ChangeLog.mk $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \ $(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \ distdir dist dist-all distcheck ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIROPERF_LIBS = @CAIROPERF_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LDADD = @CAIRO_LDADD@ CAIRO_LIBS = @CAIRO_LIBS@ CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ CAIRO_REQUIRES = @CAIRO_REQUIRES@ CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ FREETYPE_LIBS = @FREETYPE_LIBS@ GLITZ_AGL_CFLAGS = @GLITZ_AGL_CFLAGS@ GLITZ_AGL_LIBS = @GLITZ_AGL_LIBS@ GLITZ_EGL_CFLAGS = @GLITZ_EGL_CFLAGS@ GLITZ_EGL_LIBS = @GLITZ_EGL_LIBS@ GLITZ_GLX_CFLAGS = @GLITZ_GLX_CFLAGS@ GLITZ_GLX_LIBS = @GLITZ_GLX_LIBS@ GLITZ_WGL_CFLAGS = @GLITZ_WGL_CFLAGS@ GLITZ_WGL_LIBS = @GLITZ_WGL_LIBS@ GREP = @GREP@ GS = @GS@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ LIBRSVG_LIBS = @LIBRSVG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POPPLER_CFLAGS = @POPPLER_CFLAGS@ POPPLER_LIBS = @POPPLER_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ XARGS = @XARGS@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ directfb_CFLAGS = @directfb_CFLAGS@ directfb_LIBS = @directfb_LIBS@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ glitz_CFLAGS = @glitz_CFLAGS@ glitz_LIBS = @glitz_LIBS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ png_CFLAGS = @png_CFLAGS@ png_LIBS = @png_LIBS@ png_REQUIRES = @png_REQUIRES@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xcb_CFLAGS = @xcb_CFLAGS@ xcb_LIBS = @xcb_LIBS@ xlib_CFLAGS = @xlib_CFLAGS@ xlib_LIBS = @xlib_LIBS@ xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ xlib_xrender_LIBS = @xlib_xrender_LIBS@ DIST_SUBDIRS = src #boilerplate test perf doc util SUBDIRS = src #doc EXTRA_DIST = AUTHORS BIBLIOGRAPHY BUGS CODING_STYLE COPYING \ COPYING-LGPL-2.1 COPYING-MPL-1.1 INSTALL NEWS PORTING_GUIDE \ README RELEASING Makefile.win32 DISTCLEANFILES = config.cache $(srcdir)/ChangeLog.cache-* \ ChangeLog.cache-* MAINTAINERCLEANFILES = $(srcdir)/aclocal.m4 $(srcdir)/autoscan.log \ $(srcdir)/compile $(srcdir)/config.guess $(srcdir)/config.h.in \ $(srcdir)/config.sub $(srcdir)/configure.scan \ $(srcdir)/depcomp $(srcdir)/install-sh $(srcdir)/ltmain.sh \ $(srcdir)/missing $(srcdir)/mkinstalldirs `find "$(srcdir)" \ -type f -name Makefile.in -print` $(srcdir)/ChangeLog \ $(srcdir)/ChangeLog.pre-* DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-test-surfaces CURR_CHANGELOG_VERSION = $(CAIRO_VERSION_MAJOR).$$(echo "($(CAIRO_VERSION_MINOR)+1)/2*2" | bc) # examines $version PREV_CHANGELOG_VERSION = $$(if test "x$$(echo "($$version-0.1)*2/2"|bc)" = "x$$(echo "$$version*2/2"|bc)"; \ then echo "$$version-$$(echo "$$version" | sed 's/[0-9]/0/g;s/[0-9]$$/2/')"; \ else echo "$$version-1.0"; \ fi | bc | sed 's/[.]0*/./;s/^0[.]\?$$/initial/;s/[.]$$/.0/') CHANGELOGS = ChangeLog \ `version=$(CURR_CHANGELOG_VERSION); \ version=$(PREV_CHANGELOG_VERSION); \ while test "x$$version" != xinitial; do \ echo ChangeLog.pre-$$version; \ version=$(PREV_CHANGELOG_VERSION); \ done` RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) RELEASE_UPLOAD_HOST = cairographics.org RELEASE_UPLOAD_BASE = /srv/cairo.freedesktop.org/www RELEASE_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE)/$(RELEASE_OR_SNAPSHOT)s RELEASE_URL_BASE = http://cairographics.org/$(RELEASE_OR_SNAPSHOT)s RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org (and CC gnome-announce-list@gnome.org) MANUAL_DATED = cairo-manual-`date +%Y%m%d` MANUAL_TAR_FILE = $(MANUAL_DATED).tar.gz MANUAL_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE) tar_file = $(PACKAGE)-$(VERSION).tar.gz sha1_file = $(tar_file).sha1 gpg_file = $(sha1_file).asc # Win32 package zipfiles runtime_zip_file = /tmp/$(PACKAGE)-$(VERSION).zip developer_zip_file = /tmp/$(PACKAGE)-dev-$(VERSION).zip all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/ChangeLog.mk $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(srcdir)/ChangeLog.mk: $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @fail= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod u+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) test -d $(distdir)/_build || exit 0; \ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && am__cwd=`pwd` \ && $(am__cd) $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-local distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \ ctags-recursive install-am install-strip tags-recursive .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ clean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \ dist-gzip dist-hook dist-lzip dist-lzma dist-shar dist-tarZ \ dist-xz dist-zip distcheck distclean distclean-generic \ distclean-hdr distclean-libtool distclean-local distclean-tags \ distcleancheck distdir distuninstallcheck dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am # libpng is required for our test programs #SUBDIRS += boilerplate test perf .PHONY: doc test retest recheck check-valgrind # We have some generated header files, so we really need to build the # library before we can build the docs doc: all cd doc && $(MAKE) $(AM_MAKEFLAGS) doc test: all cd test && $(MAKE) $(AM_MAKEFLAGS) test retest: all cd test && $(MAKE) $(AM_MAKEFLAGS) retest recheck: all cd test && $(MAKE) $(AM_MAKEFLAGS) recheck check-valgrind: all cd test && $(MAKE) $(AM_MAKEFLAGS) check-valgrind cd perf && $(MAKE) $(AM_MAKEFLAGS) check-valgrind perf: all cd perf && $(MAKE) $(AM_MAKEFLAGS) perf # use recursive makes in order to ignore errors during check/perf @CAIRO_HAS_LCOV_TRUE@lcov: @CAIRO_HAS_LCOV_TRUE@ -$(MAKE) $(AM_MAKEFLAGS) check @CAIRO_HAS_LCOV_TRUE@ $(MAKE) $(AM_MAKEFLAGS) genlcov @CAIRO_HAS_LCOV_TRUE@lcov-perf: @CAIRO_HAS_LCOV_TRUE@ -$(MAKE) $(AM_MAKEFLAGS) perf @CAIRO_HAS_LCOV_TRUE@ $(MAKE) $(AM_MAKEFLAGS) genlcov # we have to massage the lcov.info file slightly to hide the effect of libtool # placing the objects files in the .libs/ directory separate from the *.c @CAIRO_HAS_LCOV_TRUE@genlcov: @CAIRO_HAS_LCOV_TRUE@ $(LTP) --directory $(top_builddir) --path $(top_builddir) --capture --output-file cairo-lcov.info --test-name CAIRO_TEST --no-checksum @CAIRO_HAS_LCOV_TRUE@ $(SED) -e 's#.libs/##' \ @CAIRO_HAS_LCOV_TRUE@ -e 's#boilerplate/src#src#' \ @CAIRO_HAS_LCOV_TRUE@ -e 's#$(shell pwd)#$(shell cd $(top_srcdir) && pwd)#' \ @CAIRO_HAS_LCOV_TRUE@ < cairo-lcov.info > cairo-lcov.info.tmp @CAIRO_HAS_LCOV_TRUE@ LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory cairo-lcov --title "Cairo Code Coverage" --show-details cairo-lcov.info.tmp @CAIRO_HAS_LCOV_TRUE@ $(RM) cairo-lcov.info.tmp @CAIRO_HAS_LCOV_FALSE@lcov lcov-perf genlcov: @CAIRO_HAS_LCOV_FALSE@ @echo You need to configure Cairo with support for gcov enabled. @CAIRO_HAS_LCOV_FALSE@ @echo e.g, ./configure --enable-gcov lcov-clean: @CAIRO_HAS_LCOV_TRUE@ -$(LTP) --directory $(top_builddir) -z -$(RM) -r cairo-lcov.info cairo-lcov -$(FIND) -name '*.gcda' -print | $(XARGS) $(RM) distclean-local: lcov-clean changelogs: @$(MAKE) $(AM_MAKEFLAGS) $(CHANGELOGS) dist-hook: changelogs changelogs="$(CHANGELOGS)"; \ for changelog in $$changelogs; do \ cp $(srcdir)/$$changelog $(distdir)/ 2>/dev/null || \ cp $$changelog $(distdir)/; \ done $(srcdir)/ChangeLog: @if test -d "$(srcdir)/.git"; then \ version=$(CURR_CHANGELOG_VERSION); \ prev=$(PREV_CHANGELOG_VERSION).0; \ nearest_tag=`git-describe | sed 's/-.*//'`; \ before=$(srcdir)/ChangeLog.cache-$$prev..$$nearest_tag; \ after=$(srcdir)/ChangeLog.cache-$$nearest_tag..; \ $(MAKE) $(AM_MAKEFLAGS) $$before $$after && \ echo Creating $@ && \ { cat $$after; echo; cat $$before; } > $@; \ else \ test -f $@ || \ (echo A git checkout is required to generate $@ >&2 && \ echo A git checkout is required to generate this file >> $@); \ fi ChangeLog.cache-*..: .git/HEAD ChangeLog%: $(srcdir)/ChangeLog% $(srcdir)/ChangeLog.cache-% $(srcdir)/ChangeLog.pre-%: @echo Creating $@ @if test -d "$(srcdir)/.git"; then \ (cd "$(srcdir)" && \ version=$$(echo "$@" | sed 's/.*ChangeLog\([.].*-\)\?//'); \ if echo "$@" | grep -q '^ChangeLog[.]cache'; then \ spec=$$version; \ else \ to=$$version; \ test "x$$version" = x && version=$(CURR_CHANGELOG_VERSION); \ from=$(PREV_CHANGELOG_VERSION); \ test "x$$to" = x || to=$$to.0; \ test "x$$from" = xinitial || from=$$from.0; \ spec=$$from..$$to; \ fi; \ ./missing --run git-log --stat "$$spec") > $@.tmp \ && mv -f $@.tmp $@ \ || ($(RM) $@.tmp; \ echo Failed to generate $@, your $@ may be outdated >&2); \ else \ echo A git checkout is required to generate $@ >&2; \ fi .PHONY: changelogs ChangeLog $(srcdir)/ChangeLog # Some custom targets to make it easier to release things. # # To make real stable releases or devel snapshots, use either: # make release-check # or make release-publish # # To make a quick properly named (date and git hash stamped) tarball: # make snapshot snapshot: distdir="$(distdir)-`date '+%Y%m%d'`"; \ test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git-rev-parse HEAD | cut -c 1-6`; \ $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" dist $(sha1_file): $(tar_file) sha1sum $^ > $@ $(gpg_file): $(sha1_file) @echo "Please enter your GPG password to sign the checksum." gpg --armor --sign $^ $(runtime_zip_file): install -$(RM) $@ cd $(prefix); \ zip $@ bin/libcairo-$(LT_CURRENT_MINUS_AGE).dll $(developer_zip_file): install -$(RM) $@ cd $(prefix); \ zip -r $@ include/cairo lib/libcairo.dll.a lib/cairo.lib lib/pkgconfig/cairo.pc lib/pkgconfig/cairo-*.pc share/gtk-doc/html/cairo zips: $(runtime_zip_file) $(developer_zip_file) release-verify-sane-changelogs: changelogs @echo -n "Checking that the ChangeLog files are sane..." @if grep -q "is required to generate" $(CHANGELOGS); then \ (echo "Ouch." && echo "Some of the ChangeLogs are not generated correctly." \ && echo "Remove ChangeLog* and make changelogs" \ && false); else :; fi @echo "Good." release-verify-sane-tests: @echo "Checking that the test suite is sane..." @cd test && $(MAKE) $(AM_MAKEFLAGS) release-verify-sane-tests release-verify-soname-major: @echo -n "Checking that the cairo soname major number is 2..." @test "$(LT_CURRENT_MINUS_AGE)" = "2" \ || (echo "Ouch." && echo "The soname major number is $(LT_CURRENT_MINUS_AGE) instead of 2." \ && echo "The libtool shared library version numbers in configure.in must be incremented properly." \ && false) @echo "Good." release-verify-even-micro: @echo -n "Checking that $(VERSION) has an even micro component..." @test "$(CAIRO_VERSION_MICRO)" = "`echo $(CAIRO_VERSION_MICRO)/2*2 | bc`" \ || (echo "Ouch." && echo "The version micro component '$(CAIRO_VERSION_MICRO)' is not an even number." \ && echo "The version in configure.in must be incremented before a new release." \ && false) @echo "Good." release-verify-newer: @echo -n "Checking that no $(VERSION) release already exists..." @ssh $(RELEASE_UPLOAD_HOST) test ! -e $(RELEASE_UPLOAD_DIR)/$(tar_file) \ || (echo "Ouch." && echo "Found: $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR)/$(tar_file)" \ && echo "Are you sure you have an updated checkout?" \ && echo "This should never happen." \ && false) @echo "Good." release-remove-old: $(RM) $(tar_file) $(sha1_file) $(gpg_file) # Maybe it's just my system, but somehow group sticky bits keep # getting set and this causes failures in un-tarring on some systems. # Until I figure out where the sticky bit is coming from, just clean # these up before building a release. release-cleanup-group-sticky: find . -type f | xargs chmod g-s release-check: release-verify-sane-changelogs release-verify-sane-tests release-verify-soname-major release-verify-even-micro release-verify-newer release-remove-old release-cleanup-group-sticky distcheck release-upload: release-check $(tar_file) $(sha1_file) $(gpg_file) mkdir -p releases scp $(tar_file) $(sha1_file) $(gpg_file) $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR) mv $(tar_file) $(sha1_file) $(gpg_file) releases ssh $(RELEASE_UPLOAD_HOST) "rm -f $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_file) $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-$(VERSION)" git-tag -s -m "cairo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release" $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release-publish-message: releases/$(sha1_file) @echo "Please follow the instructions in RELEASING to push stuff out and" @echo "send out the announcement mails. Here is the excerpt you need:" @echo "" @echo "Subject: $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) now available" @echo "" @echo "============================== CUT HERE ==============================" @echo "A new $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) is now available from:" @echo "" @echo " $(RELEASE_URL_BASE)/$(tar_file)" @echo "" @echo " which can be verified with:" @echo "" @echo " $(RELEASE_URL_BASE)/$(sha1_file)" @echo -n " " @cat releases/$(sha1_file) @echo "" @echo " $(RELEASE_URL_BASE)/$(gpg_file)" @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" @echo "" @echo " Additionally, a git clone of the source tree:" @echo "" @echo " git clone git://git.cairographics.org/git/cairo" @echo "" @echo " will include a signed $(VERSION) tag which points to a commit named:" @echo " `git cat-file tag $(VERSION) | grep ^object | sed -e 's,object ,,'`" @echo "" @echo " which can be verified with:" @echo " git verify-tag $(VERSION)" @echo "" @echo " and can be checked out with a command such as:" @echo " git checkout -b build $(VERSION)" @echo "" @echo "============================== CUT HERE ==============================" release-publish: release-upload release-publish-message doc-publish: doc rm -rf ./$(MANUAL_DATED) cp -a doc/public/html $(MANUAL_DATED) tar czf $(MANUAL_TAR_FILE) $(MANUAL_DATED) scp $(MANUAL_TAR_FILE) $(RELEASE_UPLOAD_HOST):$(MANUAL_UPLOAD_DIR) ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && tar xzf $(MANUAL_TAR_FILE) && rm -f manual && ln -s $(MANUAL_DATED) manual && ln -sf $(MANUAL_TAR_FILE) cairo-manual.tar.gz" .PHONY: release-verify-even-micro release-verify-newer release-remove-old release-cleanup-group-sticky release-check release-upload release-publish docs-publish lcov lcov-perf lcov-clean genlcov # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/cairo/CODING_STYLE0000664000175000017500000002044512225470167013474 00000000000000Cairo coding style. This document is intended to be a short description of the preferred coding style for the cairo source code. Good style requires good taste, which means this can't all be reduced to automated rules, and there are exceptions. We want the code to be easy to understand and maintain, and consistent style plays an important part in that, even if some of the specific details seem trivial. If nothing else, this document gives a place to put consistent answers for issues that would otherwise be arbitrary. Most of the guidelines here are demonstrated by examples, (which means this document is quicker to read than it might appear given its length). Most of the examples are positive examples that you should imitate. The few negative examples are clearly marked with a comment of /* Yuck! */. Please don't submit code to cairo that looks like any of these. Indentation ----------- Each new level is indented 4 more spaces than the previous level: if (condition) do_something (); This may be achieved with space characters or a combination of tab characters and space characters. It may not be achieved with tab characters exclusively (see below). Tab characters -------------- The tab character must always be interpreted according to its traditional meaning: Advance to the next column which is a multiple of 8. With this definition, even levels of indentation can be achieved with a sequence of tab characters, while odd levels of indentation may begin with a sequence of tab character but must end with 4 space characters. Some programmers have been misled by certain text editors into thinking that 4-space indentation can be achieved with tab characters exclusively by changing the meaning of tab character to be "advance to the next column which is a multiple of 4". Code formatted in this way, making an assumption of a fictitious 4-character-tab will not be accepted into cairo. The rationale here is that tabs are used in the code for lining things up other than indentation, (see the Whitespace section below), and changing the interpretation of tab from its traditional meaning will break this alignment. Braces ------ Most of the code in cairo uses bracing in the style of K&R: if (condition) { do_this (); do_that (); } else { do_the_other (); } but some of the code uses an alternate style: if (condition) { do_this (); do_that (); } else { do_the_other (); } and that seems just fine. We won't lay down any strict rule on this point, (though there should be some local consistency). If you came here hoping to find some guidance, then use the first form above. If all of the substatements of an if statement are single statements, the optional braces should not usually appear: if (condition) do_this (); else do_that (); But the braces are mandatory when mixing single statement and compound statements in the various clauses. For example, do not do this: if (condition) { do_this (); do_that (); } else /* Yuck! */ do_the_other (); And of course, there are exceptions for when the code just looks better with the braces: if (condition) { /* Note that we have to be careful here. */ do_something_dangerous (with_care); } if (condition && other_condition && yet_another) { do_something (); } And note that this last example also shows a situation in which the opening brace really needs to be on its own line. The following looks awful: if (condition && other_condition && yet_another) { /* Yuck! */ do_something (); } As we said above, legible code that is easy to understand and maintain is the goal, not adherence to strict rules. Whitespace ---------- Separate logically distinct chunks with a single newline. This obviously applies between functions, but also applies within a function or block and can even be used to good effect within a structure definition: struct _cairo_gstate { cairo_operator_t op; double tolerance; /* stroke style */ double line_width; cairo_line_cap_t line_cap; cairo_line_join_t line_join; double miter_limit; cairo_fill_rule_t fill_rule; double *dash; int num_dashes; double dash_offset; ... } Use a single space before a left parenthesis, except where the standard will not allow it, (eg. when defining a parameterized macro). Don't eliminate newlines just because things would still fit on one line. This breaks the expected visual structure of the code making it much harder to read and understand: if (condition) foo (); else bar (); /* Yuck! */ Do eliminate trailing whitespace (space or tab characters) on any line. Also, avoid putting initial or final blank lines into any file, and never use multiple blank lines instead of a single blank line. Do enable the default git pre-commit hook that detect trailing whitespace for you and help you to avoid corrupting cairo's tree with it. Do that as follows: chmod a+x .git/hooks/pre-commit You might also find the git-stripspace utility helpful which acts as a filter to remove trailing whitespace as well as initial, final, and duplicate blank lines. As a special case of the bracing and whitespace guidelines, function definitions should always take the following form: void my_function (argument) { do_my_things (); } And function prototypes should similarly have the return type (and associated specifiers and qualifiers) on a line above the function, so that the function name is flush left. Break up long lines (> ~80 characters) and use whitespace to align things nicely. For example the arguments in a long list to a function call should all be aligned with each other: align_function_arguments (argument_the_first, argument_the_second, argument_the_third); And as a special rule, in a function prototype, (as well as in the definition), whitespace should be inserted between the parameter types and names so that the names are aligned: void align_parameter_names_in_prototypes (const char *char_star_arg, int int_arg, double *double_star_arg, double double_arg); Note that parameters with a * prefix are aligned one character to the left so that the actual names are aligned. Managing nested blocks ---------------------- Long blocks that are deeply nested make the code very hard to read. Fortunately such blocks often indicate logically distinct chunks of functionality that are begging to be split into their own functions. Please listen to the blocks when they beg. In other cases, gratuitous nesting comes about because the primary functionality gets buried in a nested block rather than living at the primary level where it belongs. Consider the following: foo = malloc (sizeof (foo_t)); if (foo) { /* Yuck! */ ... /* lots of code to initialize foo */ ... return SUCCESS; } return FAILURE; This kind of gratuitous nesting can be avoided by following a pattern of handling exceptional cases early and returning: foo = malloc (sizeof (foo_t)); if (foo == NULL) return FAILURE; ... /* lots of code to initialize foo */ ... return SUCCESS; The return statement is often the best thing to use in a pattern like this. If it's not available due to additional nesting above which require some cleanup after the current block, then consider splitting the current block into a new function before using goto. Memory allocation ----------------- Because much of cairo's data consists of dynamically allocated arrays, it's very easy to introduce integer overflow issues whenever malloc() is called. Use the _cairo_malloc2(), _cairo_malloc3(), and _cairo_malloc2_add1 macros to avoid these cases; these macros check for overflow and will return NULL in that case. malloc (n * size) => _cairo_malloc_ab (n, size) e.g. malloc (num_elts * sizeof(some_type)) => _cairo_malloc2 (num_elts, sizeof(some_type)) malloc (a * b * size) => _cairo_malloc_abc (a, b, size) e.g. malloc (width * height * 4) => _cairo_malloc3 (width, height, 4) malloc (n * size + k) => _cairo_malloc_ab_plus_c (n, size, k) e.g. malloc (num * sizeof(entry) + sizeof(header)) => _cairo_malloc2k (num, sizeof(entry), sizeof(header)) In general, be wary of performing any arithmetic operations in an argument to malloc. You should explicitly check for integer overflow yourself in any more complex situations.libgdiplus-2.11/cairo/BIBLIOGRAPHY0000664000175000017500000000725212225470167013425 00000000000000Here's an effort to document some of the academic work that was referenced during the implementation of cairo. It is presented in the context of operations as they would be performed by either cairo_stroke() or cairo_fill(): Given a Bézier path, approximate it with line segments: The deCasteljau algorithm "Outillages methodes calcul", P de Casteljau, technical report, - Andre Citroen Automobiles SA, Paris, 1959 That technical report might be "hard" to find, but fortunately this algorithm will be described in any reasonable textbook on computational geometry. Two that have been recommended by cairo contributors are: "Computational Geometry, Algorithms and Applications", M. de Berg, M. van Kreveld, M. Overmars, M. Schwarzkopf; Springer-Verlag, ISBN: 3-540-65620-0. "Computational Geometry in C (Second Edition)", Joseph O'Rourke, Cambridge University Press, ISBN 0521640105. Then, if stroking, construct a polygonal representation of the pen approximating a circle (if filling skip three steps): "Good approximation of circles by curvature-continuous Bezier curves", Tor Dokken and Morten Daehlen, Computer Aided Geometric Design 8 (1990) 22-41. Add points to that pen based on the initial/final path faces and take the convex hull: Convex hull algorithm [Again, see your favorite computational geometry textbook. Should cite the name of the algorithm cairo uses here, if it has a name.] Now, "convolve" the "tracing" of the pen with the tracing of the path: "A Kinetic Framework for Computational Geometry", Leonidas J. Guibas, Lyle Ramshaw, and Jorge Stolfi, Proceedings of the 24th IEEE Annual Symposium on Foundations of Computer Science (FOCS), November 1983, 100-111. The result of the convolution is a polygon that must be filled. A fill operations begins here. We use a very conventional Bentley-Ottmann pass for computing the intersections, informed by some hints on robust implementation courtesy of John Hobby: John D. Hobby, Practical Segment Intersection with Finite Precision Output, Computation Geometry Theory and Applications, 13(4), 1999. http://cm.bell-labs.com/who/hobby/93_2-27.pdf Hobby's primary contribution in that paper is his "tolerance square" algorithm for robustness against edges being "bent" due to restricting intersection coordinates to the grid available by finite-precision arithmetic. This is one algorithm we have not implemented yet. We use a data-structure called Skiplists in the our implementation of Bentley-Ottmann: W. Pugh, Skip Lists: a Probabilistic Alternative to Balanced Trees, Communications of the ACM, vol. 33, no. 6, pp.668-676, 1990. http://citeseer.ist.psu.edu/pugh90skip.html From the result of the intersection-finding pass, we are currently computing a tessellation of trapezoids, (the exact manner is undergoing some work right now with some important speedup), but we may want to rasterize directly from those edges at some point. Given the set of tessellated trapezoids, we currently execute a straightforward, (and slow), point-sampled rasterization, (and currently with a near-pessimal regular 15x17 grid). We've now computed a mask which gets fed along with the source and destination into cairo's fundamental rendering equation. The most basic form of this equation is: destination = (source IN mask) OP destination with the restriction that no part of the destination outside the current clip region is affected. In this equation, IN refers to the Porter-Duff "in" operation, while OP refers to a any user-selected Porter-Duff operator: T. Porter & T. Duff, Compositing Digital Images Computer Graphics Volume 18, Number 3 July 1984 pp 253-259 http://keithp.com/~keithp/porterduff/p253-porter.pdf libgdiplus-2.11/cairo/ChangeLog.pre-1.00000664000175000017500000270504312225470635014467 00000000000000commit 995ed33726ac1e840ea1d6a28f48d6883a4bad59 Author: Carl Worth Date: Wed Aug 24 09:29:39 2005 +0000 Increment CAIRO_VERSION to 1.0.0 and libtool versioning to 4:2:2. ChangeLog | 5 +++++ configure.in | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) commit 95c1d5470151d4f9778a840847c9b532da1ef9f7 Author: Carl Worth Date: Wed Aug 24 09:26:28 2005 +0000 Fix typos. Add CAIRO_STATUS_INVALID_DASH. ChangeLog | 4 ++++ NEWS | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) commit 766f63567c8ecfc6881781054ac792e6252b8106 Author: Carl Worth Date: Wed Aug 24 09:12:37 2005 +0000 Unabbreviate "eg." to "for example,". ChangeLog | 4 ++++ README | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 2cd76fc77f5455fb2bb141a4e75b3ced0004a1e2 Author: Carl Worth Date: Wed Aug 24 08:46:02 2005 +0000 Update name from "0.5 porting guide" to "1.0 porting guide." ChangeLog | 5 +++++ PORTING_GUIDE | 14 +++++++++++--- 2 files changed, 16 insertions(+), 3 deletions(-) commit aa4b9f4b00c5cf7be0f525caa2419b00a0dc26b5 Author: Carl Worth Date: Wed Aug 24 08:28:00 2005 +0000 Some text cleanups from Øyvind KolÃ¥s. ChangeLog | 5 +++++ README | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit d86f5af717baf1e44df3d10633c46482ed44b9da Author: Carl Worth Date: Wed Aug 24 08:12:22 2005 +0000 Add Amaury Jacquot. AUTHORS | 1 + ChangeLog | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-) commit ccc7a2f115960514ba43f24e85df9472b0fd4c60 Author: Carl Worth Date: Wed Aug 24 08:07:24 2005 +0000 Fix typo. ChangeLog | 4 ++++ RELEASING | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit f4188a4680140c280bdf28c26020488d976b1dde Author: Carl Worth Date: Wed Aug 24 07:58:07 2005 +0000 Fix typos. AUTHORS | 2 +- ChangeLog | 5 +++++ README | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit bd510d8b4b7ab22a8699d55734e22b57648752d8 Author: Tor Lillqvist Date: Wed Aug 24 07:56:45 2005 +0000 Drop PDF and PS backend and FT font API from Win32 DLL entry points for now. ChangeLog | 5 +++++ src/Makefile.am | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) commit d86b741b4e9fdae422f7ef8c791ce779812b2be9 Author: Carl Worth Date: Wed Aug 24 07:16:01 2005 +0000 Fix typos. ChangeLog | 4 ++++ README | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit 83b2f98d4955149c0d9941ed42ea51bf0d6cc993 Author: Carl Worth Date: Wed Aug 24 06:50:51 2005 +0000 Move glitz into the experimental list. ChangeLog | 4 ++++ README | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit 9fde3cc0e3eea213c0f0fdfd8ca571fe63f4ddc9 Author: Carl Worth Date: Wed Aug 24 06:48:02 2005 +0000 Put glitz in the experimental section. Give glitz the experimental treatment, (disable it by default. ChangeLog | 7 +++++++ INSTALL | 2 +- configure.in | 8 ++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) commit 19c25d63c2c4dd7a178e90df81b711ba667cbdd1 Author: Carl Worth Date: Wed Aug 24 06:17:39 2005 +0000 Add some more detailed build instructions. ChangeLog | 4 ++ INSTALL | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 117 insertions(+), 5 deletions(-) commit 985d8571d2266715229d5e1e9d2037897240d6ce Author: Billy Biggs Date: Wed Aug 24 06:09:11 2005 +0000 Fix some minor typos in the doc. ChangeLog | 5 +++++ src/cairo.c | 18 +++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) commit b5a7a195791007e3c367b92a1fcc628699ca8043 Author: Carl Worth Date: Wed Aug 24 06:07:58 2005 +0000 Disable ATSUI by default as well. ChangeLog | 4 ++++ configure.in | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit 3a9f977817b287e56f54760aece3105771a7dcc1 Author: Carl Worth Date: Wed Aug 24 05:43:48 2005 +0000 Add pointer to http://bugs.freedesktop.org. BUGS | 12 ++++++++++++ ChangeLog | 4 ++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit 9282036cd354a5714655ce4ad7859a99a1800b19 Author: Carl Worth Date: Wed Aug 24 05:36:05 2005 +0000 Add more detailed notes on what is required to compile cairo on Mac OS X or win32. ChangeLog | 5 +++++ README | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 0 deletions(-) commit 4569aeda97c15084998eb956a659ad1ace302819 Author: Carl Worth Date: Wed Aug 24 05:28:28 2005 +0000 Change upload directory from snapshots to releases now thatwe're doing stable releases of cairo. ChangeLog | 6 ++++++ Makefile.am | 4 ++-- RELEASING | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) commit 18ef8944dc318b240791070ef5282b4037bd2441 Author: Carl Worth Date: Wed Aug 24 05:25:51 2005 +0000 Give PostScript and PDF backends the experimental treatment, disabling them by default. ChangeLog | 5 +++++ configure.in | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) commit 5ca5ddde0b505403a3a129c2c743c8e5f8fa9b90 Author: Carl Worth Date: Wed Aug 24 05:21:50 2005 +0000 Add notes for 1.0 release. Thanks to Owen Taylor. Note that PS and PDF backends are experimental. Note the progress that has been completed so that 1.0 is ready now. ChangeLog | 9 ++++++ NEWS | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ README | 4 +- ROADMAP | 28 +++++++++++++------- 4 files changed, 111 insertions(+), 12 deletions(-) commit 112094a350c4ed3a936a748f55bcbae7eac4e5c1 Author: Carl Worth Date: Wed Aug 24 02:25:39 2005 +0000 Update documentation for most path construction functions. Add discussion of the effects on the current point to all functions. Rephrase the wording of the relative functions. Big rewrite of cairo_arc description. Add discussion of join not caps to cairo_close_path. ChangeLog | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 235838d49f966804970fa06715e2e89b92f39c9f Author: Keith Packard Date: Wed Aug 24 01:47:13 2005 +0000 Use new device_x_scale/device_y_scale surface fields to set the device coordinate space to the nominal pixels. Treat more alpha values as translucent (up to 0.999) Fix emit_image to actually use a temporary image when necessary. Change PS coordinate space to match cairo (top-down), adjust PS output to use new space. Find more cases where PS output was not supported and fall back to image surface. reviewed by: cworth ChangeLog | 28 +++++++++ src/cairo-ps-surface.c | 146 ++++++++++++++++++++++++++++++----------------- 2 files changed, 121 insertions(+), 53 deletions(-) commit 5198e71eaf07538307843a58a57f4551411f40b6 Author: Keith Packard Date: Wed Aug 24 01:42:19 2005 +0000 _cairo_surface_show_glyphs may return UNSUPPORTED in which case a call to scaled_font->backend->show_glyphs is needed. reviewed by: cworth ChangeLog | 8 ++++++++ src/cairo-meta-surface.c | 17 +++++++++++++++++ 2 files changed, 25 insertions(+), 0 deletions(-) commit e4166936b9d2e1197efcdc378a6113a6c68a41ed Author: Keith Packard Date: Wed Aug 24 01:39:56 2005 +0000 Add device_x_scale and device_y_scale to surface so that the coordinate system seen by the backend can differ from the nominal device coordinate space used by the application. Useful for printer backends where the device coordinate space should be in pixels while the user visible device space is in points. There is no API to set these values; the backends using this functionality should do that themselves before the first cairo_t is created. reviewed by: cworth ChangeLog | 27 +++++++++++++++++++++++ src/cairo-gstate-private.h | 4 +- src/cairo-gstate.c | 51 ++++++++++++++++++++++++++++++++++--------- src/cairo-surface.c | 10 +++++--- src/cairoint.h | 2 + 5 files changed, 77 insertions(+), 17 deletions(-) commit 77a0ae7439bba5b442fc7c3bee5eb61ebfe24abb Author: Carl Worth Date: Wed Aug 24 01:13:36 2005 +0000 Fix cairo_show_text to advance the current point. Add documentation for cairo_show_text. Add test to verify that the current-point-advancing behavior of cairo_show_text is working. Remove bug about cairo_show_text not advancing the current point. BUGS | 4 -- ChangeLog | 15 +++++++ src/cairo.c | 54 +++++++++++++++++++++++--- test/.cvsignore | 1 + test/Makefile.am | 3 + test/show-text-current-point-ref.png | Bin 0 -> 1606 bytes test/show-text-current-point.c | 68 ++++++++++++++++++++++++++++++++++ 7 files changed, 134 insertions(+), 11 deletions(-) commit 5ac2d216ab5322869cd2540c7cc2cda579eaf85e Author: Carl Worth Date: Wed Aug 24 00:19:52 2005 +0000 Update documentation for most path construction functions. Add discussion of the effects on the current point to all functions. Rephrase the wording of the relative functions. Big rewrite of cairo_arc description. Add discussion of join not caps to cairo_close_path. ChangeLog | 4 ++ src/cairo.c | 130 ++++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 93 insertions(+), 41 deletions(-) commit 4f44cd809db5c72638d14963870848eba9f266d1 Author: Carl Worth Date: Tue Aug 23 23:20:53 2005 +0000 Minor doc edit. ChangeLog | 4 ++++ src/cairo.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit ef8b5b6a50667792a1cbdd5d338c8f0a154855ff Author: Carl Worth Date: Tue Aug 23 23:13:35 2005 +0000 Minor doc edits. ChangeLog | 4 ++++ doc/public/tmpl/cairo-matrix.sgml | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) commit 4047fa507720c01a9ac0377de92ddc71ff2f359f Author: Carl Worth Date: Tue Aug 23 22:48:13 2005 +0000 Prefer cairo over Cairo when not at the beginning of a sentence. ChangeLog | 8 ++++++++ doc/public/tmpl/cairo-matrix.sgml | 2 +- doc/public/tmpl/cairo-status.sgml | 2 +- doc/public/tmpl/cairo-types.sgml | 2 +- doc/public/tmpl/cairo.sgml | 6 +++--- 5 files changed, 14 insertions(+), 6 deletions(-) commit 0b616d20dd77aaa4549759a49d72dd1007290ebb Author: Billy Biggs Date: Tue Aug 23 21:36:08 2005 +0000 Add a long description. Fix a typo. Document the return value of cairo_scaled_font_reference(). Document the width and height parameters of cairo_xlib_surface_set_drawable(). ChangeLog | 9 +++++++++ doc/public/tmpl/cairo-image.sgml | 7 +++++-- doc/public/tmpl/cairo.sgml | 2 +- src/cairo-font.c | 2 ++ src/cairo-xlib-surface.c | 2 ++ 5 files changed, 19 insertions(+), 3 deletions(-) commit 86889a55de043b1357af39a2446b948068d54179 Author: Billy Biggs Date: Tue Aug 23 21:10:39 2005 +0000 Document the rest of the path functions (except the two text ones, which should coordinate with their corresponding non-path versions). Minor shuffling. ChangeLog | 9 ++++ doc/public/cairo-sections.txt | 18 ++++---- doc/public/tmpl/cairo-paths.sgml | 87 ++++++++++++++++++++++-------------- doc/public/tmpl/cairo-text.sgml | 19 -------- src/cairo.c | 92 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 163 insertions(+), 62 deletions(-) commit 1e054fa3966341c08069d90daa0a430571539d3f Author: Kristian Høgsberg Date: Tue Aug 23 20:08:21 2005 +0000 More minor edits. AUTHORS | 2 +- ChangeLog | 5 +++++ README | 2 ++ 3 files changed, 8 insertions(+), 1 deletions(-) commit ebb54333561b4b4e85660687f1188999435f1a7a Author: Billy Biggs Date: Tue Aug 23 19:54:11 2005 +0000 Minor edits. ChangeLog | 4 ++++ README | 16 +++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) commit 326911a749979104fbcd60e5af93f902257a5389 Author: Billy Biggs Date: Tue Aug 23 19:52:09 2005 +0000 Update the long description of cairo_matrix_t to match the current sources. Add cairo_path_data_t. Some documentation updates and improvements. ChangeLog | 11 ++++ doc/public/tmpl/cairo-matrix.sgml | 30 ++++-------- doc/public/tmpl/cairo-paths.sgml | 6 ++ src/cairo-ft-font.c | 5 +- src/cairo-path-data.c | 4 +- src/cairo-pattern.c | 4 +- src/cairo.c | 89 +++++++++++++++++++++++------------ src/cairo.h | 92 +++++++++++++++++++------------------ 8 files changed, 139 insertions(+), 102 deletions(-) commit ee3e72e6a9e777aec5a0993352de1f8e77065989 Author: Carl Worth Date: Tue Aug 23 19:34:20 2005 +0000 Add suppression for uninitialized data in fbBltOne. ChangeLog | 5 +++++ test/.valgrind-suppressions | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) commit 0b063224a6d72ea025720060abf0781d4df81757 Author: Carl Worth Date: Tue Aug 23 19:31:10 2005 +0000 Big update in preparation for 1.0. ChangeLog | 4 ++ README | 149 +++++++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 110 insertions(+), 43 deletions(-) commit 83aae920630ec9be77fc80cb544c6272859f4460 Author: Carl Worth Date: Tue Aug 23 17:36:20 2005 +0000 Added several names to the AUTHORS file (since 2005-01-24): Josh Aas Billy Biggs Damien Carbery Steve Chaplin Tomasz Cholewo John Ehresman Behdad Esfahbod Bertram Felgenhauer J. Ali Harlow Adrian Johnson Michael Johnson Øyvind KolÃ¥s Martin Kretzschmar Tor Lillqvist Luke-Jr Jeff Muizelaar Peter Nilsson Geoff Norton Robert O'Callahan Mike Owens Stuart Parmenter Tim Rowley Jason Dorje Short Travis Spencer Malcolm Tredinnick AUTHORS | 29 +++++++++++++++++++++++++++-- ChangeLog | 34 +++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 5 deletions(-) commit b4d43d7fddd9d0843a97a8f321cafc646f59d76d Author: Billy Biggs Date: Tue Aug 23 16:31:59 2005 +0000 Experimental Quartz and XCB backends removed from the public doc for now. ChangeLog | 5 +++++ doc/public/cairo-docs.xml | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit f5c16c2e4815306308de5c884d11ff9888229986 Author: Owen Taylor Date: Tue Aug 23 15:16:37 2005 +0000 Reverse the help text for --enable-xcb, --enable-quartz. ChangeLog | 5 +++++ configure.in | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit b8d610c56e77afe6e27514d8a1ce76bd9aaf8274 Author: Owen Taylor Date: Tue Aug 23 15:11:44 2005 +0000 Disable XCB and Quartz backends unless explicitely enabled. Add a big warning message if they are enabled about bugs and API instability. ChangeLog | 6 ++++++ configure.in | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) commit 00af78735e02a0384ada84d57cd208f06bcaaadc Author: Owen Taylor Date: Tue Aug 23 14:53:08 2005 +0000 Rip out all the code for doing anything other than linear interpolation between color stops, instead of doing different funky things based on pattern->filter. (#4184) ChangeLog | 7 +++++ src/cairo-pattern.c | 66 ++------------------------------------------------ 2 files changed, 10 insertions(+), 63 deletions(-) commit 48b3a1cacd9d486c0e279ea8fadfb2fd4e3207a0 Author: Owen Taylor Date: Tue Aug 23 14:52:38 2005 +0000 Check for AlphaBlend() with GetProcAddress() to support older compilation environments like MSVC 6. (Also fixes this portion of the code to run on Win98 and Win95, but much of the rest of cairo-win32-* won't work in that environment) (#3926, Hans Breuer, Christian Biesinger, based on code originally from Mozilla) Remove WINVER define, since it was there only for AlphaBlend(). src/cairo-win32-private.h | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) commit c4c1c4db96549e4ffcbd0ee081661d54522860c9 Author: Carl Worth Date: Tue Aug 23 14:51:51 2005 +0000 Remove assert statements that violate two intentional instances of ref_count == 0. ChangeLog | 6 ++++++ src/cairo-font.c | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) commit 2dfb7a662f63642d63a91e39ea1828957fab0705 Author: Carl Worth Date: Tue Aug 23 14:37:09 2005 +0000 Fix memory leak of pattern. ChangeLog | 4 ++++ test/text-pattern.c | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit a96a4a7ce6c402ab96a9e06b453d9c2203fad7bb Author: Owen Taylor Date: Tue Aug 23 14:30:52 2005 +0000 Check for AlphaBlend() with GetProcAddress() to support older compilation environments like MSVC 6. (Also fixes this portion of the code to run on Win98 and Win95, but much of the rest of cairo-win32-* won't work in that environment) (#3926, Hans Breuer, Christian Biesinger, based on code originally from Mozilla) Remove WINVER define, since it was (hopefully) there only for AlphaBlend(). ChangeLog | 13 +++++ src/cairo-win32-surface.c | 109 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 105 insertions(+), 17 deletions(-) commit 6d8df3957dc0223b35b119788d9c0f460b06141a Author: Owen Taylor Date: Tue Aug 23 14:12:01 2005 +0000 Call _get_pattern_load_flags() on the resolved pattern, not the input pattern. (Further fix from sunmoon1997) ChangeLog | 6 ++++++ src/cairo-ft-font.c | 2 +- 2 files changed, 7 insertions(+), 1 deletions(-) commit f219b83466f926ee48ba6abbf69ec723c9eba685 Author: Carl Worth Date: Tue Aug 23 14:04:28 2005 +0000 if users attempt to twice destroy or re-reference a destroyed object. The condition for detecting this case is a ref_count of 0. Reviewed by: otaylor Fixes bug #4198 ChangeLog | 17 +++++++++++++++++ src/cairo-font.c | 8 ++++++++ src/cairo-pattern.c | 4 ++++ src/cairo-surface.c | 4 ++++ src/cairo.c | 4 ++++ 5 files changed, 37 insertions(+), 0 deletions(-) commit a0ecb16417a4c3f92b0a7682b84be702480748b4 Author: Carl Worth Date: Tue Aug 23 13:57:00 2005 +0000 Move CAIRO_CONTENT_VALID and CAIRO_FORMAT_VALID from the public cairo.h to the private cairoint.h where they belong. ChangeLog | 7 +++++++ src/cairo.h | 9 --------- src/cairoint.h | 9 +++++++++ 3 files changed, 16 insertions(+), 9 deletions(-) commit f229b1abfb01d3c42cba1dec36a271fe75c503a9 Author: Owen Taylor Date: Tue Aug 23 13:34:14 2005 +0000 when creating the temporary mask, do glyph ADD mask, not (glyph IN source) ADD mask. Set the mask as having component alpha when it's 4-channel. test/text-antialias-subpixel.c test/Makefile.am: No longer XFAIL. test/text-antialias-gray.c test/text-antialias-subpixel.c Don't turn off metrics hinting, it doesn't make sense. Update. ChangeLog | 15 +++++++++++++++ src/cairo-ft-font.c | 10 ++++++---- test/Makefile.am | 1 - test/text-antialias-gray-ref.png | Bin 723 -> 727 bytes test/text-antialias-gray.c | 1 - test/text-antialias-none-ref.png | Bin 277 -> 278 bytes test/text-antialias-none.c | 1 - test/text-antialias-subpixel-ref.png | Bin 1079 -> 1081 bytes test/text-antialias-subpixel.c | 4 +--- 9 files changed, 22 insertions(+), 10 deletions(-) commit c11f0376d4c4aec3ff1c849f333aad2ce56f06bd Author: Carl Worth Date: Tue Aug 23 12:48:17 2005 +0000 Revise the description of indentation and tabs to be clear (I hope). CODING_STYLE | 29 ++++++++++++++++++++++++----- ChangeLog | 5 +++++ 2 files changed, 29 insertions(+), 5 deletions(-) commit 317af5618c01d1be86308aebc0e87d7752a7e309 Author: Carl Worth Date: Tue Aug 23 10:55:00 2005 +0000 Fix inadvertent commit of incorrect reference image test/text-antialias-subpixel-ref.png | Bin 970 -> 1079 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 9aa1f4d868c7fdad6412205538697899fe760dca Author: Carl Worth Date: Tue Aug 23 10:39:27 2005 +0000 Clear to opaque white at the beginning of the test so that the 0 alpha values in the destination don't cause bizarre results. (main): Note that only the image backend should fail now. Add new reference image. ChangeLog | 9 +++++++++ test/Makefile.am | 1 + test/text-antialias-subpixel-ref.png | Bin 0 -> 970 bytes test/text-antialias-subpixel.c | 5 ++++- 4 files changed, 14 insertions(+), 1 deletions(-) commit 9e68e0ceef2519b28e582fdaa8f2a8a33401735a Author: Carl Worth Date: Tue Aug 23 10:11:16 2005 +0000 Add more comments on the improved state of this bug. Commit a reference image generated with cairo_text_path; cairo_fill. (We may not require getting this exact result, but I think it is worth examining the differences closely.) ChangeLog | 9 +++++++++ test/text-rotate-ref.png | Bin 0 -> 12446 bytes test/text-rotate.c | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 2 deletions(-) commit 985c919b9fca504125df024e511eacf42a001985 Author: Carl Worth Date: Tue Aug 23 09:10:45 2005 +0000 Add docs-publish target to build and push documentation, (since our nightly server-side cron job is not working right now). ChangeLog | 6 ++++++ Makefile.am | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) commit 0c2aa6e6abda77b67af91b32721b228097326d6d Author: Carl Worth Date: Tue Aug 23 08:21:46 2005 +0000 Move comment about missing cleanup of caches on XCloseDisplay from BUGS to a _cairo_xlib_close_display. Also covered in bug #4120. BUGS | 7 ------- ChangeLog | 7 +++++++ src/cairo-xlib-screen.c | 3 +++ 3 files changed, 10 insertions(+), 7 deletions(-) commit 60f9c8d9fd914004e183adaf2bbba76b08c4e950 Author: Carl Worth Date: Tue Aug 23 07:51:56 2005 +0000 Remove caps-sub-paths from the XFAIL list since it is fixed now. ChangeLog | 6 ++++++ test/Makefile.am | 1 - test/caps-sub-paths.c | 3 +-- 3 files changed, 7 insertions(+), 3 deletions(-) commit 256456b708292b200e49107e360bfb45b7eb5bf0 Author: Carl Worth Date: Tue Aug 23 07:44:14 2005 +0000 Fix for bug #4205: Abstract the cap-addition code from the end of the stroke operation into a new _cairo_stroker_add_caps function. Call the new _cairo_stroker_add_caps at the beginning of every move_to so that we get caps on every subpath and not just the last one. ChangeLog | 13 +++++++++++ src/cairo-path-stroke.c | 55 +++++++++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 20 deletions(-) commit 55a517991e0d2435a58cab7fd61e272048eddbe8 Author: Billy Biggs Date: Tue Aug 23 05:54:38 2005 +0000 Add libpixman.la to the libcairo_la_DEPENDENCIES line so that changes to pixman get picked up. ChangeLog | 5 +++++ src/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 099060f9254e972ae2d28f51815b75da01736a8f Author: Owen Taylor Date: Tue Aug 23 05:18:48 2005 +0000 Some fixes for warnings from sparse (Part of #4208, Kjartan Maraas) Use NULL, not 0. Fix C99'ism of mixed code and declarations. ChangeLog | 10 ++++++++++ src/cairo-matrix.c | 13 +++++++------ test/cairo-test.c | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) commit 704874c16538f0653f37be253f2fc3d89963667d Author: Carl Worth Date: Tue Aug 23 01:55:29 2005 +0000 caps only added to last subpath: COVERED by test/caps-sub-paths and bug #4205. BUGS | 4 ---- ChangeLog | 5 +++++ 2 files changed, 5 insertions(+), 4 deletions(-) commit eb206f0a12aac21807bfba5414ad0ed34a62fc37 Author: Carl Worth Date: Tue Aug 23 01:50:25 2005 +0000 Use the expect_failure variant of cairo_test so that make check prints the reason this test fails. ChangeLog | 5 +++++ test/caps-sub-paths.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit 4b0ed008ba51a4e2e9f62c360f6ae8dcb708817c Author: Carl Worth Date: Tue Aug 23 01:02:16 2005 +0000 Add test to demonstrate bug #4205, missing caps on all but last sub-path in a complex path. ChangeLog | 9 ++++++ test/.cvsignore | 1 + test/Makefile.am | 4 +++ test/caps-sub-paths-ref.png | Bin 0 -> 164 bytes test/caps-sub-paths.c | 63 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 0 deletions(-) commit 65bfc03e7284301fc1cea4b88de72f7928f3857a Author: Carl Worth Date: Tue Aug 23 00:03:09 2005 +0000 Remove discussion of the BAD_NESTING restriction from the documentation of cairo_create. No such restriction exists anymore. ChangeLog | 6 ++++++ src/cairo.c | 10 ---------- 2 files changed, 6 insertions(+), 10 deletions(-) commit c0bbf9ac08020cafdb7de4dae5099e9cf196802c Author: Carl Worth Date: Tue Aug 23 00:00:42 2005 +0000 Fix for bug #4192: New function to handle both calling FT_Done_Face on unscaled->face and decrementing font_map->num_open_faces. Call new _font_map_release_face_lock_held as approporiate. Assert that (font_map->num_open_faces == 0) when we're done, to help guarantee the bug is fixed. Don't call FT_Done_Face anymore, instead assert that (unscaled->face == NULL) by the time this function is called. Prefer TRUE/FALSE as values for cairo_bool_t have_scale. ChangeLog | 26 ++++++++++++++++++++++++++ src/cairo-ft-font.c | 50 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 62 insertions(+), 14 deletions(-) commit dc907490e35c26ebb7d1fd106963f754d389ad82 Author: Billy Biggs Date: Mon Aug 22 22:23:54 2005 +0000 Add version.xml to content_files so it will be copied to the right place for DESTDIR builds. ChangeLog | 5 +++++ doc/public/Makefile.am | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit a68097a219543160ea6ff12628626dcdb070f97e Author: Billy Biggs Date: Mon Aug 22 22:11:44 2005 +0000 Rework the index for the reference manual. Update descriptions and add new files for added sections. ChangeLog | 33 ++ doc/public/cairo-docs.xml | 50 ++- doc/public/cairo-sections.txt | 262 ++++++---- doc/public/tmpl/cairo-font-options.sgml | 194 ++++++++ doc/public/tmpl/cairo-font.sgml | 268 +---------- doc/public/tmpl/cairo-ft.sgml | 18 +- doc/public/tmpl/cairo-glitz.sgml | 4 +- doc/public/tmpl/cairo-image.sgml | 73 +++ doc/public/tmpl/cairo-matrix.sgml | 5 +- doc/public/tmpl/cairo-paths.sgml | 207 ++++++++ doc/public/tmpl/cairo-pattern.sgml | 92 ++-- doc/public/tmpl/cairo-pdf.sgml | 4 +- doc/public/tmpl/cairo-png.sgml | 26 +- doc/public/tmpl/cairo-ps.sgml | 4 +- doc/public/tmpl/cairo-quartz.sgml | 4 +- doc/public/tmpl/cairo-scaled-font.sgml | 110 ++++ doc/public/tmpl/cairo-status.sgml | 63 +++ doc/public/tmpl/cairo-surface.sgml | 53 ++- doc/public/tmpl/cairo-text.sgml | 189 +++++++ doc/public/tmpl/cairo-transforms.sgml | 127 +++++ doc/public/tmpl/cairo-types.sgml | 42 ++ doc/public/tmpl/cairo-version.sgml | 54 ++ doc/public/tmpl/cairo-win32-fonts.sgml | 57 +++ doc/public/tmpl/cairo-win32.sgml | 40 +-- doc/public/tmpl/cairo-xcb-xrender.sgml | 4 +- doc/public/tmpl/cairo-xcb.sgml | 4 +- doc/public/tmpl/cairo-xlib.sgml | 4 +- doc/public/tmpl/cairo.sgml | 819 ++++--------------------------- 28 files changed, 1581 insertions(+), 1229 deletions(-) commit 2d9d744f8c8a9fdf011a292ef6e823605d000f23 Author: Owen Taylor Date: Mon Aug 22 20:43:23 2005 +0000 Make cairo_ft_unscaled_font_backend static. Add missing static. Use NULL, not 0. Use void in the definition of void functions, not (). Make non-exported cairo_pattern_nil_* static. ChangeLog | 17 +++++++++++++++++ src/cairo-font.c | 6 +++--- src/cairo-ft-font.c | 4 ++-- src/cairo-gstate.c | 2 +- src/cairo-pattern.c | 8 ++++---- src/cairo-ps-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- 7 files changed, 29 insertions(+), 12 deletions(-) commit c792e6783c8424805b83c50a8c3fd9afa3ab8ed9 Author: Carl Worth Date: Mon Aug 22 17:20:29 2005 +0000 ref_counts will go negative: COVERED by https://bugs.freedesktop.org/show_bug.cgi?id=4198 BUGS | 6 ------ ChangeLog | 5 +++++ 2 files changed, 5 insertions(+), 6 deletions(-) commit 0fb5b1d4c44be43c9463fe8818aea1aed88facc5 Author: Carl Worth Date: Mon Aug 22 16:56:43 2005 +0000 Remove several entries in an effort to obsolete the BUGS file in favor of bugzilla and cairo/test. Specifically: cairo_image_surface_create should clear image: NOTABUG. The user can clear if desired, and cairo clearing unconditionally would be performance overhead). cairo_clip is really slow: FIXED/COVERED. Since the time this entry was added we've got rectangular, pixel-alignend clipping optimized. And there's a bug in bugzilla (https://bugs.freedesktop.org/show_bug.cgi?id=4191) for optimizing IN. self-intersecting path is wrong: COVERED by test/self-intersecting.c. Cairo is crashing Xnest: NEEDINFO. Is this still happening? Xfake has been working quite well for a very long time now. font-size=0 in SVG does bad things: FIXED. BUGS | 37 ------------------------------------- ChangeLog | 23 +++++++++++++++++++++++ 2 files changed, 23 insertions(+), 37 deletions(-) commit 23baafbaa8d3295f109030637b5e73102e48ea8a Author: Bertram Felgenhauer Date: Mon Aug 22 16:52:40 2005 +0000 remove. ChangeLog | 5 +++++ src/cairo-matrix.c | 31 ------------------------------- src/cairoint.h | 4 ---- 3 files changed, 5 insertions(+), 35 deletions(-) commit 988310429036dd94ee0bb75b4c6a2fb7c930d448 Author: Bertram Felgenhauer Date: Mon Aug 22 16:50:30 2005 +0000 correct the calculation of the error bound. ChangeLog | 5 +++++ src/cairo-arc.c | 20 ++++++-------------- 2 files changed, 11 insertions(+), 14 deletions(-) commit c0905759b059cf679674019c5c4dd09971bedab9 Author: Bertram Felgenhauer Date: Mon Aug 22 16:48:28 2005 +0000 use new function. strip comment of derivation for major axis length. use _cairo_matrix_get_affine to retrieve matrix entries. new function split out of cairo-pen.c. UTF8-ify the comment that explains the calculation. ChangeLog | 12 ++++ src/cairo-matrix.c | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-pen.c | 154 ++++------------------------------------------------ src/cairoint.h | 3 + 4 files changed, 170 insertions(+), 144 deletions(-) commit c7a35fbd3121f728ff40706cdf2a1ef8ac8e18a6 Author: Bertram Felgenhauer Date: Mon Aug 22 16:29:56 2005 +0000 use correctly transposed version of the matrix and fix up the comments above to use row vector notation. ChangeLog | 6 ++++++ src/cairo-pen.c | 26 ++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) commit 46dd21e795549481d9db8d90c399e683ef1205c7 Author: Tor Lillqvist Date: Mon Aug 22 15:49:04 2005 +0000 Calculate LT_CURRENT_MINUS_AGE (which forms part of the DLL name on Win32), and AC_SUBST it. Add target "zips" to create zip file based distribution for Win32. Produce a cairo.def file for distribution by preprocessing the relevant header files and grepping for declarations of functions that start with cairo_. Works for now, will have to modify later if necessary. Use the .def file when linking on Win32. ChangeLog | 14 ++++++++++++++ Makefile.am | 16 ++++++++++++++++ configure.in | 4 ++++ src/Makefile.am | 36 +++++++++++++++++++++++++++++++++++- 4 files changed, 69 insertions(+), 1 deletions(-) commit aa6b2c386be0e7a09f53da3fa08c061f01151e55 Author: Owen Taylor Date: Mon Aug 22 15:19:03 2005 +0000 Support artificial bold fonts with FC_EMBOLDEN; patch from Jackey Yang and sunmoon1997. Check for FT_GlyphSlot_Embolden() Call FT_GlyphSlot_Embolden for fonts where FC_EMBOLDEN is set but that aren't bold. Add another private flag for this. ChangeLog | 11 +++++++++++ configure.in | 1 + src/cairo-ft-font.c | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletions(-) commit 190dc79a2831ca86523f2e710e6b4152d0947694 Author: Carl Worth Date: Mon Aug 22 13:59:52 2005 +0000 Fix typo that was causing make dist to fail. ChangeLog | 5 +++++ test/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 2ea856a21d2d392c0959e726c430e7fed87be97c Author: Owen Taylor Date: Mon Aug 22 12:15:28 2005 +0000 When width/height are 0, copy the src to the dest, don't just return. (#3017) pixman/ChangeLog | 5 +++++ pixman/src/pixregion.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 31e4ade4abf716718c2f38e594f02b5b488e0d86 Author: Owen Taylor Date: Mon Aug 22 08:45:46 2005 +0000 Use floor(0.5+x) rather than round(), which is C99. (David Hollenberg) ChangeLog | 5 +++++ test/text-rotate.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit b217f95fa0b8b818cbed8630c16fe8725f430c49 Author: Owen Taylor Date: Mon Aug 22 08:33:54 2005 +0000 Set LC_ALL=C rather than LANG and LC_NUMERIC to be robust against whatever settings the user has. (Martin Dobias) ChangeLog | 5 +++++ autogen.sh | 7 ++++--- 2 files changed, 9 insertions(+), 3 deletions(-) commit fdb5e2aa473a83cda9a3ecfab2fa47cdf40ffe65 Author: Billy Biggs Date: Sun Aug 21 21:04:52 2005 +0000 Optimize away calls to cairo_paint_with_alpha() if the alpha value given is <= 0. Add a new macro CAIRO_ALPHA_IS_ZERO. ChangeLog | 7 +++++++ src/cairo.c | 4 ++++ src/cairoint.h | 1 + 3 files changed, 12 insertions(+), 0 deletions(-) commit 89a4e13d73e3761e8b8b5d5fa0882d4ecb6423b1 Author: Billy Biggs Date: Sun Aug 21 21:02:32 2005 +0000 Fix a typo in the last change. pixman/ChangeLog | 4 ++++ pixman/src/pixman-remap.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 16ce285251afa9c6e125a51df0d8a487c0bf5bbd Author: Billy Biggs Date: Sun Aug 21 20:49:47 2005 +0000 Remove warning about fbCompositeTrans_0888xnx0888 not being tested on big-endian, it's not helpful at this point. Only define _cairo_pixman_have_mmx for fbHaveMMX when the symbol will actually exist. pixman/ChangeLog | 8 ++++++++ pixman/src/fbpict.c | 23 +++++++++++------------ pixman/src/pixman-remap.h | 2 ++ 3 files changed, 21 insertions(+), 12 deletions(-) commit 33599bc6b64ed987c1894e88bc680028f28453a7 Author: Billy Biggs Date: Sun Aug 21 14:10:39 2005 +0000 Fix for bug #4172: Use _cairo_fixed_to_double and _cairo_double_to_fixed when converting between double and 16.16 fixed point. These functions round nicely, and solve some inconsistencies in rendering between my PPC and x86 machines. Thanks to Owen Taylor for suggesting the fix. The above change does affect linear gradients slightly, but it seems worth it. Update the reference images to follow. ChangeLog | 17 +++++++++++++++++ src/cairo-pattern.c | 8 ++++---- test/gradient-alpha-ref.png | Bin 153 -> 154 bytes test/linear-gradient-ref.png | Bin 12744 -> 12719 bytes test/text-pattern-ref.png | Bin 2728 -> 2731 bytes 5 files changed, 21 insertions(+), 4 deletions(-) commit e3e7046cd7ee629fe085cf081fd3aa2581782bf5 Author: Owen Taylor Date: Sun Aug 21 12:13:17 2005 +0000 Remove stray doc sentence that wasn't meant to be committed. ChangeLog | 5 +++++ src/cairo-surface.c | 6 ------ 2 files changed, 5 insertions(+), 6 deletions(-) commit 17845df95b80d2a9586ba44fc5ade2c311a62c4c Author: Billy Biggs Date: Sun Aug 21 11:41:44 2005 +0000 Fix for bug #4165: Use pointer comparison for coincident points to ensure a well-defined ordering, and avoid setting discard on both points. This fixes problems with my Mac's implementation of qsort. Final patch by Bertram Felgenhauer. Update reference images after the change. ChangeLog | 18 ++++++++++++++++++ src/cairo-hull.c | 7 ++++++- test/clip-operator-ref.png | Bin 37330 -> 37330 bytes test/linear-gradient-ref.png | Bin 12724 -> 12744 bytes test/operator-clear-ref.png | Bin 4992 -> 4988 bytes test/operator-source-ref.png | Bin 19957 -> 19958 bytes test/unantialiased-shapes-ref.png | Bin 4450 -> 4449 bytes test/unbounded-operator-ref.png | Bin 11937 -> 11929 bytes 8 files changed, 24 insertions(+), 1 deletions(-) commit d93d56caeffb80ac92a0432ad1ebdecee5c0e2b6 Author: Owen Taylor Date: Sun Aug 21 11:23:58 2005 +0000 Check automake- if automake isn't sufficiently new. (#3593, Philip Van Hoof) ChangeLog | 5 +++++ autogen.sh | 29 +++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) commit 2396b502a5de39ee44d53af971b7382a1f130a87 Author: Owen Taylor Date: Sun Aug 21 09:57:19 2005 +0000 When invoked as, say, ../autogen.sh, switch to the sourcedir to run the auto*. Based on corresponding code in GTK+'s autogen.sh. (#3402, Thomas Fitzsimmons) Update from gtk-doc CVS, bringing in some minor output changes. (Eliminate the *** from the messages that don't indicate errors.) Use += for EXTRA_DIST, since gtk-doc.make already defines it. ChangeLog | 13 +++++++++++++ autogen.sh | 13 ++++++++++++- doc/public/Makefile.am | 5 +++-- gtk-doc.make | 12 ++++++------ 4 files changed, 34 insertions(+), 9 deletions(-) commit 5462c8a5856f1b3b81889ac3a714e47b047e1984 Author: Owen Taylor Date: Sun Aug 21 09:27:52 2005 +0000 Check for FT_Load_Sfnt_Table and disable the PDF/PS backends if not found. (#4144, Billy Biggs) ChangeLog | 5 +++++ configure.in | 13 +++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) commit 1ce62becd11bbc929b75ea6d47fad477ad965962 Author: Owen Taylor Date: Sun Aug 21 08:53:56 2005 +0000 Fix the handling of backend->clone_similar == NULL. (#4161, Christian Biesinger) ChangeLog | 6 ++++++ src/cairo-surface.c | 11 ++++++----- src/cairoint.h | 2 +- 3 files changed, 13 insertions(+), 6 deletions(-) commit 8e9e40d75201ea4d21b53ab51d1326f6f858c57c Author: Owen Taylor Date: Sun Aug 21 08:24:41 2005 +0000 Improve the documentation of internal functions. (Based on a patch from Christian Biesinger, #4162) ChangeLog | 5 +++++ src/cairo-surface.c | 24 ++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) commit 65f90287bb922357e77b759b5e0db5d2c3698fc4 Author: Owen Taylor Date: Sun Aug 21 08:11:24 2005 +0000 Recognize gentoo's (and maybe other distro's) modified server vendor string, where extra text is added to the upstream value. (#4068, reported by Doug Goldstein, others. Patch from Mart Raudsepp) ChangeLog | 8 ++++++++ src/cairo-xlib-surface.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit af614d2de601c997f3a2cbae535fb0e96110a386 Author: Owen Taylor Date: Sun Aug 21 08:06:06 2005 +0000 Don't try to transform val->image when it is NULL. (#4163, Mathias Hasselmann) ChangeLog | 6 ++++++ src/cairo-ft-font.c | 3 ++- 2 files changed, 8 insertions(+), 1 deletions(-) commit f823dfd9328f1aab0155257fcf9bb3aa45455867 Author: Billy Biggs Date: Sat Aug 20 21:28:57 2005 +0000 Fix for bug #4140: Dereference the pixel value correctly on big endian systems. pixman/ChangeLog | 7 +++++++ pixman/src/icrect.c | 3 ++- 2 files changed, 9 insertions(+), 1 deletions(-) commit d1bdd1313ee351e2ec7e4af1cf68143827f59694 Author: Carl Worth Date: Sat Aug 20 07:56:05 2005 +0000 Fix for bug #4142: Disable xlib tests on X servers without the Render, since they currently just crash there. A better long-term fix would be to do some useful tests in this case. Thanks to Tim Mooney. ChangeLog | 9 +++++++++ test/cairo-test.c | 12 ++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) commit 4a7a09b4ab4e8608d2f23661ddaf301f4508d42a Author: Owen Taylor Date: Sat Aug 20 05:23:52 2005 +0000 Include Xfree86-4.5 in the blacklist. (Reported by Andrew Benton) ChangeLog | 6 ++++++ src/cairo-xlib-surface.c | 2 +- 2 files changed, 7 insertions(+), 1 deletions(-) commit b9da101879afc6ab960e43f94d1e0a2fc10b3aac Author: Billy Biggs Date: Fri Aug 19 23:05:13 2005 +0000 Fix for bug #4096: Improve the performance of png reading by adding special cases for fully transparent and fully opaque alpha, and using the standard optimization for 8-bit division by 255. Add an INLINE macro for gcc. ChangeLog | 11 +++++++++++ src/cairo-png.c | 28 +++++++++++++++++++++------- src/cairoint.h | 6 ++++++ 3 files changed, 38 insertions(+), 7 deletions(-) commit 465ff187869b118f30666de83e5327ea4d174df7 Author: Carl Worth Date: Fri Aug 19 16:37:56 2005 +0000 From Bertram Felgenhauer : Add regression test for bug #4137 (fixed earlier). ChangeLog | 10 +++++ test/.cvsignore | 1 + test/Makefile.am | 3 + test/rectangle-rounding-error-ref.png | Bin 0 -> 298 bytes test/rectangle-rounding-error.c | 69 +++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 0 deletions(-) commit 33b45c157273fbe8f8a24e5c0a333639b1a51f4a Author: Billy Biggs Date: Fri Aug 19 14:42:57 2005 +0000 No need to include cairo-pdf.h. ChangeLog | 4 ++++ test/pixman-rotate.c | 1 - 2 files changed, 4 insertions(+), 1 deletions(-) commit 3ec312f7289192cca3ce71d8bafee27f49cf2aa2 Author: Carl Worth Date: Fri Aug 19 14:37:42 2005 +0000 Fix for bug #4137: Fix to round properly. ChangeLog | 7 +++++++ src/cairo-fixed.c | 2 +- 2 files changed, 8 insertions(+), 1 deletions(-) commit 1f68f77a10e0d93e2a73000faa1bb0097c8b056a Author: Owen Taylor Date: Fri Aug 19 14:05:14 2005 +0000 Ignore really small fonts, since size zero fonts give xpdf fits. (#2938) ChangeLog | 6 ++++++ src/cairo-pdf-surface.c | 8 ++++++++ 2 files changed, 14 insertions(+), 0 deletions(-) commit 9d0211b2632e3a0c83331a037efd7670c91b79cd Author: Carl Worth Date: Fri Aug 19 13:00:23 2005 +0000 Fix to actually test scaled_font->status instead of just having a comment that claims to test it. Thanks to Behdad Esfahbod . ChangeLog | 7 +++++++ src/cairo-font.c | 3 ++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 8eb912577b51c9feb7c078620b42f8fa858e02b0 Author: Owen Taylor Date: Fri Aug 19 12:55:00 2005 +0000 We need the call to fixup_unbounded when we optimize the RENDER operator to XCopyArea as well. ChangeLog | 6 ++++++ src/cairo-xlib-surface.c | 23 ++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) commit 7468ed35a1c2607bd305caa93c5f9bf9c9e0be18 Author: Carl Worth Date: Fri Aug 19 12:08:42 2005 +0000 Fixes for a general problem of which bug #4094 was a specific instance: Don't change the status value if it already holds an error. This avoids destroying "first error" information and also avoids attempting to write read-only data, (eg. from nil objects). Don't set an error on the same object if it is in an error state to begin with, just return immediately. This is intended to reduce (eventual) error prints to the first cause of an error for any given object, instead of a continual spew. ChangeLog | 51 +++++++++ src/cairo-font.c | 11 +- src/cairo-pattern.c | 10 ++- src/cairo-surface.c | 18 ++-- src/cairo-win32-font.c | 4 +- src/cairo.c | 267 +++++++++++++----------------------------------- 6 files changed, 142 insertions(+), 219 deletions(-) commit 2b72a4eee80e73f0553779a281e6ef5f0587519e Author: Carl Worth Date: Fri Aug 19 12:02:14 2005 +0000 Fix for bug #2729: Adjust negative offsets up to their equivalent positive value. Add error checking for dash values, (must each be non-negative and must not be all zero). Add documentation. Add new CAIRO_STATUS_INVALID_DASH. Add dash-offfset-negative test from Owen. churn ChangeLog | 20 +++++++ doc/public/tmpl/cairo.sgml | 5 ++- src/cairo-gstate.c | 45 +++++++++++++--- src/cairo.c | 35 ++++++++++++- src/cairo.h | 9 +++- test/.cvsignore | 1 + test/Makefile.am | 4 ++ test/dash-offset-negative-ref.png | Bin 0 -> 155 bytes test/dash-offset-negative.c | 99 +++++++++++++++++++++++++++++++++++++ 9 files changed, 203 insertions(+), 15 deletions(-) commit a2e798b5a126a0aaf7043b817120986889538acf Author: Kristian Høgsberg Date: Fri Aug 19 10:36:43 2005 +0000 Add this missing fuction. Document this funtion. ChangeLog | 8 ++++++++ src/cairo-pdf-surface.c | 10 ++++++++++ src/cairo-ps-surface.c | 21 +++++++++++++++++++++ 3 files changed, 39 insertions(+), 0 deletions(-) commit b626dff5b9783ba8916365478c583551d7d97a23 Author: Carl Worth Date: Fri Aug 19 07:39:47 2005 +0000 Fix for bug #3915: Add new NULL_POINTER nil pattern. Check for surface == NULL and return a nil pattern. Verify that the above fix works. ChangeLog | 12 ++++++++++++ src/cairo-pattern.c | 14 ++++++++++++++ test/nil-surface.c | 40 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 2 deletions(-) commit 435fb3c65f3edd7687a332f274545abf7e601965 Author: Carl Worth Date: Thu Aug 18 23:10:37 2005 +0000 Fix for bug #4088: New function to return the current nil pattern depending on the status. Add missing early bailout on surface->status with error propagation to the pattern. Related cleanups for cairo_pattern_t: Don't check other->status since this is a static function. Add missing early bailout on other->status. Cleanup identifier names. Track rename of nil patterns. Don't call _cairo_error for pre-existing errors. Take care to initialize some fields to that _cairo_pattern_release_surface will work even after an error. Track rename of cairo_solid_pattern_nil to cairo_pattern_nil. New test to ensure that a file-not-found error will propagate from a surface, through a pattern, and onto a cairo_t. ChangeLog | 48 +++++++++++++++++++ src/cairo-pattern.c | 113 +++++++++++++++++++++++---------------------- src/cairo.c | 2 +- src/cairoint.h | 2 +- test/.cvsignore | 1 + test/Makefile.am | 2 + test/nil-surface-ref.png | Bin 0 -> 107 bytes test/nil-surface.c | 73 +++++++++++++++++++++++++++++ 8 files changed, 184 insertions(+), 57 deletions(-) commit 0e56f2ea0acb1f5359294b5da5f60b05673d75e3 Author: Carl Worth Date: Thu Aug 18 22:43:39 2005 +0000 Suppress a pthread initialization error now that tests are linked with -lpthread. ChangeLog | 5 +++++ test/.valgrind-suppressions | 11 +++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit 45cea5efc8b16a9645e72b722353cc27a009af13 Author: Carl Worth Date: Thu Aug 18 22:31:04 2005 +0000 Fix documentation comment to use & in place of &. ChangeLog | 5 +++++ src/cairo-pattern.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit d809e829806c68b87939e6598986d45cbd3862b9 Author: Billy Biggs Date: Thu Aug 18 19:13:06 2005 +0000 Special case alpha values of 0 and 0xff. (fbCompositeSrc_8888x8888mmx): Add an MMX implementation for a common operation when using pixman. Prototype for the new function. Call the new function where appropriate. pixman/ChangeLog | 12 +++++++ pixman/src/fbmmx.c | 80 +++++++++++++++++++++++++++++++++++++++++++++------ pixman/src/fbmmx.h | 12 +++++++ pixman/src/fbpict.c | 16 ++++++++-- 4 files changed, 108 insertions(+), 12 deletions(-) commit f5afeec18a95b75102087abbf7497a45ff6d80c6 Author: Billy Biggs Date: Thu Aug 18 18:46:30 2005 +0000 Special case projective transforms so we can avoid doing the expensive 64-bit math. Unroll the bilinear interpolation loops for an extra boost. pixman/ChangeLog | 6 ++ pixman/src/fbcompose.c | 235 ++++++++++++++++++++++++++++++++---------------- 2 files changed, 163 insertions(+), 78 deletions(-) commit 5932a501ca5d8b3e4e60c77dac9a8af2c7943dd7 Author: Owen Taylor Date: Thu Aug 18 17:22:23 2005 +0000 Fix tests to just disable FreeType if a too-old FreeType is found, rather than erroring out. (#2298) Reviewed by: krh ChangeLog | 7 +++++++ configure.in | 38 ++++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 16 deletions(-) commit c1b5a19624a850885996a6e0778098e77c0fd683 Author: Owen Taylor Date: Thu Aug 18 17:19:54 2005 +0000 Fix offset passed in for source patterns. (#2333, Tim Rowley) Fix font to Vera Sans rather than "Sans" ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 18 +++++++++--------- test/.cvsignore | 1 + test/text-pattern-ref.png | Bin 2869 -> 2728 bytes test/text-pattern.c | 9 ++++++--- 5 files changed, 23 insertions(+), 12 deletions(-) commit 8f93bcfa47fbdfd20949d09ed677eb5e4d90b12b Author: Carl Worth Date: Thu Aug 18 17:11:42 2005 +0000 Update the roadmap. Remove difficulty rating from completed tasks. Note that PostScript/PDF is (grudgingly) done as far as 1.0 is concerned, but there is more work to completing this that is slipped beyond 1.0. Note that the deadlock bug is fixed as of 0.9.2. Update who is working on what for performance. Add some new detail for post-1.0 PostScript/PDF work. Slip the overlapping source/dest Render workaround past 1.0. ChangeLog | 10 ++++++++ ROADMAP | 73 ++++++++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 61 insertions(+), 22 deletions(-) commit 16f66dc31499afbf64e319562f01aac96edae52e Author: Owen Taylor Date: Thu Aug 18 16:22:23 2005 +0000 Add a test for bug #2333 (Tim Rowley) ChangeLog | 4 ++ test/Makefile.am | 3 ++ test/text-pattern-ref.png | Bin 0 -> 2869 bytes test/text-pattern.c | 74 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 0 deletions(-) commit 31341327bfa171845ec3e921151cee6f861c2da8 Author: Owen Taylor Date: Thu Aug 18 15:50:36 2005 +0000 Implement new equations for CLEAR and SOURCE CLEAR: (mask IN clip) ? 0 : dest SOURCE: (mask IN clip) ? src : dest That behave more like what people expect. CLEAR and SOURCE are now bounded. Assert that SOURCE and CLEAR aren't passed to these functions. Assert that SOURCE and CLEAR aren't passed to these functions when there is a mask. Do fixups for SOURCE and CLEAR as well as unbounded operators, since in the absence of a mask, we need SOURCE to work correctly (don't care about CLEAR) _cairo_ft_font_show_glyphs) Consistently use CLEAR/TRANSPARENT (source doesn't matter) rather than SOURCE/TRANSPARENT when clearing rectangles. src/cairo-xlib-surface.c src/cairo-surface.c: Use IN rather than SOURCE as an example of an unbounded operator in docs. Remove CLEAR/SOURCE columns since they are no longer unbounded. test/operator-clear.c test/operator-source Makefile.am: Add targetted tests of CLEAR/SOURCE. ChangeLog | 38 ++++++ src/cairo-font.c | 5 + src/cairo-ft-font.c | 4 +- src/cairo-gstate.c | 219 +++++++++++++++++++++++++--------- src/cairo-image-surface.c | 4 +- src/cairo-surface.c | 14 ++- src/cairo-xlib-surface.c | 6 +- test/.cvsignore | 2 + test/Makefile.am | 6 + test/clip-operator-ref.png | Bin 38336 -> 37330 bytes test/operator-clear-ref.png | Bin 0 -> 4992 bytes test/operator-clear.c | 214 +++++++++++++++++++++++++++++++++ test/operator-source-ref.png | Bin 0 -> 19957 bytes test/operator-source.c | 253 +++++++++++++++++++++++++++++++++++++++ test/unbounded-operator-ref.png | Bin 14178 -> 11937 bytes test/unbounded-operator.c | 4 +- 16 files changed, 706 insertions(+), 63 deletions(-) commit ff9654e677a916da7a3fcc97ac0547f128e71436 Author: Carl Worth Date: Thu Aug 18 14:34:10 2005 +0000 Fix to not leak surface->cgImage on out-of-memory (thanks to Josh Aas ). ChangeLog | 7 +++++++ src/cairo-quartz-surface.c | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit a82cf0eb7bdfb7f500c1652f6b9635a94e830289 Author: Carl Worth Date: Thu Aug 18 09:46:20 2005 +0000 Fix to not right-shift a negative number when called with an argument of 0. ChangeLog | 5 +++++ src/cairo-fixed.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 7a9d2070402d75356ffee258517c5434dc232000 Author: Carl Worth Date: Thu Aug 18 09:19:21 2005 +0000 Disable not-yet-implemented quartz stuff. ChangeLog | 5 +++++ test/cairo-test.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 93e521ce1976cef6978fcbccf78b3ed98a544d51 Author: Billy Biggs Date: Thu Aug 18 08:28:08 2005 +0000 Add an autoconf-generated version file to advertise what cairo version the manual was generated for. Idea taken from the GTK+ documentation. Include the version number, along with the title, in a bookinfo section. Add the version.xml.in to the dist. Ignore version.xml. Generate doc/public/version.xml. ChangeLog | 15 +++++++++++++++ configure.in | 1 + doc/public/.cvsignore | 4 +--- doc/public/Makefile.am | 3 +++ doc/public/cairo-docs.xml | 8 +++++++- doc/public/version.xml.in | 1 + 6 files changed, 28 insertions(+), 4 deletions(-) commit 3422d8760f54e403bda12aa58dc5256bb132ebf3 Author: Carl Worth Date: Thu Aug 18 08:22:29 2005 +0000 Clear setgid bit on regular files prior to tarring up a release. ChangeLog | 5 +++++ Makefile.am | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) commit 24ba58e7f56a45f09501c9f58d177633dfda1ecd Author: Billy Biggs Date: Thu Aug 18 06:01:40 2005 +0000 For the source operator, the output should be cleared if the mask is zero. This fixes the MMX code to match the fbcompose code. Fix a logic mistake that caused the MMX functions not to be used in many cases. pixman/ChangeLog | 9 +++++++++ pixman/src/fbmmx.c | 12 ++++++++++++ pixman/src/fbpict.c | 7 +++---- 3 files changed, 24 insertions(+), 4 deletions(-) commit 260e8abfe0903b3b2955e2397e974308a1ca40bd Author: Kristian Høgsberg Date: Wed Aug 17 21:19:30 2005 +0000 Fix typo in freetype configure check. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 4ebe0b63cc5487661c8016ef9f80aa7890772517 Author: Billy Biggs Date: Wed Aug 17 21:14:02 2005 +0000 Only mangle exported symbols. This is sufficient and makes debugging a lot easier. pixman/ChangeLog | 5 + pixman/src/pixman-remap.h | 274 +++------------------------------------------ 2 files changed, 19 insertions(+), 260 deletions(-) commit 75b0541bdfb77ef456e09b1b92ccb0d2e9245ae3 Author: Kristian Høgsberg Date: Wed Aug 17 15:57:45 2005 +0000 Try to use pkg-config to detect freetype2, then fall back to the existing freetype-config based check. ChangeLog | 5 +++++ cairo.pc.in | 4 ++-- configure.in | 56 +++++++++++++++++++++++++++++++++++++------------------- 3 files changed, 44 insertions(+), 21 deletions(-) commit 639680e5fe2592c76d19e8102919ef3062371883 Author: Carl Worth Date: Wed Aug 17 09:51:09 2005 +0000 Fixes for bug #4110: Don't call _cairo_ft_unscaled_font_init_key in the from_face case, just clear filename and id instead. Initialize unscaled->base first so that initialization order matches the structure declaration order. Fix to accept a NULL string and hash it identically to a zero-length string. Add a test that calls cairo_ft_font_create_for_ft_face to demonstrate bug #4110. ChangeLog | 18 ++++++- src/cairo-cache.c | 2 +- src/cairo-ft-font.c | 28 +++++----- test/.cvsignore | 1 + test/Makefile.am | 5 ++ test/ft-font-create-for-ft-face.c | 102 +++++++++++++++++++++++++++++++++++++ 6 files changed, 140 insertions(+), 16 deletions(-) commit f5f21a768d71f2a6897b5290f74fd41116c43966 Author: Billy Biggs Date: Tue Aug 16 21:04:02 2005 +0000 Fix the filter-nearest-offset test to actually test CAIRO_FILTER_NEAREST. ChangeLog | 5 +++++ test/filter-nearest-offset.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit c892ee36d94532a395dc11d4d954611ce4f353c7 Author: Billy Biggs Date: Tue Aug 16 19:54:05 2005 +0000 Fix a typo in the last commit. pixman/ChangeLog | 4 ++++ pixman/src/Makefile.am | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 0398085a6fb2e7bddba6529e7a205781347759d1 Author: Billy Biggs Date: Tue Aug 16 18:38:38 2005 +0000 Split the MMX code into a separate libtool library to avoid applying the MMX CFLAGS to all of the pixman code. Idea and code from Owen Taylor. Update the mangling header file to include the MMX symbols. pixman/ChangeLog | 9 +++++++++ pixman/src/Makefile.am | 7 +++++-- pixman/src/pixman-remap.h | 21 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) commit 18f3357c99fdecb3eede41f24fbd086ab4700677 Author: Owen Taylor Date: Tue Aug 16 18:22:16 2005 +0000 src/cairoint.h: Split out a couple of useful utility functions. src/cairo-clip.c src/cairo-gstate.c: Use them. Move code to fill a pixman_region16_t to here. Document. Use _cairo_surface_fill_region(). Add a return status, use regions to simplify. src/cairoint.h Handle the return value from _cairo_surface_composite_fixup_unbounded(). src/cairo-surface.c src/cairoint.h (_cairo_surface_composite_shape_fixup_unbounded): Add a variant of _cairo_surface_composite_fixup_unbounded() to avoid creating a dummy cairo_surface_attributes_t. Use _cairo_surface_composite_shape_fixup_unbounded(). Call _cairo_surface_composite_shape_fixup_unbounded(), since the source might still be restricted, even though the mask is unbounded. Restore the rectangle optizations when drawing with unbounded operators by adding a clear for the extra area after drawing the rectangles. ChangeLog | 44 ++++++ src/Makefile.am | 1 + src/cairo-clip.c | 47 ++------ src/cairo-gstate.c | 144 ++++++++++----------- src/cairo-image-surface.c | 90 +++++++------ src/cairo-region.c | 83 ++++++++++++ src/cairo-surface.c | 322 +++++++++++++++++++++++++++++++-------------- src/cairo-xlib-surface.c | 84 ++++++------ src/cairoint.h | 50 ++++++-- 9 files changed, 565 insertions(+), 300 deletions(-) commit ae15c7d32166b6408ee7e1dc8a817a4c510ae3c3 Author: Billy Biggs Date: Tue Aug 16 16:52:35 2005 +0000 Add a check for the MMX intrinsics used by pixman. gcc >= 3.4 is required. ChangeLog | 5 +++++ configure.in | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 0 deletions(-) commit 9ae7d8a13b065fc44966eceb28976aa2b009e46b Author: Billy Biggs Date: Tue Aug 16 16:50:25 2005 +0000 Port MMX code from xserver to pixman. Add an fbpict.c ported from the latest in xserver/fb, including hooks to the MMX code where appropriate. This replaces the old ic.c file. Replaced by fbpict.c. Move some X server macros from fbpict.c up into icint.h to keep the diff small. Add fbmmx and fbpict.c, remove ic.c. Add a check for the MMX intrinsics. gcc >= 3.4 is required. pixman/ChangeLog | 53 + pixman/configure.in | 32 + pixman/src/Makefile.am | 10 +- pixman/src/fbmmx.c | 2503 ++++++++++++++++++++++++++++++++++++++++++++++++ pixman/src/fbmmx.h | 228 +++++ pixman/src/fbpict.c | 1904 ++++++++++++++++++++++++++++++++++++ pixman/src/ic.c | 1687 -------------------------------- pixman/src/icint.h | 30 + 8 files changed, 4758 insertions(+), 1689 deletions(-) commit a2a89e858af70262de276c8568baabf91e00dbb2 Author: Carl Worth Date: Tue Aug 16 16:41:10 2005 +0000 Rename cairo_printf_format to CAIRO_PRINTF_FORMAT. Fix syntax error in the case of an empty definition. (Thanks to Vladimir Vukicevic). ChangeLog | 6 ++++++ src/cairoint.h | 7 +++---- 2 files changed, 9 insertions(+), 4 deletions(-) commit b7737163bc8c8d60967e025b71d30f9827d45801 Author: Kristian Høgsberg Date: Sun Aug 14 19:25:05 2005 +0000 Zero out 'entry', not 'unscaled' when evicting face from cache. ChangeLog | 5 +++++ src/cairo-ft-font.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 52c5d89ae58e50a788f6d1ab79e9159c944c426e Author: Kristian Høgsberg Date: Sat Aug 13 17:38:23 2005 +0000 Fix a mismatch between printf arguments and format string (thanks to Adrian Johnson). Add macro to mark printf like functions. ChangeLog | 9 +++++++++ src/cairo-ps-surface.c | 4 ++-- src/cairoint.h | 10 +++++++++- 3 files changed, 20 insertions(+), 3 deletions(-) commit 28958e368cfe50198188407da10c66510d9c9515 Author: Owen Taylor Date: Sat Aug 13 08:12:17 2005 +0000 Change docREEL back to doc. (Found by Kjartan Maraas) ChangeLog | 5 +++++ Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 0a2a4045daf9cdd9952918499152f88c6387709a Author: Carl Worth Date: Sat Aug 13 05:46:40 2005 +0000 Fix typo ('internal' should have been 'external'). ChangeLog | 4 ++++ NEWS | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 2ebf274db4a21f11739ff6603a47fdf49571e3e9 Author: Carl Worth Date: Sat Aug 13 05:33:21 2005 +0000 Increment CAIRO_VERSION to 0.9.3 after tagging RELEASE_0_9_2. Slight rewording of announcement email. ChangeLog | 8 ++++++++ Makefile.am | 8 ++++++-- configure.in | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) commit b3a4f29f830dbcb57ef3d1e4c3c140126752043b Author: Carl Worth Date: Sat Aug 13 05:00:20 2005 +0000 Added notes for release 0.9.2. Increment CAIRO_VERSION to 0.9.2 and libtool versioning to 3:1:1. Remove some more 'snapshot' language. Make it more clear that the libtool versioning numbers need to be updated. ChangeLog | 20 ++++++------ NEWS | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- RELEASING | 10 ++---- configure.in | 8 ++-- 4 files changed, 99 insertions(+), 27 deletions(-) commit 3f24b949a070aebaeaa465ccd09604bda0be717b Author: Carl Worth Date: Sat Aug 13 04:22:46 2005 +0000 Fix unterminated comment that eliminated cairo_pattern_add_color_stop_rgba. ChangeLog | 5 +++++ src/cairo-pattern.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit fd8a70f4b6b919682f2609e0dda08aa1564d8ccf Author: Carl Worth Date: Sat Aug 13 04:17:36 2005 +0000 Add missing notes on soname and user-space locking for cairo_set_source() to the 0.9.0 release notes. Document cairo_pattern_add_color_stop_rgb, cairo_pattern_add_color_stop_rgba, cairo_pattern_set_matrix, and cairo_pattern_get_matrix. Add note on user-space locking to the documentation for cairo_set_source(). ChangeLog | 18 +++++++++ NEWS | 34 +++++++++++++++++- src/cairo-pattern.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/cairo.c | 5 +++ 4 files changed, 148 insertions(+), 5 deletions(-) commit 620de68bea6fa4e287d565b293202114200deec4 Author: Carl Worth Date: Sat Aug 13 03:26:18 2005 +0000 Turn the mutex code back on. It looks like the deadlocks have disappeared as of the cairo_scaled_font_map patch from two days ago. Setup an automake conditional for the HAVE_PTHREAD case. Link all tests with -lpthread if available, so that we can get some testing of cairo with mutexes turned on. ChangeLog | 16 ++++++++++++++++ configure.in | 7 ++----- src/cairoint.h | 41 +++++++++-------------------------------- test/Makefile.am | 4 ++++ 4 files changed, 31 insertions(+), 37 deletions(-) commit 615a32107d8174b71b0a7cbb504d79913a6e159d Author: Carl Worth Date: Sat Aug 13 02:21:07 2005 +0000 Minor, cosmetic changes: Reowrd comment to be more clear. Prefer return of address of base field rather than cast. Whitespace fix. ChangeLog | 13 +++++++++++++ src/cairo-ft-font.c | 7 ++++--- 2 files changed, 17 insertions(+), 3 deletions(-) commit a8b6ad3e88e5b13434ab4fbac1e86e6a9076e636 Author: Carl Worth Date: Sat Aug 13 02:02:39 2005 +0000 Shuffle functions around to put them in a sane order within the file. There should be no functional change here. ChangeLog | 11 ++ src/cairo-ft-font.c | 367 ++++++++++++++++++++++++-------------------------- 2 files changed, 187 insertions(+), 191 deletions(-) commit 47d5bbeafc3a763988b66d8dbffff5426655213d Author: Carl Worth Date: Sat Aug 13 01:38:55 2005 +0000 Add hash_entry field to cairo_scaled_font_t so that it can be hashed. Convert the font_face/matrix/ctm/options => cairo_scaled_font_t mapping from a two-layer cairo-cache.c implementation to a single cairo-hash.c implementation backed by a simple array for the secondary cache. Reviewed by: keithp ChangeLog | 22 ++ src/cairo-font.c | 592 ++++++++++++++++++++++++------------------------------ src/cairoint.h | 6 +- 3 files changed, 288 insertions(+), 332 deletions(-) commit be9698e6ada908a09a306dd0a2c7d824ffc824c8 Author: Behdad Esfahbod Date: Sat Aug 13 01:17:06 2005 +0000 Move checks for invalid number of points before the calls that use the points. ChangeLog | 6 ++++++ src/cairo-path-data.c | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) commit c5ac41755d1df2083b86dcf8b25f96c3aa7d22ed Author: Behdad Esfahbod Date: Sat Aug 13 01:04:55 2005 +0000 Fix conversion to short, to get a uniform range even for 0xffff. In other words, a color component of of (1.0 - epsilon) would convert to 0xffff, not 0xfffe. ChangeLog | 6 ++++++ src/cairo-color.c | 28 +++++++++------------------- 2 files changed, 15 insertions(+), 19 deletions(-) commit 20f92f48917393631c87d5f633a1055920b044a9 Author: Behdad Esfahbod Date: Sat Aug 13 00:20:45 2005 +0000 Generate sh1sum instead of md5sum. Use gpg to sign it. You need gpg set up. ChangeLog | 10 ++++++++-- Makefile.am | 40 +++++++++++++++++++++++++++------------- RELEASING | 10 ++++++---- 3 files changed, 41 insertions(+), 19 deletions(-) commit a201637c7224b921948b79e4244dcc4f99f76cdf Author: Carl Worth Date: Fri Aug 12 23:50:17 2005 +0000 Move tag from an instruction in RELEASING to an automated step at the end of release-publish. ChangeLog | 6 ++++++ Makefile.am | 2 ++ RELEASING | 9 +++------ 3 files changed, 11 insertions(+), 6 deletions(-) commit 21dff93be5fd8fff1e4de96afaf8ff12cb7a850a Author: Behdad Esfahbod Date: Fri Aug 12 21:35:31 2005 +0000 Check that the micro component of the version number is even. Fixed the pattern to find all public header files. ChangeLog | 9 ++++++++- Makefile.am | 16 ++++++++++++++-- RELEASING | 6 ++---- 3 files changed, 24 insertions(+), 7 deletions(-) commit 027157feb6a3761eca1edb4eb547ca07081c33e2 Author: Billy Biggs Date: Thu Aug 11 21:07:26 2005 +0000 Fix to be correct for arbitrary xDst values. pixman/ChangeLog | 5 ++++ pixman/src/icrect.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 6 deletions(-) commit 56d299d277f5a31f72d4a203673fbb026b7bb33f Author: Carl Worth Date: Thu Aug 11 16:52:43 2005 +0000 Fix inverted sense of assert statement which led to lots of unpleasant crashes. ChangeLog | 5 +++++ doc/public/cairo-sections.txt | 5 +++++ src/cairo-font.c | 2 +- 3 files changed, 11 insertions(+), 1 deletions(-) commit ba9cb14cdf7d89132232aa3121f8e60d5982dc34 Author: Carl Worth Date: Thu Aug 11 14:59:27 2005 +0000 Add hash_entry field to cairo_font_face_t so that it can (optionally) be hashed. Complete the remainder of the simple -> toy renaming. Convert the family/slant/weight -> cairo_toy_font_face_t mapping to use cairo-hash.c rather than cairo-cache.c. ChangeLog | 16 +++ src/cairo-font.c | 360 ++++++++++++++++++++++++------------------------------ src/cairoint.h | 4 +- 3 files changed, 178 insertions(+), 202 deletions(-) commit d1dbd031cca9fbef2381e98e626e75c357dd4f53 Author: Carl Worth Date: Thu Aug 11 14:49:07 2005 +0000 Move implementation of filename/id => cairo_ft_unscaled_font_t from cairo-cache.c to cairo-hash.c, with new cairo_ft_unscaled_font_map. Add cairo_unscaled_font->hash_entry so that unscaled fonts can live in hash tables. ChangeLog | 46 ++++++ src/cairo-ft-font.c | 435 ++++++++++++++++++++++++++------------------------ src/cairoint.h | 1 + 3 files changed, 273 insertions(+), 209 deletions(-) commit 34c9e242c85cfe5cb2b53182bea07513f38c9c78 Author: Carl Worth Date: Thu Aug 11 06:35:20 2005 +0000 Re-order cairo_scaled_font->font_face parameter to maintain the font_face,font_matrix,ctm,options order that prevails throughout the implementation. Add font_face parameter to _cairo_scaled_font_init. Remove const qualifier from toy_face parameter to creat_toy, as these functions may reference the font face. Track addition of font_face parameter to _cairo_scaled_font_init. Implement font_face parameter to _cairo_scaled_font_init, moving the reference of the font_face from _cairo_inner_font_cache_create_entry. Add a font_face parameter in addition to the unscaled_font parameter. Track new font_face parameter to _cairo_ft_scaled_font_create. Whitespace touchup. Reviewed by: otaylor ChangeLog | 31 ++++++++++++++++++++++++++++ src/cairo-atsui-font.c | 4 +- src/cairo-font.c | 7 ++--- src/cairo-ft-font.c | 52 +++++++++++++++++++++++++++-------------------- src/cairo-win32-font.c | 11 +++++++-- src/cairoint.h | 5 ++- 6 files changed, 77 insertions(+), 33 deletions(-) commit b25c1203d8d313d9b44f29e4b0d1329dddd42dbe Author: Billy Biggs Date: Wed Aug 10 22:03:00 2005 +0000 Add support for filling 1bpp images (used to clear A1 masks). pixman/ChangeLog | 5 +++++ pixman/src/icrect.c | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-) commit 58c51ff1378ce749b78a2edac622100c8873efb8 Author: Billy Biggs Date: Wed Aug 10 21:12:10 2005 +0000 Update to match the output from libpixman. ChangeLog | 5 +++++ test/clip-operator-ref.png | Bin 37486 -> 38336 bytes 2 files changed, 5 insertions(+), 0 deletions(-) commit 910d824b3df8cc72a52c44b1177045d91b83051b Author: Billy Biggs Date: Wed Aug 10 21:10:11 2005 +0000 Port fbcompose.c from xserver into pixman. Add #defines for gradients, convolution filters, and indexed colour formats to keep the patch small. Use pixman regions instead of X server regions as appropriate. Remove iccompose.c, replaced by fbcompose.c. Add a slightly-trimmed version of fbpict.h from xserver/fb to make the port smaller and cleaner. Use the redundant fbpict.h defines and add in the struct for indexed colour support. Remove defines now in fbpict.h. Add some constants and types required by fbcompose.c Add fbcompose.c and fbpict.h, remove iccompose.c. reviewed by: cworth and Jeff Muizelaar at various stages pixman/ChangeLog | 89 + pixman/src/Makefile.am | 3 +- pixman/src/fbcompose.c | 3617 ++++++++++++++++++++++++++++++++++++ pixman/src/fbpict.h | 356 ++++ pixman/src/ic.c | 46 +- pixman/src/iccompose.c | 2837 ---------------------------- pixman/src/icimage.h | 35 +- pixman/src/pixman-xserver-compat.h | 16 + 8 files changed, 4082 insertions(+), 2917 deletions(-) commit 0b991f9633b2b2285132c7100aea43dcb15c7ca8 Author: Carl Worth Date: Wed Aug 10 20:25:57 2005 +0000 Thanks to Olivier Andrieu: Add mention of cairo_get_antialias. Fix to mention cairo_surface_flush by its correct name, (rather than the non-existent cairo_flush). ChangeLog | 8 ++++++++ NEWS | 7 ++++--- 2 files changed, 12 insertions(+), 3 deletions(-) commit ce5a493c70e530ee5aaec9acafb63d871d79d583 Author: Carl Worth Date: Wed Aug 10 16:04:26 2005 +0000 Fix id to be cairo rather than libglade. (Thanks to Christian Biesinger). ChangeLog | 5 +++++ doc/public/cairo-docs.xml | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit ae63b95211f32f169af37dc03956f9d23fd6794d Author: Carl Worth Date: Wed Aug 10 15:58:25 2005 +0000 Augment existing CAIRO_VERSION_MAJOR/MINOR/MICRO and CAIRO_VERSION_STRING with CAIRO_VERSION_ENCODE and CAIRO_VERSION. Add functions for run-time access: cairo_version cairo_version_string ChangeLog | 11 +++++++++++ src/cairo.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 16 ++++++++++++++++ 3 files changed, 69 insertions(+), 0 deletions(-) commit bdd8cbddeedec584fc859c5c092ce67c3a1830eb Author: Carl Worth Date: Wed Aug 10 14:30:15 2005 +0000 From Travis Spencer : Fix typo causing a syntax error. ChangeLog | 8 ++++++++ src/cairo-xcb-surface.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit eacc1e95a536cbdbf0fe7a09cfa9fb519b401b50 Author: Keith Packard Date: Wed Aug 10 13:32:06 2005 +0000 Place private include directives before CAIRO_CFLAGS in case pixman remains installed in the system. ChangeLog | 6 ++++++ test/Makefile.am | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit a05fcce1650e4b4b360056c072e09fdd7b193f5b Author: Keith Packard Date: Wed Aug 10 13:27:48 2005 +0000 Union with empty rectangle should yield SUCCESS, not FAILURE pixman/ChangeLog | 5 +++++ pixman/src/pixregion.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 0fc4192104fe7f3e147fe9a80eada779fd0265fc Author: Carl Worth Date: Wed Aug 10 12:36:51 2005 +0000 From Keith Packard , Build pixman internally as a private part of cairo, with suitable name changes to avoid any visible pixman symbols in the cairo library: Descend into pixman. Drop libpixman from Requires. Don't check for libpixman. Check version of pkg-config and use Requires.private instead of Requires in cairo.pc if possible. Generate pixman Makefiles. Rip out release-publish target and installation of libpixman.pc. Add pixman-remap.h. Drop libpixman.la target. Fix to include config.h rather than ../config.h This is the cpp magic to rename all pixman functions from the various fb, Fb, INT_pixman, pixman, Render, _Render, or no prefix to _cairo_pixman_ prefixes. Include pixman-remap.h to get all the cairo-internalized names. Add -Ipixman/src to get at pixman-remap.h. ChangeLog | 36 ++++++ Makefile.am | 4 +- cairo.pc.in | 2 +- configure.in | 18 ++- pixman/Makefile.am | 57 +-------- pixman/src/Makefile.am | 8 +- pixman/src/icint.h | 2 +- pixman/src/pixman-remap.h | 302 +++++++++++++++++++++++++++++++++++++++++++++ pixman/src/pixman.h | 3 +- src/Makefile.am | 4 +- test/Makefile.am | 1 + 11 files changed, 364 insertions(+), 73 deletions(-) commit bbf0d98a54ca15a7d5ba3f34851a9dd8d9ba07c4 Author: Vladimir Vukicevic Date: Wed Aug 10 11:40:11 2005 +0000 Additional fix for 0-width/0-height glyphs. ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) commit 8df9bfecadda5bc98d2fe484f6ea55110ac99b2c Author: Carl Worth Date: Wed Aug 10 11:30:45 2005 +0000 Change release instructions to indicate new odd-micro version for in-progress development, and even-micro for released versions. Do a bit of snapshot->release renaming. ChangeLog | 9 +++++++++ Makefile.am | 4 ++-- RELEASING | 41 ++++++++++++++++++++++------------------- 3 files changed, 33 insertions(+), 21 deletions(-) commit 82fbb9c381adf9e7b7b6c5fac52c175b8859e419 Author: Carl Worth Date: Wed Aug 10 11:08:38 2005 +0000 Patch from Behdad Esfahbod : Update to use AC_INIT and AM_INIT_AUTOMAKE in recommended ways. Add support for substituting CAIRO_VERSION_MAJOR/MINOR/MICRO into generated headers. Add CAIRO_VERSION_MAJOR/MINOR/MICRO and CAIRO_VERSION_STRING which are generated by configure. ChangeLog | 11 +++++++++++ configure.in | 31 ++++++++++++++++++++++--------- src/cairo-features.h.in | 6 ++++++ 3 files changed, 39 insertions(+), 9 deletions(-) commit 52ec34a157d0d0ef5af49f767a50672b84ebb9e6 Author: Carl Worth Date: Wed Aug 10 06:52:40 2005 +0000 Add cairo_private to the few pieces of data that were missing it. ChangeLog | 6 ++++++ src/cairo-path-data-private.h | 2 +- src/cairoint.h | 12 ++++++------ 3 files changed, 13 insertions(+), 7 deletions(-) commit 8042a0d219131acfbeb6ed54b078ad2bc26ccbef Author: Vladimir Vukicevic Date: Tue Aug 9 13:42:54 2005 +0000 Don't crash on 0-width or 0-height glyphs; also correctly initialize entry->key.base.memory with the image cache image. Free allocated entry in case of error to avoid leaking memory. ChangeLog | 9 +++++++++ src/cairo-glitz-surface.c | 35 +++++++++++++++++++++++++++++++++-- src/cairo-xlib-surface.c | 3 +++ 3 files changed, 45 insertions(+), 2 deletions(-) commit cedf233052f8e173c671e614207bd63e2b7add4b Author: Carl Worth Date: Tue Aug 9 13:01:14 2005 +0000 Add cairo_private to several function prototypes that were missing it. ChangeLog | 8 ++++++++ src/cairo-arc-private.h | 4 ++-- src/cairo-ft-private.h | 4 ++-- src/cairo-meta-surface-private.h | 4 ++-- src/cairoint.h | 26 +++++++++++++------------- 5 files changed, 27 insertions(+), 19 deletions(-) commit a391bb451a9521efa9526fe8acba97f96540d4be Author: Carl Worth Date: Tue Aug 9 12:35:09 2005 +0000 Note that sane clipping is done now. Add release versions for previously completed items. Ignore unantialiased-shapes. ChangeLog | 7 +++++++ ROADMAP | 12 +++++------- test/.cvsignore | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) commit 6ece52cd0572800006d87109e8818c514d5b88ca Author: Tor Lillqvist Date: Tue Aug 9 10:05:35 2005 +0000 Get cairo_toy_font_face_t type right. ChangeLog | 5 +++++ src/cairo-atsui-font.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 018015d802c170c1578efcdb9efecec08f11ab99 Author: Carl Worth Date: Tue Aug 9 09:27:39 2005 +0000 Add -head to CAIRO_VERSION after tagging with RELEASE_0_9_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 4bec3d6af49f9a720121617819700bc700ba5951 Author: Carl Worth Date: Mon Aug 8 21:06:44 2005 +0000 Added notes for release 0.9.0. Increment CAIRO_VERSION to 0.9.0. Increment LT_CURRENT to 2 to mark the beginning of proper soname management. ChangeLog | 7 +++++ NEWS | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 4 +- 3 files changed, 86 insertions(+), 2 deletions(-) commit 9a088c2fad17af0564936a3b88c9d306c72f11de Author: Carl Worth Date: Mon Aug 8 21:02:11 2005 +0000 Add missing cairo-debug.h which was hold up make distcheck. ChangeLog | 5 +++++ src/Makefile.am | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 4d2b8bddded15662015466046039650c20231bbf Author: Carl Worth Date: Mon Aug 8 20:57:13 2005 +0000 Fix typo that was holding up make distcheck from working. ChangeLog | 5 +++++ test/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 1278ade2297e027906ca12c7471891a08188b115 Author: Billy Biggs Date: Mon Aug 8 18:36:56 2005 +0000 Declare _cairo_path_nil as extern. ChangeLog | 4 ++++ src/cairo-path-data-private.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 53444c286ef45fa0054ba6ab94dac11016e9600c Author: Billy Biggs Date: Mon Aug 8 18:35:22 2005 +0000 Add a new API for disabling antialiasing of shapes drawn by cairo. This is a hint and is not supported by all backends. Store the antialiasing mode in the gstate and pass it to the backend for trapezoid rendering and for clipping. Pass the antialiasing parameter down to the backend where appropriate. Pass the antialiasing parameter down to the backend where appropriate. Add support for A1 format trapezoid rendering, and remove the _create_mask_image function, creating a temporary image from memory we allocate and clear. Support A1 masks to disable antialiasing using the RENDER extension when requested. Support A1 masks to disable antialiasing using the RENDER extension when requested. Blindly pass through the antialising parameter. Add the antialiasing parameter but don't support it. Add a test case and a reference image from the latest libpixman. Add the new antialiasing disabling API to the docs. Update progress on a parameter to disable antialiasing. reviewed by: cworth, otaylor ChangeLog | 74 ++++++++++++++++++++++++++ TODO | 2 +- doc/public/cairo-sections.txt | 4 +- doc/public/tmpl/cairo-font.sgml | 10 ---- doc/public/tmpl/cairo.sgml | 28 ++++++++++ src/cairo-clip-private.h | 2 + src/cairo-clip.c | 15 ++++-- src/cairo-glitz-surface.c | 1 + src/cairo-gstate-private.h | 1 + src/cairo-gstate.c | 49 ++++++++++++++---- src/cairo-image-surface.c | 71 ++++++++++++++----------- src/cairo-meta-surface-private.h | 3 + src/cairo-meta-surface.c | 11 +++- src/cairo-pdf-surface.c | 4 +- src/cairo-ps-surface.c | 12 +++- src/cairo-surface.c | 20 +++++-- src/cairo-xcb-surface.c | 11 ++++- src/cairo-xlib-surface.c | 22 ++++++-- src/cairo.c | 40 ++++++++++++++ src/cairo.h | 46 +++++++++------- src/cairoint.h | 18 +++++- test/Makefile.am | 3 + test/unantialiased-shapes-ref.png | Bin 0 -> 4450 bytes test/unantialiased-shapes.c | 103 +++++++++++++++++++++++++++++++++++++ 24 files changed, 450 insertions(+), 100 deletions(-) commit 578b45c9032fd00b68fc1709d61e915d74a527c7 Author: Carl Worth Date: Mon Aug 8 17:32:24 2005 +0000 Ignore clip-operator and unbounded-operator. ChangeLog | 4 ++++ test/.cvsignore | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 8bdad8ffa2962c9dff1e86e9bd131d588a1ebd2f Author: Carl Worth Date: Mon Aug 8 15:50:55 2005 +0000 Fix gnome-announce-list address. ChangeLog | 4 ++++ RELEASING | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit d51a35543ca405dda788eb6433e6bb30dc3c7cf5 Author: Owen Taylor Date: Mon Aug 8 14:27:01 2005 +0000 Don't free the glyph if the entry doesn't have a glyph. (Maybe #3909, Carlos Garnacho Parro) ChangeLog | 6 ++++++ src/cairo-xlib-surface.c | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit 69f140b654df878b9ba86d61062d235bbebef7a2 Author: Carl Worth Date: Mon Aug 8 14:13:50 2005 +0000 Add a return value after ASSERT_NOT_REACHED to quiet an anxious compiler. ChangeLog | 5 +++++ src/cairo-gstate.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 8478804d9818deb3a1f86e8e22200c40f83962bf Author: Owen Taylor Date: Mon Aug 8 14:11:00 2005 +0000 Fix accidentally committed line. ChangeLog | 5 +++++ src/cairo-gstate.c | 4 +--- 2 files changed, 6 insertions(+), 3 deletions(-) commit 7caa7cccf2e5aff083d5a88fbace0b24430397de Author: Kristian Høgsberg Date: Mon Aug 8 13:50:59 2005 +0000 Update doc comment. ChangeLog | 5 +++++ src/cairo-surface.c | 12 +++++------- 2 files changed, 10 insertions(+), 7 deletions(-) commit d4b24dc974bd4298c1ad8d06efc4f3dfea68ee03 Author: Owen Taylor Date: Mon Aug 8 13:50:02 2005 +0000 Add reference images test/clip-operator-ref.png | Bin 0 -> 37486 bytes test/unbounded-operator-ref.png | Bin 0 -> 14178 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 8f19aaf9a8a60aa2eb86e25946d04f293ed703db Author: Owen Taylor Date: Mon Aug 8 13:46:11 2005 +0000 Add a function to test whether a cairo_operator_t is bounded (does nothing for 0 src/mask) cairoint.h: Add a helper function to take clearing areas that are outside the source/mask but are cleared by unbounded operations. src/cairo-xlib-surface.c (_cairo_xlib_surface_composite): Use _cairo_surface_composite_fixup_unbounded() as needed. src/cairo-image-surface.c src/cairint.h: Keep track of whether the surface has a clip or not ... we need this for determining when we can bypass an intermediate mask for composite_trapezoids(). Create an intermediate mask of the right size with pixman_add_trapezoids() and composite that. When rendering with an unbounded operator, create the intermediate mask ourselves and render with ADD to that, then composite the result. Create an intermediate surface the size of the extents, render the glyphs to that then composite the results. Add the size of the glyph Compute the size of the glyph mask, then use _cairo_surface_composite_fixup_unbounded(). Use the right mask format. (Unrelated bugfix) New function taking a drawing function as a parameter to encapsulate shared logic between compositing trapezoid, glyphs, and masks. Use _cairo_gstate_clip_and_composite(). Also fix extents computations for unbounded operators. src/cairo-clip.c src/cairo-clip-private.h (_cairo_clip_combine_to_surface): Add the destination as an extra parameter to allow combining to an intermediate surface. tests/unbounded-operator.c tests/Makefile.am: Add a test for the operation of the 6 unbounded operators against different shapes. tests/clip-operator.c tests/Makefile.am: Add a test that tests surface clipping with different shapes against all the operators. Make use OVER like the name and description. With fixed semantics, SOURCE does something different. ChangeLog | 60 ++ src/cairo-clip-private.h | 9 +- src/cairo-clip.c | 22 +- src/cairo-ft-font.c | 122 ++++- src/cairo-gstate.c | 733 ++++++++++++++---------- src/cairo-image-surface.c | 126 ++++- src/cairo-surface.c | 151 +++++ src/cairo-xlib-surface.c | 214 +++++++- src/cairoint.h | 23 +- test/Makefile.am | 6 + test/clip-operator.c | 205 +++++++ test/composite-integer-translate-over-repeat.c | 2 +- test/unbounded-operator.c | 201 +++++++ 13 files changed, 1520 insertions(+), 354 deletions(-) commit 31ef9a80e95c5b84439b5d668d11ab3480d22a22 Author: Carl Worth Date: Sat Aug 6 17:00:59 2005 +0000 Remove several bugs that have been fixed. BUGS | 53 ----------------------------------------------------- 1 files changed, 0 insertions(+), 53 deletions(-) commit 1fadb8065600d5b9cbab9a14232e08daec450e4d Author: Carl Worth Date: Sat Aug 6 16:57:14 2005 +0000 Remove several bugs that have been fixed. Slip group support off of the 1.0 roadmap. Update status of clipping work which otaylor is working on. Update for progress on cairo_surface_mark_dirty (committed), non-antialiased rendering (patch), cairo_arc_to (patch), consistent error handling (committed), cairo_content_t (committed). Remove details for some completed items. Don't crash if font_face is NULL, (this is a documented mechanism for returning to the default font_face). BUGS | 29 ----------------------- ChangeLog | 16 ++++++++++++ ROADMAP | 22 +++++++++-------- TODO | 65 ++++------------------------------------------------ src/cairo-gstate.c | 2 +- 5 files changed, 34 insertions(+), 100 deletions(-) commit 2f1024f83fc971516224b910cec8d3e787740c53 Author: Carl Worth Date: Sat Aug 6 16:38:33 2005 +0000 Fix to return &_cairo_font_face_nil instead of NULL on error. ChangeLog | 5 +++++ src/cairo.c | 7 ++----- 2 files changed, 7 insertions(+), 5 deletions(-) commit 8c52b287f37f8361653030024d7a4a42fc6e54ed Author: Jeff Muizelaar Date: Sat Aug 6 15:10:36 2005 +0000 Give reason for failure. ChangeLog | 4 ++++ test/a8-mask.c | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 158b338fb2817996c5191332951b6957416c2e77 Author: Owen Taylor Date: Sat Aug 6 10:22:07 2005 +0000 Remove a non-sensical XXX that crept in at some point; for a solid color, there is no difference between premultiplied and non-premultiplied colors. ChangeLog | 7 +++++++ src/cairo-win32-font.c | 1 - 2 files changed, 7 insertions(+), 1 deletions(-) commit f367e693322b1cf04040521080cc65403c292a28 Author: Carl Worth Date: Sat Aug 6 00:09:17 2005 +0000 Fix up some stale comments. Rename _cairo_ft_scaled_font_create_for_unscaled to its proper name of _cairo_ft_scaled_font_create (which is available now that _cairo_ft_scaled_font_create_toy has its correct name). Also prefer 'scaled_font' over 'f' as an identifier. ChangeLog | 11 +++++++++++ src/cairo-ft-font.c | 46 ++++++++++++++++++++++++---------------------- 2 files changed, 35 insertions(+), 22 deletions(-) commit e63e0578b1edf2b60c818b3e6741cf97c5a53359 Author: Carl Worth Date: Fri Aug 5 23:41:41 2005 +0000 Unify initialization for _cairo_ft_unscaled_font_create_from_face and _cairo_ft_unscaled_font_create_from_filename through new _cairo_ft_unscaled_font_init. ChangeLog | 9 ++++ src/cairo-ft-font.c | 102 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 80 insertions(+), 31 deletions(-) commit c4a806f21c2b6c3081b953497daf25108a734787 Author: Carl Worth Date: Fri Aug 5 22:37:29 2005 +0000 Rename _ft_font_face_backend to be preoperly namespaced as _cairo_ft_font_face_backend. ChangeLog | 6 ++++++ src/cairo-ft-font.c | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit ff147497e54ef7573b35bd023d11e4e7d4272979 Author: Carl Worth Date: Fri Aug 5 22:35:04 2005 +0000 Rename cairo_ft_font_face->next_face to next. ChangeLog | 6 ++++++ src/cairo-ft-font.c | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) commit cfcab8fe4467095381c7a4d32182580649db6f00 Author: Carl Worth Date: Fri Aug 5 22:29:06 2005 +0000 Include cairo-hash-private.h. Add cairo-hash.c and cairo-hash-private.h since we're actually going to start using them now. ChangeLog | 8 ++++++++ src/Makefile.am | 2 ++ src/cairoint.h | 2 ++ 3 files changed, 12 insertions(+), 0 deletions(-) commit de87ebcc1c53d9daa4f77b618766215b1723778e Author: Jeff Muizelaar Date: Fri Aug 5 22:17:08 2005 +0000 Fix problems in render fb implementation found by rendercheck: - fbCombineSaturate was pointed at fbCombineDisjointOver, instead of fbCombineDisjointOverReverse as it should. Instead, point fbCombineDisjointOverReverse at fbCombineSaturate (which is likely to be faster). - fix previously-unused fbCombineSaturate implementation. - fbCombineMaskAlphaC was just a copy of fbCombineMaskValueC. Make it do what it's supposed to (return a cs.alpha). - fbCombineAtopC didn't invert the source alpha value. - fix copy'n'paste errors in fbCombine(Dis/Con)jointGeneralC, also source alpha wasn't treated in a component fashion. From anholt. pixman/ChangeLog | 20 +++++ pixman/src/iccompose.c | 195 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 156 insertions(+), 59 deletions(-) commit 71e560a8fa78d9fd6f83cce820de9f4acb3829eb Author: Jeff Muizelaar Date: Fri Aug 5 21:35:51 2005 +0000 Temporarily disable the 24bpp WORKING_UNALIGNED_INT because of a crash when using electric-fence when accessing hte last pixel of a drawable (last pixel is 3 bytes, read it as a 4 byte word, and you're reading one extra pixel, which doesn't normally matter, but does in a few rare cases). Should be easy to work around, but that will come later. From jaymz pixman/ChangeLog | 11 +++++++++++ pixman/src/iccompose.c | 10 +++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) commit 417a66da5e8a98583661d08703a5c5562732678a Author: Carl Worth Date: Fri Aug 5 21:33:41 2005 +0000 Simplify the implementation by taking advantage of the fact that destroy and reference are safe for NULL, and that reference returns its argument. ChangeLog | 7 +++++++ src/cairo-gstate.c | 7 ++----- 2 files changed, 9 insertions(+), 5 deletions(-) commit 80b944418cab51fcc2178080fe0c9a5ffd512479 Author: Carl Worth Date: Fri Aug 5 21:27:21 2005 +0000 Rename two functions: _cairo_gstate_unset_font -> _cairo_gstate_unset_scaled_font _cairo_gstate_ensure_font -> _cairo_gstate_ensure_scaled_font ChangeLog | 17 +++++++++++++++++ src/cairo-gstate.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 37 insertions(+), 20 deletions(-) commit 75e3d2883409220350a688716c908bea7b6e2c13 Author: Carl Worth Date: Fri Aug 5 21:02:25 2005 +0000 Entagle the cairo_unscaled_font_t typedef. ChangeLog | 4 ++++ src/cairoint.h | 6 ++---- 2 files changed, 6 insertions(+), 4 deletions(-) commit c14f2252b1b3a4499e65c13a146b9f8c5e9c5550 Author: Carl Worth Date: Fri Aug 5 20:53:09 2005 +0000 Rename font_face_backend->create_font to scaled_font_create. Group the scaled_font prototypes together. A little more simple -> toy renaming. A little more simple -> toy renaming. Track rename of font_face_backend->scaled_font_create. ChangeLog | 19 +++++++++++++++++++ src/cairo-font.c | 42 +++++++++++++++++++++--------------------- src/cairo-ft-font.c | 14 +++++++------- src/cairo-gstate.c | 8 ++++---- src/cairo-win32-font.c | 14 +++++++------- src/cairoint.h | 30 +++++++++++++++--------------- 6 files changed, 73 insertions(+), 54 deletions(-) commit 9c1fe21cd70bed9fd9e77ec757751df723cb9c42 Author: Carl Worth Date: Fri Aug 5 20:30:43 2005 +0000 Rather gratuitous (though mostly harmless) whitespace changes for font backend tables. ChangeLog | 5 +++ src/cairoint.h | 104 +++++++++++++++++++++++++++++++------------------------- 2 files changed, 63 insertions(+), 46 deletions(-) commit 4ad365f1834bf0204e44156a62b8e8539fb65ef9 Author: Carl Worth Date: Fri Aug 5 20:15:19 2005 +0000 Document the implicit closing of sub-paths for cairo_fill and cairo_fill_preserve. ChangeLog | 5 +++++ src/cairo.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) commit d150513c6af3a7d1f52d7251ab0d097337f40ab3 Author: Carl Worth Date: Fri Aug 5 17:27:57 2005 +0000 Rename parameters to scalend_font_backend from font to scaled_font. ChangeLog | 5 +++++ src/cairoint.h | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) commit b482e1e25e57c7ae1422f4737a2702d3cb53c0eb Author: Carl Worth Date: Fri Aug 5 17:00:38 2005 +0000 Rename scaled_font_backend->destroy to the more accurate fini, (since it frees only the dependent data within the scaled_font and not the scaled_font itself). Track rename of scaled_font_backend->fini. ChangeLog | 12 ++++++++++++ src/cairo-atsui-font.c | 4 ++-- src/cairo-font.c | 2 +- src/cairo-ft-font.c | 4 ++-- src/cairo-win32-font.c | 4 ++-- src/cairoint.h | 2 +- 6 files changed, 20 insertions(+), 8 deletions(-) commit 76f80cc42e442abaf52d6582d16be91258f3f8a9 Author: Carl Worth Date: Fri Aug 5 16:44:20 2005 +0000 Rename scaled_font_backend->create to create_toy. Move declaration of cairo_simple_font_face_t from cairo_font.c to cairoint.h and rename it cairo_toy_font_face_t. Rework create_toy to accept a cairo_toy_font_face_t rather than separate family, slant, and weight. Track change in create_toy interface. Partial rename of simple->toy. It's not complete as this is a step in the process of merging in a large patch of mine which actually removes most of the affected code. ChangeLog | 22 ++++++++++++++++++++++ src/cairo-atsui-font.c | 21 +++++++++------------ src/cairo-font.c | 33 ++++++++++----------------------- src/cairo-ft-font.c | 21 ++++++++++----------- src/cairo-win32-font.c | 21 ++++++++++----------- src/cairoint.h | 23 ++++++++++++++++------- 6 files changed, 77 insertions(+), 64 deletions(-) commit 8d0452c1ee7ba7466b7bb06ec5c4e9746fce2482 Author: Carl Worth Date: Fri Aug 5 15:49:52 2005 +0000 ignore a8-mask ChangeLog | 4 ++++ test/.cvsignore | 1 + 2 files changed, 5 insertions(+), 0 deletions(-) commit 5925e3520fbf6223804d5c5e81698d7cdd888620 Author: Carl Worth Date: Fri Aug 5 15:48:42 2005 +0000 Patch memory leaks. ChangeLog | 4 ++++ test/a8-mask.c | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) commit 53bd9879bb802606789be76e5653e2fb6781f676 Author: Jeff Muizelaar Date: Fri Aug 5 15:07:45 2005 +0000 Add a test case for CAIRO_FORMAT_A8 masks that fails with libpixman. ChangeLog | 8 +++++ test/Makefile.am | 4 +++ test/a8-mask-ref.png | Bin 0 -> 128 bytes test/a8-mask.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 0 deletions(-) commit 549b7ff2a66335dc18434790895d4b4a25a76ba4 Author: Carl Worth Date: Fri Aug 5 15:01:55 2005 +0000 Bump automake_min_vers up to 1.7 since we clearly don't work with 1.4 anymore. ChangeLog | 5 +++++ autogen.sh | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) commit ec93e241b0cf161216dab27eeee3917a71230aa7 Author: Jeff Muizelaar Date: Fri Aug 5 12:26:33 2005 +0000 Fix fbGetDrawable Patch from Billy Biggs . pixman/ChangeLog | 6 ++++++ pixman/src/pixman-xserver-compat.h | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) commit 3ef2488265a1671d42224f4dca1b62c007ef5b0a Author: Jeff Muizelaar Date: Fri Aug 5 12:14:12 2005 +0000 Fix some of the 4 bit per channel PICT definitions Patch from Billy Biggs . pixman/ChangeLog | 6 ++++++ pixman/src/icint.h | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) commit 2b20b7a23022a22a460b9441984ccdb7fdce5061 Author: Jeff Muizelaar Date: Fri Aug 5 11:44:49 2005 +0000 Fix up the fast-path compositing operators; those are useful for sources without alpha, but can't be used for sources with alpha. Also, replaced fbCompositeSrcSrc_nxn with call to fbBlt as this function must handle 1, 4, 8, 16, 24, 32 bpp objects. Would be nice to optimize fbBlt for common cases involving 8, 16, 24 and 32bpp. From Keith Packard. pixman/ChangeLog | 17 ++ pixman/src/ic.c | 432 ++++++++++++++++++++++++++++-------------------------- 2 files changed, 244 insertions(+), 205 deletions(-) commit 594ba3ef69509d9c13258449f4b636bc52d77cd4 Author: Jeff Muizelaar Date: Fri Aug 5 11:23:51 2005 +0000 use the newly added buffer_diff_noalpha for comparing buffers of CAIRO_FORMAT_RGB24. ChangeLog | 6 ++++++ test/xlib-surface.c | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) commit 5f78feda5d9819f82ff99911b90cd09e228466a9 Author: Jeff Muizelaar Date: Fri Aug 5 11:15:04 2005 +0000 rewrite buffer_diff to be endian safe and add a new fuction buffer_diff_noalpha ChangeLog | 7 ++++ test/buffer-diff.c | 83 +++++++++++++++++++++++++++++++++++---------------- test/buffer-diff.h | 14 ++++++++- 3 files changed, 77 insertions(+), 27 deletions(-) commit 2e1eaa88ff07fbd2048c76587cd6b9ca565fa047 Author: Carl Worth Date: Fri Aug 5 10:46:40 2005 +0000 Remove CAIRO_BEGIN_DECLS and CAIRO_END_DECLS which don't belong here. ChangeLog | 5 +++++ doc/public/cairo-sections.txt | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) commit 7d88cdd15bbf8ccb82b7bd45313396ea6f93054f Author: Carl Worth Date: Fri Aug 5 10:43:07 2005 +0000 Remove unused variable. ChangeLog | 4 ++++ test/surface-finish-twice.c | 1 - 2 files changed, 4 insertions(+), 1 deletions(-) commit e59d1dff7f8096c497ca4e70df1259b16c264f25 Author: Carl Worth Date: Fri Aug 5 10:40:32 2005 +0000 Ignore cairo-clip-private.h. Drop non-existent cairo-atsui.xml. Fix misnamed parameters in comment blocks. Include config.h so HAVE_UNISTD_H gets picked up as necessary. ChangeLog | 16 ++++++++++++++++ doc/public/Makefile.am | 1 + doc/public/cairo-docs.xml | 1 - src/cairo-font.c | 7 ++----- test/cairo-test.c | 4 ++++ 5 files changed, 23 insertions(+), 6 deletions(-) commit 59d7f60249c9b0d01b01548907c792c324cb9bc8 Author: Carl Worth Date: Fri Aug 5 10:30:31 2005 +0000 Add some missing declarations to the appropriate sections. churn Rename cairo_path_nil to _cairo_path_nil since it may be exported, and tag it cairo_private to try to avoid exporting it. Qualify it as const well. Track new name of _cairo_path_nil and cast away the const as required. ChangeLog | 19 +++++++++++++++++++ doc/public/cairo-sections.txt | 5 +++++ doc/public/tmpl/cairo-font.sgml | 18 ++++++++++++++++++ doc/public/tmpl/cairo-surface.sgml | 9 +++++++++ doc/public/tmpl/cairo-xlib.sgml | 11 +++++++++++ doc/public/tmpl/cairo.sgml | 7 +++++++ src/cairo-path-data-private.h | 2 +- src/cairo-path-data.c | 8 ++++---- src/cairo.c | 4 ++-- 9 files changed, 76 insertions(+), 7 deletions(-) commit a2dc18fd0c89e267bd810d42c8e0965487a22058 Author: Carl Worth Date: Fri Aug 5 10:05:29 2005 +0000 Remove include of math.h since cairoint.h does it more carefully, (for annoying platforms for which just including math.h without extra defines is not enough). Replace Cairo with cairo. Include config.h so HAVE_UNISTD_H gets picked up as necessary. Fix non-UTF-8 copyright symbol. ChangeLog | 14 ++++++++++++++ src/cairo-arc.c | 2 -- src/cairo-matrix.c | 1 - src/cairo.c | 2 +- test/buffer-diff.c | 4 ++++ test/cairo-test.c | 2 +- 6 files changed, 20 insertions(+), 5 deletions(-) commit 72f40f58bbaf1b80c82f9447007cd4c8d7a4916f Author: Carl Worth Date: Fri Aug 5 10:03:04 2005 +0000 More obnoxious tmpl churn doc/public/tmpl/cairo-font.sgml | 2 ++ doc/public/tmpl/cairo-pattern.sgml | 1 + doc/public/tmpl/cairo-surface.sgml | 1 + doc/public/tmpl/cairo.sgml | 1 + 4 files changed, 5 insertions(+), 0 deletions(-) commit 2eabc47b853f08614d829acecb277388dcb4e046 Author: Carl Worth Date: Fri Aug 5 09:49:38 2005 +0000 Sort cairo-clip.c src/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0586daaa2927bfde9605487eef8e9b95c49d7d2f Author: Carl Worth Date: Fri Aug 5 07:48:18 2005 +0000 Patch from John Ehresman to aid win32 compilation: Define snprintf as _snprintf when under the influence of _MSC_VER. Define int32_t and friends as __int32 and friends when under the influence of _MSC_VER. Make include of unistd.h conditional on HAVE_UNISTD_H. ChangeLog | 16 ++++++++++++++++ src/cairo-output-stream.c | 4 ++++ src/cairo-wideint.h | 14 +++++++++++++- test/buffer-diff.c | 2 ++ test/cairo-test.c | 6 ++++++ test/read-png.c | 14 +++++++++++++- 6 files changed, 54 insertions(+), 2 deletions(-) commit fd27af574d544d8adfd8cb6d5ac84837e6db43d2 Author: Kristian Høgsberg Date: Thu Aug 4 23:10:26 2005 +0000 Patch from Adrian Johnson Remap composite glyps to use subset font glyph indices. ChangeLog | 8 +++++ src/cairo-font-subset.c | 72 +++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 3 deletions(-) commit ebf985c87688f090c27c3906a6b441522b2f702a Author: Kristian Høgsberg Date: Thu Aug 4 22:45:59 2005 +0000 New files. Move code for manipulating cairo_clip_t out into cairo_clip_* functions and put them in cairo-clip.c. Rewrite to use new cairo_clip_t functions for manipulating the clip state, change the clip_and_composite_trapezoids call tree to use cairo_clip_t instead of cairo_gstate_t. Use new cairo_clip_t function to maintain clip state while replaying. Pass fill rule and tolerance directly, to break gstate dependency. New function. Set the clip for a surface as specified by the cairo_clip_t. Move translate_traps() from cairo-gstate.c to here and rename it. Reviewed by: otaylor ChangeLog | 29 ++ src/Makefile.am | 2 + src/cairo-clip-private.h | 118 ++++++++ src/cairo-clip.c | 457 +++++++++++++++++++++++++++++++ src/cairo-gstate-private.h | 41 +--- src/cairo-gstate.c | 637 +++++++------------------------------------- src/cairo-meta-surface.c | 132 +++++----- src/cairo-path-fill.c | 20 +- src/cairo-surface.c | 23 ++- src/cairo-traps.c | 29 ++ src/cairoint.h | 35 ++- 11 files changed, 849 insertions(+), 674 deletions(-) commit 27573750eb9f2655d0b4cb5640a9f3f6c1316bc0 Author: Kristian Høgsberg Date: Thu Aug 4 18:44:29 2005 +0000 Change *_reference() functions to return the object being referenced. ChangeLog | 14 ++++++++++++++ src/cairo-font-subset.c | 3 +-- src/cairo-font.c | 26 ++++++++++++++++++-------- src/cairo-ft-font.c | 6 ++---- src/cairo-glitz-surface.c | 3 +-- src/cairo-gstate.c | 11 ++++++----- src/cairo-image-surface.c | 3 +-- src/cairo-meta-surface.c | 3 +-- src/cairo-pattern.c | 13 ++++++++----- src/cairo-pdf-surface.c | 9 +++++---- src/cairo-surface.c | 26 +++++++++++++++++++++++--- src/cairo-xcb-surface.c | 3 +-- src/cairo-xlib-surface.c | 3 +-- src/cairo.c | 8 ++++++-- src/cairo.h | 10 +++++----- src/cairoint.h | 2 +- 16 files changed, 94 insertions(+), 49 deletions(-) commit a8ccf316201e5241bcde2359f6dcbe3557cca79b Author: Tor Lillqvist Date: Thu Aug 4 15:53:30 2005 +0000 Check for render bug involving repeated patterns with a general transform matrix. ChangeLog | 8 ++++++++ src/cairo-xlib-surface.c | 40 ++++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 10 deletions(-) commit b5ab1741e9f9e73283dd18266834ecae2b03d93e Author: Carl Worth Date: Thu Aug 4 13:22:15 2005 +0000 Originally 2005-07-13 Carl Worth Export opaque cairo_ft_unscaled_font_t and change _cairo_ft_unscaled_font_[un]lock_face to accept cairo_ft_unscaled_font_t rather than cairo_unscaled_font_t. Cast explicitly to cairo_ft_unscaled_font_t to track change in prototype of _cairo_ft_unscaled_font_[un]lock_face. Lots of renaming to use consistent namespacing: ft_font_transform_t -> cairo_ft_font_transform_t ft_font_face_t -> cairo_ft_font_face_t ft_unscaled_font_t -> cairo_ft_unscaled_font_t Add missing _cairo prefix to many functions. Disambiguate _ft_scaled_font_create and _cairo_ft_scaled_font_create by renaming the former to _cairo_ft_scaled_font_create_for_unscaled. Reviewed by: otaylor ChangeLog | 28 ++++++ src/cairo-font-subset.c | 18 +++- src/cairo-ft-font.c | 215 +++++++++++++++++++++++------------------------ src/cairo-ft-private.h | 6 +- 4 files changed, 150 insertions(+), 117 deletions(-) commit b45f68876528050107b6e8c4b24fb8edb7ded12e Author: Carl Worth Date: Wed Aug 3 10:32:50 2005 +0000 Fix for bug #3951: Add new _CHECK_FUNCS_WITH_FLAGS to abstract out the pain of temporarily setting flags for AC_CHECK_FUNCS. Use this to check for the existence of FcFini. Make call to FcFini conditional on HAVE_FCFINI. Remove stale comment about cleaning up memory which is now handled by cairo-test.c. ChangeLog | 14 ++++++++++++++ configure.in | 30 +++++++++++++++++++++++------- test/cairo-test.c | 2 ++ test/text-cache-crash.c | 14 -------------- 4 files changed, 39 insertions(+), 21 deletions(-) commit ba87f1324fda84ea816ad8f18442444c2ad1ed93 Author: Billy Biggs Date: Mon Aug 1 18:01:24 2005 +0000 Optimize spans where the same value is being added to multiple pixels. This improves the speed of rasterizing wide trapezoids. Add an INLINE macro that matches the one from fbpict.h in xserver/fb. pixman/ChangeLog | 10 ++ pixman/src/fbedge.c | 230 +++++++++++++++++++++++++++++++++++++++++++++------ pixman/src/icint.h | 6 ++ 3 files changed, 220 insertions(+), 26 deletions(-) commit 500cc6fed1858d5e9240ce61bbbf00781ae4c097 Author: Owen Taylor Date: Mon Aug 1 14:39:01 2005 +0000 src/cairo-gstate.c src/cairo-gstate-private.h: Store the inverse CTM at the time of cairo_gstate_set_source() to "lock" the user space matrix. Move the source pattern transformation to the outside of _cairo_gstate_clip_and_composite_trapezoids() instead of doing it at the leaves. Change size of output surface for aesthetics. Updated to correspond to the current definition. Remove source-surface-scale-paint. reviewed by: cworth ChangeLog | 23 ++++++- src/cairo-gstate-private.h | 1 + src/cairo-gstate.c | 119 +++++++++++++++++-------------- test/Makefile.am | 1 - test/source-surface-scale-paint-ref.png | Bin 147 -> 139 bytes test/source-surface-scale-paint.c | 5 +- 6 files changed, 91 insertions(+), 58 deletions(-) commit c525c684ca712c5c5acd5431ec061bfab364cef5 Author: Carl Worth Date: Mon Aug 1 13:33:47 2005 +0000 New public header file. New function to reset all static data (eg. caches) to their initial state. Fix check-valgrind target to depend on the 'all' target. Add check for a new, proposed, XrmFinalize function. Add cairo-debug.c. Move the definition of CAIRO_BEGIN_DECLS to cairo-features.h so that it can be shared between public header files, and so that it doesn't clutter cairo.h Implement reset_static_data in all modules as required. Call cairo_debug_reset_static_data and FcFini so that we can have all tests be valgrind-clean with respect to memory leaks and still-reachable data. ChangeLog | 55 ++++++++++++++++++++++++++++++++++ Makefile.am | 3 ++ configure.in | 7 ++++ src/Makefile.am | 1 + src/cairo-debug.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-debug.h | 48 ++++++++++++++++++++++++++++++ src/cairo-features.h.in | 8 +++++ src/cairo-font.c | 39 +++++++++++++++++++----- src/cairo-ft-font.c | 13 ++++++++ src/cairo-xlib-screen.c | 53 +++++++++++++++++++++++++++------ src/cairo-xlib-surface.c | 26 +++++++++++++++- src/cairo.h | 8 ----- src/cairoint.h | 13 ++++++++ test/cairo-test.c | 6 ++++ test/cairo-test.h | 1 + test/xlib-surface.c | 2 + 16 files changed, 329 insertions(+), 27 deletions(-) commit 480951827e567db89f88e71e7ba20f4fa4633c1b Author: Owen Taylor Date: Mon Aug 1 11:45:42 2005 +0000 src/cairo.h src/cairoint.h src/cairo-surface.c: Add cairo_mark_dirty[_rectangle]() and cairo_flush() for Implement a cairo_flush() that restores the original clip. Also restore the original flush when a surface is finished. Check off the item. ChangeLog | 11 ++++ ROADMAP | 2 +- doc/public/cairo-sections.txt | 3 + doc/public/tmpl/cairo-surface.sgml | 28 ++++++++++ src/cairo-surface.c | 97 +++++++++++++++++++++++++++++++++++- src/cairo-win32-surface.c | 16 +++++- src/cairo.h | 13 +++++ src/cairoint.h | 11 ++++ 8 files changed, 176 insertions(+), 5 deletions(-) commit 392a2746ef051d16be303477170511ef38dcf753 Author: Amaury Jacquot Date: Mon Aug 1 06:57:09 2005 +0000 fix typo pixman/ChangeLog | 4 ++++ pixman/NEWS | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit cd78d99642bdf1171d21083a6947c77ff00b599e Author: Billy Biggs Date: Sun Jul 31 11:19:47 2005 +0000 Support versions of freetype without exact FT_Bitmap_Size.x/y_ppem values by using the pixel width and height values instead. Add a check for FT_Bitmap_Size.y_ppem. reviewed by: keithp ChangeLog | 10 ++++++++++ configure.in | 14 ++++++++++++++ src/cairo-ft-font.c | 8 +++++++- 3 files changed, 31 insertions(+), 1 deletions(-) commit b4ae3371b34ca67e98df5e73147adcd6b7853e1d Author: Billy Biggs Date: Sun Jul 31 11:03:35 2005 +0000 Cast away the const on the nil surface to avoid a compiler warning. ChangeLog | 5 +++++ src/cairo-quartz-surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 31e0d694294ef17037a0b464615916e065a81385 Author: Billy Biggs Date: Sat Jul 30 22:21:12 2005 +0000 Pass the options down to the scaled font object to keep things compiling. ChangeLog | 5 +++++ src/cairo-atsui-font.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit b47c0050f985856d0c47a43d3a1b3cc8f18dbd32 Author: Keith Packard Date: Sat Jul 30 12:57:54 2005 +0000 Replace wide integer divide algorithms with trivial bit-at-a-time code. Original code was of unclear provenance, this new code is completely different. ChangeLog | 11 ++ src/cairo-wideint.c | 461 +++++---------------------------------------------- src/cairo-wideint.h | 6 +- 3 files changed, 60 insertions(+), 418 deletions(-) commit 05d84a0a1e1f4f4cb750ab6828a1e09ffa73b0f0 Author: Jeff Muizelaar Date: Sat Jul 30 10:23:21 2005 +0000 Finish up merging the optimization work from jaymz. pixman/ChangeLog | 10 ++ pixman/src/ic.c | 316 +++++++++++++++++++++++------------------------- pixman/src/icblt.c | 4 +- pixman/src/iccompose.c | 13 ++- 4 files changed, 170 insertions(+), 173 deletions(-) commit bdfb7f4db0b48cf3882241b4b547082f68410567 Author: Jeff Muizelaar Date: Sat Jul 30 09:43:51 2005 +0000 s/uint(8|16|32)_t/CARD(8|16|32)/ pixman/ChangeLog | 17 +++ pixman/src/iccompose.c | 280 ++++++++++++++++++++++++------------------------ 2 files changed, 157 insertions(+), 140 deletions(-) commit 5ebf2c5d967fb84a2e102254421057af9bcd307a Author: Jeff Muizelaar Date: Sat Jul 30 08:48:25 2005 +0000 Add some optimizations from jaymz. Also adds some compile warnings that will hopefully go away as we continue merging. pixman/ChangeLog | 9 + pixman/src/ic.c | 595 +++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 504 insertions(+), 100 deletions(-) commit 172e535ee05ab725ed1a951b31077843d112e7ca Author: Carl Worth Date: Fri Jul 29 15:35:19 2005 +0000 Remove completed 0.6 tasks. Add cairo_surface_flush to the cairo_surface_mark_dirty task. ChangeLog | 5 +++++ ROADMAP | 25 ++++--------------------- 2 files changed, 9 insertions(+), 21 deletions(-) commit ef4209a8a1fdcf7226bec2c6481a4f8239d63ec3 Author: Tor Lillqvist Date: Fri Jul 29 15:31:48 2005 +0000 src/cairo-quartz-surface.c (_cairo_quartz_surface_acquire_dest_image): Minor updates to keep quartz backend limping along. ChangeLog | 6 ++++++ src/cairo-atsui-font.c | 1 + src/cairo-quartz-surface.c | 3 ++- 3 files changed, 9 insertions(+), 1 deletions(-) commit 449087745b520c64113102f5c62bc5a8beba6c98 Author: Owen Taylor Date: Fri Jul 29 12:45:01 2005 +0000 src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c src/cairoint.h: Move the font options into the base cairo_scaled_font_t object so that we have them available to use when we are removing a scaled font from the cache. (http://bugzilla.gnome.org/show_bug.cgi?id=#311299, Ali Akcaagac, Behdad Esfahbod) ChangeLog | 9 +++++++++ src/cairo-font.c | 8 ++++++++ src/cairo-ft-font.c | 7 ++----- src/cairo-win32-font.c | 4 +--- src/cairoint.h | 17 ++++++++++------- 5 files changed, 30 insertions(+), 15 deletions(-) commit a0ca6026ad0ea049198e17dbda379d4737078053 Author: Carl Worth Date: Thu Jul 28 15:58:09 2005 +0000 Run the mask pattern through the CTM in the same way as the source pattern. This fixes the bug demonstrated by the mask-ctm and mask-surface-ctm tests so they should no longer fail. ChangeLog | 7 +++++++ src/cairo-gstate.c | 16 ++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) commit 26289b366434103eda1dd619d8bad0e9394724d6 Author: Carl Worth Date: Thu Jul 28 15:55:00 2005 +0000 Add two new tests: mask-ctm mask-surface-ctm demonstrating that masks are not currently being modified by the CTM. ChangeLog | 13 ++++++ test/.cvsignore | 2 + test/Makefile.am | 6 +++ test/mask-ctm-ref.png | Bin 0 -> 129 bytes test/mask-ctm.c | 82 +++++++++++++++++++++++++++++++++++++++++ test/mask-surface-ctm-ref.png | Bin 0 -> 129 bytes test/mask-surface-ctm.c | 75 +++++++++++++++++++++++++++++++++++++ 7 files changed, 178 insertions(+), 0 deletions(-) commit 5f6c5026e66c6325f2decf25300abede587fa4dc Author: Carl Worth Date: Thu Jul 28 15:38:50 2005 +0000 CC gnome-announce-list@gnome.org on cairo release announcements. ChangeLog | 5 +++++ RELEASING | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit 3dd93a930f618df42f71c5961764753d0d53306b Author: Carl Worth Date: Thu Jul 28 14:58:25 2005 +0000 Add -head to LIBPIXMAN_VERSION after tagging with SNAPSHOT_0_1_6. pixman/ChangeLog | 5 +++++ pixman/RELEASING | 2 +- pixman/configure.in | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit 6d8d18e2dcdb2c829ec25659c1397f258c6b5a6b Author: Carl Worth Date: Thu Jul 28 14:41:36 2005 +0000 Add notes for snapshot 0.1.6. Increment version to 0.1.6. pixman/ChangeLog | 6 ++++++ pixman/NEWS | 24 ++++++++++++++++++++++++ pixman/configure.in | 2 +- 3 files changed, 31 insertions(+), 1 deletions(-) commit 61e28ec71f5492671d633ccf9459b6654f33edd6 Author: Carl Worth Date: Thu Jul 28 12:45:26 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_6_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit b9861b3e877776c5fe5b8b30fe76ced8ff846923 Author: Carl Worth Date: Thu Jul 28 11:51:38 2005 +0000 Added notes for snapshot 0.6.0 Increment CAIRO_VERSION to 0.6.0 ChangeLog | 6 ++ NEWS | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 3 files changed, 153 insertions(+), 1 deletions(-) commit 0e0f2571a4e6a1d99f8a3fe6e357cb49a51c30e2 Author: Carl Worth Date: Thu Jul 28 11:46:01 2005 +0000 Remove const qualifiers that only make things happy with a from-cvs version of freetype. Now we should be back to being happy with a released version. ChangeLog | 11 +++++++++++ src/cairo-ft-font.c | 10 +++++----- 2 files changed, 16 insertions(+), 5 deletions(-) commit d4056b1d1570f1e7c8636a54d2cd1b2a2ca8eb9c Author: Carl Worth Date: Thu Jul 28 11:42:33 2005 +0000 Add missing cast. src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 08e810f5c1d2c71eb44a800ac6e4b334436aa5cf Author: Carl Worth Date: Thu Jul 28 11:41:37 2005 +0000 Remove text-antialias-subpixel-ref.png from the list since it doesn't exist yet. ChangeLog | 6 ++++++ test/Makefile.am | 1 - 2 files changed, 6 insertions(+), 1 deletions(-) commit 3f385a0330f4cf5775feada0cac1df9ef165a539 Author: Carl Worth Date: Thu Jul 28 11:34:47 2005 +0000 More doc/public/tmpl churn. ChangeLog | 4 ++++ doc/public/tmpl/cairo.sgml | 1 + 2 files changed, 5 insertions(+), 0 deletions(-) commit 1481fa5132ab66de40de270668024bc07ed64bcf Author: Carl Worth Date: Thu Jul 28 11:33:11 2005 +0000 Add text-antialias-{gray|none|subpixel}-ref.png so they get distributed. ChangeLog | 6 ++++++ test/Makefile.am | 3 +++ 2 files changed, 9 insertions(+), 0 deletions(-) commit e604017c77e5c4b755d447b6efdf489417002986 Author: Dave Beckett Date: Thu Jul 28 11:22:36 2005 +0000 Use cairo_surface_status(image) instead of testing for NULL from cairo_image_surface_create_from_png to enable testing when srcdir != builddir again. ChangeLog | 7 +++++++ test/cairo-test.c | 7 +++++-- 2 files changed, 12 insertions(+), 2 deletions(-) commit ddae93c72c15bca63931d3db6cfa2d2e8d368e7d Author: Carl Worth Date: Thu Jul 28 10:51:37 2005 +0000 Note that consistent error handling is done now. ChangeLog | 4 ++++ NEWS | 6 ++++++ ROADMAP | 7 ++----- 3 files changed, 12 insertions(+), 5 deletions(-) commit 6efd4bf4d5f0f788db4020facb556d5b6aac1e6e Author: Carl Worth Date: Thu Jul 28 10:47:40 2005 +0000 Fix to call _cairo_error and return 0 on surface-type mismatch. ChangeLog | 6 ++++++ src/cairo-image-surface.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit 1e66aee352d092cbd39cac196cdf1b3681ec4c17 Author: Owen Taylor Date: Thu Jul 28 10:43:27 2005 +0000 configure.in Makefile.am: Skip tests/ directory if libpng was disabled. (#3423, reported by Steve Chaplin) ChangeLog | 5 +++++ Makefile.am | 8 +++++++- configure.in | 2 ++ 3 files changed, 14 insertions(+), 1 deletions(-) commit a83124a3eeff1602c199a961b36d75a51ce96843 Author: Carl Worth Date: Thu Jul 28 10:41:08 2005 +0000 Fix so that one of three different error status values will be returned: CAIRO_STATUS_NO_MEMORY CAIRO_STATUS_FILE_NOT_FOUND CAIRO_STATUS_READ_ERROR Add new CAIRO_STATUS_FILE_NOT_FOUND. Add new _cairo_surface_nil_read_error and _cairo_surface_nil_file_not_found. Test the new FILE_NOT_FOUND error. ChangeLog | 21 +++++++++++++++++++++ src/cairo-png.c | 32 +++++++++++++++++++++----------- src/cairo-surface.c | 32 ++++++++++++++++++++++++++++++++ src/cairo.c | 4 +++- src/cairo.h | 4 +++- src/cairoint.h | 2 ++ test/create-from-png.c | 13 +++++++++++-- 7 files changed, 93 insertions(+), 15 deletions(-) commit fe44b2406d30fc89ac6579bdd749b5c76e9257d8 Author: Stuart Parmenter Date: Thu Jul 28 10:37:41 2005 +0000 src/cairo-win32-font.c src/cairo-win32-surface.c Use surface->base.status instead of just surface on cairo_win32_surface_t *s ChangeLog | 7 +++++++ src/cairo-win32-font.c | 4 ++-- src/cairo-win32-surface.c | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) commit cff61fbf0d85dfdebd8b522f8efda02ec2da412f Author: Owen Taylor Date: Thu Jul 28 10:24:59 2005 +0000 Disable PS surface build if no freetyp ChangeLog | 4 ++++ configure.in | 51 ++++++++++++++++++++++++++++----------------------- 2 files changed, 32 insertions(+), 23 deletions(-) commit 9c70498e72f86937e02101a13d02b429fb47efd2 Author: Owen Taylor Date: Thu Jul 28 10:15:35 2005 +0000 Pass -1 not 1 to RestoreDC to restore to the last SaveDC. (#3905, Stuart Parmenter ChangeLog | 6 ++++++ src/cairo-win32-font.c | 2 +- 2 files changed, 7 insertions(+), 1 deletions(-) commit 95beb7be6720230f65c2d2c642efd71cbbc92873 Author: Owen Taylor Date: Thu Jul 28 10:02:54 2005 +0000 Patch from Martin Kretzschmar , #3798 prevent sign-extension of masks.*_mask on 64bit architectures. ditto. ChangeLog | 9 +++++++++ src/cairo-xcb-surface.c | 8 ++++---- src/cairo-xlib-surface.c | 8 ++++---- 3 files changed, 17 insertions(+), 8 deletions(-) commit 02c6aec91df93f523768e8bb6ff20c0fc0bc18fb Author: Owen Taylor Date: Thu Jul 28 09:54:03 2005 +0000 dest_image) src/cairo-quartz-surface.c (_cairo_quartz_surface_acquire_dest_image) src/cairo-xcb-surface.c (_cairo_xcb_surface_acquire_source,dest_image): src/cairo-xlib-surface.c (_cairo_xlib_surface_acquire_source,dest_image): Set image_extra to NULL to avoid purify warnings. (#3777, Stuart Parmenter) ChangeLog | 8 ++++++++ src/cairo-image-surface.c | 4 +++- src/cairo-quartz-surface.c | 1 + src/cairo-xcb-surface.c | 2 ++ src/cairo-xlib-surface.c | 4 +++- 5 files changed, 17 insertions(+), 2 deletions(-) commit 5d7c796c1830663772dd681026e2d5dd952826b8 Author: Carl Worth Date: Thu Jul 28 09:46:38 2005 +0000 Remove all create_in_error functions as they were just muddling up the memory management semantics: _cairo_path_data_create_in_error _cairo_pattern_create_in_error _cairo_surface_create_in_error Don't bother with extra check of other->status to anticipate and try to prevent cairo_surface_create_similar from returning through cairo_surface_create_in_error. Just return &_cairo_surface|pattern|path_nil rather than _cairo_surface|pattern|path_create_in_error. After checking surface->status from a cairo__surface_create function, just return CAIRO_STATUS_NO_MEMORY since that's the only error we'll get from one of these create functions. Remove unnecessary check for gstate == NULL; Fix old check for image == NULL instead of image->base.status. Add missing check of surface->image_base.status after creating surface->image. Add missing check of surface->base.status after creating surface. ChangeLog | 67 +++++++++++++++++++++++++++++++++++++++ doc/public/tmpl/cairo-font.sgml | 1 + src/cairo-ft-font.c | 6 ++- src/cairo-glitz-surface.c | 16 +++++----- src/cairo-gstate.c | 25 ++------------ src/cairo-image-surface.c | 4 +- src/cairo-path-data-private.h | 5 +-- src/cairo-path-data.c | 34 +------------------- src/cairo-pattern.c | 37 ++-------------------- src/cairo-png.c | 20 +++++++----- src/cairo-ps-surface.c | 8 ++-- src/cairo-quartz-surface.c | 5 +++ src/cairo-surface.c | 46 +++++++++++--------------- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 7 ++-- src/cairo-xcb-surface.c | 6 +++- src/cairo-xlib-surface.c | 12 +++++-- src/cairo.c | 44 +++++++++++-------------- src/cairoint.h | 8 +--- 19 files changed, 173 insertions(+), 180 deletions(-) commit b9fe1b74665e528e6114bd833028a8f62ecfa869 Author: Owen Taylor Date: Thu Jul 28 09:29:46 2005 +0000 src/cairo-font.c src/cairoint.h: Define _cairo_font_face_nil. (cairo_font_face_reference, cairo_font_face_destroy cairo_font_face_set_user_data): Handle a nil font face. (cairo_font_face_status): New function. src/cairo-ft-font.c (cairo_ft_font_face_create_for_pattern): src/cairo-ft-font.c (cairo_ft_font_face_create_for_ft_face): src/cairo-win32-font.c (cairo_win32_font_face_create_for_logfontw): Return _cairo_font_face_nil on out-of-memory. Check return of _cairo_simple_font_face_create(). Error out if font_face has a status. Handle a nil surface. ChangeLog | 23 +++++++++++++++++++ src/cairo-font.c | 57 ++++++++++++++++++++++++++++++++++++++++++------ src/cairo-ft-font.c | 26 ++++++++++++++++----- src/cairo-gstate.c | 21 +++++++++++------ src/cairo-surface.c | 3 ++ src/cairo-win32-font.c | 6 +++- src/cairo.h | 3 ++ src/cairoint.h | 3 ++ 8 files changed, 120 insertions(+), 22 deletions(-) commit d7699f0c072a6820007280a167b86a95adf8a54e Author: Owen Taylor Date: Wed Jul 27 19:13:39 2005 +0000 Remove text-antialias-none which is now fixed. No longer xfail. ChangeLog | 7 +++++++ test/Makefile.am | 1 - test/text-antialias-none.c | 3 +-- 3 files changed, 8 insertions(+), 3 deletions(-) commit 7143d8b7aee74ed4d75985158bf3dda147f3d21d Author: Owen Taylor Date: Wed Jul 27 16:23:11 2005 +0000 Go back to returning NULL. src/cairoint.h src/cairo-ft-font.c: Stop exporting _cairo_scaled_font_nil, since we dont' need it publically any more. return surface->status not status. (Fixes warning) ChangeLog | 13 +++++++++++++ src/cairo-font.c | 2 +- src/cairo-ft-font.c | 4 ++-- src/cairo-surface.c | 2 +- src/cairo-win32-font.c | 6 ++---- src/cairoint.h | 2 -- 6 files changed, 19 insertions(+), 10 deletions(-) commit 2b5d9c8e007f4198b1c48bce53491842f065a759 Author: Carl Worth Date: Wed Jul 27 15:39:34 2005 +0000 Add CAIRO_STATUS_INVALID_CONTENT, CAIRO_STATUS_INVALID_FORMAT, and CAIRO_STATUS_INVALID_VISUAL. Change functions to return type of void: cairo_scaled_font_extents cairo_surface_finish Add new functions to query object status: cairo_scaled_font_status cairo_surface_status Implementation of new error handling scheme for cairo_surface_t and cairo_scaled_font_t. Track change in return value of cairo_surface_finish. ChangeLog | 42 +++++ doc/public/tmpl/cairo-surface.sgml | 1 + doc/public/tmpl/cairo.sgml | 3 + src/cairo-array.c | 5 + src/cairo-atsui-font.c | 3 - src/cairo-font.c | 113 ++++++++++++- src/cairo-ft-font.c | 35 +++-- src/cairo-glitz-surface.c | 63 +++++--- src/cairo-gstate.c | 38 +++-- src/cairo-image-surface.c | 76 +++++---- src/cairo-meta-surface.c | 6 +- src/cairo-path-data.c | 2 + src/cairo-pattern.c | 83 ++++++++-- src/cairo-pdf-surface.c | 24 ++- src/cairo-png.c | 38 +++-- src/cairo-ps-surface.c | 69 +++++---- src/cairo-quartz-surface.c | 17 +-- src/cairo-surface.c | 322 +++++++++++++++++++++++++++--------- src/cairo-win32-font.c | 17 ++- src/cairo-win32-surface.c | 42 +++-- src/cairo-xcb-surface.c | 33 +++- src/cairo-xlib-surface.c | 52 ++++-- src/cairo.c | 323 +++++++++++++++++++----------------- src/cairo.h | 14 ++- src/cairoint.h | 28 +++- test/surface-finish-twice.c | 9 +- 26 files changed, 994 insertions(+), 464 deletions(-) commit c884c4c541abe380500e24a55ec017677d56db19 Author: Owen Taylor Date: Wed Jul 27 15:04:03 2005 +0000 Turn off antialiasing for rendering to alpha surfaces. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) commit 7b2b9df4e7b3c76b4dd40f865d7b6c55d3a0747c Author: Owen Taylor Date: Wed Jul 27 14:11:58 2005 +0000 Fix units for stride return to be FbStip-sized. : ---------------------------------------------------------------------- pixman/ChangeLog | 5 +++++ pixman/src/icint.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 255913de9ef5da40604d55ca8d0d53ac606f7710 Author: Carl Worth Date: Wed Jul 27 13:28:15 2005 +0000 Note that the XFAIL tests all need to be fixed before 1.0. Add three new tests for testing the various antialiasing options for text rendering. ChangeLog | 15 +++++++ ROADMAP | 4 ++ test/.cvsignore | 3 + test/Makefile.am | 8 ++++ test/text-antialias-gray-ref.png | Bin 0 -> 723 bytes test/text-antialias-gray.c | 77 +++++++++++++++++++++++++++++++++++ test/text-antialias-none-ref.png | Bin 0 -> 277 bytes test/text-antialias-none.c | 78 ++++++++++++++++++++++++++++++++++++ test/text-antialias-subpixel.c | 82 ++++++++++++++++++++++++++++++++++++++ 9 files changed, 267 insertions(+), 0 deletions(-) commit 8cb451962b4be046024264fd6251f26ea1bf033c Author: Carl Worth Date: Wed Jul 27 09:23:29 2005 +0000 Fix typo that caused cairo_image_surface_create_from_png_stream to segfault. Closes bug #3863 (thanks to Steve Chaplin). Add a test to actually call cairo_image_surface_create_from_png_stream. ChangeLog | 13 +++++ src/cairo-png.c | 2 +- test/.cvsignore | 1 + test/Makefile.am | 3 + test/create-from-png-stream-ref.png | Bin 0 -> 100 bytes test/create-from-png-stream.c | 95 +++++++++++++++++++++++++++++++++++ test/create-from-png.c | 4 +- 7 files changed, 116 insertions(+), 2 deletions(-) commit e859afecceb9e22ab8f42ca533c37a71b7ccec51 Author: Owen Taylor Date: Wed Jul 27 06:45:37 2005 +0000 Deal with glyphs with entry->im->image NULL. (This can happen if fonts have size-zero bitmaps for some characters, for example) (http://bugzilla.gnome.org/show_bug.cgi?id=311709, Sangu Kim) ChangeLog | 7 ++++ src/cairo-xlib-surface.c | 73 +++++++++++++++++++++++++++++++--------------- 2 files changed, 56 insertions(+), 24 deletions(-) commit e056a72ec8316fa586d18d771923ace44c56291c Author: Owen Taylor Date: Wed Jul 27 04:07:46 2005 +0000 FreeType bitmaps may only be padded out to 8-bit boundaries, not 32-bit boundaries. (_render_glyph_bitmap): Fix sign error in using glyphslot->bitmap_left ChangeLog | 6 ++++++ src/cairo-ft-font.c | 21 +++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) commit 1467168326b57f11ae7080e8d9fc3816b6dc3a3c Author: David Reveman Date: Tue Jul 26 22:36:00 2005 +0000 Fix infinite loop bug in xlib backend ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit ea1218a434fb4077d27a4d8310e4ce3415102c58 Author: Carl Worth Date: Mon Jul 25 16:23:05 2005 +0000 Replace all occurences of refcount with ref_count. Replace refcounted with reference-counted. ChangeLog | 12 ++++++++++++ doc/public/language-bindings.xml | 2 +- src/cairo-font.c | 20 ++++++++++---------- src/cairo-ft-font.c | 4 ++-- src/cairo-glitz-surface.c | 10 +++++----- src/cairo-pdf-surface.c | 10 +++++----- src/cairoint.h | 6 +++--- 7 files changed, 38 insertions(+), 26 deletions(-) commit 85b74d82164e7908842d42bb1b11e8cf8c876b82 Author: Owen Taylor Date: Mon Jul 25 12:29:23 2005 +0000 src/cairo.[ch] src/cairo-gstate-private.h src/cairo-gstate.c src/cairoint.c: Add cairo_{get,set}_font_options(). Add cairo-xlib-private.h Update reviewed by: cworth ChangeLog | 11 ++++++++ doc/public/Makefile.am | 1 + doc/public/cairo-sections.txt | 2 + doc/public/tmpl/cairo-xlib-xrender.sgml | 1 + doc/public/tmpl/cairo-xlib.sgml | 1 + doc/public/tmpl/cairo.sgml | 18 +++++++++++++ src/cairo-font-options.c | 2 +- src/cairo-gstate-private.h | 1 + src/cairo-gstate.c | 22 ++++++++++++++++ src/cairo.c | 43 +++++++++++++++++++++++++++++++ src/cairo.h | 8 ++++++ src/cairoint.h | 8 ++++++ 12 files changed, 117 insertions(+), 1 deletions(-) commit fcd8867a47ce77163def423a37bb517870f6cc35 Author: Owen Taylor Date: Sun Jul 24 05:18:15 2005 +0000 Fix size of allocated buffer for vertical subpixel rendering. (Reported by Fryderyk Dziarmagowski, http://bugzilla.gnome.org/show_bug.cgi?id=310935) (_get_pattern_load_flags): Fix a problem where we were OR'ing multiple FT_LOAD_* flags together. Fix reversed check for subpixel or not. ChangeLog | 11 +++++++++++ src/cairo-ft-font.c | 20 +++++++++++++------- src/cairo-xlib-screen.c | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) commit 55e2a0a03128bff86765b14179dd87af792dc4cc Author: Carl Worth Date: Sat Jul 23 10:05:54 2005 +0000 Testing UseNewInfoFtmStrings hack commit c8d754803181105c53cd389c0dd762dd473630fb Author: Carl Worth Date: Sat Jul 23 09:54:54 2005 +0000 Testing UseNewInfoFtmStrings hack commit d527428bb6775c82b3c0cc6cbb364f08317a3d17 Author: Malcolm Tredinnick Date: Sat Jul 23 09:48:13 2005 +0000 Slight change to previous commit based on feedback from cworth. src/cairo.h | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) commit 563dddd81cc06f1d17c1a6880b4e6a3e5d05da97 Author: Malcolm Tredinnick Date: Sat Jul 23 09:36:00 2005 +0000 Add some missing parameters for API docs. ChangeLog | 5 +++++ src/cairo-ft-font.c | 9 +++++---- src/cairo.h | 33 +++++++++++++++++++++++++++------ 3 files changed, 37 insertions(+), 10 deletions(-) commit 9fb898898ed3bc6458a365eac43861f1a77a08d0 Author: Owen Taylor Date: Sat Jul 23 05:37:23 2005 +0000 src/cairo-xlib-private.h src/cairo-xlib-screen.c: Switch to using Screen * not screen number to match surface code. Get the screen info for the right screen for the surface. ChangeLog | 8 ++++++++ src/cairo-xlib-private.h | 4 ++-- src/cairo-xlib-screen.c | 5 +++-- src/cairo-xlib-surface.c | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) commit 399b00a99b2bbc1c56a05974c936aa69a08021f5 Author: Owen Taylor Date: Fri Jul 22 15:15:15 2005 +0000 Protect against division by zero in various places. (http://bugzilla.gnome.org/show_bug.cgi?id=311299, reported by Ali Akcaag ChangeLog | 5 +++ src/cairo-ft-font.c | 70 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 55 insertions(+), 20 deletions(-) commit 5fb1c8033358f45c523b07be6b7e36c91e772a58 Author: Owen Taylor Date: Fri Jul 22 07:15:57 2005 +0000 Patch from Tor Lillqvist Define TT_PRIM_CSPLINE if it wasn't in the headers. (_get_system_quality): Add missing variable smoothing_type. ChangeLog | 8 ++++++++ src/cairo-win32-font.c | 4 ++++ 2 files changed, 12 insertions(+), 0 deletions(-) commit e9c321e66bb2b813783b1504011eb70bf8bdb3f6 Author: Carl Worth Date: Fri Jul 22 06:20:53 2005 +0000 Initial import of preliminary tutorial pieces. doc/tutorial/slides/.cvsignore | 7 + doc/tutorial/slides/Makefile | 7 + doc/tutorial/slides/cairo-blank.svg | 487 ++++++++++++++++++++++++ doc/tutorial/slides/cairo-code.svg | 508 ++++++++++++++++++++++++++ doc/tutorial/slides/cairo-separator.svg | 491 +++++++++++++++++++++++++ doc/tutorial/slides/cairo-title.svg | 373 +++++++++++++++++++ doc/tutorial/slides/cairo.svg | 508 ++++++++++++++++++++++++++ doc/tutorial/slides/circle-cairo-large.png | Bin 0 -> 3362 bytes doc/tutorial/slides/circle-cairo.png | Bin 0 -> 1429 bytes doc/tutorial/slides/circle-ooo-large.png | Bin 0 -> 1491 bytes doc/tutorial/slides/circle-ooo.png | Bin 0 -> 383 bytes doc/tutorial/slides/expander-fuzzy-large.png | Bin 0 -> 1300 bytes doc/tutorial/slides/expander-fuzzy.png | Bin 0 -> 296 bytes doc/tutorial/slides/expander-sharp-large.png | Bin 0 -> 929 bytes doc/tutorial/slides/expander-sharp.png | Bin 0 -> 183 bytes doc/tutorial/slides/fuzzies.svg | 11 + doc/tutorial/slides/jaggies.svg | 11 + doc/tutorial/slides/tutorial.xml | 468 ++++++++++++++++++++++++ doc/tutorial/src/.cvsignore | 7 + doc/tutorial/src/Makefile | 30 ++ doc/tutorial/src/cairo-tutorial-gtk.h | 116 ++++++ doc/tutorial/src/cairo-tutorial-pdf.h | 74 ++++ doc/tutorial/src/cairo-tutorial-png.h | 74 ++++ doc/tutorial/src/cairo-tutorial-xlib.h | 219 +++++++++++ doc/tutorial/src/cairo-tutorial.h | 41 ++ doc/tutorial/src/circle.c | 22 ++ doc/tutorial/src/expander.c | 16 + 27 files changed, 3470 insertions(+), 0 deletions(-) commit dd9d984ab90904f47faaf6d3de900c136add010e Author: Carl Worth Date: Fri Jul 22 02:04:59 2005 +0000 Get the case right. It's cairo, not Cairo. ChangeLog | 4 ++++ src/cairoint.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit a7b38c6826fe6f9d9a02ed94ddd5d955313f9c78 Author: Carl Worth Date: Thu Jul 21 21:02:11 2005 +0000 Note that sub-pixel text rendering is done now. ChangeLog | 4 ++++ ROADMAP | 7 +++---- 2 files changed, 7 insertions(+), 4 deletions(-) commit 857c9fe1c4808ffe534de7eff0d3479cc439fbea Author: Owen Taylor Date: Thu Jul 21 18:12:21 2005 +0000 The FT_LOAD_TARGET_* flags aren't separate bitfields, but rather an embedded subfield, so test with FT_LOAD_TARGET_MODE (val->key.flags) == FT_RENDER_LCD, and similar. ChangeLog | 6 ++++++ src/cairo-ft-font.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit 3c0bfb39758172cca78611338de1848ea9595522 Author: Keith Packard Date: Thu Jul 21 14:31:28 2005 +0000 Add ARGB glyph support. Change Bi-level glyph support to use A1 format. Support bit/byte swapping of glyph image data in the Xlib backend. reviewed by: cworth, otaylor ChangeLog | 24 ++++ src/cairo-ft-font.c | 325 +++++++++++++++++++++++++++++++++++++++------- src/cairo-xlib-surface.c | 218 ++++++++++++++++++++++++++++--- src/cairoint.h | 4 - 4 files changed, 504 insertions(+), 67 deletions(-) commit a3ad7dc0b9f3495d7797653ba2ffb326e92393fa Author: Carl Worth Date: Thu Jul 21 11:26:31 2005 +0000 Whitespace fixes. ChangeLog | 5 +++++ src/cairo-ft.h | 5 +++-- src/cairo-quartz.h | 6 +++--- 3 files changed, 11 insertions(+), 5 deletions(-) commit 9c6299c164e567311816a129125cf3a86148c018 Author: David Reveman Date: Thu Jul 21 08:50:20 2005 +0000 Fix empty glyph issue in glitz backend ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 9 ++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) commit b3dfbe94c3ec7713904cf5bd1872a0480f96f03a Author: Keith Packard Date: Thu Jul 21 08:45:57 2005 +0000 Add cairo_xlib_surface_set_drawable which changes the target drawable for an xlib cairo_t to another which shares the same format, screen and display. reviewed by: otaylor, cworth ChangeLog | 11 +++++++++++ ROADMAP | 2 +- src/cairo-xlib-surface.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-xlib.h | 6 ++++++ 4 files changed, 62 insertions(+), 1 deletions(-) commit 464ce69689045614a0c44037c77e1261c3fecda5 Author: Carl Worth Date: Thu Jul 21 07:41:20 2005 +0000 Note that cairo_font_options_t is done now. ChangeLog | 4 ++++ ROADMAP | 10 +++------- 2 files changed, 7 insertions(+), 7 deletions(-) commit 075cf23cdc071b170e591fd07ff6c272d561d3ee Author: Owen Taylor Date: Thu Jul 21 06:52:13 2005 +0000 src/cairo-font-options.c src/cairo.h src/cairoint.h src/Makefile.am: Add an opaque cairo_font_options_t structure. src/cairo-font.c src/cairo.h src/cairoint.h: Add a cairo_font_options_t object to cairo_scaled_font_create(). src/cairo-surface.c src/cairoint.h: Add virtualized cairo_surface_get_font_options() to get the font options for a surface. Adapt to cairo_scaled_font_create() change. Add an implementation of get_font_options() that turns off metrics hinting. src/cairo-xlib-screen.c src/cairo-xlib-private.h: Add a "screen info" structure that holds (for now) information about the default font options for the screen. Implement get_font_options() src/cairo-ft-font.c src/cairo-ft.h: Add functions to apply a cairo_font_options_t to a FcPattern or get the load flags for a cairo_font_options_t. Adapt to font options additions. Add support for non-antialiased rendering of scalable fonts. Add support for turning off metrics hinting. Adapt to font options additions. doc/public/Makefile.am doc/public/cairo-sections.txt: Update. reviewed by: cworth ChangeLog | 37 +++ doc/public/Makefile.am | 3 + doc/public/cairo-sections.txt | 29 ++- doc/public/tmpl/cairo-font.sgml | 184 +++++++++++++ doc/public/tmpl/cairo-ft.sgml | 9 + doc/public/tmpl/cairo-pattern.sgml | 23 ++ doc/public/tmpl/cairo-surface.sgml | 13 +- doc/public/tmpl/cairo.sgml | 27 ++- src/Makefile.am | 3 +- src/cairo-font-options.c | 352 +++++++++++++++++++++++++ src/cairo-font.c | 32 ++- src/cairo-ft-font.c | 504 ++++++++++++++++++++++++++---------- src/cairo-ft.h | 3 + src/cairo-gstate.c | 5 +- src/cairo-pdf-surface.c | 13 +- src/cairo-surface.c | 27 ++ src/cairo-win32-font.c | 101 +++++--- src/cairo-xlib-private.h | 54 ++++ src/cairo-xlib-screen.c | 345 ++++++++++++++++++++++++ src/cairo-xlib-surface.c | 22 ++- src/cairo.h | 154 +++++++++++- src/cairoint.h | 17 ++ 22 files changed, 1762 insertions(+), 195 deletions(-) commit a43c9eb7b0b73493735ffa176154073604da33e6 Author: Carl Worth Date: Thu Jul 21 00:35:07 2005 +0000 Finally grepped through and fixed up the last remaining calls to cairo_pattern_release_surface. ChangeLog | 11 +++++++++ src/cairo-glitz-surface.c | 56 ++++++++++++++++++++++++++------------------ 2 files changed, 44 insertions(+), 23 deletions(-) commit 133d7f0b441d3ba255a9a36163e7446f24f7601b Author: Carl Worth Date: Wed Jul 20 23:30:08 2005 +0000 Fix yet another file that I missed when I made the cairo_pattern_release_surface change. You would think that I would have grepped for all uses of this function by now. ChangeLog | 8 ++++++++ src/cairo-xcb-surface.c | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) commit 63331a8d9218424ecf176b0b34a53fc8723fede9 Author: Carl Worth Date: Wed Jul 20 21:54:35 2005 +0000 Mark cairo_xlib_surface_create as complete. Move cairo_xlib_surface_set_drawable from 0.6 to 1.0 since it is an API addition, not a change. ChangeLog | 6 ++++++ ROADMAP | 16 ++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) commit 689fdfb6ea7460aec6283414a79bbf17a2d03eae Author: Carl Worth Date: Wed Jul 20 19:23:19 2005 +0000 Fix macro to not consider CAIRO_FORMAT_ARGB32 (==0) as a valid cairo_content_t. ChangeLog | 7 +++++++ src/cairo.h | 8 +++++--- 2 files changed, 12 insertions(+), 3 deletions(-) commit 88cf98fe334577fc3ecd84e179479b3b60f55c91 Author: Keith Packard Date: Wed Jul 20 18:52:31 2005 +0000 Add Screen* arguments to: cairo_xlib_surface_create_with_xrender_format cairo_xlib_surface_create_for_bitmap Required to correctly identify when two Xlib surfaces are compatible with Core and Render rendering requests. cairo_xlib_surface_create can determine the screen given the required Visual * reviewed by: otaylor ChangeLog | 27 +++++++++++ src/cairo-xlib-surface.c | 116 ++++++++++++++++++++++++++++++++------------- src/cairo-xlib-xrender.h | 1 + src/cairo-xlib.h | 1 + test/cairo-test.c | 1 + 5 files changed, 112 insertions(+), 34 deletions(-) commit d1b1167ec5f5d89bec9f27f1e253cad0baba3b98 Author: Carl Worth Date: Wed Jul 20 18:31:17 2005 +0000 Move all API changes from 1.0 to 0.6. Other 1.0 API issues are strictly additions. ChangeLog | 5 +++ ROADMAP | 121 +++++++++++++++++++------------------------------------------ 2 files changed, 43 insertions(+), 83 deletions(-) commit b0b2f8021a6eb60c3b0d434f65f1c636540aeeb6 Author: Carl Worth Date: Mon Jul 18 14:36:39 2005 +0000 Add valgrind suppressions for libpng/libz use of uninitialized data. There are clearly bugs here that are not cairo's fault as zeroing the buffer before writing the png image actually causes more errors(\!). And, notably, setting all the data to random bytes usually makes the errors go away. Change the check-valgrind target to include the .valgrind-suppresions file and to tee output into valgrind.log. ChangeLog | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cd587375e327da08b5da01beccb1ebb8bb2d1e3d Author: Carl Worth Date: Mon Jul 18 14:35:54 2005 +0000 Add valgrind suppressions for libpng/libz use of uninitialized data. There are clearly bugs here that are not cairo's fault as zeroing the buffer before writing the png image actually causes more errors(\!). And, notably, setting all the data to random bytes usually makes the errors go away. Change the check-valgrind target to include the .valgrind-suppresions file and to tee output into valgrind.log. ChangeLog | 13 +++++++++++++ test/.valgrind-suppressions | 26 ++++++++++++++++++++++++++ test/Makefile.am | 2 +- 3 files changed, 40 insertions(+), 1 deletions(-) commit 0adea66c73bb8dec0e45a900815d98c029221219 Author: Carl Worth Date: Mon Jul 18 11:51:42 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_2. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 0e40baa9a7bd08abd15bfdc666c6e2d21d791e82 Author: Carl Worth Date: Mon Jul 18 09:23:33 2005 +0000 Fix the quartz backend so that it at least compiles again. This change is slipped in before 0.5.2 was pushed out and tagged. ChangeLog | 8 ++++++++ src/cairo-quartz-surface.c | 11 ++++------- 2 files changed, 12 insertions(+), 7 deletions(-) commit b65393917cade57d65ef92aa3510d7e3724f476d Author: Carl Worth Date: Mon Jul 18 08:31:24 2005 +0000 Added notes for snapshot 0.5.2 Increment CAIRO_VERSION to 0.5.2 ChangeLog | 6 ++++ NEWS | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 3 files changed, 81 insertions(+), 1 deletions(-) commit f0fae1d1bcde4f469cf6e00272fd4530875d283f Author: Carl Worth Date: Mon Jul 18 08:23:21 2005 +0000 Fix leak of pattern. ChangeLog | 5 +++++ test/composite-integer-translate-over-repeat.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 751e059f5c506138c478fbcc2e9dfe8e92aaa3ab Author: Carl Worth Date: Mon Jul 18 08:04:16 2005 +0000 Note some progress. New helper function to help create an image surface from a PNG file, while taking the srcdir environment variable into consideration. Rename the pattern creating helper function to match. Use new cairo_test_create_surface_from_png so that non-srcdir builds work. Track change in cairo_test_create_pattern_from_png. ChangeLog | 19 +++++++++++++++++++ ROADMAP | 8 ++++---- test/cairo-test.c | 16 +++++++++++++--- test/cairo-test.h | 6 ++++-- test/composite-integer-translate-over.c | 2 +- test/composite-integer-translate-source.c | 2 +- test/mask.c | 2 +- test/trap-clip.c | 2 +- 8 files changed, 44 insertions(+), 13 deletions(-) commit 584954859ead08491cd5ed04aec54aae6b1048b8 Author: Carl Worth Date: Sun Jul 17 22:15:57 2005 +0000 Add note that Xlib caches need to be cleand up on close of display. BUGS | 7 +++++++ ChangeLog | 5 +++++ 2 files changed, 12 insertions(+), 0 deletions(-) commit c36fd95f6ed1dbdb9c7053f8ba5c58623d6095b8 Author: Jeff Muizelaar Date: Sat Jul 16 11:27:32 2005 +0000 Add call to fbCompositeSrcSrc_nxn that I missed. pixman/ChangeLog | 5 +++++ pixman/src/ic.c | 6 ++++++ 2 files changed, 11 insertions(+), 0 deletions(-) commit d3661b0d53bf0c3c4132d8d02f8527019d65fc6b Author: Carl Worth Date: Fri Jul 15 13:59:47 2005 +0000 Remove cairo_private qualifier from .c files, (we only need it in the .h files). ChangeLog | 6 ++++++ src/cairo-font.c | 2 +- src/cairo-surface.c | 18 +++++++++--------- 3 files changed, 16 insertions(+), 10 deletions(-) commit 8ad8aa63605610eaec78cdbfea321148c02be331 Author: Vladimir Vukicevic Date: Fri Jul 15 13:45:19 2005 +0000 Use XCopyArea when possible, for optimization and bug workaround. Exercise XCopyArea, XRenderComposite, and XSetTile/XFillRectangle paths for _cairo_xlib_surface_composite ChangeLog | 10 ++ ROADMAP | 2 +- src/cairo-xlib-surface.c | 117 ++++++++++++++----- test/.cvsignore | 3 + test/Makefile.am | 11 ++- test/composite-integer-translate-over-ref.png | Bin 0 -> 15397 bytes ...composite-integer-translate-over-repeat-ref.png | Bin 0 -> 401 bytes test/composite-integer-translate-over-repeat.c | 61 ++++++++++ test/composite-integer-translate-over.c | 42 +++++++ test/composite-integer-translate-source-ref.png | Bin 0 -> 16385 bytes test/composite-integer-translate-source.c | 42 +++++++ 11 files changed, 255 insertions(+), 33 deletions(-) commit 2534057cb5df78eb5aa79c24317e4a97f6c0f2c6 Author: Carl Worth Date: Fri Jul 15 10:39:59 2005 +0000 Add new check-valgrind target for running the test suite under the influence of valgrind. Fix memory leak when reference image is not found. ChangeLog | 8 ++++++++ test/Makefile.am | 3 +++ test/buffer-diff.c | 4 +++- 3 files changed, 14 insertions(+), 1 deletions(-) commit 07d09acf2a9a8341f281cfe235325a52a20cd750 Author: Carl Worth Date: Fri Jul 15 01:38:38 2005 +0000 Fix a few memory leaks (missing cairo_pattern_destroy in 3 places). ChangeLog | 6 ++++++ test/mask.c | 5 ++++- 2 files changed, 10 insertions(+), 1 deletions(-) commit 3a053c1e58962c3fb9eae11954651270244cabae Author: Carl Worth Date: Fri Jul 15 01:05:56 2005 +0000 Fix memory leak, (missing _cairo_pattern_fini). ChangeLog | 5 +++++ src/cairo-gstate.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 89a9771b60906092cca1b5e7582be3ae140b9bc2 Author: Carl Worth Date: Fri Jul 15 00:56:58 2005 +0000 Remove errant line of code that was inadvertently committed recently. ChangeLog | 5 +++++ test/cairo-test.c | 3 --- 2 files changed, 5 insertions(+), 3 deletions(-) commit 3e05319bf8584d88fc34825d79c138f0e9f8a297 Author: Carl Worth Date: Thu Jul 14 17:55:58 2005 +0000 Fix leak of surface. ChangeLog | 4 ++++ test/surface-finish-twice.c | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 6df1baa395ad11c1a22dd5279d6281b3ee149e94 Author: Carl Worth Date: Thu Jul 14 17:52:17 2005 +0000 Call _cairo_array_fini on the several array objects to patch memory leaks. ChangeLog | 6 ++++++ src/cairo-pdf-surface.c | 10 ++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit df181620c0e6ca889013435d1ae5d0ffddfeec9d Author: Carl Worth Date: Thu Jul 14 16:56:08 2005 +0000 Eek. Yet _more_ fixups for _cairo_pattern_release_surface missed earlier. ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) commit 174056f7364892b07177f9e7cbda2821ca6c9ac9 Author: Stuart Parmenter Date: Thu Jul 14 16:50:58 2005 +0000 blue and green values were swapped in the DO_SOURCE case. ChangeLog | 5 +++++ src/cairo-win32-surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 40edca337e3976ddca98caafcbab950000e66880 Author: Carl Worth Date: Thu Jul 14 16:18:39 2005 +0000 Rewrite to use cairo_image_surface_create_from_png rather than custom read_png_argb32. In addition to being simpler, this eliminates the leak of the image data buffer. Add calls to cairo_pattern_destroy to close two memory leaks. ChangeLog | 10 ++++++++++ test/cairo-test.c | 19 ++++++++----------- test/trap-clip.c | 2 ++ 3 files changed, 20 insertions(+), 11 deletions(-) commit d8500060a972de9ca0f202d9cfb73460446dfc17 Author: Carl Worth Date: Thu Jul 14 15:47:18 2005 +0000 Fix up one more call to _cairo_pattern_release_surface missed in the previous commit. ChangeLog | 6 ++++++ src/cairo-pattern.c | 50 ++++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 26 deletions(-) commit 3cd006bb2b3986aefaf6cf9002735c430e4bc172 Author: Carl Worth Date: Thu Jul 14 15:10:47 2005 +0000 Fix to accept a cairo_pattern_t rather than a cairo_surface_t as the primary argument. Track change in _cairo_pattern_release_surface and also pass the appropriate pattern for each acquired surface. The previous backend mismatch was causing memory leaks. Remove stale comment. Add missing fclose to keep valgrind happy about memory leaks. ChangeLog | 19 +++++++++++++++++++ src/cairo-image-surface.c | 6 +++--- src/cairo-pattern.c | 13 +++++++++---- src/cairo-xlib-surface.c | 1 - src/cairoint.h | 2 +- test/xlib-surface.c | 4 ++++ 6 files changed, 36 insertions(+), 9 deletions(-) commit 288f0f7f49849c74c1025804ecb7076b3485b8f2 Author: Carl Worth Date: Thu Jul 14 12:50:28 2005 +0000 Make the per-backend test results print XFAIL rather than FAIL for expected failures. ChangeLog | 6 ++++++ test/cairo-test.c | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) commit 6f6c9196c8248f469a9f3b54f886816430c86ac4 Author: Carl Worth Date: Thu Jul 14 12:25:41 2005 +0000 Fix comment describing test result. It's not enough that all tested backends are successful. We also require that at least one backend is actually tested. ChangeLog | 7 +++++++ test/cairo-test.c | 3 ++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 456e3ffc4ddd496823dce6551b0545ce5c9530d4 Author: Carl Worth Date: Thu Jul 14 12:20:42 2005 +0000 Don't consider a test to fail if it can't create a surface at all (eg. no X server is available). Instead mark this backend as untested and only consider the overall test a success if all tested backend are successful. ChangeLog | 8 ++++++++ test/cairo-test.c | 31 ++++++++++++++++++++++++++----- test/cairo-test.h | 3 ++- 3 files changed, 36 insertions(+), 6 deletions(-) commit 0c3ee348f890879154089f23ea37bfaa2bfcd87a Author: Carl Worth Date: Thu Jul 14 11:48:40 2005 +0000 Add missing (putatively unreachable) return value. ChangeLog | 5 +++++ src/cairo-ps-surface.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 14ea7b583b90142bcec829716a0077d969b847e3 Author: Carl Worth Date: Thu Jul 14 11:45:39 2005 +0000 Remove the copying of the region. This was a workaround for a missing copy bug in libpixman that has since been fixed. So now it was just a memory leak. ChangeLog | 7 +++++++ src/cairo-image-surface.c | 15 +-------------- 2 files changed, 8 insertions(+), 14 deletions(-) commit 171b053347c83d2a1f234b553510ef3f72f22f29 Author: Carl Worth Date: Thu Jul 14 11:41:00 2005 +0000 Whitespace fix. (pixman_image_destroy): Fix leak of the clip region associated with an image. (NOTE: xserver/render doesn't have the same bug since it has FreePicture that calls into both DestroyPicture and DestroyPictureClip separately). pixman/ChangeLog | 8 ++++++++ pixman/src/icimage.c | 4 +++- 2 files changed, 11 insertions(+), 1 deletions(-) commit 513e9e6fe5bbd8dda3e90c89d200f34104b27646 Author: Carl Worth Date: Thu Jul 14 11:24:56 2005 +0000 Patch memory leak of png_info object. ChangeLog | 5 +++++ src/cairo-png.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 574b702029894f035791a99600130b16f30ddd55 Author: Carl Worth Date: Thu Jul 14 11:17:12 2005 +0000 Rename create-for-png test to create-from-png to match the naming of the cairo_image_surface_create_from_png function. ChangeLog | 10 ++++++ test/.cvsignore | 2 +- test/Makefile.am | 6 ++-- test/create-for-png-ref.png | Bin 100 -> 0 bytes test/create-for-png.c | 69 ------------------------------------------- test/create-from-png.c | 4 +- 6 files changed, 16 insertions(+), 75 deletions(-) commit c41e9d698f5dbc318819fb958618b704dbc5388a Author: Carl Worth Date: Thu Jul 14 11:11:15 2005 +0000 Patch a few memory leaks. ChangeLog | 6 ++++++ test/cairo-test.c | 47 ++++++++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 21 deletions(-) commit 3a469446376eb23bd4a852417b0a319b914805b9 Author: Kristian Høgsberg Date: Wed Jul 13 12:32:51 2005 +0000 Use the _cairo_surface_*() functions when replaying. Fold the "locate fallbacks" pass into the postscript output pass, and add a simple, first implementation of image fallbacks. ChangeLog | 9 ++ src/cairo-meta-surface-private.h | 1 + src/cairo-meta-surface.c | 35 +++--- src/cairo-ps-surface.c | 286 ++++++++++++++++++-------------------- 4 files changed, 163 insertions(+), 168 deletions(-) commit aafc2e749725fab0684cce6e36b130f838696912 Author: Carl Worth Date: Wed Jul 13 11:34:37 2005 +0000 Rename CAIRO_FONT_BACKEND_DEFAULT to the more accurate CAIRO_SCALED_FONT_BACKEND_DEFAULT. ChangeLog | 7 +++++++ src/cairo-font.c | 3 ++- src/cairoint.h | 6 +++--- 3 files changed, 12 insertions(+), 4 deletions(-) commit 6725cc9d7f9b44f930478c337073d372272407de Author: Carl Worth Date: Wed Jul 13 11:01:25 2005 +0000 New predicates to allow checking for cairo_ft derivates of generic font type. Add explicit checks for cairo_ft derivatives of generic fonts rather than just blindly assuming that's what we get. ChangeLog | 15 +++++++++++++++ src/cairo-font-subset.c | 4 ++++ src/cairo-ft-font.c | 12 ++++++++++++ src/cairo-ft-private.h | 6 ++++++ src/cairo-pdf-surface.c | 8 ++++++++ src/cairo-ps-surface.c | 12 ++++++++++++ 6 files changed, 57 insertions(+), 0 deletions(-) commit dda555de995e2af3cc49e3e2ed9e2444c8622a55 Author: Carl Worth Date: Tue Jul 12 14:43:37 2005 +0000 Remove destroy notifier. This simplifies the implementation a bit, and no anticipated use of cairo_hash_table_t in cairo needs the destroy notifier. Most uses will be hash-backed object create/destroy functions. (_cairo_hash_table_destroy): Document that it is now a fatal error to call _cairo_hash_table_destroy on a non-empty hash table. (_cairo_hash_table_insert): Document that it is now a fatal error to insert an entry with a key that matches an existing entry. (_cairo_hash_table_random_entry): Add predicate function so that the user can select a random entry satisying the given predicate. (_cairo_hash_table_remove): Change return type to void since failure is really not possible here. ChangeLog | 22 +++++++++ src/cairo-hash-private.h | 25 +++++++--- src/cairo-hash.c | 115 ++++++++++++++++++++------------------------- 3 files changed, 90 insertions(+), 72 deletions(-) commit efb413c084c51c08875ab2f356484718ff4f91dd Author: Carl Worth Date: Mon Jul 11 16:24:19 2005 +0000 Add note that glyph measurement performance needs to improve. ChangeLog | 1 + ROADMAP | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-) commit 4329b709639c2dd3a6ec0cf113877323abfcbc2c Author: Carl Worth Date: Mon Jul 11 16:09:55 2005 +0000 Fix typo (cairo_ft_options_t -> cairo_font_options_t). ChangeLog | 1 + ROADMAP | 2 +- 2 files changed, 2 insertions(+), 1 deletions(-) commit abdaf7555f467e2df248430853e9dd8bf3c4056d Author: Carl Worth Date: Mon Jul 11 16:07:08 2005 +0000 Add cache lock deadlock problem to roadmap for 0.5.2. Disable mutex locks, (making the caches non-thread-safe again, just like they were in the last snapshot and before). ChangeLog | 8 ++++++++ ROADMAP | 9 +++++++++ src/cairoint.h | 48 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 53 insertions(+), 12 deletions(-) commit e9d42ab9f9b6def69c8de976fb3482b9559ffb9c Author: Carl Worth Date: Mon Jul 11 14:03:51 2005 +0000 ROADMAP: Add recent API change proposals (cairo_ft_options_t, cairo_xlib_surface_create needs to be screen aware, and cairo_xlib_surface_set_drawable). ChangeLog | 3 +++ ROADMAP | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) commit 9cddbaf8e6d4aef89017baf6bf10d8d34a47b0ef Author: Carl Worth Date: Mon Jul 11 13:37:43 2005 +0000 ROADMAP: Note progress on cairo_meta_surface_t, ARGB text, and group support. ChangeLog | 2 ++ ROADMAP | 11 ++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) commit 48e5806f1e30e1e46a18442a568ed99daab78f66 Author: Carl Worth Date: Mon Jul 11 13:29:45 2005 +0000 Note that the cairo_content_t work is done. Note that this function is computing an incorrect result. ChangeLog | 7 +++++++ ROADMAP | 4 ++-- src/cairo-arc.c | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) commit 2ff04df85219828c0058155ba7038a23bd264ebc Author: Jeff Muizelaar Date: Sat Jul 9 19:00:36 2005 +0000 Begin merging in newer fb code. The code comes from keithp: Initial import of Composite extension along with name change from Apportion. Added some accelerated code to fbpict to make this initial hack a bit faster. "real" extension bits to follow. pixman/ChangeLog | 12 ++++ pixman/src/ic.c | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 187 insertions(+), 2 deletions(-) commit 1d48dc6cdb653b95c4353613399972663c71e68e Author: Jeff Muizelaar Date: Sat Jul 9 18:13:14 2005 +0000 More misc merging. Mostly s/pixman_composite/fbComposite/. pixman/ChangeLog | 12 +++++++++ pixman/src/ic.c | 72 +++++++++++++++++++++++++++--------------------------- 2 files changed, 48 insertions(+), 36 deletions(-) commit 36a57bcdcbb0025250bfa037fbd7e7c08819e43b Author: Jeff Muizelaar Date: Sat Jul 9 15:47:43 2005 +0000 More misc merging. Mostly stuff like s/uint32_t/CARD32/. pixman/ChangeLog | 16 ++ pixman/src/ic.c | 626 +++++++++++++++++++++++++++--------------------------- 2 files changed, 329 insertions(+), 313 deletions(-) commit 9a2ba48b298c3bf4b462e1030b105efaf9fd015c Author: Carl Worth Date: Fri Jul 8 10:12:28 2005 +0000 Give enum tags an underscore prefix to match the style of the struct tags. Add new cairo_content_t and change cairo_surface_create_similar to accept a cairo_content_t rather than a cairo_format_t. Change surface backend create_similar call to accept a cairo_content_t rather than a cairo_format_t. Fix all calls into create_similar to pass a cairo_content_t rather than a cairo_format_t. ChangeLog | 44 +++++++++++++++++++ src/cairo-glitz-surface.c | 41 +++++++++-------- src/cairo-gstate.c | 10 ++-- src/cairo-image-surface.c | 52 +++++++++++++++++++++- src/cairo-meta-surface.c | 4 +- src/cairo-pattern.c | 2 +- src/cairo-pdf-surface.c | 4 +- src/cairo-ps-surface.c | 10 ++-- src/cairo-quartz-surface.c | 11 ++--- src/cairo-surface.c | 36 ++++++++++++--- src/cairo-win32-surface.c | 9 +++- src/cairo-xcb-surface.c | 6 ++- src/cairo-xlib-surface.c | 8 ++- src/cairo.h | 103 +++++++++++++++++++++++++++----------------- src/cairoint.h | 14 ++++-- test/mask.c | 4 +- test/pixman-rotate.c | 2 +- test/source-clip.c | 2 +- 18 files changed, 256 insertions(+), 106 deletions(-) commit 9fd2f0a25c4954e839d79de00ff14b1990ae39eb Author: Carl Worth Date: Thu Jul 7 01:15:21 2005 +0000 Add a missing word. Note that the BadMatch bug has been resolved. CODING_STYLE | 4 ++-- ChangeLog | 6 ++++++ ROADMAP | 9 ++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) commit f766e06d25334cd8d75d28d105b6a2fa62f08702 Author: Carl Worth Date: Wed Jul 6 14:52:01 2005 +0000 Remove CAIRO_STATUS_NO_TARGET_SURFAC and add CAIRO_STATUS_INVALID_STATUS. Don't check for gstate->target == NULL anymore as the API now guarantees it never occurs. Check that path->status is a valid status value and cause an INVALID_STATUS error otherwise. Test the new CAIRO_STATUS_INVALID_STATUS error case in cairo_append_path. ChangeLog | 18 ++++++++++++++++++ src/cairo-gstate.c | 9 --------- src/cairo.c | 18 +++++++++++++----- src/cairo.h | 27 ++++++++++++++------------- test/path-data.c | 15 +++++++++++++++ 5 files changed, 60 insertions(+), 27 deletions(-) commit eb12e493084ace63cebf9eb95b07953a952a817f Author: Carl Worth Date: Wed Jul 6 11:23:39 2005 +0000 Require libpixman >= 0.1.5, (since 0.1.4 crashes on some X servers). ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit ad0e040fb6625c9fcc76b99c65f3caff098fd256 Author: Carl Worth Date: Tue Jul 5 22:30:59 2005 +0000 Disable the compilation of the _ps_locate_fallbacks code which, inaddition to being broken, appears to not currently be used. ChangeLog | 6 ++++++ src/cairo-ps-surface.c | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) commit e314e86cc1eb5feafee621ece4be79d897eb2850 Author: David Reveman Date: Mon Jul 4 03:58:43 2005 +0000 Use frame buffer objects for accelerated offscreen drawing in glitz backend ChangeLog | 9 +++ configure.in | 2 +- src/cairo-glitz-surface.c | 156 ++++++++++++++++++--------------------------- 3 files changed, 72 insertions(+), 95 deletions(-) commit 7a923e6dddcefa643ef059e8eef0ebeba7e383ee Author: Kristian Høgsberg Date: Fri Jul 1 12:45:35 2005 +0000 Rewrite postscript backend to generate more interesting output than the current big-image implementation, using meta surfaces for font subsetting and image fallbacks. Remove obsolete comment. Make a couple of stylistic changes and add _cairo_output_stream_write_hex_string. Add _cairo_surface_intersect_clip_path so we can replay path clipping. ChangeLog | 15 + src/cairo-meta-surface.c | 6 - src/cairo-output-stream.c | 28 +- src/cairo-ps-surface.c | 1261 +++++++++++++++++++++++++++++++++++++++------ src/cairo-surface.c | 17 + src/cairoint.h | 11 + 6 files changed, 1167 insertions(+), 171 deletions(-) commit 7ab5dbfa7547bd0d8a99e4d0fcd34d8a55722a11 Author: Kristian Høgsberg Date: Fri Jul 1 12:22:23 2005 +0000 Add meta surface implementation. Add cairo-meta-surface.c and cairo-meta-surface-private.h ChangeLog | 8 + src/Makefile.am | 2 + src/cairo-meta-surface-private.h | 151 ++++++++++ src/cairo-meta-surface.c | 601 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 762 insertions(+), 0 deletions(-) commit 4e01c4aa2f8427113153fe569b6cf22388ba0882 Author: Carl Worth Date: Wed Jun 29 17:05:31 2005 +0000 Remove debugging printfs. ChangeLog | 7 ++++++- src/cairo-hash.c | 4 ---- 2 files changed, 6 insertions(+), 5 deletions(-) commit aad6dce6bc9adc829e719345c5df954d9464cefb Author: Carl Worth Date: Wed Jun 29 17:02:37 2005 +0000 Add _cairo_hash_table_random_entry. Fix to update live_entries. style changes. Add code to shrink table as well as to grow it. Call new version of resize so that table will grow or shrink as needed on insert and remove. ChangeLog | 18 ++++++ src/cairo-hash-private.h | 5 +- src/cairo-hash.c | 138 +++++++++++++++++++++++++++++++++++++++------- 3 files changed, 139 insertions(+), 22 deletions(-) commit e7ffbb4179b388304d4aadda66eb6c641758f91b Author: Carl Worth Date: Wed Jun 29 15:02:10 2005 +0000 Rewrite hash table to use a single cairo_hash_entry_t* rather than void *key and void *value. This is slightly more painful to use, but lends itself to a more memory-efficient implementation. Add documentation. ChangeLog | 12 ++ src/cairo-hash-private.h | 58 ++++++-- src/cairo-hash.c | 332 +++++++++++++++++++++++++--------------------- 3 files changed, 235 insertions(+), 167 deletions(-) commit 82f244eca84b37886bd0b118dc44ec04342d7a26 Author: Carl Worth Date: Wed Jun 29 07:04:34 2005 +0000 Rework the cache code as a hast table with a much simpler interface, (no object derviation is required to use it). Remove extraneous prototype for non-existent _cairo_cache_reference. ChangeLog | 14 + src/cairo-hash-private.h | 85 ++++++ src/cairo-hash.c | 643 ++++++++++++++++++++-------------------------- src/cairoint.h | 3 - 4 files changed, 374 insertions(+), 371 deletions(-) commit 5ab8a3085ee4c5cab7d07d233530d74c2d978d94 Author: Kristian Høgsberg Date: Tue Jun 28 15:58:42 2005 +0000 New functions to create a cairo_pattern_t corresponding to a solid color and a translucent color respectively. Document a few pattern functions. ChangeLog | 7 +++ src/cairo-pattern.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.c | 37 +++---------- src/cairo.h | 8 +++ 4 files changed, 171 insertions(+), 29 deletions(-) commit e7442a4523603642c4805058140a7ad23fc0489d Author: Tor Lillqvist Date: Tue Jun 28 15:03:53 2005 +0000 Implement. reviewed by: otaylor ChangeLog | 7 +++ src/cairo-win32-font.c | 133 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 135 insertions(+), 5 deletions(-) commit 6d65ee6fc40ed1dcf7cc2f50413afc207520b299 Author: Owen Taylor Date: Tue Jun 28 13:28:53 2005 +0000 Also flag older XFree86 servers as buggy-repeat. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit e0982300cad9cf9873c28f69e025dd9a278934f0 Author: Tor Lillqvist Date: Tue Jun 28 11:52:42 2005 +0000 Prevent crash on empty string. ChangeLog | 5 +++++ src/cairo-atsui-font.c | 17 ++++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) commit f3b7d3dfd8d2bec03969bc5a52fb41473b88c747 Author: Owen Taylor Date: Tue Jun 28 05:02:27 2005 +0000 Fix stray commit marker ChangeLog | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 3b0c3d0ee84f991347df12249f944c780dde99f8 Author: Keith Packard Date: Sat Jun 25 23:24:19 2005 +0000 Provide locking macros, implement with pthreads. Add _cairo_cache_shrink_to which reduces cache memory usage to a specified level. Change global glyph and xlib glyphset caches behaviour to only shrink cache on unlock. This is done by telling the cache code to never shrink (max_memory == 0), and then manually shrinking using _cairo_cache_shrink_to from the unlock function. Fix Carl's variable renaming mixing (cache = cache). reviewed by: cworth ChangeLog | 33 ++++++++++++++++++++++++++++ configure.in | 8 +++++++ src/cairo-cache.c | 24 +++++++++++++------- src/cairo-font.c | 28 +++++++++++++++-------- src/cairo-ft-font.c | 6 +++- src/cairo-hash.c | 24 +++++++++++++------- src/cairo-xlib-surface.c | 53 +++++++++++++-------------------------------- src/cairoint.h | 23 ++++++++++++++++++++ 8 files changed, 132 insertions(+), 67 deletions(-) commit 574f7f560bf2cc851ad4f3267840e37fa06611fa Author: Jeff Muizelaar Date: Sat Jun 25 15:03:17 2005 +0000 Merge over most of the low-hanging renames from xserver/fb. pixman/ChangeLog | 34 +++ pixman/src/ic.c | 30 +- pixman/src/icblt.c | 34 ++-- pixman/src/icbltone.c | 32 ++-- pixman/src/iccompose.c | 498 ++++++++++++++++++------------------ pixman/src/icint.h | 296 ++++++++++++---------- pixman/src/icrop.h | 18 +- pixman/src/icutil.c | 2 +- pixman/src/pixman-xserver-compat.h | 4 +- 9 files changed, 501 insertions(+), 447 deletions(-) commit be38e07c4e511c075f9a30c67a4385bbb1d30594 Author: Jeff Muizelaar Date: Sat Jun 25 14:41:38 2005 +0000 Fix broken build on older gcc's caused by overzealous s/IC_/FB_/g pixman/ChangeLog | 5 +++++ pixman/src/icint.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 5f0e8de3e5721d55328b6b06922f7b29b49cc5cb Author: Owen Taylor Date: Sat Jun 25 13:51:22 2005 +0000 Add mostly useless (other than perhaps 90-degree rotation) code for transforming bitmap glyphs. ChangeLog | 8 +++- src/cairo-ft-font.c | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 142 insertions(+), 2 deletions(-) commit 13a27d19d4e8748a4233b70cdd4a223865d3d57c Author: Carl Worth Date: Sat Jun 25 02:00:17 2005 +0000 From: J. Ali Harlow" Reviewed by: Vladimir Vukicevic Update win32 backend to match current API, so it actually builds once again. ChangeLog | 22 ++++++++++++++++++++++ src/cairo-win32-surface.c | 19 +++++++++++-------- test/Makefile.am | 4 ++-- 3 files changed, 35 insertions(+), 10 deletions(-) commit 64d5b34a9843e63d36c605abe7cdd56bacabccee Author: Jeff Muizelaar Date: Fri Jun 24 20:13:19 2005 +0000 s/Ic/Fb/g This gets read of most of the [Ii][cC]'s the rest will probably dealt with on a case by case basis. trimmed function list again. pixman/ChangeLog | 26 +++ pixman/src/ic.c | 108 +++++----- pixman/src/icblt.c | 268 +++++++++++----------- pixman/src/icbltone.c | 174 ++++++++-------- pixman/src/iccolor.c | 20 +- pixman/src/iccompose.c | 288 ++++++++++++------------ pixman/src/icformat.c | 10 +- pixman/src/icimage.c | 36 ++-- pixman/src/icimage.h | 70 +++--- pixman/src/icint.h | 426 ++++++++++++++++++------------------ pixman/src/icpixels.c | 28 ++-- pixman/src/icrect.c | 6 +- pixman/src/icrop.h | 66 +++--- pixman/src/icstipple.c | 20 +- pixman/src/ictrap.c | 6 +- pixman/src/ictri.c | 20 +- pixman/src/icutil.c | 4 +- pixman/src/pixman-xserver-compat.h | 2 +- 18 files changed, 802 insertions(+), 776 deletions(-) commit 42fc090745c8d262b8348b9f7a6c204e9a9b2379 Author: Jeff Muizelaar Date: Fri Jun 24 18:28:19 2005 +0000 selective s/Ic/fb/g. I took out the list of functions because it was ridiculously long. pixman/ChangeLog | 16 ++ pixman/src/ic.c | 96 +++++----- pixman/src/icblt.c | 34 ++-- pixman/src/icbltone.c | 96 +++++----- pixman/src/iccompose.c | 466 ++++++++++++++++++++++++------------------------ pixman/src/icimage.h | 2 +- pixman/src/icint.h | 30 ++-- pixman/src/icrop.h | 26 ++-- pixman/src/icstipple.c | 2 +- pixman/src/icutil.c | 42 +++--- 10 files changed, 413 insertions(+), 397 deletions(-) commit 43e3e7eeff6ff0f9fc0b161f70dfa0f5071a087e Author: Jeff Muizelaar Date: Fri Jun 24 18:21:15 2005 +0000 s/IC_/FB_/g dd #define FB_BITS IC_BITS so that FB_BITS get defined early enough pixman/ChangeLog | 18 ++++ pixman/src/ic.c | 4 +- pixman/src/icblt.c | 106 +++++++++++----------- pixman/src/icbltone.c | 76 ++++++++-------- pixman/src/icint.h | 168 ++++++++++++++++++------------------ pixman/src/icpixels.c | 6 +- pixman/src/icrop.h | 4 +- pixman/src/icstipple.c | 6 +- pixman/src/icutil.c | 16 ++-- pixman/src/pixman-xserver-compat.h | 2 + pixman/src/pixman.h | 3 +- 11 files changed, 215 insertions(+), 194 deletions(-) commit d469cc18eb21f69f8546f1d35ea44509c6eac329 Author: Carl Worth Date: Fri Jun 24 15:14:31 2005 +0000 Remove stray character. ChangeLog | 5 +++++ src/cairo-ft-font.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 05e2ffa00ad672d33f1c204237f54a006f2e5c94 Author: Carl Worth Date: Fri Jun 24 15:09:41 2005 +0000 Prefer descriptive variable names over single-character names. Remove unneeded XGlpyhInfo field from glyphset_cache_entry_t. ChangeLog | 12 ++++ src/cairo-xlib-surface.c | 135 ++++++++++++++++++++++----------------------- 2 files changed, 78 insertions(+), 69 deletions(-) commit 87008a44d3043e48376cb3bee3702226ec5bcac7 Author: Owen Taylor Date: Fri Jun 24 15:06:40 2005 +0000 Handle rendering bitmap glyphslots as well as outline glyphslots. When setting the scale for a non-scalable font, use the nearest available size (FreeType won't set the glyph metrics otherwise.) ChangeLog | 9 ++ src/cairo-ft-font.c | 269 +++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 218 insertions(+), 60 deletions(-) commit 81fa936fd2153e62411a5fbd3e8e5a43bc493d74 Author: Jeff Muizelaar Date: Thu Jun 23 19:41:07 2005 +0000 s/IcCombine/fbCombine/ pixman/ChangeLog | 31 ++++++ pixman/src/iccompose.c | 272 ++++++++++++++++++++++++------------------------ 2 files changed, 167 insertions(+), 136 deletions(-) commit e77d9776ae5217e9317209815b3195366a84f70f Author: Jeff Muizelaar Date: Thu Jun 23 19:39:12 2005 +0000 s/pixman_compositeOperand/FbCompositeOperand/g. pixman/ChangeLog | 59 +++++ pixman/src/iccompose.c | 552 ++++++++++++++++++++++++------------------------ pixman/src/icimage.h | 20 +- 3 files changed, 345 insertions(+), 286 deletions(-) commit 373e7f68b1c076eab08f2bc6b249dae4e8ac9bf4 Author: Jeff Muizelaar Date: Thu Jun 23 19:35:45 2005 +0000 s/pixman_bits_t/FbBits/s pixman/ChangeLog | 31 +++++++++++++ pixman/src/ic.c | 14 +++--- pixman/src/icblt.c | 80 +++++++++++++++++----------------- pixman/src/icbltone.c | 44 +++++++++--------- pixman/src/iccompose.c | 114 ++++++++++++++++++++++++------------------------ pixman/src/icimage.c | 6 +- pixman/src/icstipple.c | 8 ++-- 7 files changed, 164 insertions(+), 133 deletions(-) commit aa07c01cb5d1f0c41067ee005b6db4481d5d8b58 Author: Jeff Muizelaar Date: Thu Jun 23 19:33:34 2005 +0000 more merging: 630. Fix incorrect datatype for the pixmap width in fbCompositeSrcAdd_8000x8000(), and add some small optimisations (#A.1423, Keith Packard). pixman/ChangeLog | 12 +++++++++++- pixman/src/ic.c | 36 ++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 15 deletions(-) commit 81ec18369736888bea6d4d79d0de6ed00e8ca802 Author: Jeff Muizelaar Date: Thu Jun 23 19:30:12 2005 +0000 Start the xserver/fb -> libpixman merging with a copy optimization. pixman/ChangeLog | 7 +++++++ pixman/src/icblt.c | 26 +++++++++++++++++++++++++- pixman/src/icint.h | 1 + 3 files changed, 33 insertions(+), 1 deletions(-) commit adeff84bc2eba19bb3f667297e594a1ef86ae2a9 Author: Carl Worth Date: Thu Jun 23 15:52:37 2005 +0000 Add ARGB text to 1.0 roadmap. ChangeLog | 4 ++++ ROADMAP | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 609ef32bfa13c09d3a6de5c6631458109445eda0 Author: Owen Taylor Date: Thu Jun 23 13:05:07 2005 +0000 Improve last ChangeLog entry a bit ChangeLog | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit ff27263f3968d8f97534ce218bfde0392908cf6c Author: Owen Taylor Date: Thu Jun 23 12:58:49 2005 +0000 Only unpremultiply ARGB32 data. Call png_write_info() *before* we set up the write conversion... it doesn't work after. ChangeLog | 6 ++++++ src/cairo-png.c | 47 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 42 insertions(+), 11 deletions(-) commit 3b20ab66b89527c25c1fbfff8ed1ff672196520f Author: Carl Worth Date: Thu Jun 23 12:45:38 2005 +0000 Add workaround for Render's overlapping source/dest bug to the 0.5.2 roadmap. ChangeLog | 5 +++++ ROADMAP | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 03c7b6aa7a5d2b97b7f892296f2a46ae56dde5b2 Author: Carl Worth Date: Wed Jun 22 22:12:09 2005 +0000 Add link to BadMatch bug. ChangeLog | 6 ++++-- ROADMAP | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) commit b04b434db189904b108ab5167e61a286ea8225d2 Author: Carl Worth Date: Wed Jun 22 17:09:08 2005 +0000 Update ROADMAP with some comments on 0.5.2. Add documentation for cairo_set_source_surface and fix some typos in other documentation blocks. ChangeLog | 6 ++++++ ROADMAP | 16 ++++++++-------- src/cairo.c | 29 ++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 11 deletions(-) commit 687f3d78d6b1fe1fb03980c70537bea331bbcf28 Author: Øyvind KolÃ¥s Date: Wed Jun 22 09:49:48 2005 +0000 minor whitespace and spellfix ChangeLog | 4 ++++ doc/public/language-bindings.xml | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit b1130276d59a219e70d43dd1d199ddf391fa3330 Author: Kristian Høgsberg Date: Tue Jun 21 15:38:51 2005 +0000 Split out font subsetting code from here, and put it here. ChangeLog | 7 + src/Makefile.am | 91 +++--- src/cairo-font-subset-private.h | 68 ++++ src/cairo-font-subset.c | 645 ++++++++++++++++++++++++++++++++++++++ src/cairo-pdf-surface.c | 657 +-------------------------------------- 5 files changed, 784 insertions(+), 684 deletions(-) commit 7283ba6d470950e0e49f33fc25f3358113dda51e Author: Tor Lillqvist Date: Tue Jun 21 09:54:58 2005 +0000 allow building against < 10.3 SDK. ChangeLog | 4 ++++ src/cairo-atsui-font.c | 12 ++++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit adee31be18e20112c7da49675b93d37cc66ee263 Author: Carl Worth Date: Mon Jun 20 17:06:10 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_1. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 86869f02b9206eaeac331ff8945dacf4d840df98 Author: Carl Worth Date: Mon Jun 20 17:01:36 2005 +0000 Force distcheck to enable gtk-doc. ChangeLog | 4 ++++ Makefile.am | 2 ++ doc/public/tmpl/cairo.sgml | 19 ------------------- 3 files changed, 6 insertions(+), 19 deletions(-) commit d7ef15d4b48820a072e4f4525fa83b23dc2cdf5d Author: Carl Worth Date: Mon Jun 20 16:35:40 2005 +0000 Added notes for snapshot 0.5.1 Increment CAIRO_VERSION to 0.5.1 ChangeLog | 6 +++ NEWS | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 3 files changed, 109 insertions(+), 1 deletions(-) commit 74e3cc672f4b687d48caabe53a9c611868e27904 Author: Carl Worth Date: Mon Jun 20 16:31:17 2005 +0000 Fix abbreviated ChangeLog ChangeLog | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit ea2a04d901947106d15978c077cad61b7b7c9b26 Author: Owen Taylor Date: Mon Jun 20 15:48:46 2005 +0000 Workaround for https://bugs.freedesktop.org/show_bug.cgi?id=3566 Detect servers with a bug in repeating surfaces by checking vendor string and version. For such surfaces Save clip rects when setting a clip region on a surface so that we set the right clip for the surface's GC if we create it later. ChangeLog | 13 ++ doc/public/tmpl/cairo.sgml | 19 +++ src/cairo-xlib-surface.c | 282 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 300 insertions(+), 14 deletions(-) commit 1ce9be95415c43b9db73b80f2641cc3a8eee9215 Author: Carl Worth Date: Mon Jun 20 12:54:15 2005 +0000 Make out parameters optional. Style cleanup. ChangeLog | 5 +++++ src/cairo-matrix.c | 42 +++++++++++++++++++++++------------------- 2 files changed, 28 insertions(+), 19 deletions(-) commit ab668278b060f3708bd1418c5707ceda74b9e2b4 Author: Carl Worth Date: Mon Jun 20 11:09:51 2005 +0000 Abstract CAIRO_ALPHA_IS_OPAQUE out for general internal use. Optimize to defer to cairo_paint if the alpha value is actually opaque. ChangeLog | 9 +++++++++ src/cairo-pattern.c | 2 +- src/cairo.c | 5 +++++ src/cairoint.h | 2 ++ 4 files changed, 17 insertions(+), 1 deletions(-) commit f15ec64e7f2cfb9071c05ec072e49f364dbc4164 Author: Carl Worth Date: Mon Jun 20 09:59:23 2005 +0000 Rip out cairo_set_error_notfiy function as it is clear that it is not the right approach. Remove error-notify test. ChangeLog | 12 +++++ doc/public/tmpl/cairo.sgml | 19 -------- src/cairo-private.h | 3 - src/cairo.c | 32 ------------- src/cairo.h | 14 ------ test/.cvsignore | 1 - test/Makefile.am | 2 - test/error-notify.c | 108 -------------------------------------------- 8 files changed, 12 insertions(+), 179 deletions(-) commit 3b8da5f213c3d0cf4357b29207639357241938bb Author: Carl Worth Date: Fri Jun 17 23:22:20 2005 +0000 Remove references to repeat and matrix fields that no longer exist. ChangeLog | 5 +++++ doc/public/tmpl/cairo-pattern.sgml | 4 ++-- doc/public/tmpl/cairo.sgml | 23 +++++++++++++++++++++-- src/cairo-xcb-surface.c | 3 --- 4 files changed, 28 insertions(+), 7 deletions(-) commit 92222f8bcaca41304ddd6a49a7e9d731a6a15820 Author: Owen Taylor Date: Fri Jun 17 16:19:08 2005 +0000 Fix width/height typo. ChangeLog | 6 ++++++ src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 66f8b1202ed82e4e88a63c6c385aded852186e68 Author: Kristian Høgsberg Date: Fri Jun 17 13:25:19 2005 +0000 Remove matrix, filter and repeat from the cairo_surface_t struct. ChangeLog | 10 ++++++++++ src/cairo-glitz-surface.c | 3 --- src/cairo-image-surface.c | 6 +++--- src/cairo-pattern.c | 6 ------ src/cairo-pdf-surface.c | 2 +- src/cairo-surface.c | 4 ---- src/cairo-xlib-surface.c | 3 --- src/cairoint.h | 16 ---------------- 8 files changed, 14 insertions(+), 36 deletions(-) commit 9318742aa434c1e8dd7c71ae07632383f8f7c59b Author: Carl Worth Date: Fri Jun 17 11:24:24 2005 +0000 cairo_reference and cairo_destroy shouldn't behave differently when cr->status indicates an error. Fix this bug that just slipped back in. Remove useless conditional return at the end of a void function. Fix so that after calling _cairo_error the most that any cairo entry function ever does is return a previously computed value. ChangeLog | 14 ++++++++++++++ src/cairo.c | 39 +++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 20 deletions(-) commit c71f0904f19beb7b5916fc229fe02c78ab296bae Author: Kristian Høgsberg Date: Fri Jun 17 10:48:47 2005 +0000 Remove the path clipping entry from the list. ChangeLog | 4 ++++ TODO | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) commit 7c811e0ac604e71ab67937c5a0842a6d01c67fbe Author: Carl Worth Date: Thu Jun 16 12:31:56 2005 +0000 update documentation build stuff doc/public/cairo-sections.txt | 2 ++ doc/public/tmpl/cairo-pattern.sgml | 2 ++ doc/public/tmpl/cairo.sgml | 2 ++ 3 files changed, 6 insertions(+), 0 deletions(-) commit d6eca5a45f220d806491af518ba8ce16b524e01d Author: Carl Worth Date: Thu Jun 16 12:20:46 2005 +0000 Reorder fields of cairo_private_t to match initialization order. Call error_notify callback if set. (cairo_create): Initialize error_notify callback to NULL. (cairo_set_error_notify): New function to allow the user to set an error notify callback. New cairo_set_error_notify prototye. New test for cairo_set_error_notify. ChangeLog | 17 ++++++++ src/cairo-private.h | 8 +++- src/cairo.c | 39 +++++++++++++++++- src/cairo.h | 14 +++++++ test/.cvsignore | 1 + test/Makefile.am | 2 + test/error-notify.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 184 insertions(+), 5 deletions(-) commit 18c2d12b9ed98aea7f8ebe2b97b9406a6acb4d29 Author: Carl Worth Date: Wed Jun 15 16:52:11 2005 +0000 Add CAIRO_STATUS_DESTROYED to TODO list. Note progress on consistent error handling. Fix typo in documentation comment for _cairo_surface_get_current_clip_serial. ChangeLog | 9 +++++++++ ROADMAP | 4 +++- TODO | 1 + src/cairo-surface.c | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) commit 615d50976735a544da6888dc608495d130878400 Author: Owen Taylor Date: Wed Jun 15 16:04:19 2005 +0000 Remove --only-section-tmpl; it doesn't really work currently :-(. ChangeLog | 5 + doc/public/Makefile.am | 2 +- doc/public/tmpl/cairo-font.sgml | 121 ++++ doc/public/tmpl/cairo-ft.sgml | 36 ++ doc/public/tmpl/cairo-glitz.sgml | 9 + doc/public/tmpl/cairo-matrix.sgml | 131 ++++ doc/public/tmpl/cairo-pattern.sgml | 154 +++++ doc/public/tmpl/cairo-pdf.sgml | 33 + doc/public/tmpl/cairo-png.sgml | 40 ++ doc/public/tmpl/cairo-ps.sgml | 33 + doc/public/tmpl/cairo-quartz.sgml | 11 + doc/public/tmpl/cairo-surface.sgml | 75 +++ doc/public/tmpl/cairo-win32.sgml | 45 ++ doc/public/tmpl/cairo-xcb-xrender.sgml | 13 + doc/public/tmpl/cairo-xcb.sgml | 35 + doc/public/tmpl/cairo-xlib-xrender.sgml | 13 + doc/public/tmpl/cairo-xlib.sgml | 35 + doc/public/tmpl/cairo.sgml | 1039 +++++++++++++++++++++++++++++++ src/cairo-ft-font.c | 2 +- src/cairo-win32-font.c | 2 +- 20 files changed, 1831 insertions(+), 3 deletions(-) commit a3906e65aaca3a9aaee0f42e49a53585f684ef3e Author: Owen Taylor Date: Wed Jun 15 12:44:52 2005 +0000 Use a clip region when rendering a non-solid pattern through a rectangular path ... trapezoid rasterization is just too slow to use that path when we aren't forced to do so. ChangeLog | 7 +++++++ src/cairo-gstate.c | 25 ++++++++++++++++--------- 2 files changed, 23 insertions(+), 9 deletions(-) commit fac3cd46b38d8ad45e0f6b1d112318cce289a8b4 Author: Carl Worth Date: Wed Jun 15 10:58:52 2005 +0000 (cairo_test_for_target): And add missing parenthesis. ChangeLog | 1 + test/cairo-test.c | 2 +- 2 files changed, 2 insertions(+), 1 deletions(-) commit 0b122003e7b1e45d28b535a5f5577544d1666510 Author: Carl Worth Date: Wed Jun 15 10:56:31 2005 +0000 Track removal of cairo_status_string. ChangeLog | 4 ++++ test/cairo-test.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletions(-) commit ac17f1ce68b829908e6329890b08eb7ef47d9910 Author: Carl Worth Date: Wed Jun 15 10:54:00 2005 +0000 Add cairo_finish to TODO list. Note that cairo_satus_string has now been removed. ChangeLog | 5 +++++ TODO | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit 4834b8e7f0be882e08ce0166750eb69e161e2a2c Author: Carl Worth Date: Wed Jun 15 10:52:01 2005 +0000 Remove cairo_status_string function which can now be replaced by: cairo_status_to_string (cairo_status (cr)); This allows consistent handling of status values for things like cairo_pattern_status where there is now cairo_pattern_status_string function. ChangeLog | 12 ++++++++++++ src/cairo.c | 6 ------ src/cairo.h | 6 ++---- 3 files changed, 14 insertions(+), 10 deletions(-) commit e3c92f26134460117e58bf37bd6a5d2c90ca49a6 Author: Carl Worth Date: Wed Jun 15 10:46:49 2005 +0000 Add _cairo_error so we have a single function which all errors can pass through. This allows the user to set a breakpoint on error and will allow us to augment error handling later as necessary. Make all assignements to cr->status go through the new _cairo_error function. Remove CAIRO_CHECK_SANITY macro. ChangeLog | 41 ++++ src/cairo.c | 639 +++++++++++++++++++++++++++++++++-------------------------- 2 files changed, 400 insertions(+), 280 deletions(-) commit e749cf524caafe1c20c8ceba510974abb490a67e Author: Carl Worth Date: Wed Jun 15 10:41:41 2005 +0000 Remove cairo-atsui section since cairo-atsui.h is currently empty. Add cairo_path_data_type_t and cairo_path_data_t. Add pdf-clip and pdf-clip.pdf. ChangeLog | 8 ++++++++ doc/public/cairo-sections.txt | 7 ++----- test/.cvsignore | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) commit 476fe9a66e2be74e65fe2f4e42bda5f4c8b244a0 Author: Kristian Høgsberg Date: Tue Jun 14 19:45:22 2005 +0000 Implement path clipping and refactor _cairo_gstate_clip() out in three different functions corresponding to the three different clipping modes. Add NULL pointers for intersect_clip_path. New test case to exercise PDF clipping code. ChangeLog | 36 +++++++ src/cairo-glitz-surface.c | 1 + src/cairo-gstate-private.h | 16 +++- src/cairo-gstate.c | 222 ++++++++++++++++++++++++++++++-------------- src/cairo-image-surface.c | 1 + src/cairo-pdf-surface.c | 101 +++++++++++++++++++- src/cairo-ps-surface.c | 1 + src/cairo-quartz-surface.c | 1 + src/cairo-surface.c | 116 ++++++++++++++++-------- src/cairo-win32-surface.c | 1 + src/cairo-xcb-surface.c | 1 + src/cairo-xlib-surface.c | 1 + src/cairoint.h | 71 +++++++++++--- test/Makefile.am | 11 ++- test/pdf-clip.c | 134 ++++++++++++++++++++++++++ 15 files changed, 583 insertions(+), 131 deletions(-) commit 663e39a63c6ae223dc3095d29fd95bc8885c74f2 Author: Carl Worth Date: Tue Jun 14 15:38:15 2005 +0000 Remove Boolean 'drawable' parameter from the create_similar surface backend function since nothing anywhere is actually using this parameter. ChangeLog | 23 +++++++++++++++++++++++ src/cairo-glitz-surface.c | 9 ++++----- src/cairo-image-surface.c | 1 - src/cairo-pdf-surface.c | 1 - src/cairo-ps-surface.c | 1 - src/cairo-quartz-surface.c | 1 - src/cairo-surface.c | 6 ++---- src/cairo-win32-surface.c | 2 -- src/cairo-xcb-surface.c | 3 +-- src/cairo-xlib-surface.c | 3 +-- src/cairoint.h | 2 -- 11 files changed, 31 insertions(+), 21 deletions(-) commit d2ddfe42a9d66a8b369afb75e6e758af145def3e Author: Tor Lillqvist Date: Tue Jun 14 14:12:00 2005 +0000 Correct extents for text with a general tranform. ChangeLog | 5 +++++ src/cairo-win32-font.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit bb7eeeb7498dad5b6bd70d1497b049a80d77af11 Author: Carl Worth Date: Tue Jun 14 11:58:14 2005 +0000 Remove comment suggesting ambiguity of whether cairo_get_target references the surface, (we decided as part of the API shakeup that cairo functions returning pointers to internal objects do not automatically take a reference). ChangeLog | 7 +++++++ src/cairo.h | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) commit 8084fb9b095fb28d39d26f223e73be1867d4f0bc Author: Carl Worth Date: Mon Jun 13 16:53:52 2005 +0000 Add new _cairo_pattern_create_in_error. Propagate error values from cr->status to pattern->status. ChangeLog | 9 +++++++++ src/cairo-pattern.c | 31 +++++++++++++++++++++++++++++++ src/cairo.c | 4 +--- src/cairoint.h | 3 +++ 4 files changed, 44 insertions(+), 3 deletions(-) commit 14ae3ce3ade3448f3c3d6ae0344ab4785afa96aa Author: Carl Worth Date: Mon Jun 13 16:36:40 2005 +0000 No longer need to check for NULL after creating a pattern. Propagate status errors from pattern->status to cr->status. Originally 2005-05-08 Owen Taylor : src/cairo-pattern.c src/cairoint.h: If allocation of pattern objects fails, return special static nil pattern objects. If adding a color stop fails to allocate memory, set pattern->status. (And fix a memory leak.) Make public functions return when pattern->status is set, (and no longer return a cairo_status_t). src/cairo-pattern.c src/cairo.h doc/public/cairo-sections.txt: Add cairo_pattern_status() Check the status of gstate->source and of mask patterns passed in. ChangeLog | 25 ++++++ doc/public/cairo-sections.txt | 1 + src/cairo-gstate.c | 24 +++++- src/cairo-pattern.c | 188 +++++++++++++++++++++++++++++----------- src/cairo.c | 34 +++++--- src/cairo.h | 16 ++-- src/cairoint.h | 6 +- 7 files changed, 219 insertions(+), 75 deletions(-) commit 15fb5e0d27a1fc7743894792a168980363df5d71 Author: Carl Worth Date: Mon Jun 13 16:35:03 2005 +0000 Originally 2005-05-08 Owen Taylor : If cairo_create() fails, return a special static object, cairo_nil. Don't return early if cr->status is set. cr->status should not affect reference counting. Ignore any magic object with a reference count of -1. ChangeLog | 14 ++++++++++++++ src/cairo.c | 26 ++++++++++++++++++++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) commit 01e1844e9ceb58edb3ef6351f2163264611635fe Author: Carl Worth Date: Mon Jun 13 16:29:26 2005 +0000 Originally 2005-06-02 Carl Worth : Add a status field to cairo_path_t. Add documentation for the new approach for handling errors in these functions---always returning a valid pointer with at least a status. (cairo_append_path): Propagate path status errors to the context. Add note to documentation on initializing path->status. Add missing cairo_private qualifier to a couple functions. Track new status field in cairo_path_t. (cairo_path_destroy): Don't destroy cairo_path_nil. Add documentation. (_cairo_path_data_create): (_cairo_path_data_create_flat): (_cairo_path_data_append_to_context): Add documentation. (_cairo_path_data_create_in_error): New function to create a placeholder cairo_path_t just to propagate a cairo_status_t error. ChangeLog | 26 +++++++++++ src/cairo-path-data-private.h | 11 +++-- src/cairo-path-data.c | 98 +++++++++++++++++++++++++++++++++++------ src/cairo.c | 50 ++++++++++++++++----- src/cairo.h | 1 + 5 files changed, 156 insertions(+), 30 deletions(-) commit 730fb40455118894d970c0cb1a9b37880660889e Author: Carl Worth Date: Sat Jun 11 01:09:15 2005 +0000 Make these functions static, which allows slightly less awkward error handling within them. ChangeLog | 8 ++++++++ src/cairo-gstate.c | 22 ++++++++++++++++------ src/cairoint.h | 13 ------------- 3 files changed, 24 insertions(+), 19 deletions(-) commit df19a5aa7e0aa37a0d33eb3946f5492db0307ff3 Author: Carl Worth Date: Sat Jun 11 00:06:04 2005 +0000 Provide font-backend-specific macros for FONT_FAMILY_DEFAULT. Change CAIRO_FT_FONT_FAMILY_DEFAULT from "serif" to "" to allow the actual default to come from the system/user configuration. ChangeLog | 7 +++++++ src/cairoint.h | 10 +++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) commit ff2dee65bdff0e3bce239a6617b7acb680d5ad27 Author: Carl Worth Date: Fri Jun 10 23:47:23 2005 +0000 Pull the enum out from inside cairo_path_data_t and give it a name of cairo_path_data_type_t. This allows C++ programs to see the enum values. It also allows variables to be declared of this type for manually constructing a cairo_path_t. ChangeLog | 7 +++++++ src/cairo.h | 14 ++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) commit 4c37790a22a029332d182dc21bff4a72a976bbf8 Author: Carl Worth Date: Fri Jun 10 13:23:24 2005 +0000 Add 'consistent error handling' to 1.0 roadmap. (This isn't new, we just forgot to list it here before). Big cleanup to remove finished items. Also, split the file up to separate TODO items that affect the API from items that do not. ChangeLog | 3 +++ ROADMAP | 4 ++++ 2 files changed, 7 insertions(+), 0 deletions(-) commit 2a1c88064508938124c0700b8939303c579df188 Author: Carl Worth Date: Fri Jun 10 13:19:45 2005 +0000 Big cleanup to remove finished items. Also, split the file up to separate TODO items that affect the API from items that do not. ChangeLog | 8 ++- TODO | 183 +++++++++++++++++++++++++----------------------------------- 2 files changed, 83 insertions(+), 108 deletions(-) commit 6cd484a4c0d6a6a67c1922746a2c21b5f46bff38 Author: Carl Worth Date: Fri Jun 10 12:46:49 2005 +0000 Originally: 2005-06-09 Carl Worth Rework occurrences of 'if (status == CAIRO_STATUS_SUCCESS)' to use 'if (status)' instead where trivial. ChangeLog | 14 ++++++++++++++ src/cairo-pdf-surface.c | 8 +++++--- src/cairo-xcb-surface.c | 16 ++++++++++------ src/cairo-xlib-surface.c | 16 ++++++++++------ 4 files changed, 39 insertions(+), 15 deletions(-) commit 31dcb954fe2b8269563dbcd05c9ce0c1ca2f9a16 Author: Carl Worth Date: Fri Jun 10 12:18:20 2005 +0000 Remove STATUS_OK macro which was not being used universally. ChangeLog | 18 +++++++++++++++ src/cairo-font.c | 12 +++++----- src/cairo-ft-font.c | 6 ++-- src/cairo-glitz-surface.c | 22 ++++++++++++------- src/cairo-gstate.c | 52 ++++++++++++++++++++++---------------------- src/cairo-image-surface.c | 6 ++-- src/cairo-pattern.c | 2 +- src/cairo-pdf-surface.c | 4 +- src/cairo-png.c | 10 ++++++-- src/cairo-surface.c | 10 ++++---- src/cairo-win32-font.c | 32 +++++++++++++++------------ src/cairo-win32-surface.c | 34 +++++++++++++++------------- src/cairo-xcb-surface.c | 6 ++-- src/cairo-xlib-surface.c | 6 ++-- src/cairoint.h | 2 - 15 files changed, 127 insertions(+), 95 deletions(-) commit e6eef091152a7bcdcc6119224fa1aa1bfea5a823 Author: Carl Worth Date: Thu Jun 9 12:27:02 2005 +0000 Remove trailing comma from enum values which gcc 4.0 does not want to see (Luis Villa). Closes bug #3502. ChangeLog | 5 +++++ src/cairo.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 23976d00b2cfb4640a0e0119247ae7d8f7f2ad73 Author: Owen Taylor Date: Thu Jun 9 07:26:40 2005 +0000 Add -I$(top_builddir)/src for cairo-features.h (Tomasz Cholewo) ChangeLog | 5 +++++ test/Makefile.am | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletions(-) commit c1c8c57b90659287e43c2fd591e74df4c696cb09 Author: Keith Packard Date: Tue Jun 7 23:28:12 2005 +0000 Font matrix was output incorrectly; the implicit mirror-in-y transformation was not computed correctly, missing a negation of the 'xy' component. ChangeLog | 7 +++++++ src/cairo-pdf-surface.c | 2 +- 2 files changed, 8 insertions(+), 1 deletions(-) commit 4f2f520dcec441be34628d233456ad252ff14f58 Author: Carl Worth Date: Fri Jun 3 16:45:46 2005 +0000 Allow NULL as a valid value for several objects. That is, calling reference or destroy on these objects will simply do nothing, successfully. Remove extra whitespace. ChangeLog | 20 ++++++++++++++++++++ src/cairo-atsui-font.c | 1 - src/cairo-font.c | 31 +++++++++++++++++++++++++++---- src/cairo-ft-font.c | 7 +++++++ src/cairo-glitz-surface.c | 2 +- src/cairo-path-data.c | 17 +++++++++++++++++ src/cairo-pdf-surface.c | 6 ++++++ src/cairo-win32-font.c | 3 +++ 8 files changed, 81 insertions(+), 6 deletions(-) commit 7b4a65dba4b37111ec56b9cbb5d462bc08d4b0db Author: Kristian Høgsberg Date: Fri Jun 3 16:40:15 2005 +0000 When clipping, update the clip surface to a new surface the size of the intersection of the old clip surface and the extents of the new clip path. ChangeLog | 6 ++++ src/cairo-gstate.c | 75 +++++++++++++++++++++++++++++++++++++--------- test/clip-twice-ref.png | Bin 751 -> 1191 bytes test/clip-twice.c | 6 ++++ 4 files changed, 72 insertions(+), 15 deletions(-) commit 7c47633b2c74e329f04b9f1ebde4c05c409d73c0 Author: Carl Worth Date: Fri Jun 3 16:22:26 2005 +0000 Remove unused cache->refcount and _cairo_cache_reference(). Remove gratuitous nesting as recommended in CODING_STYLE. ChangeLog | 9 +++++++++ src/cairo-cache.c | 28 ++++++++-------------------- src/cairo-hash.c | 28 ++++++++-------------------- src/cairoint.h | 1 - 4 files changed, 25 insertions(+), 41 deletions(-) commit 756e991b91465c6da933368d66f19e54849815dd Author: Carl Worth Date: Fri Jun 3 16:16:44 2005 +0000 Fix name of _cairo_user_data_array_destroy to be _cairo_user_data_array_fini. ChangeLog | 8 ++++++++ src/cairo-array.c | 6 +++--- src/cairo-font.c | 2 +- src/cairo-surface.c | 2 +- src/cairoint.h | 2 +- 5 files changed, 14 insertions(+), 6 deletions(-) commit 42c1fb7c918ceb7920ddc8b6b75b38fd757d3a06 Author: Carl Worth Date: Fri Jun 3 16:08:28 2005 +0000 Rename functions to match the naming scheme used by cairo-cache.c and all other users of it. Though it's quite likely that glitz had this right and now everything could be changed to match it instead. I'll save that for some day when we're cleaning up the cache code. ChangeLog | 12 ++++++++++++ src/cairo-glitz-surface.c | 14 +++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) commit 97ac61700ae8d2fcf055fdad12533671895f539b Author: Carl Worth Date: Fri Jun 3 15:56:52 2005 +0000 Fix spelling errors. CODING_STYLE | 6 +++--- ChangeLog | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) commit 56990720358ea18b026f952101ddd674a5fbb268 Author: Carl Worth Date: Fri Jun 3 15:54:40 2005 +0000 Fix Freudian unwrapped line in paragraph describing why long lines should be wrapped. CODING_STYLE | 5 +++-- ChangeLog | 7 ++++++- src/cairo-gstate-private.h | 1 - 3 files changed, 9 insertions(+), 4 deletions(-) commit 36beed9bf1b3ddef42e0fb1a46035ed4a6afa4f7 Author: Carl Worth Date: Fri Jun 3 14:51:57 2005 +0000 Add CODING_STYLE document to standardize on some style issues. Standardize brace handling around all else clauses according to new CODING_STYLE guidelines. CODING_STYLE | 211 +++++++++++++++++++++++++++++++++++++++++++++ ChangeLog | 21 ++++- src/cairo-atsui-font.c | 6 +- src/cairo-cache.c | 6 ++ src/cairo-ft-font.c | 5 +- src/cairo-glitz-surface.c | 6 +- src/cairo-gstate.c | 4 + src/cairo-hash.c | 6 ++ src/cairo-matrix.c | 2 + src/cairo-pattern.c | 16 +++- src/cairo-pdf-surface.c | 6 +- src/cairo-spline.c | 16 ++-- src/cairo-wideint.c | 6 +- src/cairo-win32-font.c | 3 +- src/cairo-xlib-surface.c | 13 ++- 15 files changed, 297 insertions(+), 30 deletions(-) commit f87fd91bcf06a1e7a9332005b5d88d6b55c82548 Author: Kristian Høgsberg Date: Fri Jun 3 10:28:42 2005 +0000 Patch from Tomasz Cholewo : Store the index of the checksum instea of a pointer to the location. ChangeLog | 8 ++++++++ src/cairo-pdf-surface.c | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) commit bb00e0fce5a92693e20fde64b039fd4d105b82eb Author: Carl Worth Date: Fri Jun 3 09:38:39 2005 +0000 Move internal convenience up from _cairo_gstate_set_source_solid to _cairo_set_source_solid so that all set_source functions flow through cairo_set_source. ChangeLog | 9 +++++++++ src/cairo-gstate.c | 18 ------------------ src/cairo.c | 20 ++++++++++++++++++-- src/cairoint.h | 4 ---- 4 files changed, 27 insertions(+), 24 deletions(-) commit 4914eac983a92b7c424c217fdbaf13bb772cb1b9 Author: Carl Worth Date: Wed Jun 1 13:36:20 2005 +0000 Remove obsolete _cairo_gstate_set_target_surface, folding its contents into _cairo_gstate_init, most of which disappears due to constant folding. Ensure that gstate->next is initialized even if _cairo_pattern_create_solid fails. Remove unused _cairo_xcb_surface_set_clip_region. ChangeLog | 11 ++++++++ src/cairo-gstate.c | 60 +++------------------------------------------- src/cairo-xcb-surface.c | 8 ------ 3 files changed, 15 insertions(+), 64 deletions(-) commit c56938e568b3c4a5118e2f050214bb1906329153 Author: Carl Worth Date: Wed Jun 1 13:24:10 2005 +0000 Rename CAIRO_OK to STATUS_OK. No intended changes in functionality. ChangeLog | 18 ++++++++++++++++ src/cairo-font.c | 12 +++++----- src/cairo-ft-font.c | 6 ++-- src/cairo-glitz-surface.c | 6 ++-- src/cairo-gstate.c | 48 ++++++++++++++++++++++---------------------- src/cairo-image-surface.c | 6 ++-- src/cairo-pattern.c | 2 +- src/cairo-pdf-surface.c | 4 +- src/cairo-png.c | 6 ++-- src/cairo-surface.c | 10 ++++---- src/cairo-win32-font.c | 26 ++++++++++++------------ src/cairo-win32-surface.c | 4 +- src/cairo-xcb-surface.c | 6 ++-- src/cairo-xlib-surface.c | 6 ++-- src/cairoint.h | 2 +- 15 files changed, 90 insertions(+), 72 deletions(-) commit 045ba795dabacbb9153015ce0d4cb0881cd0d863 Author: Carl Worth Date: Wed Jun 1 13:19:52 2005 +0000 Rename gstate->surface to gstate->target. No intended changes in functionality. ChangeLog | 6 ++ src/cairo-gstate-private.h | 2 +- src/cairo-gstate.c | 114 ++++++++++++++++++++++---------------------- 3 files changed, 64 insertions(+), 58 deletions(-) commit 6c62cf76435153c6fdc165d229ee02e52c5c0db5 Author: Carl Worth Date: Wed Jun 1 13:13:10 2005 +0000 Remove unused fields from cairo_gstate_t, (font_family, font_slant, font_weight). Reorder fields to match between declaration and initialization and to put the most problematic fields (surface and source) at the end. No intended changes in functionality. ChangeLog | 9 +++++++++ src/cairo-gstate-private.h | 14 +++++--------- src/cairo-gstate.c | 14 +++++++------- 3 files changed, 21 insertions(+), 16 deletions(-) commit 707a2c97a1cb709ccf60899576467b898f658481 Author: Carl Worth Date: Wed Jun 1 13:10:57 2005 +0000 Add self-intersecting to the list of expected failures. ChangeLog | 5 +++++ test/Makefile.am | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 48fbc201c787512076934c40f15e173dbff771c3 Author: Carl Worth Date: Wed Jun 1 11:03:50 2005 +0000 Add self-intersecting test which demonstrates the long-standing bug with stroking self-intersecting paths. ChangeLog | 9 ++++ test/.cvsignore | 1 + test/Makefile.am | 3 + test/self-intersecting-ref.png | Bin 0 -> 242 bytes test/self-intersecting.c | 89 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 0 deletions(-) commit 37a48e674c575eaf36a3d9e8d84ea21f70da9a5b Author: Carl Worth Date: Wed Jun 1 00:29:24 2005 +0000 Fix bug in converting box to rectangle that left clip_rect.height uninitialized, (leading to unpredictable, intermittent test failures). ChangeLog | 7 +++++++ src/cairo-gstate.c | 2 +- src/cairo-traps.c | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) commit 7bb6dfdaa2cd1c7b6c673edce27045678938bd18 Author: Carl Worth Date: Tue May 31 16:05:06 2005 +0000 Add new function cairo_status_to_string an reimplement cairo_status_string in terms of the new function. ChangeLog | 7 +++++++ doc/public/cairo-sections.txt | 1 + doc/public/tmpl/cairo-win32.sgml | 2 -- doc/public/tmpl/cairo-xcb-xrender.sgml | 2 -- doc/public/tmpl/cairo-xlib-xrender.sgml | 2 -- src/cairo.c | 10 ++++++++-- src/cairo.h | 3 +++ 7 files changed, 19 insertions(+), 8 deletions(-) commit 63428d3cc77bc08d1db9e228ddf37a153a0cc221 Author: Olivier Andrieu Date: Thu May 26 17:35:35 2005 +0000 : Fix memory leak ChangeLog | 7 ++++++- src/cairo-path-data.c | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) commit ae96f5db6cb357ae9432d66a9590e11e6c7d9cca Author: Keith Packard Date: Thu May 26 13:02:31 2005 +0000 Split clipping into separate source and destination operand clips. By default, source operands are not affected by any client clipping. This matches the desired semantics for cairo. When this code is ported back to the X server, that will have to select the clipping option which clip source operands to the client clip. pixman/ChangeLog | 15 +++++++++++++++ pixman/src/iccompose.c | 20 +++++++++++++------- pixman/src/icimage.c | 37 ++++++++++++++++++++++++++++++++----- pixman/src/icimage.h | 9 ++++++--- 4 files changed, 66 insertions(+), 15 deletions(-) commit 45a966f69528c86dd6e3d4736805803b80de9f9b Author: Keith Packard Date: Thu May 26 11:35:44 2005 +0000 Replace nesting-only surface clipping with gstate contained serial-number tracked clipping sets that are loaded into the surface on demand just before each rendering operation. This permits multiple cairo_t contexts to reference a surface without regard to ordering of operations among the contexts. Also in this patch is a change to the xlib surface that creates two separate Pictures, one for source and one for destination operands which separates the source clipping from destination clipping. Cairo now specifies that sources are never clipped by any clipping applied to them as destinations. Move cairo_clip_t (renamed from cairo_clip_rec_t) from cairoint.h to cairo-gstate-private.h. Eliminate stack of clip state from surfaces. Add new surface clipping API. Manage clip objects entirely within the gstate, loading the whole thing into the surface just before drawing. Source surfaces need not have clipping modified as the surface interface now specifies that source surfaces are always unclipped. Eliminate nested clipping contexts, leaving clip management entirely to the gstate. Create new clip API for the gstate which uses per-surface serial numbers to match gstate clipping against current surface clipping values. Surfaces no longer track clipping regions at all, so the old _cairo_surface_get_clip_extents has been replaced with _cairo_surface_get_extents. For PDF/PS surfaces, this function is expected to return a rectangle covering the entire fixed point coordinate space to leave rendering unclipped by the surface. Region clipping capability is now signalled by a non-NULL function pointer in set_clip_region. Each surface now contains two Pictures, one for source and one for destination operands so that source operands are never clipped by destination clipping. CAIRO_STATUS_BAD_NESTING removed self-copy now passes (Xlib only, until libpixman changes land) reviewed by: krh, otaylor, cworth ChangeLog | 95 ++++++++++++++ src/cairo-gstate-private.h | 30 ++++- src/cairo-gstate.c | 286 ++++++++++++++++++++++++------------------- src/cairo-pattern.c | 28 ---- src/cairo-surface.c | 292 ++++++++++++++++++++------------------------ src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 123 ++++++++++++------- src/cairo.c | 2 - src/cairo.h | 7 +- src/cairoint.h | 72 +++++++---- test/Makefile.am | 1 - test/self-copy.c | 3 +- 12 files changed, 541 insertions(+), 400 deletions(-) commit be903f4c2232bfa8b48c1dca60ad5cf65f403c77 Author: Olivier Andrieu Date: Thu May 26 03:31:28 2005 +0000 trivial doc fixes. ChangeLog | 4 ++++ src/cairo.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit 17a5c3a3daef92ee1702edd4ca007590d5606ae6 Author: Carl Worth Date: Tue May 24 16:08:39 2005 +0000 Re-synch with latest from gtk-doc CVS tree. Add --only-section-tmpl option so that changes to inline documentation does not lead to churn in the .sgml template files. Commit new templates now that gtk-doc has ripped all the inline portions out. New template files added for new sections. Update to match current API. Make parameter names match those in the .c file and its documentation. ChangeLog | 33 + doc/public/.cvsignore | 3 + doc/public/Makefile.am | 3 + doc/public/cairo-sections.txt | 102 ++- doc/public/tmpl/cairo-font.sgml | 129 ---- doc/public/tmpl/cairo-ft.sgml | 36 - doc/public/tmpl/cairo-glitz.sgml | 9 - doc/public/tmpl/cairo-matrix.sgml | 157 ----- doc/public/tmpl/cairo-pattern.sgml | 151 ----- doc/public/tmpl/cairo-pdf.sgml | 21 - doc/public/tmpl/cairo-png.sgml | 40 -- doc/public/tmpl/cairo-ps.sgml | 17 - doc/public/tmpl/cairo-quartz.sgml | 11 - doc/public/tmpl/cairo-surface.sgml | 145 ---- doc/public/tmpl/cairo-win32.sgml | 21 + doc/public/tmpl/cairo-xcb-xrender.sgml | 21 + doc/public/tmpl/cairo-xcb.sgml | 17 - doc/public/tmpl/cairo-xlib-xrender.sgml | 21 + doc/public/tmpl/cairo-xlib.sgml | 26 - doc/public/tmpl/cairo.sgml | 1108 ------------------------------- gtk-doc.make | 26 +- src/cairo-xcb.h | 2 +- 22 files changed, 177 insertions(+), 1922 deletions(-) commit d41465d89a4df689d56d4a6cf06d6615ddf1b3ce Author: Carl Worth Date: Sun May 22 11:12:46 2005 +0000 Protect less-than and greater-than symbols in documentation string. ChangeLog | 3 +++ doc/public/tmpl/cairo-atsui.sgml | 9 --------- doc/public/tmpl/cairo-pdf.sgml | 22 +++++----------------- doc/public/tmpl/cairo-ps.sgml | 6 +++++- doc/public/tmpl/cairo-xcb.sgml | 9 +++++++-- doc/public/tmpl/cairo-xlib.sgml | 17 ++++------------- doc/public/tmpl/cairo.sgml | 1 + src/cairo.c | 2 +- 8 files changed, 26 insertions(+), 43 deletions(-) commit e90a5c89900ec2034628b8894ada7bef272326a6 Author: Carl Worth Date: Sun May 22 09:08:23 2005 +0000 Not that a patch has been submitted for consistent error handling. Fix documentation string for cairo_create so that it might actualyl appear in the manual. ChangeLog | 8 ++++++++ TODO | 2 +- src/cairo.c | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) commit b16dafe5539676874dff783ba1c31dc5a65cf9a4 Author: Carl Worth Date: Wed May 18 10:23:48 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_1_5. pixman/ChangeLog | 5 +++++ pixman/configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 17c740eb6bb7567a0ac70afd339d1a0cc0bb979e Author: Carl Worth Date: Wed May 18 10:13:14 2005 +0000 Add notes for snapshot 0.1.5. Increment version to 0.1.5. pixman/ChangeLog | 6 ++++++ pixman/NEWS | 18 ++++++++++++++++++ pixman/configure.in | 2 +- 3 files changed, 25 insertions(+), 1 deletions(-) commit b1301f401336a29f63a8b5990969e03593f1808a Author: Carl Worth Date: Wed May 18 09:41:47 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_5_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit f083b21c76b3a3f542b93d32a40cd5deccc0c985 Author: Carl Worth Date: Wed May 18 09:27:24 2005 +0000 Clear pointers to NULL after destroying/freeing them. pixman/ChangeLog | 5 +++++ pixman/src/icimage.c | 12 +++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) commit 55a7bb718ffe9598b8c39902023e68355836592f Author: Carl Worth Date: Wed May 18 09:25:54 2005 +0000 Declare pixman_fixed16_16_t properly as int32_t rather than just int. Reported by Lance Fetters. pixman/ChangeLog | 5 +++++ pixman/src/pixman.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit f030aec810d74a60a44c35bf7815b9e94743cd65 Author: Carl Worth Date: Tue May 17 18:39:56 2005 +0000 Added porting guide to help with transition to cairo 0.5 API. Added notes for snapshot 0.5.0 Increment CAIRO_VERSION to 0.5.0 ChangeLog | 9 ++ NEWS | 304 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PORTING_GUIDE | 257 ++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 4 files changed, 571 insertions(+), 1 deletions(-) commit 3f9573b7bb3f3066ad3e20908edd4af30cac3284 Author: Carl Worth Date: Tue May 17 15:23:53 2005 +0000 Bring up to date with Keith's latest improvements to cairo-xlib-surface.c: Add some comments about how and why masks are computed. Generalize overflow detection in mask computation. Expand on pixman format conversion comment. Fix the broken visual->format case. ChangeLog | 11 ++++++++- src/cairo-xcb-surface.c | 53 ++++++++++++++++++++++++++-------------------- 2 files changed, 40 insertions(+), 24 deletions(-) commit f0923288c58f42bf45dc6658a504b14faec6df53 Author: Carl Worth Date: Tue May 17 12:40:55 2005 +0000 Two fixes from Kristion Høgsberg: Fix to close the file if we opened it. Grab the status from out of the stream _before_ we destroy the stream. ChangeLog | 12 ++++++++++++ src/cairo-output-stream.c | 9 ++++++++- src/cairo-pdf-surface.c | 5 ++++- 3 files changed, 24 insertions(+), 2 deletions(-) commit b4710711b8e39738587249f04a41ae99c5eae981 Author: Keith Packard Date: Tue May 17 12:21:56 2005 +0000 Add some comments about how and why masks are computed. Generalize overflow detection in mask computation. Expand on pixman format conversion comment. ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 32 ++++++++++++++++++++------------ 2 files changed, 27 insertions(+), 12 deletions(-) commit e72c41f95b8ae262f82d9023174c88f4e9c02fe3 Author: Carl Worth Date: Tue May 17 11:28:26 2005 +0000 Fix documentation to not mention set_size for the _for_bitmap functions. ChangeLog | 6 ++++++ src/cairo-xcb-surface.c | 6 +----- src/cairo-xlib-surface.c | 6 +----- 3 files changed, 8 insertions(+), 10 deletions(-) commit 5cc39a708c623cbe6a8c5efdad538778b2fbadd7 Author: Carl Worth Date: Tue May 17 09:13:02 2005 +0000 Remove #ifdef munging since we once again support either #if or #ifdef. ChangeLog | 5 +++++ RELEASING | 7 +++++-- util/cairo-api-update | 1 - 3 files changed, 10 insertions(+), 3 deletions(-) commit ec84ace5a6830778d29d36f9fc87361e8545f57b Author: Carl Worth Date: Tue May 17 09:08:23 2005 +0000 Update instructions to match output of 'make distcheck' Add private headers and flesh out CLEANFILES so that 'make distcheck' actually passes. ChangeLog | 9 +++++++++ RELEASING | 7 ++++--- src/Makefile.am | 4 ++++ test/Makefile.am | 4 ++-- 4 files changed, 19 insertions(+), 5 deletions(-) commit 366aa98a792460bda8de70bc7eb342950e214ce3 Author: Carl Worth Date: Tue May 17 08:34:44 2005 +0000 Fix more deprecation macros src/cairo.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 23b7ac25edae4992c78b20f02d538bd717799f95 Author: Carl Worth Date: Tue May 17 08:26:37 2005 +0000 Add a few more REPLACED_BY and DEPRECATED_BY definitions. Add some helpful warnings. ChangeLog | 7 +++++++ src/cairo.h | 17 ++++++++++++++++- util/cairo-api-update | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletions(-) commit f82a3b2b557c91be0f6e6e26f89c5f7ef90b426a Author: Carl Worth Date: Tue May 17 06:12:52 2005 +0000 Add cairo-xlib-xrender.h which was missed from an earlier commit. ChangeLog | 5 +++++ src/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 30d7ede3dfdc256180e4447debd0be6d69c699b7 Author: Carl Worth Date: Tue May 17 06:11:32 2005 +0000 Update cairo-xcb.h to provide the same style of interface as cairo-xlib.h. Update to match new cairo_xcb_surface_t create functions. ChangeLog | 14 ++ src/Makefile.am | 2 +- src/cairo-xcb-surface.c | 410 +++++++++++++++++++++++++++-------------------- src/cairo-xcb-xrender.h | 62 +++++++ src/cairo-xcb.h | 21 +-- test/cairo-test.c | 115 ++++++++++++-- 6 files changed, 427 insertions(+), 197 deletions(-) commit f67f5003df306de40416f24bc652fc4630cf5808 Author: Carl Worth Date: Tue May 17 06:08:01 2005 +0000 Avoid shifting 32-bit quanity by 32 bits, which is undefined behavior. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit 0c05b23b3165ec6908c28f56b3446cf43dff44a2 Author: Carl Worth Date: Tue May 17 06:05:13 2005 +0000 Rework of cairo_xlib_surface create functions by Keith Packard: Add cairo_xlib_surface_create_with_render_format. Reduce Xlib constructors down to two simple forms. Add width, height to constructors and eliminate any synchronous size queries from the implementation. Update to match new cairo_xlib_surface_t create functions. ChangeLog | 18 ++ src/cairo-xlib-surface.c | 453 ++++++++++++++++++++++++---------------------- src/cairo-xlib-xrender.h | 62 +++++++ src/cairo-xlib.h | 15 +- test/cairo-test.c | 14 +- test/xlib-surface.c | 10 +- 6 files changed, 342 insertions(+), 230 deletions(-) commit 84bc5a32d6b3ad366698c14a01f7a4898f1cd25c Author: Carl Worth Date: Tue May 17 05:58:01 2005 +0000 Remove destroy_closure from cairo_output_stream_t interface. Remove destroy_closure argument from cairo_pdf_surface_create_for_stream. Rename width,height to width_in_points, height_in_points for better clarity. Brush a bunch of dust off of the PS backend and bring it up to date with the latest API conventions from the PDF backend. These include: accepting a filename rather than a FILE in the primary constructor, providing a stream-based interface for more flexibility, and accepting a surface size in device-space units (points) rather than inches. Make it a little more clear that the width and height being passed around are in units of points. Update to the latest cairo-ps.h changes as described above. Notice how much more sane things become now that the surface size is described in device-space units. ChangeLog | 27 ++++++++ src/cairo-output-stream.c | 23 ++----- src/cairo-pdf-surface.c | 13 ++-- src/cairo-pdf.h | 17 +++--- src/cairo-ps-surface.c | 153 ++++++++++++++++++++++++++++----------------- src/cairo-ps.h | 19 ++++-- src/cairoint.h | 1 - test/pdf-surface.c | 11 ++-- test/ps-surface.c | 13 +--- 9 files changed, 164 insertions(+), 113 deletions(-) commit 9bf26e8e73e0bafd7361ae38d485c9b9b17794b1 Author: Carl Worth Date: Tue May 17 01:05:35 2005 +0000 Add simple test for ps surface backend (modeled after pdf-surface.c). Add print message telling user to examine resulting file. ChangeLog | 10 ++++ test/.cvsignore | 2 + test/Makefile.am | 5 ++ test/pdf-surface.c | 2 + test/ps-surface.c | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 141 insertions(+), 0 deletions(-) commit 189161118faeb3a6d5d7b625f16ffbef22231c93 Author: Carl Worth Date: Tue May 17 00:54:09 2005 +0000 Update PDF test case to make sure we're actually getting the right paper size, image scaling etc. And it should now be easier to see if cairo is happy by manually viewing the resulting PDF file. ChangeLog | 7 ++++++ test/pdf-surface.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 62 insertions(+), 7 deletions(-) commit 9bf669a790cfda9950a8fa204de541133c671bd9 Author: Carl Worth Date: Tue May 17 00:39:17 2005 +0000 Fix to include cairo-xlib.h, (which also fixes test/xlib-surface.c). ChangeLog | 5 +++++ src/cairo-xlib-test.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 91dcaea6a2cd9a169e8b0a23a1a0902cd42b3a93 Author: Carl Worth Date: Tue May 17 00:34:10 2005 +0000 Update to the latest PDF surface API changes: use filename not FILE* and use surface dimension in points, not inches. ChangeLog | 6 ++++++ test/pdf-surface.c | 18 ++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) commit 200bcda18859699832ea2cf8d86abd57b501aecc Author: Keith Packard Date: Mon May 16 22:31:36 2005 +0000 Initialize op->stops[0].scale = 0. This scale value is used only when computing gradient values before the defined range, in which case stop 0 is used for both ends of the interpolation, making the value of 'scale' not actually matter, except that valgrind notices we're using an undefined value. ChangeLog | 11 +++++++++++ src/cairo-pattern.c | 7 +++++++ 2 files changed, 18 insertions(+), 0 deletions(-) commit e5b31bca7c0a7d7eb4dec303fb652c26652c3f60 Author: Carl Worth Date: Mon May 16 15:05:56 2005 +0000 Remove quarter-over test name accidentally added to Makefile. ChangeLog | 6 ++++++ test/.cvsignore | 1 - test/Makefile.am | 3 --- 3 files changed, 6 insertions(+), 4 deletions(-) commit ea410111d38145e7c74558951b1d895ebaf6f8dc Author: Kristian Høgsberg Date: Mon May 16 11:41:42 2005 +0000 Take a filename instead of a FILE pointer. ChangeLog | 7 +++++++ src/cairo-output-stream.c | 20 +++++++++++++++++--- src/cairo-pdf-surface.c | 24 ++++++++++++------------ src/cairo-pdf.h | 10 ++++------ src/cairoint.h | 2 +- 5 files changed, 41 insertions(+), 22 deletions(-) commit 60b0a05df73cef4a67d111a282b20ce1fd5081e6 Author: Carl Worth Date: Sat May 14 14:01:46 2005 +0000 Brush the dust off the XCB backend and get it compiling and working again. This patch makes the XCB surface API match that of the Xlib surface API as of yesterday. But, it's already stale as the Xlib API changed again. So we'll need one more revision of the XCB backend before the next snapshot. Add support for testing of the xcb backend as well. ChangeLog | 24 +++ src/cairo-xcb-surface.c | 404 +++++++++++++++++++++++++++++++++++++++-------- src/cairo-xcb.h | 22 ++- test/.cvsignore | 2 + test/Makefile.am | 3 + test/cairo-test.c | 47 ++++++- test/cairo-test.h | 2 - 7 files changed, 427 insertions(+), 77 deletions(-) commit 6a1af1999dfb79f05341ea6c4bf0e23795db01bc Author: Carl Worth Date: Sat May 14 13:51:59 2005 +0000 Cleanup output a bit, move verbose messages to test-specific log file. ChangeLog | 7 +++++++ test/cairo-test.c | 6 +++++- test/pdf-surface.c | 1 + test/xlib-surface.c | 31 ++++++++++++++++++------------- 4 files changed, 31 insertions(+), 14 deletions(-) commit 53e6fdb8855ad7bc54ec40ebf6609cccb6eac54c Author: Carl Worth Date: Sat May 14 13:22:25 2005 +0000 Fix the last commit so it actually compiles now. ChangeLog | 8 +++++++- src/cairo-xlib-surface.c | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) commit 55366995b6783309493af8a9f88560b6ad3494ff Author: Carl Worth Date: Sat May 14 10:15:11 2005 +0000 Fix a few documentation typos in the recent xlib surface rework. ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 17 +++++++++-------- test/.cvsignore | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) commit 95859dc2c6975f072696374b90e1108626a99830 Author: Carl Worth Date: Sat May 14 10:03:56 2005 +0000 Add an #error if cairo-foo.h is included when cairo was compiled without support for the foo backend. ChangeLog | 13 +++++++++++++ src/cairo-atsui.h | 3 +++ src/cairo-ft.h | 3 +++ src/cairo-glitz.h | 3 +++ src/cairo-pdf.h | 3 +++ src/cairo-ps.h | 3 +++ src/cairo-quartz.h | 3 +++ src/cairo-win32.h | 6 ++++-- src/cairo-xcb.h | 3 +++ src/cairo-xlib.h | 3 +++ 10 files changed, 41 insertions(+), 2 deletions(-) commit f797eaac1ce939a0a890ab2157f42d2ae3421dda Author: Carl Worth Date: Sat May 14 10:00:27 2005 +0000 Update for change in cairo_pdf_surface_create which no longer accepts DPI values. ChangeLog | 5 +++++ test/pdf-surface.c | 3 +-- 2 files changed, 6 insertions(+), 2 deletions(-) commit bef4b1371676444e51dcd73f1ec52024265c1f5b Author: Owen Taylor Date: Fri May 13 17:54:43 2005 +0000 src/cairo-xlib-surface.c src/cairo-xlib.h doc/public/cairo-sections.txt: Drop the _for_pixmap() and _for_window() out of the create functions and use some lazy cleverness to sniff the information out as needed. src/cairo-xlib-surface.c src/cairo-xlib-test.h Makefile.am: add cairo_test_xlib_disable_render() to turn off RENDER for tests. Test various different types of Xlib surface creation. Remove left-over include of Xrender.h. ChangeLog | 16 +++ doc/public/Makefile.am | 1 + doc/public/cairo-sections.txt | 5 +- doc/public/tmpl/cairo-xlib.sgml | 20 +--- src/Makefile.am | 2 +- src/cairo-xlib-surface.c | 190 +++++++++++++++++++---------- src/cairo-xlib-test.h | 55 ++++++++ src/cairo-xlib.h | 18 +-- test/Makefile.am | 5 + test/cairo-test.c | 4 +- test/xlib-surface.c | 260 +++++++++++++++++++++++++++++++++++++++ 11 files changed, 479 insertions(+), 97 deletions(-) commit 15ecc8776327ee076274d4234f36ab584956c073 Author: Kristian Høgsberg Date: Fri May 13 14:04:22 2005 +0000 Make this a varg function and use the new _cairo_output_stream_vprintf() function to format extra dict contents. Reimplement the printf logic so we can special case formatting of doubles to be locale independent and trim trailing zeros. ChangeLog | 9 +++ src/cairo-output-stream.c | 156 +++++++++++++++++++++++++++++++++++++++++---- src/cairo-pdf-surface.c | 86 +++++++++++++------------ src/cairoint.h | 5 ++ 4 files changed, 203 insertions(+), 53 deletions(-) commit b9db66eb17754da628894a4e43943f3fbef88406 Author: Kristian Høgsberg Date: Fri May 13 09:26:20 2005 +0000 Rename cairo_pdf_surface_create_for_callback() to cairo_pdf_surface_create_for_stream(), and change PDF constructors to take width and height as points and move PPI setting to cairo_pdf_surface_set_ppi() ChangeLog | 8 +++ src/cairo-pdf-surface.c | 120 +++++++++++++++++++++-------------------------- src/cairo-pdf.h | 23 +++++---- 3 files changed, 73 insertions(+), 78 deletions(-) commit 9ebf15e9600c5a5c741cd1540478bb18f236b55d Author: Owen Taylor Date: Fri May 13 08:09:24 2005 +0000 Fix misplaced goto. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit 7c4a2b1d6e10808bac483b5f2b01efa70bca2c02 Author: Carl Worth Date: Thu May 12 23:11:55 2005 +0000 Fix image->data to be unsigned Track change in signedness of data member/parameter. ChangeLog | 13 +++++++++++++ src/cairo-glitz-surface.c | 2 +- src/cairo-image-surface.c | 6 +++--- src/cairo-xlib-surface.c | 6 +++--- src/cairoint.h | 6 +++--- 5 files changed, 23 insertions(+), 10 deletions(-) commit d5ca4e37d7b761ccc4fc500c5ba615526a4a38c7 Author: Carl Worth Date: Thu May 12 23:09:58 2005 +0000 Update xcb backend to compile after recent API changes: Fix missing return value. (_cairo_xcb_surface_acquire_source_image): Remove calls to non-existent cairo_surface functions. (_cairo_xcb_surface_set_matrix): Update for new matrix member names. (_cairo_xcb_surface_get_extents): Fix typo. ChangeLog | 11 +++++++++++ src/cairo-xcb-surface.c | 25 +++++++++++-------------- 2 files changed, 22 insertions(+), 14 deletions(-) commit 949daa1bc98cdd34a6c3d7b3ca69fd06e88883e4 Author: Keith Packard Date: Thu May 12 20:25:07 2005 +0000 libpixman creates an A8 format object and sometimes forgets to destroy (when the bounds of the trapezoids are empty). Avoids creating the format object in that case. reviewed by: cworth pixman/ChangeLog | 9 +++++++++ pixman/src/ictrap.c | 13 ++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) commit 27d9c575a77e0b6dc995e348c4877bc0092a4571 Author: Carl Worth Date: Thu May 12 11:02:35 2005 +0000 Add new test for bug in cairo_paint_with_alpha not transforming the source. Use a transformed copy of the source just like we do in all the other calls to cairo_surface_composite. Fixes the bug tested by test/paint-with-alpha. ChangeLog | 13 ++++++++ src/cairo-gstate.c | 6 +++- test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/paint-with-alpha-ref.png | Bin 0 -> 164 bytes test/paint-with-alpha.c | 64 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 1 deletions(-) commit 52f41b7bf08a5e3a599ef6ebc7273f057ada4fa6 Author: Keith Packard Date: Thu May 12 08:04:22 2005 +0000 _get_mask_extents creates a pixman region but neglects to destroy it. reviewed by: otaylor ChangeLog | 8 ++++++++ src/cairo-gstate.c | 2 ++ 2 files changed, 10 insertions(+), 0 deletions(-) commit e4e5b1f00ded346f40c788fa9b6cfdd3164c1241 Author: Owen Taylor Date: Wed May 11 16:32:44 2005 +0000 Handle more cases by assuming no-super-luminescent colors. ChangeLog | 5 +++++ src/cairo-win32-surface.c | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) commit b913a81c3482f4dc8bc452d91bfaf64b416523f3 Author: T Rowley Date: Wed May 11 16:01:56 2005 +0000 Revive quartz backend. Set fill type repeat on source surface. (_cairo_glitz_surface_show_glyphs): Add missing cairo operator to glitz operator conversion. (_cairo_glitz_surface_show_glyphs): Only render glyphs with non zero size. Fix bounding box computation. ChangeLog | 21 +++++++++ src/cairo-surface.c | 18 ++++---- src/cairo-win32-font.c | 36 +++++++------- src/cairo-win32-surface.c | 111 +++++++++++++++++++++++++++++++++++++-------- test/Makefile.am | 5 ++- test/cairo-test.c | 9 +++- 6 files changed, 149 insertions(+), 51 deletions(-) commit 3be31fee9ae5d1740f71ea829ba26df7569c976c Author: Tor Lillqvist Date: Wed May 11 15:39:26 2005 +0000 Revive quartz backend. ChangeLog | 6 ++ src/cairo-atsui-font.c | 140 ++++++++++++++----------------------------- src/cairo-atsui.h | 3 - src/cairo-quartz-surface.c | 18 ++++-- 4 files changed, 65 insertions(+), 102 deletions(-) commit ac278285c8a243c42a50e7d1f5cfc875a12401b2 Author: David Reveman Date: Wed May 11 13:53:18 2005 +0000 Avoid empty glyphs ChangeLog | 2 + src/cairo-glitz-surface.c | 63 +++++++++++++++++++++++++++++++------------- 2 files changed, 46 insertions(+), 19 deletions(-) commit bd168e15ca9dbd2a02ad5e2f7df1a661d534d679 Author: David Reveman Date: Wed May 11 13:30:56 2005 +0000 Fix fill_rectangles and show_glyphs in glitz backend ChangeLog | 7 +++++++ src/cairo-glitz-surface.c | 12 +++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) commit 59c2730b1d5fa511494858e599735948ce1cf394 Author: Owen Taylor Date: Tue May 10 21:06:01 2005 +0000 src/cairo-xlib-surface.c src/cairo-xlib.h: Remove leftover cairo_xlib_surface_create(). ChangeLog | 5 +++++ doc/public/cairo-sections.txt | 1 - doc/public/tmpl/cairo-xlib.sgml | 13 ------------- src/cairo-xlib-surface.c | 16 ---------------- src/cairo-xlib.h | 8 -------- 5 files changed, 5 insertions(+), 38 deletions(-) commit 0c7c2246681dad0b69d6ea0438f18916dbb0e0a4 Author: Owen Taylor Date: Tue May 10 20:45:54 2005 +0000 src/cairo.c src/cairo-path-data.c src/cairo-path-data-private.h: Pass the gstate to _cairo_path_data_create[_flat] and use _cairo_gstate_backend_to_user() so as to properly handle the surface device offset. ChangeLog | 7 +++++++ src/cairo-path-data-private.h | 6 ++---- src/cairo-path-data.c | 38 ++++++++++++++++---------------------- src/cairo.c | 8 ++------ 4 files changed, 27 insertions(+), 32 deletions(-) commit 4e1cce108b641fbb6931ffa1d10aa1e4aef0329c Author: Carl Worth Date: Tue May 10 20:38:21 2005 +0000 Don't use return when calling a void function (thanks to Damien Carbery ). Closes bug #3134. ChangeLog | 6 ++++++ src/cairo-arc.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit b05c85eafb953fbe082b67875865ae4e4ca56ed2 Author: Carl Worth Date: Tue May 10 20:25:38 2005 +0000 Removing mucking around with stderr and add a cairo_test_log function instead. Switch all error messages from fprintf(stderr,...) to cairo_test_log(...). ChangeLog | 14 ++++++++++++++ test/buffer-diff.c | 17 +++++++++-------- test/cairo-test.c | 45 +++++++++++++++++++++++++++++---------------- test/cairo-test.h | 3 +++ test/create-for-png.c | 2 +- test/create-from-png.c | 2 +- test/pdf-surface.c | 2 +- test/read-png.c | 9 +++++---- test/trap-clip.c | 4 ++-- test/xmalloc.c | 5 +++-- 10 files changed, 68 insertions(+), 35 deletions(-) commit 40796148b87eea991a9c624061a978821f108de6 Author: Carl Worth Date: Tue May 10 14:54:48 2005 +0000 Fix URLs for glitz and xlibs, (thanks to Jason Dorje Short ). ChangeLog | 5 +++++ configure.in | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 6f3215cb7ff9c9ccb1728192765578ebb9352ac1 Author: Carl Worth Date: Tue May 10 14:48:05 2005 +0000 Update to current canonical URL for XCB. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 3253534a824cf3b81ea5b6abeaea0e4b414834d2 Author: Carl Worth Date: Tue May 10 12:42:32 2005 +0000 Don't guess and make our own definitions for uint8_t, etc. Just error out if we can't find a suitable header file. Fix to use fixed-size type so that this code works when sizeof(unsigned long) != 32. Thanks to Manish Singh. ChangeLog | 11 +++++++++++ src/cairo-png.c | 22 +++++++++++----------- src/cairo-wideint.h | 9 ++------- test/read-png.c | 28 +++++++++++++++++++++------- 4 files changed, 45 insertions(+), 25 deletions(-) commit c66ca528e037381f485b53bb36b2e9a735c2b8f5 Author: Carl Worth Date: Tue May 10 12:22:41 2005 +0000 Fix cairo_get_font_matrix to actually use its out-parameter. And change the return type to void. ChangeLog | 8 ++++++++ src/cairo-gstate.c | 7 ++++--- src/cairo.c | 10 +++++----- src/cairo.h | 5 +++-- src/cairoint.h | 5 +++-- 5 files changed, 23 insertions(+), 12 deletions(-) commit 7b46c815d2652a02aca77a3a962a37e22e9d04fb Author: Owen Taylor Date: Mon May 9 16:33:59 2005 +0000 Get the glyphslot point *after* we get the FT_Face. (Robert O'Callahan) ChangeLog | 5 +++++ src/cairo-ft-font.c | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit 01b2526ceb77e43f653f2909f6ff998a956d72a5 Author: Carl Worth Date: Mon May 9 10:41:17 2005 +0000 Fix deprecation macro to point to the right function, (thanks to John Ellson). ChangeLog | 5 +++++ src/cairo.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 14c690472cf893978331dcf25cc50d43609928ad Author: Carl Worth Date: Mon May 9 09:12:52 2005 +0000 Push cairo_matrix_t const-correctness down through the entire implmentation, (expanding on preliminary work by Robert O'Callahan ) ChangeLog | 25 +++++++++++++++++++++++++ src/cairo-font.c | 18 +++++++++--------- src/cairo-ft-font.c | 19 ++++++++++--------- src/cairo-gstate.c | 11 ++++++----- src/cairo-image-surface.c | 2 +- src/cairo-matrix.c | 19 +++++++++++-------- src/cairo-pattern.c | 7 ++++--- src/cairo.c | 10 ++++++---- src/cairo.h | 30 +++++++++++++++++------------- src/cairoint.h | 45 ++++++++++++++++++++++++--------------------- 10 files changed, 113 insertions(+), 73 deletions(-) commit 31b4e5b4ecda4b3733f39b5f1f759cc59f953836 Author: Carl Worth Date: Mon May 9 08:34:57 2005 +0000 Change cairo-features again so that either #if or #ifdef will work to test any feature. ChangeLog | 6 ++++++ configure.in | 44 +++++++++++--------------------------------- src/cairo-features.h.in | 22 +++++++++++----------- 3 files changed, 28 insertions(+), 44 deletions(-) commit 2e72b70124f678ba0bd21db318345a6583cb9cbd Author: Owen Taylor Date: Sat May 7 14:31:01 2005 +0000 doc/public/language-bindings.xml doc/public/cairo-doc.xml doc/public/Makefile.am: Document suggested conventions and techniques for many aspects of creating a language binding for Cairo. ChangeLog | 7 + doc/public/language-bindings.xml | 726 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 733 insertions(+), 0 deletions(-) commit 35248a17fd2cb1f4ff2bf312c092f853551bb9eb Author: Owen Taylor Date: Sat May 7 10:35:35 2005 +0000 Update. ChangeLog | 4 ++ doc/public/cairo-sections.txt | 19 +-------- doc/public/tmpl/cairo-glitz.sgml | 9 ---- doc/public/tmpl/cairo-pdf.sgml | 33 --------------- doc/public/tmpl/cairo-ps.sgml | 13 ------ doc/public/tmpl/cairo-quartz.sgml | 11 ----- doc/public/tmpl/cairo-surface.sgml | 25 +++++++----- doc/public/tmpl/cairo-xcb.sgml | 12 ----- doc/public/tmpl/cairo-xlib.sgml | 10 ----- doc/public/tmpl/cairo.sgml | 79 +++++++++-------------------------- 10 files changed, 41 insertions(+), 174 deletions(-) commit bc794062600a774a71045055deae5ad28483d7ec Author: Carl Worth Date: Fri May 6 22:42:52 2005 +0000 Point to both cairo_set_source_rgba and cairo_paint_with_alpha in deprecation of cairo_set_alpha. ChangeLog | 6 ++++++ src/cairo.h | 2 +- util/cairo-api-update | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) commit 750cc8143dda4e6194880dfc314a296424b325e5 Author: Carl Worth Date: Fri May 6 21:59:10 2005 +0000 Make idempotent substitutions that extend old names: cairo_select_font -> cairo_select_font_face cairo_pattern_add_color_stop -> cairo_pattern_add_color_stop_rgba by only substituting if the old name is not immediately followed by an underscore. Tweak the substitution slightly to allow the script to be run on the cairo source itself, (eg. avoid changing the REPLACED_BY and DEPRECATED_BY macros that must mention the old names). ChangeLog | 15 +++++++++++++++ util/cairo-api-update | 7 ++++--- 2 files changed, 19 insertions(+), 3 deletions(-) commit 10c88d424485c7f001e9e03c121aa7c3b55336cc Author: Carl Worth Date: Fri May 6 21:33:22 2005 +0000 Change definitions of everything in cairo-features.h to prefer #if over #ifdef. Track #ifdef -> #if changes. Add support to automatically change all #ifdef CAIRO_HAS to #if CAIRO_HAS. ChangeLog | 26 +++++++++ configure.in | 135 +++++++++++++++++++---------------------------- src/cairo-atsui.h | 2 +- src/cairo-cache.c | 6 +- src/cairo-features.h.in | 24 ++++----- src/cairo-ft-private.h | 2 +- src/cairo-ft.h | 2 +- src/cairo-glitz.h | 2 +- src/cairo-hash.c | 6 +- src/cairo-pdf.h | 2 +- src/cairo-ps.h | 2 +- src/cairo-quartz.h | 2 +- src/cairo-win32.h | 2 +- src/cairo-xcb.h | 2 +- src/cairo-xlib.h | 2 +- src/cairo.c | 7 +-- src/cairo.h | 4 +- src/cairoint.h | 12 ++-- test/cairo-test.c | 16 +++--- util/cairo-api-update | 1 + 20 files changed, 127 insertions(+), 130 deletions(-) commit 9939e01b693a885496cfa82430b91c11a121269e Author: Carl Worth Date: Fri May 6 21:25:56 2005 +0000 Remove deprecated cairo_get_rgb_color that was accidentally missed in the recent purge of deprecated functions. ChangeLog | 9 +++++++++ src/cairo-gstate.c | 6 ------ src/cairo-pattern.c | 19 ------------------- src/cairo.c | 25 ------------------------- src/cairo.h | 3 --- src/cairoint.h | 10 ---------- 6 files changed, 9 insertions(+), 63 deletions(-) commit 4fff218fc4e1cdce281b916ecb6b616e581601e0 Author: Carl Worth Date: Fri May 6 21:19:49 2005 +0000 Update to track new CAIRO_OPERATOR names. Fix documentation to refer to functions by their current names. Update to track latest API (in currently unused function). ChangeLog | 14 ++++++++++++++ src/cairo-gstate.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-win32-surface.c | 6 +++--- src/cairo-xcb-surface.c | 12 ++++++------ test/select-font-no-show-text.c | 4 ++-- 6 files changed, 27 insertions(+), 13 deletions(-) commit 7bf02c12ab3aafae5f6cf8519401d1272b183d30 Author: Carl Worth Date: Fri May 6 14:20:05 2005 +0000 Fix return type from cairo_status_t to cairo_int_status_t. ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit c7afce2ffdbc1e2d4eae2ba5a85dfff4ad3016ad Author: Carl Worth Date: Fri May 6 13:42:45 2005 +0000 Note that cairo_mask, and "just eliminate a bunch of functions are now done". Note that all backwards-compatible and backwards-incompatible cahnges for the API Shakeup are now done. Sort "new functionality" of API Shakeup into its own category. ChangeLog | 10 ++++++++++ ROADMAP | 17 ++++++++--------- TODO | 31 +++++++++++++++++-------------- 3 files changed, 35 insertions(+), 23 deletions(-) commit d7fe527e0f48f23821b7283d8d003fd1f6a3f899 Author: Carl Worth Date: Fri May 6 13:32:53 2005 +0000 Eliminate the following deprecated functions from cairo's interface: cairo_copy cairo_get_path cairo_get_path_flat cairo_matrix_create cairo_matrix_destroy cairo_matrix_copy cairo_matrix_get_affine cairo_surface_set_repeat cairo_surface_set_matrix cairo_surface_get_matrix cairo_surface_set_filter cairo_surface_get_filter Also, eliminate all support for compiling against, or running with old, deprecated names for functions. Deal with all of the removals. ChangeLog | 65 ++++++++++ src/cairo-ft-font.c | 8 +- src/cairo-gstate.c | 15 --- src/cairo-image-surface.c | 1 - src/cairo-matrix.c | 116 ++++------------- src/cairo-pattern.c | 17 ++-- src/cairo-pdf-surface.c | 10 +- src/cairo-surface.c | 79 ------------ src/cairo-xlib-surface.c | 8 +- src/cairo.c | 145 --------------------- src/cairo.h | 265 +++++++++++---------------------------- src/cairoint.h | 19 ++-- test/cairo-test.c | 7 +- test/gradient-alpha.c | 16 ++-- test/mask.c | 8 +- test/move-to-show-surface.c | 5 +- test/select-font-no-show-text.c | 6 +- test/set-source.c | 4 +- test/text-cache-crash.c | 16 ++- test/text-rotate.c | 6 +- test/transforms.c | 2 +- test/translate-show-surface.c | 5 +- test/trap-clip.c | 8 +- util/cairo-api-update | 48 +++++-- 24 files changed, 274 insertions(+), 605 deletions(-) commit a790a2ea79507cae9564006ac32e27a0fcca8d60 Author: Carl Worth Date: Fri May 6 13:26:16 2005 +0000 Rename and re-order the cairo_operator_t enum to names that abbreviate less and are easier to understand, (eg. CAIRO_OPERATOR_DEST_OVER instead of CAIRO_OPEERATOR_OVER_REVERSE). ChangeLog | 20 ++++++++++++++++++++ src/cairo-glitz-surface.c | 43 ++++++++++++++++++++++++++++++------------- src/cairo-gstate.c | 2 +- src/cairo-image-surface.c | 30 +++++++++++++++++++----------- src/cairo-ps-surface.c | 4 ++-- src/cairo-surface.c | 2 +- src/cairo-xlib-surface.c | 23 +++++++++++++---------- src/cairo.h | 17 ++++++++++------- test/cairo-test.c | 2 +- test/mask.c | 4 ++-- 10 files changed, 99 insertions(+), 48 deletions(-) commit d6fc5ee5e97f60972ec80fcfc52f0cf8b780d2a9 Author: Carl Worth Date: Fri May 6 13:23:41 2005 +0000 Remove cairo_set_target_surface and all other backend-specific cairo_set_target functions. Require a cairo_surface_t* to call cairo_create. Port to use new cairo_create interface. Rewrite all tests that were using cairo_set_target_surface to instead create a temporary cairo_t, (eventually to be replaced with cairo_begin_group). ChangeLog | 42 ++++ src/cairo-glitz.h | 4 - src/cairo-gstate.c | 28 ++- src/cairo-pdf.h | 18 -- src/cairo-ps.h | 8 - src/cairo-quartz-surface.c | 24 -- src/cairo-quartz.h | 6 - src/cairo-surface.c | 2 +- src/cairo-win32.h | 4 - src/cairo-xcb.h | 7 - src/cairo-xlib.h | 7 - src/cairo.c | 429 ++++--------------------------------- src/cairo.h | 86 +++----- src/cairoint.h | 11 +- test/cairo-test.c | 100 +++++----- test/clip-nesting.c | 9 +- test/mask.c | 10 +- test/path-data.c | 13 +- test/pdf-surface.c | 13 +- test/pixman-rotate.c | 35 ++-- test/scale-source-surface-paint.c | 1 - test/self-copy.c | 2 +- test/source-clip.c | 5 +- test/source-surface-scale-paint.c | 1 - test/surface-pattern.c | 25 +-- 25 files changed, 245 insertions(+), 645 deletions(-) commit cea1de7579fad18ca6c9ec9bb29660970ec283b3 Author: Owen Taylor Date: Fri May 6 12:00:22 2005 +0000 src/cairo.[ch] doc/public/cairo-sections.txt: Add cairo_paint_with_alpha(). Fix segfault when mask == NULL. test/mask.c test/mask-ref.png: Add testing of cairo_paint_with_alpha(). test/coverage.c test/coverage-ref.png: Remove ... it's not testing anything that mask doesn't test better. ChangeLog | 13 +++ doc/public/Makefile.am | 3 +- doc/public/cairo-docs.xml | 8 +-- doc/public/cairo-sections.txt | 2 + doc/public/tmpl/cairo.sgml | 31 +++++--- src/cairo-pattern.c | 4 +- src/cairo.c | 31 +++++++ src/cairo.h | 4 + test/Makefile.am | 4 - test/coverage-ref.png | Bin 25904 -> 0 bytes test/coverage.c | 185 ----------------------------------------- test/mask-ref.png | Bin 58954 -> 87846 bytes test/mask.c | 7 ++ 13 files changed, 83 insertions(+), 209 deletions(-) commit 7f79e048b96dd3e2b2c798047aff312560de5006 Author: David Reveman Date: Wed May 4 05:45:59 2005 +0000 Add glyph caching to glitz backend ChangeLog | 4 + src/cairo-glitz-surface.c | 856 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 859 insertions(+), 1 deletions(-) commit 8e485ec8c203f7fd1ce1cf4adc0c491732c97ecb Author: Kristian Høgsberg Date: Tue May 3 14:28:50 2005 +0000 Fills as paths patch originally by Owen Taylor. Make sure we have a current point for the relative path operators. Add fill_path backend method. Implement fill_path in the PDF backend. ChangeLog | 21 +++++++++ src/cairo-gstate.c | 8 +++ src/cairo-path.c | 9 ++++ src/cairo-pdf-surface.c | 116 +++++++++++++++++++++++++++++++++++++++++++---- src/cairo-surface.c | 13 +++++ src/cairoint.h | 13 +++++ 6 files changed, 171 insertions(+), 9 deletions(-) commit 05ccd7685420be7c7213e68462e1fcc4c01bad3c Author: Carl Worth Date: Tue May 3 08:33:32 2005 +0000 Originally 2005-04-20 Carl Worth Remove cairo_show_surface. Add new cairo_set_source_surface. Remove _cairo_gstate_show_surface. Replace calls to cairo_show_surface with cairo_set_source_surface; cairo_paint. Fix messages to prefer - over _. Fix documentation. Three new tests to exercise set_source_surface more completely, (two of these are expected failures dues to outstanding bugs). ChangeLog | 31 +++++ src/cairo-gstate.c | 188 +------------------------------ src/cairo-png.c | 11 +- src/cairo.c | 49 +++++---- src/cairo.h | 20 +--- test/.cvsignore | 10 ++- test/Makefile.am | 128 +++++++++++---------- test/cairo-test.c | 2 +- test/create-for-png.c | 6 +- test/create-from-png.c | 6 +- test/filter-nearest-offset-ref.png | Bin 0 -> 254 bytes test/filter-nearest-offset.c | 107 ++++++++++++++++++ test/move-to-show-surface.c | 5 +- test/pixman-rotate.c | 3 +- test/scale-source-surface-paint-ref.png | Bin 0 -> 147 bytes test/scale-source-surface-paint.c | 65 +++++++++++ test/source-surface-scale-paint-ref.png | Bin 0 -> 147 bytes test/source-surface-scale-paint.c | 65 +++++++++++ test/translate-show-surface.c | 3 +- 19 files changed, 399 insertions(+), 300 deletions(-) commit 8283381f120c0d5a4d3d770a541a576974cfdf89 Author: Carl Worth Date: Tue May 3 08:16:47 2005 +0000 Add suggestion for copy-on-write regions to fix clip region problems. Fix check for old headers to respect DESTDIR, (to work better when cross-compiling, etc.). Thanks to Luke-Jr . ChangeLog | 9 +++++++++ TODO | 4 ++++ src/Makefile.am | 2 +- 3 files changed, 14 insertions(+), 1 deletions(-) commit e227a106850ccced4e55bbc5cd5f139c6139aa2a Author: Owen Taylor Date: Mon May 2 14:20:07 2005 +0000 Changes the sign of extents->descent to match win32 backend and the conventional convention. Document cairo_font_extents_t. ChangeLog | 8 ++++++++ src/cairo-ft-font.c | 2 +- src/cairo.h | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 3 files changed, 53 insertions(+), 4 deletions(-) commit 7dbd1f4401eb892ea58c147a61f02535d30318ab Author: Owen Taylor Date: Mon May 2 13:39:30 2005 +0000 src/cairo-surface.c src/cairoint.h: Add _cairo_surface_begin/end to save and restore the clip state of a surface. Copy and store clip regions set on a surface so that we can save and restore them. Add a CAIRO_STATUS_BAD_NESTING error for interleaved use of two cairo_t's on the same surface. Also, add a skeleton doc comment for cairo_status_t. src/cairo.c src/cairo-gstate.c src/cairoint.h: Use _cairo_surface_begin/end to replace _cairo_gstate_restore_external_state. Use _cairo_surface_begin/end to save the state of a surface when we start drawing at it and restore it at the end. Check that the save level of the surface is what we expect on drawing operations and fail with CAIRO_STATUS_BAD_NESTING otherwise. src/cairo-pattern.c src/cairoint.h (_cairo_pattern_acquire_surface_for_surface) (_cairo_pattern_release_surface): Surround use of pattern->surface with _cairo_surface->begin/end so we don't clip surfaces used as sources. test/clip-nesting.c test/Makefile.am: Test of destinatin clipping with the nested creation of cairo_t's for the same context. test/source-clip.c test/Makefile.am: Test that clipping on a source as a destination doesn't affect use of it as a source. XFAIL test for copying from a surface as a source to itself as a destination with a clip. ChangeLog | 35 +++++++++ doc/public/tmpl/cairo.sgml | 1 + src/cairo-gstate-private.h | 1 + src/cairo-gstate.c | 75 +++++++++++++------ src/cairo-pattern.c | 82 ++++++++++++++------ src/cairo-surface.c | 181 ++++++++++++++++++++++++++++++++++++++------ src/cairo.c | 14 +++- src/cairo.h | 29 +++++++- src/cairoint.h | 21 ++++- test/Makefile.am | 11 +++ test/clip-nesting-ref.png | Bin 0 -> 1050 bytes test/clip-nesting.c | 101 ++++++++++++++++++++++++ test/self-copy-ref.png | Bin 0 -> 291 bytes test/self-copy.c | 90 ++++++++++++++++++++++ test/source-clip-ref.png | Bin 0 -> 180 bytes test/source-clip.c | 85 +++++++++++++++++++++ 16 files changed, 649 insertions(+), 77 deletions(-) commit 4ce3d3fb266908f2fe98564bf7dad387420dba9c Author: Keith Packard Date: Mon May 2 12:36:20 2005 +0000 Use correct arguments to compute absolute positions. Test cairo_rel_move_to, cairo_rel_line_to and cairo_rel_curve_to reviewed by: cworth ChangeLog | 12 ++++++++++ src/cairo-path.c | 8 +++--- test/Makefile.am | 7 ++++- test/rel-path-ref.png | Bin 0 -> 212 bytes test/rel-path.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) commit 1464e35fde29e0a03a7ce033327a2f00396f71b0 Author: Owen Taylor Date: Mon May 2 11:42:41 2005 +0000 not mask.png. (Pointed out by Carl) ChangeLog | 5 +++++ test/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 79b2a79f2d9ba8dbef44d04656fa84d83836ac6c Author: Owen Taylor Date: Mon May 2 11:01:18 2005 +0000 src/cairo.[ch] src/cairo-gstate.c: Add cairo_mask() and cairo_mask_surface(). test/maks.c tests/Makefile.am tests/mask-ref.png: Add a comprehensive tests for cairo_mask(). Updated ChangeLog | 10 ++ doc/public/cairo-sections.txt | 2 + doc/public/tmpl/cairo.sgml | 20 +++ src/cairo-gstate.c | 259 ++++++++++++++++++++++++++++++----------- src/cairo.c | 62 ++++++++++ src/cairo.h | 10 ++ src/cairoint.h | 4 + test/Makefile.am | 3 + test/mask-ref.png | Bin 0 -> 58954 bytes test/mask.c | 241 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 544 insertions(+), 67 deletions(-) commit 0c40f66c04bffa1847d37cf9c64e48db9e76f51f Author: Kristian Høgsberg Date: Sun May 1 22:30:58 2005 +0000 Also call _cairo_gstate_ensure_font() for this function. ChangeLog | 5 +++++ src/cairo-gstate.c | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 388a8d491d43901a6608174daad284c35a10ea6c Author: Owen Taylor Date: Thu Apr 28 13:41:00 2005 +0000 Add a item about reworking cairo_format_t. ChangeLog | 4 ++++ ROADMAP | 6 ++++++ TODO | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 0 deletions(-) commit 2dd5f40bc052a48c964acefe43005d727c045238 Author: Owen Taylor Date: Thu Apr 28 11:16:52 2005 +0000 Set image->pCompositeClip here. (IcComputeCompositeRegion) src/icrect.c (pixman_color_rects): Remove workaround clipping to the clientClip. pixman/ChangeLog | 7 +++++++ pixman/src/icimage.c | 23 ++++++++++++++++------- pixman/src/icrect.c | 2 -- 3 files changed, 23 insertions(+), 9 deletions(-) commit 2a6e7ef7c3d42f2e51eefdd218f43f7272faf594 Author: Carl Worth Date: Thu Apr 28 11:15:47 2005 +0000 Replace annoying _ in output image filenames with - for better consistency. ChangeLog | 6 ++++++ test/.cvsignore | 4 ++-- test/cairo-test.c | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) commit f3bc5e55541b53c414d066a1f6afb89e55f68a08 Author: Carl Worth Date: Wed Apr 27 14:09:41 2005 +0000 Use 1 instead of 0 for width and height to avoid BadValue errors from XCreatePixmap. ChangeLog | 6 ++++++ test/cairo-test.c | 5 +++++ 2 files changed, 11 insertions(+), 0 deletions(-) commit 2f5b0808b8e19af0c8c9e5fbaef4051404f7d7e7 Author: Carl Worth Date: Wed Apr 27 13:33:25 2005 +0000 Add support for testing multiple backends, courtesy of cairo_surface_write_to_png. Currently, only image and xlib backends are fullk hooked-up, but other backends should be quite easy to add for anyone skilled in the appropriate art. ChangeLog | 18 +++ test/.cvsignore | 3 +- test/buffer-diff.c | 98 ++++++++++++++-- test/buffer-diff.h | 18 +++- test/cairo-test.c | 323 ++++++++++++++++++++++++++++++++++++++-------------- test/cairo-test.h | 1 + test/read-png.c | 4 + test/xmalloc.h | 2 + 8 files changed, 362 insertions(+), 105 deletions(-) commit eabc32a0114ba86a450539e3fbde4cabab8d6b8f Author: Owen Taylor Date: Wed Apr 27 13:02:20 2005 +0000 Don't use pixman_compositeSrc_8888x8888 when the source is x8r8g8b8 or x8b8g8r8. pixman/ChangeLog | 5 +++++ pixman/src/ic.c | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) commit c382f9daf091331a37df61a8cfe883b7606af66b Author: Owen Taylor Date: Wed Apr 27 10:16:47 2005 +0000 src/cairo-traps.c src/cairoint.h (_cairo_traps_init_box): New function to create a single trapezoid box. src/cairo.c src/cairo-gstate.c src/cairoint.h: Move the implementation of cairo_paint() into cairo-gstate.c for a better fix for the problem with backend/user coordinate confusion. Also no longer clear the current path on cairo_paint() ChangeLog | 11 +++++++++++ src/cairo-gstate.c | 30 +++++++++++++++++++++++++++--- src/cairo-traps.c | 37 +++++++++++++++++++++++++++++++++++++ src/cairo.c | 26 +------------------------- src/cairoint.h | 11 +++++++---- 5 files changed, 83 insertions(+), 32 deletions(-) commit 153e0c5eab461320280c61e6f702b53eeeecfe82 Author: Carl Worth Date: Tue Apr 26 19:04:48 2005 +0000 Build rectangle with an identity matrix in place so that the entire target surface will be filled even when there is a transformation in place. ChangeLog | 6 ++++++ src/cairo.c | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 0 deletions(-) commit 1c316ca07ad352c2cb9a522c6babef89b2e0d001 Author: Carl Worth Date: Tue Apr 26 18:56:37 2005 +0000 Add test to demonstrate bug in cairo_paint when under a non-identity transformation. ChangeLog | 8 +++++++ test/.cvsignore | 2 + test/Makefile.am | 3 ++ test/paint-ref.png | Bin 0 -> 116 bytes test/paint.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 0 deletions(-) commit 86a17d5357a0164e418f57a3f0d383c429782858 Author: Owen Taylor Date: Tue Apr 26 15:28:01 2005 +0000 Updated. src/cairo-png.c src/cairo.h: Fix up some doc build issues. ChangeLog | 6 +++ doc/public/cairo-sections.txt | 27 +++++++++--- doc/public/tmpl/cairo-pattern.sgml | 15 ++++++- doc/public/tmpl/cairo-png.sgml | 31 ++++++++++--- doc/public/tmpl/cairo.sgml | 86 ++++++++++++++++++++++++++++++++++-- src/cairo-png.c | 27 +++--------- src/cairo.h | 2 +- 7 files changed, 155 insertions(+), 39 deletions(-) commit 2847ff9d6e715c1926a10b6c0278f1274d0765a3 Author: Carl Worth Date: Tue Apr 26 13:05:51 2005 +0000 Note that cairo_paint and cairo_clip/fill/stroke_preserve are all done now. ChangeLog | 6 ++++++ ROADMAP | 8 ++++---- TODO | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) commit 1baa4d132903e21395dc66ca792164e2ef8885d2 Author: Carl Worth Date: Tue Apr 26 12:38:06 2005 +0000 Originally: 2005-04-19 Carl Worth Add cairo_stroke_preserve, cairo_fill_preserve, and cairo_clip_preserve. Rip the path out of cairo_gstate_t. Add path to cairo_t. Bring in most of the path code that used to live in cairo-gstate.c Move arc generation code into its own file. Accept path+ctm_inverse+tolerance instead of gstate. Absorb flattening and device space->user space conversion that used to be in _cairo_gstate_intepret_path. Prefer cairo_fixed_t parameters over ciaro_point_t for cross-file interfaces. Track changes in _cairo_path_fixed interfaces. Port to use cairo_fill_preserve rather than cairo_save/cairo_restore which no longer work for saving the path. Remove get and set of current point since it is no longer affected by cairo_save and cairo_restore. Add get and set testing for cairo_matrix_t. ChangeLog | 40 +++ TODO | 2 +- src/Makefile.am | 1 + src/cairo-arc-private.h | 57 ++++ src/cairo-arc.c | 296 ++++++++++++++++++ src/cairo-ft-font.c | 60 +++-- src/cairo-gstate-private.h | 4 - src/cairo-gstate.c | 677 +++-------------------------------------- src/cairo-path-data-private.h | 8 +- src/cairo-path-data.c | 239 ++++++++++++--- src/cairo-path.c | 93 ++++--- src/cairo-private.h | 4 + src/cairo.c | 321 +++++++++++++++++--- src/cairo.h | 10 +- src/cairoint.h | 159 ++++------ test/fill-and-stroke.c | 8 +- test/get-and-set.c | 37 +-- 17 files changed, 1106 insertions(+), 910 deletions(-) commit 618792c8c041ee2004acf1ff411e0adbe94a3e63 Author: Carl Worth Date: Tue Apr 26 09:43:39 2005 +0000 Add very simple test to generate PDF output, (no automated verification yet). Track PNG interface changes, (no more include of cairo-png.h, cairo_surface_write_png renamed to cairo_surface_write_to_png). ChangeLog | 14 ++++++++++ test/.cvsignore | 1 + test/Makefile.am | 2 + test/cairo-test.c | 4 +-- test/cairo-test.h | 1 + test/create-for-png.c | 2 - test/create-from-png.c | 2 - test/pdf-surface.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ test/pixman-rotate.c | 1 - 9 files changed, 84 insertions(+), 8 deletions(-) commit a5f734455c00f1031f19494717b02a5de2687ec0 Author: Kristian Høgsberg Date: Mon Apr 25 21:52:13 2005 +0000 Prototypes moved to cairo.h, this file removed. ChangeLog | 2 + src/cairo-png.h | 58 ------------------------------------------------------- 2 files changed, 2 insertions(+), 58 deletions(-) commit 28e7bbea652efa58b28217bd0cdfe2599a6ae7c7 Author: Kristian Høgsberg Date: Mon Apr 25 21:36:38 2005 +0000 Renamed from cairo_surface_write_png_to_stream() for consistency. (cairo_surface_write_to_png): Renamed from cairo_surface_write_png() for consistency. ChangeLog | 7 +++++++ src/cairo-png.c | 9 +++++---- src/cairo.h | 6 +++--- 3 files changed, 15 insertions(+), 7 deletions(-) commit 87009d692b5a37fc91db19819c46216ed6b3c4e3 Author: Kristian Høgsberg Date: Mon Apr 25 20:42:54 2005 +0000 Factor out bulk of the code into a new callback based function, write_png(). Call it with a stdio write callback. (cairo_surface_write_png_to_stream): New function to write a surface to a PNG stream. (cairo_image_surface_create_from_png): Likewise, move most of the code to read_png(), clean up error handling and reduce this function to calling read_png() with a stdio based read function. (cairo_image_surface_create_from_png_stream): New function to create an image surface from a PNG stream. New functions to get widht and height of an image surface. Add new prototype and error codes. Adjust to new PNG API. ChangeLog | 21 ++++ src/cairo-image-surface.c | 32 ++++++ src/cairo-png.c | 245 ++++++++++++++++++++++++++++++++++----------- src/cairo.c | 4 + src/cairo.h | 68 ++++++++++--- test/cairo-test.c | 4 +- test/create-for-png.c | 19 ++-- test/create-from-png.c | 19 ++-- 8 files changed, 316 insertions(+), 96 deletions(-) commit e55161d2b2ea27d5174c2674544b3aaf6748134d Author: Owen Taylor Date: Mon Apr 25 19:38:44 2005 +0000 Initialize the saved_dc_bitmap field here as well ... not strictly needed, but cleaner. (Reported by Peter Arsoff) ChangeLog | 6 ++++++ src/cairo-win32-surface.c | 1 + 2 files changed, 7 insertions(+), 0 deletions(-) commit 1c756648fc4b5984cb721571bc4cbd68d8c95b29 Author: Kristian Høgsberg Date: Sat Apr 23 11:58:18 2005 +0000 Finalize the correct pattern. ChangeLog | 5 +++++ src/cairo-gstate.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 70211bdbca78c944bc1447eb6216c8e84e14db23 Author: Kristian Høgsberg Date: Fri Apr 22 17:32:12 2005 +0000 Only check PNG signature if we read all the bytes. Don't fclose() the FILE argument (Steve Chaplin ). Rename to cairo_image_surface_create_for_png() to cairo_image_surface_create_from_png() and change FILE arguments for this function and cairo_surface_write_png() to be a filename argument instead. ChangeLog | 11 ++++++++++ src/Makefile.am | 2 - src/cairo-png.c | 61 +++++++++++++++++++++++++++++------------------------- src/cairo-png.h | 6 +--- src/cairo.h | 11 ++++++++++ 5 files changed, 57 insertions(+), 34 deletions(-) commit 0f0a6a57a31f06d250f0684a49b6bb57084d65b2 Author: Kristian Høgsberg Date: Thu Apr 21 15:18:14 2005 +0000 Handle backends that don't have a set_clip_region implementation (PDF). ChangeLog | 5 +++++ src/cairo-surface.c | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 9c10b54e5e98a5c5beca48c51ea930c2072ff6bc Author: Carl Worth Date: Tue Apr 19 16:29:04 2005 +0000 Add new cairo_paint function. Add new get_extents function to the surface backend interface. Add function to query current clip_extents. Implement the new get_extents function for each backend. Save the clip extents from set_clip_region and implement _cairo_surface_get_clip_extents. Abstract away the evil XGetGeometry roundtrip in _cairo_xlib_surface_get_size. Rewrite a couple of tests to call cairo_paint. ChangeLog | 35 +++++++++++++++ src/cairo-glitz-surface.c | 15 +++++++ src/cairo-gstate.c | 7 +++ src/cairo-image-surface.c | 22 ++++++++++ src/cairo-pdf-surface.c | 22 +++++++++- src/cairo-ps-surface.c | 20 +++++++++ src/cairo-quartz-surface.c | 12 ++++- src/cairo-surface.c | 39 ++++++++++++++++- src/cairo-win32-surface.c | 18 ++++++++ src/cairo-xcb-surface.c | 15 +++++++ src/cairo-xlib-surface.c | 87 +++++++++++++++++++++++++------------- src/cairo.c | 31 +++++++++++++- src/cairo.h | 3 + src/cairoint.h | 101 ++++++++++++++++++++++++++++---------------- test/gradient-alpha.c | 3 +- test/linear-gradient.c | 3 +- 16 files changed, 358 insertions(+), 75 deletions(-) commit 60ec322241ef01930ae63195651249a97ddbe6f7 Author: Carl Worth Date: Tue Apr 19 06:38:07 2005 +0000 Update API Shakeup chart to indicate that cairo_paint and cairo_fill_preserve patches have been sent. ChangeLog | 5 +++++ TODO | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit f13b13a70e987443b572264014647f27237d4cc0 Author: Carl Worth Date: Mon Apr 18 16:26:14 2005 +0000 Add a test of a repeating surface pattern. ChangeLog | 8 ++++ test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/surface-pattern-ref.png | Bin 0 -> 194 bytes test/surface-pattern.c | 75 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 87 insertions(+), 0 deletions(-) commit aef8f9b1a01f712c52d74ea0556dbe9092035b48 Author: Carl Worth Date: Mon Apr 18 05:25:57 2005 +0000 Mark a couple of items that are now complete. Add test case that fills and strokes the same shapes, (in preparation for testing cairo_fill_preserve patch). ChangeLog | 11 +++++++ ROADMAP | 14 ++++---- test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/fill-and-stroke-ref.png | Bin 0 -> 279 bytes test/fill-and-stroke.c | 67 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 7 deletions(-) commit ea82928aa74b87c8feab5e8424ba739b070680fe Author: Carl Worth Date: Thu Apr 14 15:02:47 2005 +0000 Update API Shakeup chart to indicate that cairo_set_source is done. ChangeLog | 5 +++++ TODO | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 828094aef860c8087564c93408846a4e81eec20d Author: Carl Worth Date: Thu Apr 14 14:42:26 2005 +0000 and delete: cairo_set_pattern -> cairo_set_source cairo_get_pattern -> cairo_get_source cairo_set_rgb_color -> cairo_set_source_rgb -> cairo_set_source_rgba cairo_set_alpha -> cairo_get_alpha -> Note that we'll likely want to add cairo_set_source_surface. Add _cairo_stock_color helper function. Improve some interfaces: _cairo_color_init _cairo_color_init_rgb _cairo_color_set_rgb -> _cairo_color_init_rgba _cairo_color_set_alpha _cairo_color_multiply_alpha _cairo_color_get_rgb -> _cairo_color_get_rbga _cairo_color_get_rgba_premultiplied Add cairo_stock_t and some helper macros: CAIRO_COLOR_WHITE CAIRO_COLOR_BLACK CAIRO_COLOR_TRANSPARENT Fix cairo_pattern_t by eliminating pattern->alpha. Fix cairo_solid_pattern_t to use cairo_color_t rather than three doubles. Track removal of pattern->alpha, simplifying the code considerably Track _cairo_color interface changes. Remove gstate->alpha. Propagate down set_source renamings. cairo_pattern_add_color_stop -> cairo_pattern_add_color_stop_rgba and add: cairo_pattern_add_color_stop_rgb Remove pattern->alpha, simplifying the code considerably. Track pattern and color interface changes. Add const where appropriate on cairo_color_t*. Add private type inspection predicate. (cairo_xlib_surface_set_size): Add check for surface type mismatch, (no useful error reporting yet, though). Note coverage as en expected failure. Improve line wrap on expected failure messages. Port all tests to new cairo_set_source interfaces. ChangeLog | 84 ++++++++++++ src/cairo-color.c | 120 +++++++++++++---- src/cairo-glitz-surface.c | 94 ++++--------- src/cairo-gstate-private.h | 3 +- src/cairo-gstate.c | 147 ++++++++------------- src/cairo-pattern.c | 318 +++++++++++++++++--------------------------- src/cairo-pdf-surface.c | 8 +- src/cairo-ps-surface.c | 9 +- src/cairo-surface.c | 35 +++--- src/cairo-xlib-surface.c | 18 +++ src/cairo.c | 146 +++++++++++--------- src/cairo.h | 55 ++++---- src/cairoint.h | 92 ++++++++----- test/Makefile.am | 1 + test/cairo-test.c | 2 +- test/clip-twice.c | 3 +- test/coverage.c | 23 ++-- test/fill-rule.c | 2 +- test/line-width.c | 2 +- test/linear-gradient.c | 31 ++--- test/pixman-rotate.c | 13 +-- test/set-source.c | 16 +-- test/text-rotate.c | 9 +- test/trap-clip.c | 11 +-- 24 files changed, 628 insertions(+), 614 deletions(-) commit c0d9c13d0403673a7fe994664a4f616c71301474 Author: Carl Worth Date: Thu Apr 14 14:02:03 2005 +0000 Make gradient change color in addition to just changing alpha in order to highlight distinction between interpolating in premultiplied vs. non-premultiplied space. ChangeLog | 8 ++++++++ test/gradient-alpha-ref.png | Bin 146 -> 153 bytes test/gradient-alpha.c | 8 ++++---- 3 files changed, 12 insertions(+), 4 deletions(-) commit 65209fc39cb0257b2e55e7dfa509be5a5ef65f05 Author: Carl Worth Date: Thu Apr 14 10:02:58 2005 +0000 Improve instructions for when to add a test to the XFAIL list. Print explanations for expected failures. ChangeLog | 11 +++++++++++ test/Makefile.am | 30 ++++++++++++++++-------------- test/cairo-test.c | 9 +++++++++ test/cairo-test.h | 5 +++++ test/pixman-rotate.c | 4 +++- test/text-rotate.c | 4 +++- 6 files changed, 47 insertions(+), 16 deletions(-) commit d1eb620a195170ac0761b3376e4cd97d7a46cf02 Author: Carl Worth Date: Thu Apr 14 09:31:21 2005 +0000 Add gradient-alpha test in preparation for upcoming cairo_set_source patch. ChangeLog | 8 +++++ test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/gradient-alpha-ref.png | Bin 0 -> 146 bytes test/gradient-alpha.c | 62 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 0 deletions(-) commit 95a6f1941a1ff32b3ef792e5db2a942d7c85bf07 Author: Carl Worth Date: Thu Apr 14 09:13:48 2005 +0000 Add set-source test in preparation for upcoming cairo_set_source patch. ChangeLog | 8 ++++ test/.cvsignore | 3 +- test/Makefile.am | 7 +++- test/set-source-ref.png | Bin 0 -> 120 bytes test/set-source.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 104 insertions(+), 3 deletions(-) commit 080f331edd6c64dd93785f35e05b532aa2f72512 Author: Owen Taylor Date: Thu Apr 14 06:05:59 2005 +0000 Remove a stray free() (#3029, Carl Worth) Note that the bug is fixed. ChangeLog | 7 +++++++ src/cairo-font.c | 1 - test/select-font-no-show-text.c | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) commit 66688da5e4485a369750bd5600134a94c281d985 Author: Carl Worth Date: Wed Apr 13 14:51:59 2005 +0000 Set freed pointer to NULL. Fix to actually set surface->finished when done. Closes bug #2950 as documented in test/surface-finish-twice.c. Note that this bug is fixed. ChangeLog | 11 +++++++++++ src/cairo-image-surface.c | 4 +++- src/cairo-surface.c | 11 +++++++++-- test/surface-finish-twice.c | 4 ++++ 4 files changed, 27 insertions(+), 3 deletions(-) commit 0fe6378bdb83b550ad10b007463d7fb12ef742a9 Author: Carl Worth Date: Wed Apr 13 14:48:02 2005 +0000 Add new test to exercise crash when calling cairo_surface_finish twice on the same surface. ChangeLog | 8 +++++ test/.cvsignore | 1 + test/Makefile.am | 2 + test/surface-finish-twice.c | 70 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+), 0 deletions(-) commit f4b2f59c056ca3a84b89412a617994cb1837fd4a Author: Carl Worth Date: Wed Apr 13 14:45:05 2005 +0000 Add new set-surface-no-show-text test. Be sure to call cairo_destroy even if the image size is 0,0 so that we can test bugs triggered during cleanup. ChangeLog | 11 +++++++ test/.cvsignore | 2 + test/Makefile.am | 2 + test/cairo-test.c | 1 + test/select-font-no-show-text.c | 60 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 76 insertions(+), 0 deletions(-) commit f3af02bb0e098824a23b000adfa7a86a48390ddf Author: Carl Worth Date: Wed Apr 13 14:24:20 2005 +0000 Temporarily remove all text from this test case until we come up with an approach for drawing the same text with different freetype configurations. ChangeLog | 7 +++++++ test/coverage-ref.png | Bin 44324 -> 25904 bytes test/coverage.c | 6 ++++++ 3 files changed, 13 insertions(+), 0 deletions(-) commit 21268bc35938c18783c428f6b3c267b85191b78c Author: Owen Taylor Date: Wed Apr 13 14:04:33 2005 +0000 Fix a comment from last commit src/cairo-traps.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8feb2717eb20ca2764a1c367a4f7e30bf1ad8537 Author: Owen Taylor Date: Wed Apr 13 14:03:17 2005 +0000 Fix ChangeLog entry ChangeLog | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 542e6c8c90a76bb9ccbedd95c8c65103c68ae6b6 Author: Owen Taylor Date: Wed Apr 13 14:01:50 2005 +0000 Work around a pair of libpixman bugs (denegerate trapezoids from tesellator, pixman_region_union_rect() failing on width/height zero rectangles) ChangeLog | 6 ++++++ src/cairo-traps.c | 7 +++++++ 2 files changed, 13 insertions(+), 0 deletions(-) commit 1de5ace6c22b457d4c712b9d8c9e8fb87e927c43 Author: Carl Worth Date: Wed Apr 13 13:01:54 2005 +0000 Fix typo TODO | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a16a634f97a9948d6a98ed89664f74bf36e0f1ae Author: Owen Taylor Date: Wed Apr 13 11:23:43 2005 +0000 src/cairoint.h src/cairo-traps.c: Add _cairo_traps_extract_region for converting trapezoids into a pixman region. Represent all rectangular pixel-aligned regions as regions, not just single rectangles. Split into manageable pieces, optimize rectangular pixel- aligned regions by using _cairo_surface_fill_rectangles() or _cairo_surface_set_clip_region() as appropriate. tests/trap-clip.c tests/trap-clip-ref.png tests/Makefile.am: Add a test for trapezoids clipping. Add an index. ChangeLog | 18 ++ doc/public/cairo-docs.xml | 3 + src/cairo-gstate.c | 586 ++++++++++++++++++++++++++++++--------------- src/cairo-traps.c | 55 +++++ src/cairoint.h | 4 + test/Makefile.am | 5 +- test/trap-clip-ref.png | Bin 0 -> 71701 bytes test/trap-clip.c | 213 ++++++++++++++++ 8 files changed, 688 insertions(+), 196 deletions(-) commit 3bec073a7c7ae946d1a61769a694760dd3fcb890 Author: Carl Worth Date: Tue Apr 12 13:24:48 2005 +0000 Note that bug is now fixed. ChangeLog | 4 ++++ test/translate-show-surface.c | 6 +++++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 173bc22a62681d1dc0807f16f387e3f41d3653c0 Author: Carl Worth Date: Tue Apr 12 11:50:25 2005 +0000 Replace errant use of aclocal with , as reported by Martin Hedenfalk. Closes bug #3000. ChangeLog | 5 +++++ autogen.sh | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 369d1bf28f589d4aee7773180038a9564f14db19 Author: Carl Worth Date: Tue Apr 12 09:14:14 2005 +0000 Default to CAIRO_FILTER_GOOD rather than CAIRO_FILTER_BEST. Optimize to use CAIRO_FILTER_NEAREST when the pattern matrix is an integer translation. ChangeLog | 11 +++++++++++ src/cairo-pattern.c | 3 ++- src/cairo-surface.c | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) commit 439a94cc7b5f8982d469cdb6665be3cd21944cc5 Author: Carl Worth Date: Tue Apr 12 07:57:46 2005 +0000 Use CAIRO_FILTER_BEST by default rather than CAIRO_FILTER_NEAREST. ChangeLog | 7 +++++++ src/cairo-pattern.c | 2 +- src/cairo-surface.c | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) commit 8f6fc777d1f032f829fcd1e6134dbf761e6df5d0 Author: Carl Worth Date: Tue Apr 12 07:12:08 2005 +0000 Offset the src pattern by (0,0)->CTM. This fixes test/translate-show-surface. Use unsigned cahr* to match new prototype for cairo_image_surface_create_for_data. ChangeLog | 9 +++++++++ src/cairo-glitz-surface.c | 4 ++-- src/cairo-gstate.c | 17 +++++++++++++++-- 3 files changed, 26 insertions(+), 4 deletions(-) commit 8f7ea593bab3c30f1e99e48f78285d18b3724ee1 Author: Carl Worth Date: Mon Apr 11 14:04:56 2005 +0000 Add new test demonstrating bug in the sequence: cairo_translate; cairo_show_surface. ChangeLog | 9 ++++ test/.cvsignore | 1 + test/Makefile.am | 5 ++- test/translate-show-surface-ref.png | Bin 0 -> 100 bytes test/translate-show-surface.c | 77 +++++++++++++++++++++++++++++++++++ 5 files changed, 91 insertions(+), 1 deletions(-) commit a70e8f7c9e5ffc07ef867196bda3c9996212c8a6 Author: Carl Worth Date: Mon Apr 11 11:30:28 2005 +0000 Add deprecation alias from cairo_scale_font to cairo_set_font_size. ChangeLog | 5 +++++ src/cairo.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 9ba4dce8110dc02d9faa255918a64c332da80a7a Author: Carl Worth Date: Mon Apr 11 11:20:08 2005 +0000 Add deprecation alias from cairo_select_font to cairo_select_font_face. ChangeLog | 5 +++++ src/cairo.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit cf9ea3007828a46c5297a8882b6272ad30d12ba8 Author: Owen Taylor Date: Mon Apr 11 09:18:51 2005 +0000 src/cairo.h doc/public/cairo-sections.txt src/cairo-matrix.c: Update. Include cairo-font.xml ChangeLog | 7 +++ doc/public/Makefile.am | 13 +++-- doc/public/cairo-docs.xml | 1 + doc/public/cairo-sections.txt | 54 ++++++++++++++-------- doc/public/tmpl/cairo-font.sgml | 12 +++++ doc/public/tmpl/cairo-matrix.sgml | 61 ++++++++++++------------ doc/public/tmpl/cairo-pattern.sgml | 6 ++ doc/public/tmpl/cairo-pdf.sgml | 30 ++++++++++++ doc/public/tmpl/cairo-png.sgml | 21 ++++++++ doc/public/tmpl/cairo-surface.sgml | 6 ++ doc/public/tmpl/cairo-xcb.sgml | 12 +++++ doc/public/tmpl/cairo.sgml | 91 ++++++++++++++++++++++++++++++------ src/cairo-matrix.c | 2 - src/cairo.h | 8 ++-- 14 files changed, 249 insertions(+), 75 deletions(-) commit df997b3f5be6e04fe20da82ad0ee24a33732a4f0 Author: Carl Worth Date: Mon Apr 11 06:56:10 2005 +0000 Indentation changes ROADMAP | 37 +++++++++++++++++++++---------------- 1 files changed, 21 insertions(+), 16 deletions(-) commit 2a616d68422c7029434a3d1d22ab668f23bd55bc Author: Carl Worth Date: Fri Apr 8 14:06:32 2005 +0000 Move include of pixman.h from cairo.h to cairoint.h since libpixman isn't part of cairo's public interface. Use unsigned long rather than uint32_t since we no longer have pixman.h setting that type up for us. Remove unused variable user_data_copy. ChangeLog | 13 +++++++++++++ src/cairo-font.c | 2 -- src/cairo.h | 1 - src/cairoint.h | 1 + test/move-to-show-surface.c | 3 +-- 5 files changed, 15 insertions(+), 5 deletions(-) commit 584cb301456bd4ee9d92fa3becd148440df57d3b Author: Carl Worth Date: Fri Apr 8 13:44:22 2005 +0000 Add ROADMAP file with an initial stab at 1.0 items. ChangeLog | 4 +++ ROADMAP | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TODO | 8 +++--- 3 files changed, 78 insertions(+), 4 deletions(-) commit c803908d95d0022463d138f0caee949b14d0cadb Author: Owen Taylor Date: Fri Apr 8 13:14:17 2005 +0000 src/cairo.h src/cairo-font.c src/cairoint.h doc/public/cairo-sections.txt: Add cairo_font_face_set/get_user_data(). src/cairo-array.c src/cairoint.h src/cairo-surface.c: Refactor user data code from cairo-surface.c into cairo_user_data_array_t. Switch these types to be like cairo_surface_t where the generic code frees the wrapper object. src/cairo-atsui-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Fix up for the above changes. Implement a complicated mutual-referencing scheme to make sure that a face from cairo_ft_font_face_create_for_ft_face() is freed only when the FT_Face is no longer needed. Update the docs to describe how to figure out when the FT_Face can be freed. Fix refcount leaks when creating fonts. Remove excess call to _cairo_unscaled_font_reference(). Remove stray initialization of font matrix to the identity. test/user-data.c: Fix a bug when setting/unsetting a key with a free key slot before it, add that to the test case. Don't append an element when user_data is NULL. ChangeLog | 42 +++++++++++ doc/public/cairo-sections.txt | 2 + doc/public/tmpl/cairo-font.sgml | 18 ++++- doc/public/tmpl/cairo-matrix.sgml | 12 --- doc/public/tmpl/cairo-pattern.sgml | 6 -- doc/public/tmpl/cairo-surface.sgml | 6 -- doc/public/tmpl/cairo.sgml | 13 ---- src/cairo-array.c | 139 ++++++++++++++++++++++++++++++++++++ src/cairo-atsui-font.c | 2 - src/cairo-font.c | 67 +++++++++++++++++- src/cairo-ft-font.c | 97 +++++++++++++++++-------- src/cairo-gstate.c | 1 - src/cairo-pdf-surface.c | 2 - src/cairo-surface.c | 71 ++----------------- src/cairo-win32-font.c | 3 - src/cairo.h | 54 ++++++++------ src/cairoint.h | 24 ++++++- test/user-data.c | 4 + 18 files changed, 393 insertions(+), 170 deletions(-) commit 7aa5b71e8cc42bdcc935ad0990a0ac434dd0aa0e Author: Dave Beckett Date: Fri Apr 8 12:42:28 2005 +0000 Update to track changes to cairo_matrix_t interface. ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 14 +++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) commit 30f0d517aa73d5d00b5a2bed2f549f9c662a39a7 Author: Carl Worth Date: Fri Apr 8 10:03:17 2005 +0000 Eliminate internal use of deprecated cairo_matrix_copy. Change cairo_get_matrix to accept a pointer to the return value cairo_matrix_t rather than returning the value directly. ChangeLog | 15 +++++++++++++++ src/cairo-gstate.c | 18 ++++++------------ src/cairo-matrix.c | 1 - src/cairo.c | 27 ++++----------------------- src/cairo.h | 7 ++----- src/cairoint.h | 5 +---- 6 files changed, 28 insertions(+), 45 deletions(-) commit 745627ff1b0cf97760cbd613668f79c9b63a57c2 Author: Carl Worth Date: Fri Apr 8 04:43:06 2005 +0000 Don't try to return a value (even a void value) from a void function. Closes bug #2931. ChangeLog | 6 ++++++ src/cairo-matrix.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit 43435b69e14d4039b0537dfdc96cbcebd164175f Author: Carl Worth Date: Thu Apr 7 15:00:46 2005 +0000 Remove broken code for defining uint64_t. ChangeLog | 5 +++++ src/cairo-wideint.h | 8 +------- 2 files changed, 6 insertions(+), 7 deletions(-) commit 9bef5b6f148d08b5f0e13bd768b6e7e2a4697c0b Author: Carl Worth Date: Thu Apr 7 14:25:00 2005 +0000 Change to allow NULL backend function pointers to indicate unsupported functions. Eliminate stub functions and replace with NULL in surface backend table. ChangeLog | 22 +++++++++ src/cairo-glitz-surface.c | 16 +------ src/cairo-image-surface.c | 16 +------ src/cairo-pdf-surface.c | 61 ++---------------------- src/cairo-ps-surface.c | 79 ++----------------------------- src/cairo-quartz-surface.c | 109 +++---------------------------------------- src/cairo-surface.c | 86 +++++++++++++++++----------------- src/cairo-win32-surface.c | 64 ++------------------------ src/cairo-xcb-surface.c | 18 +------ src/cairo-xlib-surface.c | 16 +------ 10 files changed, 99 insertions(+), 388 deletions(-) commit ac6f15e2450e4e08d833355e626df0358d81c2ec Author: Owen Taylor Date: Thu Apr 7 13:29:32 2005 +0000 src/cairo.[ch] src/cairoint.h src/cairo-gstate.c docs/public/cairo-sections.txt: cairo_select_font() => cairo_select_font_face() cairo_scale_font() => cairo_set_font_size() cairo_transform_font() => cairo_set_font_matrix() Add cairo_get_font_matrix(). Make cairo_set_font_face() not reset the font matrix. Default the font matrix to SCALE(10). Document cairo_select_font_face(). test/text-cache-crash.c (draw) test/text-rotate.c (draw): Use cairo_set_font_size(). src/cairo-font.c src/cairo.h: Fix up some parameter names for docs. ChangeLog | 17 +++++++++ doc/public/cairo-sections.txt | 10 ++++-- doc/public/tmpl/cairo-font.sgml | 12 +++++- doc/public/tmpl/cairo.sgml | 18 +++++++-- src/cairo-font.c | 8 ++-- src/cairo-gstate.c | 50 ++++++++++---------------- src/cairo.c | 73 ++++++++++++++++++++++++++++----------- src/cairo.h | 32 +++++++++++------ src/cairoint.h | 30 +++++++--------- test/coverage.c | 2 +- test/text-cache-crash.c | 6 ++-- test/text-rotate.c | 2 +- 12 files changed, 163 insertions(+), 97 deletions(-) commit 62212867d4228d5834ea16858a8569765977bdd9 Author: Carl Worth Date: Thu Apr 7 12:56:43 2005 +0000 Minor changes to header file inclusion recommended by Oleg Smolsky for better portability to MSVC. ChangeLog | 10 ++++++++++ src/cairo-gstate.c | 1 - src/cairo-png.c | 3 ++- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 2 +- src/cairo-win32.h | 1 + src/cairoint.h | 4 ++++ 7 files changed, 19 insertions(+), 4 deletions(-) commit 4a3a6e871965b1f2ab113cb50a4687a54a231856 Author: Owen Taylor Date: Thu Apr 7 12:38:02 2005 +0000 Fix various compilation errors. ChangeLog | 4 ++ src/cairo-win32-font.c | 83 +++++++++++++++++++++++------------------------- 2 files changed, 44 insertions(+), 43 deletions(-) commit 3ea3186f165c2d73403534982094518473156989 Author: Carl Worth Date: Thu Apr 7 12:35:33 2005 +0000 Use a preprocessor macro to get a literal value in the array size declaration, (for better portability to lame compilers that can't deal with a const int variable for the array size). Reported by Oleg Smolsky. ChangeLog | 1 + src/cairo-png.c | 2 +- 2 files changed, 2 insertions(+), 1 deletions(-) commit 88a62f07df27a5e6501678e3aec1882e367901be Author: Carl Worth Date: Thu Apr 7 12:33:06 2005 +0000 Use a preprocessor macro to get a literal value in the array size declaration, (for better portability to lame compilers that can't deal with a const int variable for the array size). Reported by Oleg Smolsky. ChangeLog | 7 +++++++ src/cairo-png.c | 2 +- 2 files changed, 8 insertions(+), 1 deletions(-) commit d4209c331f0823c585643e6a7197107321ba2049 Author: Carl Worth Date: Thu Apr 7 12:05:52 2005 +0000 Use configure-time checks for stdint.h vs. inttypes.h vs. sys/int_types.h rather than ad-hoc system-specific macros. Also define these types manually none of these header are available. (Thanks to Jason Dorje Short ). ChangeLog | 10 ++++++++++ configure.in | 1 + src/cairo-wideint.h | 23 +++++++++++++++++------ src/cairoint.h | 10 ---------- 4 files changed, 28 insertions(+), 16 deletions(-) commit 945e6c24586e124a346818c9a2b15f4693b8ae9f Author: Carl Worth Date: Thu Apr 7 11:18:40 2005 +0000 Fix to return non-zero status on error. ChangeLog | 4 ++++ test/imagediff.c | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 47824dee31acdaf5ad6488dd2714e9f28c936aa2 Author: Owen Taylor Date: Thu Apr 7 11:03:59 2005 +0000 src/cairo.h src/cairo-gstate.c src/cairo-font.c: Add a cairo_font_face_t type to hold a description of a font face. Replace cairo_set_font() with cairo_set_font_face(). src/cairoint.h src/cairo-font.c src/cairo-gstate.c: Add "cairo_simple_font_face" for family/weight/slant and use it to implement font naming for the toy API. src/cairo-ft.h src/cairo-ft-font.c cairo-win32.h cairo-win32-font.c: Switch the FreeType and Win32 backends over to using cairo_font_face_t. src/cairo.h src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Pass in font matrix and CTM separately rather than as a composite scale when creating fonts; allows removing font_matrix argument to metrics functions. src/cairoint.h src/cairo-font.c src/cairo-ft-font.c src/cairo-win32-font.c: Remove cairo_font_scale_t type, just use cairo_matrix_t and ignore translations. src/cairo-ft.h src/cairo-ft-font.c: Remove cairo_ft_font_get_pattern() -- it can't work for all FreeType backend fonts and doesn't seem particularly useful. Rename cairo_font_get_extents() to cairo_font_extents() split font functions into a separate section. Fix locking order problem. Add caches for simple font faces and from cairo_font_face_t to cairo_scaled_font_t. src/cairo.h src/cairoint.h src/cairo-font.c src/cairo-win32-font.c src/cairo-ft-font.c src/cairo-gstate.c src/cairo-gstate-private.h: Rename cairo_font_t to cairo_scaled_font_t. ChangeLog | 43 ++ doc/public/cairo-sections.txt | 47 ++- doc/public/tmpl/cairo-font.sgml | 118 +++++ doc/public/tmpl/cairo-ft.sgml | 23 +- doc/public/tmpl/cairo-matrix.sgml | 27 +- doc/public/tmpl/cairo-pdf.sgml | 38 +-- doc/public/tmpl/cairo-png.sgml | 24 - doc/public/tmpl/cairo-surface.sgml | 5 +- doc/public/tmpl/cairo.sgml | 130 +----- src/cairo-font.c | 875 +++++++++++++++++++++++++++++++----- src/cairo-ft-font.c | 829 +++++++++++++++++----------------- src/cairo-ft-private.h | 2 +- src/cairo-ft.h | 19 +- src/cairo-gstate-private.h | 3 +- src/cairo-gstate.c | 211 ++++----- src/cairo-pdf-surface.c | 16 +- src/cairo-surface.c | 4 +- src/cairo-win32-font.c | 564 ++++++++++++----------- src/cairo-win32-surface.c | 2 +- src/cairo-win32.h | 13 +- src/cairo-xlib-surface.c | 18 +- src/cairo.c | 79 +--- src/cairo.h | 77 ++-- src/cairoint.h | 184 ++++---- 24 files changed, 2033 insertions(+), 1318 deletions(-) commit d135938efd443e4adce63cf8c5926ac421b2d3ed Author: Carl Worth Date: Thu Apr 7 10:01:49 2005 +0000 Rework the cairo_matrix_t interface in several ways. Expose a struct for cairo_matrix_t. Add new function to return current matrix: cairo_get_matrix Deprecate the following functions (in documentation): cairo_matrix_create cairo_matrix_destroy cairo_matrix_get_affine Rename: cairo_matrix_set_affine -> cairo_matrix_init cairo_matrix_set_identity -> cairo_matrix_init_identity Add other new matrix initialization functions: cairo_matrix_init_translate cairo_matrix_init_scale cairo_matrix_init_rotate Change return type of almost all cairo_matrix functions from cairo_status_t to void. Track changes to cairo_matrix_t interface. Add a test case showing the same path drawn under various transforms, (including skews set directly by initializing a cairo_matrix_t). ChangeLog | 46 ++++++ TODO | 2 +- src/cairo-atsui-font.c | 6 +- src/cairo-ft-font.c | 12 +- src/cairo-gstate.c | 48 ++++--- src/cairo-image-surface.c | 12 +- src/cairo-matrix.c | 354 ++++++++++++++++++++++----------------------- src/cairo-pattern.c | 18 ++- src/cairo-pdf-surface.c | 20 ++-- src/cairo-pen.c | 4 +- src/cairo-surface.c | 10 +- src/cairo-win32-font.c | 14 +- src/cairo-xlib-surface.c | 12 +- src/cairo.c | 26 +++- src/cairo.h | 70 ++++++--- src/cairoint.h | 38 ++---- test/.cvsignore | 1 + test/Makefile.am | 5 +- test/transforms-ref.png | Bin 0 -> 302 bytes test/transforms.c | 111 ++++++++++++++ 20 files changed, 502 insertions(+), 307 deletions(-) commit 92060c12ee2acc38541ec2398abba5e1569278de Author: Carl Worth Date: Wed Apr 6 13:01:13 2005 +0000 Make handling of unsigned char* vs. char* consistent. Change all parameters that are actual string data from unsigned char* to char* (cairo_text_extents, cairo_show_text, cairo_text_path). Change all data buffers from char* to unsigned char* (cairo_write_func_t). Track changes from unsigned char* to char*. Convert to unsigned only at the internal interface to unicode processing. Track change from char* to unsigned char*. ChangeLog | 22 ++++++++++++++++++++++ src/cairo-atsui-font.c | 13 +++++++------ src/cairo-font.c | 8 ++++---- src/cairo-ft-font.c | 14 +++++++------- src/cairo-gstate.c | 8 ++++---- src/cairo-output-stream.c | 6 +++--- src/cairo.c | 6 +++--- src/cairo.h | 16 ++++++++-------- src/cairoint.h | 18 +++++++++--------- test/move-to-show-surface.c | 2 +- 10 files changed, 68 insertions(+), 45 deletions(-) commit 957ceac0c63b70d1a32b64d0d6a89cb1b9bca2c5 Author: Carl Worth Date: Wed Apr 6 12:20:02 2005 +0000 Fix reversed arguments in call to calloc. ChangeLog | 5 +++++ src/cairo-cache.c | 5 +++-- src/cairo-hash.c | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) commit a6d9b6a671faf6cc726af12d4f4e706262c2bd6b Author: Carl Worth Date: Mon Apr 4 09:47:12 2005 +0000 Change type of data parameter from char* to unsigned char*. Propagate the unsigned char* change down the stack. Add cast since XImage uses char* rather than unsigned char*. Fix memory leak of image data. Switch to use cairo_surface_write_png rather than a custom write_png_argb32. Add test to exercise the cairo_image_surface_create_for_png function. ChangeLog | 35 ++++++++++++++++++- src/cairo-ft-font.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-pattern.c | 8 ++-- src/cairo-png.c | 9 ++++- src/cairo-xlib-surface.c | 2 +- src/cairo.c | 2 +- src/cairo.h | 4 +- test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/buffer-diff.c | 6 ++- test/buffer-diff.h | 4 ++- test/cairo-test.c | 14 ++++--- test/cairo-test.h | 2 + test/create-for-png-ref.png | Bin 0 -> 100 bytes test/create-for-png.c | 74 ++++++++++++++++++++++++++++++++++++++++++ test/create-from-png-ref.png | Bin 0 -> 100 bytes test/create-from-png.c | 74 ++++++++++++++++++++++++++++++++++++++++++ test/write-png.c | 2 +- test/write-png.h | 2 +- 20 files changed, 221 insertions(+), 25 deletions(-) commit 770d4c55b4b576875b73249f29ad7840fb5da7e5 Author: Carl Worth Date: Mon Apr 4 09:25:47 2005 +0000 Remove items for PNG backend removal and trapezoid reasterization re-implementation since they have been completed. ChangeLog | 6 ++++++ TODO | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) commit 027057bf62fe0df78261af338f6d2f190433792b Author: Carl Worth Date: Mon Apr 4 06:49:19 2005 +0000 Drop cairo_default_matrix since it is now always identical to cairo_identity_matrix. Remove gstate->pixels_per inch. Change default matrix to always be the identity matrix. Drop pixels_per_inch function from surface backend interface as it is no longer needed. ChangeLog | 24 ++++++++++++++++++++++++ src/cairo-glitz-surface.c | 7 ------- src/cairo-gstate-private.h | 2 -- src/cairo-gstate.c | 28 ++-------------------------- src/cairo-image-surface.c | 8 -------- src/cairo-pdf-surface.c | 10 ---------- src/cairo-ps-surface.c | 10 ---------- src/cairo-quartz-surface.c | 9 --------- src/cairo-surface.c | 6 ------ src/cairo-win32-surface.c | 8 -------- src/cairo-xcb-surface.c | 8 -------- src/cairo-xlib-surface.c | 8 -------- src/cairo.c | 30 ++++++++++++++++++------------ src/cairo.h | 7 ++----- src/cairoint.h | 10 ---------- 15 files changed, 46 insertions(+), 129 deletions(-) commit 5778c77382f3a81b77aca1d224d0ad7626bcd5d2 Author: Carl Worth Date: Sat Apr 2 06:00:32 2005 +0000 Use the current point to offset just the destination, not the source and destination. With this fix, cairo_show_surface should work with the current point at places other than the origin. Move move-to-show-surface off the expected failure list. Add comment indicating that bug is resolved. Don't use diff to compare images, just imagediff. ChangeLog | 15 +++++++++++++++ src/cairo-gstate.c | 4 ++-- test/Makefile.am | 1 - test/move-to-show-surface.c | 9 +++++++++ test/testsvg | 4 ++-- 5 files changed, 28 insertions(+), 5 deletions(-) commit 9e405876e86ce004cd69b87a10c1bf7ce7d1b436 Author: Carl Worth Date: Sat Apr 2 05:18:11 2005 +0000 Style and indentation fixes. cast to quiet new gcc-4 warnings. Initialize variables to quiet new gcc-4 warnings. Use unsigned char* as expected by freetype, libpng, Xlib, and zlib. Propagate unsigned char* down from cairo_text_extents. ChangeLog | 29 +++++++++++++++++++++++++++++ src/cairo-font.c | 6 +++--- src/cairo-ft-font.c | 7 ++++--- src/cairo-gstate.c | 12 ++++++------ src/cairo-image-surface.c | 2 +- src/cairo-pdf-surface.c | 4 ++-- src/cairo-png.c | 4 ++-- src/cairo-ps-surface.c | 4 ++-- src/cairo-unicode.c | 28 ++++++++++++++-------------- src/cairo-xlib-surface.c | 5 +++-- src/cairo.c | 34 ++++++++++++++++++---------------- src/cairo.h | 14 +++++++------- src/cairoint.h | 36 ++++++++++++++++++------------------ 13 files changed, 109 insertions(+), 76 deletions(-) commit 7636e901841a800dd5d032963fca6a7c9ef1be99 Author: Carl Worth Date: Fri Apr 1 18:00:00 2005 +0000 Update API shakeup chart. Add a standin for the function that should be cairo_set_target_image which should then have some other name. We can straighten that mess out when we eliminate the set_target functions. Add deprecation alias for cairo_current_pattern. Deprecate cairo_surface_create_for_image in favor of cairo_image_surface_create_for_data. ChangeLog | 16 ++++++++++++++ TODO | 6 ++-- src/cairo-image-surface.c | 1 + src/cairo-surface.c | 11 --------- src/cairo.c | 50 +++++++++++++++++++++++++++++++++++++++++--- src/cairo.h | 21 ++++++++++-------- src/cairoint.h | 1 - 7 files changed, 78 insertions(+), 28 deletions(-) commit 5abf7786c070a3baf220599d6e3b71e56911ba5f Author: Kristian Høgsberg Date: Thu Mar 31 13:25:44 2005 +0000 Remove this function now that the PNG backend is gone. ChangeLog | 5 +++++ src/cairo.c | 28 ---------------------------- 2 files changed, 5 insertions(+), 28 deletions(-) commit 19a918e624a398c315e511e580bc048b81d58849 Author: Carl Worth Date: Wed Mar 30 14:00:31 2005 +0000 Fix typo I had introduced into Jason's patch that made configure fail. ChangeLog | 5 +++++ configure.in | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 13b1b705f41efd33dfb5d1fa9ddb3c22f353055f Author: Carl Worth Date: Wed Mar 30 13:34:51 2005 +0000 A few fixes courtesy of Jason Dorje Short : Disable PS backend if zlib is not found. Fix mistyped parameter. Fix missing return value. ChangeLog | 12 ++++++++++++ configure.in | 6 ++++++ src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 4 +++- 4 files changed, 22 insertions(+), 2 deletions(-) commit 811fe63f84983efa7aec984dfb4a4aed365bab02 Author: Tor Lillqvist Date: Wed Mar 30 09:31:49 2005 +0000 src/cairo-gstate.c (_cairo_gstate_stroke_extents): call _cairo_pen_init so that the result takes into account the caps. ChangeLog | 5 +++++ src/cairo-gstate.c | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-) commit a7a4aa34f89b9a65ad00da6048e86301ad7d21cc Author: Tor Lillqvist Date: Tue Mar 29 11:54:01 2005 +0000 src/cairo-xlib.h: include Xlib.h to fix solaris build bustage. ChangeLog | 4 ++++ src/cairo-xlib.h | 1 + 2 files changed, 5 insertions(+), 0 deletions(-) commit a55a640e542c483a286b9481d8b9ee1fb96a8c4a Author: Tor Lillqvist Date: Tue Mar 29 11:48:58 2005 +0000 src/cairo-wideint.h: add preprocessor tests for stdint.h/inttypes.h src/cairoint.h: add preprocessor tests for stdint.h/inttypes.h ChangeLog | 6 ++++++ src/cairo-wideint.h | 12 ++++++++++-- src/cairoint.h | 11 ++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) commit 72cc8f96fe75ccb79fd0d136b99020f5bc64e05b Author: Tor Lillqvist Date: Tue Mar 29 11:45:52 2005 +0000 src/pixman.h: add AIX to the test for inttypes.h pixman/ChangeLog | 4 ++++ pixman/src/pixman.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit 78b022b1d18dff1627a054bae1ef1fcc87ba2cbb Author: Tor Lillqvist Date: Tue Mar 29 11:24:10 2005 +0000 Update quartz backend to compilable/workable version and re-enable. ChangeLog | 8 + configure.in | 2 +- src/cairo-atsui-font.c | 1228 +++++++++++++++++++++----------------------- src/cairo-quartz-surface.c | 383 +++++++-------- 4 files changed, 768 insertions(+), 853 deletions(-) commit 35b9e3c45d8a4c2aa24eff5acb04d0e1eb7bc6ba Author: Carl Worth Date: Tue Mar 29 00:02:19 2005 +0000 More _/- renames in the test directory. ChangeLog | 5 + test/.cvsignore | 24 ++-- test/Makefile.am | 66 +++++----- test/buffer-diff.c | 2 +- test/buffer_diff.c | 73 ---------- test/buffer_diff.h | 38 ------ test/cairo-test.c | 8 +- test/cairo_test.c | 263 ------------------------------------- test/cairo_test.h | 55 -------- test/clip-twice.c | 4 +- test/clip_twice-ref.png | Bin 751 -> 0 bytes test/clip_twice.c | 74 ----------- test/coverage.c | 2 +- test/fill-rule.c | 4 +- test/fill_rule-ref.png | Bin 1979 -> 0 bytes test/fill_rule.c | 132 ------------------- test/get-and-set.c | 4 +- test/get_and_set.c | 151 --------------------- test/imagediff.c | 6 +- test/leaky-polygon.c | 4 +- test/leaky_polygon-ref.png | Bin 255 -> 0 bytes test/leaky_polygon.c | 84 ------------ test/line-width.c | 4 +- test/line_width-ref.png | Bin 171 -> 0 bytes test/line_width.c | 65 --------- test/linear-gradient.c | 4 +- test/linear_gradient-ref.png | Bin 12724 -> 0 bytes test/linear_gradient.c | 143 -------------------- test/move-to-show-surface.c | 4 +- test/move_to_show_surface-ref.png | Bin 100 -> 0 bytes test/move_to_show_surface.c | 71 ---------- test/path-data.c | 4 +- test/path_data-ref.png | Bin 387 -> 0 bytes test/path_data.c | 179 ------------------------- test/pixman-rotate.c | 4 +- test/pixman_rotate-ref.png | Bin 260 -> 0 bytes test/pixman_rotate.c | 80 ----------- test/read-png.c | 2 +- test/read_png.c | 166 ----------------------- test/read_png.h | 45 ------- test/text-cache-crash.c | 4 +- test/text-rotate.c | 4 +- test/text_cache_crash.c | 135 ------------------- test/text_rotate.c | 119 ----------------- test/user_data.c | 78 ----------- test/write-png.c | 2 +- test/write_png.c | 99 -------------- test/write_png.h | 35 ----- 48 files changed, 83 insertions(+), 2163 deletions(-) commit d9c2be3dcd27baa91b67cc9179bc98e06805a365 Author: Carl Worth Date: Mon Mar 28 14:30:40 2005 +0000 Renamed a bunch of files to use - rather than _ as a separator. Copy happened in the master repository to preserve history, so this is just a big remove. ChangeLog | 7 + src/Makefile.am | 68 +- src/cairo_array.c | 134 --- src/cairo_atsui_font.c | 807 -------------- src/cairo_cache.c | 518 --------- src/cairo_color.c | 97 -- src/cairo_fixed.c | 91 -- src/cairo_font.c | 475 -------- src/cairo_ft_font.c | 1538 -------------------------- src/cairo_glitz_surface.c | 1299 ---------------------- src/cairo_gstate.c | 2618 -------------------------------------------- src/cairo_hull.c | 202 ---- src/cairo_image_surface.c | 675 ------------ src/cairo_matrix.c | 656 ----------- src/cairo_output_stream.c | 147 --- src/cairo_path.c | 504 --------- src/cairo_path_bounds.c | 184 ---- src/cairo_path_data.c | 275 ----- src/cairo_path_fill.c | 210 ---- src/cairo_path_stroke.c | 852 -------------- src/cairo_pattern.c | 1325 ---------------------- src/cairo_pdf_surface.c | 2278 -------------------------------------- src/cairo_pen.c | 589 ---------- src/cairo_polygon.c | 172 --- src/cairo_ps_surface.c | 403 ------- src/cairo_quartz_surface.c | 392 ------- src/cairo_slope.c | 103 -- src/cairo_spline.c | 288 ----- src/cairo_surface.c | 958 ---------------- src/cairo_traps.c | 740 ------------- src/cairo_unicode.c | 340 ------ src/cairo_wideint.c | 1024 ----------------- src/cairo_win32_font.c | 1252 --------------------- src/cairo_win32_surface.c | 908 --------------- src/cairo_xcb_surface.c | 946 ---------------- src/cairo_xlib_surface.c | 1669 ---------------------------- 36 files changed, 41 insertions(+), 24703 deletions(-) commit 18c8846bc068e59137cf8cf4a94ad37822e28fae Author: Carl Worth Date: Mon Mar 28 14:06:40 2005 +0000 Sorted API shakeup chart. ChangeLog | 4 ++++ TODO | 31 ++++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) commit bd5bbb6ce2e0f3a9296e3fec017ace10ee8068d3 Author: Kristian Høgsberg Date: Mon Mar 28 13:58:26 2005 +0000 New PNG utility functions. Reverse the naming of the pdf constructors so the callback based ones have the long names. ChangeLog | 9 + configure.in | 18 +- src/Makefile.am | 4 +- src/cairo-features.h.in | 4 +- src/cairo-pdf-surface.c | 24 ++-- src/cairo-pdf.h | 52 +++--- src/cairo-png.c | 336 +++++++++++++++++++++++++++++++++++++++ src/cairo-png.h | 20 +-- src/cairo.c | 43 +++--- src/cairo_pdf_surface.c | 24 ++-- src/cairo_png_surface.c | 402 ----------------------------------------------- 11 files changed, 438 insertions(+), 498 deletions(-) commit 33d2ec2eb8b97e51fc3e24fdfa97ee7b89e734a1 Author: Jamey Sharp Date: Fri Mar 25 11:47:38 2005 +0000 Fix "implicit declaration" warning in cairo.c by moving cairo_xcb_surface_create prototype into cairo-xcb.h. ChangeLog | 7 +++++++ src/cairo-xcb-surface.c | 6 ------ src/cairo-xcb.h | 6 ++++++ src/cairo_xcb_surface.c | 6 ------ 4 files changed, 13 insertions(+), 12 deletions(-) commit 410e3ae8f20176f1a18b5394dfa753a277221a7f Author: Carl Worth Date: Wed Mar 23 14:36:29 2005 +0000 Clean up names of cairo_path internals. ChangeLog | 5 + src/cairo-path-fixed-private.h | 14 +- src/cairo-path.c | 293 ++++++++++++++++++++-------------------- src/cairo_path.c | 293 ++++++++++++++++++++-------------------- 4 files changed, 304 insertions(+), 301 deletions(-) commit 5170c1f4d2e554ad03450513046ff8c27150f6ee Author: Carl Worth Date: Wed Mar 23 14:17:40 2005 +0000 Remove unneeded includes of cairo-path-fixed-private.h. Fix indentation. ChangeLog | 9 +++++++++ src/cairo-ft-font.c | 2 +- src/cairo-path-fill.c | 1 - src/cairo-path-stroke.c | 1 - src/cairo_ft_font.c | 2 +- src/cairo_path_fill.c | 1 - src/cairo_path_stroke.c | 1 - 7 files changed, 11 insertions(+), 6 deletions(-) commit 9bcfb831fa6355b61700b2c5f466711296971a07 Author: Carl Worth Date: Wed Mar 23 14:02:36 2005 +0000 More updates to the API Shakeup chart. ChangeLog | 4 ++++ TODO | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit f218c14b9da7950b49bdab76965db22ec470d5de Author: Carl Worth Date: Wed Mar 23 13:52:54 2005 +0000 Rename cairo_path_real_t to cairo_path_fixed_t and fix all _cairo_path functions to be named as _cairo_path_fixed functions. Track name change of cairo_path_real_t and _cairo_path_fixed functions. ChangeLog | 37 ++++++++++ src/cairo-font.c | 2 +- src/cairo-ft-font.c | 26 ++++---- src/cairo-gstate-private.h | 2 +- src/cairo-gstate.c | 66 +++++++++--------- src/cairo-path-bounds.c | 18 +++--- src/cairo-path-fill.c | 20 +++--- src/cairo-path-fixed-private.h | 2 +- src/cairo-path-stroke.c | 34 +++++----- src/cairo-path.c | 74 ++++++++++---------- src/cairo_font.c | 2 +- src/cairo_ft_font.c | 26 ++++---- src/cairo_gstate.c | 66 +++++++++--------- src/cairo_path.c | 74 ++++++++++---------- src/cairo_path_bounds.c | 18 +++--- src/cairo_path_fill.c | 20 +++--- src/cairo_path_stroke.c | 34 +++++----- src/cairoint.h | 152 +++++++++++++++++++++------------------- 18 files changed, 360 insertions(+), 313 deletions(-) commit 0ba7a082afa91476129f2cbdbc48360b4f83efec Author: Carl Worth Date: Wed Mar 23 13:52:11 2005 +0000 Remove CAIRO_BEGIN_DECLS and CAIRO_END_DECLS as they are not needed for private headers. Add ASSERT_NOT_REACHED macro. Rewrite in terms of cairo_copt_path and cairo_copy_path_flat in preparation for removing cairo_gstate_interpret_path. ChangeLog | 11 ++++++ src/cairo-path-data-private.h | 4 -- src/cairo.c | 69 +++++++++++++++++++++++++++++++++-------- src/cairoint.h | 6 +++ 4 files changed, 73 insertions(+), 17 deletions(-) commit cb5bbd0aa75ad55a7f0f61c718c32f9b9f5af45e Author: Carl Worth Date: Wed Mar 23 13:50:51 2005 +0000 Begin the process of breaking up cairoint.h, moving structure definitions of cairo_t, cairo_gstate_t, and cairo_path_real_t into their own header files. Track changes to header files, reaching into the new private headers where necessary. ChangeLog | 17 ++++++++ src/cairo-gstate-private.h | 85 +++++++++++++++++++++++++++++++++++++++ src/cairo-gstate.c | 2 + src/cairo-path-fill.c | 3 + src/cairo-path-fixed-private.h | 74 ++++++++++++++++++++++++++++++++++ src/cairo-path-stroke.c | 3 + src/cairo-path.c | 2 + src/cairo-pen.c | 2 + src/cairo-private.h | 47 ++++++++++++++++++++++ src/cairo.c | 2 + src/cairo_gstate.c | 2 + src/cairo_path.c | 2 + src/cairo_path_fill.c | 3 + src/cairo_path_stroke.c | 3 + src/cairo_pen.c | 2 + src/cairoint.h | 86 +--------------------------------------- 16 files changed, 251 insertions(+), 84 deletions(-) commit 9bb171515986fa26dd12ae19e684db847a614960 Author: Carl Worth Date: Wed Mar 23 13:49:32 2005 +0000 Move surface-specific cairo_t functions to cairo.c. Remove functions that have now moved to cairo.c. A few new files to ignore now with new compilation mode using a libtool helper library. ChangeLog | 20 ++++ src/cairo-glitz-surface.c | 19 ---- src/cairo-pdf-surface.c | 75 ------------- src/cairo-ps-surface.c | 40 ------- src/cairo-win32-surface.c | 21 ---- src/cairo-xcb-surface.c | 24 ---- src/cairo-xlib-surface.c | 41 ------- src/cairo.c | 265 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo_glitz_surface.c | 19 ---- src/cairo_pdf_surface.c | 75 ------------- src/cairo_png_surface.c | 23 ---- src/cairo_ps_surface.c | 40 ------- src/cairo_win32_surface.c | 21 ---- src/cairo_xcb_surface.c | 24 ---- src/cairo_xlib_surface.c | 41 ------- test/.cvsignore | 5 +- 16 files changed, 288 insertions(+), 465 deletions(-) commit 12de3807b48d6c5f133983a0de1498f93e0c84a6 Author: Carl Worth Date: Wed Mar 23 13:31:01 2005 +0000 Add backwards-compatibility for recently renamed functions. ChangeLog | 5 +++++ src/cairo.h | 12 ++++++++++++ 2 files changed, 17 insertions(+), 0 deletions(-) commit b381eb8045683e51cbd052bb724cab9969677cb6 Author: Carl Worth Date: Sun Mar 20 23:23:19 2005 +0000 Rename functions to eliminate abbreviations: cairo_concat_matrix -> cairo_transform cairo_transform_point -> cairo_user_to_device cairo_transform_distance -> cairo_user_to_device_distance cairo_inverse_transform_point -> cairo_device_to_user cairo_inverse_transform_distance-> cairo_device_to_user_distance cairo_init_clip -> cairo_reset_clip ChangeLog | 19 ++++++ src/cairo-gstate.c | 29 +++++----- src/cairo-matrix.c | 10 ++- src/cairo.c | 159 +++++++++++++++++++++++++++++++++++++++++++++++----- src/cairo.h | 14 ++-- src/cairo_gstate.c | 29 +++++----- src/cairo_matrix.c | 10 ++- src/cairoint.h | 16 +++--- 8 files changed, 220 insertions(+), 66 deletions(-) commit ba5bf28fbcc41925f49700be02365850b7e445d7 Author: Carl Worth Date: Fri Mar 18 14:31:11 2005 +0000 Update API shakeup chart. ChangeLog | 4 ++++ TODO | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) commit c629df861673bd9e60cf7a3babd83f0f5bb257f0 Author: Carl Worth Date: Fri Mar 18 14:28:53 2005 +0000 * src/cairo.c: (cairo_copy_path), (cairo_copy_path_flat), (cairo_append_path): Rename cairo_copy_path_data, cairop_copy_path_data_flat, and cairo_append_path_data to cairo_copy_path, cairo_copy_path_flat, and cairo_append_path. Add new cairo_path_t, containing a cairo_path_data_t array and an explicit length. Remove CAIRO_PATH_END_PATH terminator from cairo_path_data_t. Rename the internal path object from cairo_path_t to cairo_path_real_t. ChangeLog | 36 ++++++++++++++++++++ src/cairo-atsui-font.c | 4 +- src/cairo-font.c | 2 +- src/cairo-ft-font.c | 10 +++--- src/cairo-gstate.c | 2 +- src/cairo-path-bounds.c | 4 ++- src/cairo-path-data-private.h | 10 +++--- src/cairo-path-data.c | 65 ++++++++++++++++++++---------------- src/cairo-path-fill.c | 4 ++- src/cairo-path-stroke.c | 4 ++- src/cairo-path.c | 62 +++++++++++++++++++--------------- src/cairo.c | 56 +++++++++++++++--------------- src/cairo.h | 74 ++++++++++++++++++++++++++-------------- src/cairo_atsui_font.c | 4 +- src/cairo_font.c | 2 +- src/cairo_ft_font.c | 10 +++--- src/cairo_gstate.c | 2 +- src/cairo_path.c | 62 +++++++++++++++++++--------------- src/cairo_path_bounds.c | 4 ++- src/cairo_path_data.c | 65 ++++++++++++++++++++---------------- src/cairo_path_fill.c | 4 ++- src/cairo_path_stroke.c | 4 ++- src/cairoint.h | 64 +++++++++++++++++++---------------- test/path-data.c | 60 ++++++++++++++++++++------------- test/path_data.c | 60 ++++++++++++++++++++------------- 25 files changed, 402 insertions(+), 272 deletions(-) commit 987a13b814d2d84cff719a817f9f73a5b7aa38f2 Author: Kristian Høgsberg Date: Fri Mar 18 12:26:03 2005 +0000 Remove return statements from these functions (bug #2137). ChangeLog | 6 ++++++ src/cairo-pdf-surface.c | 20 ++++++++++---------- src/cairo_pdf_surface.c | 20 ++++++++++---------- 3 files changed, 26 insertions(+), 20 deletions(-) commit 84a6da8f07a5f0352a342ed8d599b52ab32dfe6f Author: Carl Worth Date: Fri Mar 18 11:15:25 2005 +0000 Remove unused libcairo_freetype_sources (thanks to Damien Carbery). Closes bug #2673. ChangeLog | 6 ++++++ TODO | 2 +- src/Makefile.am | 1 - 3 files changed, 7 insertions(+), 2 deletions(-) commit 2ad590a0eebe8c03cb956dfaf0ce79c485c2ce3c Author: Owen Taylor Date: Thu Mar 17 13:27:26 2005 +0000 doc fix - 90 degrees is MI_PI/2 radians. src/cairo.c src/cairo_matrix.c src/cairo_ft_font.c src/cairo_ps_surface.c src/cairo_quartz_surface.c src/cairo_win32_font.c src/cairo_win32_surface.c src/cairo_xlib_surface.c: Cairo is only capitalized at the beginning of sentences. ChangeLog | 11 +++++++++++ src/cairo-ft-font.c | 2 +- src/cairo-matrix.c | 4 ++-- src/cairo-ps-surface.c | 4 ++-- src/cairo-quartz-surface.c | 6 +++--- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 6 +++--- src/cairo-xlib-surface.c | 12 ++++++------ src/cairo.c | 4 ++-- src/cairo_ft_font.c | 2 +- src/cairo_matrix.c | 4 ++-- src/cairo_ps_surface.c | 4 ++-- src/cairo_quartz_surface.c | 6 +++--- src/cairo_win32_font.c | 2 +- src/cairo_win32_surface.c | 6 +++--- src/cairo_xlib_surface.c | 12 ++++++------ 16 files changed, 49 insertions(+), 38 deletions(-) commit 58420806bbbe3970747edc2efaa155651377a370 Author: Kristian Høgsberg Date: Thu Mar 17 13:13:56 2005 +0000 From Tor Lillqvist : Open output PNG files in binary mode. ChangeLog | 7 +++++++ test/cairo-test.c | 4 ++-- test/cairo_test.c | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) commit e66e4c7b8c7aa80e3a71caebefae06cd2d6b468e Author: Owen Taylor Date: Thu Mar 17 12:57:42 2005 +0000 src/cairo.h src/cairo_surface.c src/cairo-xlib.h src/cairo_xlib_surface.c: Move cairo_xlib_surface_set_device_offset() to a generic cairo_surface_set_device_offset(). Take the surface's device offset into account. Update. ChangeLog | 11 +++ doc/public/cairo-sections.txt | 6 ++- doc/public/tmpl/cairo-pdf.sgml | 34 ++++++++++ doc/public/tmpl/cairo-surface.sgml | 19 ++++++ doc/public/tmpl/cairo-xlib.sgml | 10 --- doc/public/tmpl/cairo.sgml | 13 ++++ src/cairo-gstate.c | 119 +++++++++++++++++++++++++----------- src/cairo-surface.c | 30 +++++++++ src/cairo-xlib-surface.c | 111 +++++---------------------------- src/cairo-xlib.h | 5 -- src/cairo.h | 5 ++ src/cairo_gstate.c | 119 +++++++++++++++++++++++++----------- src/cairo_surface.c | 30 +++++++++ src/cairo_xlib_surface.c | 111 +++++---------------------------- src/cairoint.h | 3 + 15 files changed, 350 insertions(+), 276 deletions(-) commit 0b09748296ea3f0ebb554061ef248373b8437947 Author: Owen Taylor Date: Thu Mar 17 11:24:00 2005 +0000 Fix the docs to to correctly describe the order of transformation for muliply/scale/rotate/translate. (cairo_matrix_translate): Fix translate/rotate typo in the parameter descriptions. ChangeLog | 7 +++++++ src/cairo-matrix.c | 35 ++++++++++++++++++++++------------- src/cairo_matrix.c | 35 ++++++++++++++++++++++------------- 3 files changed, 51 insertions(+), 26 deletions(-) commit 1e7138175667e55dad7e0ca8ebadd0a1a50f0fa8 Author: Kristian Høgsberg Date: Thu Mar 17 07:32:28 2005 +0000 Forgot to add this file. ChangeLog | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit b481b858412876f015a2fcba286b0cc5cadf4d0c Author: Kristian Høgsberg Date: Thu Mar 17 07:30:05 2005 +0000 ChangeLog src/cairo-output-stream.c | 147 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo_output_stream.c | 147 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 294 insertions(+), 0 deletions(-) commit 0f52fb2289b8369f0d66a779338e18818746ad7d Author: Kristian Høgsberg Date: Wed Mar 16 12:15:29 2005 +0000 Dont call user data destroy function if it's NULL. Add test case for user data with NULL destroy function. ChangeLog | 11 ++++++++++- src/cairo-surface.c | 4 ++-- src/cairo_surface.c | 4 ++-- test/user-data.c | 8 ++++++++ test/user_data.c | 8 ++++++++ 5 files changed, 30 insertions(+), 5 deletions(-) commit 6993c086ebaa9a98b1794f2c483013ec51cc41ec Author: Kristian Høgsberg Date: Wed Mar 16 12:08:41 2005 +0000 Add cairo_output_stream.c Add new errors, CAIRO_STATUS_WRITE_ERROR and CAIRO_STATUS_SURFACE_FINISHED, add cairo_surface_finish() prototype, add cairo_write_func_t. Add strings for new errors, documentation fix. Rename surface destroy functions to finish and change them to not free the surface. Change PDF surface constructors to take a write function in the general case and add stdio convenience constructors. Change destroy function to finish for cairo_pdf_surface. Change implementation to use cairo_output_stream_t functions for output. Use _cairo_surface_show_glyphs instead of calling function pointer directly. Add prototypes for cairo output stream functions, rename destroy to finish in cairo_surface_backend_t and add finished flag to cairo_surface_t. Add cairo_surface_finish() and call it from cairo_surface_destroy(). Check the finished flag in cairo_surface_t in functions that change the surface. ChangeLog | 38 ++ src/Makefile.am | 1 + src/cairo-font.c | 19 +- src/cairo-glitz-surface.c | 11 +- src/cairo-image-surface.c | 8 +- src/cairo-pdf-surface.c | 849 ++++++++++++++++++++++++++------------------- src/cairo-pdf.h | 40 ++- src/cairo-ps-surface.c | 8 +- src/cairo-surface.c | 116 ++++++- src/cairo-win32-surface.c | 6 +- src/cairo-xcb-surface.c | 6 +- src/cairo-xlib-surface.c | 8 +- src/cairo.c | 6 +- src/cairo.h | 22 ++- src/cairo_font.c | 19 +- src/cairo_glitz_surface.c | 11 +- src/cairo_image_surface.c | 8 +- src/cairo_pdf_surface.c | 849 ++++++++++++++++++++++++++------------------- src/cairo_png_surface.c | 8 +- src/cairo_ps_surface.c | 8 +- src/cairo_surface.c | 116 ++++++- src/cairo_win32_surface.c | 6 +- src/cairo_xcb_surface.c | 6 +- src/cairo_xlib_surface.c | 8 +- src/cairoint.h | 49 +++- 25 files changed, 1415 insertions(+), 811 deletions(-) commit 5fecf69e2c41ed1957fdde8b0208e7a4aa031466 Author: Owen Taylor Date: Tue Mar 15 16:25:30 2005 +0000 src/cairo-xlib.h src/cairo_xlib_surface.c: Rework set of contructors for XLib surfaces. Add cairo_xlib_surface_set_size(). src/cairo-xlib.h src/cairo_xlib_surface.c: Add cairo_xlib_surface_set_device_offset(). Rewrite for clarity and efficiency. Use a temporary pixmap to avoid possible BadMatch when fetch from windows. src/cairo.[ch] src/cairo-xlib.h: Fix some parameter names for the docs. Update ChangeLog | 21 ++ doc/public/cairo-sections.txt | 5 + doc/public/tmpl/cairo-surface.sgml | 4 +- doc/public/tmpl/cairo-xlib.sgml | 55 ++++ src/cairo-xlib-surface.c | 583 ++++++++++++++++++++++++++---------- src/cairo-xlib.h | 38 ++- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairo_xlib_surface.c | 583 ++++++++++++++++++++++++++---------- 9 files changed, 955 insertions(+), 338 deletions(-) commit 30e771d8118a6b240f483b4d0db26bb970e88181 Author: Carl Worth Date: Mon Mar 14 11:49:12 2005 +0000 Add reference image. ChangeLog | 4 ++++ test/path-data-ref.png | Bin 0 -> 387 bytes test/path_data-ref.png | Bin 0 -> 387 bytes 3 files changed, 4 insertions(+), 0 deletions(-) commit f385e5f3e47dec22aa48df02f3f19b06fe0b8780 Author: Carl Worth Date: Mon Mar 14 11:14:13 2005 +0000 Fixes to force tests to run against locally compiled version (thanks to Manish Singh). ChangeLog | 5 +++++ test/Makefile.am | 36 +++++++++++++++++++----------------- 2 files changed, 24 insertions(+), 17 deletions(-) commit a98430092f5f43cfa6eee555a56d91575d92cd62 Author: Carl Worth Date: Fri Mar 11 14:29:15 2005 +0000 Added some documentation, so we get some churn here. New functions: cairo_copy_path_data, cairo_copy_path_data_flat, and cairo_append_path_data. Add new implementation for cairo_copy_path_data and cairo_append_path_data. New test for new path_data functions. ChangeLog | 19 +++ doc/public/cairo-sections.txt | 11 ++ doc/public/tmpl/cairo-surface.sgml | 22 +++ doc/public/tmpl/cairo.sgml | 43 ++++++ src/Makefile.am | 2 + src/cairo-path-data-private.h | 57 ++++++++ src/cairo-path-data.c | 268 ++++++++++++++++++++++++++++++++++++ src/cairo.c | 88 ++++++++++++- src/cairo.h | 100 +++++++++++++- src/cairo_path_data.c | 268 ++++++++++++++++++++++++++++++++++++ test/.cvsignore | 3 + test/Makefile.am | 3 + test/path-data.c | 167 ++++++++++++++++++++++ test/path_data.c | 167 ++++++++++++++++++++++ 14 files changed, 1210 insertions(+), 8 deletions(-) commit db616356c1dd6a8a30c681e3380003ada1f3234c Author: Owen Taylor Date: Fri Mar 11 12:09:00 2005 +0000 Set format->depth correctly instead of just using the bpp. pixman/ChangeLog | 5 +++++ pixman/src/icformat.c | 6 +++++- 2 files changed, 10 insertions(+), 1 deletions(-) commit 1f5394ffe91ee8a7bd4c15cbec3a8ac3956d949e Author: Kristian Høgsberg Date: Thu Mar 10 09:28:50 2005 +0000 *** empty log message *** ChangeLog | 5 +++++ src/cairo-surface.c | 18 ++++++++++++++++++ src/cairo_surface.c | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 0 deletions(-) commit b032d02322a656a3cfc02d0ea788680c12689d1f Author: Kristian Høgsberg Date: Thu Mar 10 09:22:20 2005 +0000 Fix assert()'s using = instead of ==. Move xunlink call below the xasprintf that builds the filename to unlink. ChangeLog | 7 +++++++ test/cairo-test.c | 4 ++-- test/cairo_test.c | 4 ++-- test/user-data.c | 4 ++-- test/user_data.c | 4 ++-- 5 files changed, 15 insertions(+), 8 deletions(-) commit 05a7c69c904119ee08df40b8e3f7154614fcbf8e Author: Carl Worth Date: Thu Mar 10 09:02:41 2005 +0000 API Shakeup status update. ChangeLog | 4 ++++ TODO | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) commit c67ba13a6e715fa3bd4e785ed72c093f791e2774 Author: Carl Worth Date: Thu Mar 10 08:59:11 2005 +0000 Originally: 2005-02-24 Carl Worth Add const qualifier to cairo_user_data_key_t arguments. Originally: 2005-02-15 Kristian Høgsberg Add these two functions to set and get user data on an surface. Function prototypes for new functions. Test case for user data functions. ChangeLog | 18 +++++++ doc/public/tmpl/cairo-atsui.sgml | 3 + doc/public/tmpl/cairo-ft.sgml | 3 + doc/public/tmpl/cairo-glitz.sgml | 3 + doc/public/tmpl/cairo-matrix.sgml | 3 + doc/public/tmpl/cairo-pattern.sgml | 3 + doc/public/tmpl/cairo-pdf.sgml | 3 + doc/public/tmpl/cairo-png.sgml | 3 + doc/public/tmpl/cairo-ps.sgml | 3 + doc/public/tmpl/cairo-quartz.sgml | 3 + doc/public/tmpl/cairo-surface.sgml | 3 + doc/public/tmpl/cairo-xcb.sgml | 3 + doc/public/tmpl/cairo-xlib.sgml | 3 + doc/public/tmpl/cairo.sgml | 48 ++++++++++++------- src/cairo-surface.c | 90 ++++++++++++++++++++++++++++++++++++ src/cairo.h | 33 +++++++++++++ src/cairo_surface.c | 90 ++++++++++++++++++++++++++++++++++++ src/cairoint.h | 1 + test/.cvsignore | 3 +- test/Makefile.am | 5 +- test/user-data.c | 70 ++++++++++++++++++++++++++++ test/user_data.c | 70 ++++++++++++++++++++++++++++ 22 files changed, 444 insertions(+), 20 deletions(-) commit 12abad4759286d8642cd02f258fba0749ea20b8b Author: Carl Worth Date: Wed Mar 9 17:43:59 2005 +0000 Move filename initialization up to before first use. Add test for the most trivial cairo_get and cairo_set functions. ChangeLog | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit 0daf6b1745fa6a64652849f280da42781aeb296b Author: Carl Worth Date: Wed Mar 9 14:34:26 2005 +0000 Move filename initialization up to before first use. Add test for the most trivial cairo_get and cairo_set functions. test/Makefile.am | 17 ++++--- test/cairo-test.c | 22 ++++---- test/cairo_test.c | 22 ++++---- test/get-and-set.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/get_and_set.c | 151 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 336 insertions(+), 27 deletions(-) commit c3bd9b1b8d55d1128a7f70096b7135a80c6c9bed Author: Carl Worth Date: Wed Mar 9 13:58:20 2005 +0000 Change the draw function under test to return a cairo_test_status_t so that it can indicate test failure even if there is no result image. ChangeLog | 17 +++++++++++++++++ test/cairo-test.c | 20 +++++++++++++++++--- test/cairo-test.h | 2 +- test/cairo_test.c | 20 +++++++++++++++++--- test/cairo_test.h | 2 +- test/clip-twice.c | 4 +++- test/clip_twice.c | 4 +++- test/coverage.c | 4 +++- test/fill-rule.c | 4 +++- test/fill_rule.c | 4 +++- test/leaky-polygon.c | 4 +++- test/leaky_polygon.c | 4 +++- test/line-width.c | 4 +++- test/line_width.c | 4 +++- test/linear-gradient.c | 4 +++- test/linear_gradient.c | 4 +++- test/move-to-show-surface.c | 4 +++- test/move_to_show_surface.c | 4 +++- test/pixman-rotate.c | 4 +++- test/pixman_rotate.c | 4 +++- test/text-cache-crash.c | 4 +++- test/text-rotate.c | 4 +++- test/text_cache_crash.c | 4 +++- test/text_rotate.c | 4 +++- 24 files changed, 110 insertions(+), 27 deletions(-) commit 80b2742952eeadc116bef8865f55ecb47b4a0a5e Author: Carl Worth Date: Wed Mar 9 13:56:37 2005 +0000 fix typos. ChangeLog | 1 + TODO | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) commit 2fbdcf208216a8c383ce2ddfded4763ba700ed5a Author: Carl Worth Date: Wed Mar 9 12:53:01 2005 +0000 Update API Shakeup planning chart. ChangeLog | 4 ++++ TODO | 56 ++++++++++++++++++++++++++++++-------------------------- 2 files changed, 34 insertions(+), 26 deletions(-) commit 6d4653fe22c0d24d650b094a1e271c37a9a11eb1 Author: Carl Worth Date: Wed Mar 9 12:35:36 2005 +0000 Rename all the cairo_current functions to cairo_get functions instead. Add documentation for all of these functions (and a few others as well). Add support so that old binarys should still run and old source should still compile, (though we'll rip that out again on the API Shakeup flag day). ChangeLog | 34 ++++ doc/public/cairo-sections.txt | 53 +++--- src/cairo-ft-font.c | 8 +- src/cairo-gstate.c | 42 ++-- src/cairo-path.c | 2 +- src/cairo.c | 423 +++++++++++++++++++++++++++++++++++------ src/cairo.h | 125 ++++++++----- src/cairo_ft_font.c | 8 +- src/cairo_gstate.c | 42 ++-- src/cairo_path.c | 2 +- src/cairoint.h | 36 ++-- test/pixman-rotate.c | 2 +- test/pixman_rotate.c | 2 +- 13 files changed, 578 insertions(+), 201 deletions(-) commit 36820ec40a4c2cd246d23d23e6d8ef15dd4c6504 Author: Carl Worth Date: Tue Mar 8 19:34:04 2005 +0000 Add -head to CAIRO_VERSION after tagging with SNAPSHOT_0_4_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 980eff38e494223de00e7ded706f6beaca27fce1 Author: Carl Worth Date: Tue Mar 8 19:30:19 2005 +0000 Commit workaround to prevent make distcheck from making bogus complaints that gtk-doc is not enabled. ChangeLog | 4 ++++ gtk-doc.make | 8 +++++++- test/Makefile.am | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) commit e586688e6bed6b148c6920be35741305c95f0ca6 Author: Carl Worth Date: Tue Mar 8 19:25:39 2005 +0000 Look for png images in ${srcdir}/filename as well, so that make distcheck can still find them. Add romedalen.png to EXTRA_DIST so the tests can pass from the tar file. Fix typo: cairo-win3 -> cairo-win32. Add cairo-win32.xml to the list, so it gets generated as well. Add pointer to new win32 documentation. ChangeLog | 15 +++++++++++++++ NEWS | 4 ++++ doc/public/cairo-docs.xml | 1 + doc/public/cairo-sections.txt | 2 +- test/Makefile.am | 3 ++- test/cairo-test.c | 9 +++++++++ test/cairo_test.c | 9 +++++++++ 7 files changed, 41 insertions(+), 2 deletions(-) commit 0c67d496a35e7f069faeaba32bfde697dc949e9f Author: Carl Worth Date: Tue Mar 8 17:36:24 2005 +0000 Increment CAIRO_VERSION to 0.4.0 Added notes for snapshot 0.4.0 ChangeLog | 6 +++ NEWS | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 3 files changed, 129 insertions(+), 1 deletions(-) commit 627338ab4a270f54235c3356640f7feff4df7079 Author: Carl Worth Date: Tue Mar 8 14:30:14 2005 +0000 Fix accidental commit of diff, rather than ref image. test/coverage-ref.png | Bin 2148 -> 44324 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit c05059f62fc70e94ed864559212a223debe30915 Author: Carl Worth Date: Tue Mar 8 14:25:54 2005 +0000 Update coverage-ref.png due to seemingly harmless, though not entirely understood changes. test/coverage-ref.png | Bin 44331 -> 2148 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 246a07022aa97614c8961526cf3e2b06e8d5774b Author: Carl Worth Date: Tue Mar 8 13:44:14 2005 +0000 Shared function for checking unlink errrors. (cairo_test): Move all error messages to test-specific log files for quieter test output. Make pixman_rotate an expected failure. ChangeLog | 8 ++++++++ test/Makefile.am | 6 ++---- test/cairo-test.c | 48 ++++++++++++++++++++++++++++++++++-------------- test/cairo_test.c | 48 ++++++++++++++++++++++++++++++++++-------------- 4 files changed, 78 insertions(+), 32 deletions(-) commit 4dcccab806f56f54bd21541c9a90a9439f8ccbbe Author: Carl Worth Date: Tue Mar 8 08:51:48 2005 +0000 Require libpixman >= 0.1.4. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 74416f2d9aa4529ca8951f0d276e06a148c632fb Author: Kristian Høgsberg Date: Mon Mar 7 21:22:42 2005 +0000 Return CAIRO_STATUS_SUCCESS even if we don't implement masks yet, so we don't set cr->status to CAIRO_INT_STATUS_UNSUPPORTED. ChangeLog | 6 ++++++ src/cairo-pdf-surface.c | 2 +- src/cairo_pdf_surface.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit c4697bc572f60340978df6662caad0e0755acc58 Author: Carl Worth Date: Mon Mar 7 14:23:07 2005 +0000 Disable the "new" intersection code so that the incorrect fill problems (test/fill_rule) go away. ChangeLog | 3 +++ src/cairo-traps.c | 28 ++++++++++++++++++++++++++-- src/cairo_traps.c | 28 ++++++++++++++++++++++++++-- 3 files changed, 55 insertions(+), 4 deletions(-) commit 864496a10a2a99c27c8dcd90efb7cb1759036ef3 Author: Carl Worth Date: Mon Mar 7 13:50:30 2005 +0000 Increment version to 0.1.4-head post-snapshot. pixman/ChangeLog | 2 ++ pixman/configure.in | 2 +- 2 files changed, 3 insertions(+), 1 deletions(-) commit dfcd68ecca8f6a627ba406cbd4123a3a1c5cac40 Author: Carl Worth Date: Mon Mar 7 13:20:52 2005 +0000 Add notes on using -head suffix for PIXMAN_VERSION. pixman/ChangeLog | 2 ++ pixman/RELEASING | 28 +++++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) commit 32fbb0afae691d18c23d7fe996d33cd134f58fcb Author: Carl Worth Date: Mon Mar 7 12:40:29 2005 +0000 Make configure fail if no font backend is available. Point the user at freetype and fontconfig. ChangeLog | 5 +++++ configure.in | 10 ++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) commit 5804df2bcc1d0d697a2e4c4b7620d742e10fd450 Author: Carl Worth Date: Mon Mar 7 12:16:33 2005 +0000 Add notes for snapshot 0.1.4. Increment version to 0.1.4. pixman/ChangeLog | 6 ++++++ pixman/NEWS | 22 ++++++++++++++++++++++ pixman/configure.in | 2 +- 3 files changed, 29 insertions(+), 1 deletions(-) commit e7607bb379641f1f07a08e02214db63c0ed637a4 Author: Owen Taylor Date: Sun Mar 6 12:05:23 2005 +0000 Comment and clean up the gradient computation. (_cairo_linear_pattern_classify): Determine if a linear gradient is horizontal or vertical. (_cairo_pattern_acquire_surface_for_gradient): Optimize horizontal/vertical gradients with a repeating surface. Test case for linear gradients at angles and with a rotated pattern matrix. ChangeLog | 12 ++++ src/cairo-pattern.c | 119 +++++++++++++++++++++++++++++------ src/cairo_pattern.c | 119 +++++++++++++++++++++++++++++------ test/Makefile.am | 3 + test/linear-gradient-ref.png | Bin 0 -> 12724 bytes test/linear-gradient.c | 141 ++++++++++++++++++++++++++++++++++++++++++ test/linear_gradient-ref.png | Bin 0 -> 12724 bytes test/linear_gradient.c | 141 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 497 insertions(+), 38 deletions(-) commit 023d91123229dfb7db1c9e28b3981037660cc5a6 Author: David Reveman Date: Sun Mar 6 05:16:19 2005 +0000 Fix gradient acceleration in glitz backend ChangeLog | 9 +++++ src/cairo-glitz-surface.c | 76 +++++++++++++++++++++++++++++---------------- src/cairo_glitz_surface.c | 76 +++++++++++++++++++++++++++++---------------- 3 files changed, 107 insertions(+), 54 deletions(-) commit 50b483042dc8b02fdcf8cc04bccf24b68dab76d6 Author: Owen Taylor Date: Fri Mar 4 10:43:24 2005 +0000 src/cairo_win32_font.c src/cairo_win32_surface.c: Update for recent backend interface changes. Reenable win32 backend by default. ChangeLog | 7 +++++ src/cairo-win32-font.c | 17 ++++++++--- src/cairo-win32-surface.c | 67 +++++++++++++------------------------------- src/cairo_win32_font.c | 17 ++++++++--- src/cairo_win32_surface.c | 67 +++++++++++++------------------------------- 5 files changed, 71 insertions(+), 104 deletions(-) commit f6dcd38c8cb65bfdc621efb9fad06b7c06704e69 Author: Carl Worth Date: Fri Mar 4 10:07:22 2005 +0000 Fix accidental reversal of condition in previous patch. ChangeLog | 6 ++++++ src/cairo-glitz-surface.c | 2 +- src/cairo_glitz_surface.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 66af5f9f3600b514801958d0c796a815ea4e31ee Author: Owen Taylor Date: Fri Mar 4 09:41:34 2005 +0000 src/cairoint.h src/cairo_pattern.c src/cairo_glitz_surface.c: Add _cairo_pattern_is_opaque, use it rather than pattern->alpha == 1.0. ChangeLog | 6 +++++ configure.in | 2 +- src/cairo-glitz-surface.c | 28 +++++++++++++++++++---- src/cairo-pattern.c | 53 +++++++++++++++++++++++++++++++++++++++++--- src/cairo-win32-surface.c | 4 +- src/cairo_glitz_surface.c | 28 +++++++++++++++++++---- src/cairo_pattern.c | 53 +++++++++++++++++++++++++++++++++++++++++--- src/cairo_win32_surface.c | 4 +- src/cairoint.h | 3 ++ 9 files changed, 158 insertions(+), 23 deletions(-) commit c4443533e8e8fc3bbac6bfe935d1c8bb7421a710 Author: Carl Worth Date: Fri Mar 4 07:53:09 2005 +0000 Intersect bounds of trapezoids with the bounds of the destination surface before creating an intermediate surface. pixman/ChangeLog | 6 ++++++ pixman/src/ictrap.c | 28 +++++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) commit b1545db06697221af7078ab09894d378893e1162 Author: Carl Worth Date: Fri Mar 4 07:31:49 2005 +0000 Add comment from xserver's mitrap.c. pixman/ChangeLog | 5 +++++ pixman/src/ictrap.c | 7 +++++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit 4552898cfb11f7bc5161a713217dd964956437b7 Author: David Reveman Date: Thu Mar 3 20:16:23 2005 +0000 Update xcb backend ChangeLog | 4 + configure.in | 4 +- src/cairo-xcb-surface.c | 457 ++++++++++++++++++++++++++++++++--------------- src/cairo_xcb_surface.c | 457 ++++++++++++++++++++++++++++++++--------------- 4 files changed, 630 insertions(+), 292 deletions(-) commit f54f78525a1d4fcf535cf7c7a47c40073889081e Author: David Reveman Date: Thu Mar 3 19:09:24 2005 +0000 Fixed variable assignments in configure.in ChangeLog | 2 ++ configure.in | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) commit 378fb57051e6b1246c975a58f5fafa426935d6e1 Author: David Reveman Date: Thu Mar 3 18:55:28 2005 +0000 Add more mask surface acceleration to glitz backend ChangeLog | 4 ++ src/cairo-glitz-surface.c | 101 +++++++++++++++++++++++++++++++++++++++++---- src/cairo_glitz_surface.c | 101 +++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 188 insertions(+), 18 deletions(-) commit 01b87c7d99c157b560733edd9431a01a59752f6c Author: David Reveman Date: Thu Mar 3 18:46:49 2005 +0000 Add overall alpha acceleration using mask surface ChangeLog | 3 +++ src/cairo-pattern.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- src/cairo_pattern.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 91 insertions(+), 8 deletions(-) commit 50b5344d7d8ff16c06b89deefe9de520848de706 Author: David Reveman Date: Thu Mar 3 18:39:06 2005 +0000 Pass mask to composite operation as pattern ChangeLog | 16 ++++++ src/cairo-ft-font.c | 7 ++- src/cairo-glitz-surface.c | 126 +++++++++++++++++++++++++++++++-------------- src/cairo-gstate.c | 21 ++++++- src/cairo-image-surface.c | 82 ++++++++++++++++------------- src/cairo-pattern.c | 44 ++++++++++++++++ src/cairo-pdf-surface.c | 11 +++-- src/cairo-ps-surface.c | 2 +- src/cairo-surface.c | 14 +++--- src/cairo-xlib-surface.c | 88 +++++++++++++++++-------------- src/cairo_ft_font.c | 7 ++- src/cairo_glitz_surface.c | 126 +++++++++++++++++++++++++++++++-------------- src/cairo_gstate.c | 21 ++++++- src/cairo_image_surface.c | 82 ++++++++++++++++------------- src/cairo_pattern.c | 44 ++++++++++++++++ src/cairo_pdf_surface.c | 11 +++-- src/cairo_png_surface.c | 4 +- src/cairo_ps_surface.c | 2 +- src/cairo_surface.c | 14 +++--- src/cairo_xlib_surface.c | 88 +++++++++++++++++-------------- src/cairoint.h | 21 ++++++- 21 files changed, 564 insertions(+), 267 deletions(-) commit a97f4cce5e13cfa2dc3b843b3b37cb14cb16cf65 Author: David Reveman Date: Thu Mar 3 18:20:28 2005 +0000 Removed surface backend functions set_matrix, set_filter and set_repeat ChangeLog | 13 +++++++++++ src/cairo-glitz-surface.c | 24 ++------------------ src/cairo-image-surface.c | 26 ----------------------- src/cairo-pdf-surface.c | 24 --------------------- src/cairo-ps-surface.c | 30 -------------------------- src/cairo-surface.c | 8 ++---- src/cairo-xlib-surface.c | 51 +++++++++++++++++++++++++------------------- src/cairo_glitz_surface.c | 24 ++------------------ src/cairo_image_surface.c | 26 ----------------------- src/cairo_pdf_surface.c | 24 --------------------- src/cairo_png_surface.c | 30 -------------------------- src/cairo_ps_surface.c | 30 -------------------------- src/cairo_surface.c | 8 ++---- src/cairo_xlib_surface.c | 51 +++++++++++++++++++++++++------------------- src/cairoint.h | 12 ---------- 15 files changed, 83 insertions(+), 298 deletions(-) commit 36b69fc7f4ff090f5d5eb6e9db4c13cbf25971a6 Author: David Reveman Date: Thu Mar 3 18:04:51 2005 +0000 Major update to glitz backend ChangeLog | 5 + configure.in | 2 +- src/cairo-glitz-surface.c | 1097 ++++++++++++++++++++++++++------------------- src/cairo_glitz_surface.c | 1097 ++++++++++++++++++++++++++------------------- 4 files changed, 1278 insertions(+), 923 deletions(-) commit 6c915293119afefd0701cd6719917d2990f6a3e0 Author: David Reveman Date: Thu Mar 3 18:02:23 2005 +0000 Add pixman_add_trapezoids pixman/ChangeLog | 5 +++++ pixman/src/ictrap.c | 18 +++++++++++++++++- pixman/src/pixman.h | 9 ++++++++- 3 files changed, 30 insertions(+), 2 deletions(-) commit 019d381b4076a5716cae3708f0109d0815d7d6ef Author: David Reveman Date: Thu Mar 3 17:40:04 2005 +0000 Change to cairo_surface_t like structure of of cairo_pattern_t ChangeLog | 29 ++ configure.in | 4 +- src/cairo-gstate.c | 89 +++-- src/cairo-image-surface.c | 149 +++++--- src/cairo-pattern.c | 971 ++++++++++++++++++++++++++------------------- src/cairo-pdf-surface.c | 92 +++-- src/cairo-ps-surface.c | 6 +- src/cairo-xlib-surface.c | 201 +++++----- src/cairo_gstate.c | 89 +++-- src/cairo_image_surface.c | 149 +++++--- src/cairo_pattern.c | 971 ++++++++++++++++++++++++++------------------- src/cairo_pdf_surface.c | 92 +++-- src/cairo_ps_surface.c | 6 +- src/cairo_xlib_surface.c | 201 +++++----- src/cairoint.h | 174 +++++---- 15 files changed, 1867 insertions(+), 1356 deletions(-) commit 849a7ca8ef2abd94ccf90ec6cb732e9c742777f1 Author: Carl Worth Date: Thu Mar 3 14:27:31 2005 +0000 Port from render/mipict.c. Merge in optimization from render/mitrap.c for op==ADD and solid alpha src. pixman/ChangeLog | 7 +++++++ pixman/src/icimage.c | 31 +++++++++++++++++++++++++++++++ pixman/src/icimage.h | 3 +++ pixman/src/ictrap.c | 9 ++++++++- 4 files changed, 49 insertions(+), 1 deletions(-) commit e533d2faebccc9fbb02aa681cb93df26e4284929 Author: Carl Worth Date: Thu Mar 3 13:54:40 2005 +0000 Add a few more things that might be helpful when moving more files over from xserver. pixman/ChangeLog | 6 ++++++ pixman/src/pixman-xserver-compat.h | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) commit f482f2be49080921ef49c31def57933f72e3b646 Author: Carl Worth Date: Thu Mar 3 13:52:49 2005 +0000 Move definitions of MIN and MAX macros from ictrap.c to icint.h. pixman/ChangeLog | 6 ++++++ pixman/src/icint.h | 3 +++ pixman/src/ictrap.c | 5 +---- 3 files changed, 10 insertions(+), 4 deletions(-) commit 76d89e825763bffc3114d6e8a269eb5aea023267 Author: Carl Worth Date: Thu Mar 3 13:47:04 2005 +0000 Remove dead "if (!format)" code which also makes things more in synch with the server's mitrap.c. pixman/ChangeLog | 6 ++++ pixman/src/ictrap.c | 84 +++++++++++++++++++------------------------------- 2 files changed, 38 insertions(+), 52 deletions(-) commit 15bb06aaa07546fd6b853671012d28c1fa942f3f Author: Carl Worth Date: Thu Mar 3 13:36:30 2005 +0000 Restore original copyright and license which must have been inadvertently changed. pixman/ChangeLog | 5 +++++ pixman/src/ictrap.c | 40 +++++++++++++++++++--------------------- 2 files changed, 24 insertions(+), 21 deletions(-) commit b01798ea13327ea9048bdbffb4b98b172b8bbe3f Author: Carl Worth Date: Wed Mar 2 07:44:53 2005 +0000 Fix comment to clarify that libpixman regards the xserver repository as its canonical upstream for some files. pixman/ChangeLog | 4 ++++ pixman/src/pixman-xserver-compat.h | 21 +++++++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) commit 6d50e485fa1d95f27608bb33608e6d696145c9bb Author: Carl Worth Date: Wed Mar 2 07:43:33 2005 +0000 Convert file encodings from ISO-8859 to UTF-8. pixman/ChangeLog | 9 +++++++++ pixman/src/ic.c | 2 +- pixman/src/icblt.c | 2 +- pixman/src/icbltone.c | 2 +- pixman/src/iccolor.c | 2 +- pixman/src/iccompose.c | 2 +- pixman/src/icformat.c | 2 +- pixman/src/icimage.c | 2 +- pixman/src/icimage.h | 2 +- pixman/src/icint.h | 2 +- pixman/src/icpixels.c | 4 ++-- pixman/src/icrect.c | 2 +- pixman/src/icrop.h | 2 +- pixman/src/icstipple.c | 2 +- pixman/src/ictransform.c | 2 +- pixman/src/ictrap.c | 2 +- pixman/src/ictri.c | 2 +- pixman/src/icutil.c | 2 +- pixman/src/pixman.h | 4 ++-- pixman/src/slim_internal.h | 2 +- 20 files changed, 30 insertions(+), 21 deletions(-) commit 2dcb6cd345a5221ddb7356c0a2743a49183dea6d Author: Carl Worth Date: Tue Mar 1 15:04:48 2005 +0000 Note that cairo_output_stream_t patch has been reviewed. ChangeLog | 4 ++++ TODO | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 06bed80b9ed9b6941663855fdde178278becb376 Author: Carl Worth Date: Tue Mar 1 14:50:57 2005 +0000 Fix uninitialized value for status, (reported by Manish Singh). ChangeLog | 5 +++++ src/cairo-gstate.c | 4 ++-- src/cairo_gstate.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) commit 85db25b8a1eba2ce6dd54faa7f496bbb08c1b02f Author: Kristian Høgsberg Date: Sun Feb 27 11:21:39 2005 +0000 Fix this function again. Problem with signed/unsigned types reported by Jeff Muizelaar . ChangeLog | 6 ++++++ src/cairo-gstate.c | 17 ++++++++++------- src/cairo_gstate.c | 17 ++++++++++------- 3 files changed, 26 insertions(+), 14 deletions(-) commit db2eb5d4cb442d8a8bdd705c18c69bf2e4d9ee39 Author: Kristian Høgsberg Date: Sun Feb 27 11:02:48 2005 +0000 Remove newline in comment which was confusing gtk-doc. Document these functions. ChangeLog | 8 ++++++++ src/cairo-image-surface.c | 36 ++++++++++++++++++++++++++++++++++++ src/cairo.h | 1 - src/cairo_image_surface.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletions(-) commit cac994f1f842622e056e51637225fc6e2474866e Author: Carl Worth Date: Fri Feb 25 14:06:19 2005 +0000 Note that "user data" and "setters and getters" patches have been reviewed. Remove a few more TODO notes: cleanup cairo_snippets: DONE cairo_surface_finish: Now in API Shakeup snapping code: Decided against this ChangeLog | 8 ++++++++ TODO | 13 ++----------- 2 files changed, 10 insertions(+), 11 deletions(-) commit f343b0b44a8411a133d2a94ead7faa2e58648f97 Author: Carl Worth Date: Fri Feb 25 13:31:00 2005 +0000 From David Reveman: Rewrite to use cairo_bool_t for legibility. ChangeLog | 7 +++++++ src/cairo-matrix.c | 6 +++--- src/cairo_matrix.c | 6 +++--- src/cairoint.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) commit ebec6df7a77f1c778b69e36d562423a3ffd6edfb Author: Carl Worth Date: Fri Feb 25 13:03:42 2005 +0000 From David Reveman: Simplify code to eliminate a goto. ChangeLog | 7 +++++++ src/cairo-gstate.c | 26 ++++++++++---------------- src/cairo_gstate.c | 26 ++++++++++---------------- 3 files changed, 27 insertions(+), 32 deletions(-) commit 03e7e13cb1412c29ebd1f1c8b46db3849e089557 Author: Carl Worth Date: Fri Feb 25 12:58:49 2005 +0000 From David Reveman: Clean up the mess that was the misnamed _cairo_gstate_create_pattern. ChangeLog | 11 ++++++++++ src/cairo-gstate.c | 55 ++++++++++++++++----------------------------------- src/cairo_gstate.c | 55 ++++++++++++++++----------------------------------- 3 files changed, 45 insertions(+), 76 deletions(-) commit 1a043bbf26a02d240f24f0aca1bf848e7e203f1d Author: Carl Worth Date: Fri Feb 25 12:52:47 2005 +0000 Don't put an off-by-one n_stops into cairo_shader_op_t. (_cairo_shader_op_find_color_stops): Put search for two color stops containing a given offset into its own function. Handle the case of before first and after last stop by returning the nearest stop twice. (_cairo_pattern_calc_color_at_pixel): Handle case of no color stops by returning a transparent pixel. ChangeLog | 11 ++++++ src/cairo-pattern.c | 91 +++++++++++++++++++++++++++++++++----------------- src/cairo_pattern.c | 91 +++++++++++++++++++++++++++++++++----------------- src/cairoint.h | 2 - 4 files changed, 131 insertions(+), 64 deletions(-) commit 8ad3ab22e447e5fc2e93333b5958c37ef63fb392 Author: Owen Taylor Date: Thu Feb 24 15:48:07 2005 +0000 Remove a left-over debug printf. ChangeLog | 4 ++++ src/cairo-win32-surface.c | 3 --- src/cairo_win32_surface.c | 3 --- 3 files changed, 4 insertions(+), 6 deletions(-) commit aca0708fc828f75dd31142cdc20e5650c706d37e Author: Carl Worth Date: Thu Feb 24 14:06:03 2005 +0000 Fix memory leak when realloc fails due to out-of-memory. ChangeLog | 5 +++++ src/cairo-pattern.c | 12 ++++++------ src/cairo_pattern.c | 12 ++++++------ 3 files changed, 17 insertions(+), 12 deletions(-) commit a64b7e51eeefb61676c8579cc870fec9e2463529 Author: Owen Taylor Date: Thu Feb 24 12:51:33 2005 +0000 Instead of counting on ordering deletion to work (apparently it didn't on older Windows), save the initial bitmap created with the DC and reselect that into the DC. (Based on a patch by Hans Breuer) ChangeLog | 10 ++++- src/cairo-win32-private.h | 10 +++++ src/cairo-win32-surface.c | 91 ++++++++++++++++++++++++-------------------- src/cairo_win32_surface.c | 91 ++++++++++++++++++++++++-------------------- 4 files changed, 119 insertions(+), 83 deletions(-) commit de7d69aff9784cb19289d6709e18fb890ed39ecb Author: Carl Worth Date: Thu Feb 24 12:30:23 2005 +0000 Add pixman_rotate to ignore list. ChangeLog | 4 ++++ test/.cvsignore | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 04fefd1b281e3fcba0b81cee2acf68f8c97381c8 Author: Carl Worth Date: Thu Feb 24 12:28:51 2005 +0000 Fixes from David Reveman with minor cleanups by Carl Worth: Handle new failure possibility of _cairo_gstate_init. (_cairo_gstate_init): Handle possible failure of _cairo_pattern_create_solid. (_cairo_gstate_set_pattern): Reference new pattern before destroying existing pattern to handle the case where they are the same. (_cairo_gstate_set_rgb_color): Handle possible failure of _cairo_pattern_create_solid. ChangeLog | 14 ++++++++++++++ src/cairo-gstate.c | 24 ++++++++++++++++++------ src/cairo_gstate.c | 24 ++++++++++++++++++------ src/cairoint.h | 2 +- 4 files changed, 51 insertions(+), 13 deletions(-) commit 12d19423f608916753596cf736c89274d381964d Author: Carl Worth Date: Thu Feb 24 10:09:44 2005 +0000 Fix typo (pointed out by Kristian Høgsberg). ChangeLog | 4 ++++ src/cairo.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 724cf1ce71f55783ec3d759804aaba4b4a88bd7e Author: Owen Taylor Date: Thu Feb 24 08:20:14 2005 +0000 When we created a DC/bitmap pair, delete the DC before the Bitmap so that the Bitmap will be released from the DC and can be destroyed. (Reported by Hans Breuer) configure.in cairo.pc.in: Only require fontconfig if building FreeType font backend. Fix output when reporting Win32 font backend. ChangeLog | 12 ++++++++++++ cairo.pc.in | 2 +- configure.in | 6 ++++-- src/cairo-win32-surface.c | 10 ++++++---- src/cairo_win32_surface.c | 10 ++++++---- 5 files changed, 29 insertions(+), 11 deletions(-) commit b210c00c30c5e191be230d9675bb00ce5cf57393 Author: Carl Worth Date: Thu Feb 24 08:07:39 2005 +0000 Remove many TODO items that have now been absorbed by the API shakeup. Remove comparison with PostScript as there's nothing interesting there left unimplemented, (and cairo is already establishing its own conventions in naming and behavior that deviate from PostScript). ChangeLog | 6 ++ TODO | 167 ------------------------------------------------------------- 2 files changed, 6 insertions(+), 167 deletions(-) commit 77826a97565d48073b5725ca60b25b66bed73ab5 Author: Carl Worth Date: Thu Feb 24 07:39:20 2005 +0000 Fix typo (pointed out by Mike Emmel) ChangeLog | 4 ++++ src/cairoint.h | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 748115a88d9b058837e7a2bc690e2c98fc2253bc Author: Carl Worth Date: Wed Feb 23 14:56:55 2005 +0000 Add entries from API Shakeup. ChangeLog | 4 ++++ TODO | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-) commit dcfb0d8a2b9eeffd52ca42635c6cf12a0705bd66 Author: Carl Worth Date: Tue Feb 22 11:35:03 2005 +0000 Switch from broken cworth@isi.edu address to canonical cworth@cworth.org address. ChangeLog | 37 +++++++++++++++++++++++++++++++++++++ README | 2 +- src/cairo-color.c | 2 +- src/cairo-features.h.in | 2 +- src/cairo-fixed.c | 2 +- src/cairo-font.c | 2 +- src/cairo-glitz.h | 2 +- src/cairo-gstate.c | 2 +- src/cairo-hull.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-matrix.c | 2 +- src/cairo-path-bounds.c | 2 +- src/cairo-path-fill.c | 2 +- src/cairo-path-stroke.c | 2 +- src/cairo-path.c | 2 +- src/cairo-pdf.h | 2 +- src/cairo-pen.c | 2 +- src/cairo-png.h | 2 +- src/cairo-polygon.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-ps.h | 2 +- src/cairo-quartz.h | 2 +- src/cairo-slope.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-traps.c | 2 +- src/cairo-xcb-surface.c | 2 +- src/cairo-xcb.h | 2 +- src/cairo-xlib-surface.c | 2 +- src/cairo-xlib.h | 2 +- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairo_color.c | 2 +- src/cairo_fixed.c | 2 +- src/cairo_font.c | 2 +- src/cairo_gstate.c | 2 +- src/cairo_hull.c | 2 +- src/cairo_image_surface.c | 2 +- src/cairo_matrix.c | 2 +- src/cairo_path.c | 2 +- src/cairo_path_bounds.c | 2 +- src/cairo_path_fill.c | 2 +- src/cairo_path_stroke.c | 2 +- src/cairo_pen.c | 2 +- src/cairo_png_surface.c | 2 +- src/cairo_polygon.c | 2 +- src/cairo_ps_surface.c | 2 +- src/cairo_slope.c | 2 +- src/cairo_spline.c | 2 +- src/cairo_surface.c | 2 +- src/cairo_traps.c | 2 +- src/cairo_xcb_surface.c | 2 +- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 4 ++-- 54 files changed, 91 insertions(+), 54 deletions(-) commit 604e333be2567e8877bec71d46107897717a1be6 Author: Carl Worth Date: Tue Feb 22 11:32:02 2005 +0000 Convert to utf-8 encoding. ChangeLog | 6 ++++++ src/cairo-atsui-font.c | 2 +- src/cairo-atsui.h | 2 +- src/cairo_atsui_font.c | 2 +- test/write-png.c | 4 ++-- test/write_png.c | 4 ++-- 6 files changed, 13 insertions(+), 7 deletions(-) commit 6b537f24660f180ba7acd6865ca11170711c3eff Author: Carl Worth Date: Tue Feb 22 10:43:26 2005 +0000 Temporarily disable XCB backend by default. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 272df99aabee9d678c98e5f31f2b9f0ede7778e3 Author: Carl Worth Date: Mon Feb 21 13:29:22 2005 +0000 Add only-just-better-than-ASCII-art diagram showing all macros used in locating sub-pixel sample rows/columns. Add missing protective parentheses around macro parameter usage. pixman/ChangeLog | 8 ++++++ pixman/src/renderedge.h | 61 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 58 insertions(+), 11 deletions(-) commit 6d70b286f5ff86a3855636de7165b30a5a45968c Author: Carl Worth Date: Mon Feb 21 12:57:27 2005 +0000 Move definition of __inline for non-gcc from ic.c to icint.h so it applies to more code in the implementation. pixman/ChangeLog | 6 ++++++ pixman/src/ic.c | 5 ----- pixman/src/icint.h | 6 ++++-- 3 files changed, 10 insertions(+), 7 deletions(-) commit 30a02c8e172a9caece7526fbe87b060fc74e5041 Author: Carl Worth Date: Mon Feb 21 08:22:47 2005 +0000 Revert accidental commit. ChangeLog | 5 +++++ src/cairo-pattern.c | 6 ++---- src/cairo.h | 10 +--------- src/cairo_pattern.c | 6 ++---- 4 files changed, 10 insertions(+), 17 deletions(-) commit c8a98b109a5f7b02455aaf717066757a13652eb8 Author: Carl Worth Date: Mon Feb 21 08:17:42 2005 +0000 Fix y offset to use dst_y instead of dst_x, (caught by David Reveman). ChangeLog | 5 +++++ src/cairo-pattern.c | 6 ++++-- src/cairo-surface.c | 2 +- src/cairo.h | 11 ++++++++++- src/cairo_pattern.c | 6 ++++-- src/cairo_surface.c | 2 +- 6 files changed, 25 insertions(+), 7 deletions(-) commit 81fd7e53e3e053f8f3fdc9a528cce9e01c4e5c68 Author: Owen Taylor Date: Sun Feb 20 18:19:10 2005 +0000 Fix line endings (reported by Hans Breuer) ChangeLog | 5 ++ src/cairo-win32.h | 142 ++++++++++++++++++++++++++-------------------------- 2 files changed, 76 insertions(+), 71 deletions(-) commit d106bb2f3cbd5c498b6964c86e5bca4cfa74936c Author: Kristian Høgsberg Date: Wed Feb 16 09:34:47 2005 +0000 Patches from Mike Owens : Free rows if we fail early in this function. Clean up path if we run out of memory. ChangeLog | 10 ++++++++++ src/cairo-path.c | 2 ++ src/cairo_path.c | 2 ++ src/cairo_png_surface.c | 18 ++++++++++-------- 4 files changed, 24 insertions(+), 8 deletions(-) commit 8c8ced257379bdca4c37b312cb353e4f592f8cd2 Author: Carl Worth Date: Tue Feb 15 15:07:25 2005 +0000 Added testsvg script test/testsvg | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 51 insertions(+), 0 deletions(-) commit 9597c0b791d68d258618773996da67cf8f07113f Author: Kristian Høgsberg Date: Sun Feb 13 20:36:28 2005 +0000 Initialize array element size correctly. ChangeLog | 6 ++++++ src/cairo-pdf-surface.c | 2 +- src/cairo_pdf_surface.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 0502a5a63c3feea954a2d45441d56b7546a50554 Author: Kristian Høgsberg Date: Sun Feb 13 12:41:42 2005 +0000 Patches from Owen Taylor: Emit text as octal escapes, to avoid problems with \, \r, ), etc. (_cairo_pdf_document_write_fonts): Change /Flags to be 4 (symbolic), not 32 (non-symbolic), otherwise acroread gets confuse. (cairo_pdf_ft_font_write_cmap_table): Use a 1,0 cmap subtable, not a 0,0, to conform to the PDF spec. ChangeLog | 12 ++++++++++++ src/cairo-pdf-surface.c | 8 ++++---- src/cairo_pdf_surface.c | 8 ++++---- 3 files changed, 20 insertions(+), 8 deletions(-) commit 2cd01deb4d3ea3a722ef4d10839eef8577b81e5c Author: Carl Worth Date: Sun Feb 13 11:57:52 2005 +0000 Use LC_NUMERIC=C so that decimal separator works in version checks. ChangeLog | 5 +++++ autogen.sh | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit d4ae84f39764dc2ced9d6807dbb5fe7f23c6eebe Author: Owen Taylor Date: Sat Feb 12 18:23:04 2005 +0000 Fix x2/x1 typo. ChangeLog | 5 +++++ src/cairo-gstate.c | 2 +- src/cairo_gstate.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit f3f63f39245bade5d70d546bf8acfe1bd0a6f7f8 Author: Carl Worth Date: Sat Feb 12 13:01:39 2005 +0000 Return all-zero extents if string is NULL. ChangeLog | 5 +++++ src/cairo.c | 10 ++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) commit b33f37ff040dbc3c7e7b9dcffdd1cccca1a11b20 Author: Kristian Høgsberg Date: Sat Feb 12 12:59:53 2005 +0000 Make clipping fast path fast. When we have a clipping region set, intersect it against the drawing extents to determine the bounding box for the visible drawing. ChangeLog | 8 ++++++++ src/cairo-gstate.c | 34 ++++++++++++++++++++++++++++++++++ src/cairo.c | 2 +- src/cairo_gstate.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 1 deletions(-) commit 063ba1f51df750cc3d9e340bd355cc1cc41f88df Author: Carl Worth Date: Thu Feb 10 07:46:46 2005 +0000 Add bug for cairo_show_surface under non-default CTM. AUTHORS | 2 +- BUGS | 16 ++++++++++++++++ ChangeLog | 4 ++++ 3 files changed, 21 insertions(+), 1 deletions(-) commit 0c07ddf729f0b4d2625dec90fbec6321f4908424 Author: Kristian Høgsberg Date: Mon Feb 7 10:15:46 2005 +0000 Argh, committed conflict marker in ChangeLog - fixed. ChangeLog | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 7296349eaa23f2e697e5553d7a1fd0b818aad47f Author: Kristian Høgsberg Date: Mon Feb 7 09:38:43 2005 +0000 New test case which exposes off-by-one rotation error in pixman. ChangeLog | 6 +++ test/Makefile.am | 7 +++- test/pixman-rotate-ref.png | Bin 0 -> 260 bytes test/pixman-rotate.c | 78 ++++++++++++++++++++++++++++++++++++++++++++ test/pixman_rotate-ref.png | Bin 0 -> 260 bytes test/pixman_rotate.c | 78 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 167 insertions(+), 2 deletions(-) commit 67ffc273eff916f9b1a2f4cc308683c0e4c0660a Author: Owen Taylor Date: Sun Feb 6 15:07:17 2005 +0000 src/cairo_gstate.c src/cairo.c: Allow cairo_set_font (cr, NULL) to unset the current font and return the cairo_t to the the "use the font from cairo_select_font() state". ChangeLog | 6 ++++++ src/cairo-gstate.c | 11 +++++++---- src/cairo.c | 2 +- src/cairo_gstate.c | 11 +++++++---- 4 files changed, 21 insertions(+), 9 deletions(-) commit b93f42fae1080590fbf7050ba810155d37664843 Author: Owen Taylor Date: Sun Feb 6 12:00:28 2005 +0000 Return the right status. (Reported by Hans Breuer.) ChangeLog | 5 +++++ src/cairo-win32-font.c | 2 +- src/cairo_win32_font.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit 991ac7bacc758698052ea4ac6ada449c5cf6ab45 Author: Owen Taylor Date: Sun Feb 6 11:51:07 2005 +0000 Add AC_PREREQ(2.54) to help the Debian auto-guess-which-configure-version hack. pixman/ChangeLog | 5 +++++ pixman/configure.in | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-) commit 092c5ca5583512c9689397f355d3d0b7a09c882e Author: Owen Taylor Date: Sat Feb 5 21:42:47 2005 +0000 Free glyph_indices, not glyphs. (Reported by Hans Breuer.) ChangeLog | 5 +++++ src/cairo-win32-font.c | 4 ++-- src/cairo_win32_font.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) commit eb01786729b3d56f47ddf593fd5cc826d5c75064 Author: Carl Worth Date: Sat Feb 5 17:17:19 2005 +0000 Add message stating why glitz backend is disabled. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit b0ee983a7def6752d5bff7481c4af487db757b36 Author: Owen Taylor Date: Sat Feb 5 17:01:29 2005 +0000 Don't free *glyphs when succeeding! (Reported by Øyvind KolÃ¥s) Temporarily disable glitz by default. ChangeLog | 7 +++++++ configure.in | 2 +- src/cairo-ft-font.c | 2 -- src/cairo_ft_font.c | 2 -- 4 files changed, 8 insertions(+), 5 deletions(-) commit 5707a69bfc9ce5525b2177f68c4e810c84b2f73f Author: Carl Worth Date: Fri Feb 4 08:04:36 2005 +0000 Generate an error during make install if old cairo headers are found in includedir, (rather than includedir/cairo where the new ones are going). ChangeLog | 6 ++++++ src/Makefile.am | 10 ++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit 56d84bb85677df147063f2bc8eef583a6bdd5cae Author: Owen Taylor Date: Thu Feb 3 15:24:35 2005 +0000 Fix missing cairo_ft_font_unlock_face(). Fix problem when no entry could be found. ChangeLog | 8 ++++++ src/cairo-cache.c | 2 +- src/cairo-ft-font.c | 64 ++++++++++++++++++++++++++++++-------------------- src/cairo-hash.c | 2 +- src/cairo_cache.c | 2 +- src/cairo_ft_font.c | 64 ++++++++++++++++++++++++++++++-------------------- 6 files changed, 87 insertions(+), 55 deletions(-) commit 587dff8a7191e7e2e4c6778b58af5dc16e39bf3f Author: Carl Worth Date: Thu Feb 3 06:19:51 2005 +0000 Commit old change to ChangeLog that got missed before: test/imagediff.c Add new testsvg script and accompanying imagediff program, (for interim SVG-based test suites while we wait for the standard cairo test suite to mature). Split buffer_diff out into its own file for the purpose of imagediff. ChangeLog | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit 913e39b6eef18a59c21b07ff92e4c5d078335ded Author: Owen Taylor Date: Wed Feb 2 23:14:55 2005 +0000 src/cairo_font.c src/cairo.h doc/public/cairo-sections.txt: Add cairo_font_extents(). src/cairo_win32_font.c src/cairo-win32.h doc/public/cairo-sections.txt: Rename cairo_font_create_for_logfont() into cairo_font_create_for_logfontw() to make clear what it takes. Don't add cairo_font_create_for_logfonta() for now. ChangeLog | 12 ++++++++++- doc/public/cairo-sections.txt | 3 +- src/cairo-font.c | 44 +++++++++++++++++++++++++++++++++++++++++ src/cairo-gstate.c | 26 +++-------------------- src/cairo-win32-font.c | 9 ++++--- src/cairo-win32.h | 4 +- src/cairo.h | 29 +++++++++++++++----------- src/cairo_font.c | 44 +++++++++++++++++++++++++++++++++++++++++ src/cairo_gstate.c | 26 +++-------------------- src/cairo_win32_font.c | 9 ++++--- 10 files changed, 138 insertions(+), 68 deletions(-) commit 749a8c1e7b387845beeae9c10eac7c6b041eaff7 Author: Owen Taylor Date: Wed Feb 2 19:52:22 2005 +0000 src/cairo_win32_font.c doc/public/cairo-sections.txt doc/public/Makefile.am: Add windows functions to the docs. ChangeLog | 15 +++++++++++++++ doc/public/Makefile.am | 3 ++- doc/public/cairo-sections.txt | 11 +++++++++++ src/cairo-win32-font.c | 2 +- src/cairo_win32_font.c | 2 +- 5 files changed, 30 insertions(+), 3 deletions(-) commit 72a44202343031762d761acce55d75881356448f Author: Owen Taylor Date: Wed Feb 2 18:57:40 2005 +0000 Add some functions to select the font into a device context with the intention to enable callers to use, e.g, Uniscribe. Use 'hdc' not 'dc' for param/variable name. Return immediately if height or width is 0. ChangeLog | 13 ++ src/cairo-win32-font.c | 331 +++++++++++++++++++++++++++++++-------------- src/cairo-win32-surface.c | 8 +- src/cairo-win32.h | 10 ++ src/cairo_win32_font.c | 331 +++++++++++++++++++++++++++++++-------------- src/cairo_win32_surface.c | 8 +- 6 files changed, 483 insertions(+), 218 deletions(-) commit 199c41dafee1559570c250d22a97dc1667d657f3 Author: Owen Taylor Date: Tue Feb 1 21:45:51 2005 +0000 Mostly-functioning Win32 font backend; no glyph paths yet. Turn on building of the Win32 font backend. src/cairo-win32-private.h src/Makefile.am: Private header for the Win32 backend. src/cairo-win32-private.h src/cairo_win32_surface.c: Internally export _cairo_win32_print_gdi_error() for use in the font code. src/cairo-win32-private.h src/cairo_win32_surface.c: Add _cairo_win32_surface_create_dib to create a DIB surface. src/cairo-win32-private.h src/cairo_win32_surface.c: Add _cairo_surface_is_win32() Check for vasnprintf. Add a simple fixed-buffer size snprintf fallback in the absence of vasnprintf. ChangeLog | 25 ++ configure.in | 4 +- src/Makefile.am | 2 +- src/cairo-win32-font.c | 806 ++++++++++++++++++++++++++++++--------------- src/cairo-win32-private.h | 77 +++++ src/cairo-win32-surface.c | 97 ++++--- src/cairo-win32.h | 2 +- src/cairo_win32_font.c | 806 ++++++++++++++++++++++++++++++--------------- src/cairo_win32_surface.c | 97 ++++--- test/cairo-test.c | 29 ++- test/cairo_test.c | 29 ++- 11 files changed, 1343 insertions(+), 631 deletions(-) commit 211d115f1835e1f724709a2b8b55ab203326fa9a Author: Kristian Høgsberg Date: Tue Feb 1 20:47:43 2005 +0000 Pretend we support compositing of solid color or gradient patterns to prevent image fallback. (emit_pattern): New function, code factored out from _cairo_pdf_surface_composite_trapezoids. (_cairo_pdf_surface_show_glyphs): Use emit_pattern here so we get pattern support for text. Fix typo. ChangeLog | 12 ++++ src/cairo-ft-font.c | 2 +- src/cairo-pdf-surface.c | 155 ++++++++++++++++++++++++++--------------------- src/cairo_ft_font.c | 2 +- src/cairo_pdf_surface.c | 155 ++++++++++++++++++++++++++--------------------- 5 files changed, 186 insertions(+), 140 deletions(-) commit 32ada34ddb85038f4098a301f57113b19e87ed14 Author: Owen Taylor Date: Tue Feb 1 16:29:17 2005 +0000 Commit earlier missed new file src/cairo_unicode.c src/cairoint.h src/Makefile.am: Add _cairo_utf8_to_utf16(), _cairo_utf8_to_ucs4() based on code from GLib. src/cairo-unicode.c | 340 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_unicode.c | 340 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 680 insertions(+), 0 deletions(-) commit 711d7965c87550901653bb8713b4604c441cb5c3 Author: Owen Taylor Date: Tue Feb 1 15:06:33 2005 +0000 src/cairo_unicode.c src/cairoint.h src/Makefile.am: Add _cairo_utf8_to_utf16(), _cairo_utf8_to_ucs4() based on code from GLib. Add CAIRO_STATUS_INVALID_STRING Use _cairo_utf8_to_ucs4(). Add cairo_bool_t Add TRUE/FALSE definitions. src/cairo.[ch] src/cairoint.h src/cairo_gstate.c: switch cairo_in_stroke/cairo_in_fill and all the functions used to implement them over to cairo_bool_t. ChangeLog | 17 + doc/public/cairo-sections.txt | 1 + doc/public/tmpl/cairo.sgml | 7 + doc/reference/.cvsignore | 20 - src/Makefile.am | 1 + src/cairo-ft-font.c | 41 +-- src/cairo-gstate.c | 4 +- src/cairo-traps.c | 18 +- src/cairo-win32-font.c | 787 +++++++++++++++++++++++++++++++++-------- src/cairo-win32-surface.c | 83 +++-- src/cairo-win32.h | 20 +- src/cairo.c | 4 +- src/cairo.h | 23 +- src/cairo_ft_font.c | 41 +-- src/cairo_gstate.c | 4 +- src/cairo_traps.c | 18 +- src/cairo_win32_font.c | 787 +++++++++++++++++++++++++++++++++-------- src/cairo_win32_surface.c | 83 +++-- src/cairoint.h | 26 ++- 19 files changed, 1469 insertions(+), 516 deletions(-) commit f4ccbb4615841c509e6ada7c12f469634732c4e4 Author: Owen Taylor Date: Mon Jan 31 16:41:06 2005 +0000 Forgotten commit: src/cairo_gdip_font.cpp src/cairo_gdip_surface.cpp: Remove remnants of a GDI+ based backend. src/cairo_gdip_font.cpp | 665 ---------------------------------------- src/cairo_gdip_surface.cpp | 727 -------------------------------------------- 2 files changed, 0 insertions(+), 1392 deletions(-) commit 86c8755e59a7f2000fc8a44811d06afae2d0dbb7 Author: Owen Taylor Date: Mon Jan 31 16:11:37 2005 +0000 configure.in src/cairo-features.h.in: Add a check for the Windows platform and --enable-win32. Also add some (currently always off) stubs for native Win32 fonts. Make building the PDF backend conditional on having FreeType. src/Makefile.am src/cairo_win32_surface.c src/cairo_win32_font.c src/cairo-win32.h: Add a Win32 backend using GDI and software fallbacks Font code is not yet there yet, but it works with the fontconfig backend. src/cairo_gdip_font.cpp src/cairo_gdip_surface.cpp: Remove remnants of a GDI+ based backend. Prefer platform-specific font backends to the fontconfig backend. ChangeLog | 20 + configure.in | 117 +++++-- src/Makefile.am | 12 + src/cairo-features.h.in | 4 + src/cairo-surface.c | 2 +- src/cairo-win32-font.c | 380 ++++++++++++++++++ src/cairo-win32-surface.c | 932 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-win32.h | 61 +++ src/cairo_surface.c | 2 +- src/cairo_win32_font.c | 380 ++++++++++++++++++ src/cairo_win32_surface.c | 932 +++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 22 +- 12 files changed, 2827 insertions(+), 37 deletions(-) commit 26148a1d15b710b8f2ce850f8704bf44b0c3d484 Author: Owen Taylor Date: Mon Jan 31 08:50:22 2005 +0000 src/cairoint.h src/cairo_image_surface.c src/cairo_pdf_surface.c src/cairo_png_surface.c src/cairo_surface.c src/cairo_xlib_surface.c: Replace the get_image()/set_image() backend operations with a more specific {acquire,release}_{source,dest}_image() and clone_similar(). src/cairoint.h src/cairo_pattern.c: Replace _cairo_pattern_get_surface() with a _cairo_pattern_begin_draw()/_cairo_pattern_end_draw() pair. Save the format for which an image is created so we can access it later. (Needed for the _cairo_xlib_surface_clone_similar()) src/cairoint.h src/cairo_image_surface.c: Add _cairo_surface_is_image(). Add CAIRO_OK(status) to check for CAIRO_STATUS_SUCCESS. In the absence of of RENDER, make cairo_xlib_surface_create_similar() return an image surface. Don't try to use RENDER to composite glyphs in the absence of the RENDER extension. ChangeLog | 31 ++++ src/cairo-image-surface.c | 160 +++++++++++++----- src/cairo-pattern.c | 358 +++++++++++++++++++++++++---------------- src/cairo-pdf-surface.c | 79 +++++++-- src/cairo-ps-surface.c | 59 +++++-- src/cairo-surface.c | 402 +++++++++++++++++++++++++++++++++++++++------ src/cairo-xlib-surface.c | 332 ++++++++++++++++++++++++------------- src/cairo_image_surface.c | 160 +++++++++++++----- src/cairo_pattern.c | 358 +++++++++++++++++++++++++---------------- src/cairo_pdf_surface.c | 79 +++++++-- src/cairo_png_surface.c | 57 +++++-- src/cairo_ps_surface.c | 59 +++++-- src/cairo_surface.c | 402 +++++++++++++++++++++++++++++++++++++++------ src/cairo_xlib_surface.c | 332 ++++++++++++++++++++++++------------- src/cairoint.h | 99 +++++++++--- 15 files changed, 2182 insertions(+), 785 deletions(-) commit 608a52ff9390f98a8e5269e6362f4ad8d07ec2c5 Author: Owen Taylor Date: Sun Jan 30 11:37:48 2005 +0000 Update composite-over-white code to use a pattern, not a surface. (to match _cairo_surface_composite API change.) ChangeLog | 6 ++++++ src/cairo-ps-surface.c | 23 ++++++----------------- src/cairo_ps_surface.c | 23 ++++++----------------- 3 files changed, 18 insertions(+), 34 deletions(-) commit dca785faafb4baf2a5626e5191b3c3739b0b42b7 Author: Owen Taylor Date: Sun Jan 30 11:28:14 2005 +0000 Fixes from David Reveman: Don't save to surface part of the union when the pattern isn't a surface pattern. (_cairo_pattern_get_surface): Create the new surface at the width and height of the source. Add cairo-ft-private.h ChangeLog | 12 +++++++++++ src/Makefile.am | 2 +- src/cairo-pattern.c | 52 ++++++++++++++++++++++++-------------------------- src/cairo_pattern.c | 52 ++++++++++++++++++++++++-------------------------- 4 files changed, 63 insertions(+), 55 deletions(-) commit a24f2f909e29dd3ad1c7241a9d3f5c6580ac6a3e Author: Kristian Høgsberg Date: Fri Jan 28 12:27:23 2005 +0000 Update prototype to eliminate warning. Remember to reference surfaces when copying patterns. Don't call _gstate_create_pattern for internally created patterns. (_cairo_gstate_show_surface): Don't change the surface matrix here, it's done later when we set it up as a pattern. Correct clip_twice-ref.png filename. Add these. Fix broken intersection code. ChangeLog | 22 ++++++++++++++++++++ src/cairo-gstate.c | 51 ++++++++++------------------------------------ src/cairo-pattern.c | 4 +++ src/cairo_gstate.c | 51 ++++++++++------------------------------------ src/cairo_pattern.c | 4 +++ src/cairo_png_surface.c | 2 +- src/cairoint.h | 3 ++ test/Makefile.am | 2 +- 8 files changed, 57 insertions(+), 82 deletions(-) commit 4c329eecb9d956c2553376d76308bdff032216a8 Author: Kristian Høgsberg Date: Thu Jan 27 21:14:04 2005 +0000 Make sure we always return a surface similar to dst in the gradient case. ChangeLog | 5 ++++- src/cairo-pattern.c | 31 ++++++++++++++++++++++++------- src/cairo_pattern.c | 31 ++++++++++++++++++++++++------- src/cairoint.h | 9 --------- 4 files changed, 52 insertions(+), 24 deletions(-) commit 79c8b29c3be5179f52db8a726f138137d63ae765 Author: Kristian Høgsberg Date: Thu Jan 27 19:57:31 2005 +0000 Fold _cairo_pattern_get_image into _cairo_pattern_get_surface and make sure we always return a surface of the same type as dest. Use _cairo_pattern_get_surface instead of _cairo_pattern_get_image. Remove use of _cairo_xlib_surface_clone_similar since _cairo_pattern_get_surface always gives us an xlib surface for the pattern. Clean up error handling code in _cairo_xlib_surface_show_glyphs. Add missing cairo_surface_destroy and tidy up offset calculations as suggested by Owen. Simplify code for computing the extents of clipping area, by introducing a couple of cairo_rectangle_t functions. ChangeLog | 20 +++++++ src/cairo-glitz-surface.c | 10 ++-- src/cairo-image-surface.c | 31 +++++++---- src/cairo-pattern.c | 102 +++++++++++++------------------------ src/cairo-xlib-surface.c | 122 +++++++++++--------------------------------- src/cairo_glitz_surface.c | 10 ++-- src/cairo_image_surface.c | 31 +++++++---- src/cairo_pattern.c | 102 +++++++++++++------------------------ src/cairo_xlib_surface.c | 122 +++++++++++--------------------------------- 9 files changed, 206 insertions(+), 344 deletions(-) commit 8e90ae2f6527e39fca55e5c3e1472e067cdfe159 Author: Kristian Høgsberg Date: Thu Jan 27 17:21:13 2005 +0000 Simplify code for computing the extents of clipping area, by introducing a couple of cairo_rectangle_t functions. ChangeLog | 8 ++ src/cairo-gstate.c | 302 ++++++++++++++++++++-------------------------------- src/cairo_gstate.c | 302 ++++++++++++++++++++-------------------------------- src/cairoint.h | 5 +- 4 files changed, 243 insertions(+), 374 deletions(-) commit e0de000336976ddd69243ae775cb40946b730c5b Author: Owen Taylor Date: Thu Jan 27 15:46:16 2005 +0000 src/cairo.[ch] src/cairo_font.c src/cairo_ft_font.c src/cairo_ps_surface.c src/cairo_xlib_surface.c: Move docs from docs/reference, with a fair bit of addition and rewriting. Remove old-format docs. Add a AC_PREREQ(2.54) (Jason Dorje Short) ChangeLog | 11 + configure.in | 2 + doc/public/tmpl/cairo-matrix.sgml | 2 +- doc/reference/ChangeLog | 16 -- doc/reference/README | 11 - doc/reference/crossreference.rb | 30 --- doc/reference/doc.xml | 223 -------------------- doc/reference/xml/cairo_arc.xml | 40 ---- doc/reference/xml/cairo_arc_negative.xml | 40 ---- doc/reference/xml/cairo_clip.xml | 35 --- doc/reference/xml/cairo_close_path.xml | 35 --- doc/reference/xml/cairo_copy.xml | 54 ----- doc/reference/xml/cairo_create.xml | 34 --- doc/reference/xml/cairo_current_alpha.xml | 35 --- doc/reference/xml/cairo_current_fill_rule.xml | 35 --- doc/reference/xml/cairo_current_font.xml | 37 ---- doc/reference/xml/cairo_current_font_extents.xml | 40 ---- doc/reference/xml/cairo_current_line_cap.xml | 35 --- doc/reference/xml/cairo_current_line_join.xml | 35 --- doc/reference/xml/cairo_current_line_width.xml | 35 --- doc/reference/xml/cairo_current_matrix.xml | 41 ---- doc/reference/xml/cairo_current_miter_limit.xml | 35 --- doc/reference/xml/cairo_current_operator.xml | 35 --- doc/reference/xml/cairo_current_point.xml | 47 ---- doc/reference/xml/cairo_current_rgb_color.xml | 53 ----- doc/reference/xml/cairo_current_target_surface.xml | 34 --- doc/reference/xml/cairo_current_tolerance.xml | 35 --- doc/reference/xml/cairo_curve_to.xml | 70 ------ doc/reference/xml/cairo_default_matrix.xml | 35 --- doc/reference/xml/cairo_destroy.xml | 38 ---- doc/reference/xml/cairo_fill.xml | 35 --- doc/reference/xml/cairo_fill_rule_t.xml | 40 ---- doc/reference/xml/cairo_font_glyph_extents.xml | 72 ------- doc/reference/xml/cairo_font_t.xml | 25 --- doc/reference/xml/cairo_format_t.xml | 52 ----- doc/reference/xml/cairo_ft_font_create.xml | 59 ----- .../xml/cairo_ft_font_create_for_ft_face.xml | 69 ------ doc/reference/xml/cairo_ft_font_get_pattern.xml | 49 ----- doc/reference/xml/cairo_ft_font_lock_face.xml | 61 ------ doc/reference/xml/cairo_ft_font_unlock_face.xml | 44 ---- doc/reference/xml/cairo_glyph_t.xml | 62 ------ doc/reference/xml/cairo_hit.xml | 36 --- doc/reference/xml/cairo_identity_matrix.xml | 35 --- doc/reference/xml/cairo_in_fill.xml | 34 --- doc/reference/xml/cairo_in_stroke.xml | 34 --- .../xml/cairo_inverse_transform_distance.xml | 47 ---- .../xml/cairo_inverse_transform_point.xml | 47 ---- doc/reference/xml/cairo_line_cap_t.xml | 43 ---- doc/reference/xml/cairo_line_to.xml | 47 ---- doc/reference/xml/cairo_matrix_copy.xml | 41 ---- doc/reference/xml/cairo_matrix_create.xml | 34 --- doc/reference/xml/cairo_matrix_destroy.xml | 35 --- doc/reference/xml/cairo_matrix_invert.xml | 35 --- doc/reference/xml/cairo_matrix_multiply.xml | 47 ---- doc/reference/xml/cairo_matrix_rotate.xml | 41 ---- doc/reference/xml/cairo_matrix_scale.xml | 47 ---- doc/reference/xml/cairo_matrix_set_identity.xml | 35 --- doc/reference/xml/cairo_matrix_t.xml | 33 --- .../xml/cairo_matrix_transform_distance.xml | 47 ---- doc/reference/xml/cairo_matrix_transform_point.xml | 47 ---- doc/reference/xml/cairo_matrix_translate.xml | 47 ---- doc/reference/xml/cairo_move_to.xml | 47 ---- doc/reference/xml/cairo_new_path.xml | 35 --- doc/reference/xml/cairo_operator_t.xml | 47 ---- doc/reference/xml/cairo_pop_group.xml | 35 --- doc/reference/xml/cairo_push_group.xml | 35 --- doc/reference/xml/cairo_rectangle.xml | 47 ---- doc/reference/xml/cairo_reference.xml | 35 --- doc/reference/xml/cairo_rel_curve_to.xml | 70 ------ doc/reference/xml/cairo_rel_line_to.xml | 47 ---- doc/reference/xml/cairo_rel_move_to.xml | 47 ---- doc/reference/xml/cairo_restore.xml | 36 --- doc/reference/xml/cairo_rotate.xml | 41 ---- doc/reference/xml/cairo_save.xml | 36 --- doc/reference/xml/cairo_scale.xml | 47 ---- doc/reference/xml/cairo_scale_font.xml | 41 ---- doc/reference/xml/cairo_select_font.xml | 53 ----- doc/reference/xml/cairo_set_alpha.xml | 42 ---- doc/reference/xml/cairo_set_dash.xml | 53 ----- doc/reference/xml/cairo_set_fill_rule.xml | 41 ---- doc/reference/xml/cairo_set_font.xml | 52 ----- doc/reference/xml/cairo_set_line_cap.xml | 41 ---- doc/reference/xml/cairo_set_line_join.xml | 41 ---- doc/reference/xml/cairo_set_line_width.xml | 41 ---- doc/reference/xml/cairo_set_miter_limit.xml | 41 ---- doc/reference/xml/cairo_set_operator.xml | 42 ---- doc/reference/xml/cairo_set_pattern.xml | 41 ---- doc/reference/xml/cairo_set_rgb_color.xml | 54 ----- doc/reference/xml/cairo_set_target_drawable.xml | 45 ---- doc/reference/xml/cairo_set_target_image.xml | 58 ----- doc/reference/xml/cairo_set_target_png.xml | 51 ----- doc/reference/xml/cairo_set_target_ps.xml | 52 ----- doc/reference/xml/cairo_set_target_surface.xml | 41 ---- doc/reference/xml/cairo_set_target_xcb.xml | 58 ----- doc/reference/xml/cairo_set_tolerance.xml | 41 ---- doc/reference/xml/cairo_show_glyphs.xml | 46 ---- doc/reference/xml/cairo_show_text.xml | 41 ---- doc/reference/xml/cairo_status.xml | 35 --- doc/reference/xml/cairo_status_string.xml | 35 --- doc/reference/xml/cairo_stroke.xml | 35 --- doc/reference/xml/cairo_stroke_path.xml | 35 --- doc/reference/xml/cairo_surface_clip_restore.xml | 35 --- doc/reference/xml/cairo_surface_destroy.xml | 35 --- doc/reference/xml/cairo_surface_get_matrix.xml | 41 ---- doc/reference/xml/cairo_surface_reference.xml | 35 --- doc/reference/xml/cairo_surface_set_filter.xml | 41 ---- doc/reference/xml/cairo_surface_set_matrix.xml | 41 ---- doc/reference/xml/cairo_surface_set_repeat.xml | 41 ---- doc/reference/xml/cairo_surface_t.xml | 17 -- doc/reference/xml/cairo_t.xml | 23 -- doc/reference/xml/cairo_text_extents.xml | 47 ---- doc/reference/xml/cairo_text_extents_t.xml | 76 ------- doc/reference/xml/cairo_transform_distance.xml | 47 ---- doc/reference/xml/cairo_transform_font.xml | 41 ---- doc/reference/xml/cairo_transform_point.xml | 47 ---- doc/reference/xml/cairo_translate.xml | 47 ---- doc/reference/xml/skeleton.xml | 30 --- src/cairo-font.c | 13 ++ src/cairo-ft-font.c | 107 ++++++++++ src/cairo-ps-surface.c | 16 ++ src/cairo-xlib-surface.c | 16 ++ src/cairo.c | 162 ++++++++++++++ src/cairo.h | 126 +++++++++++- src/cairo_font.c | 13 ++ src/cairo_ft_font.c | 107 ++++++++++ src/cairo_ps_surface.c | 16 ++ src/cairo_xlib_surface.c | 16 ++ 127 files changed, 601 insertions(+), 4984 deletions(-) commit 56c96d014047c8759dcec6777416466f87aba354 Author: Kristian Høgsberg Date: Thu Jan 27 12:28:17 2005 +0000 Update these two once again, this time generated using libpixman-0.1.3 without leaky circles. ChangeLog | 7 +++++++ test/clip-twice-ref.png | Bin 793 -> 751 bytes test/clip_twice-ref.png | Bin 793 -> 751 bytes test/coverage-ref.png | Bin 44373 -> 44331 bytes 4 files changed, 7 insertions(+), 0 deletions(-) commit 73cdfa0b2ba3222958483245a48daf483f3c74f6 Author: Kristian Høgsberg Date: Thu Jan 27 11:59:55 2005 +0000 [ Grr... previous commit from test/, missed the ChangLog changes ] Fix missing rounding in these two functions. Update these to versions with properly rounded alpha values. Move clip_twice out of XFAIL now that rounding works. Add new test cases. ChangeLog | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) commit 81d03b3048b238099ae29a4baba84d5870353540 Author: Kristian Høgsberg Date: Thu Jan 27 11:40:29 2005 +0000 Fix missing rounding in these two functions. Update these to versions with properly rounded alpha values. Move clip_twice out of XFAIL now that rounding works. Add new test cases. test/.cvsignore | 2 ++ test/Makefile.am | 3 +-- test/clip-twice-ref.png | Bin 869 -> 793 bytes test/clip_twice-ref.png | Bin 869 -> 793 bytes test/coverage-ref.png | Bin 44332 -> 44373 bytes test/read-png.c | 6 +++--- test/read_png.c | 6 +++--- test/write-png.c | 6 +++--- test/write_png.c | 6 +++--- 9 files changed, 15 insertions(+), 14 deletions(-) commit 0f5b7d82deb8941705b703ef27d442ca7627bf41 Author: Owen Taylor Date: Thu Jan 27 11:35:25 2005 +0000 configure.in Makefile.am docs/Makefile.am docs/public/*: Add framework for doing docs via gtk-doc. src/cairo.[ch] src/cairo-matrix.c: Add some inline docs for arcs and matrices. gtk-doc.m4 acinclude.m4: Check in files from gtk-doc to make the dependency on gtk-doc optional. Add --enable-gtk-doc to the default args. ChangeLog | 14 + Makefile.am | 2 +- acinclude.m4 | 53 ++ autogen.sh | 2 +- configure.in | 5 + doc/.cvsignore | 2 + doc/Makefile.am | 2 + doc/public/.cvsignore | 15 + doc/public/Makefile.am | 45 ++ doc/public/cairo-docs.xml | 30 ++ doc/public/cairo-sections.txt | 238 +++++++++ doc/public/tmpl/.cvsignore | 1 + doc/public/tmpl/cairo-atsui.sgml | 25 + doc/public/tmpl/cairo-ft.sgml | 63 +++ doc/public/tmpl/cairo-glitz.sgml | 34 ++ doc/public/tmpl/cairo-matrix.sgml | 193 +++++++ doc/public/tmpl/cairo-pattern.sgml | 154 ++++++ doc/public/tmpl/cairo-pdf.sgml | 42 ++ doc/public/tmpl/cairo-png.sgml | 40 ++ doc/public/tmpl/cairo-ps.sgml | 42 ++ doc/public/tmpl/cairo-quartz.sgml | 38 ++ doc/public/tmpl/cairo-surface.sgml | 112 ++++ doc/public/tmpl/cairo-xcb.sgml | 28 + doc/public/tmpl/cairo-xlib.sgml | 39 ++ doc/public/tmpl/cairo.sgml | 1012 ++++++++++++++++++++++++++++++++++++ gtk-doc.make | 157 ++++++ src/cairo-matrix.c | 162 ++++++ src/cairo.c | 47 ++ src/cairo.h | 26 +- src/cairo_matrix.c | 162 ++++++ 30 files changed, 2782 insertions(+), 3 deletions(-) commit 17ec6f1482ed63ea15e317e78eafab52786cee55 Author: Kristian Høgsberg Date: Thu Jan 27 10:46:20 2005 +0000 The overall idea of this rewrite is that we want to pass the source pattern all the way down into the backends. The motivation for this is that not all backends want a surface for the source operand, and by passing the pattern down, backends can choose to convert it to a surface if they need that. The patch removes the create_surface function pointer from the surface vtable and moves much of that code into a couple of helper functions. The composite, compsite_trapezoids, and show_glyphs backend functions are updated to take a cairo_pattern_t instead of a surface as the source. Change these functions to not create a surface for the pattern and just pass the pattern down to the backend functions. New function to translate a set of trapezoids. Break out the code to adjust and restore surface transformation and repeat settings into _cairo_pattern_prepare_surface and _cairo_pattern_restore_surface. Split cairo_pattern_create_for_surface into an init function and a create function. Utility functions to create a surface from a pattern. Update these backends to work with the new pattern API. Glitz work by David Reveman. Update these to pass through the new set of args. Update this reference image as we now render it correctly. ChangeLog | 62 ++++ src/cairo-font.c | 20 +- src/cairo-ft-font.c | 19 +- src/cairo-glitz-surface.c | 827 ++++++++++++++++++++++----------------------- src/cairo-gstate.c | 363 +++++++++----------- src/cairo-image-surface.c | 79 +++-- src/cairo-pattern.c | 207 ++++++++--- src/cairo-pdf-surface.c | 72 +--- src/cairo-ps-surface.c | 15 +- src/cairo-surface.c | 142 ++------- src/cairo-xlib-surface.c | 102 +++++-- src/cairo_font.c | 20 +- src/cairo_ft_font.c | 19 +- src/cairo_glitz_surface.c | 827 ++++++++++++++++++++++----------------------- src/cairo_gstate.c | 363 +++++++++----------- src/cairo_image_surface.c | 79 +++-- src/cairo_pattern.c | 207 ++++++++--- src/cairo_pdf_surface.c | 72 +--- src/cairo_png_surface.c | 19 +- src/cairo_ps_surface.c | 15 +- src/cairo_surface.c | 142 ++------- src/cairo_xlib_surface.c | 102 +++++-- src/cairoint.h | 102 ++++-- test/coverage-ref.png | Bin 43819 -> 44332 bytes 24 files changed, 1960 insertions(+), 1915 deletions(-) commit 2654df6afb424e41d7cc3752a9d7b9c27c3efc92 Author: Kristian Høgsberg Date: Wed Jan 26 21:46:01 2005 +0000 New test case to verify that the clip surface is correctly updated when extending an existing clip path. ChangeLog | 4 ++ test/Makefile.am | 21 +++++++++---- test/clip-twice-ref.png | Bin 0 -> 869 bytes test/clip-twice.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ test/clip_twice-ref.png | Bin 0 -> 869 bytes test/clip_twice.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 162 insertions(+), 7 deletions(-) commit 79d9b82ff3a803a0895fd57156cb39dc0a54e926 Author: Kristian Høgsberg Date: Wed Jan 26 14:21:53 2005 +0000 Set alpha to 1 before setting clip mask. Added the right reference PNG. Running test against stock 0.3.0 gives the expected results. ChangeLog | 5 +++++ test/coverage-ref.png | Bin 629 -> 43819 bytes test/coverage.c | 1 + 3 files changed, 6 insertions(+), 0 deletions(-) commit d4fb5c92407f31291041f421360ea83a209ea2ad Author: Kristian Høgsberg Date: Wed Jan 26 13:41:55 2005 +0000 New test case, covering various combinations of pattern types, drawing operations and clipping. Currently fails, for some combinations, coverage-ref.png is just a placeholder. Added this PNG from cairo-snippets to use for pattern fills. expose PNG loading to test cases. ChangeLog | 13 ++++ test/Makefile.am | 7 ++- test/cairo-test.c | 23 ++++++ test/cairo-test.h | 4 + test/cairo_test.c | 23 ++++++ test/cairo_test.h | 4 + test/coverage-ref.png | Bin 0 -> 629 bytes test/coverage.c | 181 +++++++++++++++++++++++++++++++++++++++++++++++++ test/romedalen.png | Bin 0 -> 80944 bytes 9 files changed, 253 insertions(+), 2 deletions(-) commit 6dce601fd3cd7f6c8ebe72240e6be7c223ccbdcb Author: Carl Worth Date: Wed Jan 26 09:10:15 2005 +0000 Use 32-bits for pixman_bits_t, even on 64-bit platforms. This should fix bug #2335 as well as rendering problems seen on 64-bit platforms. pixman/ChangeLog | 6 ++++++ pixman/src/pixman.h | 20 ++++++++++---------- 2 files changed, 16 insertions(+), 10 deletions(-) commit dfee909d51aa62d731512d6a66ad3d7478c41089 Author: Alexander Larsson Date: Wed Jan 26 06:49:16 2005 +0000 Fix access to uninitialized data key must be first element in cache entry ChangeLog | 8 ++++++++ src/cairo-ft-font.c | 4 +++- src/cairo-xlib-surface.c | 2 +- src/cairo_ft_font.c | 4 +++- src/cairo_xlib_surface.c | 2 +- 5 files changed, 16 insertions(+), 4 deletions(-) commit 2a7a9d00cc2aa124b5c914dcaf978cbf7ddeddbb Author: Carl Worth Date: Tue Jan 25 14:45:31 2005 +0000 test/imagediff.c Add new testsvg script and accompanying imagediff program, (for interim SVG-based test suites while we wait for the standard cairo test suite to mature). Split buffer_diff out into its own file for the purpose of imagediff. test/.cvsignore | 1 + test/Makefile.am | 5 +++ test/buffer-diff.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ test/buffer-diff.h | 38 +++++++++++++++++++++++ test/buffer_diff.c | 73 +++++++++++++++++++++++++++++++++++++++++++++ test/buffer_diff.h | 38 +++++++++++++++++++++++ test/cairo-test.c | 61 ++++++------------------------------- test/cairo_test.c | 61 ++++++------------------------------- test/imagediff.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/write-png.c | 7 +--- test/write-png.h | 4 +- test/write_png.c | 7 +--- test/write_png.h | 4 +- 13 files changed, 340 insertions(+), 116 deletions(-) commit e5e0880d6761bac2482ec5e1af44a89c9e0b10d9 Author: David Reveman Date: Tue Jan 25 12:25:29 2005 +0000 Update mail address AUTHORS | 2 +- ChangeLog | 4 ++++ src/cairo-glitz-surface.c | 2 +- src/cairo_glitz_surface.c | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) commit b35c7a3ee5df3cac5d5060df6f251947f168e8ec Author: David Reveman Date: Tue Jan 25 12:21:32 2005 +0000 Track changes to glitz ChangeLog | 4 +++ configure.in | 2 +- src/cairo-glitz-surface.c | 67 ++++++++++++++++++++------------------------- src/cairo_glitz_surface.c | 67 ++++++++++++++++++++------------------------- 4 files changed, 65 insertions(+), 75 deletions(-) commit 71f65cbad209bce433f8aca4809a99216856e53d Author: David Reveman Date: Tue Jan 25 12:11:02 2005 +0000 Add missing include directive so xcb backend compile again ChangeLog | 5 +++++ src/cairo-xcb-surface.c | 1 + src/cairo_xcb_surface.c | 1 + 3 files changed, 7 insertions(+), 0 deletions(-) commit b321202d18443e4140093c41a17ac0bf10f9059f Author: Carl Worth Date: Tue Jan 25 11:48:59 2005 +0000 Fixed rounding of glyph positioning. ChangeLog | 5 +++++ src/cairo-ft-font.c | 6 +++--- src/cairo_ft_font.c | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) commit a812c7a06606f6c6b050fca6ad86a7b94564c1a2 Author: Owen Taylor Date: Tue Jan 25 10:56:50 2005 +0000 Chec pdf_font for NULL, not font. ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 2 +- src/cairo_pdf_surface.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit 55a8b62ec4650c9e730a431880b2d68614275d57 Author: Alexander Larsson Date: Tue Jan 25 06:50:33 2005 +0000 Fix typo that made cairo-ft.h not get installed ChangeLog | 5 +++++ src/Makefile.am | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit fe0c66a821591b15de0ed4f6781243ed9beb4f55 Author: Carl Worth Date: Mon Jan 24 09:17:10 2005 +0000 Add Shawn T. Amundson, Calum Robinson, and Owen Taylor. AUTHORS | 7 +++++-- ChangeLog | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) commit e2afdd14588f1352e35777eb1d817f3559b297bd Author: Carl Worth Date: Mon Jan 24 09:10:51 2005 +0000 Conditionally install header files only for backends that are compiled. Thanks to Shawn T. Amundson . ChangeLog | 4 +++ src/Makefile.am | 58 ++++++++++++++++++++++++++++++++---------------------- 2 files changed, 38 insertions(+), 24 deletions(-) commit 31f05254ffabd660b27b26af082ca75ac724c9d7 Author: Carl Worth Date: Mon Jan 24 09:01:52 2005 +0000 Qualify color argument as const. Closes bug #2336. ChangeLog | 6 ++++++ src/cairo-color.c | 3 ++- src/cairo_color.c | 3 ++- src/cairoint.h | 3 ++- 4 files changed, 12 insertions(+), 3 deletions(-) commit c58f6a4bcf20b1f2a50629100457e4025a7de19b Author: Dave Beckett Date: Sun Jan 23 15:16:57 2005 +0000 Protect switch on hintstyle with #ifdef FC_HINT_STYLE. ChangeLog | 5 +++++ src/cairo-ft-font.c | 8 ++++---- src/cairo_ft_font.c | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-) commit 7114a77ce1f25c4e4cd6840daf49ce34cdc11826 Author: Carl Worth Date: Sun Jan 23 12:49:56 2005 +0000 Add instructions for handling the new -head suffix of CAIRO_VERSION at release-time. Append -head to CAIRO_VERSION to indicate state between snapshots. ChangeLog | 12 ++++++++++++ RELEASING | 24 +++++++++++++++--------- configure.in | 2 +- src/cairo-gstate.c | 6 ++++++ src/cairo_gstate.c | 6 ++++++ 5 files changed, 40 insertions(+), 10 deletions(-) commit 7275be538b37c0e102f62b98e6e8489eaf64e715 Author: Owen Taylor Date: Fri Jan 21 15:43:55 2005 +0000 Call _cairo_gstate_ensure_font(). Don't reference the returned font. ChangeLog | 5 +++++ src/cairo-gstate.c | 8 ++++++-- src/cairo_gstate.c | 8 ++++++-- 3 files changed, 17 insertions(+), 4 deletions(-) commit e613961f948495b06e60542dee85d513cf459ad2 Author: Owen Taylor Date: Fri Jan 21 15:31:15 2005 +0000 Make dependence on FC_HINT_STYLE conditional. (reported by Abraham Egnor) Use FT_LOAD_MONOCHROME if FT_LOAD_TARGET_MONO isn't defined for compatibility with older FreeType. ChangeLog | 9 +++++++++ src/cairo-ft-font.c | 12 ++++++++++++ src/cairo_ft_font.c | 12 ++++++++++++ 3 files changed, 33 insertions(+), 0 deletions(-) commit 97424a3c2a4172dd3a686d0d41f7c7781b670814 Author: Owen Taylor Date: Fri Jan 21 14:33:47 2005 +0000 Change cairo_font_t to refer to a font scaled to a particular output device resolution. src/cairoint.h src/cairo_font.c src/cairo_ft_font.c src/cairo_xlib_surface.c src/cairo_pdf_surface.c src/cairo_gstate.c src/cairo.c: Switch many internal methods from handling cairo_unscaled_font_t and cairo_font_scale_t pairs to handling cairo_font_t. src/cairo-ft-private.h src/cairo_ft_fontc: Add some internal interfaces for use by the FreeType backend. Clear the gstate's current font when the transform or target surface changes. src/cairo.h src/cairo_ft_font.c: Rename cairo_ft_font_pattern to cairo_ft_font_get_pattern(). src/cairo.h src/cairo_ft_font.c: Make cairo_ft_font_create() and cairo_ft_font_create_for_ft_face() take a font scale; make the latter take load_flags for FT_Load_Glyph() as well. Change cairo_ft_font_face() to Xft-style cairo_ft_font_lock_face, cairo_ft_font_unlock_face. Remove the name/slant/weight=>unscaled font cache, it didn't work with the new cairo_font_t setup. If it turns out to be needed, it can be added back in some other form. src/cairoint.h src/cairo_font.c: Add a 'flags' field to cairo_glyph_cache_key_t, we use it for load flags with freetype backend. Switch the caching to be from resolved fontconfig pattern => file; keep only a fixed number of FT_Face objects open at once, similar to FreeType. src/cairo_gstate.c src/cairoint.h: Add public cairo_font_glyph_extents, use it to implement _cairo_gstate_glyph_extents(). Add refcounting for glyph cache elements; there was an bug where elements got ejected from the cache and freed before they could be used. src/cairoint.h src/cairo_cache.c (_cairo_cache_random_entry()) New function to return a random entry in the cache matching a predicate; reuse the internals for the previous _random_live_entry(). src/cairoint.h src/cairo_cache.c (_cairo_cache_lookup()): Add an optional created_entry return value. src/cairo_ft_font.c src/cairo_xlib_surface.c: Adapt to _cairo_cache_lookup() change. Support max_memory == 0 to indicate an unbounded cache. src/cairoint.h src/cairo_cache.c (_cairo_cache_remove()): Add a function to manually remove entries from the cache. Update for changes, document cairo_matrix_t, cairo_glyph_t, etc. src/cairo.h src/cairo-atsui.h src/cairo-ft.h src/cairo-glitz.h src/cairo-pdf.h src/cairo-png.h src/cairo-ps.h src/cairo-quartz.h src/cairo-xcb.h src/cairo-xlib.h: Add CAIRO_BEGIN/END_DECLS for extern "C", use it on all public headers. Move header guards outermost. Fix encoding. ChangeLog | 74 ++ doc/reference/doc.xml | 21 +- doc/reference/xml/cairo_current_font.xml | 4 +- doc/reference/xml/cairo_font_glyph_extents.xml | 72 ++ doc/reference/xml/cairo_font_t.xml | 25 + doc/reference/xml/cairo_ft_font_create.xml | 59 ++ .../xml/cairo_ft_font_create_for_ft_face.xml | 69 ++ doc/reference/xml/cairo_ft_font_get_pattern.xml | 49 + doc/reference/xml/cairo_ft_font_lock_face.xml | 61 ++ doc/reference/xml/cairo_ft_font_unlock_face.xml | 44 + doc/reference/xml/cairo_glyph_t.xml | 62 ++ doc/reference/xml/cairo_matrix_t.xml | 24 +- doc/reference/xml/cairo_set_font.xml | 16 +- doc/reference/xml/cairo_show_glyphs.xml | 2 +- doc/reference/xml/cairo_text_extents_t.xml | 49 +- src/cairo-atsui.h | 9 +- src/cairo-cache.c | 104 ++- src/cairo-font.c | 410 +++----- src/cairo-ft-font.c | 1047 ++++++++++++-------- src/cairo-ft-private.h | 63 ++ src/cairo-ft.h | 31 +- src/cairo-glitz.h | 9 +- src/cairo-gstate.c | 323 +++---- src/cairo-hash.c | 104 ++- src/cairo-pdf-surface.c | 63 +- src/cairo-pdf.h | 9 +- src/cairo-png.h | 11 +- src/cairo-ps.h | 9 +- src/cairo-quartz-surface.c | 2 +- src/cairo-quartz.h | 9 +- src/cairo-xcb.h | 9 +- src/cairo-xlib-surface.c | 55 +- src/cairo-xlib.h | 9 +- src/cairo.h | 29 +- src/cairo_cache.c | 104 ++- src/cairo_font.c | 410 +++----- src/cairo_ft_font.c | 1047 ++++++++++++-------- src/cairo_gstate.c | 323 +++---- src/cairo_pdf_surface.c | 63 +- src/cairo_quartz_surface.c | 2 +- src/cairo_xlib_surface.c | 55 +- src/cairoint.h | 157 ++-- 42 files changed, 3118 insertions(+), 1979 deletions(-) commit 90689370267f3c02d6be62e3e8c85cccdad6f577 Author: Carl Worth Date: Fri Jan 21 12:48:11 2005 +0000 Increment CAIRO_VERSION to 0.3.0 Add notes for snapshot 0.3.0 ChangeLog | 6 ++- NEWS | 171 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 2 +- 3 files changed, 176 insertions(+), 3 deletions(-) commit f697490665735c5b5a469b81b16e8075eb355ba7 Author: Carl Worth Date: Fri Jan 21 11:27:56 2005 +0000 Update reference images for new rasterization in libpixman 0.1.3. ChangeLog | 5 +++++ test/fill-rule-ref.png | Bin 1983 -> 1979 bytes test/fill_rule-ref.png | Bin 1983 -> 1979 bytes test/leaky-polygon-ref.png | Bin 264 -> 255 bytes test/leaky_polygon-ref.png | Bin 264 -> 255 bytes test/line-width-ref.png | Bin 167 -> 171 bytes test/line_width-ref.png | Bin 167 -> 171 bytes 7 files changed, 5 insertions(+), 0 deletions(-) commit 1463fbb6c90a9a6faff0d4d1b65d375e416dafd4 Author: Carl Worth Date: Fri Jan 21 11:20:55 2005 +0000 Update since directory changed after server compromise. ChangeLog | 5 +++++ Makefile.am | 2 +- RELEASING | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) commit fdf1ed1185916b77dc36564f637ebe147acb537d Author: Carl Worth Date: Fri Jan 21 11:18:46 2005 +0000 Fix typo pixman/RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 886d457c2f16faa0f570fcf98680df5e5123a641 Author: Carl Worth Date: Fri Jan 21 11:16:03 2005 +0000 Fix snapshot URL in description pixman/RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4b072cc7d266a059871bb76043fa8d0394410671 Author: Carl Worth Date: Fri Jan 21 11:10:07 2005 +0000 Add notes for snapshot 0.1.3. Increment version to 0.1.3 Add reminder to diff pixman.h to look for API changes since the last snapshot. pixman/ChangeLog | 7 +++++++ pixman/NEWS | 22 ++++++++++++++++++++++ pixman/RELEASING | 8 +++++++- pixman/configure.in | 2 +- 4 files changed, 37 insertions(+), 2 deletions(-) commit c3e41a966c5fb0b503dfba48f13a585509c62530 Author: Carl Worth Date: Fri Jan 21 10:59:33 2005 +0000 Add missing files to satisfy make distcheck. pixman/ChangeLog | 3 +++ pixman/src/Makefile.am | 2 ++ 2 files changed, 5 insertions(+), 0 deletions(-) commit 1c4286c2a8323fdadc5112d25acf3cf7ba0d32da Author: Carl Worth Date: Fri Jan 21 10:54:51 2005 +0000 Update for changed www directory on server. pixman/ChangeLog | 3 +++ pixman/Makefile.am | 2 +- 2 files changed, 4 insertions(+), 1 deletions(-) commit fd8974f2adfcb46870dec15d4a90763a89ede42a Author: Carl Worth Date: Fri Jan 21 10:52:55 2005 +0000 Add pixman-xserver-compat.h, (that was supposed to go in a couple of commits ago). pixman/ChangeLog | 3 + pixman/src/pixman-xserver-compat.h | 98 ++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 0 deletions(-) commit dfa7b94c9c9aea61a1ae786139e21152d6e8e34a Author: Carl Worth Date: Fri Jan 21 10:38:42 2005 +0000 Avoid buffer ovverrun when trapezoid's right edge is on a pixel boundary. pixman/ChangeLog | 3 +++ pixman/src/fbedgeimp.h | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) commit 13225d4d3baa78b3020586c6e9b4601111792903 Author: Carl Worth Date: Fri Jan 21 10:26:28 2005 +0000 Switch to use new fbRasterizeTrapezoid. Gut old IcRasterizeTrapezoid implementation. Remove lots of code, (and all the bugs with it). Replace IcRasterizeTrapezoid with fbRasterizeTrapezoid. Add a couple of missing typedefs. Minor changes to allow things to compile within libpixman tree, (replace xserver include directives with pixman-xserver-compat.h and sprinkle a few const qualifiers). Add sources for new point-sampling rasterization. pixman/ChangeLog | 19 + pixman/src/Makefile.am | 4 + pixman/src/fbedge.c | 12 +- pixman/src/fbtrap.c | 20 +- pixman/src/icint.h | 18 +- pixman/src/ictransform.c | 2 - pixman/src/ictrap.c | 1337 +--------------------------------------------- pixman/src/ictri.c | 4 +- pixman/src/renderedge.c | 8 +- pixman/src/renderedge.h | 6 +- 10 files changed, 53 insertions(+), 1377 deletions(-) commit c64e2ccd06edfc9b148ca620d218f84c7bb93378 Author: Carl Worth Date: Fri Jan 21 09:26:44 2005 +0000 Merge in changes from xserver, (mostly just whitespace). pixman/ChangeLog | 5 +++++ pixman/src/fbtrap.c | 21 ++++++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) commit d466c33d1df2a30aa8a8c38f2b9861cb36bf3c1e Author: Carl Worth Date: Thu Jan 20 20:45:38 2005 +0000 Add a bunch of missing include directives, (now that cairo.h has been cleaned up). ChangeLog | 7 ++++++- test/cairo-test.c | 4 ++++ test/cairo_test.c | 4 ++++ 3 files changed, 14 insertions(+), 1 deletions(-) commit da1b3c147b9151cef55f0e1c567c897d066bf594 Author: Carl Worth Date: Thu Jan 20 20:41:40 2005 +0000 Created new public header cairo-atsui.h. Build fixes for Quartz backend courtesy of Geoff Norton : Fix check for atsui font backend. Add conditional compilation for cairo_atsui_font.c and cairo_ft_font.c. Add missing include of cairo-quartz.h. Add include of Carbon/Carbon.h. Advertise availability of Quartz surface. Install cairo-quartz.h, and conditionally compile cairo_quartz_surface.c. Add autofoo checks to detect quartz backend. ChangeLog | 26 ++++++++++++++++++++++++++ configure.in | 33 ++++++++++++++++++++++++++++++--- 2 files changed, 56 insertions(+), 3 deletions(-) commit 0ad3789985161fe0fe9908ce993aa7ac2d95e8c4 Author: Carl Worth Date: Thu Jan 20 20:36:25 2005 +0000 Created new public header cairo-atsui.h. Build fixes for Quartz backend courtesy of Geoff Norton : Fix check for atsui font backend. Add conditional compilation for cairo_atsui_font.c and cairo_ft_font.c. Add missing include of cairo-quartz.h. Add include of Carbon/Carbon.h. Advertise availability of Quartz surface. Install cairo-quartz.h, and conditionally compile cairo_quartz_surface.c. Add autofoo checks to detect quartz backend. src/Makefile.am | 18 +++++++++++++++- src/cairo-atsui-font.c | 13 ++++++----- src/cairo-atsui.h | 50 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-features.h.in | 2 + src/cairo-quartz-surface.c | 7 +----- src/cairo-quartz.h | 2 + src/cairo_atsui_font.c | 13 ++++++----- src/cairo_quartz_surface.c | 7 +----- 8 files changed, 87 insertions(+), 25 deletions(-) commit b646ecfe08601af5587b0f3e10e0bf2e62e355c6 Author: Carl Worth Date: Thu Jan 20 08:28:54 2005 +0000 Track various renamings. Insert new includes for backend-specific header files. Remove redundant include of cairo-features.h. Rename header-exclusion macro from _CAIRO_H_ to CAIRO_H. Remove platform-specific grubbing for cairo-features.h and pixman.h in odd places. Remove all backend-specific prototypes, (as they are now in their own header files). Remove deprecated Remove printf. Convert to utf-8. Use the proper name for multiple-header exclusion (CAIRO_FEATURES_H). Track rename of FREETYPE_FONT_FEATURE to FT_FONT_FEATURE. Split cairo.h up into cairo.h, cairo-ft.h, cairo-glitz.h, cairo-pdf.h, cairo-png.h, cairo-ps.h, cairo-xcb.h, cairo-xlib.h. Update for rename of cairo_wideint.h to cairo-wideint.h. Rename CAIRO_HAS_FREETYPE_FONT to CAIRO_HAS_FT_FONT, (to match cairo_ft_font functions and cairo-ft.h). Update for public header files now in /cairo. ChangeLog | 45 +++++++- cairo.pc.in | 3 +- configure.in | 10 +- src/Makefile.am | 27 +++-- src/cairo-features.h.in | 8 +- src/cairo-ft-font.c | 2 + src/cairo-ft.h | 62 ++++++++++ src/cairo-glitz-surface.c | 1 + src/cairo-glitz.h | 53 ++++++++ src/cairo-pdf-surface.c | 4 + src/cairo-pdf.h | 62 ++++++++++ src/cairo-png.h | 59 +++++++++ src/cairo-ps-surface.c | 1 + src/cairo-ps.h | 63 ++++++++++ src/cairo-quartz.h | 56 +++++++++ src/cairo-xcb.h | 54 +++++++++ src/cairo-xlib-surface.c | 1 + src/cairo-xlib.h | 71 +++++++++++ src/cairo.c | 2 - src/cairo.h | 197 +----------------------------- src/cairo_ft_font.c | 2 + src/cairo_gdip_font.cpp | 1 - src/cairo_gdip_surface.cpp | 1 - src/cairo_glitz_surface.c | 1 + src/cairo_pdf_surface.c | 4 + src/cairo_png_surface.c | 1 + src/cairo_ps_surface.c | 1 + src/cairo_wideint.h | 285 -------------------------------------------- src/cairo_xlib_surface.c | 1 + src/cairoint.h | 6 +- 30 files changed, 580 insertions(+), 504 deletions(-) commit 68d5ba661d5d0ba0a604a3c947f43f629a6a6bb9 Author: Carl Worth Date: Wed Jan 19 12:12:42 2005 +0000 Allow NULL values for return pointers so that the user can easily get partial results from cairo_matrix_get_affine, cairo_current_point, and cairo_current_color_rgb as needed. ChangeLog | 7 +++++++ src/cairo-color.c | 9 ++++++--- src/cairo-gstate.c | 6 ++++-- src/cairo-matrix.c | 17 ++++++++++++++--- src/cairo_color.c | 9 ++++++--- src/cairo_gstate.c | 6 ++++-- src/cairo_matrix.c | 17 ++++++++++++++--- 7 files changed, 55 insertions(+), 16 deletions(-) commit 429c1f42b5942ebd8b3170e462418880c7cf5e2e Author: Carl Worth Date: Wed Jan 19 11:39:06 2005 +0000 Fix int* vs. size_t* confusion, (currently in favor of int* but only because that's easier to implement). Thanks to John Ellson . Closes bug #2328. ChangeLog | 7 +++++++ src/cairo-ft-font.c | 4 ++-- src/cairo_ft_font.c | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) commit 6fb833a84c8cbdba299f3ba4f23e8c4434491cad Author: Kristian Høgsberg Date: Wed Jan 19 08:03:53 2005 +0000 Add byteswap macros missing for bigendian architectures. ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 2 ++ src/cairo_pdf_surface.c | 2 ++ 3 files changed, 9 insertions(+), 0 deletions(-) commit cc58bc3b9b6f46d7953f9a088208f6df1c11a497 Author: Carl Worth Date: Wed Jan 19 07:55:28 2005 +0000 Remove fill_rule and leaky_polygon from expected failures list. Both of these bugs have fixes, (fill_rule is fixed by reverting cairo_traps.c to 1.16, and leaky_polygon is fixed in a newer libpixman). ChangeLog | 5 +++++ test/Makefile.am | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) commit 27532eda85897f2b2f99d17108174c479a47cf5c Author: Carl Worth Date: Wed Jan 19 07:11:14 2005 +0000 Remove const qualifiers from the header file as well. ChangeLog | 3 ++ src/cairo-wideint.h | 74 +++++++++++++++++++++++++------------------------- src/cairo_wideint.h | 74 +++++++++++++++++++++++++------------------------- 3 files changed, 77 insertions(+), 74 deletions(-) commit 8605b6ae5a0035580683488ba8057f7877f74a9f Author: Carl Worth Date: Wed Jan 19 07:07:00 2005 +0000 Remove useless const qualifier from functions returning simple values, (quiets the warning in gcc4). Thanks to John Ellson . Closes bug #2299. ChangeLog | 5 +++ src/cairo-wideint.c | 82 +++++++++++++++++++++++++------------------------- src/cairo_wideint.c | 82 +++++++++++++++++++++++++------------------------- 3 files changed, 87 insertions(+), 82 deletions(-) commit f493efa92d1e945cfb02b4a83b87c48c2788ea5d Author: Carl Worth Date: Wed Jan 19 05:32:32 2005 +0000 Add bugs on cairo_surface_create_for_image, bad names for cairo_font_set_transform and cairo_font_current_transform, segfault on AMD64. BUGS | 16 +++++++++++++++- ChangeLog | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletions(-) commit d894196840aa8363de6f167e6a2b4d59ad9cf977 Author: Carl Worth Date: Tue Jan 18 11:54:23 2005 +0000 Add pristine files from the X server containing Keith's newer point-sampling implementation of trapezoid rasterization. The plan is to munge these files as little as possible to make them work within libpixman, (so that it will be easier to share patches between libpixman and the X server). pixman/ChangeLog | 13 +++ pixman/src/fbedge.c | 134 +++++++++++++++++++++++++++ pixman/src/fbedgeimp.h | 134 +++++++++++++++++++++++++++ pixman/src/fbtrap.c | 235 +++++++++++++++++++++++++++++++++++++++++++++++ pixman/src/renderedge.c | 197 +++++++++++++++++++++++++++++++++++++++ pixman/src/renderedge.h | 120 ++++++++++++++++++++++++ 6 files changed, 833 insertions(+), 0 deletions(-) commit e1eec5cf0ef9efa2358b27cdb61a45987ce290e4 Author: Kristian Høgsberg Date: Mon Jan 17 14:59:49 2005 +0000 Fix double free in error path. (cairo_pdf_ft_font_create): Reference the unscaled font to keep the FT_Face around. (cairo_pdf_ft_font_generate): Initialize end to avoid compiler warning; bail out if table write fails. Fixes from Owen. ChangeLog | 9 +++++++++ src/cairo-pdf-surface.c | 26 ++++++++++++++++---------- src/cairo_pdf_surface.c | 26 ++++++++++++++++---------- 3 files changed, 41 insertions(+), 20 deletions(-) commit 2c6939b7acb3dc931fd723eee84f51a5a692f444 Author: Kristian Høgsberg Date: Mon Jan 17 09:40:00 2005 +0000 Add preliminary text support, including support for truetype font subsetting. Change type of 'surface' argument in show_glyphs to void * as it is for all other surface virtual functions. Update accordingly. Add check for endianess. Fix bug in array growing loop. (_cairo_array_append): Accept NULL for elements argument, in which case we just allocate space in the array. ChangeLog | 17 + configure.in | 1 + src/cairo-array.c | 18 +- src/cairo-pdf-surface.c | 894 ++++++++++++++++++++++++++++++++++++++++++++-- src/cairo-xlib-surface.c | 10 +- src/cairo_array.c | 18 +- src/cairo_pdf_surface.c | 894 ++++++++++++++++++++++++++++++++++++++++++++-- src/cairo_xlib_surface.c | 10 +- src/cairoint.h | 7 +- 9 files changed, 1798 insertions(+), 71 deletions(-) commit be7b745a43b4cbfec7e5ca24185f32ee83856163 Author: Kristian Høgsberg Date: Mon Jan 17 09:18:37 2005 +0000 Take image_rotate-ref.png out of EXTRA_DIST until we can actually render it correctly. (XFAIL_TESTS): Update with new known bugs. Add font backend selection options. ChangeLog | 11 ++++++ configure.in | 89 ++++++++++++++++++++++++++++++++++------------ src/cairo-features.h.in | 4 ++ src/cairo.h | 4 +- src/cairoint.h | 8 +++-- test/Makefile.am | 15 +++++--- 6 files changed, 97 insertions(+), 34 deletions(-) commit 0e2e28c71726a5346ec13a6a5681421d1929628f Author: Marco Pesenti Gritti Date: Sun Jan 16 08:35:14 2005 +0000 Add native Mac OS X support. src/cairo-atsui-font.c | 806 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-quartz-surface.c | 397 ++++++++++++++++++++++ src/cairo.h | 32 ++- src/cairo_atsui_font.c | 806 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo_quartz_surface.c | 397 ++++++++++++++++++++++ src/cairoint.h | 21 +- 6 files changed, 2455 insertions(+), 4 deletions(-) commit 4358135bc9ef8da04906f7491008231608f837c2 Author: John Ellson Date: Sat Jan 15 10:53:13 2005 +0000 Was using the wrong extents variable. reviewed by: Keith Packard ChangeLog | 7 +++++++ src/cairo-gstate.c | 4 ++-- src/cairo_gstate.c | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) commit b0de4a7d094e16fda4e9124caa867df78b607d8c Author: Carl Worth Date: Thu Jan 13 18:08:57 2005 +0000 (IcRasterizeTrapezoid): Fix the above correction so that it doesn't force 0 alpha when the left edge is positioned above but slopes so as to contain some of the pixel. pixman/ChangeLog | 3 +++ pixman/src/ictrap.c | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit 46baad20ee702ab20903dc48db6ec984604e405c Author: Carl Worth Date: Thu Jan 13 14:53:13 2005 +0000 Force alpha to 0 when the left edge is entirely above top. (This is a workaround for some bizarre edge effects in the current algorithm). pixman/ChangeLog | 6 ++++++ pixman/src/ictrap.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) commit 3016995b0d391d233a951db07cbcce49144aef2c Author: Carl Worth Date: Thu Jan 13 14:50:35 2005 +0000 test/Makefile.am Add leaky_polygon test for trapezoid rasterization corner case. ChangeLog | 5 +++ test/.cvsignore | 1 + test/Makefile.am | 3 ++ test/leaky-polygon-ref.png | Bin 0 -> 264 bytes test/leaky-polygon.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ test/leaky_polygon-ref.png | Bin 0 -> 264 bytes test/leaky_polygon.c | 82 ++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 173 insertions(+), 0 deletions(-) commit 3ae8c1ca654807a1f76b18931a29425f59c77436 Author: David Reveman Date: Thu Jan 13 14:48:15 2005 +0000 Replace struct cairo_surface_backend with cairo_surface_backend_t ChangeLog | 5 +++++ src/cairo-xcb-surface.c | 2 +- src/cairo_xcb_surface.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit a2af89b04a53e2f2fb4a9d7ea4ff879e80d20cd7 Author: Carl Worth Date: Thu Jan 13 06:50:23 2005 +0000 Replace all structure tags to have _ prefix. struct cairo_foo -> struct _cairo_foo Also, prefer cairo_foo_t over struct _cairo_foo in .c files. ChangeLog | 11 ++++++ src/cairo-font.c | 9 ++--- src/cairo-ft-font.c | 6 ++-- src/cairo-glitz-surface.c | 4 +- src/cairo-xlib-surface.c | 4 +- src/cairo.h | 10 +++--- src/cairo_font.c | 9 ++--- src/cairo_ft_font.c | 6 ++-- src/cairo_glitz_surface.c | 4 +- src/cairo_xlib_surface.c | 4 +- src/cairoint.h | 84 ++++++++++++++++++++++---------------------- 11 files changed, 80 insertions(+), 71 deletions(-) commit 5235dbb80f966acf8d4fe4bdf75766803824e7af Author: Carl Worth Date: Wed Jan 12 14:40:14 2005 +0000 A NULL cairo_t * is not sane. Add freetype flags so that things work with freetype in a non-standard location, (a little extra work here since freetype doesn't use pkg-config). Add several items culled from recent mailing list discussions. Add bugs on cache locking and surface pattern scaling. BUGS | 7 +++++++ ChangeLog | 16 ++++++++++++++++ TODO | 21 +++++++++++++++++++++ cairo.pc.in | 4 ++-- src/cairo.c | 3 +++ 5 files changed, 49 insertions(+), 2 deletions(-) commit 4796dc0b26d5f56eecc4e208afc6b99ee4a7483e Author: Carl Worth Date: Wed Jan 12 14:38:22 2005 +0000 Add big_star_path which shows we still have fill bugs, (even now that little_star_path is working). test/fill-rule-ref.png | Bin 408 -> 1983 bytes test/fill-rule.c | 58 ++++++++++++++++++++++++++++++++++++++++------- test/fill_rule-ref.png | Bin 408 -> 1983 bytes test/fill_rule.c | 58 ++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 98 insertions(+), 18 deletions(-) commit 72832b97606066681b640a7b7fda9fc434fd7e4c Author: Keith Packard Date: Tue Jan 11 14:52:16 2005 +0000 Scale factors shouldn't include mirroring. int32x32_64_mul and int64x64_128_mul are different from their unsigned compatriots ChangeLog | 11 +++++++++++ src/cairo-matrix.c | 5 +++++ src/cairo-wideint.c | 28 +++++++++++++++++++++++++++- src/cairo-wideint.h | 10 ++++------ src/cairo_matrix.c | 5 +++++ src/cairo_wideint.c | 28 +++++++++++++++++++++++++++- src/cairo_wideint.h | 10 ++++------ 7 files changed, 83 insertions(+), 14 deletions(-) commit 18680d494b7aa14ec1a8cfac602abdb993482266 Author: Øyvind KolÃ¥s Date: Tue Jan 11 13:50:13 2005 +0000 renamed CAIRO_COLOR_DEFAULT to CAIRO_COLOR_WHITE ChangeLog | 5 +++++ src/cairo-color.c | 8 ++++---- src/cairo_color.c | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-) commit c7e80e6bffc43de0f0ffadb9f2b3037bd9b18954 Author: Øyvind KolÃ¥s Date: Tue Jan 11 13:36:41 2005 +0000 reverted accidental change ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 3 --- src/cairo_xlib_surface.c | 3 --- 3 files changed, 5 insertions(+), 6 deletions(-) commit 7dd4d7aad48ae1c454f28d0a61916ef833b5ef78 Author: Øyvind KolÃ¥s Date: Tue Jan 11 13:28:50 2005 +0000 changed default paint color to opaque black ChangeLog | 7 +++++++ src/cairo-color.c | 4 ++-- src/cairo-gstate.c | 2 +- src/cairo-xlib-surface.c | 3 +++ src/cairo_color.c | 4 ++-- src/cairo_gstate.c | 2 +- src/cairo_xlib_surface.c | 3 +++ 7 files changed, 19 insertions(+), 6 deletions(-) commit ad2225c6f4f18570cbd5e4391788458533895bb8 Author: Keith Packard Date: Tue Jan 11 10:03:01 2005 +0000 Fix math library detection to use autotools helper Remove cache memory usage assertions as single objects can be larger than the cache size Decompose font matrix transformations into a couple of helper routines. Return all metrics in font space. Eliminate compiler warning Expect glyph metrics to be in font space. Compute text extents by fetching one glyph metric at a time, transforming to user space and computing the overall bounding box. use 'sincos' where available. Scale factors now ensure the non-scale transform is area preserving. Scale factors requires another parameter to mark the fixed axis. Change license to LGPL Mark int32x32_64_mul as broken (which it still is) Ensure each glyph is located as close to the specified position as possible interface change to _cairo_matrix_compute_scale_factors ChangeLog | 48 +++++++++++++ cairo.pc.in | 4 +- configure.in | 8 ++- src/Makefile.am | 2 +- src/cairo-cache.c | 6 +- src/cairo-ft-font.c | 126 +++++++++++++++++++++++++++++------ src/cairo-glitz-surface.c | 1 + src/cairo-gstate.c | 164 ++++++++++++++++++++++++++++---------------- src/cairo-hash.c | 6 +- src/cairo-matrix.c | 51 +++++++++++--- src/cairo-wideint.c | 46 ++++++++----- src/cairo-wideint.h | 49 +++++++++----- src/cairo-xlib-surface.c | 33 ++++++--- src/cairo_cache.c | 6 +- src/cairo_ft_font.c | 126 +++++++++++++++++++++++++++++------ src/cairo_glitz_surface.c | 1 + src/cairo_gstate.c | 164 ++++++++++++++++++++++++++++---------------- src/cairo_matrix.c | 51 +++++++++++--- src/cairo_wideint.c | 46 ++++++++----- src/cairo_wideint.h | 49 +++++++++----- src/cairo_xlib_surface.c | 33 ++++++--- src/cairoint.h | 2 +- 22 files changed, 733 insertions(+), 289 deletions(-) commit dc0d812f6c78bfc3e4cbf717cf09a4524d8f149c Author: Carl Worth Date: Fri Jan 7 12:14:40 2005 +0000 Restore extern tag for variable declarations, (accidentally removed when recently removing extern from function prototypes). pixman/ChangeLog | 7 +++++++ pixman/src/icint.h | 2 +- pixman/src/icrop.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) commit a85013680566ec945a87dc49ea97d946a57b8c71 Author: Kristian Høgsberg Date: Thu Jan 6 23:20:07 2005 +0000 Add -lz to CAIRO_LIBS when compiling the PDF backend. Don't use compressBound, since it's only available in zlib 1.2 and newer. ChangeLog | 8 ++++++++ configure.in | 4 ++++ src/cairo-pdf-surface.c | 8 +++++++- src/cairo_pdf_surface.c | 8 +++++++- 4 files changed, 26 insertions(+), 2 deletions(-) commit f4a51d915461b1ac6cb1183a428e7b3afa47ec2a Author: Carl Worth Date: Thu Jan 6 21:28:07 2005 +0000 Add Owen's new equation to fix clipping: ((src Op dest) In clip) Add (dest Out clip) ChangeLog | 5 +++++ TODO | 20 +++++++++++++------- 2 files changed, 18 insertions(+), 7 deletions(-) commit cf354e9924d8e36593ba1f441cd345703dc1ebcd Author: Carl Worth Date: Thu Jan 6 10:28:10 2005 +0000 Added cairo_show_surface_mask and note about clipping problems. ChangeLog | 1 + TODO | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) commit a513fa18c7ff7c13f54a4098ba97cb1173b1e39d Author: Carl Worth Date: Thu Jan 6 08:51:48 2005 +0000 Added some TODO items from mailing list traffic. ChangeLog | 4 ++++ TODO | 30 ++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 0 deletions(-) commit c9f545672a0a8a101c9979ab07085b019f55598a Author: Kristian Høgsberg Date: Wed Jan 5 17:46:31 2005 +0000 Implement image compression (taken from cairo_ps_surface.c). ChangeLog | 6 ++++- src/cairo-pdf-surface.c | 62 +++++++++++++++++++++++++++++++++------------- src/cairo_pdf_surface.c | 62 +++++++++++++++++++++++++++++++++------------- 3 files changed, 93 insertions(+), 37 deletions(-) commit b1ec8ae13e9a42c6f9e102a73774dfaeb38dafda Author: Kristian Høgsberg Date: Wed Jan 5 14:29:31 2005 +0000 New PDF backend. Add PDF surface constructors. New file - generic array implementation. Add cairo_array prototypes. Add cairo_array.c and cairo_pdf_surface.c. AUTHORS | 1 + ChangeLog | 8 + configure.in | 17 + src/Makefile.am | 6 + src/cairo-array.c | 130 +++++ src/cairo-features.h.in | 2 + src/cairo-pdf-surface.c | 1314 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 25 + src/cairo_array.c | 130 +++++ src/cairo_gdip_surface.cpp | 4 + src/cairo_pdf_surface.c | 1314 ++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 34 ++ 12 files changed, 2985 insertions(+), 0 deletions(-) commit c90bd12ec7fdb548b58903f1f357840888b25871 Author: Carl Worth Date: Tue Jan 4 11:55:36 2005 +0000 Do nothing if src image has width or height == 0 to avoid potential divide-by-zero. pixman/ChangeLog | 5 +++++ pixman/src/ic.c | 6 ++++++ 2 files changed, 11 insertions(+), 0 deletions(-) commit 7a5a3cb208b079dfe453ad532a8939bed394cff9 Author: Carl Worth Date: Thu Dec 23 13:49:56 2004 +0000 Remove unused CAIRO_TRAPS_GROWTH_INC. Resize arrays by doubling rather than by linear increments. Add new bug exposed centi_unfinished.svg. BUGS | 7 +++++++ ChangeLog | 10 ++++++++++ TODO | 2 ++ src/cairo-polygon.c | 5 ++--- src/cairo-spline.c | 5 ++--- src/cairo-traps.c | 2 -- src/cairo_polygon.c | 5 ++--- src/cairo_spline.c | 5 ++--- src/cairo_traps.c | 2 -- 9 files changed, 27 insertions(+), 16 deletions(-) commit f76d898cf1f14305e1cc984d0f2f40c831aa9014 Author: Carl Worth Date: Thu Dec 23 11:10:08 2004 +0000 Rename __internal_linkage to pixman_private. Track rename to pixman_private and move it to before the function return value to quiet gcc warnings about visibility attribute ignored for non-class type. pixman/ChangeLog | 15 +++++++++++++++ pixman/configure.in | 12 ++++++++++++ pixman/src/Makefile.am | 2 +- pixman/src/icimage.h | 24 ++++++++++++------------ pixman/src/icint.h | 36 ++++++++++++++++++------------------ pixman/src/icrop.h | 6 +++--- pixman/src/slim_internal.h | 15 ++++++++------- 7 files changed, 69 insertions(+), 41 deletions(-) commit cd21775ef9ee1c4ef2742abd50a6edc99bfbe639 Author: Carl Worth Date: Thu Dec 23 11:00:01 2004 +0000 Fix to actually call pixman_fill_rect_32bpp in the 32 bpp case. Thanks to TOKUNAGA Hiroyuki . (pixman_fill_rect_8bpp, pixman_fill_rect_32bpp): Fix typo in naming: bbp -> bpp. pixman/ChangeLog | 8 ++++++++ pixman/src/icrect.c | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) commit e5d48545e027316e8ace74eada9e6b682d219595 Author: Carl Worth Date: Tue Dec 21 13:22:44 2004 +0000 Rename __internal_linkage to cairo_private and move it to the beginning of the line for function declarations. Also, drop unneeded "extern" from function declarations. ChangeLog | 8 + src/cairo-wideint.h | 4 +- src/cairo_wideint.h | 4 +- src/cairoint.h | 417 +++++++++++++++++++++++++-------------------------- 4 files changed, 220 insertions(+), 213 deletions(-) commit 1a21b8289fcbfb808852d152f13f0ff0da935c9c Author: Carl Worth Date: Tue Dec 21 13:14:45 2004 +0000 With thanks to Kristian Høgsberg : Tag a few private functions/data that were missing __internal_linkage. Mark cache backends as static. ChangeLog | 11 +++++++++++ src/cairo-font.c | 6 ++---- src/cairo-ft-font.c | 3 +-- src/cairo-wideint.h | 20 ++++++++++---------- src/cairo-xlib-surface.c | 2 +- src/cairo_font.c | 6 ++---- src/cairo_ft_font.c | 3 +-- src/cairo_wideint.h | 20 ++++++++++---------- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 11 +++++------ 10 files changed, 44 insertions(+), 40 deletions(-) commit 8ffb7df16c137a87b14039f6e17d090f9e73468f Author: Carl Worth Date: Tue Dec 21 12:57:33 2004 +0000 Change "head -1" to more standard "head -n 1". ChangeLog | 5 +++++ autogen.sh | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit 153bf60b3a68266196a007167fc44b7df66ee73b Author: Alexander Larsson Date: Mon Dec 20 12:22:50 2004 +0000 Fix bug in earlier change. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 4 +++- src/cairo_xlib_surface.c | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) commit eecfec86f1646f185555fd1fb0a65a0a345fa49a Author: Carl Worth Date: Mon Dec 20 09:53:06 2004 +0000 Re-enabled __internal_linkage for all internal functions. Now avoid the warning by moving the * from the return type after the __internal_linkage macro. It looks awaful, but it keeps the compiler quiet. BUGS | 12 ------------ ChangeLog | 7 +++++++ src/cairoint.h | 34 ++++++++++++---------------------- 3 files changed, 19 insertions(+), 34 deletions(-) commit 5c1c5e67dc18c3ad96a1d885b4c7331d48036158 Author: Alexander Larsson Date: Mon Dec 20 09:43:59 2004 +0000 Add _cairo_gstate_restore_external_state, _cairo_fixed_integer_floor and _cairo_fixed_integer_ceil. Call _cairo_gstate_restore_external_state on restore. Fix cache-misses. Implement floor and ceil Restore surface clip region on restroe. (_calculate_region_for_intermediate_clip_surface), (_cairo_gstate_clip_and_composite_trapezoids), (_cairo_gstate_show_surface), (_cairo_gstate_show_glyphs): Create intermediate clip surfaces of the minimal required size. ChangeLog | 26 +++++ src/cairo-cache.c | 10 +- src/cairo-fixed.c | 18 +++ src/cairo-gstate.c | 295 ++++++++++++++++++++++++++++++++++++++++------------ src/cairo-hash.c | 10 +- src/cairo.c | 6 + src/cairo_cache.c | 10 +- src/cairo_fixed.c | 18 +++ src/cairo_gstate.c | 295 ++++++++++++++++++++++++++++++++++++++++------------ src/cairoint.h | 10 ++ 10 files changed, 554 insertions(+), 144 deletions(-) commit 8fe87a32a8bf4754a24e27aad74c1f1f5dbe9fc7 Author: Carl Worth Date: Mon Dec 20 08:58:38 2004 +0000 Add Alexander Larsson to AUTHORS list. AUTHORS | 1 + ChangeLog | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-) commit cc0c442d0480723d7c594b262962041f3a45817f Author: Carl Worth Date: Mon Dec 20 08:56:50 2004 +0000 Split off from _cairo_xlib_surface_create to avoid roundtrip when size is already known. (cairo_xlib_surface_create): Simplified to just call XGetGeometry that defer to _cairo_xlib_surface_create_with_size. Add comment about remaining roundtrip and possible plans to eliminate it later with a new interface requiring width/height. Thanks to Alexander Larsson . ChangeLog | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e3fe2138fe9b1446690e75ac87aba2b6aeacd3c0 Author: Carl Worth Date: Mon Dec 20 08:52:47 2004 +0000 Split off from _cairo_xlib_surface_create to avoid roundtrip when size is already known. (cairo_xlib_surface_create): Simplified to just call XGetGeometry that defer to _cairo_xlib_surface_create_with_size. Add comment about remaining roundtrip and possible plans to eliminate it later with a new interface requiring width/height. ChangeLog | 8 ++++++ src/cairo-xlib-surface.c | 62 ++++++++++++++++++++++++++++++++++------------ src/cairo_xlib_surface.c | 62 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 100 insertions(+), 32 deletions(-) commit 682202fdfa37c040c45ebb8b4191f2dfaca8f064 Author: Carl Worth Date: Mon Dec 20 08:08:29 2004 +0000 Disabled test that was killing my machine for some reason. Scary. ChangeLog | 5 +++++ test/text-cache-crash.c | 20 ++++++++++++++++++++ test/text_cache_crash.c | 20 ++++++++++++++++++++ 3 files changed, 45 insertions(+), 0 deletions(-) commit 725d363877e5aaa49c3cc57efda621c0d4f8b1bd Author: Carl Worth Date: Mon Dec 20 07:38:38 2004 +0000 Change return value from cairo_status_t to cairo_int_status_t to match definition in cairo_surface_backend_t. ChangeLog | 5 +++++ src/cairo-image-surface.c | 2 +- src/cairo_image_surface.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit 31534f264cb5bb9cbbcf2cf82dfe9cb7ea021726 Author: Carl Worth Date: Mon Dec 20 07:32:45 2004 +0000 Add bug about gcc 3.4 warning: '__visibility__' attribute ignored on non-class types. Remove __internal_linkage macro from all functions returning pointers to shut up warning from gcc 3.4. BUGS | 12 ++++++++++++ ChangeLog | 8 ++++++++ src/cairoint.h | 34 ++++++++++++++++++++++------------ 3 files changed, 42 insertions(+), 12 deletions(-) commit e291f1d88254e69986aa6abe7c44540621fffeab Author: Alexander Larsson Date: Mon Dec 20 06:15:21 2004 +0000 Special case solid color rectangle fills. pixman/ChangeLog | 7 ++ pixman/src/icrect.c | 174 ++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 158 insertions(+), 23 deletions(-) commit a827069cc521935eb75211668f2331ac078ecb41 Author: Carl Worth Date: Fri Dec 17 13:23:32 2004 +0000 Fix to find reference images in local directory when run directly, (rather than by "make check"). ChangeLog | 3 +++ test/cairo-test.c | 2 +- test/cairo_test.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) commit 5c33c78c8ca551abc5bf28bb7cd1c29d60687ed5 Author: Carl Worth Date: Fri Dec 17 11:31:05 2004 +0000 Add bug about invalidating font caches. BUGS | 4 ++++ ChangeLog | 4 ++++ 2 files changed, 8 insertions(+), 0 deletions(-) commit e656b1f3ba99641e82e603fe5dcbc0c0cc8b8f31 Author: Øyvind KolÃ¥s Date: Mon Dec 6 00:01:45 2004 +0000 normalizing ChangeLog headers ChangeLog | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit cb0364a28c4b9c950bf736f1ef87e0d884f864a3 Author: David Reveman Date: Wed Dec 1 16:27:18 2004 +0000 Revert clipping changes ChangeLog | 6 ++++++ src/cairo-gstate.c | 6 +++++- src/cairo_gstate.c | 6 +++++- 3 files changed, 16 insertions(+), 2 deletions(-) commit e5d50e075937c0d34808451ead09f8a5537f9f6d Author: Carl Worth Date: Mon Nov 29 18:25:23 2004 +0000 Fix typo: LPGL->LGPL. COPYING | 2 +- ChangeLog | 2 ++ 2 files changed, 3 insertions(+), 1 deletions(-) commit d098370411b934ef60b99ca585ae7c100f98867d Author: Carl Worth Date: Mon Nov 29 14:11:26 2004 +0000 Remove unintentional copyright statement from user-generated output image. ChangeLog | 6 ++++++ src/cairo-ps-surface.c | 2 -- src/cairo_ps_surface.c | 2 -- 3 files changed, 6 insertions(+), 4 deletions(-) commit 5c143241df52440ac9e1f9a7aa7b130bae622c5e Author: Carl Worth Date: Tue Nov 23 13:38:09 2004 +0000 Note that text_cache_crash is expected to fail. Add test to demonstrate bug when item is too big for cache. Really remove that refcount assertion this time. ChangeLog | 9 +++++++++ src/cairo-cache.c | 3 --- src/cairo-hash.c | 3 --- src/cairo_cache.c | 3 --- test/Makefile.am | 2 +- test/text-cache-crash.c | 6 ++++++ test/text_cache_crash.c | 6 ++++++ 7 files changed, 22 insertions(+), 10 deletions(-) commit 7478ea5051306cf38ed29d9c9faa4c0263f413b8 Author: Carl Worth Date: Tue Nov 23 12:53:46 2004 +0000 Add note that bug has been fixed. (main): Instrumentation code for testing cache destruction. Support tests that produce no output, (don't check image if (width,height) == (0,0)). Add #include here rather than in multiple .c files. Add const qualifier to static cache_arrangements table. (_cache_sane_state): Remove refcount assertion as it it false during the cairo_cache_destroy. (_cache_sane_state): #include moved up to cairoint.h (_entry_destroy): Fix bug in assertion (used_memory >= entry->memory), not >. (_cairo_cache_destroy): Fix timing of refcount decrement so that the destroy function actually works. BUGS | 7 +++++++ ChangeLog | 21 +++++++++++++++++++++ src/cairo-cache.c | 15 +++++++-------- src/cairo-hash.c | 15 +++++++-------- src/cairo_cache.c | 15 +++++++-------- src/cairoint.h | 8 +++----- test/cairo-test.c | 7 +++++++ test/cairo_test.c | 7 +++++++ test/text-cache-crash.c | 32 +++++++++++++++++++++++++++----- test/text_cache_crash.c | 32 +++++++++++++++++++++++++++----- 10 files changed, 120 insertions(+), 39 deletions(-) commit 78f1206bf8d71d56117fa5dee95b1314f7b1421c Author: Carl Worth Date: Sun Nov 14 10:07:54 2004 +0000 Don't destroy a NULL font. ChangeLog | 5 +++++ src/cairo-gstate.c | 4 ++-- src/cairo_gstate.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) commit 2b76ec2d467ff3cf1f23431729ed3a8887cdfcdb Author: Carl Worth Date: Sat Nov 13 19:46:18 2004 +0000 Unconditionally destroy the old font, (otherwise, if the same font was selected twice in a row, a reference was lost to it, leading to assertion failures). ChangeLog | 7 +++++++ src/cairo-gstate.c | 15 ++++----------- src/cairo_gstate.c | 15 ++++----------- 3 files changed, 15 insertions(+), 22 deletions(-) commit d29237e9c0a93595bbca4506f35cbaec33080198 Author: Stuart Parmenter Date: Fri Nov 12 14:46:23 2004 +0000 Added GDI+ backend to Cairo. ChangeLog | 4 + src/cairo_gdip_font.cpp | 666 ++++++++++++++++++++++++++++++++++++++++ src/cairo_gdip_surface.cpp | 724 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1394 insertions(+), 0 deletions(-) commit b6a2e10301a6670b9678afcc7fda8c1826dd72c8 Author: Carl Worth Date: Fri Nov 12 06:12:20 2004 +0000 Move declarations above statements to satisfy pre-C99 compilers. Thanks to Michael Johnson . ChangeLog | 7 +++++++ src/cairo-font.c | 5 ++--- src/cairo-ft-font.c | 7 +++---- src/cairo_font.c | 5 ++--- src/cairo_ft_font.c | 7 +++---- 5 files changed, 17 insertions(+), 14 deletions(-) commit 10deb4c4ae149cb3677f84aef0a8f72d4e919074 Author: Carl Worth Date: Thu Nov 11 12:15:12 2004 +0000 Added BUG entry BUGS | 5 +++++ ChangeLog | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-) commit fe728e55323c999a97075e3f6906f978cda2f7ce Author: Carl Worth Date: Tue Nov 9 14:27:32 2004 +0000 (draw): Move x_off, y_off calculation outside of loop to emphasize loop-independence. test/text-rotate.c | 16 ++++++++-------- test/text_rotate.c | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) commit 9dacc32fbc4acd00795805244dd0d2a4faa48818 Author: Carl Worth Date: Tue Nov 9 14:22:37 2004 +0000 Increase size and increase number of different angles drawn. (draw): Fix broken usage of extents (missing bearings), add stroked bounding box (shifted out by 0.5 units to just abut the text), and increase position adjustments to make room for this larger box. ChangeLog | 9 +++++++++ test/text-rotate.c | 32 ++++++++++++++++++-------------- test/text_rotate.c | 32 ++++++++++++++++++-------------- 3 files changed, 45 insertions(+), 28 deletions(-) commit a373313c736b61e00118afd8a631a99b852e3bde Author: Dave Beckett Date: Mon Nov 8 14:15:31 2004 +0000 Fix the bit that patch --reverse failed to do. "cvs diff -r1.256 ChangeLog" is just my change now. ChangeLog | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 128 insertions(+), 1 deletions(-) commit 186f14eeb627a047af495f68efd75480b52501fe Author: Dave Beckett Date: Mon Nov 8 14:08:16 2004 +0000 Restore the huge bit of ChangeLog I just deleted, then add my 6 lines. ChangeLog | 349 ++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 220 insertions(+), 129 deletions(-) commit 9d032378848167e7dc9a66e4f8c5423abe3798c7 Author: Dave Beckett Date: Mon Nov 8 13:33:42 2004 +0000 require libpixman 0.1.2 since src/cairo_glitz_surface.c depends on two new functions of 0.1.2 - pixman_format_get_masks and pixman_image_get_format ChangeLog | 226 ++-------------------------------------------------------- configure.in | 2 +- 2 files changed, 8 insertions(+), 220 deletions(-) commit ed08ea6bba0ad1528b0073e7ef6c4bfa7f6b5154 Author: Graydon Hoare Date: Fri Nov 5 10:57:50 2004 +0000 Change the signs of a variety of metrics, which were backwards. Return early if we found a rectangular clip at all, not just in error case. Give render glyphset entry the negative bbox offsets it wants, not the bearings. ChangeLog | 10 ++++++++++ src/cairo-ft-font.c | 34 +++++++++++++++++++++++----------- src/cairo-gstate.c | 2 +- src/cairo-image-surface.c | 4 ++-- src/cairo-xlib-surface.c | 41 +++++++++++++++++++++++++++++++++++++++-- src/cairo_ft_font.c | 34 +++++++++++++++++++++++----------- src/cairo_gstate.c | 2 +- src/cairo_image_surface.c | 4 ++-- src/cairo_xlib_surface.c | 41 +++++++++++++++++++++++++++++++++++++++-- 9 files changed, 140 insertions(+), 32 deletions(-) commit 12a86de2c4dbcd44797a4ddf719c6450c6a4e4b0 Author: Carl Worth Date: Thu Nov 4 14:23:50 2004 +0000 Add new test demonstrating assertion failure in cairo_cache_lookup. Add new test showing problems with rotated text. ChangeLog | 8 +++ Makefile.am | 1 - RELEASING | 2 +- test/.cvsignore | 2 + test/Makefile.am | 13 ++++- test/cairo-test.h | 1 + test/cairo_test.h | 1 + test/text-cache-crash.c | 85 +++++++++++++++++++++++++++++++++++ test/text-rotate.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++ test/text_cache_crash.c | 85 +++++++++++++++++++++++++++++++++++ test/text_rotate.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 419 insertions(+), 5 deletions(-) commit ca61417f7d7562862affd0381b741df260f4a3bb Author: David Reveman Date: Wed Nov 3 15:28:37 2004 +0000 Tracking changes to glitz ChangeLog | 11 ++ configure.in | 2 +- src/cairo-glitz-surface.c | 227 ++++++++++++++++++++++++++++++-------------- src/cairo_glitz_surface.c | 227 ++++++++++++++++++++++++++++++-------------- 4 files changed, 322 insertions(+), 145 deletions(-) commit f1cf7d43318cf0841aed5cc82e1583eb3222c079 Author: David Reveman Date: Wed Nov 3 15:05:24 2004 +0000 Fixed return status of _cairo_gstate_clip ChangeLog | 4 ++++ src/cairo-gstate.c | 2 +- src/cairo_gstate.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) commit 32cde60a0568fd1a0377b5346f419a212bc0628d Author: Olivier Andrieu Date: Mon Nov 1 07:58:27 2004 +0000 remove cairo_ft_font_destroy() prototype. ChangeLog | 4 ++++ src/cairo.h | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) commit 0340265ce470e12ed434cbcde56f44a01e06c046 Author: Carl Worth Date: Thu Oct 28 08:48:07 2004 +0000 Abort release-publish if there's already a published tar file with the current version. (release-publish): Add code to update the LATEST-package-version file. pixman/ChangeLog | 7 +++++++ pixman/Makefile.am | 25 ++++++++++++++++--------- pixman/RELEASING | 8 +++++--- 3 files changed, 28 insertions(+), 12 deletions(-) commit 2473e782ca5e92cb70837daf4d2950253170fe66 Author: Carl Worth Date: Thu Oct 28 08:36:42 2004 +0000 Abort release-publish if there's already a published tar file with the current version. (release-publish): Add code to update the LATEST-package-version file. ChangeLog | 7 +++++++ Makefile.am | 16 +++++++++++++--- RELEASING | 10 ++++++---- 3 files changed, 26 insertions(+), 7 deletions(-) commit 327dc6f2ae304aa0536123bf8224a53290f72c29 Author: Carl Worth Date: Wed Oct 27 13:19:39 2004 +0000 Add note on reverted tessellation regression bugs. ChangeLog | 1 + NEWS | 8 ++++++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit d18aad05f33b903ec2ce2d5b5159ea1193af819c Author: Carl Worth Date: Wed Oct 27 13:13:39 2004 +0000 Increment CAIRO_VERSION to 0.2.0. Add notes for snapshot 0.2.0. .cvsignore | 1 + ChangeLog | 4 +++ NEWS | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- RELEASING | 6 +++- configure.in | 2 +- 5 files changed, 84 insertions(+), 8 deletions(-) commit 377983fdf320cf98061fed9cec1870712855871a Author: Carl Worth Date: Wed Oct 27 11:59:56 2004 +0000 Update release instructions for new release-publish target. Add release-check and release-publish targets copied from libpixman. ChangeLog | 6 +++++ Makefile.am | 40 +++++++++++++++++++++++++++++++++ RELEASING | 71 ++++++++++++++++++++++++++++------------------------------ 3 files changed, 80 insertions(+), 37 deletions(-) commit 39d57762a65f8b16e27c56435217cc96e8c68a23 Author: Carl Worth Date: Wed Oct 27 11:42:45 2004 +0000 Fix to always link tests against locally built library, not installed version. ChangeLog | 3 +++ test/Makefile.am | 2 +- 2 files changed, 4 insertions(+), 1 deletions(-) commit 1839d679b1a9b60b9c153183df8380061fdd7e64 Author: Carl Worth Date: Wed Oct 27 10:53:44 2004 +0000 Put the tag command back which was accidentally removed from the instructions. pixman/ChangeLog | 3 +++ pixman/RELEASING | 6 +++++- 2 files changed, 8 insertions(+), 1 deletions(-) commit 667fa8fc15044f1d488aa98a74c29206b921d57e Author: Carl Worth Date: Wed Oct 27 10:48:58 2004 +0000 Add new test for cairo_set_fill_rule. Also demonstrate some of the current tessellation bugs with the version of the code that is in CVS. ChangeLog | 6 +++ test/.cvsignore | 1 + test/Makefile.am | 26 +++++++++----- test/fill-rule-ref.png | Bin 0 -> 408 bytes test/fill-rule.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ test/fill_rule-ref.png | Bin 0 -> 408 bytes test/fill_rule.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 204 insertions(+), 9 deletions(-) commit 944b1721e1910bc4d8caa97ae946b769f9ad2d8a Author: Carl Worth Date: Wed Oct 27 09:43:22 2004 +0000 Suggest "cvs -q update -Ad" as an alternative to checkout. pixman/ChangeLog | 1 + pixman/RELEASING | 3 +++ 2 files changed, 4 insertions(+), 0 deletions(-) commit ed1ad714174abd3354d2dc3991b596d83f6330bf Author: Carl Worth Date: Wed Oct 27 09:37:34 2004 +0000 Update date since 0.1.2 release didn't get pushed out until today. Update release instructions to include new release-publish target. Add release-check and release-publish targets to simplify the release process. pixman/.cvsignore | 2 +- pixman/ChangeLog | 11 ++++++++++ pixman/Makefile.am | 42 ++++++++++++++++++++++++++++++++++++++ pixman/NEWS | 2 +- pixman/RELEASING | 57 +++++++++++++++++++++------------------------------- pixman/TODO | 10 +++++++++ 6 files changed, 88 insertions(+), 36 deletions(-) commit 19d3fc2399a05a3802b1cb2ced55139fa85a68b8 Author: Carl Worth Date: Wed Oct 27 07:26:36 2004 +0000 Switch from two different buggy mod macros to a new MOD macro which should work in C89 or C99. pixman/ChangeLog | 5 +++++ pixman/NEWS | 7 ++++--- pixman/src/ic.c | 10 ++++------ pixman/src/iccompose.c | 18 ++++++++---------- pixman/src/icint.h | 10 +++++++++- 5 files changed, 30 insertions(+), 20 deletions(-) commit 083de7201755e1b4b322cf2308607f8f3c60a9d8 Author: Carl Worth Date: Tue Oct 26 18:19:55 2004 +0000 Find reference images in so that make distcheck will work. Add header files so that make distcheck is happy. (INCLUDES): Add -D_GNU_SOURCE for asprintf. Someone motivated may want to find a more portable approach. (EXTRA_DIST): Add reference images for the sake of make distcheck. ChangeLog | 9 +++++++++ test/Makefile.am | 26 +++++++++++++++++++++----- test/cairo-test.c | 29 ++++++++++++++++++----------- test/cairo_test.c | 29 ++++++++++++++++++----------- 4 files changed, 66 insertions(+), 27 deletions(-) commit 240276d7920d1c03e32e9a90f826f891f3cd3fcf Author: Carl Worth Date: Tue Oct 26 16:59:22 2004 +0000 Shell doesn't like whitespace around assignment operator. ChangeLog | 3 +++ configure.in | 2 +- 2 files changed, 4 insertions(+), 1 deletions(-) commit 211b19b47575741a70901c10fe0e2d9aec8aa37b Author: Carl Worth Date: Tue Oct 26 16:31:31 2004 +0000 Add paragraph on new features. ChangeLog | 2 ++ test/README | 11 ++++++++++- 2 files changed, 12 insertions(+), 1 deletions(-) commit f8e632ab1e0673cecd2ea68b3c0e6747b74d7cd6 Author: Carl Worth Date: Tue Oct 26 14:38:43 2004 +0000 Add initial regression test suite. Don't AC_SUBST a dozen different FOO_CFLAGS and FOO_LIBS. Instead, incrementally build up just CAIRO_CFLAGS and CAIRO_LIBS. Don't list flags that should get picked up via dependency information through Requires. Add description of move_to_show_surface. BUGS | 11 ++ ChangeLog | 27 +++++ Makefile.am | 2 +- cairo.pc.in | 2 +- configure.in | 41 +++++--- src/Makefile.am | 4 +- test/.cvsignore | 10 ++ test/Makefile.am | 29 ++++++ test/README | 55 +++++++++++ test/cairo-test.c | 191 +++++++++++++++++++++++++++++++++++++ test/cairo-test.h | 50 ++++++++++ test/cairo_test.c | 191 +++++++++++++++++++++++++++++++++++++ test/cairo_test.h | 50 ++++++++++ test/line-width-ref.png | Bin 0 -> 167 bytes test/line-width.c | 63 ++++++++++++ test/line_width-ref.png | Bin 0 -> 167 bytes test/line_width.c | 63 ++++++++++++ test/move-to-show-surface-ref.png | Bin 0 -> 100 bytes test/move-to-show-surface.c | 69 +++++++++++++ test/move_to_show_surface-ref.png | Bin 0 -> 100 bytes test/move_to_show_surface.c | 69 +++++++++++++ test/read-png.c | 166 ++++++++++++++++++++++++++++++++ test/read-png.h | 45 +++++++++ test/read_png.c | 166 ++++++++++++++++++++++++++++++++ test/read_png.h | 45 +++++++++ test/write-png.c | 102 ++++++++++++++++++++ test/write-png.h | 35 +++++++ test/write_png.c | 102 ++++++++++++++++++++ test/write_png.h | 35 +++++++ test/xmalloc.c | 58 +++++++++++ test/xmalloc.h | 35 +++++++ 31 files changed, 1698 insertions(+), 18 deletions(-) commit bf8374dba260c80ae8ee33c1eb5bddf39ae649f4 Author: Carl Worth Date: Thu Oct 21 18:40:50 2004 +0000 Convert all files to utf-8. Add copyright information to cairo_png_surface.c. ChangeLog | 31 +++++++++++++++++++++++++++++++ src/cairo-cache.c | 2 +- src/cairo-color.c | 2 +- src/cairo-fixed.c | 2 +- src/cairo-font.c | 2 +- src/cairo-ft-font.c | 2 +- src/cairo-glitz-surface.c | 2 +- src/cairo-gstate.c | 2 +- src/cairo-hash.c | 2 +- src/cairo-hull.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-matrix.c | 2 +- src/cairo-path-bounds.c | 2 +- src/cairo-path-fill.c | 2 +- src/cairo-path-stroke.c | 2 +- src/cairo-path.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-pen.c | 2 +- src/cairo-polygon.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-slope.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-traps.c | 2 +- src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairo_cache.c | 2 +- src/cairo_color.c | 2 +- src/cairo_fixed.c | 2 +- src/cairo_font.c | 2 +- src/cairo_ft_font.c | 2 +- src/cairo_glitz_surface.c | 2 +- src/cairo_gstate.c | 2 +- src/cairo_hull.c | 2 +- src/cairo_image_surface.c | 2 +- src/cairo_matrix.c | 2 +- src/cairo_path.c | 2 +- src/cairo_path_bounds.c | 2 +- src/cairo_path_fill.c | 2 +- src/cairo_path_stroke.c | 2 +- src/cairo_pattern.c | 2 +- src/cairo_pen.c | 2 +- src/cairo_png_surface.c | 37 +++++++++++++++++++++++++++++++++++++ src/cairo_polygon.c | 2 +- src/cairo_ps_surface.c | 2 +- src/cairo_slope.c | 2 +- src/cairo_spline.c | 2 +- src/cairo_surface.c | 2 +- src/cairo_traps.c | 2 +- src/cairo_xcb_surface.c | 2 +- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 2 +- 54 files changed, 120 insertions(+), 52 deletions(-) commit 215d5c5a46b7523faa31d2f1d087123a7fd54f32 Author: Carl Worth Date: Thu Oct 21 18:26:25 2004 +0000 Fix comparison so that it results in a stable sort. This should fix some rendering bugs due to broken pens. ChangeLog | 4 ++++ src/cairo-hull.c | 7 +++++-- src/cairo_hull.c | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) commit de115d07c35ec59e65d27bbfeced9af5a9df43c0 Author: Carl Worth Date: Thu Oct 21 08:55:46 2004 +0000 Add items on custom caps and getting access to hidden image data ChangeLog | 3 +++ TODO | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) commit 07677744429a5664af30dcbae5bd67d26ba64401 Author: Carl Worth Date: Thu Oct 21 08:51:52 2004 +0000 Add COPYING-LGPL-2.1 and COPYING-MPL-1.1 to the distribution. Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit fe2b2c0abf64ad67f9f128c29d2ecd24d8fbac2a Author: Carl Worth Date: Thu Oct 21 08:31:21 2004 +0000 Makefile.am ChangeLog | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit ce5f903ea84c398f0766fefdafc4f0866fc2c429 Author: Carl Worth Date: Wed Oct 13 11:13:51 2004 +0000 Fix email address in ChangeLog pixman/ChangeLog | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 06788edb0af0b1c15823022747c58e5d595d9960 Author: Carl Worth Date: Wed Oct 13 11:01:42 2004 +0000 Add notes for snapshot 0.1.2 Increment version to 0.1.2 pixman/ChangeLog | 6 ++++++ pixman/NEWS | 24 ++++++++++++++++++++++++ pixman/configure.in | 3 +-- 3 files changed, 31 insertions(+), 2 deletions(-) commit d8b24a4ee035071db8b65c1fcc37ef467b70e2c7 Author: Carl Worth Date: Wed Oct 13 08:18:38 2004 +0000 automake 1.4 seems to be sufficient. Don't require 1.6. ChangeLog | 5 +++++ autogen.sh | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit f9b0020850ac62f37989e6828a69ddaa421d722b Author: Keith Packard Date: Tue Oct 12 14:17:23 2004 +0000 Compute extents of cairo_traps_t on the fly using approximate method which is correct given the way cairo generates trapezoids. Avoid zero-dimensioned pixmaps ChangeLog | 11 +++++ src/cairo-traps.c | 105 ++++++++++++++++++++++++--------------------- src/cairo-xlib-surface.c | 2 +- src/cairo_traps.c | 105 ++++++++++++++++++++++++--------------------- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 1 + 6 files changed, 126 insertions(+), 100 deletions(-) commit 047ce336000d595bcc123bb3647c44d239e1b89a Author: Carl Worth Date: Tue Oct 12 14:09:37 2004 +0000 Fix a few typos in pen vertex math description. ChangeLog | 4 ++++ src/cairo-pen.c | 6 +++--- src/cairo_pen.c | 6 +++--- 3 files changed, 10 insertions(+), 6 deletions(-) commit cc890b9cf4d2a38e13ae48e16589c4fd02678f99 Author: Keith Packard Date: Tue Oct 12 12:29:29 2004 +0000 Adapt function from Walter Brisken to compute pen ellipse major axis length and use that to compute the required number of pen vertices. reviewed by: Carl Worth ChangeLog | 9 ++ src/cairo-pen.c | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++----- src/cairo_pen.c | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 511 insertions(+), 44 deletions(-) commit 30131aa4638f9bba6148114d3c60770592d6583b Author: Graydon Hoare Date: Fri Oct 8 12:09:49 2004 +0000 Add cairo_cache.c Rewrite using temporary glyph arrays New file. Remove old glyph cache code. (_cairo_font_scale) (_cairo_font_transform): Remove font-transforming code. (_cairo_font_text_extents) (_cairo_font_text_bbox) (_cairo_font_show_text) (_cairo_font_text_path): Remove text-API code. (_cairo_font_cache_key_t): New structure type. (_font_cache_hash) (_font_cache_keys_equal) (_font_cache_create_entry) (_font_cache_destroy_entry) (_font_cache_destroy_cache): New font cache code. (_global_font_cache) (_lock_global_font_cache) (_unlock_global_font_cache) (_get_global_font_cache): New global font cache. (_cairo_font_text_to_glyphs) (_cairo_glyph_cache_hash) (_cairo_glyph_cache_keys_equal) (_image_glyph_cache_create_entry) (_image_glyph_cache_destroy_entry) (_image_glyph_cache_destroy_cache): New glyph cache code. (_global_image_glyph_cache) (_cairo_lock_global_image_glyph_cache) (_cairo_unlock_global_image_glyph_cache) (_cairo_get_global_image_glyph_cache): New global glyph cache. (_cairo_font_cache_backend): New structure. (_cairo_image_cache_backend): Likewise. (_cairo_font_create): Reimplement in terms of font cache. (_cairo_font_init): Remove matrix and glyph cache related code. (_cairo_font_copy): Likewise. (_cairo_font_show_glyphs): Delegate to surface when possible. (_cairo_font_glyph_extents) (_cairo_font_glyph_bbox) (_cairo_font_glyph_path) (_cairo_font_font_extents) (_cairo_font_show_glyphs): Rename to as cairo_unscaled_font_XXX, and add scale parameter. New structure types. (_create_from_face) (_reference_font_val) (_destroy_font_val) (_create_from_library_and_pattern): New functions. (_ft_font_cache_hash) (_ft_font_cache_keys_equal) (_ft_font_cache_create_entry) (_ft_font_cache_destroy_entry) (_ft_font_cache_destroy_cache): New ft font cache code. (_global_ft_cache) (_lock_global_ft_cache) (_unlock_global_ft_cache) (_get_global_ft_cache): New global ft font cache. (_ft_font_cache_backend): New structure. (_cairo_ft_font_create): Rewrite to use cache. (_cairo_ft_font_destroy): Likewise. (_cairo_ft_font_copy): Remove. (_install_font_matrix): Rename as _install_font_scale. (_utf8_to_glyphs): Rename as _cairo_ft_font_text_to_glyphs. (_cairo_ft_font_text_to_glyphs): Use cache for metrics. (_cairo_ft_font_extents): Accept size, use scaled metrics. (_cairo_ft_font_glyph_extents) (_cairo_ft_font_glyph_bbox) (_cairo_ft_font_show_glyphs) (_cairo_ft_font_glyph_path): Modify to use size, cache. (_cairo_ft_font_text_extents) (_cairo_ft_font_text_bbox) (_cairo_ft_font_show_text) (_cairo_ft_font_text_path): Remove text-API code. (cairo_ft_font_create) (cairo_ft_font_create_for_ft_face) (cairo_ft_font_face) (cairo_ft_font_pattern): Rewrite using ft_font_val_t. Just reference font. (_cairo_gstate_fini): Finalize font matrix. (_cairo_gstate_default_matrix): Initialize font matrix. (_cairo_gstate_clip): Re-enable clipping rectangle. (_cairo_gstate_select_font) (_cairo_gstate_set_font): Set font matrix to identity. (_cairo_gstate_scale_font): Scale font matrix, not font. (_cairo_gstate_transform_font): Transform font matrix, not font. (_cairo_gstate_set_font_transform): Install as font matrix, not in font. (_build_font_scale): New helper function. (_cairo_gstate_text_to_glyphs): New function. (_cairo_gstate_current_font_extents) (_cairo_gstate_glyph_extents) (_cairo_gstate_show_glyphs) (_cairo_gstate_glyph_path): Rewrite using font matrix and size. (_cairo_gstate_text_path (_cairo_gstate_text_extents) (_cairo_gstate_show_text): Remove text-API code. Minor bug fix. (_cairo_xlib_surface_show_glyphs): New function. (_cairo_xlib_surface_backend): Add reference to new function. (glyphset_cache_t) (glyphset_cache_entry_t): New structure types. (_next_xlib_glyph): New helper function. (_xlib_glyphset_cache_create_value) (_xlib_glyphset_cache_destroy_cache) (_xlib_glyphset_cache_destroy_value) (_xlib_glyphset_cache_backend): New glyphset cache code. (_xlib_glyphset_caches) (_lock_xlib_glyphset_caches) (_unlock_xlib_glyphset_caches) (_get_glyphset_cache): New global glyphset cache. Add NULL entry for show_glyphs. Add NULL entry for show_glyphs. Add NULL entry for show_glyphs. Add NULL entry for show_glyphs. Add NULL entry for show_glyphs. New structure type. (cairo_cache_entry_base_t) (cairo_cache_arrangement_t) (cairo_cache_t): New structure types. (_cairo_cache_init) (_cairo_cache_reference) (_cairo_cache_destroy) (_cairo_cache_lookup) (_cairo_hash_string): New cache functions. (CAIRO_IMAGE_GLYPH_CACHE_MEMORY_DEFAULT) (CAIRO_XLIB_GLYPH_CACHE_MEMORY_DEFAULT) (CAIRO_FONT_CACHE_NUM_FONTS_DEFAULT) (CAIRO_FT_CACHE_NUM_FONTS_DEFAULT): New constants. (cairo_font_scale_t) (cairo_glyph_cache_key_t) (cairo_image_glyph_cache_entry_t): New structure types. (_cairo_lock_global_image_glyph_cache) (_cairo_unlock_global_image_glyph_cache) (_cairo_get_global_image_glyph_cache) (_cairo_glyph_cache_hash) (_cairo_glyph_cache_keys_equal): New functions for glyph caches. (cairo_font_backend_t): Remove text-API calls, add scale params, remove copy call. (cairo_surface_backend_t): Add show_glyphs entry. (cairo_glyph_surface_t) (cairo_glyph_surface_node_t): Remove old glyph cache structures. (cairo_unscaled_font_t): New structure type. (cairo_font): Remove glyph cache member, add pointer to unscaled. (cairo_gstate): Add font_matrix member, change to hold unscaled. (_cairo_gstate_set_font_transform) (_cairo_gstate_current_font_transform) (_cairo_gstate_text_to_glyphs): New functions. (_cairo_gstate_text_path (_cairo_gstate_text_extents) (_cairo_gstate_show_text) (_cairo_font_text_extents) (_cairo_font_text_bbox) (_cairo_font_show_text) (_cairo_font_text_path): Remove text-API code. (_cairo_font_glyph_extents) (_cairo_font_glyph_bbox) (_cairo_font_glyph_path) (_cairo_font_font_extents) (_cairo_font_show_glyphs): Add scale parameter. ChangeLog | 190 +++++++++ src/Makefile.am | 1 + src/cairo-cache.c | 454 +++++++++++++++++++++ src/cairo-font.c | 659 ++++++++++++++++++------------- src/cairo-ft-font.c | 965 ++++++++++++++++++++++++++++----------------- src/cairo-glitz-surface.c | 3 +- src/cairo-gstate.c | 526 ++++++++++++++----------- src/cairo-hash.c | 454 +++++++++++++++++++++ src/cairo-image-surface.c | 3 +- src/cairo-ps-surface.c | 3 +- src/cairo-xcb-surface.c | 3 +- src/cairo-xlib-surface.c | 529 +++++++++++++++++++++++++- src/cairo.c | 53 +++- src/cairo_cache.c | 454 +++++++++++++++++++++ src/cairo_font.c | 659 ++++++++++++++++++------------- src/cairo_ft_font.c | 965 ++++++++++++++++++++++++++++----------------- src/cairo_glitz_surface.c | 3 +- src/cairo_gstate.c | 526 ++++++++++++++----------- src/cairo_image_surface.c | 3 +- src/cairo_png_surface.c | 3 +- src/cairo_ps_surface.c | 3 +- src/cairo_xcb_surface.c | 3 +- src/cairo_xlib_surface.c | 529 +++++++++++++++++++++++++- src/cairoint.h | 413 ++++++++++++------- 24 files changed, 5485 insertions(+), 1919 deletions(-) commit 56ccb883761ff0781954705795f78b8e5a1591d4 Author: David Reveman Date: Mon Oct 4 04:55:46 2004 +0000 Do not use VBOs and PBOs for immediate mode drawing ChangeLog | 7 +++ configure.in | 2 +- src/cairo-glitz-surface.c | 118 +++++++++++++++++++++------------------------ src/cairo_glitz_surface.c | 118 +++++++++++++++++++++------------------------ 4 files changed, 118 insertions(+), 127 deletions(-) commit 978e2dd0d613a6c043014b62df0c1ac7ae076581 Author: Jamey Sharp Date: Thu Sep 30 13:34:19 2004 +0000 Update for minor XCB API change. ChangeLog | 5 +++++ src/cairo-xcb-surface.c | 2 +- src/cairo_xcb_surface.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) commit 96dfd5db6488f4b649c429471da14362c7697503 Author: David Reveman Date: Sun Sep 19 22:11:04 2004 +0000 Important fixes to glitz format handling ChangeLog | 11 +++++++++++ src/cairo-glitz-surface.c | 29 ++++++++++++++++++++--------- src/cairo_glitz_surface.c | 29 ++++++++++++++++++++--------- 3 files changed, 51 insertions(+), 18 deletions(-) commit c150ea0855428f56cc12d83f4bdafec7f1ce6ce8 Author: David Reveman Date: Wed Sep 15 09:55:40 2004 +0000 Improved format handling, pixel transfers and gradients ChangeLog | 8 +++++ src/cairo-glitz-surface.c | 74 +++++++++++++++++++++++++++++---------------- src/cairo_glitz_surface.c | 74 +++++++++++++++++++++++++++++---------------- 3 files changed, 104 insertions(+), 52 deletions(-) commit 3deeb1d1784cced73d94e8274e5c1650189b85d4 Author: David Reveman Date: Sun Sep 12 15:34:00 2004 +0000 Get pixel masks from pixman image format ChangeLog | 2 ++ src/cairo-glitz-surface.c | 27 +++++++++++---------------- src/cairo_glitz_surface.c | 27 +++++++++++---------------- 3 files changed, 24 insertions(+), 32 deletions(-) commit 3a1931baba4c453226a2d0c307352569c6b2bfab Author: David Reveman Date: Sun Sep 12 06:06:50 2004 +0000 Added pixman_format_get_masks and fixed a few format issues pixman/AUTHORS | 2 +- pixman/ChangeLog | 9 +++++++++ pixman/src/icformat.c | 35 ++++++++++++++++++++++++++++++++++- pixman/src/icimage.c | 6 ++++++ pixman/src/pixman.h | 10 +++++++++- 5 files changed, 59 insertions(+), 3 deletions(-) commit 93c27d48a3783dbf318392170edfec78af42fd4f Author: David Reveman Date: Sun Sep 12 05:09:32 2004 +0000 cairo_surface_t pointer to cairo_surface_set_repeat ChangeLog | 3 +++ src/cairo-glitz-surface.c | 2 +- src/cairo_glitz_surface.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) commit d0e30df8cb32550e2075efc2d1fa342fa6d8ca8b Author: David Reveman Date: Sat Sep 11 19:55:24 2004 +0000 Added function for setting component alpha pixman/AUTHORS | 1 + pixman/ChangeLog | 6 ++++++ pixman/src/icimage.c | 9 +++++++++ pixman/src/icint.h | 1 + pixman/src/pixman.h | 6 +++++- 5 files changed, 22 insertions(+), 1 deletions(-) commit 1ba0de94fb774d1f3f8e082004adadfe897e285e Author: David Reveman Date: Sat Sep 11 19:42:40 2004 +0000 Fixed clipping pixman/ChangeLog | 4 ++++ pixman/src/icimage.c | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletions(-) commit 81d66588587e506781a91e7378b39f728202b317 Author: David Reveman Date: Sat Sep 11 19:33:23 2004 +0000 Byte-order fix pixman/ChangeLog | 5 +++++ pixman/configure.in | 2 ++ pixman/src/icint.h | 13 +++++++++++++ 3 files changed, 20 insertions(+), 0 deletions(-) commit c5786fd0fe0f0b69f3896e77705282c211ba7a77 Author: David Reveman Date: Sat Sep 11 19:27:59 2004 +0000 Added support for both transform and repeat pixman/AUTHORS | 1 + pixman/ChangeLog | 7 +++++++ pixman/src/ic.c | 8 ++++++++ pixman/src/iccompose.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- pixman/src/icimage.h | 3 +++ 5 files changed, 61 insertions(+), 4 deletions(-) commit 4af8faee061b3b90e71badf36040daa0b8edb7d1 Author: David Reveman Date: Sat Sep 11 19:05:46 2004 +0000 Pickup repeat setting when cloning surface ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 2 ++ src/cairo_glitz_surface.c | 2 ++ 3 files changed, 9 insertions(+), 0 deletions(-) commit 7abd103d2eb0fb7099527f16634c80df247c7a65 Author: Carl Worth Date: Sat Sep 11 13:29:59 2004 +0000 Require automake 1.6 rather than 1.7 since it seems to work just fine. ChangeLog | 5 +++++ autogen.sh | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit 786904f1aa0dc24f9c206387312eec81e42784d8 Author: David Reveman Date: Sat Sep 11 07:59:27 2004 +0000 Tracking color stop coordinate changes to glitz's gradient filters ChangeLog | 5 +++++ configure.in | 2 +- src/cairo-glitz-surface.c | 4 ++-- src/cairo_glitz_surface.c | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) commit 27d2de8c2d0ebdabf80321bf59d7e680093b4e33 Author: David Reveman Date: Sat Sep 11 04:23:17 2004 +0000 Replaced the gl backend with the new glitz backend ChangeLog | 18 + cairo.pc.in | 2 +- configure.in | 36 +- src/Makefile.am | 10 +- src/cairo-features.h.in | 2 +- src/cairo-glitz-surface.c | 907 ++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 14 +- src/cairo_gl_surface.c | 967 --------------------------------------------- src/cairo_glitz_surface.c | 907 ++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 1864 insertions(+), 999 deletions(-) commit 211cf9a2ce2f15402062ebc87f82a2b45b0cfde2 Author: Carl Worth Date: Sat Sep 4 07:29:16 2004 +0000 Add the MPL as a new license option, in addition to the LGPL. ChangeLog | 28 +++++++++++++++++++++++++--- 1 files changed, 25 insertions(+), 3 deletions(-) commit 0f3ce6a24010b9d1416f218c447b5c68a0df85ea Author: Carl Worth Date: Sat Sep 4 06:38:34 2004 +0000 Add the MPL as a new license option, in addition to the LGPL. COPYING | 519 ++------------------------------------------- COPYING-LGPL-2.1 | 510 ++++++++++++++++++++++++++++++++++++++++++++ COPYING-MPL-1.1 | 470 ++++++++++++++++++++++++++++++++++++++++ ChangeLog | 8 + src/cairo-color.c | 37 +++- src/cairo-features.h.in | 41 +++- src/cairo-fixed.c | 41 +++- src/cairo-font.c | 37 +++- src/cairo-gstate.c | 37 +++- src/cairo-hull.c | 37 +++- src/cairo-image-surface.c | 37 +++- src/cairo-matrix.c | 37 +++- src/cairo-path-bounds.c | 37 +++- src/cairo-path-fill.c | 37 +++- src/cairo-path-stroke.c | 37 +++- src/cairo-path.c | 37 +++- src/cairo-pen.c | 37 +++- src/cairo-polygon.c | 37 +++- src/cairo-ps-surface.c | 37 +++- src/cairo-slope.c | 37 +++- src/cairo-spline.c | 37 +++- src/cairo-surface.c | 37 +++- src/cairo-xcb-surface.c | 37 +++- src/cairo-xlib-surface.c | 37 +++- src/cairo.c | 38 +++- src/cairo.h | 37 +++- src/cairo_color.c | 37 +++- src/cairo_fixed.c | 41 +++- src/cairo_font.c | 37 +++- src/cairo_gstate.c | 37 +++- src/cairo_hull.c | 37 +++- src/cairo_image_surface.c | 37 +++- src/cairo_matrix.c | 37 +++- src/cairo_path.c | 37 +++- src/cairo_path_bounds.c | 37 +++- src/cairo_path_fill.c | 37 +++- src/cairo_path_stroke.c | 37 +++- src/cairo_pen.c | 37 +++- src/cairo_polygon.c | 37 +++- src/cairo_ps_surface.c | 37 +++- src/cairo_slope.c | 37 +++- src/cairo_spline.c | 37 +++- src/cairo_surface.c | 37 +++- src/cairo_xcb_surface.c | 37 +++- src/cairo_xlib_surface.c | 37 +++- src/cairoint.h | 37 +++- 46 files changed, 2142 insertions(+), 932 deletions(-) commit 31d0ddbf2a6acecea8ffede9f3f3942dcbc9c035 Author: Carl Worth Date: Sat Aug 14 07:21:52 2004 +0000 Make a copy of the region since pixman is currently taking ownership of it (ugh). Thanks to Vladimir Vukicevic and Peter Dennis Bartok . AUTHORS | 2 ++ ChangeLog | 6 ++++++ src/cairo-image-surface.c | 15 ++++++++++++++- src/cairo_image_surface.c | 15 ++++++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) commit adabb18408157299940413a80a6c943de96296d5 Author: Carl Worth Date: Sat Aug 14 06:35:30 2004 +0000 Explicitly set LANG=C to fix the awk string->number conversion for user with locales that don't match ASCII digit conventions. ChangeLog | 6 ++++++ autogen.sh | 3 ++- 2 files changed, 8 insertions(+), 1 deletions(-) commit 62e4b869cd17c2fd5103d9e61656a4451624f6b9 Author: Carl Worth Date: Tue Aug 3 11:49:20 2004 +0000 Temporarily disable rectangle-based clipping optimization as it's not working (see cairo_snippets/xxx_clip_rectangle for a test case). ChangeLog | 6 ++++++ src/cairo-gstate.c | 9 +++++++++ src/cairo_gstate.c | 9 +++++++++ 3 files changed, 24 insertions(+), 0 deletions(-) commit e5afa03605e4e8eda39ecbf589796d1c51b8452a Author: Carl Worth Date: Mon Aug 2 17:04:00 2004 +0000 Fix to explicitly refer to GNU Lesser Public License 2.1 rather than the Library Public License version 2 or 'any later version' ChangeLog | 2 ++ src/cairo-color.c | 12 +++++------- src/cairo-features.h.in | 12 +++++------- src/cairo-fixed.c | 12 +++++------- src/cairo-font.c | 12 +++++------- src/cairo-gstate.c | 12 +++++------- src/cairo-hull.c | 12 +++++------- src/cairo-image-surface.c | 12 +++++------- src/cairo-matrix.c | 12 +++++------- src/cairo-path-bounds.c | 12 +++++------- src/cairo-path-fill.c | 12 +++++------- src/cairo-path-stroke.c | 12 +++++------- src/cairo-path.c | 12 +++++------- src/cairo-pen.c | 12 +++++------- src/cairo-polygon.c | 12 +++++------- src/cairo-ps-surface.c | 12 +++++------- src/cairo-slope.c | 12 +++++------- src/cairo-spline.c | 12 +++++------- src/cairo-surface.c | 12 +++++------- src/cairo-xcb-surface.c | 12 +++++------- src/cairo-xlib-surface.c | 12 +++++------- src/cairo.c | 12 +++++------- src/cairo.h | 12 +++++------- src/cairo_color.c | 12 +++++------- src/cairo_fixed.c | 12 +++++------- src/cairo_font.c | 12 +++++------- src/cairo_gstate.c | 12 +++++------- src/cairo_hull.c | 12 +++++------- src/cairo_image_surface.c | 12 +++++------- src/cairo_matrix.c | 12 +++++------- src/cairo_path.c | 12 +++++------- src/cairo_path_bounds.c | 12 +++++------- src/cairo_path_fill.c | 12 +++++------- src/cairo_path_stroke.c | 12 +++++------- src/cairo_pen.c | 12 +++++------- src/cairo_polygon.c | 12 +++++------- src/cairo_ps_surface.c | 12 +++++------- src/cairo_slope.c | 12 +++++------- src/cairo_spline.c | 12 +++++------- src/cairo_surface.c | 12 +++++------- src/cairo_xcb_surface.c | 12 +++++------- src/cairo_xlib_surface.c | 12 +++++------- src/cairoint.h | 12 +++++------- 43 files changed, 212 insertions(+), 294 deletions(-) commit d5e92dd1c80eda83cc808abad0c8ce0905d453f7 Author: Carl Worth Date: Mon Aug 2 13:13:28 2004 +0000 Change from MIT license to LGPL. COPYING | 532 +++++++++++++++++++++++++++++++++++++++++++-- ChangeLog | 30 +++ src/cairo-color.c | 34 ++-- src/cairo-features.h.in | 34 ++-- src/cairo-fixed.c | 34 ++-- src/cairo-font.c | 34 ++-- src/cairo-gstate.c | 34 ++-- src/cairo-hull.c | 34 ++-- src/cairo-image-surface.c | 34 ++-- src/cairo-matrix.c | 34 ++-- src/cairo-path-bounds.c | 34 ++-- src/cairo-path-fill.c | 34 ++-- src/cairo-path-stroke.c | 34 ++-- src/cairo-path.c | 34 ++-- src/cairo-pen.c | 34 ++-- src/cairo-polygon.c | 34 ++-- src/cairo-ps-surface.c | 34 ++-- src/cairo-slope.c | 34 ++-- src/cairo-spline.c | 34 ++-- src/cairo-surface.c | 34 ++-- src/cairo-xcb-surface.c | 34 ++-- src/cairo-xlib-surface.c | 34 ++-- src/cairo.c | 34 ++-- src/cairo.h | 34 ++-- src/cairo_color.c | 34 ++-- src/cairo_fixed.c | 34 ++-- src/cairo_font.c | 34 ++-- src/cairo_gstate.c | 34 ++-- src/cairo_hull.c | 34 ++-- src/cairo_image_surface.c | 34 ++-- src/cairo_matrix.c | 34 ++-- src/cairo_path.c | 34 ++-- src/cairo_path_bounds.c | 34 ++-- src/cairo_path_fill.c | 34 ++-- src/cairo_path_stroke.c | 34 ++-- src/cairo_pen.c | 34 ++-- src/cairo_polygon.c | 34 ++-- src/cairo_ps_surface.c | 34 ++-- src/cairo_slope.c | 34 ++-- src/cairo_spline.c | 34 ++-- src/cairo_surface.c | 34 ++-- src/cairo_xcb_surface.c | 34 ++-- src/cairo_xlib_surface.c | 34 ++-- src/cairoint.h | 34 ++-- 44 files changed, 1128 insertions(+), 862 deletions(-) commit b0a6de8f0b3830fd0af521945dcaa98d62ac69d2 Author: Carl Worth Date: Mon Aug 2 12:14:57 2004 +0000 Fix copyright attributions mistakenly attributed to University of Southern California rather than to David Reveman. src/cairo-pattern.c | 33 ++++++++++++++++----------------- src/cairo_gl_surface.c | 33 ++++++++++++++++----------------- src/cairo_pattern.c | 33 ++++++++++++++++----------------- 3 files changed, 48 insertions(+), 51 deletions(-) commit a9bc4e1f5eb2d9ea78ce7c11bcb7a96d9c349f9e Author: Carl Worth Date: Mon Aug 2 11:51:57 2004 +0000 Note that cairo_clip is fixed now. BUGS | 6 +++--- ChangeLog | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) commit 0e3770e82074f76302190b853302e21113400ece Author: Øyvind KolÃ¥s Date: Sun Aug 1 23:03:02 2004 +0000 s/ct/cr/ ChangeLog | 5 +++++ src/cairo.h | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) commit fe2ca7e7afbbb78425bb271416e69dde9bafa102 Author: Jamey Sharp Date: Sat Jul 24 19:30:05 2004 +0000 Updating for XCB API change around iterators. ChangeLog | 5 +++++ src/cairo-xcb-surface.c | 8 ++++---- src/cairo_xcb_surface.c | 8 ++++---- 3 files changed, 13 insertions(+), 8 deletions(-) commit 7f87ea9a9e05541ecbc8cab04e214d15a606e3fb Author: David Reveman Date: Tue Jul 20 01:39:23 2004 +0000 Tracking changes to glitz ChangeLog | 11 ++++++++ src/cairo_gl_surface.c | 66 ++++++++++++++++++++++------------------------- 2 files changed, 42 insertions(+), 35 deletions(-) commit c95e622675ca9370f74e68e2356103e503d2a9ca Author: David Reveman Date: Fri Jul 16 10:25:31 2004 +0000 Fixed typo in earlier memory leak fix ChangeLog | 5 +++++ src/cairo-font.c | 5 ++++- src/cairo_font.c | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) commit b306adead8b49a7aff0957a0c5aa8fd93825ff8c Author: David Reveman Date: Thu Jul 15 13:38:21 2004 +0000 Fixed glyph cache memory leak ChangeLog | 5 +++++ src/cairo-font.c | 3 +++ src/cairo_font.c | 3 +++ 3 files changed, 11 insertions(+), 0 deletions(-) commit 49f691ec0b3c4b780456b99c199a9be9548454af Author: Carl Worth Date: Sun Jul 11 18:51:55 2004 +0000 Don't call _cairo_surface_set_clip_region with a NULL surface. ChangeLog | 5 +++++ src/cairo-gstate.c | 5 +++-- src/cairo_gstate.c | 5 +++-- 3 files changed, 11 insertions(+), 4 deletions(-) commit d7a392bf3015a9bc53397a277fe2003e00411ffe Author: Carl Worth Date: Fri Jul 9 13:47:46 2004 +0000 Fix numerical problem that could lead to infinite loops. ChangeLog | 5 +++++ src/cairo-gstate.c | 9 +++++---- src/cairo_gstate.c | 9 +++++---- 3 files changed, 15 insertions(+), 8 deletions(-) commit 63468474d732f7e707cafb216051be7802defd00 Author: Dave Beckett Date: Fri Jul 9 12:47:06 2004 +0000 Report versions of commands on failure. Try to get version numbers from newer GNU --version formats. autogen.sh | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) commit 2277d8fd4fcc2529cf2584db2f252cfb38a0b3bf Author: Dave Beckett Date: Fri Jul 9 09:16:41 2004 +0000 Require automake 1.7 (and thus aclocal 1.7) which requires autoconf 2.54. Changed since newer libtools may fail to work with older automake versions such as 1.4. I bet this will annoy people with older tool chains :( ChangeLog | 7 +++++ autogen.sh | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 82 insertions(+), 1 deletions(-) commit 259cbd0a9bb17ca35ff27b719f935ce85e877af3 Author: Carl Worth Date: Mon Jul 5 09:17:22 2004 +0000 Remove errant semicolon from macro definition. ChangeLog | 5 +++++ src/cairo.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 8b9c42e8ce3135aad4d9adc5be1c4b984c190604 Author: Carl Worth Date: Thu Jul 1 13:38:23 2004 +0000 Add missing ChangeLog entry. Add description of current tessellation bugs. BUGS | 5 +++++ ChangeLog | 12 ++++++++++++ 2 files changed, 17 insertions(+), 0 deletions(-) commit ad398d9bda70a1e49edf126bd8576edf63b4b7a6 Author: David Reveman Date: Mon Jun 21 15:13:52 2004 +0000 Glitz updates and a minor clipping fix ChangeLog | 16 +++++ configure.in | 2 +- src/cairo-gstate.c | 26 +++++--- src/cairo_gl_surface.c | 163 +++++++++++++++++++++++++++++++----------------- src/cairo_gstate.c | 26 +++++--- 5 files changed, 156 insertions(+), 77 deletions(-) commit 5230af4e5ad1faee3bb340ce4495e935a807b399 Author: Keith Packard Date: Wed Jun 16 18:16:04 2004 +0000 Fix image data length computation (XCB doesn't do this part). ChangeLog | 6 ++++++ src/cairo-xcb-surface.c | 4 ++-- src/cairo_xcb_surface.c | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) commit 1e72b87b933615bbcc8b977c02b4587db0c01bde Author: David Reveman Date: Fri Jun 11 08:08:27 2004 +0000 Software multi-sample support ChangeLog | 11 ++++++++ configure.in | 2 +- src/cairo_gl_surface.c | 66 +++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 69 insertions(+), 10 deletions(-) commit 06ef87276e4f070e73db8c408cb1411e8cd8467b Author: David Reveman Date: Fri Jun 11 06:20:17 2004 +0000 Pre-multiply gradients after color interpolation ChangeLog | 11 +++++++++++ src/cairo-gstate.c | 12 ++++++++++-- src/cairo-pattern.c | 37 ++++++++++++++++++++----------------- src/cairo_gstate.c | 12 ++++++++++-- src/cairo_pattern.c | 37 ++++++++++++++++++++----------------- src/cairoint.h | 1 - 6 files changed, 71 insertions(+), 39 deletions(-) commit f82f1ba380d9c2b4e9f41092ee149ccac0881f2e Author: Carl Worth Date: Fri May 28 12:47:00 2004 +0000 These two fixes are from David Reveman : Move NULL test from create_similar_scratch to create_similar_solid. Fix for when surface->backend != image->backend, but the backend does use images for similar surfaces. src/cairo-font.c | 6 ++++-- src/cairo-surface.c | 14 ++++++-------- src/cairo_font.c | 6 ++++-- src/cairo_surface.c | 14 ++++++-------- 4 files changed, 20 insertions(+), 20 deletions(-) commit 41f549a870aee35840e6e76f82d4d625c5b8ff25 Author: Keith Packard Date: Fri May 28 12:37:15 2004 +0000 Add WARN_CFLAGS, autodetection for 64/128 bit ints and cairo_wideint.[ch] Check status return from _cairo_gstate_glyph_extents Quiet compiler warnings about uninitialized variables Switch to alternate exact line intersection code. Add 64/128-bit wide integer arithmetic. Switch to stdint.h types (and new wide types). ChangeLog | 44 +++ configure.in | 16 + src/Makefile.am | 4 +- src/cairo-pattern.c | 4 + src/cairo-surface.c | 2 +- src/cairo-traps.c | 118 +++++-- src/cairo-wideint.c | 986 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-wideint.h | 272 +++++++++++++ src/cairo_pattern.c | 4 + src/cairo_png_surface.c | 3 + src/cairo_surface.c | 2 +- src/cairo_traps.c | 118 +++++-- src/cairo_wideint.c | 986 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_wideint.h | 272 +++++++++++++ src/cairoint.h | 31 +- 15 files changed, 2785 insertions(+), 77 deletions(-) commit 878c76807ab6c4eae60701d50a1bc7c9fadce2da Author: David Reveman Date: Mon May 24 02:44:59 2004 +0000 Moved CAIRO_CHECK_SANITY below declarations ChangeLog | 4 ++++ src/cairo.c | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) commit cdad6472111848e5167f3d71c7b4e7c3e9b2ebb6 Author: David Reveman Date: Mon May 24 02:28:05 2004 +0000 Added glyph caching ChangeLog | 53 ++++++++++ NEWS | 6 + src/cairo-font.c | 221 +++++++++++++++++++++++++++++++++++++++- src/cairo-ft-font.c | 248 +++++++++++++++++++++++++++++++-------------- src/cairo-gstate.c | 41 ++++---- src/cairo-image-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-surface.c | 28 ++++- src/cairo-xcb-surface.c | 3 +- src/cairo-xlib-surface.c | 3 +- src/cairo_font.c | 221 +++++++++++++++++++++++++++++++++++++++- src/cairo_ft_font.c | 248 +++++++++++++++++++++++++++++++-------------- src/cairo_gl_surface.c | 18 +++- src/cairo_gstate.c | 41 ++++---- src/cairo_image_surface.c | 1 + src/cairo_png_surface.c | 1 + src/cairo_ps_surface.c | 1 + src/cairo_surface.c | 28 ++++- src/cairo_xcb_surface.c | 3 +- src/cairo_xlib_surface.c | 3 +- src/cairoint.h | 84 +++++++++++++++- 21 files changed, 1032 insertions(+), 222 deletions(-) commit 23026d5ab65201793ac19b459e3e7e05a090e435 Author: Graydon Hoare Date: Thu May 20 16:42:56 2004 +0000 Add sanity checking feature configury. Add sanity checking feature. Add sanity checking. Add prototypes. New functions. New function. Use fixed functions. (_cairo_gstate_clip): Arithmetic fixes. (_cairo_gstate_clip_and_composite_trapezoids): (_cairo_gstate_show_surface): (_cairo_gstate_show_text): (_cairo_gstate_show_glyphs): Corrections to clipping. Add XCopyArea fast path. (_cairo_xlib_surface_set_clip_region): Drive clip to drawable. ChangeLog | 29 ++++ configure.in | 14 ++ src/cairo-features.h.in | 2 + src/cairo-fixed.c | 11 ++ src/cairo-gstate.c | 351 +++++++++++++++++++++++++++++++++++++-------- src/cairo-matrix.c | 24 +++ src/cairo-xlib-surface.c | 52 +++++++- src/cairo.c | 187 ++++++++++++++++++++++++- src/cairo_fixed.c | 11 ++ src/cairo_gstate.c | 351 +++++++++++++++++++++++++++++++++++++-------- src/cairo_matrix.c | 24 +++ src/cairo_xlib_surface.c | 52 +++++++- src/cairoint.h | 9 ++ 13 files changed, 982 insertions(+), 135 deletions(-) commit aab2fe8c059cc41451ddf5e0719f18d77ef354f4 Author: Carl Worth Date: Mon May 17 08:03:17 2004 +0000 Do nothing when passed a NULL string. ChangeLog | 5 +++++ src/cairo.c | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 4511a6cc7f52f461fb79635a6fc1ba9cafdcc66d Author: Øyvind KolÃ¥s Date: Tue May 11 13:59:09 2004 +0000 changed CAIRO_FILTER_DEFAULT to CAIRO_FILTER_BEST to make gradients easier. ChangeLog | 5 +++++ src/cairoint.h | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit cdf8739c0968831d12a3b7c22e34296488eb1fa9 Author: David Reveman Date: Tue May 11 11:20:06 2004 +0000 Removed pattern_offset ChangeLog | 12 ++++++++++++ src/cairo-gstate.c | 8 -------- src/cairo-pattern.c | 10 ++-------- src/cairo-surface.c | 8 +++----- src/cairo_gstate.c | 8 -------- src/cairo_pattern.c | 10 ++-------- src/cairo_surface.c | 8 +++----- src/cairoint.h | 1 - 8 files changed, 22 insertions(+), 43 deletions(-) commit 2f7b4a3ad7a0760af023d350685d1acfdc528d2c Author: Carl Worth Date: Tue May 11 08:19:47 2004 +0000 Increment CAIRO_VERSION to 0.1.23. Added notes for snapshot 0.1.23. Add reminder to mention incompatible API changes in NEWS. Re-order steps to avoid clobbering pre-existing tar files. ChangeLog | 10 ++++++++++ NEWS | 41 +++++++++++++++++++++++++++++++++++++++++ RELEASING | 28 +++++++++++++++------------- configure.in | 2 +- 4 files changed, 67 insertions(+), 14 deletions(-) commit b743ed0342d0e6696df159e9739781fbcb1fac33 Author: Carl Worth Date: Tue May 11 06:52:19 2004 +0000 Several people have reported that cairo_clip is not working right now. And it's always been slow. BUGS | 6 ++++++ ChangeLog | 5 +++++ 2 files changed, 11 insertions(+), 0 deletions(-) commit 4162e1f16b6ea9d162872dcc2b6b612e0dcb7523 Author: David Reveman Date: Tue May 11 05:31:16 2004 +0000 Better surface pattern support ChangeLog | 10 ++++++ configure.in | 2 +- src/cairo_gl_surface.c | 77 +++++++++++++++++++++++++++++++++++------------ 3 files changed, 68 insertions(+), 21 deletions(-) commit 1e20a2db0fa26c6882bc00f8ea00cbf1e4619884 Author: Carl Worth Date: Fri May 7 18:52:01 2004 +0000 Bail on NULL utf8 string. Don't add two consecutive, identical points when decomposing the spline, (which was leading to an infinte loop in the stroke algorithm when it found a slope of (0,0)). ChangeLog | 9 +++++++++ TODO | 4 ++-- src/cairo-ft-font.c | 2 +- src/cairo-spline.c | 7 +++++++ src/cairo.h | 1 + src/cairo_ft_font.c | 2 +- src/cairo_spline.c | 7 +++++++ 7 files changed, 28 insertions(+), 4 deletions(-) commit 9faef192afc6a1606518a8e6a0a8e4e27351d920 Author: Carl Worth Date: Thu May 6 05:50:23 2004 +0000 Leave clientClipType as CT_NONE if region is NULL (thanks to Vladimir Vukicevic ). pixman/AUTHORS | 1 + pixman/ChangeLog | 6 ++++++ pixman/src/icimage.c | 6 ++++-- 3 files changed, 11 insertions(+), 2 deletions(-) commit c7230543b06d3ec4070073fbc55f344d09b26ea5 Author: Carl Worth Date: Tue May 4 12:00:22 2004 +0000 (_cairo_png_surface_copy_page): Don't close a file we didn't open. ChangeLog | 1 + src/cairo_png_surface.c | 1 - 2 files changed, 1 insertions(+), 1 deletions(-) commit 7398aa8e1e4328a85f8d2de0c5180712cfa842e8 Author: Carl Worth Date: Tue May 4 09:25:54 2004 +0000 Move all libpng-related code into copy_page. (unpremultiply_data): Add missing unpremultiply step. (_cairo_png_surface_copy_page): Move PNG output to copy_page. Add support for A8 and A1 images. Remove time from header (we may want to add it again later, but for now it messes up my test suite). (_cairo_png_surface_destroy): Call copy_page if it hasn't been called already. (_cairo_png_surface_show_page): Add implementation. BUGS | 4 + ChangeLog | 12 +++ src/cairo_png_surface.c | 232 ++++++++++++++++++++++++++++------------------- 3 files changed, 153 insertions(+), 95 deletions(-) commit 423ea55410d86c8c8cc4fb5219941bcbdeab2a33 Author: David Reveman Date: Tue May 4 04:01:18 2004 +0000 Corrected some confusing comments about the math used for radial gradients ChangeLog | 5 +++++ src/cairo-pattern.c | 24 ++++++++++++++++-------- src/cairo_pattern.c | 24 ++++++++++++++++-------- 3 files changed, 37 insertions(+), 16 deletions(-) commit 1876568f208f3067449988bad896be756eacacaf Author: David Reveman Date: Sat May 1 05:50:46 2004 +0000 cairo_surface_t pointer to cairo_surface_set_matrix ChangeLog | 5 +++++ src/cairo_gl_surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit c0df5d4b1a28bb95e83cbfa232b1f4722d999c93 Author: Carl Worth Date: Thu Apr 29 22:09:05 2004 +0000 Don't set pattern_offset by the current point. Perhaps we can eliminate pattern_offset altogether now? ChangeLog | 6 ++++++ src/cairo-gstate.c | 4 ---- src/cairo_gstate.c | 4 ---- 3 files changed, 6 insertions(+), 8 deletions(-) commit f516564f987b7030f52273d66c69acef4222ef29 Author: David Reveman Date: Thu Apr 29 20:26:56 2004 +0000 Updated linear and radial patterns ChangeLog | 25 ++++++ configure.in | 2 +- src/cairo-gstate.c | 2 +- src/cairo-pattern.c | 226 +++++++++++++++++++++++++++--------------------- src/cairo_gl_surface.c | 80 +++++++---------- src/cairo_gstate.c | 2 +- src/cairo_pattern.c | 226 +++++++++++++++++++++++++++--------------------- src/cairoint.h | 7 +- 8 files changed, 315 insertions(+), 255 deletions(-) commit c9c882d2b28f8bb9656224eed8adba5a5395b294 Author: Carl Worth Date: Thu Apr 29 07:26:53 2004 +0000 Added a BUG and a TODO item BUGS | 9 ++++++++- TODO | 3 +++ 2 files changed, 11 insertions(+), 1 deletions(-) commit 09698566e1b238830eca1085a65f6292195805a9 Author: David Reveman Date: Wed Apr 28 02:14:23 2004 +0000 Support compositing with mask surface when mask is solid or multi-texturing is available ChangeLog | 8 ++++++++ src/cairo_gl_surface.c | 17 ++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) commit 37f6590708061a79f1b3b34efe550935b3a03d8c Author: David Reveman Date: Sun Apr 25 05:11:07 2004 +0000 Fixed conversion of pixman_box16_t to glitz_rectangle_t ChangeLog | 3 +++ src/cairo_gl_surface.c | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) commit f870f16e98d4a3dcfdc2ab28f532fb510dc59124 Author: David Reveman Date: Sun Apr 25 04:02:37 2004 +0000 Converted shading routines to use fixed point values. ChangeLog | 31 ++++++ src/cairo-pattern.c | 237 ++++++++++++++++++++++++------------------------ src/cairo-surface.c | 8 +- src/cairo_gl_surface.c | 36 +++++-- src/cairo_pattern.c | 237 ++++++++++++++++++++++++------------------------ src/cairo_surface.c | 8 +- src/cairoint.h | 25 +++++- 7 files changed, 327 insertions(+), 255 deletions(-) commit c82011dddd3d7f5ac50d61077cfa2c5dcb17a952 Author: Carl Worth Date: Fri Apr 23 10:08:53 2004 +0000 Fixed several function prototype mismatches between internal header file and implementation (thanks to Carlos Romero and gcc-3.4). ChangeLog | 8 ++++++++ src/cairo-gstate.c | 2 +- src/cairo-surface.c | 2 +- src/cairo_gstate.c | 2 +- src/cairo_surface.c | 2 +- src/cairoint.h | 16 ++++++++-------- 6 files changed, 20 insertions(+), 12 deletions(-) commit e172b7cec739ca57f9034d62029e00283a9ab84c Author: David Reveman Date: Thu Apr 22 02:22:36 2004 +0000 Fixed pattern source offset ChangeLog | 10 ++++++++++ src/cairo-gstate.c | 8 ++++---- src/cairo-pattern.c | 30 ++++++++++++++---------------- src/cairo-surface.c | 14 +++++++------- src/cairo_gl_surface.c | 10 +++++----- src/cairo_gstate.c | 8 ++++---- src/cairo_pattern.c | 30 ++++++++++++++---------------- src/cairo_surface.c | 14 +++++++------- src/cairoint.h | 2 +- 9 files changed, 66 insertions(+), 60 deletions(-) commit c15c7b93647d997b7ba13e9fb511d5a5505cdc22 Author: David Reveman Date: Tue Apr 20 12:35:44 2004 +0000 Fixed missing limits.h includes ChangeLog | 11 +++++++++++ src/cairo-pattern.c | 2 +- src/cairo-traps.c | 4 ++-- src/cairo_pattern.c | 2 +- src/cairo_traps.c | 4 ++-- src/cairoint.h | 4 ++++ 6 files changed, 21 insertions(+), 6 deletions(-) commit eff1670123efce23f09d8015a9db00a9b7ae98a5 Author: Carl Worth Date: Fri Apr 16 08:56:45 2004 +0000 Added notes for snapshot 0.1.22. Now depends on libpixman 0.1.1. Bump version to 0.1.22. ChangeLog | 5 +++++ NEWS | 5 +++++ configure.in | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) commit b0f8dcdc83d3487a5016d813a4ee3284784b78c1 Author: Carl Worth Date: Fri Apr 16 08:52:00 2004 +0000 Add RELEASING file pixman/RELEASING | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 71 insertions(+), 0 deletions(-) commit a8106bae111dddf240ceb071bfb686a8d3cac782 Author: Carl Worth Date: Fri Apr 16 08:50:11 2004 +0000 Add notes for snapshot 0.1.1 Increment LIBPIXMAN_VERSION to 0.1.1 pixman/ChangeLog | 4 ++++ pixman/NEWS | 23 +++++++++++++++++++++++ pixman/configure.in | 2 +- 3 files changed, 28 insertions(+), 1 deletions(-) commit 3a29d7a5310b0e4bc76eb7a852a41d9b4634de31 Author: Carl Worth Date: Fri Apr 16 08:33:20 2004 +0000 Track pixman fixes to PIXMAN_FORMAT_NAME_*. Explicitly add cases for all enum values to eliminate compiler warnings. Remove proposal for surface_clip interface as cairo_clip should be able to cover this case now. Added bug concerning negative ref_counts. BUGS | 6 ++++++ ChangeLog | 13 +++++++++++++ src/cairo-image-surface.c | 4 ++-- src/cairo.h | 13 ------------- src/cairo_image_surface.c | 4 ++-- src/cairo_png_surface.c | 8 ++++++++ 6 files changed, 31 insertions(+), 17 deletions(-) commit 821a9f2f6c663429abbacce89383af6171f65225 Author: Carl Worth Date: Fri Apr 16 08:32:53 2004 +0000 Fix bogus names such as PIXMAN_FORMAT_NAME_AR_GB32 that were left over from a broken search-and-replace. Normalize structure defintions, (eg. struct _pixman_region16_t -> struct pixman_region16). Normalize indentation. Fix alphabetization. pixman/AUTHORS | 2 +- pixman/ChangeLog | 16 ++++ pixman/src/icformat.c | 6 +- pixman/src/icimage.c | 4 +- pixman/src/icimage.h | 30 ++++---- pixman/src/icint.h | 6 +- pixman/src/icrect.c | 8 +- pixman/src/ictrap.c | 2 +- pixman/src/pixman.h | 177 +++++++++++++++++++++++---------------------- pixman/src/pixregion.c | 70 +++++++++--------- pixman/src/pixregionint.h | 16 ++-- 11 files changed, 177 insertions(+), 160 deletions(-) commit aa83e5c2c1fee1eb52f829f6cfd2e170e369e720 Author: David Reveman Date: Fri Apr 9 14:30:38 2004 +0000 Bump version to 0.1.21 ChangeLog | 4 ++++ NEWS | 16 ++++++++++++++++ configure.in | 2 +- 3 files changed, 21 insertions(+), 1 deletions(-) commit 73df0e81cb6a5d43a1325f4722a7236bd554738f Author: David Reveman Date: Fri Apr 9 14:19:47 2004 +0000 Added OpenGL surface backend AUTHORS | 1 + ChangeLog | 12 + cairo.pc.in | 2 +- configure.in | 26 ++ src/Makefile.am | 9 +- src/cairo-features.h.in | 2 + src/cairo-pattern.c | 14 +- src/cairo-surface.c | 12 +- src/cairo.h | 16 + src/cairo_gl_surface.c | 821 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_pattern.c | 14 +- src/cairo_surface.c | 12 +- 12 files changed, 912 insertions(+), 29 deletions(-) commit f713fe43cf18c221a840caab710dfdb25aaf6898 Author: David Reveman Date: Fri Apr 9 14:14:56 2004 +0000 Automatically detect available backends ChangeLog | 4 ++++ configure.in | 55 ++++++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 15 deletions(-) commit 69b9f89da7c510fafc172fd30d1a970e7c8ca69b Author: Carl Worth Date: Wed Apr 7 11:03:40 2004 +0000 Add note that announcement needs to include the URL RELEASING | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) commit 2e891bdd33e9b3d2c8b9297d01eacde317ebae22 Author: Carl Worth Date: Tue Apr 6 20:13:11 2004 +0000 Added notes for snapshot 0.1.20. Added new RELEASING file. ChangeLog | 6 ++++ NEWS | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- RELEASING | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 2 deletions(-) commit b26a742bcfe2c81b99c2c5e26acc10ad259cb4ef Author: David Reveman Date: Tue Apr 6 09:45:17 2004 +0000 Added new pattern API src/cairo-pattern.c | 716 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_pattern.c | 716 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1432 insertions(+), 0 deletions(-) commit e309090d2a18a896c67e731151b973b530f76980 Author: David Reveman Date: Tue Apr 6 09:36:12 2004 +0000 Added new pattern API ChangeLog | 82 +++++++ cairo.pc.in | 2 +- configure.in | 7 +- src/Makefile.am | 4 +- src/cairo-ft-font.c | 21 ++- src/cairo-gstate.c | 528 +++++++++++++++++++++++++-------------------- src/cairo-image-surface.c | 23 ++- src/cairo-ps-surface.c | 10 +- src/cairo-surface.c | 108 +++++++++ src/cairo-traps.c | 37 ++++ src/cairo-xcb-surface.c | 11 +- src/cairo-xlib-surface.c | 15 +- src/cairo.c | 33 +++- src/cairo.h | 75 ++++++- src/cairo_ft_font.c | 21 ++- src/cairo_gstate.c | 528 +++++++++++++++++++++++++-------------------- src/cairo_image_surface.c | 23 ++- src/cairo_png_surface.c | 10 +- src/cairo_ps_surface.c | 10 +- src/cairo_surface.c | 108 +++++++++ src/cairo_traps.c | 37 ++++ src/cairo_xcb_surface.c | 11 +- src/cairo_xlib_surface.c | 15 +- src/cairoint.h | 150 ++++++++++++- 24 files changed, 1339 insertions(+), 530 deletions(-) commit b17b04aa388541c0880698aed0f03796a3146d49 Author: Carl Worth Date: Fri Apr 2 08:01:09 2004 +0000 Move weight after slant to match the order in cairo_select_font. Added notes on DPI for image-based backends and on proposal for new cairo_text_glyphs function. Added BUG about cairo_show_text not advancing the current point. BUGS | 4 ++++ ChangeLog | 11 +++++++++++ TODO | 22 ++++++++++++++++++++++ src/cairo.h | 11 +++++------ 4 files changed, 42 insertions(+), 6 deletions(-) commit 72667ec5680c77fc0e89fcfe71e6fa72467991ff Author: Carl Worth Date: Tue Mar 30 18:55:48 2004 +0000 Add -lz. ChangeLog | 4 ++++ src/Makefile.am | 3 ++- src/cairo-ft-font.c | 2 +- src/cairo_ft_font.c | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) commit 9459871bbf4f027354c781b7d6bc1b9f6a4d1e05 Author: Carl Worth Date: Tue Mar 30 18:45:00 2004 +0000 Add checks for Xrender.h in xrender.pc is not found. Remove AC_HELP_STRING to be compatible with older versions of autoconf (thanks to Bill Spitzak ). AUTHORS | 1 + ChangeLog | 4 ++++ cairo.pc.in | 2 +- configure.in | 18 ++++++++++++------ 4 files changed, 18 insertions(+), 7 deletions(-) commit 76478e4ad004e25d1f0e71be660983eb85b8285e Author: Carl Worth Date: Tue Mar 30 17:49:30 2004 +0000 Add question on semantics with empty region. Fix missing return value. Export for internal use. (_cairo_image_abstract_surface_set_clip_region): Add silly wrapper to match the backend interface. Remove unused variables. ChangeLog | 12 ++++++++++++ src/cairo-gstate.c | 4 ---- src/cairo-image-surface.c | 17 +++++++++++++---- src/cairo-xlib-surface.c | 7 +++++-- src/cairo_gstate.c | 4 ---- src/cairo_image_surface.c | 17 +++++++++++++---- src/cairo_xlib_surface.c | 7 +++++-- src/cairoint.h | 6 +++++- 8 files changed, 53 insertions(+), 21 deletions(-) commit c7d2b0e0531633630823090a7d85c14b916275c0 Author: Carl Worth Date: Tue Mar 30 17:24:29 2004 +0000 Add proposal for cairo_xlib_surface_set_size. Added note about problem with cairo_scale_font. AUTHORS | 2 +- BUGS | 27 +++++++++++++++++++++++++++ ChangeLog | 6 ++++++ TODO | 13 ++++++++----- src/cairo.h | 5 +++++ 5 files changed, 47 insertions(+), 6 deletions(-) commit 3cd25474937c1ae2dbd17d28aaa5c7868f3902ef Author: Olivier Andrieu Date: Tue Mar 23 10:33:32 2004 +0000 Implement _set_clip_region by delegating it to the image backend. Add a stub. Add missing (?) cairo_init_clip ChangeLog | 11 +++++++++++ src/cairo-ps-surface.c | 5 +++-- src/cairo-xcb-surface.c | 11 ++++++++++- src/cairo.h | 3 +++ src/cairo_png_surface.c | 13 ++++++++++++- src/cairo_ps_surface.c | 5 +++-- src/cairo_xcb_surface.c | 11 ++++++++++- 7 files changed, 52 insertions(+), 7 deletions(-) commit e576aeb222b5f7378cb01fd6df05e6daf43094dd Author: Øyvind KolÃ¥s Date: Mon Mar 22 17:56:35 2004 +0000 cairo usage is crashing Xnest BUGS | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 1d51df571348d8ebd8f978cfc5cff06e7b35b248 Author: Dave Beckett Date: Sat Mar 20 09:54:15 2004 +0000 Move the PNG_CFLAGS/_LIBS substitutes outside the conditional, to match what is already done for XCB. Do the same for XRENDER_CFLAGS/LIBS. ChangeLog | 4 ++++ configure.in | 7 ++++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit ad255ad599d607ed1b16f2ac87ce64546a76bd16 Author: Dave Beckett Date: Sat Mar 20 08:20:40 2004 +0000 Substitute PNG_CFLAGS, PNG_LIBS on the configure path when use_png is not enabled to prevent the substituions being undefined. ChangeLog | 6 ++++++ configure.in | 3 +++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 94551db67c610582be115bdc18ad4169c9f7db92 Author: Graydon Hoare Date: Fri Mar 19 15:47:25 2004 +0000 Add. finalize and copy clip.region. Detect rectangular clips and push down to backend. Add set_clip_region slot. (cairo_clip_rec_t): Add region slot. (_cairo_gstate_init_clip) (_cairo_surface_set_clip_region): Prototype. Add. Add. Add. not implemented. ChangeLog | 25 +++++++++ src/cairo-gstate.c | 133 ++++++++++++++++++++++++++++++++++++++++++--- src/cairo-image-surface.c | 12 ++++- src/cairo-ps-surface.c | 12 ++++- src/cairo-surface.c | 5 ++ src/cairo-xlib-surface.c | 50 ++++++++++++++++- src/cairo.c | 9 +++ src/cairo_gstate.c | 133 ++++++++++++++++++++++++++++++++++++++++++--- src/cairo_image_surface.c | 12 ++++- src/cairo_ps_surface.c | 12 ++++- src/cairo_surface.c | 5 ++ src/cairo_xlib_surface.c | 50 ++++++++++++++++- src/cairoint.h | 11 ++++ 13 files changed, 445 insertions(+), 24 deletions(-) commit 9e793ee5fceb1c6d41438f304eb01b481962fcb8 Author: Jamey Sharp Date: Wed Mar 17 09:44:26 2004 +0000 Fixed for latest XCB API. XCB headers can co-exist with Xlib headers now, so Cairo may be compiled with both backends in the same library. http://freedesktop.org/Software/XCBCompletedTasks#17_Mar_2004 ChangeLog | 10 ++++ src/cairo-surface.c | 1 + src/cairo-xcb-surface.c | 123 ++++++++++++++++++++++++---------------------- src/cairo.h | 4 +- src/cairo_surface.c | 1 + src/cairo_xcb_surface.c | 123 ++++++++++++++++++++++++---------------------- 6 files changed, 142 insertions(+), 120 deletions(-) commit e7f3335baf9cb7955e27115a2975db1eed71434a Author: Thomas Hunger Date: Thu Feb 26 14:47:21 2004 +0000 added missing links for rectangle and curve_to function doc/reference/doc.xml | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit f1b56497b10efe7cf70f6a9768dbeeff12efa031 Author: Thomas Hunger Date: Thu Feb 26 14:32:12 2004 +0000 added functions to describe the new backends, added text_extents function doc/reference/doc.xml | 12 +++++ doc/reference/xml/cairo_set_target_drawable.xml | 45 +++++++++++++++++ doc/reference/xml/cairo_set_target_png.xml | 51 ++++++++++++++++++++ doc/reference/xml/cairo_set_target_ps.xml | 52 ++++++++++++++++++++ doc/reference/xml/cairo_set_target_surface.xml | 2 +- doc/reference/xml/cairo_set_target_xcb.xml | 58 +++++++++++++++++++++++ doc/reference/xml/cairo_text_extents.xml | 47 ++++++++++++++++++ doc/reference/xml/cairo_text_extents_t.xml | 29 +++++++++++ 8 files changed, 295 insertions(+), 1 deletions(-) commit 02329029583bbc481b76ff3ce149c2bbec1bc096 Author: Carl Worth Date: Thu Feb 26 08:55:03 2004 +0000 Fix typo ChangeLog | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 529b16f119fb2c203a10c1d46c3810fd177da2fc Author: Carl Worth Date: Thu Feb 26 08:54:42 2004 +0000 Add Jordi and Olvier to the AUTHORS file. Fix broken return value for nchars (thanks to Jordi Mas ). AUTHORS | 2 ++ ChangeLog | 7 +++++++ TODO | 6 +++--- src/cairo-ft-font.c | 2 +- src/cairo_ft_font.c | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) commit bd5c27207aaa89ac4c55c55006f6253006c2a8b8 Author: Olivier Andrieu Date: Tue Feb 24 12:39:29 2004 +0000 forgot the SUBST for PNG_REQUIRES configure.in | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 995097752e18dffbbbdf4c80d29efb02e1bfdecf Author: Olivier Andrieu Date: Tue Feb 24 12:29:25 2004 +0000 PNG backend ChangeLog | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit 3b85dd1f9da71f886e48cb4cbe5a4edd0c9e6024 Author: Olivier Andrieu Date: Tue Feb 24 12:28:49 2004 +0000 Add PNG backend (cairo_set_target_png and cairo_png_surface_create). src/cairo-features.h.in | 2 + src/cairo.h | 25 ++++ src/cairo_png_surface.c | 314 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 341 insertions(+), 0 deletions(-) commit 0a07e28683ef94f393fbc20aedf6d21bd58c9aa9 Author: Olivier Andrieu Date: Tue Feb 24 12:27:52 2004 +0000 autoconf support for the PNG backend. Bump version to 0.1.19. cairo.pc.in | 2 +- configure.in | 22 +++++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) commit 13911e3d67f272920fa0a66ec6dcb8f910f771cd Author: Olivier Andrieu Date: Tue Feb 24 12:27:13 2004 +0000 PNG backend support, removed references to X_LIBS and X_CFLAGS. src/Makefile.am | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) commit cf069c127a5721f15876485c717a45f5e1d9f4e1 Author: Carl Worth Date: Tue Feb 24 12:22:56 2004 +0000 Fix email address for Anders Carlsson. pixman/AUTHORS | 2 +- pixman/ChangeLog | 1 + 2 files changed, 2 insertions(+), 1 deletions(-) commit 0e02e71cf54331aa54eee2d39433be117bae1b7d Author: Carl Worth Date: Tue Feb 24 10:45:26 2004 +0000 Add attribution for many people who have made generous contributions to cairo. This list was generated by sifting through the ChangeLog. Please let me know if I have missed anyone. Add some historical notes on cairo development, prior to when we began to maintain this NEWS file. Add pointer to cairographics.org. Fix to use cairo rather than Cairo when not at the beginning of a sentence. Remove cairo_current_path, cairo_current_path_flat, cairo_text_extents, cairo_glyph_extents, cairo_text_path, and cairo_glyph_path from the TODO list as they have all been implemented now. AUTHORS | 16 +++++++++++++++- ChangeLog | 18 ++++++++++++++++++ NEWS | 35 ++++++++++++++++++++++++++++++++++- README | 3 ++- TODO | 5 +---- 5 files changed, 70 insertions(+), 7 deletions(-) commit 431548c3d8a998d9b8b5615469b500d3e11edc06 Author: Carl Worth Date: Tue Feb 24 10:41:11 2004 +0000 Added attribution for several authors after sifting through the ChangeLog. pixman/AUTHORS | 24 ++++++++++++++++-------- pixman/ChangeLog | 5 +++++ 2 files changed, 21 insertions(+), 8 deletions(-) commit faa43926612d6edcdf6caf895399a459cf55f72e Author: Thomas Hunger Date: Tue Feb 24 07:18:45 2004 +0000 applied patch from Ravindra fixing missing lines in doc.xml doc/reference/doc.xml | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 554726563f67d3a8428b03e2af41f4a88baffc5e Author: Thomas Hunger Date: Fri Feb 20 14:23:17 2004 +0000 added missing xml/cairo_set_target_image.xml doc/reference/xml/cairo_arc.xml | 4 +- doc/reference/xml/cairo_arc_negative.xml | 4 +- doc/reference/xml/cairo_current_font.xml | 4 +- doc/reference/xml/cairo_current_font_extents.xml | 2 +- doc/reference/xml/cairo_curve_to.xml | 2 +- doc/reference/xml/cairo_rectangle.xml | 4 +- doc/reference/xml/cairo_rel_curve_to.xml | 10 ++-- doc/reference/xml/cairo_set_font.xml | 4 +- doc/reference/xml/cairo_set_target_image.xml | 58 ++++++++++++++++++++++ doc/reference/xml/cairo_set_target_surface.xml | 2 +- doc/reference/xml/cairo_show_glyphs.xml | 2 +- doc/reference/xml/cairo_show_text.xml | 2 +- doc/reference/xml/cairo_transform_font.xml | 2 +- 13 files changed, 79 insertions(+), 21 deletions(-) commit c3fe1bbe33f65b28cc6fdcc3945a77a6cd233c3f Author: Carl Worth Date: Tue Feb 17 18:47:34 2004 +0000 Add comment indication cairo_copy will be going away at some point. Some indentation fixes. ChangeLog | 3 +++ src/cairo.h | 6 +++--- 2 files changed, 6 insertions(+), 3 deletions(-) commit 122b2d850459b3acfcd5194018bd78da1dde14b7 Author: Carl Worth Date: Tue Feb 17 18:38:23 2004 +0000 Bump version to 0.1.18. Includes new functions cairo_current_path, cairo_current_path_flat, cairo_surface_get_filter. Support for XCB backend. Fixes for building in cygwin. Adds cairo_surface_get_filter. Add new path query functions. Implement support for cairo_current_path and cairo_current_path_flat. These functions just provide an interface to _cairo_path_interpret and take care of mapping from device space back to user space. ChangeLog | 20 +++++++ configure.in | 2 +- src/cairo-gstate.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.c | 37 +++++++++++++ src/cairo.h | 25 ++++++++- src/cairo_gstate.c | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 8 +++ 7 files changed, 392 insertions(+), 4 deletions(-) commit 9349c95f28f574747ec24b010f9a9e40327dc466 Author: Carl Worth Date: Fri Feb 13 06:13:19 2004 +0000 Add some notes from JG's TODO list on the wiki: http://cairographics.org/CairoToDoList. (Also testing automated mailing to cairo-commit list). ChangeLog | 6 ++++++ TODO | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletions(-) commit b55f1076793229d182463100ed9de2a68dd3c77b Author: Carl Worth Date: Thu Feb 12 19:02:33 2004 +0000 Add typedefs for new callbacks to be used by cairo_current_path: cairo_move_to_func, cairo_line_to_func, cairo_curve_to_func, and cairo_close_path_func. cairo_path.last_move_point and cairo_path.current_point are now fixed-point not doubles for consistency. Now accept 4 explicit function pointers rather than a structure. Eliminate unnecessary done_path callback. Track change in _cairo_path_interpret. Code previously in done_path callback is now here immediately after call to _cairo_path_interpret. Internal _cairo_path API modified to accept fixed-point data everywhere. Much cleaner this way. Have to convert doubles to fixed-point to track changes in _cairo_path API. Keep data in fixed-point rather than going through intermediate doubles. Track changes in _cairo_path API. New function to help when working with freetype. ChangeLog | 47 ++++++++++++++++++++ src/cairo-fixed.c | 7 +++ src/cairo-ft-font.c | 56 ++++++++++++++++-------- src/cairo-gstate.c | 88 +++++++++++++++++++++++++++++-------- src/cairo-path-bounds.c | 23 +++------- src/cairo-path-fill.c | 58 ++++++++---------------- src/cairo-path-stroke.c | 107 ++++++++++++++++++++------------------------- src/cairo-path.c | 111 +++++++++++++++++++++-------------------------- src/cairo-traps.c | 2 +- src/cairo.h | 13 ++++++ src/cairo_fixed.c | 7 +++ src/cairo_ft_font.c | 56 ++++++++++++++++-------- src/cairo_gstate.c | 88 +++++++++++++++++++++++++++++-------- src/cairo_path.c | 111 +++++++++++++++++++++-------------------------- src/cairo_path_bounds.c | 23 +++------- src/cairo_path_fill.c | 58 ++++++++---------------- src/cairo_path_stroke.c | 107 ++++++++++++++++++++------------------------- src/cairo_traps.c | 2 +- src/cairoint.h | 63 ++++++++++++++++----------- 19 files changed, 573 insertions(+), 454 deletions(-) commit 810037bc7c7707337fb1e7682b36651f6a7c4e04 Author: Jamey Sharp Date: Mon Feb 2 23:24:14 2004 +0000 Ported the Xlib surface backend to XCB. ChangeLog | 9 + configure.in | 19 ++ src/Makefile.am | 9 +- src/cairo-features.h.in | 2 + src/cairo-xcb-surface.c | 776 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 13 + src/cairo_xcb_surface.c | 776 +++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 1602 insertions(+), 2 deletions(-) commit 34e0e7eec8a1a8434c5ad52fb754f2bbaf224ced Author: Graydon Hoare Date: Mon Feb 2 11:20:44 2004 +0000 New predicate. (_cairo_xlib_surface_set_filter): Skip filterless servers. (_cairo_xlib_surface_clone_similar): Fix typo. ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 8 +++++--- src/cairo_xlib_surface.c | 8 +++++--- 3 files changed, 17 insertions(+), 6 deletions(-) commit b66bbf48790238174efd1491bfcd8c0d77f43f13 Author: Graydon Hoare Date: Fri Jan 30 14:44:18 2004 +0000 New "filter" field. New function. (cairo_surface_set_filter): Store filter in surface. Declare. Copy filter setting. (_cairo_xlib_surface_set_filter): Use constants from Xrender.h ChangeLog | 11 +++++++++++ src/cairo-surface.c | 7 +++++++ src/cairo-xlib-surface.c | 18 ++++++++---------- src/cairo.h | 3 +++ src/cairo_surface.c | 7 +++++++ src/cairo_xlib_surface.c | 18 ++++++++---------- src/cairoint.h | 1 + 7 files changed, 45 insertions(+), 20 deletions(-) commit 62520eb2d15808934c0e76dc8f4fe02b01b11e64 Author: Carl Worth Date: Sat Jan 24 01:56:26 2004 +0000 Fix to use tessellate_polygon instead of tessellate_rectangle as the matrix may have skewed the coordinates into a non-rectangular shape. ChangeLog | 5 +++++ src/cairo-path-stroke.c | 25 +++++++++++++++++++------ src/cairo_path_stroke.c | 25 +++++++++++++++++++------ 3 files changed, 43 insertions(+), 12 deletions(-) commit f1d98d27a65ec2c7e04a018e69aee44e1d525ed7 Author: Carl Worth Date: Sat Jan 24 01:50:55 2004 +0000 Remove dead-code (useless n++). pixman/ChangeLog | 5 +++++ pixman/src/iccompose.c | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) commit f05248faefe3d3c2e4445faf373f826ded496b8b Author: Carl Worth Date: Sat Jan 24 01:46:20 2004 +0000 Add missing break statements to switch. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 6 ++++++ src/cairo_xlib_surface.c | 6 ++++++ 3 files changed, 17 insertions(+), 0 deletions(-) commit 6d465f4e439f2b01214618040af7a5cf7e230c2a Author: Thomas Hunger Date: Fri Jan 23 14:13:20 2004 +0000 added and updated documentation concerning text handling doc/reference/doc.xml | 4 + doc/reference/xml/cairo_arc.xml | 40 ++++++++++++ doc/reference/xml/cairo_arc_negative.xml | 40 ++++++++++++ doc/reference/xml/cairo_current_font.xml | 37 +++++++++++ doc/reference/xml/cairo_current_font_extents.xml | 40 ++++++++++++ doc/reference/xml/cairo_curve_to.xml | 70 ++++++++++++++++++++++ doc/reference/xml/cairo_operator_t.xml | 54 ++++------------ doc/reference/xml/cairo_rectangle.xml | 47 +++++++++++++++ doc/reference/xml/cairo_rel_curve_to.xml | 70 ++++++++++++++++++++++ doc/reference/xml/cairo_select_font.xml | 18 +++++- doc/reference/xml/cairo_set_font.xml | 40 ++++++++++++ doc/reference/xml/cairo_show_glyphs.xml | 46 ++++++++++++++ doc/reference/xml/cairo_show_text.xml | 4 +- doc/reference/xml/cairo_transform_font.xml | 41 +++++++++++++ 14 files changed, 506 insertions(+), 45 deletions(-) commit 077fcb36da9d7edf8f7689ca913abce2c311925f Author: Richard Worth Date: Thu Jan 22 21:05:08 2004 +0000 Add '-no-undefined' to end of libpixman_la_LDFLAGS tp enable building shared libary under cygwin. Remove all 'extern ' and ' __external_linkage' (macro for __declspec(dllexport) and __declspec(dllimport)) from function declarations. These are no longer needed for cygwin. pixman/ChangeLog | 10 ++++ pixman/src/Makefile.am | 2 +- pixman/src/pixman.h | 107 +++++++++++++++++++++--------------------------- 3 files changed, 58 insertions(+), 61 deletions(-) commit 5c490d216050fc5261811805d81dc5de98004794 Author: Richard Worth Date: Thu Jan 22 20:47:24 2004 +0000 Add '-no-undefined' to end of libcairo_la_LDFLAGS to enable building shared library under cygwin. Remove all 'extern ' and ' __external_linkage' (macro for __declspec(dllexport) and __declspec(dllimport)) from function declarations. These are no longer needed for cygwin. Changed type of _line_segs_intersect_ceil from 'static cairo_fixed_t' to 'static int' to match definition. This was necessary to compile under cygwin. ChangeLog | 14 +++ src/Makefile.am | 2 +- src/cairo-traps.c | 2 +- src/cairo.h | 249 +++++++++++++++++++++++++---------------------------- src/cairo_traps.c | 2 +- 5 files changed, 135 insertions(+), 134 deletions(-) commit 22792e2e7a118c7ef97f89617a5932e412453fe4 Author: Carl Worth Date: Wed Dec 17 13:17:13 2003 +0000 Remove trailing commas from enum, (some compilers like to complain about this). pixman/ChangeLog | 5 +++++ pixman/src/pixman.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit decf8b395cc277d60267c75e3685ac4ead731d63 Author: Carl Worth Date: Wed Dec 17 12:59:37 2003 +0000 Remove trailing commas from enums, (some compilers like to complain about them). ChangeLog | 5 +++++ README | 13 ++++++------- src/cairo.h | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) commit 2eb2408ca786fab6234239d4ade689af8589ac1b Author: Dave Beckett Date: Tue Dec 16 09:42:19 2003 +0000 Replace requiring libpixregion, libic with libpixman. ChangeLog | 4 ++++ README | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) commit 75a7541cf1a8456780dbf446624a2a751fc24346 Author: Carl Worth Date: Tue Dec 16 08:29:01 2003 +0000 Fix typo NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit aa7c663ea844b8caf230b428ee593e785172d66d Author: Carl Worth Date: Tue Dec 16 08:27:17 2003 +0000 Add more notes culled from the ChangeLog. ChangeLog | 4 ++++ NEWS | 35 ++++++++++++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) commit a194d9ecd43e164e93899bad9ce82b63cd8712c7 Author: Carl Worth Date: Tue Dec 16 08:06:49 2003 +0000 Begin maintaining NEWS file. Add notes on 0.1.17. ChangeLog | 2 ++ NEWS | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) commit fb93261e3739fd15f8001c8d3631c4baabf3482c Author: Carl Worth Date: Tue Dec 16 07:20:20 2003 +0000 Bump version to 0.1.17 for new functions: cairo_text_extents, cairo_glyph_extents, cairo_text_path, cairo_glyph_path. Re-enable cairo_text_path and cairo_glyph_path. Add missing transformation. Initial implementation of glyph_path. ChangeLog | 19 +++++++++ configure.in | 2 +- src/cairo-ft-font.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++----- src/cairo-gstate.c | 10 ++++- src/cairo.c | 3 - src/cairo.h | 8 +--- src/cairo_ft_font.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++----- src/cairo_gstate.c | 10 ++++- src/cairoint.h | 3 +- 9 files changed, 236 insertions(+), 37 deletions(-) commit bf40046a4ea5c92de6afbf8b77ba0610ff8c05ba Author: Carl Worth Date: Tue Dec 16 07:10:48 2003 +0000 Move all current_point state fields from cairo_gstate_t to cairo_path_t. Add current_point state. (_cairo_path_current_point): New function. (_cairo_path_rel_move_to): (_cairo_path_rel_line_to): (_cairo_path_rel_curve_to): New functions. Eliminate current_point state. (_cairo_gstate_show_text): (_cairo_gstate_text_path): Use new _cairo_path_current_point. ChangeLog | 31 ++++++++++++ src/cairo-gstate.c | 130 ++++++++-------------------------------------------- src/cairo-path.c | 110 ++++++++++++++++++++++++++++++++++++++++++-- src/cairo_gstate.c | 130 ++++++++-------------------------------------------- src/cairo_path.c | 110 ++++++++++++++++++++++++++++++++++++++++++-- src/cairoint.h | 23 ++++++++-- 6 files changed, 302 insertions(+), 232 deletions(-) commit b5983fab84409209c4af6bdd7cd5bdcf8cc7bb93 Author: Carl Worth Date: Tue Dec 16 06:58:10 2003 +0000 A couple of changes missed in the last batch of commits (reordering so that path is final argument). ChangeLog | 4 ++++ src/cairo-ft-font.c | 12 ++++++------ src/cairo_ft_font.c | 12 ++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) commit 368b4d269b48f19af5ba0d01613356f3bfa5e982 Author: Carl Worth Date: Tue Dec 16 06:50:37 2003 +0000 Change cairo_font_backend_t to use a void * for the abstract font. Put create, copy, and destroy as the first functions in the list. Fix text_path and glyph_path so that the path to be returned is the last argument. Add x,y arguments to text_path. Compute x,y now needed by cairo_font_text_path. (_cairo_gstate_glyph_path): Track change in cairo_font_text/glyph_path (path argument is now last). Switch to new macro-based mechanism for including freetype headers. (cairo_ft_font_face): (cairo_ft_font_pattern): Minor cleanup. (_cairo_ft_font_copy): (_cairo_ft_font_destroy): (_utf8_to_glyphs): (_cairo_ft_font_font_extents): (_cairo_ft_font_glyph_extents): (_cairo_ft_font_text_extents): (_cairo_ft_font_show_glyphs): (_cairo_ft_font_show_text): Track changes to cairo_font_backend_t interface. Track changes to cairo_font_backend_t interface. ChangeLog | 31 +++++++++++ src/cairo-font.c | 15 +++--- src/cairo-ft-font.c | 148 ++++++++++++++++++++++++++------------------------- src/cairo-gstate.c | 30 +++++++++-- src/cairo_font.c | 15 +++--- src/cairo_ft_font.c | 148 ++++++++++++++++++++++++++------------------------- src/cairo_gstate.c | 30 +++++++++-- src/cairoint.h | 90 ++++++++++++++++--------------- 8 files changed, 295 insertions(+), 212 deletions(-) commit c18a81e25259100c28c384333578fa6ce1374d21 Author: Carl Worth Date: Tue Dec 16 06:15:53 2003 +0000 Change instances of Cairo to cairo where necessary. Add note about broken dashing on splines. ChangeLog | 5 ++++ TODO | 64 +++++++++++++++++++++++++++++++----------------------------- 2 files changed, 38 insertions(+), 31 deletions(-) commit dea75c833335f05230bb0c3d252553ce369909eb Author: Carl Worth Date: Mon Dec 15 19:00:15 2003 +0000 Rename cairo_text_exextents_t fields: left_side_bearing -> x_bearing ascent -> y_bearing right_side_bearing (replaced by) width descent (replaced by) height ChangeLog | 12 ++++++++++++ src/cairo-ft-font.c | 16 ++++++++-------- src/cairo-gstate.c | 16 ++++++++-------- src/cairo.h | 8 ++++---- src/cairo_ft_font.c | 16 ++++++++-------- src/cairo_gstate.c | 16 ++++++++-------- 6 files changed, 48 insertions(+), 36 deletions(-) commit 39bb4f1d99a23c8668fd73f4616f8811b9db1f4b Author: Carl Worth Date: Mon Dec 15 18:26:51 2003 +0000 Need to divide out the scale factor to return user-space extents. (_cairo_gstate_glyph_extents): Don't transform glyph locations as they're not relevant to extents. Clean up implementation. (_cairo_ft_font_glyph_extents): Initial implementation. Thanks to John Ellson for most of the work on this function. (_cairo_ft_font_show_text): Clean to use num_glyphs not nglyphs. Re-enable cairo_text/glyph_extents. ChangeLog | 19 ++++++++++ src/cairo-ft-font.c | 98 +++++++++++++++++++++++++++++++++++++++++---------- src/cairo-gstate.c | 45 +++++++++++++---------- src/cairo.c | 2 - src/cairo.h | 5 +-- src/cairo_ft_font.c | 98 +++++++++++++++++++++++++++++++++++++++++---------- src/cairo_gstate.c | 45 +++++++++++++---------- src/cairoint.h | 3 ++ 8 files changed, 232 insertions(+), 83 deletions(-) commit 9d4fe7e36990e39f849b0983daff6bf0b690458a Author: Carl Worth Date: Mon Dec 15 18:02:03 2003 +0000 Move this function from cairo_ft_font.c (_get_scale_factors). ChangeLog | 3 +++ src/cairo-ft-font.c | 18 ++---------------- src/cairo-matrix.c | 19 +++++++++++++++++++ src/cairo_ft_font.c | 18 ++---------------- src/cairo_matrix.c | 19 +++++++++++++++++++ 5 files changed, 45 insertions(+), 32 deletions(-) commit 0095dcb49d5a10f8ab62aeff1809587250a09575 Author: Carl Worth Date: Mon Dec 15 17:26:25 2003 +0000 Fix minor errors in fixed/floating-point conversion. ChangeLog | 3 +++ src/cairo-ft-font.c | 10 ++++------ src/cairo_ft_font.c | 10 ++++------ 3 files changed, 11 insertions(+), 12 deletions(-) commit 1cd1330aa3967fb57a646a60e4fcb478c631cda6 Author: Carl Worth Date: Mon Dec 15 14:20:56 2003 +0000 font->show_glyphs no longer accepts an offset point. _utf8_to_glyphs now accepts a point by which each glyph should be offset. (cairo_ft_font_backend): Remove evil void * casts on function pointers. Fix to not require a current point. Move initialization of current device-space point from setup_text_rendering_context to _cairo_gstate_show_text. (_cairo_gstate_show_glyphs): Fix to not reference current point. ChangeLog | 22 ++++++++++++++++++++++ src/cairo-font.c | 4 +--- src/cairo-ft-font.c | 40 ++++++++++++++++++++-------------------- src/cairo-gstate.c | 34 ++++++++++++++++------------------ src/cairo_font.c | 4 +--- src/cairo_ft_font.c | 40 ++++++++++++++++++++-------------------- src/cairo_gstate.c | 34 ++++++++++++++++------------------ src/cairoint.h | 4 ---- 8 files changed, 96 insertions(+), 86 deletions(-) commit 8b00a61e8b2f6dbbe7e19a40959fada69469106c Author: Dave Beckett Date: Fri Dec 12 16:00:19 2003 +0000 Add compatibility defines FONTCONFIG_LIBS, X_LIBS, XRENDER_LIBS to keep automake happy - they look like automake variable names. ChangeLog | 6 ++++++ src/Makefile.am | 8 ++++++++ 2 files changed, 14 insertions(+), 0 deletions(-) commit b694e4d1ffa480c0ec151a3030eb2dfca63b5b93 Author: Dave Beckett Date: Fri Dec 12 15:11:23 2003 +0000 (libpixman_la_SOURCES): slim_export.h slim_import.h gone. pixman/ChangeLog | 1 + pixman/src/Makefile.am | 2 -- 2 files changed, 1 insertions(+), 2 deletions(-) commit d9febe2fb4e14efefb4463a74bb9e6758c8cccfc Author: Dave Beckett Date: Fri Dec 12 15:10:12 2003 +0000 src/Makefile.am: Remove LIBPIXMAN_CFLAGS/LIBS cruft. pixman/ChangeLog | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 09abb6df40522318f106a0d612fa2b7c98ddca8c Author: Dave Beckett Date: Fri Dec 12 15:09:55 2003 +0000 Remove LIBPIXMAN_CFLAGS/LIBS cruft. pixman/src/Makefile.am | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) commit 2309a8b98ace453aabcc955df369ca19bc3f4f54 Author: Carl Worth Date: Fri Dec 12 12:00:50 2003 +0000 Add comment about building in a font. Check for NULL return value from cairo_ft_font_create. ChangeLog | 6 ++++++ src/cairo-font.c | 6 ++++++ src/cairo-ft-font.c | 3 +++ src/cairo_font.c | 6 ++++++ src/cairo_ft_font.c | 3 +++ 5 files changed, 24 insertions(+), 0 deletions(-) commit e232072c12d5bd4bc1d093658428007e47114a2e Author: Carl Worth Date: Fri Dec 12 11:44:16 2003 +0000 Add conditionals for ps_surface functions, etc. Get rid of AC_PATH_XTRA. Instead, find X includes/libraries only via pkg-config xrender. Switch option from --without-x to --disable-xlib Add option --disable-ps Add -lz only if ps_surface backend is compiled. ChangeLog | 12 ++++++++++++ cairo.pc.in | 2 +- configure.in | 28 +++++++++++++++++++++++----- src/Makefile.am | 8 +++++--- src/cairo-features.h.in | 2 ++ src/cairo.h | 10 ++++++++++ 6 files changed, 53 insertions(+), 9 deletions(-) commit a02d8aaa595b4893f9b25715c0bd5fbc8ee7b3c8 Author: Carl Worth Date: Fri Dec 12 11:02:07 2003 +0000 Add missing definitions from slim_import.h. ChangeLog | 5 +++++ src/cairo.h | 10 +++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) commit 47000a1737c02fc2cebcdfbefb9eb505f8824341 Author: Carl Worth Date: Fri Dec 12 10:51:21 2003 +0000 Updated .cvsignore pixman/.cvsignore | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 0278468fc1f68bc40348a3a387baa72dca357256 Author: Carl Worth Date: Fri Dec 12 10:47:59 2003 +0000 Fold contents of slim_export/import.h directly into this file to avoid dependence on external slim package. Use quote-based include now that slim_internal is an internal file. Follow convention of other files for multi-inclusion guard (_IC_INT_H_) Remove cruft. pixman/ChangeLog | 15 ++++++++++++ pixman/configure.in | 8 ------ pixman/src/icint.h | 8 +++--- pixman/src/pixman.h | 13 +++++++--- pixman/src/pixregion.c | 2 +- pixman/src/slim_export.h | 54 ---------------------------------------------- pixman/src/slim_import.h | 53 --------------------------------------------- 7 files changed, 29 insertions(+), 124 deletions(-) commit 849c780a63ecb0733f0cbe5cc90f2e9a1b77b7f7 Author: Carl Worth Date: Thu Dec 11 13:04:39 2003 +0000 Rename surface->ic_image to surface->pixman_image. Rename functions and indentifiers with ic_ in the name that were missed by the recent renaming. Fix indentation problems left by the recent renaming. Shift everything over from libic/libpixregion/slim to libpixman. Many thanks to Dave Beckett for all of the heavy lifting with this renaming effort. ChangeLog | 24 +++++++ src/cairo-image-surface.c | 160 ++++++++++++++++++++++---------------------- src/cairo_image_surface.c | 160 ++++++++++++++++++++++---------------------- src/cairoint.h | 2 +- 4 files changed, 185 insertions(+), 161 deletions(-) commit 5b38b14ff2bf8cfc74f5f14339d3aeff0d01a769 Author: Carl Worth Date: Thu Dec 11 12:43:58 2003 +0000 Directly fold in slim stuff rather than depending on it from an external package. Switch from libic to libpixman. Include pixman.h not ic.h. (__external_linkage): Directly fold in slim stuff rather than depending on it from an external package. Look for libpixman instead of libic and slim. ChangeLog | 16 ++++++ cairo.pc.in | 2 +- configure.in | 2 +- src/Makefile.am | 2 +- src/cairo-image-surface.c | 120 ++++++++++++++++++++++---------------------- src/cairo-ps-surface.c | 2 +- src/cairo.h | 15 +++--- src/cairo_image_surface.c | 120 ++++++++++++++++++++++---------------------- src/cairo_ps_surface.c | 2 +- src/cairoint.h | 30 ++++++++++- 10 files changed, 177 insertions(+), 134 deletions(-) commit 18ae004832b6bf3d12a8ee4e9199bc847a46031f Author: Andrew Chant Date: Thu Dec 11 11:12:59 2003 +0000 cairo_select_font: _cairo_font_create: _cairo_gstate_select_font: cairo_ft_font_create: change char * family to const char * family ChangeLog | 8 ++++++++ src/cairo-font.c | 2 +- src/cairo-ft-font.c | 2 +- src/cairo-gstate.c | 2 +- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairo_font.c | 2 +- src/cairo_ft_font.c | 2 +- src/cairo_gstate.c | 2 +- src/cairoint.h | 4 ++-- 10 files changed, 18 insertions(+), 10 deletions(-) commit c2696a7d8d6158345f0d386b8aa90c4634a7e254 Author: Carl Worth Date: Thu Dec 11 10:01:10 2003 +0000 Replace mysterious image->depth == 32 ? 24 : image->depth with simply image->depth. ChangeLog | 6 ++++++ src/cairo-xlib-surface.c | 2 +- src/cairo_xlib_surface.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 6cd6ac5a0572666990c6db9492ddf9fc0579a71a Author: Carl Worth Date: Thu Dec 11 09:35:07 2003 +0000 Add xrender to cairo.pc Renders line if needed. ChangeLog | 5 +++++ cairo.pc.in | 2 +- configure.in | 2 ++ 3 files changed, 8 insertions(+), 1 deletions(-) commit b95d2066a56f656df0a1be5fe32115a186d4e46a Author: Carl Worth Date: Thu Dec 11 07:03:41 2003 +0000 Fix to use shifts and masks for endianness-correct PS image generation. Rename bgr to rgb now that the byte order issues are clear. ChangeLog | 7 +++++++ src/cairo-ps-surface.c | 27 +++++++++++++-------------- src/cairo_ps_surface.c | 27 +++++++++++++-------------- 3 files changed, 33 insertions(+), 28 deletions(-) commit 9da5af44f4e999cf4394e114cdb799bb4dd054ad Author: Dave Beckett Date: Wed Dec 10 15:42:01 2003 +0000 Correct some more renames where the order of the renaming caused later renames to fail due to earlier prefixes failing. pixman/ChangeLog | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit b24029f4d05b2ba6951f0442dc68033f9727bda4 Author: Dave Beckett Date: Wed Dec 10 15:41:14 2003 +0000 fixes for wrong order of renames pixman/update.pl | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit af1ab1a9f25bf7465ae5d4addcfa99a82bddd5e0 Author: Dave Beckett Date: Wed Dec 10 15:39:45 2003 +0000 Correct some more renames where the order of the renaming caused later renames to fail due to earlier prefixes failing. pixman/src/ic.c | 2 +- pixman/src/icformat.c | 12 ++++++------ pixman/src/icimage.c | 4 ++-- pixman/src/ictrap.c | 2 +- pixman/src/ictri.c | 6 +++--- pixman/src/pixman.h | 20 ++++++++++---------- pixman/src/pixregion.c | 12 ++++++------ 7 files changed, 29 insertions(+), 29 deletions(-) commit 4409b9fff97a34256c70de0c579d279557cd6017 Author: Dave Beckett Date: Wed Dec 10 15:27:11 2003 +0000 Add rename fixes pixman/update.pl | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) commit 22b133453dbf54ada09399535b632b2e66f97e73 Author: Dave Beckett Date: Wed Dec 10 15:25:38 2003 +0000 Correct over-eager renames of the form pixman_thing_tName into pixman_thing_name. It was inevitable really this would happen! pixman/ChangeLog | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 4ecffdf8b9d7cf0a9bbd46d140d8b552957ee485 Author: Dave Beckett Date: Wed Dec 10 15:23:11 2003 +0000 Correct over-eager renames of the form pixman_thing_tName into pixman_thing_name. It was inevitable really this would happen! pixman/src/iccolor.c | 4 +- pixman/src/iccompose.c | 4 +- pixman/src/icformat.c | 24 +++++----- pixman/src/icimage.c | 48 +++++++++--------- pixman/src/icimage.h | 4 +- pixman/src/icint.h | 16 +++--- pixman/src/icpixels.c | 8 ++-- pixman/src/icrect.c | 10 ++-- pixman/src/ictransform.c | 2 +- pixman/src/ictrap.c | 32 ++++++------ pixman/src/ictri.c | 42 ++++++++-------- pixman/src/pixman.h | 34 +++++++------- pixman/src/pixregion.c | 116 ++++++++++++++++++++++---------------------- pixman/src/pixregionint.h | 4 +- 14 files changed, 174 insertions(+), 174 deletions(-) commit 0070bd372cdc8c2383c78e1d0f90552f9167526b Author: Dave Beckett Date: Wed Dec 10 14:28:55 2003 +0000 Added helper script for updating names in source. pixman/ChangeLog | 2 + pixman/update.pl | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 0 deletions(-) commit c2d04cfb0b83ddc90f8fce58c53228abf4ca6d9f Author: Dave Beckett Date: Wed Dec 10 14:26:22 2003 +0000 Rename exported Ic* and PixRegion* functions, types, enums to be prefixed pixman (or PIXMAN for enum values) pixman/ChangeLog | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 94988dbe09e93e0de0ee1706b8f2e1caf79b5238 Author: Dave Beckett Date: Wed Dec 10 14:20:05 2003 +0000 Rename exported Ic* and PixRegion* functions, types, enums to be prefixed pixman (or PIXMAN for enum values) pixman/src/ic.c | 190 ++++++------ pixman/src/icblt.c | 74 +++--- pixman/src/icbltone.c | 42 ++-- pixman/src/iccolor.c | 14 +- pixman/src/iccompose.c | 714 +++++++++++++++++++++--------------------- pixman/src/icformat.c | 40 ++-- pixman/src/icimage.c | 156 +++++----- pixman/src/icimage.h | 110 ++++---- pixman/src/icint.h | 290 +++++++++--------- pixman/src/icpixels.c | 20 +- pixman/src/icrect.c | 64 ++-- pixman/src/icrop.h | 22 +- pixman/src/icstipple.c | 6 +- pixman/src/ictransform.c | 6 +- pixman/src/ictrap.c | 82 +++--- pixman/src/ictri.c | 110 ++++---- pixman/src/icutil.c | 28 +- pixman/src/pixman.h | 332 ++++++++++---------- pixman/src/pixregion.c | 770 ++++++++++++++++++++++---------------------- pixman/src/pixregionint.h | 26 +- 20 files changed, 1548 insertions(+), 1548 deletions(-) commit e39e756403b44bd77aa89f17b1241249565431e2 Author: Dave Beckett Date: Wed Dec 10 14:04:15 2003 +0000 libpixman is the pixel manipulation library pixman/ChangeLog | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2841a7184299882c45f8364fb6c0798ffdb00471 Author: Dave Beckett Date: Wed Dec 10 13:29:40 2003 +0000 libpixman is the pixel manipulation library pixman/README | 6 +++--- pixman/libpixman.pc.in | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) commit 05bcf7a4b50f7c711ab66971912d0d752a59fcd6 Author: Dave Beckett Date: Tue Dec 9 16:10:29 2003 +0000 Initial version with the following changes to do the merging: Change ic.h/pixregion.h headers inclusions to be pixman.h Removed ic.h, merged into pixman.h Merged pixregion.h (former name and CVS history of this file) and ic.h (now CVS deleted here). Updated for libpixregion,libic to libpixman source merges. Added -I$(srcdir) so we get internal headers from here even when srcdir != builddir. Updated for libpixregion,libic to libpixman package name, dependencies. Merge of libic, slim AUTHORS, COPYING, README Initial repository copy of libpixregion, libic, slim CVS. Constructed a merged ChangeLog below via emacs VC mode (which rocks!) pixman/ChangeLog | 351 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 351 insertions(+), 0 deletions(-) commit 7ba9ad29733e25399bf6f70232ce97f065d43d91 Author: Dave Beckett Date: Tue Dec 9 16:09:33 2003 +0000 Change ic.h/pixregion.h headers inclusions to be pixman.h pixman/src/icint.h | 4 ++-- pixman/src/pixregionint.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit b76a5ccf7f78b68ff7eeea84af7930e09854581b Author: Dave Beckett Date: Tue Dec 9 16:08:36 2003 +0000 Removed ic.h, merged into pixman.h pixman/src/ic.h | 304 ------------------------------------------------------- 1 files changed, 0 insertions(+), 304 deletions(-) commit 08e0943c9f175df5647258937977fc584cb15a94 Author: Dave Beckett Date: Tue Dec 9 16:08:16 2003 +0000 Merged pixregion.h (former name and CVS history of this file) and ic.h (now CVS deleted here). pixman/src/pixman.h | 309 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 304 insertions(+), 5 deletions(-) commit 9b086c333057d824aabcc7af1a66fa707152835c Author: Dave Beckett Date: Tue Dec 9 16:06:52 2003 +0000 Updated for libpixregion,libic to libpixman source merges. Added -I$(srcdir) so we get internal headers from here even when srcdir != builddir. pixman/src/Makefile.am | 36 ++++++++++++++++++++++++++++-------- 1 files changed, 28 insertions(+), 8 deletions(-) commit d5bcf9e4f03017c474eae8c96a673f7348c8959c Author: Dave Beckett Date: Tue Dec 9 16:05:24 2003 +0000 Updated for libpixregion,libic to libpixman package name, dependencies. pixman/Makefile.am | 7 +++++-- pixman/configure.in | 18 +++++++++--------- pixman/libpixman.pc.in | 7 +++---- 3 files changed, 17 insertions(+), 15 deletions(-) commit 43129191fe6d829cd0ebb5da9bdbbf5aac3a4b3c Author: Dave Beckett Date: Tue Dec 9 15:59:18 2003 +0000 Merge of libic, slim AUTHORS, COPYING, README pixman/AUTHORS | 6 ++++++ pixman/COPYING | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ pixman/README | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+), 0 deletions(-) commit f59f92836c610dd27c24d75fcc17bfdb4921f336 Author: Carl Worth Date: Mon Dec 8 18:07:56 2003 +0000 Allow names of all autofoo programs to be overridden via environment variables. pixman/ChangeLog.libic | 5 +++++ pixman/ChangeLog.libpixregion | 5 +++++ pixman/autogen.sh | 18 +++++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) commit 0949a86dd1cbe301c2d6ffc1aa4606d31b62cc39 Author: Carl Worth Date: Mon Dec 8 17:39:32 2003 +0000 Track change in cairo_path_callbacks interface. ChangeLog | 6 ++++++ src/cairo-path-bounds.c | 46 ++++++++++++++++++++++++++++++---------------- src/cairo_path_bounds.c | 46 ++++++++++++++++++++++++++++++---------------- 3 files changed, 66 insertions(+), 32 deletions(-) commit 08553e75b7db97a3176e40768231c88f9b8eeabd Author: Carl Worth Date: Mon Dec 8 13:38:26 2003 +0000 Clean up cairo_path_callbacks to have move_to, line_to, curve_to, abd close_path instead of add_edge, add_spline, and done_sub_path. Much, much nicer. Provide cairo_polygon_move_to and cairo_polygon_line_to instead of cairo_polygon_add_point. Track change in cairo_polygon interface. ChangeLog | 16 +++ src/cairo-path-fill.c | 101 ++++++++++++++----- src/cairo-path-stroke.c | 253 +++++++++++++++++++++++++++++------------------ src/cairo-path.c | 56 ++--------- src/cairo-pen.c | 2 +- src/cairo-polygon.c | 56 +++++------ src/cairo_path.c | 56 ++--------- src/cairo_path_fill.c | 101 ++++++++++++++----- src/cairo_path_stroke.c | 253 +++++++++++++++++++++++++++++------------------ src/cairo_pen.c | 2 +- src/cairo_polygon.c | 56 +++++------ src/cairoint.h | 22 ++--- 12 files changed, 554 insertions(+), 420 deletions(-) commit 6aff3cbf96dca64e755075add11acc7fc35d6ebd Author: Carl Worth Date: Mon Dec 8 12:31:22 2003 +0000 Bump version to 0.1.16 since it actually has a hope of building, (due to fix for broken cairo-xlib.h includes). ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 76e2cd9a743538222fe77f11e95e174fadd1b308 Author: Carl Worth Date: Fri Dec 5 10:47:42 2003 +0000 Don't include obsolete cairo-xlib.h. ChangeLog | 2 ++ src/cairo-xlib-surface.c | 1 - src/cairo_xlib_surface.c | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) commit 97666464c0a38d5904869af1c742c87c3be15067 Author: Carl Worth Date: Fri Dec 5 10:30:39 2003 +0000 Allow names of all autofoo programs to be overridden via environment variables. ChangeLog | 3 +++ autogen.sh | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) commit 928095693bff00e38b6d369ee0e7931f136f9082 Author: Carl Worth Date: Fri Dec 5 08:53:07 2003 +0000 Bump version to 0.1.15 for new CAIRO_HAS_XLIB_SURFACE macro. Add missing #include Rename cairo-config.h to cairo-features.h. Rename XLIB_BACKEND_DEFINE to XLIB_SURFACE_FEATURE. Rename AM_CONDITIONAL HAVE_XLIB_BACKEND to CAIRO_HAS_XLIB_SURFACE. Rename user-visibile macro CAIRO_HAS_XLIB_BACKEND to CAIRO_HAS_XLIB_SURFACE. ChangeLog | 14 ++++++++++++++ configure.in | 12 ++++++------ src/.cvsignore | 2 +- src/Makefile.am | 4 ++-- src/cairo-config.h.in | 33 --------------------------------- src/cairo-features.h.in | 33 +++++++++++++++++++++++++++++++++ src/cairo.h | 10 ++++++---- 7 files changed, 62 insertions(+), 46 deletions(-) commit aae17d3b6b15881f7bd8c4fac6a14a0c7b6729e6 Author: Carl Worth Date: Wed Dec 3 12:27:44 2003 +0000 Bumped version to 0.1.14 to indicate dropped cairo-xlib.h and new cairo-config.h. New support for "./configure --without-x" to compile without the xlib backend. Many thanks to Sasha V. . We do three things here: Make the pkg-config check for xrender conditional, set XLIB_BACKEND_DEFINE to either CAIRO_HAS_XLIB_BACKEND or CAIRO_HAS_NO_XLIB_BACKEND to be substituted into cairo-config.h, and set an AM_CONDITIONAL for HAVE_XLIB_BACKEND to enable conditional compilation of cairo_xlib_surface.c. Perhaps that could be simplified a tad, but it's what we have working now. Also split up various PKG_CHECK_MODULES into separate checks. Remove errant reference to cairo_gstate_set_drawable. Move xlib-specific calls in from old cairo-xlib.h, now guarded in #ifdef CAIRO_HAS_XLIB_BACKEND. Make compilation of cairo_xlib_surface.c conditional. (INCLUDES, libcairo_la_LIBADD): Add the new variables from splitting up the PKG_CHECK_MODULES calls. ChangeLog | 28 ++++++++++++++++++++ configure.in | 19 ++++++++++++- src/.cvsignore | 1 + src/Makefile.am | 14 +++++++--- src/cairo-config.h.in | 33 ++++++++++++++++++++++++ src/cairo-xlib.h | 67 ------------------------------------------------- src/cairo.h | 28 ++++++++++++++++++++ src/cairoint.h | 5 --- 8 files changed, 117 insertions(+), 78 deletions(-) commit 9cf63b0390b71693a0eb3ba2e6065f7d3f6e240c Author: Carl Worth Date: Wed Dec 3 07:14:59 2003 +0000 Add -lz for the compress function used in the PS backend. ChangeLog | 5 +++++ cairo.pc.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit ae96c8ab929513710cb11d71697759c4c3484aff Author: Keith Packard Date: Mon Dec 1 10:59:57 2003 +0000 Add note about degenerate path caps being broken ChangeLog | 5 +++++ TODO | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 3369c676f0c8a6ce1e7531250a29726b650ecfcf Author: Carl Worth Date: Tue Nov 25 07:45:34 2003 +0000 Bump version to 0.1.5 for new 64-bit fixes. One more fix needed for 64-bit machine (alpha in this case). Thanks to Jakub Bogusz . pixman/ChangeLog.libic | 8 ++++++++ pixman/src/icutil.c | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit 765a1ad0fd63abb055bb1cc2e1e2f48541cc5d81 Author: Carl Worth Date: Fri Nov 21 06:22:02 2003 +0000 Use 0 and 1 not False and True, (to avoid false dependency on X headers). Use cairo_point_double_t not XPointDouble, (to avoid false dependency on X headers). Thanks to "Sasha V." for pointing these out. ChangeLog | 10 ++++++++++ src/cairo-path-stroke.c | 2 +- src/cairo-polygon.c | 4 ++-- src/cairo_path_stroke.c | 2 +- src/cairo_polygon.c | 4 ++-- 5 files changed, 16 insertions(+), 6 deletions(-) commit 567f28e62a6d8dee7edd7357f01dd04562b3d071 Author: Carl Worth Date: Tue Nov 18 13:21:29 2003 +0000 Bump version to 0.1.13 for new freetype header compatibility. Fix comments regarding freetype version checking. ChangeLog | 6 ++++++ configure.in | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) commit a26c3d4a5925bf971dfac5be0ee492e5c7cb51a2 Author: James Henstridge Date: Tue Nov 18 07:28:16 2003 +0000 add FREETYPE_CFLAGS/LIBS to Libs/Cflags rather than requiring "freetype2", which doesn't exist in anything but the most recent version of freetype. add freetype cflags/libs substitutions. ChangeLog | 9 +++++++++ cairo.pc.in | 6 +++--- configure.in | 9 +++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) commit 97cfea914d5276bd575264827293c3dfe458e678 Author: Carl Worth Date: Tue Nov 18 06:18:05 2003 +0000 Fix build for new freetype header include mechanism, (thanks to Christof Petig ) ChangeLog | 5 +++++ src/cairo.h | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit 75ced44ae08358f1e8f64ecd1e93b69996e4b595 Author: Carl Worth Date: Mon Nov 17 07:43:06 2003 +0000 Fixes needed to compile libic on x86_64. Many thanks to David R Bacon . pixman/ChangeLog.libic | 6 ++++++ pixman/src/icrop.h | 2 +- pixman/src/icutil.c | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit f27af5d98d90395b6bddceecfec0d12181af5a50 Author: Carl Worth Date: Mon Nov 17 07:04:15 2003 +0000 Remove infinite looping when stroking with a line width at or close to 0.0. Thanks to Rob Buis and Noah Levitt for providing in-the-wild examples of SVG files with stroke-width:0 that demonstrated the problem, (cowboy.svg and albania.svg). Do nothing if the pen is a degenerate, single point. This happens when the line width is a very small, non-zero value. Do nothing when asked to stroke a path with a line_width of 0.0. Previously, this would lead to an infinite loop. Force negative line width to 0.0. Updated TODO list. ChangeLog | 21 +++++++++++++++++++++ TODO | 18 +++++++++++++----- src/cairo-gstate.c | 3 +++ src/cairo-pen.c | 5 +++++ src/cairo.c | 2 ++ src/cairo_gstate.c | 3 +++ src/cairo_pen.c | 5 +++++ 7 files changed, 52 insertions(+), 5 deletions(-) commit 399803d067ab60d11cd20fd5826fae281c4081ae Author: Carl Worth Date: Mon Nov 10 08:16:34 2003 +0000 Fix typo (thanks to John Ellson ) Add TODO items for intersection problem, programmatic patterns, missing text functions. ChangeLog | 8 ++++++++ TODO | 19 +++++++++++++------ configure.in | 2 +- 3 files changed, 22 insertions(+), 7 deletions(-) commit 9aa2d445b7de7a8ebdf98c8bb6a13f985ee11b86 Author: Dave Beckett Date: Sat Nov 8 10:28:04 2003 +0000 Use freetype-config to get the freetype2 compiling and linking flags rather than use pkg-config which requires a quite new freetype2 to get freetype2.pc configure.in | 42 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 41 insertions(+), 1 deletions(-) commit f0d9ab5b2963bf2a35f09944de0d7084c4cfaa71 Author: Carl Worth Date: Fri Nov 7 11:03:09 2003 +0000 Move declaration to beginning of function to avoid requiring a C99-compatible compiler. ChangeLog | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit f86a979b49d3a737afea4697eeb9bce965587e3f Author: Carl Worth Date: Thu Nov 6 18:33:28 2003 +0000 Bumped version to 0.1.12 for new cairo_in_stroke and cairo_in_fill functions. Added new cairo_in_stroke and cairo_in_fill. * src/cairo_gstate.c (_cairo_gstate_in_stroke): (_cairo_gstate_in_fill): New functions to support for cairo_in_stroke and cairo_in_fill. Many thanks to Thomas Hunger for the initial implementation which demonstrated how easy this would be and pushed me to go and write it already. Fixed to use _cairo_fixed_from_double instead of XDoubleToFixed. ChangeLog | 25 +++++++++++++++++++++++ configure.in | 2 +- src/cairo-gstate.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairo-path.c | 20 +++++++++--------- src/cairo-traps.c | 44 +++++++++++++++++++++++++++++++++++++++- src/cairo.c | 32 +++++++++++++++++++++++++++++ src/cairo.h | 7 ++++++ src/cairo_gstate.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairo_path.c | 20 +++++++++--------- src/cairo_traps.c | 44 +++++++++++++++++++++++++++++++++++++++- src/cairoint.h | 15 +++++++++++++ 11 files changed, 294 insertions(+), 27 deletions(-) commit a3ad0527950b7e161382d25a4891f403fcd87477 Author: Carl Worth Date: Thu Nov 6 13:32:15 2003 +0000 Move declaration to beginning of function to avoid requiring a C99-compatible compiler. src/cairo.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 7262e1554f83d011c77603298615a25102adf414 Author: Carl Worth Date: Thu Nov 6 12:53:39 2003 +0000 Add comment pondering memory management semantics of cairo_current_target_surface. NULL out pen->vertices after free. NULL out durface->data after free. ChangeLog | 12 ++++++++++++ src/cairo-gstate.c | 5 +++++ src/cairo-image-surface.c | 4 +++- src/cairo-pen.c | 2 ++ src/cairo.h | 2 ++ src/cairo_gstate.c | 5 +++++ src/cairo_image_surface.c | 4 +++- src/cairo_pen.c | 2 ++ 8 files changed, 34 insertions(+), 2 deletions(-) commit 3262cd9f9501b91d57b54a2bf4743138bea179ee Author: Carl Worth Date: Thu Nov 6 07:56:10 2003 +0000 Removed stale version from ic.h. Better to have no version listed than the wrong one. pixman/ChangeLog.libic | 9 +++++++++ pixman/src/ic.h | 5 ----- 2 files changed, 9 insertions(+), 5 deletions(-) commit 443b8cb6a295495b293cd65a62177f5d9799dec4 Author: Carl Worth Date: Tue Nov 4 10:46:45 2003 +0000 Enable cairo_set_target_surface (cr, NULL) to work. This can be useful to force the current target surface to be finalized. ChangeLog | 4 ++++ src/cairo-gstate.c | 7 +++++++ src/cairo_gstate.c | 7 +++++++ 3 files changed, 18 insertions(+), 0 deletions(-) commit 05b399242937a79b8f2242220ff8ba27041cec23 Author: Carl Worth Date: Tue Nov 4 08:58:53 2003 +0000 Add explicit fontconfig and freetype2 dependencies that were implicitly dropped along with Xft. ChangeLog | 6 ++++++ cairo.pc.in | 2 +- configure.in | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 9e25bb231cbe6f4a18f786cd21b59099d09fbbe2 Author: Carl Worth Date: Tue Nov 4 08:36:03 2003 +0000 TODO: Note that cairo_show_page, cairo_copy_page, PostScript backend, real text API, and text support for the image backend have now all been implemented. ChangeLog | 6 ++++++ TODO | 15 ++++----------- 2 files changed, 10 insertions(+), 11 deletions(-) commit 8d88d5da1758732a995669e46ae10f2703331e29 Author: Carl Worth Date: Tue Nov 4 08:33:45 2003 +0000 Fix configure.in and cairo.pc.in now that cairo no longer depends on Xft. ChangeLog | 6 ++++++ cairo.pc.in | 2 +- configure.in | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 7765a3c6767203ca47df34822d529ad2dd4ef970 Author: Carl Worth Date: Mon Nov 3 19:17:31 2003 +0000 Add support for cairo_copy_page. Fixes so PS output can be more than one page. Bump version to 0.1.11 for new cairo_copy_page. ChangeLog | 23 ++++++++++ configure.in | 2 +- src/cairo-gstate.c | 9 ++++ src/cairo-image-surface.c | 7 +++ src/cairo-ps-surface.c | 101 +++++++++++++++++++++++++++++--------------- src/cairo-surface.c | 15 +++++++ src/cairo-xlib-surface.c | 7 +++ src/cairo.c | 9 ++++ src/cairo.h | 3 + src/cairo_gstate.c | 9 ++++ src/cairo_image_surface.c | 7 +++ src/cairo_ps_surface.c | 101 +++++++++++++++++++++++++++++--------------- src/cairo_surface.c | 15 +++++++ src/cairo_xlib_surface.c | 7 +++ src/cairoint.h | 13 +++++- 15 files changed, 255 insertions(+), 73 deletions(-) commit aa40d2e2e1d3069d5225d046f1760855c9af4132 Author: Carl Worth Date: Mon Nov 3 18:24:45 2003 +0000 Add several missing checks for out of memory ChangeLog | 14 ++++++++++++++ src/cairo-image-surface.c | 26 ++++++++++++++++++++------ src/cairo-ps-surface.c | 4 ++++ src/cairo_image_surface.c | 26 ++++++++++++++++++++------ src/cairo_ps_surface.c | 4 ++++ 5 files changed, 62 insertions(+), 12 deletions(-) commit cbc1ea78d6209d9a1fbdaa806d16797644ab0a18 Author: Carl Worth Date: Mon Nov 3 13:44:53 2003 +0000 Added __external_linkage to a few functions that were missing it. ChangeLog | 5 +++++ src/cairo.h | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) commit 0819fbb164442f0feb69617275859e5c2af3c0a1 Author: Carl Worth Date: Sat Nov 1 05:23:55 2003 +0000 Add IcImageGetDepth. Bump version to 0.1.3 pixman/ChangeLog.libic | 6 ++++++ pixman/src/ic.h | 3 +++ pixman/src/icimage.c | 6 ++++++ 3 files changed, 15 insertions(+), 0 deletions(-) commit 51da155707f207691cdcc39ac46bd93bdc3a61c9 Author: Carl Worth Date: Fri Oct 31 21:56:14 2003 +0000 Fix misplacement of PS origin, (was translating vertically by width instead of height). ChangeLog | 4 ++++ src/cairo-ps-surface.c | 2 +- src/cairo_ps_surface.c | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) commit c6255f9c295dc2b273b8aa4c5ce558d6d2a05887 Author: Carl Worth Date: Fri Oct 31 21:30:35 2003 +0000 Implemented preliminary PostScript output support. Added cairo_show_page. Bumped version number to 0.1.10 ChangeLog | 29 ++++ configure.in | 2 +- src/Makefile.am | 1 + src/cairo-gstate.c | 9 + src/cairo-image-surface.c | 18 ++- src/cairo-ps-surface.c | 377 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-surface.c | 15 ++ src/cairo-xlib-surface.c | 7 +- src/cairo.c | 9 + src/cairo.h | 49 +++++- src/cairo_gstate.c | 9 + src/cairo_image_surface.c | 18 ++- src/cairo_ps_surface.c | 377 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo_surface.c | 15 ++ src/cairo_xlib_surface.c | 7 +- src/cairoint.h | 16 ++- 16 files changed, 942 insertions(+), 16 deletions(-) commit 9736375a7a106b9fd6745dcea26572a63f1334f5 Author: Carl Worth Date: Fri Oct 31 19:27:33 2003 +0000 Do nothing when radius <= 0.0, (which is much better than the current infinite loop). ChangeLog | 6 ++++++ src/cairo-gstate.c | 6 ++++++ src/cairo_gstate.c | 6 ++++++ 3 files changed, 18 insertions(+), 0 deletions(-) commit 32df4d217d968123de3c03760b951b9cc891e850 Author: Carl Worth Date: Fri Oct 31 10:41:37 2003 +0000 Moved all libic-related drawing into cairo_image_surface.c ChangeLog | 66 +++++++ configure.in | 2 +- src/Makefile.am | 43 +++--- src/cairo-ft-font.c | 97 ++++++----- src/cairo-gstate.c | 118 +++++++++---- src/cairo-image-surface.c | 429 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-surface.c | 348 ++++++++++++------------------------- src/cairo-xlib-surface.c | 386 ++++++++++++++++++++++++----------------- src/cairo-xlib.h | 2 + src/cairo.c | 6 +- src/cairo.h | 92 +++++------ src/cairo_ft_font.c | 97 ++++++----- src/cairo_gstate.c | 118 +++++++++---- src/cairo_image_surface.c | 429 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo_surface.c | 348 ++++++++++++------------------------- src/cairo_xlib_surface.c | 386 ++++++++++++++++++++++++----------------- src/cairoint.h | 109 ++++++++---- 17 files changed, 1999 insertions(+), 1077 deletions(-) commit 6dca2ab9d3c6e3801ce7887b9ad40f45385f00f0 Author: Carl Worth Date: Thu Oct 30 18:39:20 2003 +0000 Fixed a few memory leaks ChangeLog | 8 ++++++++ src/cairo-xlib-surface.c | 40 ++++++++++++++++++++++++++++++++++------ src/cairo_xlib_surface.c | 40 ++++++++++++++++++++++++++++++++++------ 3 files changed, 76 insertions(+), 12 deletions(-) commit eb40d4b82e9e2b103d12064101b5026b1781794d Author: Carl Worth Date: Thu Oct 30 13:28:34 2003 +0000 Update copyright information in COPYING COPYING | 37 +++++++++++++++++++------------------ 1 files changed, 19 insertions(+), 18 deletions(-) commit 5a9cf4f1a1c096d729cf50b8c0422325d44a5018 Author: Carl Worth Date: Thu Oct 30 12:39:49 2003 +0000 A set of changes to eliminate the static FT_Library field, (which could introduce nasty problems with respect to threading). With the new code, each font created with the toy API will own its own FT_Library. Meanwhile, cairo_ft_font_create now accepts an FT_Library parameter. Bumped version number to 0.1.9 ChangeLog | 24 +++++++++++++++++++ configure.in | 2 +- src/cairo-ft-font.c | 62 ++++++++++++++++++++++++++++---------------------- src/cairo.h | 2 +- src/cairo_ft_font.c | 62 ++++++++++++++++++++++++++++---------------------- 5 files changed, 96 insertions(+), 56 deletions(-) commit fb46d7390e0776e888d75533304fb5ce26dca04f Author: Carl Worth Date: Thu Oct 30 10:55:04 2003 +0000 A few cleanups to eliminate a memory leak. ChangeLog | 2 ++ src/cairo-font.c | 40 +++++----------------------------------- src/cairo-ft-font.c | 4 ++-- src/cairo-gstate.c | 8 ++++---- src/cairo_font.c | 40 +++++----------------------------------- src/cairo_ft_font.c | 4 ++-- src/cairo_gstate.c | 8 ++++---- src/cairoint.h | 8 +------- 8 files changed, 25 insertions(+), 89 deletions(-) commit 5edcd47a91456bbf0ea0313685a31862e8d452e3 Author: Carl Worth Date: Thu Oct 30 10:55:04 2003 +0000 A few cleanups to eliminate a memory leak. ChangeLog | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) commit 249ff3fb3813f69603a75c7aaa39bb8db5510c49 Author: Carl Worth Date: Wed Oct 29 12:50:02 2003 +0000 Drop AC_CONFIG_AUX_DIR(config) as it was confusing "make distcheck" pixman/ChangeLog.libpixregion | 5 +++++ pixman/configure.in | 2 -- 2 files changed, 5 insertions(+), 2 deletions(-) commit fb811db0d2742231510a210b356530aed66f20d5 Author: Carl Worth Date: Wed Oct 29 12:21:14 2003 +0000 Drop AC_CONFIG_AUX_DIR(config) as it was confusing "make distcheck" pixman/ChangeLog.libic | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 22c167e00fd7ad6ff3383d4235fec7894b84f4a2 Author: Carl Worth Date: Wed Oct 29 10:54:26 2003 +0000 Fix memory leak of image->transform. Remove currently unused DevUnion type and IcImageChange function. pixman/ChangeLog.libic | 9 +++++++++ pixman/src/icimage.c | 3 +++ pixman/src/icimage.h | 21 --------------------- 3 files changed, 12 insertions(+), 21 deletions(-) commit b806ea9d1b42c9b48b9e7f917b43a115afd88c48 Author: Carl Worth Date: Wed Oct 29 10:46:10 2003 +0000 Bumped version to 0.1.2 to indicate new IcOperator type. pixman/ChangeLog.libic | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit ece5507937f0a8e9cda7829f5e614597e4668a8a Author: Carl Worth Date: Wed Oct 29 10:45:02 2003 +0000 Patch from Bryan Worth to eliminate lots of leftover, undesired dependencies on X header files. pixman/ChangeLog.libic | 41 ++++++++++++++++++++++ pixman/src/ic.c | 51 ++++++++++++++------------- pixman/src/ic.h | 33 ++++++++++++++---- pixman/src/icblt.c | 34 +++++++++--------- pixman/src/icbltone.c | 32 ++++++++-------- pixman/src/iccolor.c | 10 +++--- pixman/src/iccompose.c | 34 +++++++++--------- pixman/src/icimage.c | 86 +++++++++++++++++++++++----------------------- pixman/src/icimage.h | 41 ++++++++++------------ pixman/src/icint.h | 43 ++++++++++++++++------ pixman/src/icrect.c | 16 ++++---- pixman/src/ictransform.c | 10 +++--- pixman/src/ictrap.c | 26 +++++++------- pixman/src/ictri.c | 6 ++-- 14 files changed, 271 insertions(+), 192 deletions(-) commit cf882f5d73ee0b630168f66e7fcfcb1cd96f1d2d Author: Carl Worth Date: Tue Oct 28 17:32:44 2003 +0000 Updated stale text in README ChangeLog | 5 +++++ README | 49 ++++++++++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 25 deletions(-) commit 859bfd03a6132558ad08aeb0c28ae55874a695d5 Author: Carl Worth Date: Tue Oct 28 12:18:29 2003 +0000 Rename gstate->ppm to gstate->pixels_per_inch. Add new pixels_per_inch to the surface backend. ChangeLog | 12 ++++++++++++ src/cairo-gstate.c | 11 ++++------- src/cairo-surface.c | 12 +++++++++--- src/cairo-xlib-surface.c | 8 ++++++++ src/cairo_gstate.c | 11 ++++------- src/cairo_surface.c | 12 +++++++++--- src/cairo_xlib_surface.c | 8 ++++++++ src/cairoint.h | 10 ++++++++-- 8 files changed, 62 insertions(+), 22 deletions(-) commit 8bb3f7664d2a25be0dd57348fe78e268f40def4e Author: Carl Worth Date: Tue Oct 28 12:15:03 2003 +0000 Drop cairo_surface_create_similar_solid ChangeLog | 15 ++++++++++++ src/cairo-gstate.c | 64 +++++++++++++++++++++++++++----------------------- src/cairo-surface.c | 34 +++++++++++---------------- src/cairo.h | 14 ----------- src/cairo_gstate.c | 64 +++++++++++++++++++++++++++----------------------- src/cairo_surface.c | 34 +++++++++++---------------- src/cairoint.h | 8 +++++- 7 files changed, 120 insertions(+), 113 deletions(-) commit 01378dab3e85cc9bfdd34f59bea246062d363cc4 Author: Carl Worth Date: Tue Oct 28 12:13:35 2003 +0000 Fix bug from previous commit. Must check for NULL backend function pointers before calling them. ChangeLog | 8 ++++++++ src/cairo-surface.c | 46 ++++++++++++++++++++++++++-------------------- src/cairo_surface.c | 46 ++++++++++++++++++++++++++-------------------- 3 files changed, 60 insertions(+), 40 deletions(-) commit 9d052aa9ca733d7c4008453d00c1a579fab74f92 Author: Carl Worth Date: Mon Oct 27 18:40:55 2003 +0000 Cleanup of surface->backend interface. Better type-safety and more consistent return-value handling. ChangeLog | 26 +++++++++ src/cairo-surface.c | 28 ++++++++-- src/cairo-xlib-surface.c | 133 +++++++++++++++++++++++++-------------------- src/cairo_surface.c | 28 ++++++++-- src/cairo_xlib_surface.c | 133 +++++++++++++++++++++++++-------------------- src/cairoint.h | 83 ++++++++++++++++++---------- 6 files changed, 271 insertions(+), 160 deletions(-) commit 75282a5e21e2f83cf7ed50b9aa3a4c52bb3815f9 Author: Carl Worth Date: Mon Oct 27 18:32:44 2003 +0000 Default to normal slant/weight on out-of-range values. Add missing include of fontconfig/fcfreetype.h ChangeLog | 6 ++++++ src/cairo-ft-font.c | 15 +++++++++------ src/cairo_ft_font.c | 15 +++++++++------ 3 files changed, 24 insertions(+), 12 deletions(-) commit 99fd32a8d67157a9ae09faf178bdbcfe8f9e10f0 Author: Keith Packard Date: Fri Oct 24 14:43:58 2003 +0000 A HORRIBLE KLUDGE to repad glyph images from freetype to meet libic requirements. ChangeLog | 6 ++++++ src/cairo-ft-font.c | 38 ++++++++++++++++++++++++++++++++++++-- src/cairo_ft_font.c | 38 ++++++++++++++++++++++++++++++++++++-- 3 files changed, 78 insertions(+), 4 deletions(-) commit 965ab2ff553a12a64e10047f82658a6957a0f706 Author: Carl Worth Date: Fri Oct 24 11:01:37 2003 +0000 Fixes to eliminate a few compiler warnings. Bump version to 0.1.8 for recent font API changes. ChangeLog | 19 +++++++++++++++++++ configure.in | 2 +- src/cairo-ft-font.c | 21 +++++++-------------- src/cairo-xlib-surface.c | 9 --------- src/cairo.c | 7 +++++-- src/cairo.h | 2 +- src/cairo_ft_font.c | 21 +++++++-------------- src/cairo_xlib_surface.c | 9 --------- 8 files changed, 40 insertions(+), 50 deletions(-) commit 6498351f495f4ce5a9153f6043f501c0cebc86be Author: Carl Worth Date: Fri Oct 24 10:01:34 2003 +0000 Create a font by default. Remove bogus NULL_POINTER status errors leaking to the outside. ChangeLog | 21 +++++++++++++++ src/cairo-font.c | 70 +++++++++++++-------------------------------------- src/cairo-gstate.c | 15 +++------- src/cairo_font.c | 70 +++++++++++++-------------------------------------- src/cairo_gstate.c | 15 +++------- src/cairoint.h | 10 ++++--- 6 files changed, 73 insertions(+), 128 deletions(-) commit c5aace21fbf67d27b433472e6070fee98761463c Author: Graydon Hoare Date: Thu Oct 23 15:27:40 2003 +0000 missing file from commit src/cairo-ft-font.c | 574 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_ft_font.c | 574 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1148 insertions(+), 0 deletions(-) commit c11a49a69e7d717c6c080198f568774047a21120 Author: Graydon Hoare Date: Thu Oct 23 15:22:28 2003 +0000 New file. Add cairo_ft_font.c Change to virtual font interface. ChangeLog | 11 ++ src/Makefile.am | 1 + src/cairo-font.c | 236 ++++++++++++++++++++---------- src/cairo-gstate.c | 375 ++++++++++++++++++++++++++++++++++++--------- src/cairo-xlib-surface.c | 215 ++------------------------- src/cairo.c | 98 ++++++++++-- src/cairo.h | 135 +++++++++++++++-- src/cairo_font.c | 236 ++++++++++++++++++++---------- src/cairo_gstate.c | 375 ++++++++++++++++++++++++++++++++++++--------- src/cairo_xlib_surface.c | 215 ++------------------------- src/cairoint.h | 222 ++++++++++++++++++++------- 11 files changed, 1322 insertions(+), 797 deletions(-) commit 223da5ea188ba7755aa6257452316b2330e981ae Author: Carl Worth Date: Thu Oct 23 07:51:41 2003 +0000 Updated TODO file ChangeLog | 5 +++++ TODO | 39 +++++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 16 deletions(-) commit 2c9d1913ccc6df9adc07d77781e68d5124535fa2 Author: Carl Worth Date: Thu Oct 23 07:47:29 2003 +0000 Fixed copyright attribution to refer to "University of Southern California ChangeLog | 6 ++++++ src/cairo-color.c | 2 +- src/cairo-fixed.c | 2 +- src/cairo-font.c | 2 +- src/cairo-gstate.c | 2 +- src/cairo-hull.c | 2 +- src/cairo-matrix.c | 2 +- src/cairo-path-bounds.c | 2 +- src/cairo-path-fill.c | 2 +- src/cairo-path-stroke.c | 2 +- src/cairo-path.c | 2 +- src/cairo-pen.c | 2 +- src/cairo-polygon.c | 2 +- src/cairo-slope.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- src/cairo-xlib.h | 2 +- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairo_color.c | 2 +- src/cairo_fixed.c | 2 +- src/cairo_font.c | 2 +- src/cairo_gstate.c | 2 +- src/cairo_hull.c | 2 +- src/cairo_matrix.c | 2 +- src/cairo_path.c | 2 +- src/cairo_path_bounds.c | 2 +- src/cairo_path_fill.c | 2 +- src/cairo_path_stroke.c | 2 +- src/cairo_pen.c | 2 +- src/cairo_polygon.c | 2 +- src/cairo_slope.c | 2 +- src/cairo_spline.c | 2 +- src/cairo_surface.c | 2 +- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 2 +- 37 files changed, 42 insertions(+), 36 deletions(-) commit 6aaa9dff25e7ff2e21af0eefd1a644029b9914d9 Author: Thomas Hunger Date: Sun Oct 19 08:46:21 2003 +0000 added some types and enums, documented more functions doc/reference/xml/cairo_current_fill_rule.xml | 2 +- doc/reference/xml/cairo_current_line_cap.xml | 2 +- doc/reference/xml/cairo_current_operator.xml | 2 +- doc/reference/xml/cairo_fill_rule_t.xml | 40 ++++++++++++++ doc/reference/xml/cairo_format_t.xml | 52 ++++++++++++++++++ doc/reference/xml/cairo_line_cap_t.xml | 43 +++++++++++++++ doc/reference/xml/cairo_matrix_t.xml | 23 ++++++++ doc/reference/xml/cairo_operator_t.xml | 73 +++++++++++++++++++++++++ doc/reference/xml/cairo_set_alpha.xml | 7 ++- doc/reference/xml/cairo_set_fill_rule.xml | 2 +- doc/reference/xml/cairo_set_line_cap.xml | 10 ++-- doc/reference/xml/cairo_set_line_width.xml | 6 +- doc/reference/xml/cairo_set_operator.xml | 9 ++-- doc/reference/xml/cairo_set_pattern.xml | 8 ++-- doc/reference/xml/cairo_set_rgb_color.xml | 11 ++-- doc/reference/xml/cairo_set_tolerance.xml | 8 ++-- doc/reference/xml/cairo_surface_t.xml | 17 ++++++ doc/reference/xml/cairo_t.xml | 23 ++++++++ 18 files changed, 306 insertions(+), 32 deletions(-) commit 007bbe56dba5a4c83017caa4d00d697436c9cce1 Author: Thomas Hunger Date: Thu Oct 16 10:54:34 2003 +0000 started to document from top to bottom. most things are obvious doc/reference/ChangeLog | 4 ++++ doc/reference/xml/cairo_copy.xml | 21 +++++++++++++++++---- doc/reference/xml/cairo_create.xml | 4 ++-- doc/reference/xml/cairo_destroy.xml | 9 ++++++--- doc/reference/xml/cairo_in_fill.xml | 2 +- doc/reference/xml/cairo_in_stroke.xml | 2 +- doc/reference/xml/cairo_reference.xml | 6 +++--- doc/reference/xml/cairo_restore.xml | 3 ++- doc/reference/xml/cairo_save.xml | 5 +++-- doc/reference/xml/cairo_set_target_surface.xml | 7 ++++--- doc/reference/xml/skeleton.xml | 6 +++--- 11 files changed, 46 insertions(+), 23 deletions(-) commit 8f7106a9523cf4350db29cbe413bb992c1b7a960 Author: Thomas Hunger Date: Thu Oct 16 05:31:56 2003 +0000 updated xml files to look more like gtk refence and introduced crossreferencing via script doc/reference/ChangeLog | 8 ++ doc/reference/README | 6 ++ doc/reference/crossreference.rb | 30 +++++++ doc/reference/doc.xml | 23 +++-- doc/reference/xml/cairo_clip.xml | 63 ++++++++------- doc/reference/xml/cairo_close_path.xml | 63 ++++++++------- doc/reference/xml/cairo_copy.xml | 70 +++++++++------- doc/reference/xml/cairo_create.xml | 62 ++++++++------- doc/reference/xml/cairo_current_alpha.xml | 63 ++++++++------- doc/reference/xml/cairo_current_fill_rule.xml | 63 ++++++++------- doc/reference/xml/cairo_current_line_cap.xml | 63 ++++++++------- doc/reference/xml/cairo_current_line_join.xml | 63 ++++++++------- doc/reference/xml/cairo_current_line_width.xml | 63 ++++++++------- doc/reference/xml/cairo_current_matrix.xml | 70 +++++++++------- doc/reference/xml/cairo_current_miter_limit.xml | 63 ++++++++------- doc/reference/xml/cairo_current_operator.xml | 63 ++++++++------- doc/reference/xml/cairo_current_point.xml | 77 +++++++++++-------- doc/reference/xml/cairo_current_rgb_color.xml | 84 ++++++++++++-------- doc/reference/xml/cairo_current_target_surface.xml | 62 ++++++++------- doc/reference/xml/cairo_current_tolerance.xml | 63 ++++++++------- doc/reference/xml/cairo_default_matrix.xml | 63 ++++++++------- doc/reference/xml/cairo_destroy.xml | 63 ++++++++------- doc/reference/xml/cairo_fill.xml | 63 ++++++++------- doc/reference/xml/cairo_hit.xml | 62 ++++++++------- doc/reference/xml/cairo_identity_matrix.xml | 63 ++++++++------- .../xml/cairo_inverse_transform_distance.xml | 77 +++++++++++-------- .../xml/cairo_inverse_transform_point.xml | 77 +++++++++++-------- doc/reference/xml/cairo_line_to.xml | 77 +++++++++++-------- doc/reference/xml/cairo_matrix_copy.xml | 70 +++++++++------- doc/reference/xml/cairo_matrix_create.xml | 62 ++++++++------- doc/reference/xml/cairo_matrix_destroy.xml | 63 ++++++++------- doc/reference/xml/cairo_matrix_invert.xml | 63 ++++++++------- doc/reference/xml/cairo_matrix_multiply.xml | 77 +++++++++++-------- doc/reference/xml/cairo_matrix_rotate.xml | 70 +++++++++------- doc/reference/xml/cairo_matrix_scale.xml | 77 +++++++++++-------- doc/reference/xml/cairo_matrix_set_identity.xml | 63 ++++++++------- .../xml/cairo_matrix_transform_distance.xml | 77 +++++++++++-------- doc/reference/xml/cairo_matrix_transform_point.xml | 77 +++++++++++-------- doc/reference/xml/cairo_matrix_translate.xml | 77 +++++++++++-------- doc/reference/xml/cairo_move_to.xml | 77 +++++++++++-------- doc/reference/xml/cairo_new_path.xml | 63 ++++++++------- doc/reference/xml/cairo_pop_group.xml | 63 ++++++++------- doc/reference/xml/cairo_push_group.xml | 63 ++++++++------- doc/reference/xml/cairo_reference.xml | 63 ++++++++------- doc/reference/xml/cairo_rel_line_to.xml | 77 +++++++++++-------- doc/reference/xml/cairo_rel_move_to.xml | 77 +++++++++++-------- doc/reference/xml/cairo_restore.xml | 63 ++++++++------- doc/reference/xml/cairo_rotate.xml | 70 +++++++++------- doc/reference/xml/cairo_save.xml | 63 ++++++++------- doc/reference/xml/cairo_scale.xml | 77 +++++++++++-------- doc/reference/xml/cairo_scale_font.xml | 70 +++++++++------- doc/reference/xml/cairo_select_font.xml | 70 +++++++++------- doc/reference/xml/cairo_set_alpha.xml | 70 +++++++++------- doc/reference/xml/cairo_set_dash.xml | 84 ++++++++++++-------- doc/reference/xml/cairo_set_fill_rule.xml | 70 +++++++++------- doc/reference/xml/cairo_set_line_cap.xml | 70 +++++++++------- doc/reference/xml/cairo_set_line_join.xml | 70 +++++++++------- doc/reference/xml/cairo_set_line_width.xml | 70 +++++++++------- doc/reference/xml/cairo_set_miter_limit.xml | 70 +++++++++------- doc/reference/xml/cairo_set_operator.xml | 70 +++++++++------- doc/reference/xml/cairo_set_pattern.xml | 70 +++++++++------- doc/reference/xml/cairo_set_rgb_color.xml | 84 ++++++++++++-------- doc/reference/xml/cairo_set_target_surface.xml | 69 +++++++++------- doc/reference/xml/cairo_set_tolerance.xml | 70 +++++++++------- doc/reference/xml/cairo_show_text.xml | 70 +++++++++------- doc/reference/xml/cairo_status.xml | 63 ++++++++------- doc/reference/xml/cairo_status_string.xml | 63 ++++++++------- doc/reference/xml/cairo_stroke.xml | 63 ++++++++------- doc/reference/xml/cairo_stroke_path.xml | 63 ++++++++------- doc/reference/xml/cairo_surface_clip_restore.xml | 63 ++++++++------- doc/reference/xml/cairo_surface_destroy.xml | 63 ++++++++------- doc/reference/xml/cairo_surface_get_matrix.xml | 70 +++++++++------- doc/reference/xml/cairo_surface_reference.xml | 63 ++++++++------- doc/reference/xml/cairo_surface_set_filter.xml | 70 +++++++++------- doc/reference/xml/cairo_surface_set_matrix.xml | 70 +++++++++------- doc/reference/xml/cairo_surface_set_repeat.xml | 70 +++++++++------- doc/reference/xml/cairo_transform_distance.xml | 77 +++++++++++-------- doc/reference/xml/cairo_transform_point.xml | 77 +++++++++++-------- doc/reference/xml/cairo_translate.xml | 77 +++++++++++-------- 79 files changed, 2907 insertions(+), 2321 deletions(-) commit 227bf48eff8e25dba592fbe2fcb48bfdf5d93dc3 Author: Carl Worth Date: Wed Oct 15 12:26:51 2003 +0000 Added bug about self-intersecting paths. (Really, I'm just testing the cairo-commit mailing list) BUGS | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 8ca1f1a8258daaf2380b794735a424e872600c31 Author: Thomas Hunger Date: Wed Oct 15 08:51:06 2003 +0000 commited documentation skeleton doc/reference/.cvsignore | 20 +++ doc/reference/ChangeLog | 4 + doc/reference/README | 5 + doc/reference/doc.xml | 173 ++++++++++++++++++++ doc/reference/xml/cairo_clip.xml | 32 ++++ doc/reference/xml/cairo_close_path.xml | 32 ++++ doc/reference/xml/cairo_copy.xml | 33 ++++ doc/reference/xml/cairo_create.xml | 32 ++++ doc/reference/xml/cairo_current_alpha.xml | 32 ++++ doc/reference/xml/cairo_current_fill_rule.xml | 32 ++++ doc/reference/xml/cairo_current_line_cap.xml | 32 ++++ doc/reference/xml/cairo_current_line_join.xml | 32 ++++ doc/reference/xml/cairo_current_line_width.xml | 32 ++++ doc/reference/xml/cairo_current_matrix.xml | 33 ++++ doc/reference/xml/cairo_current_miter_limit.xml | 32 ++++ doc/reference/xml/cairo_current_operator.xml | 32 ++++ doc/reference/xml/cairo_current_point.xml | 34 ++++ doc/reference/xml/cairo_current_rgb_color.xml | 35 ++++ doc/reference/xml/cairo_current_target_surface.xml | 32 ++++ doc/reference/xml/cairo_current_tolerance.xml | 32 ++++ doc/reference/xml/cairo_default_matrix.xml | 32 ++++ doc/reference/xml/cairo_destroy.xml | 32 ++++ doc/reference/xml/cairo_fill.xml | 32 ++++ doc/reference/xml/cairo_hit.xml | 32 ++++ doc/reference/xml/cairo_identity_matrix.xml | 32 ++++ doc/reference/xml/cairo_in_fill.xml | 34 ++++ doc/reference/xml/cairo_in_stroke.xml | 34 ++++ .../xml/cairo_inverse_transform_distance.xml | 34 ++++ .../xml/cairo_inverse_transform_point.xml | 34 ++++ doc/reference/xml/cairo_line_to.xml | 34 ++++ doc/reference/xml/cairo_matrix_copy.xml | 33 ++++ doc/reference/xml/cairo_matrix_create.xml | 32 ++++ doc/reference/xml/cairo_matrix_destroy.xml | 32 ++++ doc/reference/xml/cairo_matrix_invert.xml | 32 ++++ doc/reference/xml/cairo_matrix_multiply.xml | 34 ++++ doc/reference/xml/cairo_matrix_rotate.xml | 33 ++++ doc/reference/xml/cairo_matrix_scale.xml | 34 ++++ doc/reference/xml/cairo_matrix_set_identity.xml | 32 ++++ .../xml/cairo_matrix_transform_distance.xml | 34 ++++ doc/reference/xml/cairo_matrix_transform_point.xml | 34 ++++ doc/reference/xml/cairo_matrix_translate.xml | 34 ++++ doc/reference/xml/cairo_move_to.xml | 34 ++++ doc/reference/xml/cairo_new_path.xml | 32 ++++ doc/reference/xml/cairo_pop_group.xml | 32 ++++ doc/reference/xml/cairo_push_group.xml | 32 ++++ doc/reference/xml/cairo_reference.xml | 32 ++++ doc/reference/xml/cairo_rel_line_to.xml | 34 ++++ doc/reference/xml/cairo_rel_move_to.xml | 34 ++++ doc/reference/xml/cairo_restore.xml | 32 ++++ doc/reference/xml/cairo_rotate.xml | 33 ++++ doc/reference/xml/cairo_save.xml | 32 ++++ doc/reference/xml/cairo_scale.xml | 34 ++++ doc/reference/xml/cairo_scale_font.xml | 33 ++++ doc/reference/xml/cairo_select_font.xml | 33 ++++ doc/reference/xml/cairo_set_alpha.xml | 33 ++++ doc/reference/xml/cairo_set_dash.xml | 35 ++++ doc/reference/xml/cairo_set_fill_rule.xml | 33 ++++ doc/reference/xml/cairo_set_line_cap.xml | 33 ++++ doc/reference/xml/cairo_set_line_join.xml | 33 ++++ doc/reference/xml/cairo_set_line_width.xml | 33 ++++ doc/reference/xml/cairo_set_miter_limit.xml | 33 ++++ doc/reference/xml/cairo_set_operator.xml | 33 ++++ doc/reference/xml/cairo_set_pattern.xml | 33 ++++ doc/reference/xml/cairo_set_rgb_color.xml | 35 ++++ doc/reference/xml/cairo_set_target_surface.xml | 33 ++++ doc/reference/xml/cairo_set_tolerance.xml | 33 ++++ doc/reference/xml/cairo_show_text.xml | 33 ++++ doc/reference/xml/cairo_status.xml | 32 ++++ doc/reference/xml/cairo_status_string.xml | 32 ++++ doc/reference/xml/cairo_stroke.xml | 32 ++++ doc/reference/xml/cairo_stroke_path.xml | 32 ++++ doc/reference/xml/cairo_surface_clip_restore.xml | 32 ++++ doc/reference/xml/cairo_surface_destroy.xml | 32 ++++ doc/reference/xml/cairo_surface_get_matrix.xml | 33 ++++ doc/reference/xml/cairo_surface_reference.xml | 32 ++++ doc/reference/xml/cairo_surface_set_filter.xml | 33 ++++ doc/reference/xml/cairo_surface_set_matrix.xml | 33 ++++ doc/reference/xml/cairo_surface_set_repeat.xml | 33 ++++ doc/reference/xml/cairo_transform_distance.xml | 34 ++++ doc/reference/xml/cairo_transform_point.xml | 34 ++++ doc/reference/xml/cairo_translate.xml | 34 ++++ doc/reference/xml/skeleton.xml | 30 ++++ 82 files changed, 2763 insertions(+), 0 deletions(-) commit 5f48214ad24ace45276f15111fa5b15c2956f38f Author: Carl Worth Date: Sat Oct 11 13:49:13 2003 +0000 Add extern "C" stuff to cairo-xlib.h ChangeLog | 5 +++++ src/cairo-xlib.h | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) commit cdc84283e321a3fd14c430b8f991f60ac624204c Author: Carl Worth Date: Thu Oct 9 20:10:36 2003 +0000 Stub out NULL_POINTER error so drawing to off-screen memory still works even though text does not yet. ChangeLog | 6 ++++++ src/cairo-font.c | 14 +++++++------- src/cairo_font.c | 14 +++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) commit 61726a88f24efcbabdff980abdfe1ff8301315b2 Author: Carl Worth Date: Sat Oct 4 14:34:42 2003 +0000 Generate convex hull of pen before stroking. ChangeLog | 8 ++ src/Makefile.am | 1 + src/cairo-hull.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-path-stroke.c | 4 +- src/cairo-pen.c | 115 ++++++++--------------------- src/cairo-slope.c | 40 ++++++++++- src/cairo_hull.c | 190 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_path_stroke.c | 4 +- src/cairo_pen.c | 115 ++++++++--------------------- src/cairo_slope.c | 40 ++++++++++- src/cairoint.h | 6 +- 11 files changed, 534 insertions(+), 179 deletions(-) commit a249bd717c194d03d480d7803351ee6f21daf0c2 Author: Carl Worth Date: Sat Oct 4 09:06:15 2003 +0000 Remove abbreviation of "point" as "pt". Fix cairo_destrot, cairo_set_target_surface, and cairo_set_target_image to act appropriately in the face of non-zero status. ChangeLog | 12 +++++++ src/cairo-gstate.c | 70 ++++++++++++++++++++-------------------- src/cairo-path-bounds.c | 38 +++++++++++----------- src/cairo-path-fill.c | 4 +- src/cairo-path-stroke.c | 54 ++++++++++++++++---------------- src/cairo-path.c | 78 +++++++++++++++++++++++----------------------- src/cairo-pen.c | 50 +++++++++++++++--------------- src/cairo-polygon.c | 36 ++++++++++---------- src/cairo-spline.c | 44 +++++++++++++------------- src/cairo-xlib-surface.c | 2 +- src/cairo.c | 14 ++++---- src/cairo_gstate.c | 70 ++++++++++++++++++++-------------------- src/cairo_path.c | 78 +++++++++++++++++++++++----------------------- src/cairo_path_bounds.c | 38 +++++++++++----------- src/cairo_path_fill.c | 4 +- src/cairo_path_stroke.c | 54 ++++++++++++++++---------------- src/cairo_pen.c | 50 +++++++++++++++--------------- src/cairo_polygon.c | 36 ++++++++++---------- src/cairo_spline.c | 44 +++++++++++++------------- src/cairo_xlib_surface.c | 2 +- src/cairoint.h | 39 ++++++++++++---------- 21 files changed, 416 insertions(+), 401 deletions(-) commit b466e068b99c71acd26ca10b8e70ad34c7e34881 Author: Carl Worth Date: Wed Oct 1 17:34:19 2003 +0000 Fix to gracefully handle a NULL pointer for gstate->font ChangeLog | 15 +++++++++++++++ src/cairo-font.c | 44 +++++++++++++++++++++++++++++++++++--------- src/cairo-gstate.c | 12 +++++++----- src/cairo_font.c | 44 +++++++++++++++++++++++++++++++++++--------- src/cairo_gstate.c | 12 +++++++----- src/cairoint.h | 17 +++++++++-------- 6 files changed, 108 insertions(+), 36 deletions(-) commit 973ee8998377f09aee66664ddf93725d6ffd416e Author: Jamey Sharp Date: Tue Sep 30 18:56:22 2003 +0000 Virtualized the font and surface backend implementations. ChangeLog | 7 + TODO | 3 - src/Makefile.am | 3 +- src/cairo-font.c | 121 +++------ src/cairo-gstate.c | 67 +---- src/cairo-surface.c | 489 ++++++-------------------------- src/cairo-xlib-surface.c | 719 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-xlib.h | 56 ++++ src/cairo.c | 24 -- src/cairo.h | 17 -- src/cairo_font.c | 121 +++------ src/cairo_gstate.c | 67 +---- src/cairo_surface.c | 489 ++++++-------------------------- src/cairo_xlib_surface.c | 719 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 130 ++++++--- 15 files changed, 1881 insertions(+), 1151 deletions(-) commit 9c964b8f8afe03f2cf37073fc8f313fae24d58c6 Author: Carl Worth Date: Tue Sep 30 14:15:28 2003 +0000 Don't copy a gstate if src->status != 0 ChangeLog | 2 ++ src/cairo.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletions(-) commit b1ade55559b9deb350dc3fb28ee10cbde11c3476 Author: Carl Worth Date: Tue Sep 30 13:15:09 2003 +0000 Fixed horribly botched implementation of cairo_copy. ChangeLog | 7 +++++++ src/cairo-gstate.c | 21 +++++++++++++++++++++ src/cairo.c | 11 ++++++----- src/cairo_gstate.c | 21 +++++++++++++++++++++ src/cairoint.h | 3 +++ 5 files changed, 58 insertions(+), 5 deletions(-) commit 0cd47881bd62bc8600bd29c459036105f956d3c6 Author: Carl Worth Date: Tue Sep 30 11:39:07 2003 +0000 Changed cairo_copy to copy graphics state from one cairo_t to another rather than allocating a new cairo_t. ChangeLog | 7 +++++++ configure.in | 2 +- src/cairo.c | 30 +++++++++++------------------- src/cairo.h | 6 +++--- 4 files changed, 22 insertions(+), 23 deletions(-) commit 6b582a836abe9d44034e97e5ded55a983932e022 Author: Carl Worth Date: Tue Sep 30 07:58:58 2003 +0000 Fix to delay XFreePixmap until cairo_surface_destroy. ChangeLog | 6 ++++++ src/cairo-surface.c | 7 ++++++- src/cairo_surface.c | 7 ++++++- src/cairoint.h | 1 + 4 files changed, 19 insertions(+), 2 deletions(-) commit 9edacaf78075c3ed3a5e27da81f41ddc265acfc1 Author: Carl Worth Date: Mon Sep 29 11:55:56 2003 +0000 Bugfix from Graydon Hoare. ChangeLog | 8 +++++ TODO | 84 --------------------------------------------------- src/cairo-surface.c | 2 +- src/cairo_surface.c | 2 +- 4 files changed, 10 insertions(+), 86 deletions(-) commit 6f87c8bc6c4b539049b089a0f90559eac0f2ffa2 Author: Carl Worth Date: Mon Sep 29 08:36:29 2003 +0000 Added cairo_arc and cairo_arc_negative. ChangeLog | 21 ++++- TODO | 52 +++++++++-- configure.in | 2 +- src/cairo-font.c | 11 ++- src/cairo-gstate.c | 268 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairo.c | 47 +++++++++ src/cairo.h | 20 ++++ src/cairo_font.c | 11 ++- src/cairo_gstate.c | 268 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairoint.h | 12 +++ 10 files changed, 698 insertions(+), 14 deletions(-) commit 2e19ebf7663e77c9a01787fe7dd70896c62e2743 Author: Carl Worth Date: Sat Sep 27 05:08:38 2003 +0000 Removed two _print_svg headers that had been included accidentally. ChangeLog | 4 +++- src/cairoint.h | 6 ------ 2 files changed, 3 insertions(+), 7 deletions(-) commit 60d541ee6a85a63638e2d30623f703d0c8e474c7 Author: Carl Worth Date: Sat Sep 27 05:00:47 2003 +0000 Fixed some internal enums that had been mistakenly converted to lowercase at some point. ChangeLog | 7 +++++++ src/cairo-path-bounds.c | 2 +- src/cairo-path-fill.c | 4 ++-- src/cairo-path-stroke.c | 8 ++++---- src/cairo-path.c | 37 ++++++++++++++++++------------------- src/cairo-pen.c | 10 +++++----- src/cairo-spline.c | 2 +- src/cairo_path.c | 37 ++++++++++++++++++------------------- src/cairo_path_bounds.c | 2 +- src/cairo_path_fill.c | 4 ++-- src/cairo_path_stroke.c | 8 ++++---- src/cairo_pen.c | 10 +++++----- src/cairo_spline.c | 2 +- src/cairoint.h | 36 ++++++++++++++++++------------------ 14 files changed, 87 insertions(+), 82 deletions(-) commit 4dc8b3a312d0f390306131006e6d87a25e41ce58 Author: Carl Worth Date: Thu Sep 25 15:01:28 2003 +0000 Removed support for cairo_path_t and related functions. Bumped version to 0.1.5 ChangeLog | 7 ++ configure.in | 2 +- src/cairo-gstate.c | 190 +++++++++++++++++++++++++++++----------------------- src/cairo-path.c | 188 +++------------------------------------------------ src/cairo.c | 20 +----- src/cairo.h | 49 +------------- src/cairo_gstate.c | 190 +++++++++++++++++++++++++++++----------------------- src/cairo_path.c | 188 +++------------------------------------------------ src/cairoint.h | 58 +++++++--------- 9 files changed, 273 insertions(+), 619 deletions(-) commit ca1cec0f49f837dbe541fed97280952315d2876c Author: Carl Worth Date: Thu Sep 25 08:01:38 2003 +0000 Expose a cairo_path_t object with related functions: cairo_set_path, cairo_current_path, cairo_path_move_to, cairo_path_line_to, etc. ChangeLog | 35 ++++++++++ configure.in | 2 +- src/cairo-gstate.c | 190 +++++++++++++++++++++++----------------------------- src/cairo-path.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/cairo.c | 20 +++++- src/cairo.h | 49 +++++++++++++- src/cairo_gstate.c | 190 +++++++++++++++++++++++----------------------------- src/cairo_path.c | 188 ++++++++++++++++++++++++++++++++++++++++++++++++--- src/cairoint.h | 58 +++++++++------- 9 files changed, 654 insertions(+), 266 deletions(-) commit 17f5e712e217be701cf6555528cb81dfd22e49f8 Author: Carl Worth Date: Wed Sep 24 06:20:38 2003 +0000 Require __GNUC__ >= 3 before defining slim_hidden_def macro pixman/ChangeLog.slim | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit ba03c60ce95130e211ab9fd71c8a769f28a9fc74 Author: Carl Worth Date: Tue Sep 23 07:58:02 2003 +0000 Require __GNUC__ >= 3 before defining slim_hidden_def macro pixman/src/slim_internal.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e3d81a872cbc6a2113f9e54dffa0f6f27bba52d7 Author: Carl Worth Date: Wed Sep 17 08:48:41 2003 +0000 Updated description of PostScript comparison TODO | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) commit 3f9a062bc62e5d66b9e984bbdce5d3b642faecdd Author: Carl Worth Date: Wed Sep 17 08:41:30 2003 +0000 Added "A comparison with PostScript" to TODO TODO | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 121 insertions(+), 0 deletions(-) commit d3db983ab2c66e9a53ecbd53f04f56d0723cd3ee Author: Carl Worth Date: Tue Sep 16 10:28:46 2003 +0000 Fixed massive pixmap leak ChangeLog | 3 +++ src/cairo-surface.c | 4 ---- src/cairo_surface.c | 4 ---- 3 files changed, 3 insertions(+), 8 deletions(-) commit 7e46e8e6caab34f4f2be9a694d8c15d1942bff7e Author: Carl Worth Date: Tue Sep 16 06:45:19 2003 +0000 Add cairo_reference and cairo_surface_reference ChangeLog | 15 +++++++++++++++ configure.in | 2 +- src/cairo-gstate.c | 10 +++++----- src/cairo-surface.c | 2 +- src/cairo.c | 38 ++++++++++++++++++++++++++++---------- src/cairo.h | 12 +++++++++--- src/cairo_gstate.c | 10 +++++----- src/cairo_surface.c | 2 +- src/cairoint.h | 4 +--- 9 files changed, 66 insertions(+), 29 deletions(-) commit ee4bb020152525daa8ce880b0c739bdea2b92a01 Author: Carl Worth Date: Mon Sep 15 13:17:32 2003 +0000 Force explicit dependency on Xrender >= 0.6. Make _cairo_x11_surface_put_image static. ChangeLog | 6 ++++++ configure.in | 2 +- src/cairo-surface.c | 22 +++++++++++----------- src/cairo_surface.c | 22 +++++++++++----------- 4 files changed, 29 insertions(+), 23 deletions(-) commit 9c5be2cf317cdac454af3566a30fa6bb74db6e14 Author: Carl Worth Date: Mon Sep 15 07:55:10 2003 +0000 Fix for invalid restore from keithp. Began adding notes on arc support. ChangeLog | 6 ++++++ TODO | 46 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.c | 8 +++----- 3 files changed, 55 insertions(+), 5 deletions(-) commit 1154ac5b59a3530c3f74a54ea559908816cb7e83 Author: Carl Worth Date: Mon Sep 15 07:29:44 2003 +0000 Don't try to create depth-32 pixmaps on non-Render servers. Fix massive memory leask in _cairo_surface_push_image. ChangeLog | 6 ++++++ src/cairo-surface.c | 12 ++++++++---- src/cairo_surface.c | 12 ++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) commit 4b30a924c9a61915a286c1cdf9c63e7d2b43a8db Author: Carl Worth Date: Fri Sep 12 10:53:03 2003 +0000 Added a few items to BUGS/TODO BUGS | 13 +++++++++++++ TODO | 58 +++++++--------------------------------------------------- 2 files changed, 20 insertions(+), 51 deletions(-) commit e540d4c44f7d38881c40a2eff1dab6469968b380 Author: Carl Worth Date: Tue Sep 9 17:38:10 2003 +0000 Updated calls to slim_hidden_def to track changes in slim 0.2.0 ChangeLog | 5 +++++ configure.in | 2 +- src/cairo-matrix.c | 16 ++++++++-------- src/cairo-surface.c | 16 ++++++++-------- src/cairo.c | 12 ++++++------ src/cairo_matrix.c | 16 ++++++++-------- src/cairo_surface.c | 16 ++++++++-------- 7 files changed, 44 insertions(+), 39 deletions(-) commit 1abf6689e18f2fbde965efcf1b6b3bd4d6fa22f5 Author: Carl Worth Date: Tue Sep 9 17:35:42 2003 +0000 Updated calls to slim_hidden_def to track cahnges in slim 0.2.0 pixman/ChangeLog.libic | 5 +++++ pixman/ChangeLog.libpixregion | 5 +++++ pixman/configure.in | 2 +- pixman/src/ic.c | 2 +- pixman/src/iccolor.c | 2 +- pixman/src/icformat.c | 2 +- pixman/src/icimage.c | 6 +++--- pixman/src/icrect.c | 2 +- pixman/src/pixregion.c | 6 +++--- 9 files changed, 21 insertions(+), 11 deletions(-) commit be113ebc4ab3c597e3b2a4f924397f66e5d83ada Author: Carl Worth Date: Tue Sep 9 17:33:52 2003 +0000 Bump version number to 0.2.0 pixman/ChangeLog.slim | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 5d1bf0b96b7ef6eed5fb0b9089d9950d28c1c75a Author: Carl Worth Date: Tue Sep 9 17:32:07 2003 +0000 Remove ';' from slim_hidden_def. Bump version to 0.1.1 pixman/ChangeLog.slim | 8 ++++++++ pixman/src/slim_internal.h | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) commit 5b5c172803887e59bf86f351d60930fd10f6063b Author: Carl Worth Date: Fri Sep 5 15:29:49 2003 +0000 Preliminary support for running Cairo with X servers without the Render extension. This is still horribly slow. Removed many uses of X-specific macros, (eg. XDoubleToFixed) ChangeLog | 34 +++++++ configure.in | 2 +- src/Makefile.am | 1 + src/cairo-fixed.c | 46 ++++++++++ src/cairo-font.c | 1 + src/cairo-gstate.c | 78 +++++++++++------ src/cairo-path-bounds.c | 8 +- src/cairo-path-stroke.c | 32 ++++---- src/cairo-pen.c | 4 +- src/cairo-spline.c | 12 ++-- src/cairo-surface.c | 225 ++++++++++++++++++++++++++--------------------- src/cairo-traps.c | 14 ++-- src/cairo.h | 7 -- src/cairo_fixed.c | 46 ++++++++++ src/cairo_font.c | 1 + src/cairo_gstate.c | 78 +++++++++++------ src/cairo_path_bounds.c | 8 +- src/cairo_path_stroke.c | 32 ++++---- src/cairo_pen.c | 4 +- src/cairo_spline.c | 12 ++-- src/cairo_surface.c | 225 ++++++++++++++++++++++++++--------------------- src/cairo_traps.c | 14 ++-- src/cairoint.h | 33 +++++-- 23 files changed, 573 insertions(+), 344 deletions(-) commit 4551d78c8f5579a563a446ee745a04472d372823 Author: Carl Worth Date: Fri Sep 5 15:24:45 2003 +0000 Expose functions for creating IcFormat based on IcFormatName or masks. The actual IcFormat struct is no longer exposed. Bump version number to 0.1.1 pixman/ChangeLog.libic | 22 +++++ pixman/src/ic.c | 36 ++++---- pixman/src/ic.h | 33 ++++--- pixman/src/icblt.c | 1 - pixman/src/icbltone.c | 1 - pixman/src/iccolor.c | 36 +++----- pixman/src/iccompose.c | 222 +-------------------------------------------- pixman/src/icformat.c | 117 ++++++++++++++++-------- pixman/src/icimage.c | 6 +- pixman/src/icimage.h | 11 +-- pixman/src/icint.h | 49 ++++++---- pixman/src/icpixels.c | 3 +- pixman/src/icrect.c | 4 +- pixman/src/icrop.h | 1 - pixman/src/icstipple.c | 1 - pixman/src/ictransform.c | 2 - pixman/src/ictrap.c | 20 ++-- pixman/src/ictri.c | 16 ++-- pixman/src/icutil.c | 1 - 19 files changed, 208 insertions(+), 374 deletions(-) commit 7e9a0f9cf30f507b50cbf3fc97c387bd05b534cd Author: Keith Packard Date: Fri Sep 5 13:25:46 2003 +0000 comment face computations, check for reflecting transformation to select correct face orientations check for reflecting transform when computing pen to ensure consistent pen orientation ChangeLog | 8 ++++++ src/cairo-path-stroke.c | 65 +++++++++++++++++++++++++++++------------------ src/cairo-pen.c | 43 +++++++++++++++++++++---------- src/cairo_path_stroke.c | 65 +++++++++++++++++++++++++++++------------------ src/cairo_pen.c | 43 +++++++++++++++++++++---------- 5 files changed, 146 insertions(+), 78 deletions(-) commit 36307e49d44a3712767749c450199b7a1ce0dea9 Author: Carl Worth Date: Fri Sep 5 10:17:22 2003 +0000 Portability fix for OpenBSD (from Michael Schubert) pixman/ChangeLog.libic | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 67275336bf0a89357fc4fda38dc5fb80a8cb90e8 Author: Carl Worth Date: Fri Sep 5 08:35:08 2003 +0000 Added cairo_copy. Bumbed version to 0.1.2. ChangeLog | 20 ++++++++++++++++++ configure.in | 2 +- src/cairo-gstate.c | 3 ++ src/cairo.c | 55 ++++++++++++++++++++++++--------------------------- src/cairo.h | 3 ++ src/cairo_gstate.c | 3 ++ 6 files changed, 56 insertions(+), 30 deletions(-) commit 196388abe67283364e774a75167a2e83e3884036 Author: Carl Worth Date: Fri Sep 5 07:16:45 2003 +0000 Fix crash in show_text due to missing call to ensure_source. ChangeLog | 5 +++++ src/cairo-gstate.c | 19 +++++++++++++++++++ src/cairo_gstate.c | 19 +++++++++++++++++++ 3 files changed, 43 insertions(+), 0 deletions(-) commit acb8ef11ceba696312b9e52dd45318833dffb80f Author: Carl Worth Date: Thu Sep 4 16:32:21 2003 +0000 Changed DEPRECATE method to preseve binary compatibility, but break source-level compatibility. src/cairoint.h | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) commit c25eea6f10473fd1e2d61faf60289f58475b85fd Author: Carl Worth Date: Thu Sep 4 16:27:34 2003 +0000 Fixed bugs if cairo_stroke/fill called before cairo_set_rgb_color or cairo_set_target. Also fixed bug when cairo_set_rgb_color is called before cairo_set_target. BUGS | 2 - ChangeLog | 23 +++++++++ src/cairo-gstate.c | 136 +++++++++++++++++++++++++++++++--------------------- src/cairo.c | 8 ++- src/cairo.h | 3 +- src/cairo_gstate.c | 136 +++++++++++++++++++++++++++++++--------------------- src/cairoint.h | 7 ++- 7 files changed, 198 insertions(+), 117 deletions(-) commit 6f731e27580870a5954ca21331b15746e371c8d3 Author: Keith Packard Date: Thu Sep 4 11:54:09 2003 +0000 added comments describing miter join code and miter limit computation. Replace XFoo with cairo_foo for double and fixed add cairo_fixed_to_double and cairo_double_to_fixed Carl says he's got similar code, so he'll have to fix things if I get this committed quickly enough. ChangeLog | 10 +++++ src/cairo-path-stroke.c | 100 ++++++++++++++++++++++++++++++++++------------ src/cairo_path_stroke.c | 100 ++++++++++++++++++++++++++++++++++------------ src/cairoint.h | 3 + 4 files changed, 161 insertions(+), 52 deletions(-) commit 66c091e70661f8a87658fd20707b899f9b85970c Author: Carl Worth Date: Thu Sep 4 11:21:15 2003 +0000 Fixed DEPRECATE macro so that old programs will still work src/cairo.h | 2 ++ src/cairoint.h | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) commit bbe8f9330bca8a1266cd3cea27742481eb2ae7e8 Author: Carl Worth Date: Thu Sep 4 06:53:02 2003 +0000 Added cairo-api-update script. ChangeLog | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit b9c3be767896c817786e115a0a4856a419d6ce55 Author: Carl Worth Date: Thu Sep 4 06:52:01 2003 +0000 Changed names of all cairo_get_* functions to cairo_current_*. Added magic DEPRECATE macro so that using the old names will give useful warnings/errors. Bumped version number to 0.1.1 ChangeLog | 18 +++++++++++++ configure.in | 2 +- src/cairo-gstate.c | 30 +++++++++++----------- src/cairo.c | 67 +++++++++++++++++++++++++++++------------------- src/cairo.h | 57 ++++++++++++++++++++++++++++++----------- src/cairo_gstate.c | 30 +++++++++++----------- src/cairoint.h | 46 +++++++++++++++++++++++++--------- util/cairo-api-update | 40 +++++++++++++++++++++++++++++ 8 files changed, 204 insertions(+), 86 deletions(-) commit 1568c818dacf70463e4b71550bbf24d26f894b70 Author: Carl Worth Date: Wed Sep 3 07:14:18 2003 +0000 Add implementation of cairo_get_matrix ChangeLog | 7 +++++++ src/cairo-gstate.c | 6 ++++++ src/cairo.c | 6 ++++++ src/cairo.h | 5 +---- src/cairo_gstate.c | 6 ++++++ src/cairoint.h | 3 +++ 6 files changed, 29 insertions(+), 4 deletions(-) commit 1a6496eaec0e94a59008c3a205f92e308fbafe38 Author: Carl Worth Date: Tue Sep 2 13:36:17 2003 +0000 Portability fix for OpenBSD (from Michael Schubert) pixman/src/ic.h | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 44b3c4ca7875c20429d983c47437e16a01c45d3a Author: Carl Worth Date: Fri Aug 29 17:57:08 2003 +0000 Optimized _cairo_surface_composite for compositing local memory surface with an X11 server surface. ChangeLog | 7 +++++++ src/cairo-surface.c | 28 +++++++++++++++++++++++++--- src/cairo.h | 18 +++++++++--------- src/cairo_surface.c | 28 +++++++++++++++++++++++++--- 4 files changed, 66 insertions(+), 15 deletions(-) commit 0ed4d32d87695599f66568e3f966f08ca060c9c6 Author: Carl Worth Date: Fri Aug 29 17:48:48 2003 +0000 Fixed to use fabs not abs. Added pointer to Hobby's intersection paper. ChangeLog | 9 +++++++++ src/cairo-font.c | 3 ++- src/cairo-traps.c | 21 +++++++++++++++++++++ src/cairo_font.c | 3 ++- src/cairo_traps.c | 21 +++++++++++++++++++++ 5 files changed, 55 insertions(+), 2 deletions(-) commit 2ee2cfe14a446bc928d5a0945cc2a68657f8c825 Author: Keith Packard Date: Thu Aug 28 14:12:08 2003 +0000 font pixel size is always non-negative ChangeLog | 3 +++ src/cairo-font.c | 2 +- src/cairo_font.c | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) commit 4d399b9aca39f60793957e581664a968f35aee5d Author: Carl Worth Date: Tue Aug 26 07:40:17 2003 +0000 Added missing underscores to several internal functions. ChangeLog | 12 +++++ src/cairo-font.c | 6 +- src/cairo-gstate.c | 28 ++++++------ src/cairo-matrix.c | 6 +- src/cairo-path-fill.c | 6 +- src/cairo-path-stroke.c | 20 ++++---- src/cairo-pen.c | 2 +- src/cairo-traps.c | 116 +++++++++++++++++++++++----------------------- src/cairo.h | 32 +++++++------- src/cairo_font.c | 6 +- src/cairo_gstate.c | 28 ++++++------ src/cairo_matrix.c | 6 +- src/cairo_path_fill.c | 6 +- src/cairo_path_stroke.c | 20 ++++---- src/cairo_pen.c | 2 +- src/cairo_traps.c | 116 +++++++++++++++++++++++----------------------- src/cairoint.h | 53 ++++++++++------------ 17 files changed, 236 insertions(+), 229 deletions(-) commit daf4141a03fa36b4ff9a45c92cc217afe1d5172c Author: Carl Worth Date: Tue Aug 26 07:14:40 2003 +0000 Fixed anchoring/transformation of pattern for stroke/fill. ChangeLog | 7 +++++++ src/cairo-gstate.c | 32 ++++++++++++++++++++++++++------ src/cairo_gstate.c | 32 ++++++++++++++++++++++++++------ 3 files changed, 59 insertions(+), 12 deletions(-) commit 596d081d47920298ccb91ee34d867661f31f067c Author: Carl Worth Date: Mon Aug 18 18:53:16 2003 +0000 Add --enable-maintainer-mode to autogen.sh pixman/autogen.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 48db57aea654fbd57afb627aa9ff2004358ee0c8 Author: Carl Worth Date: Mon Aug 18 18:52:46 2003 +0000 Added better warning if pkg-config is not installed. Add --enable-maintainer-mode to autogen.sh autogen.sh | 25 +++++++++++++++++++++---- 1 files changed, 21 insertions(+), 4 deletions(-) commit e7eecebc271bfde162bad48b6f2c6063a9b6982e Author: Carl Worth Date: Mon Aug 18 18:45:24 2003 +0000 Fixed to give a better warning if pkg-config is not installed pixman/autogen.sh | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) commit 9a68366825015b66afd8496fb4eb42ce08e9849b Author: Carl Worth Date: Tue Aug 5 05:04:27 2003 +0000 Removed version requirements from dependencies on slim, libic, and Xft. configure.in | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) commit 83d5f0352ca54adb5fa5caa12dbba6c7f5e7755d Author: Richard Henderson Date: Thu Jul 31 22:49:09 2003 +0000 Mark const. Likewise. Likewise. Likewise for cb. ChangeLog | 7 +++++++ src/cairo-color.c | 2 +- src/cairo-matrix.c | 2 +- src/cairo-path-bounds.c | 2 +- src/cairo-path.c | 2 +- src/cairo_color.c | 2 +- src/cairo_matrix.c | 2 +- src/cairo_path.c | 2 +- src/cairo_path_bounds.c | 2 +- 9 files changed, 15 insertions(+), 8 deletions(-) commit 9289e8a77af5a2cd7faa18c90cced6d90adad66a Author: Richard Henderson Date: Thu Jul 31 22:41:44 2003 +0000 Depend on slim. Check for slim. Include slim_{export,import}.h as needed; mark all symbols __external_linkage. Include slim_internal.h; mark all symbols __internal_linkage. Provide slim_hidden_proto symbols as needed. Provide slim_hidden_def symbols as needed. Mark static. (cairo_traps_add_trap_from_points): Likewise. ChangeLog | 14 +++ cairo.pc.in | 2 +- configure.in | 3 +- src/cairo-matrix.c | 8 ++ src/cairo-surface.c | 7 ++ src/cairo-traps.c | 8 +- src/cairo.c | 6 + src/cairo.h | 188 ++++++++++++++++++---------------- src/cairo_matrix.c | 8 ++ src/cairo_surface.c | 7 ++ src/cairo_traps.c | 8 +- src/cairoint.h | 280 ++++++++++++++++++++++++++++----------------------- 12 files changed, 312 insertions(+), 227 deletions(-) commit b7483e81a745d0cb933535346e35305bb2b06f2d Author: Richard Henderson Date: Thu Jul 31 20:46:21 2003 +0000 Define as __builtin_popcount when available. pixman/ChangeLog.libic | 4 ++++ pixman/src/iccolor.c | 18 ++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) commit 2d51c71a79005c70249eedb191fa59732a358789 Author: Richard Henderson Date: Thu Jul 31 10:00:08 2003 +0000 Check for slim revision. Depend on slim. Don't include icimage.h. Don't include ic.h. Include slim_{export,import}.h as appropriate. Mark all symbols __external_linkage. Include slim_import.h; mark symbols __internal_linkage; add slim hidden_proto declarations. Mark all symbols __internal_linkage. Likewise. Provide hidden definition. Likewise. Likewise. Likewise. Likewise. Make static. pixman/ChangeLog.libic | 23 ++++++++++++++++ pixman/src/ic.c | 3 +- pixman/src/ic.h | 66 +++++++++++++++++++++++++++-------------------- pixman/src/iccolor.c | 1 + pixman/src/iccompose.c | 1 - pixman/src/icformat.c | 1 + pixman/src/icimage.c | 3 ++ pixman/src/icimage.h | 29 ++++++++++----------- pixman/src/icint.h | 50 ++++++++++++++++++++++-------------- pixman/src/icrect.c | 1 + pixman/src/icrop.h | 7 +++-- pixman/src/ictri.c | 8 +----- 12 files changed, 118 insertions(+), 75 deletions(-) commit f4dc2f2ee031b117aacbf4f4262ad548b8e0498a Author: Richard Henderson Date: Thu Jul 31 02:14:10 2003 +0000 Attribute visibility not present until gcc 3.3. pixman/ChangeLog.slim | 5 +++++ pixman/src/slim_internal.h | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 7b1d999679d6ccc08c10d6b6c8a0a41ff7176892 Author: Richard Henderson Date: Thu Jul 31 02:11:33 2003 +0000 Make everything but IcComposite static. Make everything except IcBuildCompositeOperand and IcCompositeGeneral static. Make static. (IcLaneTable): Turn into a function. (IcBltOne): Make IcLane const. (icStipple24Bits): Make static. Remove lots of now static declarations. Likewise. Make static. (icStipple2Bits, icStipple1Bits): Make static. (IcStippleTable): Turn into a function. pixman/ChangeLog.libic | 15 + pixman/src/ic.c | 32 +- pixman/src/icbltone.c | 42 ++- pixman/src/iccompose.c | 294 +++++++++--------- pixman/src/icimage.h | 801 ------------------------------------------------ pixman/src/icrop.h | 8 +- pixman/src/icutil.c | 47 ++-- 7 files changed, 231 insertions(+), 1008 deletions(-) commit a1e7245d74187e21f36211762f09b1ba1b59f566 Author: Carl Worth Date: Wed Jul 30 11:50:38 2003 +0000 Committing missed ChangeLog entry pixman/ChangeLog.libic | 7 ++++++- pixman/src/ic.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) commit 713f550a938c8a492d6a40b70664af5fa6a87f80 Author: Carl Worth Date: Wed Jul 30 11:21:54 2003 +0000 fixed some typos in the libic PKG_CHECK ChangeLog | 3 +++ configure.in | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) commit f4017c58575be26ab0ae5e41a9d5233e358969d8 Author: Carl Worth Date: Wed Jul 30 10:54:44 2003 +0000 Fixed IcRectangle to be compatible with XRectangle. pixman/ChangeLog.libic | 4 ++++ pixman/src/ic.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit b86e8f5a0c8a2ddac9742e229e34c81d522c4c5a Author: Carl Worth Date: Wed Jul 30 10:48:27 2003 +0000 Fixed a disagreement over whether some internal cairo_gstate_t functions had an '_' prefix or not. ChangeLog | 4 ++++ src/cairo.c | 12 ++++++------ src/cairoint.h | 22 +++++++++++----------- 3 files changed, 21 insertions(+), 17 deletions(-) commit 1ec2cb30f5862f1677670999e48475c02508d50d Author: Carl Worth Date: Wed Jul 30 10:36:50 2003 +0000 Removed false dependency on X. pixman/ChangeLog.libpixregion | 8 ++++++++ pixman/configure.in | 4 ---- pixman/src/pixman.h | 13 ++++++++----- 3 files changed, 16 insertions(+), 9 deletions(-) commit e82a135aac039eb73436137b924d00726ef87119 Author: Richard Henderson Date: Wed Jul 30 10:09:53 2003 +0000 New. Add slim.pc. New file. pixman/ChangeLog.slim | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit b9be119a3f3258df58067d24f5133b3e19dde91a Author: Richard Henderson Date: Wed Jul 30 10:06:34 2003 +0000 Run PKG_CHECK_MODULES on slim. Require slim. Mark hidden. (PixRegionCopy, PixRegionUnion): Mark hidden. Include and use X11/Xfuncproto.h. Include slim_{export,import}.h as appropriate. Mark all functions with __external_linkage. Rename include protect to _PIXREGIONINT_H_. pixman/ChangeLog.libpixregion | 11 +++++++ pixman/configure.in | 3 ++ pixman/libpixman.pc.in | 1 + pixman/src/pixman.h | 63 ++++++++++++++++++++++++---------------- pixman/src/pixregion.c | 8 +++++ pixman/src/pixregionint.h | 8 ++-- 6 files changed, 65 insertions(+), 29 deletions(-) commit 9fecd258a68a915cdac26c2fce14b8706d308df0 Author: Richard Henderson Date: Wed Jul 30 09:14:22 2003 +0000 New file. New file. New file. Add them. Check for src/slim_export.h pixman/ChangeLog.slim | 11 +++++ pixman/src/slim_export.h | 54 ++++++++++++++++++++++++ pixman/src/slim_import.h | 53 +++++++++++++++++++++++ pixman/src/slim_internal.h | 99 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 217 insertions(+), 0 deletions(-) commit e97cfd5eae9874cd665646403a6f8e5fbdf5621e Author: Carl Worth Date: Wed Jul 30 08:30:50 2003 +0000 Made all changes necessary to abandon the Xc library, (sucking the functionality up into cairo_surface_t instead). Eliminated most of the remaining X datatypes (XFixed, XPointFixed, XLineFixed, XTrapezoid). Fixed some numerical problems relating to pen initialization and intersection calculation. ChangeLog | 71 ++++++++ cairo.pc.in | 2 +- configure.in | 4 +- src/Makefile.am | 8 +- src/cairo-color.c | 38 +++-- src/cairo-font.c | 2 +- src/cairo-gstate.c | 178 ++++++++++--------- src/cairo-path-bounds.c | 22 ++- src/cairo-path-fill.c | 12 +- src/cairo-path-stroke.c | 68 ++++---- src/cairo-path.c | 34 ++-- src/cairo-pen.c | 134 +++++++-------- src/cairo-polygon.c | 9 +- src/cairo-slope.c | 58 ++++++ src/cairo-spline.c | 40 +++-- src/cairo-surface.c | 439 ++++++++++++++++++++++++++++++++++++++++------- src/cairo-traps.c | 122 ++++++++------ src/cairo.c | 160 +++++++++-------- src/cairo.h | 116 ++++++++----- src/cairo_color.c | 38 +++-- src/cairo_font.c | 2 +- src/cairo_gstate.c | 178 ++++++++++--------- src/cairo_misc.c | 36 ---- src/cairo_path.c | 34 ++-- src/cairo_path_bounds.c | 22 ++- src/cairo_path_fill.c | 12 +- src/cairo_path_stroke.c | 68 ++++---- src/cairo_pen.c | 134 +++++++-------- src/cairo_polygon.c | 9 +- src/cairo_slope.c | 58 ++++++ src/cairo_spline.c | 40 +++-- src/cairo_surface.c | 439 ++++++++++++++++++++++++++++++++++++++++------- src/cairo_traps.c | 122 ++++++++------ src/cairoint.h | 245 ++++++++++++++++++-------- 34 files changed, 1958 insertions(+), 996 deletions(-) commit 2026b1c44aeeb09e7015efadd508aeec28d778fa Author: Carl Worth Date: Tue Jul 29 19:52:08 2003 +0000 Initial commit of slim shell 0 files changed, 0 insertions(+), 0 deletions(-) commit f605294dd31feb88261d4629ddd9cb7e8793c60f Author: Carl Worth Date: Tue Jul 29 14:45:20 2003 +0000 Replaced CARD*/INT* datatypes with stdint types (vektor@dumbterm.net). pixman/src/ic.c | 456 +++++++++++++------------- pixman/src/ic.h | 28 +- pixman/src/iccompose.c | 828 ++++++++++++++++++++++++------------------------ pixman/src/icimage.h | 534 ++++++++++++++++---------------- pixman/src/icint.h | 152 +++++----- 5 files changed, 999 insertions(+), 999 deletions(-) commit 47844ba222600301bf46c521fc84d27e93586bc7 Author: Carl Worth Date: Sat Jul 26 20:38:58 2003 +0000 Fixed to not munge some internal cairot names, (such as cairo_traps_*) util/xr2cairo | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 953b708e2c483f41bb45a3694833dd8b62b4f415 Author: Carl Worth Date: Fri Jul 25 23:16:31 2003 +0000 Do nothing in cairo_show_text when using libic. src/cairo-gstate.c | 3 +++ src/cairo_gstate.c | 3 +++ src/cairoint.h | 1 - 3 files changed, 6 insertions(+), 1 deletions(-) commit 91739aa148b078fe9e2f1da4a16a076bc7af68e5 Author: Carl Worth Date: Fri Jul 25 13:29:07 2003 +0000 Fix error correction on intersection test to avoid needless spinning. ChangeLog | 6 ++++++ src/.cvsignore | 1 + src/cairo-traps.c | 9 ++++++--- src/cairo_traps.c | 9 ++++++--- 4 files changed, 19 insertions(+), 6 deletions(-) commit cf24f32a5154269518369e7d10d22956da4192f3 Author: Carl Worth Date: Thu Jul 24 01:40:16 2003 +0000 Massive cleanup of polygon tessellation ChangeLog | 6 ++ src/cairo-traps.c | 199 +++++++++++++++++------------------------------------ src/cairo_traps.c | 199 +++++++++++++++++------------------------------------ src/cairoint.h | 1 - 4 files changed, 134 insertions(+), 271 deletions(-) commit ee146c47403520815aaac8c4b1b9bf6807c7cef0 Author: Carl Worth Date: Wed Jul 23 21:20:24 2003 +0000 Introduced cairo_fixed_*_t types. Converted several functions from floating to fixed point. ChangeLog | 18 +++++++++++++++ src/cairo-pen.c | 8 +----- src/cairo-traps.c | 64 ++++++++++++++++++++++++++++++---------------------- src/cairo.c | 8 +++--- src/cairo_pen.c | 8 +----- src/cairo_traps.c | 64 ++++++++++++++++++++++++++++++---------------------- src/cairoint.h | 24 +++++++++++++++++++ 7 files changed, 124 insertions(+), 70 deletions(-) commit 6ef8b5cdf46e376f917797c0cd97758e31cec8b7 Author: Carl Worth Date: Sat Jul 19 14:02:43 2003 +0000 Better fix for the previous bug. More complete and more efficient. ChangeLog | 9 +++++++++ src/cairo-traps.c | 18 +++++++----------- src/cairo_traps.c | 18 +++++++----------- 3 files changed, 23 insertions(+), 22 deletions(-) commit 92284e4ac81e92c108b60efe0ce7c5301b419d11 Author: Carl Worth Date: Sat Jul 19 05:19:32 2003 +0000 Fixed polygon tesselattion for some cases of incorrect sorting when two intersections are very near the same vertical position. src/cairo-traps.c | 6 +++--- src/cairo_traps.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) commit 84ed2d465fecd2d2fcf0a68a9c654f220f9119d7 Author: Carl Worth Date: Fri Jul 18 12:42:49 2003 +0000 Fixed some inconsistent tag/typedef names I missed the first time. ChangeLog | 5 +++++ src/cairo-path-bounds.c | 26 +++++++++++++------------- src/cairo-path-fill.c | 26 +++++++++++++------------- src/cairo-path-stroke.c | 38 +++++++++++++++++++------------------- src/cairo-path.c | 12 ++++++------ src/cairo-pen.c | 20 ++++++++++---------- src/cairo-spline.c | 2 +- src/cairo.h | 18 +++++++++--------- src/cairo_path.c | 12 ++++++------ src/cairo_path_bounds.c | 26 +++++++++++++------------- src/cairo_path_fill.c | 26 +++++++++++++------------- src/cairo_path_stroke.c | 38 +++++++++++++++++++------------------- src/cairo_pen.c | 20 ++++++++++---------- src/cairo_spline.c | 2 +- src/cairoint.h | 32 ++++++++++++++++---------------- 15 files changed, 154 insertions(+), 149 deletions(-) commit dc1e96ae3502a81729839f4bcafcbc1fd00fc1bc Author: Carl Worth Date: Fri Jul 18 11:34:19 2003 +0000 Renamed everything from Xr* to cairo_* .cvsignore | 3 +- BUGS | 5 +- ChangeLog | 7 + Makefile.am | 4 +- README | 30 +- cairo.pc.in | 13 + configure.in | 14 +- src/Makefile.am | 47 +- src/Xr.h | 476 -------------------- src/cairo-color.c | 80 ++++ src/cairo-font.c | 171 +++++++ src/cairo-gstate.c | 1123 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-matrix.c | 380 ++++++++++++++++ src/cairo-path-bounds.c | 168 +++++++ src/cairo-path-fill.c | 158 +++++++ src/cairo-path-stroke.c | 715 ++++++++++++++++++++++++++++++ src/cairo-path.c | 436 ++++++++++++++++++ src/cairo-pen.c | 398 +++++++++++++++++ src/cairo-polygon.c | 175 ++++++++ src/cairo-spline.c | 271 ++++++++++++ src/cairo-surface.c | 391 ++++++++++++++++ src/cairo-traps.c | 593 +++++++++++++++++++++++++ src/cairo.c | 715 ++++++++++++++++++++++++++++++ src/cairo.h | 494 +++++++++++++++++++++ src/cairo_color.c | 80 ++++ src/cairo_font.c | 171 +++++++ src/cairo_gstate.c | 1123 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo_matrix.c | 380 ++++++++++++++++ src/cairo_misc.c | 36 ++ src/cairo_path.c | 436 ++++++++++++++++++ src/cairo_path_bounds.c | 168 +++++++ src/cairo_path_fill.c | 158 +++++++ src/cairo_path_stroke.c | 715 ++++++++++++++++++++++++++++++ src/cairo_pen.c | 398 +++++++++++++++++ src/cairo_polygon.c | 175 ++++++++ src/cairo_spline.c | 271 ++++++++++++ src/cairo_surface.c | 391 ++++++++++++++++ src/cairo_traps.c | 593 +++++++++++++++++++++++++ src/cairoint.h | 710 ++++++++++++++++++++++++++++++ src/xr.c | 654 --------------------------- src/xrcolor.c | 78 ---- src/xrfiller.c | 103 ----- src/xrfont.c | 169 ------- src/xrgstate.c | 1120 ---------------------------------------------- src/xrint.h | 708 ----------------------------- src/xrmatrix.c | 378 ---------------- src/xrmisc.c | 34 -- src/xrpath.c | 434 ------------------ src/xrpathbounds.c | 168 ------- src/xrpathfill.c | 156 ------- src/xrpathstroke.c | 713 ------------------------------ src/xrpen.c | 389 ---------------- src/xrpolygon.c | 173 -------- src/xrspline.c | 269 ----------- src/xrstate.c | 108 ----- src/xrstroker.c | 643 --------------------------- src/xrsurface.c | 386 ---------------- src/xrtraps.c | 589 ------------------------- util/xr2cairo | 49 ++ xr.pc.in | 13 - 60 files changed, 12194 insertions(+), 7812 deletions(-) commit 4a57fd0881b242d98ea74abb46c8c402faeb1960 Author: Anders Carlsson Date: Thu Jul 10 11:05:24 2003 +0000 Pass --enable-maintainer-mode to configure Add compiler warning flags to CFLAGS. pixman/ChangeLog.libic | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit eefc5d5ec762881e8b59ebca4d8dbcc6d3c5e1ff Author: Anders Carlsson Date: Tue Jul 8 17:06:15 2003 +0000 Add accessor for getting a pointer to the image data. pixman/ChangeLog.libic | 6 ++++++ pixman/src/ic.h | 3 +++ pixman/src/icimage.c | 6 ++++++ 3 files changed, 15 insertions(+), 0 deletions(-) commit 42529a2c7295a55005d172d2d5ed16531d0989f4 Author: Anders Carlsson Date: Tue Jul 8 16:00:55 2003 +0000 Add accessors. pixman/ChangeLog.libic | 7 +++++++ pixman/src/ic.h | 12 ++++++++++++ pixman/src/icimage.c | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 0 deletions(-) commit a18f4ea75b43b4be130caf02e2a03e8d6570ce2f Author: Carl Worth Date: Thu Jul 3 08:22:44 2003 +0000 Added XrMatrixGetAffine ChangeLog | 3 +++ src/Xr.h | 6 ++++++ src/xrmatrix.c | 13 +++++++++++++ 3 files changed, 22 insertions(+), 0 deletions(-) commit 1fc2dabbd0ee2f21ee46160cc113de4a89c94742 Author: Carl Worth Date: Thu Jul 3 08:12:51 2003 +0000 Added XrGetRGBColor and XrGetAlpha ChangeLog | 5 +++++ src/Xr.h | 6 ++++++ src/xr.c | 18 +++++++++++++++++- src/xrcolor.c | 8 ++++++++ src/xrgstate.c | 14 ++++++++++++++ src/xrint.h | 9 +++++++++ 6 files changed, 59 insertions(+), 1 deletions(-) commit 991d4447542440ac1dde67db3b8e824bda6319a9 Author: Carl Worth Date: Wed Jun 11 23:43:29 2003 +0000 Scaling by 0 now causes an InvalidMatrix error ChangeLog | 5 +++++ src/xrgstate.c | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit bfdd0ab71b64e371ed48f667af95131d697ff9d8 Author: Carl Worth Date: Wed May 28 19:31:30 2003 +0000 Cleanup of some stale unused code. pixman/src/ic.c | 17 ----------------- pixman/src/iccompose.c | 1 - 2 files changed, 0 insertions(+), 18 deletions(-) commit 528c1aceb1e17b52017182b154399b14ed6219a1 Author: Carl Worth Date: Wed May 28 19:28:53 2003 +0000 Added XrSurfacePutImage. Fixed missing translation of clip region. ChangeLog | 10 ++++++++++ src/Xr.h | 10 ++++++++++ src/xrfont.c | 4 ++-- src/xrgstate.c | 50 ++++++++++++++++++++++++++++++++++++++------------ src/xrint.h | 7 ------- src/xrmatrix.c | 18 +++--------------- src/xrsurface.c | 19 +++++++++++++++++++ 7 files changed, 82 insertions(+), 36 deletions(-) commit c988feb05dfe63f25c37a36dce6ac76b7ee1f7c6 Author: Carl Worth Date: Thu May 15 21:16:26 2003 +0000 Changed default matrix to be 3780 user units per 1 meter physical device ChangeLog | 14 ++++++++++++++ src/Xr.h | 4 ---- src/xr.c | 2 +- src/xrgstate.c | 28 ++++++++++++++++++++++++++-- src/xrint.h | 6 ++++++ src/xrsurface.c | 6 ++++++ 6 files changed, 53 insertions(+), 7 deletions(-) commit dfc84ef8299a256264b6849ecca8392a60bdcea0 Author: Carl Worth Date: Wed May 14 21:59:42 2003 +0000 Added XrSetTargetImage. Removed _XrGStateSetTargetDrawable, (now implemented as a convenience function in xr.c) ChangeLog | 8 ++++++++ src/Xr.h | 8 ++++++++ src/xr.c | 44 ++++++++++++++++++++++++++++++++++++++++---- src/xrgstate.c | 24 ------------------------ src/xrint.h | 7 ------- 5 files changed, 56 insertions(+), 35 deletions(-) commit b3b306dfd91b4126812254380dc3a7ae77f33935 Author: Carl Worth Date: Wed May 14 18:30:57 2003 +0000 Added toplevel functions for setting surface matrix, filter. Introduced new XrMatrix object. Fixed to properly hint scaled fonts. ChangeLog | 31 +++++ README | 56 +++++--- src/Makefile.am | 4 +- src/Xr.h | 125 ++++++++++++------ src/xr.c | 107 ++++++++------- src/xrfont.c | 51 ++++---- src/xrgstate.c | 272 ++++++++++++++++++------------------- src/xrint.h | 122 ++++++----------- src/xrmatrix.c | 377 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xrpathstroke.c | 14 +- src/xrpen.c | 8 +- src/xrsurface.c | 39 +++++- src/xrtransform.c | 301 ----------------------------------------- 13 files changed, 831 insertions(+), 676 deletions(-) commit 7e1f3f1798eace4f5a48079a949717da8b5a0d50 Author: Carl Worth Date: Wed May 14 18:09:09 2003 +0000 Fixed transform/filter support pixman/ChangeLog.libic | 4 ++++ pixman/src/ic.h | 16 ++++++++++++++++ pixman/src/iccompose.c | 38 ++++++++++++++++++++------------------ pixman/src/icimage.c | 12 +++++++++--- pixman/src/icimage.h | 4 ++-- pixman/src/icint.h | 6 ++++++ pixman/src/ictransform.c | 6 ++---- 7 files changed, 59 insertions(+), 27 deletions(-) commit 8f10ce30138ba541b71a2bb38a5d8a4249a8a478 Author: Carl Worth Date: Mon May 12 09:46:57 2003 +0000 Added XrSetPattern ChangeLog | 2 ++ src/Xr.h | 7 +++++++ src/xr.c | 9 +++++++++ src/xrgstate.c | 13 ++++++++++++- src/xrint.h | 3 +++ 5 files changed, 33 insertions(+), 1 deletions(-) commit 078e552da81600f58d53e7ac5f8ba971e0ea767a Author: Carl Worth Date: Mon May 12 09:24:17 2003 +0000 XrStroke and XrFill now both go through the same clipping. Cleaned up the three path interpreters (stroke, fill, and bounds), to each be in their own files ChangeLog | 16 ++ src/Makefile.am | 5 +- src/xrgstate.c | 140 +++++------ src/xrint.h | 83 +------ src/xrpath.c | 132 +---------- src/xrpathbounds.c | 168 ++++++++++++ src/xrpathfill.c | 156 ++++++++++++ src/xrpathstroke.c | 713 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 1135 insertions(+), 278 deletions(-) commit 9d4a8db55c751e093353f7f3b48d27244d5973b7 Author: Noah Levitt Date: Thu May 8 14:21:48 2003 +0000 Lowercase pkg-config module name and distribution tarball name. .cvsignore | 4 +++- Makefile.am | 6 +++--- configure.in | 6 +++--- xr.pc.in | 13 +++++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) commit 5f61782a7ebeccef7d551c625eb60ade18f9539e Author: Carl Worth Date: Mon May 5 09:27:09 2003 +0000 Avoid crash in IcCompositeTrapezoids when there's nothing to draw. pixman/ChangeLog.libic | 5 +++++ pixman/src/ictrap.c | 3 +++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 292d7bd9baf996d45275e848f258a4dbdd36cd73 Author: Carl Worth Date: Fri May 2 14:07:41 2003 +0000 Changed XrFormatRGB32 to XrFormatRGB24 ChangeLog | 8 ++++++++ src/Makefile.am | 2 +- src/Xr.h | 2 +- src/xrsurface.c | 7 ++++--- 4 files changed, 14 insertions(+), 5 deletions(-) commit 9c814d23d6b42794e9278ac7518dc4d99c77e408 Author: Carl Worth Date: Thu May 1 08:18:25 2003 +0000 Added several query functions. Experimental clip support (still incomplete) ChangeLog | 36 ++++++++++++ src/Xr.h | 47 +++++++++++++++- src/xr.c | 67 +++++++++++++++++++++-- src/xrgstate.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++++---- src/xrint.h | 50 ++++++++++++++++- src/xrpath.c | 132 +++++++++++++++++++++++++++++++++++++++++++++ src/xrtraps.c | 2 +- 7 files changed, 474 insertions(+), 23 deletions(-) commit cb1e64d7bcd96da04839eb5841feeed257cf21f3 Author: Noah Levitt Date: Mon Apr 28 16:00:40 2003 +0000 Get rid of all mention of Xrender. pixman/src/icimage.h | 2 +- pixman/src/icint.h | 3 --- 2 files changed, 1 insertions(+), 4 deletions(-) commit 7b5270441b19a68323137034db621e0a194300aa Author: Carl Worth Date: Sat Apr 26 09:57:54 2003 +0000 Fixed memory leak pixman/ChangeLog.libic | 5 +++++ pixman/src/icimage.c | 8 +++++++- pixman/src/icimage.h | 1 + src/xrsurface.c | 4 ++++ 4 files changed, 17 insertions(+), 1 deletions(-) commit b2e30d233eafd0d3bb26d2db45ef1d3505327e81 Author: Carl Worth Date: Fri Apr 25 14:24:38 2003 +0000 Remove X datatypes from public interface pixman/ChangeLog.libic | 3 +++ pixman/src/ic.h | 37 +++++++++++++++++++++++++++++++------ pixman/src/icint.h | 4 +++- pixman/src/icrect.c | 6 +++--- pixman/src/ictrap.c | 23 ++++++++++++----------- pixman/src/ictri.c | 26 +++++++++++++------------- 6 files changed, 65 insertions(+), 34 deletions(-) commit c5b28ba63cba596e1c5644de5df5f5d126535773 Author: Carl Worth Date: Fri Apr 25 13:34:00 2003 +0000 Fixed libtool versioning BUGS | 1 + ChangeLog | 4 ++++ configure.in | 24 ++++++++++++++++-------- src/Makefile.am | 2 +- 4 files changed, 22 insertions(+), 9 deletions(-) commit 140285ed9b246ebca15f7810696131c54bff8dd9 Author: Carl Worth Date: Fri Apr 25 13:21:42 2003 +0000 Fixed libtool versioning pixman/configure.in | 25 +++++++++++++++++-------- pixman/src/Makefile.am | 3 ++- pixman/src/pixman.h | 3 +-- pixman/src/pixregionint.h | 2 +- 4 files changed, 21 insertions(+), 12 deletions(-) commit b4d3b8e928c43d022e3a0d9ba978be91cfc02988 Author: Carl Worth Date: Fri Apr 25 13:18:13 2003 +0000 Fixed to not reference XFixed. Fixed libtool versioning pixman/ChangeLog.libic | 7 +++++++ pixman/src/ic.h | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletions(-) commit cdb85050b706b2845ef8a618c033b69d5b15c6b7 Author: Carl Worth Date: Wed Apr 23 07:23:46 2003 +0000 Cleanup whitespace in configure output configure.in | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit 5a4f65a774d833d1ef8b2a59270b0076e0760e54 Author: Carl Worth Date: Wed Apr 23 07:17:57 2003 +0000 extern "C" stuff to support C++ (Fredrik Höglund) pixman/src/ic.h | 12 ++++++++++++ src/Xr.h | 6 +++++- src/xr.c | 4 ++-- 3 files changed, 19 insertions(+), 3 deletions(-) commit 189b01b4fd4647f6d64e7c73ecb3ccf9ed180072 Author: Keith Packard Date: Tue Apr 22 22:08:58 2003 +0000 Require proper Xft version configure.in | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 8bb54c2b2d4b6df4ec23a442159065277d303f30 Author: Carl Worth Date: Tue Apr 22 16:38:45 2003 +0000 Fixed typo (Owen Taylor) pixman/ChangeLog.libpixregion | 4 ++++ pixman/configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit e712a21abe4027abdb41180512d9c8bd5420206e Author: Carl Worth Date: Mon Apr 21 12:46:41 2003 +0000 Added Makefile.am src/.cvsignore | 1 - src/Makefile.am | 27 +++++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletions(-) commit 8d930fee2c5c5434084fabb7852d7921223fc5d3 Author: Carl Worth Date: Mon Apr 21 12:41:30 2003 +0000 Added Makefile.am .cvsignore | 1 - Makefile.am | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletions(-) commit ee738deaf6ff2cf7391d813876241b389a0dedaf Author: Carl Worth Date: Thu Apr 17 13:24:29 2003 +0000 Switched to autotools. Dropped XrPush/PopGroup. Supports non-X Xc rendering. .cvsignore | 19 +- AUTHORS | 1 + BUGS | 1 + COPYING | 21 ++ ChangeLog | 17 + INSTALL | 9 + Imakefile | 63 ---- Xr.h | 278 ----------------- autogen.sh | 28 ++ configure.in | 51 +++ local.def | 53 ---- src/.cvsignore | 7 + src/Xr.h | 91 +++++- src/xr.c | 50 +++- src/xrfont.c | 4 +- src/xrgstate.c | 240 +++++++++------ src/xrint.h | 123 +++----- src/xrstate.c | 9 +- src/xrsurface.c | 434 +++++++++++++------------- src/xrtransform.c | 10 +- xr.c | 513 ------------------------------- xrcolor.c | 70 ----- xrfiller.c | 103 ------- xrfont.c | 170 ---------- xrgstate.c | 885 ----------------------------------------------------- xrint.h | 794 ----------------------------------------------- xrmisc.c | 34 -- xrpath.c | 432 -------------------------- xrpen.c | 389 ----------------------- xrpolygon.c | 173 ----------- xrspline.c | 269 ---------------- xrstate.c | 109 ------- xrstroker.c | 643 -------------------------------------- xrsurface.c | 323 ------------------- xrtransform.c | 301 ------------------ xrtraps.c | 589 ----------------------------------- 36 files changed, 691 insertions(+), 6615 deletions(-) commit b61b9ffc2322e09873b9e2dfb0c1da56ec1ffd61 Author: Carl Worth Date: Thu Apr 17 08:48:22 2003 +0000 Removed reliance on server headers. Reowrked IcFormat pixman/ChangeLog.libic | 50 +++++++++ pixman/src/ic.c | 40 +++---- pixman/src/ic.h | 161 +++++++++++++++++----------- pixman/src/iccolor.c | 85 ++++++++++++++ pixman/src/iccompose.c | 26 ++++- pixman/src/icformat.c | 67 +++++------ pixman/src/icimage.c | 115 +++++++------------ pixman/src/icimage.h | 86 ++++++--------- pixman/src/icint.h | 285 +++++++++++++++++++++++++++++++++++++++++++----- pixman/src/icpixels.c | 22 ++-- pixman/src/icrect.c | 107 +++++++++++-------- pixman/src/ictrap.c | 48 +++++---- pixman/src/ictri.c | 102 ++++++++++-------- 13 files changed, 798 insertions(+), 396 deletions(-) commit 2d8dfcec1bb166f8335300bd3850847a5bb1396e Author: Carl Worth Date: Wed Mar 5 10:19:48 2003 +0000 Updated to use libpixregion pixman/ChangeLog.libic | 21 +++++++++++++++++++++ pixman/src/ic.h | 22 +++++++++++++++++++++- pixman/src/icimage.h | 3 +++ pixman/src/icint.h | 41 +++-------------------------------------- 4 files changed, 48 insertions(+), 39 deletions(-) commit 88bd3a9799fd2225d84d1abed922204b3e1885e6 Author: Carl Worth Date: Tue Feb 25 10:33:10 2003 +0000 updated to use libpixregion instead of Xlib region code pixman/src/ic.c | 19 ++++------- pixman/src/ic.h | 2 + pixman/src/iccompose.c | 8 ++-- pixman/src/icimage.c | 81 ++++++++++++++++++++++++----------------------- pixman/src/icimage.h | 12 +++--- pixman/src/icint.h | 4 -- pixman/src/ictrap.c | 20 ++--------- pixman/src/ictri.c | 20 +++++++----- 8 files changed, 76 insertions(+), 90 deletions(-) commit 3eaa7a73e7ef8e24caa09a3e0318a5254c55d56f Author: Carl Worth Date: Tue Feb 25 10:28:05 2003 +0000 API cleanup pixman/ChangeLog.libpixregion | 9 ++++++++ pixman/src/pixman.h | 27 +++++++++---------------- pixman/src/pixregion.c | 43 +++++++++++++++++++++-------------------- 3 files changed, 41 insertions(+), 38 deletions(-) commit a837f75a8b9dafb373bcc828dcc5ade6a1d84674 Author: Carl Worth Date: Tue Feb 25 08:05:26 2003 +0000 Initial import of libpixregion pixman/.cvsignore | 13 + pixman/AUTHORS | 2 + pixman/COPYING | 42 + pixman/INSTALL | 9 + pixman/Makefile.am | 8 + pixman/NEWS | 1 + pixman/README | 15 + pixman/autogen.sh | 30 + pixman/configure.in | 46 + pixman/libpixman.pc.in | 10 + pixman/src/.cvsignore | 6 + pixman/src/Makefile.am | 12 + pixman/src/pixman.h | 157 +++ pixman/src/pixregion.c | 2538 +++++++++++++++++++++++++++++++++++++++++ pixman/src/pixregionint.h | 83 ++ 15 files changed, 2972 insertions(+), 0 deletions(-) commit 56e193eaf2c24aa3799b8440708a9448de3a94e9 Author: Carl Worth Date: Fri Feb 21 14:08:28 2003 +0000 Added triangle support pixman/src/ic.h | 32 +++++++++++ pixman/src/icimage.h | 51 ------------------ pixman/src/icint.h | 10 ++++ pixman/src/ictrap.c | 6 -- pixman/src/ictri.c | 140 +++++++++++++++++++++++++++----------------------- 5 files changed, 118 insertions(+), 121 deletions(-) commit 8bb4eb1beb020ed679a7644579253bd21f8bc970 Author: Carl Worth Date: Fri Feb 21 13:34:50 2003 +0000 Some reorganization and cruft removal pixman/ChangeLog.libic | 5 + pixman/src/ic.c | 1973 +++++++++++++++++++++++----------------------- pixman/src/icbltone.c | 130 --- pixman/src/iccompose.c | 1 + pixman/src/icformat.c | 20 - pixman/src/icimage.c | 1639 +++++++------------------------------- pixman/src/icimage.h | 18 - pixman/src/icint.h | 221 ------ pixman/src/ictransform.c | 70 ++ pixman/src/icutil.c | 81 -- 10 files changed, 1351 insertions(+), 2807 deletions(-) commit 18edad04edf860211260a1db4a7b58fd75715cf7 Author: Carl Worth Date: Fri Feb 21 10:07:17 2003 +0000 Started cleaning up public libic interface pixman/src/ic.c | 14 +- pixman/src/ic.h | 1008 +++--------------------------------------------- pixman/src/icimage.c | 24 +- pixman/src/icint.h | 956 ++++++++++++++++++++++++++++++++++++++++++++- pixman/src/icpixels.c | 4 +- pixman/src/icstipple.c | 2 +- pixman/src/ictrap.c | 6 +- 7 files changed, 1010 insertions(+), 1004 deletions(-) commit c9bf4bab84e6c1abbdcb2b7888918fc01e5cf063 Author: Carl Worth Date: Fri Feb 21 06:51:08 2003 +0000 Initial import of libic code, (still very preliminary). pixman/ChangeLog.libic | 4 + pixman/src/ic.c | 1183 ++++++++++++++++++++ pixman/src/ic.h | 1024 +++++++++++++++++ pixman/src/icblt.c | 926 +++++++++++++++ pixman/src/icbltone.c | 867 +++++++++++++++ pixman/src/iccompose.c | 2900 ++++++++++++++++++++++++++++++++++++++++++++++++ pixman/src/icformat.c | 139 +++ pixman/src/icimage.c | 1641 +++++++++++++++++++++++++++ pixman/src/icimage.h | 1243 +++++++++++++++++++++ pixman/src/icint.h | 68 ++ pixman/src/icpixels.c | 118 ++ pixman/src/icrect.c | 152 +++ pixman/src/icrop.h | 139 +++ pixman/src/icstipple.c | 80 ++ pixman/src/ictrap.c | 1517 +++++++++++++++++++++++++ pixman/src/ictri.c | 342 ++++++ pixman/src/icutil.c | 363 ++++++ 17 files changed, 12706 insertions(+), 0 deletions(-) commit d084434770b77d0751978bf6774eca00a6e7d646 Author: Carl Worth Date: Fri Feb 14 07:22:19 2003 +0000 Fixed transformed images to not be 1 pixel too big ChangeLog | 5 +++++ src/xrgstate.c | 4 ++-- xrgstate.c | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) commit d4ba730ba26d6a58ba81d733a75e4ce01a4bda72 Author: Carl Worth Date: Thu Feb 6 08:06:28 2003 +0000 Fixed algebra used by XrPenVerticesNeeded to avoid sqrt() of negative numbers. ChangeLog | 6 ++++++ src/xrint.h | 3 +++ src/xrpen.c | 15 +++++++-------- src/xrtransform.c | 21 ++++++++++++++------- xrint.h | 3 +++ xrpen.c | 15 +++++++-------- xrtransform.c | 21 ++++++++++++++------- 7 files changed, 54 insertions(+), 30 deletions(-) commit a4b439eb69710a3c2053e68f7716bbf76b5ceb7f Author: Carl Worth Date: Tue Jan 28 13:49:57 2003 +0000 Added round caps/joins. Fixed initial cap. Fixed disabling of dashing. ChangeLog | 22 ++++++ src/xrgstate.c | 46 +++++++------ src/xrint.h | 33 +++++----- src/xrpen.c | 96 +++++++++++++++++++++------ src/xrstroker.c | 201 +++++++++++++++++++++++++++++++++++++------------------ src/xrtraps.c | 62 +++++++++++++---- xrgstate.c | 46 +++++++------ xrint.h | 33 +++++----- xrpen.c | 96 +++++++++++++++++++++------ xrstroker.c | 201 +++++++++++++++++++++++++++++++++++++------------------ xrtraps.c | 62 +++++++++++++---- 11 files changed, 624 insertions(+), 274 deletions(-) commit 1507f1c795478c9cde970d1a750d0602407f6986 Author: Carl Worth Date: Tue Jan 28 07:23:54 2003 +0000 Added triangle tessellation. Converted bevel joins from polygons to triangles. ChangeLog | 8 ++++++++ src/xrint.h | 3 +++ src/xrstroker.c | 26 +++++++++++++++++--------- src/xrtraps.c | 31 +++++++++++++++++++++++++++++++ xrint.h | 3 +++ xrstroker.c | 26 +++++++++++++++++--------- xrtraps.c | 31 +++++++++++++++++++++++++++++++ 7 files changed, 110 insertions(+), 18 deletions(-) commit f93c88efbf84d6a2dab3a37608ae5c73c6dd22d3 Author: Carl Worth Date: Sat Jan 25 11:12:39 2003 +0000 Fixed round joins to not fall through to miter case src/xrstroker.c | 13 +++++-------- xrstroker.c | 13 +++++-------- 2 files changed, 10 insertions(+), 16 deletions(-) commit 341c446ba2c4d9833c3366edaa9b725b3ab2c8f6 Author: Carl Worth Date: Fri Jan 24 13:56:30 2003 +0000 Fixed xrpolygon for multiple sub-polygons src/xrpolygon.c | 2 ++ xrpolygon.c | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) commit 214662761e7ea372073f4a1a496c3859f893d6ac Author: Carl Worth Date: Fri Jan 24 13:52:01 2003 +0000 Fixed miter limit handling. Added local.def ChangeLog | 9 +++++++++ Imakefile | 5 +++-- README | 7 +++++-- local.def | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xrstroker.c | 4 ++-- xrstroker.c | 4 ++-- 6 files changed, 74 insertions(+), 8 deletions(-) commit cdae3ba6155a7c883e52f1617edd9f6ab61df830 Author: Carl Worth Date: Tue Dec 3 12:37:59 2002 +0000 Fixed holes in self-intersecting splines, (from change to winding rule parameter interface) ChangeLog | 10 ++++++++++ TODO | 14 +++++++++++--- src/xrpen.c | 2 +- src/xrstroker.c | 4 ++-- xrpen.c | 2 +- xrstroker.c | 4 ++-- 6 files changed, 27 insertions(+), 9 deletions(-) commit 7f49b9ee83e277c5615e5e7a0c64f9df53ea5c85 Author: Keith Packard Date: Thu Nov 21 11:12:20 2002 +0000 Make Xr use XFTINCLUDES as it now uses Xft Imakefile | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6c8533a2ad96080889be9b2255c3236200dcb858 Author: Carl Worth Date: Mon Nov 11 12:46:17 2002 +0000 Fixes for transformed images ChangeLog | 20 ++++++++++++++++ Xr.h | 19 ++++++++++++++- src/Xr.h | 19 ++++++++++++++- src/xr.c | 32 ++++++++++++++++++++++++++ src/xrfiller.c | 4 ++- src/xrgstate.c | 64 +++++++++++++++++++++++++++++++++++++++++---------- src/xrint.h | 16 ++++++++++++- src/xrpen.c | 5 +++- src/xrsurface.c | 10 ++++---- src/xrtransform.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--- xr.c | 32 ++++++++++++++++++++++++++ xrfiller.c | 4 ++- xrgstate.c | 64 +++++++++++++++++++++++++++++++++++++++++---------- xrint.h | 16 ++++++++++++- xrpen.c | 5 +++- xrsurface.c | 10 ++++---- xrtransform.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++--- 17 files changed, 398 insertions(+), 52 deletions(-) commit 405598e4e0699bf5d4e2e0e7366a780219430cc8 Author: Carl Worth Date: Mon Nov 4 00:24:44 2002 +0000 Added group support. ChangeLog | 31 ++++++++++++ Xr.h | 7 +++ src/Xr.h | 7 +++ src/xr.c | 30 +++++++++++- src/xrfont.c | 4 +- src/xrgstate.c | 148 +++++++++++++++++++++++++++++++++++++++++++++---------- src/xrint.h | 48 ++++++++++++++++-- src/xrstate.c | 1 + src/xrsurface.c | 113 +++++++++++++++++++++++++++++++++++++----- xr.c | 30 +++++++++++- xrfont.c | 4 +- xrgstate.c | 148 +++++++++++++++++++++++++++++++++++++++++++++---------- xrint.h | 48 ++++++++++++++++-- xrstate.c | 1 + xrsurface.c | 113 +++++++++++++++++++++++++++++++++++++----- 15 files changed, 639 insertions(+), 94 deletions(-) commit ea0104b2c04e12e16b8243b3762b6e53c58f0a72 Author: Carl Worth Date: Sat Nov 2 10:24:12 2002 +0000 Fix memory leak of image pixmap ChangeLog | 5 +++++ src/xrsurface.c | 6 ++++++ xrsurface.c | 6 ++++++ 3 files changed, 17 insertions(+), 0 deletions(-) commit e39a088a29cd7676ad6f33ac0f0f2c4d5035580b Author: Carl Worth Date: Fri Nov 1 19:45:30 2002 +0000 Partial image support. ChangeLog | 24 ++++++++ Xr.h | 27 +++++++++- src/Xr.h | 27 +++++++++- src/xr.c | 56 +++++++++++++++++++ src/xrfont.c | 2 +- src/xrgstate.c | 141 +++++++++++++++++++++++++++++++++++++---------- src/xrint.h | 56 ++++++++++++++++--- src/xrsurface.c | 166 ++++++++++++++++++++++++++++++++++++++++--------------- xr.c | 56 +++++++++++++++++++ xrfont.c | 2 +- xrgstate.c | 141 +++++++++++++++++++++++++++++++++++++---------- xrint.h | 56 ++++++++++++++++--- xrsurface.c | 166 ++++++++++++++++++++++++++++++++++++++++--------------- 13 files changed, 752 insertions(+), 168 deletions(-) commit fec91ede9e8bc725551e39619b65c32ad9abf3ce Author: Carl Worth Date: Wed Oct 30 21:54:50 2002 +0000 Moved Xft/fontconfig code up from Xc to Xr. Added XrTextExtents ChangeLog | 12 ++++++++ Xr.h | 7 +++++ src/Xr.h | 7 +++++ src/xr.c | 14 ++++++++++ src/xrcolor.c | 8 +++--- src/xrfont.c | 44 +++++++++++++++++++------------- src/xrgstate.c | 76 +++++++++++++++++++++++++++++++++++++++++++++--------- src/xrint.h | 30 +++++++++++++++------ src/xrsurface.c | 41 ++++++++++++++++++----------- xr.c | 14 ++++++++++ xrcolor.c | 8 +++--- xrfont.c | 44 +++++++++++++++++++------------- xrgstate.c | 76 +++++++++++++++++++++++++++++++++++++++++++++--------- xrint.h | 30 +++++++++++++++------ xrsurface.c | 41 ++++++++++++++++++----------- 15 files changed, 332 insertions(+), 120 deletions(-) commit f207f1db6489742c1061349f547ba34523969482 Author: Carl Worth Date: Tue Oct 29 17:27:01 2002 +0000 Added basic font support ChangeLog | 9 +++ Imakefile | 2 + Xr.h | 15 +++++- src/Xr.h | 15 +++++- src/xr.c | 32 +++++++++++- src/xrfont.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xrgstate.c | 64 +++++++++++++++++----- src/xrint.h | 54 ++++++++++++++++++- src/xrsurface.c | 3 + xr.c | 32 +++++++++++- xrfont.c | 160 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ xrgstate.c | 64 +++++++++++++++++----- xrint.h | 54 ++++++++++++++++++- xrsurface.c | 3 + 14 files changed, 631 insertions(+), 36 deletions(-) commit f64ebf489ba101ff99fb7910924f04291d272057 Author: Carl Worth Date: Mon Oct 28 09:00:10 2002 +0000 Added XrStatusInvalidRestore. Fixed XrSurface memory leak. ChangeLog | 9 +++++++++ Xr.h | 3 ++- src/Xr.h | 3 ++- src/xr.c | 3 --- src/xrgstate.c | 23 +++++++++++++++++------ src/xrint.h | 9 ++++++++- src/xrstate.c | 11 ++++++----- src/xrsurface.c | 29 +++++++++++++++++++---------- xr.c | 3 --- xrgstate.c | 23 +++++++++++++++++------ xrint.h | 9 ++++++++- xrstate.c | 11 ++++++----- xrsurface.c | 29 +++++++++++++++++++---------- 13 files changed, 113 insertions(+), 52 deletions(-) commit 84da6c1f7f1877662ad3e83858e77872426e2f14 Author: Carl Worth Date: Sat Oct 26 08:00:39 2002 +0000 Added TODO, README, and .cvsignore .cvsignore | 2 ++ README | 42 ++++++++++++++++++++++++++++++++++++++++++ TODO | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+), 0 deletions(-) commit 06ddeffeb7f41ba535453bcbcff0c452420dfd51 Author: Carl Worth Date: Sat Oct 26 07:59:31 2002 +0000 Moved current point state to XrGState and dropped relative operators from XrPath. This is all in preparation for XrShowText, (which needs access to the current point) ChangeLog | 57 +++++++++++++- Xr.h | 8 ++- src/Xr.h | 8 ++- src/xr.c | 190 ++++++++++++++++++++++++++++------------------ src/xrgstate.c | 221 ++++++++++++++++++++++++++++++++++++++++------------- src/xrint.h | 87 ++++++++++++++------- src/xrpath.c | 121 ++++++++++++++++++------------ src/xrpen.c | 12 ++-- src/xrstate.c | 4 +- src/xrstroker.c | 79 ++++++++++--------- src/xrtransform.c | 22 +++--- xr.c | 190 ++++++++++++++++++++++++++++------------------ xrgstate.c | 221 ++++++++++++++++++++++++++++++++++++++++------------- xrint.h | 87 ++++++++++++++------- xrpath.c | 121 ++++++++++++++++++------------ xrpen.c | 12 ++-- xrstate.c | 4 +- xrstroker.c | 79 ++++++++++--------- xrtransform.c | 22 +++--- 19 files changed, 1016 insertions(+), 529 deletions(-) commit 0b6fd5b4d11a6557b762696bbfb3ea7ec5233ed3 Author: Carl Worth Date: Thu Oct 24 11:27:29 2002 +0000 Added XrSetFillRule ChangeLog | 4 ++++ Xr.h | 5 +++++ src/Xr.h | 5 +++++ src/xr.c | 6 ++++++ src/xrfiller.c | 2 +- src/xrgstate.c | 8 +++++++- src/xrint.h | 10 ++++++---- src/xrtraps.c | 6 +++--- xr.c | 6 ++++++ xrfiller.c | 2 +- xrgstate.c | 8 +++++++- xrint.h | 10 ++++++---- xrtraps.c | 6 +++--- 13 files changed, 60 insertions(+), 18 deletions(-) commit 8379c09a5b7111235da02e6cd74bcbe06e120bcd Author: Carl Worth Date: Wed Oct 23 18:30:53 2002 +0000 Fix for paths with multiple polygons disjoint in Y ChangeLog | 5 +++++ src/xrtraps.c | 5 ++++- xrtraps.c | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) commit f07852454c2f34b9582d9a74ea83d74dcdb40dcc Author: Carl Worth Date: Wed Oct 23 11:58:38 2002 +0000 Added XrConcatMatrix, XrGetStatus. Properly clip color, alpha, and tolerance values from the user. Renamed _XrTransformPointWithoutTranslate to _XrTransformDistance. Added new XrIntStatus type for error codes that are not exported. Xr.h | 16 +++++++++++++ src/Xr.h | 16 +++++++++++++ src/xr.c | 37 +++++++++++++++++++++++++++++++ src/xrfiller.c | 2 +- src/xrgstate.c | 22 +++++++++++++++--- src/xrint.h | 26 +++++++++++++-------- src/xrpen.c | 2 +- src/xrspline.c | 4 +- src/xrstroker.c | 16 ++++++------ src/xrtransform.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++---- xr.c | 37 +++++++++++++++++++++++++++++++ xrfiller.c | 2 +- xrgstate.c | 22 +++++++++++++++--- xrint.h | 26 +++++++++++++-------- xrpen.c | 2 +- xrspline.c | 4 +- xrstroker.c | 16 ++++++------ xrtransform.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++---- 18 files changed, 312 insertions(+), 62 deletions(-) commit 88237e451e9719a211c3f2292f7679d4ac25654a Author: Carl Worth Date: Wed Oct 16 12:57:00 2002 +0000 Various cleanups, (no functional changes). Changed arguments for XrRel* from x,y to dx,dy. Changed XrError to XrStatus. Added a prefix of '_' to all internal functions Xr.h | 10 +- src/Xr.h | 10 +- src/xr.c | 146 ++++++++++++++------------- src/xrcolor.c | 8 +- src/xrfiller.c | 54 +++++----- src/xrgstate.c | 264 ++++++++++++++++++++++++------------------------ src/xrint.h | 290 ++++++++++++++++++++++++++--------------------------- src/xrmisc.c | 2 +- src/xrpath.c | 76 +++++++------- src/xrpen.c | 114 +++++++++++----------- src/xrpolygon.c | 52 +++++----- src/xrspline.c | 88 ++++++++-------- src/xrstate.c | 40 ++++---- src/xrstroker.c | 224 ++++++++++++++++++++-------------------- src/xrsurface.c | 12 +- src/xrtransform.c | 66 ++++++------ src/xrtraps.c | 98 +++++++++--------- xr.c | 146 ++++++++++++++------------- xrcolor.c | 8 +- xrfiller.c | 54 +++++----- xrgstate.c | 264 ++++++++++++++++++++++++------------------------ xrint.h | 290 ++++++++++++++++++++++++++--------------------------- xrmisc.c | 2 +- xrpath.c | 76 +++++++------- xrpen.c | 114 +++++++++++----------- xrpolygon.c | 52 +++++----- xrspline.c | 88 ++++++++-------- xrstate.c | 40 ++++---- xrstroker.c | 224 ++++++++++++++++++++-------------------- xrsurface.c | 12 +- xrtransform.c | 66 ++++++------ xrtraps.c | 98 +++++++++--------- 32 files changed, 1544 insertions(+), 1544 deletions(-) commit fe0606c7635ec666c3ea0695d30adefe3f47caad Author: Carl Worth Date: Tue Oct 1 04:37:42 2002 +0000 Standardized bracing-style and indentation src/xrpath.c | 8 +++----- src/xrpen.c | 30 +++++++++++++++--------------- src/xrstroker.c | 19 ++++++------------- xrpath.c | 8 +++----- xrpen.c | 30 +++++++++++++++--------------- xrstroker.c | 19 ++++++------------- 6 files changed, 48 insertions(+), 66 deletions(-) commit cf44ac0f7a2a91b11cf614bdf916f2d46234826c Author: Carl Worth Date: Tue Oct 1 04:28:20 2002 +0000 Fixed pen when it has more than 2 duplicate vertices. Imposed minimum value on tolerance to avoid infinite recursion. src/xrgstate.c | 2 ++ src/xrint.h | 1 + src/xrpen.c | 2 ++ xrgstate.c | 2 ++ xrint.h | 1 + xrpen.c | 2 ++ 6 files changed, 10 insertions(+), 0 deletions(-) commit c5e37af245f02d7c2a40dd2cf457cfac25f253b5 Author: Carl Worth Date: Fri Sep 20 09:43:42 2002 +0000 Fixed rounding bug in _ComputeX. Use if statement instead of while loop to increment intersection Y value src/xrtraps.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++---------- xrtraps.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 112 insertions(+), 26 deletions(-) commit e9255b4688fe516ade5a83a41c87036e686e3d1c Author: Carl Worth Date: Tue Sep 17 14:44:52 2002 +0000 Fixed intersection test for parallel lines src/xrtraps.c | 32 ++++++++++++++++++-------------- xrtraps.c | 32 ++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 28 deletions(-) commit a2265c8e1bb35c649f2606f82caefdbf8cd86272 Author: Carl Worth Date: Tue Sep 17 14:21:36 2002 +0000 Added comments describing polygon tessellation algorithm src/xrtraps.c | 25 +++++++++++++++++++++++++ xrtraps.c | 25 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 0 deletions(-) commit d334c8bf8f6814976ba12a31643917d0ede86088 Author: Carl Worth Date: Tue Sep 17 13:38:55 2002 +0000 Cleaned up polygon tessellation code. Fixes all known problems. src/xrint.h | 3 - src/xrtraps.c | 119 ++++++++++++++++++++++++++++++++------------------------ xrint.h | 3 - xrtraps.c | 119 ++++++++++++++++++++++++++++++++------------------------ 4 files changed, 136 insertions(+), 108 deletions(-) commit 546b33d3627639b5ef38615ab2797f36e5d18939 Author: Carl Worth Date: Fri Sep 13 19:01:01 2002 +0000 Fixed some broken polygons by adding another sort to polygon tessellation code. src/xrtraps.c | 92 ++++++++++++++++++++++++++++++++------------------------- xrtraps.c | 92 ++++++++++++++++++++++++++++++++------------------------- 2 files changed, 104 insertions(+), 80 deletions(-) commit b2d0004956a17c0cfa6ee2fd6a5a4dbacc6846b9 Author: Carl Worth Date: Fri Sep 13 13:27:51 2002 +0000 Fixed _XrPenVerticesNeeded to not return negative numbers under scaling src/xrpen.c | 19 ++++++++++--------- xrpen.c | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) commit 1fa0a496bb9689a5ebeacabd9cc3d05d48a1f4c3 Author: Carl Worth Date: Fri Sep 13 12:55:37 2002 +0000 Removed state from XrFiller that was redundant with state in XrPolygon. Fixed state update in XrStroker so that paths with multiple subpaths work. Simplified error-prone sorting in XrPenAddPoints. Renamed XrPenVertexTag to XrPenVertexFlag, (to allow for a single vertex that is the starting point for both the forward and reverse half-path). Xr.h | 2 - src/Xr.h | 2 - src/xrfiller.c | 17 +-------- src/xrint.h | 26 ++++++-------- src/xrpen.c | 104 +++++++++++++++++++++++++----------------------------- src/xrstroker.c | 26 ++++++------- src/xrtraps.c | 12 ++++--- xrfiller.c | 17 +-------- xrint.h | 26 ++++++-------- xrpen.c | 104 +++++++++++++++++++++++++----------------------------- xrstroker.c | 26 ++++++------- xrtraps.c | 12 ++++--- 12 files changed, 158 insertions(+), 216 deletions(-) commit 2ba3786b272b89da4f7fd264db55dc0a4744aad9 Author: Carl Worth Date: Tue Sep 10 09:51:14 2002 +0000 Fixed rendering of degenerate splines. Changed XrStrokeFace to define everything in terms of the direction of the path src/xrfiller.c | 5 +++- src/xrint.h | 5 ++- src/xrspline.c | 16 +++++--------- src/xrstroker.c | 58 +++++++++++++++++++------------------------------------ xrfiller.c | 5 +++- xrint.h | 5 ++- xrspline.c | 16 +++++--------- xrstroker.c | 58 +++++++++++++++++++------------------------------------ 8 files changed, 66 insertions(+), 102 deletions(-) commit 5f1938f26ff64d9036a5f78cdc47641427924a1d Author: Carl Worth Date: Tue Sep 10 08:01:00 2002 +0000 Fixed spline error calculation. New effort to compute spline initial/final slopes even for degenerate splines, (degenerate splines are still broken somewhere though). Imakefile | 2 + src/xrgstate.c | 25 ++++++++--- src/xrint.h | 20 +++++++--- src/xrmisc.c | 34 ++++++++++++++++ src/xrpath.c | 2 - src/xrpen.c | 22 +++------- src/xrpolygon.c | 1 + src/xrspline.c | 118 +++++++++++++++++++++++++++++++++++++++++++----------- src/xrtraps.c | 1 + xrgstate.c | 25 ++++++++--- xrint.h | 20 +++++++--- xrmisc.c | 34 ++++++++++++++++ xrpath.c | 2 - xrpen.c | 22 +++------- xrpolygon.c | 1 + xrspline.c | 118 +++++++++++++++++++++++++++++++++++++++++++----------- xrtraps.c | 1 + 17 files changed, 340 insertions(+), 108 deletions(-) commit 44ca388c90aea7ed1b04784ddf3e53b339e0eb32 Author: Carl Worth Date: Thu Sep 5 13:12:23 2002 +0000 Fix polygon stroking so last final face is rendered exactly. Fix bug in which XrPolygonAddPt with horizontal edge would then drop the next edge. src/xrint.h | 2 +- src/xrpen.c | 49 +++++++++++++++++++++++++++++-------------------- src/xrpolygon.c | 3 ++- src/xrstroker.c | 6 +----- xrint.h | 2 +- xrpen.c | 49 +++++++++++++++++++++++++++++-------------------- xrpolygon.c | 3 ++- xrstroker.c | 6 +----- 8 files changed, 66 insertions(+), 54 deletions(-) commit bc362fc2e4bcf2324eda74c5d6290f4da6645e20 Author: Carl Worth Date: Thu Sep 5 10:06:44 2002 +0000 Corrected XrPenVerticesNeeded for handling transformed pens src/xrint.h | 3 +++ src/xrpen.c | 26 ++++++++++++++++---------- src/xrtransform.c | 32 ++++++++++++++++++++++++++++++++ xrint.h | 3 +++ xrpen.c | 26 ++++++++++++++++---------- xrtransform.c | 32 ++++++++++++++++++++++++++++++++ 6 files changed, 102 insertions(+), 20 deletions(-) commit 34ab06281fe53dde2d9b12780221b91dbafe940a Author: Carl Worth Date: Wed Sep 4 16:11:35 2002 +0000 Fixed brain-damaged XrPenVertexCompareByTheta. Correctly handle degenerate miter joins src/xrpen.c | 9 ++++++++- src/xrstroker.c | 10 ++++++++++ xrpen.c | 9 ++++++++- xrstroker.c | 10 ++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) commit 13216da122ba167d8a2c0a5bca37c844ccea2026 Author: Carl Worth Date: Wed Sep 4 07:28:56 2002 +0000 Fixed pen to transform user-space radius to device space, (vertices_needed computation still broken). Pen now behaves well when an extra point is coincident with an original vertex point. Xr.h | 4 ---- src/Xr.h | 4 ---- src/xrgstate.c | 5 ++++- src/xrint.h | 2 +- src/xrpen.c | 36 +++++++++++++++++++++++++++--------- src/xrstroker.c | 47 ++++++++++++++++++++++++++++++----------------- xrgstate.c | 5 ++++- xrint.h | 2 +- xrpen.c | 36 +++++++++++++++++++++++++++--------- xrstroker.c | 47 ++++++++++++++++++++++++++++++----------------- 10 files changed, 124 insertions(+), 64 deletions(-) commit cf6f2e67d9ff908054779480699440ea2736fe68 Author: Carl Worth Date: Tue Sep 3 08:42:25 2002 +0000 Added initial spline support. Added XrSetTolerance Xr.h | 5 +- src/Xr.h | 5 +- src/xr.c | 11 ++- src/xrfiller.c | 29 +++++- src/xrgstate.c | 10 ++ src/xrint.h | 66 ++++++++++++--- src/xrpen.c | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/xrpolygon.c | 58 ++++++++++++ src/xrspline.c | 164 +++++++++++++++++++++++++++++++++- src/xrstroker.c | 136 +++++++++++++++++++++-------- src/xrtraps.c | 6 +- xr.c | 11 ++- xrfiller.c | 29 +++++- xrgstate.c | 10 ++ xrint.h | 66 ++++++++++++--- xrpen.c | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- xrpolygon.c | 58 ++++++++++++ xrspline.c | 164 +++++++++++++++++++++++++++++++++- xrstroker.c | 136 +++++++++++++++++++++-------- xrtraps.c | 6 +- 20 files changed, 1354 insertions(+), 144 deletions(-) commit 25011eade4e33030bd86392e44bc02c945c5c0c3 Author: Keith Packard Date: Sun Aug 18 22:55:58 2002 +0000 Add dashed line support. Needs work to simplify some case analysis. src/xrgstate.c | 10 ++- src/xrint.h | 8 ++ src/xrstroker.c | 225 +++++++++++++++++++++++++++++++++++++++++++++++++------ xrgstate.c | 10 ++- xrint.h | 8 ++ xrstroker.c | 225 +++++++++++++++++++++++++++++++++++++++++++++++++------ 6 files changed, 436 insertions(+), 50 deletions(-) commit f20a4a96c77a251e18dc65f1ab9c24a10007b466 Author: Carl Worth Date: Thu Aug 15 17:33:00 2002 +0000 Fixed XrPen stubs Imakefile | 2 ++ src/xrpen.c | 5 ++++- xrpen.c | 5 ++++- 3 files changed, 10 insertions(+), 2 deletions(-) commit 2d8f2f4946b789b5d14731e8eed77dc63dee035c Author: Carl Worth Date: Thu Aug 15 17:30:03 2002 +0000 Added xrpen/xrspline src/xrpen.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xrspline.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ xrpen.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xrspline.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 208 insertions(+), 0 deletions(-) commit c1c7ee62bcf7e412fb74552ce171fbe44f5b4e7b Author: Carl Worth Date: Thu Aug 15 17:29:26 2002 +0000 Cleaned up XrPathInterpret. Prepare for splines Imakefile | 4 ++ src/xrfiller.c | 94 +++++++++++++++++++++++++++++++++++++++ src/xrgstate.c | 51 +++++++++++++--------- src/xrint.h | 113 ++++++++++++++++++++++++++++++++++++++++++----- src/xrpath.c | 126 +++++++++++++++++++++++++---------------------------- src/xrpolygon.c | 54 ++++++++++------------- src/xrstroker.c | 46 +++++++++++++++++++- src/xrtransform.c | 8 --- xrfiller.c | 94 +++++++++++++++++++++++++++++++++++++++ xrgstate.c | 51 +++++++++++++--------- xrint.h | 113 ++++++++++++++++++++++++++++++++++++++++++----- xrpath.c | 126 +++++++++++++++++++++++++---------------------------- xrpolygon.c | 54 ++++++++++------------- xrstroker.c | 46 +++++++++++++++++++- xrtransform.c | 8 --- 15 files changed, 706 insertions(+), 282 deletions(-) commit 20f631ce22d1189410d21db077e3b38a70e06bf7 Author: Keith Packard Date: Thu Aug 15 17:19:28 2002 +0000 Add dashes, collapse stroke_style/fill_style into gstate Xr.h | 3 ++ src/Xr.h | 3 ++ src/xr.c | 9 ++++++++ src/xrgstate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++--------- src/xrint.h | 23 ++++++++++--------- src/xrstroker.c | 19 ++++++++-------- xr.c | 9 ++++++++ xrgstate.c | 62 +++++++++++++++++++++++++++++++++++++++++++++--------- xrint.h | 23 ++++++++++--------- xrstroker.c | 19 ++++++++-------- 10 files changed, 168 insertions(+), 64 deletions(-) commit ba6c4971300181f64084437ba190e90c6c21cc5e Author: Keith Packard Date: Thu Aug 15 16:48:16 2002 +0000 Fix combined transforms, fix caps/joins under transform src/xrgstate.c | 2 +- src/xrpath.c | 2 + src/xrstroker.c | 75 +++++++++++++++++++++++++++++++++++++++++++---------- src/xrtransform.c | 12 +++++--- xrgstate.c | 2 +- xrpath.c | 2 + xrstroker.c | 75 +++++++++++++++++++++++++++++++++++++++++++---------- xrtransform.c | 12 +++++--- 8 files changed, 144 insertions(+), 38 deletions(-) commit 91f09687e5bebd8436e2e1c34ec153b976a3cc30 Author: Carl Worth Date: Thu Aug 15 05:22:59 2002 +0000 Added error handling (Xr shutdown) for out-of-memory handling. Started adding spline functions. Xr.h | 12 +++++ src/Xr.h | 12 +++++ src/xr.c | 93 +++++++++++++++++++++++++++++++++++++---- src/xrgstate.c | 116 +++++++++++++++++++++++++++++++++++---------------- src/xrint.h | 59 +++++++++++++------------- src/xrpath.c | 124 +++++++++++++++++++++++++++++++++---------------------- src/xrpolygon.c | 31 +++++++++----- src/xrstate.c | 22 ++++++++-- src/xrstroker.c | 92 +++++++++++++++-------------------------- src/xrtraps.c | 94 ++++++++++++++++++++++------------------- xr.c | 93 +++++++++++++++++++++++++++++++++++++---- xrgstate.c | 116 +++++++++++++++++++++++++++++++++++---------------- xrint.h | 59 +++++++++++++------------- xrpath.c | 124 +++++++++++++++++++++++++++++++++---------------------- xrpolygon.c | 31 +++++++++----- xrstate.c | 22 ++++++++-- xrstroker.c | 92 +++++++++++++++-------------------------- xrtraps.c | 94 ++++++++++++++++++++++------------------- 18 files changed, 804 insertions(+), 482 deletions(-) commit ba3bce9d7e3ad45db5a2ce115404bd332d868ac7 Author: Keith Packard Date: Thu Aug 15 03:50:28 2002 +0000 Note that the only rectangles could be quickly converted to traps. Add miter joins src/xrint.h | 6 +--- src/xrstroker.c | 78 ++++++++++++++++++++++++++++++++++++++++++------------ src/xrtraps.c | 16 +---------- xrint.h | 6 +--- xrstroker.c | 78 ++++++++++++++++++++++++++++++++++++++++++------------ xrtraps.c | 16 +---------- 6 files changed, 126 insertions(+), 74 deletions(-) commit e55de618e7386364032fc4985a67942cd7a825eb Author: Keith Packard Date: Wed Aug 14 19:19:33 2002 +0000 Add bevel joins src/xrgstate.c | 4 +- src/xrint.h | 3 ++ src/xrpath.c | 5 ---- src/xrpolygon.c | 6 +++++ src/xrstroker.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++-------- xrgstate.c | 4 +- xrint.h | 3 ++ xrpath.c | 5 ---- xrpolygon.c | 6 +++++ xrstroker.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++-------- 10 files changed, 130 insertions(+), 34 deletions(-) commit 6b1903c40e74d13a9387ff1afa5fa5d19c1b8a29 Author: Keith Packard Date: Wed Aug 14 18:32:42 2002 +0000 Prepare for joins and caps Imakefile | 4 +++ src/xrint.h | 18 ++++++++++++++ src/xrpath.c | 21 +++++++++++++++- src/xrstroker.c | 67 ++++++++++++++++++++++++++++++++++++++++++++---------- xrint.h | 18 ++++++++++++++ xrpath.c | 21 +++++++++++++++- xrstroker.c | 67 ++++++++++++++++++++++++++++++++++++++++++++---------- 7 files changed, 186 insertions(+), 30 deletions(-) commit 71b804a30163404eb30df6d81a9ee3477e0d5bcb Author: Carl Worth Date: Wed Aug 14 17:32:22 2002 +0000 Fixed XrFill to implicitly call ClosePath. Broke off XrFillStyle/XrStrokeStyle src/xr.c | 1 + src/xrgstate.c | 37 +++++++++++++++++++++++++------------ src/xrint.h | 26 ++++++++++++++------------ src/xrpath.c | 27 --------------------------- src/xrstroker.c | 5 +++-- xr.c | 1 + xrgstate.c | 37 +++++++++++++++++++++++++------------ xrint.h | 26 ++++++++++++++------------ xrpath.c | 27 --------------------------- xrstroker.c | 5 +++-- 10 files changed, 86 insertions(+), 106 deletions(-) commit 466fc8700f22e6635997a5b427732d51b9d6b5cd Author: Carl Worth Date: Wed Aug 14 00:44:28 2002 +0000 Handle degenerate polygons (no edges) src/xrtraps.c | 5 ++++- xrtraps.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) commit 48bd9e5d30be831e71f12def2e521a7fa713e06a Author: Carl Worth Date: Wed Aug 14 00:39:43 2002 +0000 Total rewrite of path storage/interpretation in preparation for splines. Imakefile | 6 +- Xr.h | 33 ++--- src/Xr.h | 33 ++--- src/xr.c | 41 +++--- src/xrcolor.c | 33 ++--- src/xrgstate.c | 289 ++++++--------------------------------- src/xrint.h | 206 ++++++++++++++-------------- src/xrpath.c | 393 ++++++++++++++++++++++++++++++++++++++++++----------- src/xrpolygon.c | 104 ++++++++++++++ src/xrstate.c | 33 ++--- src/xrstroker.c | 141 +++++++++++++++++++ src/xrsurface.c | 33 ++--- src/xrtransform.c | 33 ++--- src/xrtraps.c | 210 +++++++++-------------------- xr.c | 41 +++--- xrcolor.c | 33 ++--- xrgstate.c | 289 ++++++--------------------------------- xrint.h | 206 ++++++++++++++-------------- xrpath.c | 393 ++++++++++++++++++++++++++++++++++++++++++----------- xrpolygon.c | 104 ++++++++++++++ xrstate.c | 33 ++--- xrstroker.c | 141 +++++++++++++++++++ xrsubpath.c | 150 -------------------- xrsurface.c | 33 ++--- xrtransform.c | 33 ++--- xrtraps.c | 210 +++++++++-------------------- 26 files changed, 1718 insertions(+), 1536 deletions(-) commit 9824dc894440bc2566206bb5f04d403d68bf24c0 Author: Carl Worth Date: Mon Aug 12 11:43:56 2002 +0000 Fixed XrPathClose to deal with empty path src/xrpath.c | 6 ++++-- xrpath.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) commit c2824c4ded348a6cfa56ab55db5857d3021f54ca Author: Carl Worth Date: Mon Aug 12 09:38:05 2002 +0000 Stabilized the sort used to generate traps. Discard degenerate traps Imakefile | 13 ++++--------- src/xrgstate.c | 2 +- src/xrtraps.c | 10 +++++++++- xrgstate.c | 2 +- xrtraps.c | 10 +++++++++- 5 files changed, 24 insertions(+), 13 deletions(-) commit c44bf18e78f502fb30fa62db171216289d5ee5d3 Author: Carl Worth Date: Wed Aug 7 19:49:36 2002 +0000 Fixed missing semicolon. src/xrsurface.c | 2 +- xrsurface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 9ee45ab8164593f1e368b99c0d63bd4b21a4daa1 Author: Carl Worth Date: Wed Aug 7 19:48:49 2002 +0000 Fixed missing xrtraps.c src/xrtraps.c | 494 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ xrtraps.c | 494 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 988 insertions(+), 0 deletions(-) commit f7f194c47dbf20a9ba56bb928be78530c98bc16c Author: Carl Worth Date: Tue Jul 23 07:22:56 2002 +0000 Added ChangeLog ChangeLog | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) commit f8fef556d7b5eb391ce52d4307252e4a1a30b024 Author: Carl Worth Date: Tue Jul 23 07:22:23 2002 +0000 See ChangeLog for 2002-07-16 Imakefile | 10 ++- Xr.h | 79 +++++++++++++++-- src/Xr.h | 79 +++++++++++++++-- src/xr.c | 26 +++++- src/xrcolor.c | 16 ++-- src/xrgstate.c | 264 ++++++++++++++++++++++++++++++++++++------------------- src/xrint.h | 110 ++++++++++++++++++------ src/xrpath.c | 6 +- src/xrsurface.c | 134 ++++++++++++++++++++++++++++ xr.c | 26 +++++- xrcolor.c | 16 ++-- xrgstate.c | 264 ++++++++++++++++++++++++++++++++++++------------------- xrint.h | 110 ++++++++++++++++++------ xrpath.c | 6 +- xrpicture.c | 134 ---------------------------- xrsubpath.c | 5 +- xrsurface.c | 134 ++++++++++++++++++++++++++++ 17 files changed, 1015 insertions(+), 404 deletions(-) commit 093b754cb1014ed95baaa1bde579d033d7856e46 Author: Carl Worth Date: Fri Jun 14 15:13:44 2002 +0000 Added XrSetVisual, XrSetFormat. Fixed XrSetAlpha. Fixed transformed line widths, (added inverse CTM). Xr.h | 16 ++++++++-- src/Xr.h | 16 ++++++++-- src/xr.c | 27 +++++++++++------ src/xrcolor.c | 1 + src/xrgstate.c | 82 +++++++++++++++++++++++++++++++++++++--------------- src/xrint.h | 38 ++++++++++++++++++------ src/xrtransform.c | 77 +++++++++++++++++++++++++++++++++++--------------- xr.c | 27 +++++++++++------ xrcolor.c | 1 + xrgstate.c | 82 +++++++++++++++++++++++++++++++++++++--------------- xrint.h | 38 ++++++++++++++++++------ xrpicture.c | 60 +++++++++++++++++++++++++++++--------- xrsubpath.c | 6 ++- xrtransform.c | 77 +++++++++++++++++++++++++++++++++++--------------- 14 files changed, 394 insertions(+), 154 deletions(-) libgdiplus-2.11/cairo/aclocal.m40000664000175000017500000125272612225470237013476 00000000000000# generated automatically by aclocal 1.11.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, # Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. m4_define([_LT_COPYING], [dnl # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ]) # serial 57 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_CC_BASENAME(CC) # ------------------- # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. m4_defun([_LT_CC_BASENAME], [for cc_temp in $1""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from `configure', and `config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # `config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain="$ac_aux_dir/ltmain.sh" ])# _LT_PROG_LTMAIN # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the `libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to `config.status' so that its # declaration there will have the same value as in `configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags="_LT_TAGS"dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the `libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into `config.status', and then the shell code to quote escape them in # for loops in `config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # `#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test $lt_write_fail = 0 && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ \`$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test $[#] != 0 do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try \`$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try \`$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test "$silent" = yes && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # _LT_COPYING _LT_LIBTOOL_TAGS # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) _LT_PROG_REPLACE_SHELLFNS mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS="$save_LDFLAGS" ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[[012]]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test "$lt_cv_ld_force_load" = "yes"; then _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\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all _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}" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" _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}" _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}" m4_if([$1], [CXX], [ if test "$lt_cv_apple_cc_single_mod" != "yes"; then _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}" _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}" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script which will find a shell with a builtin # printf (which we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case "$ECHO" in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [ --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified).], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([${with_sysroot}]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and in which our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cru} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test x"[$]$2" = xyes; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n $lt_cv_sys_max_cmd_len ; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen="shl_load"], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen="dlopen"], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) ]) ]) ]) ]) ]) ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links="nottested" if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test "$hard_links" = no; then AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", [Define to the sub-directory in which libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then # We can hardcode non-existent directories. if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([], [sys_lib_dlsearch_path_spec], [2], [Run-time system search path for libraries]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program which can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$1; then lt_cv_path_MAGIC_CMD="$ac_dir/$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac]) MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program which can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [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]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi]) if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test "$GCC" = yes; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _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" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _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' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _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' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _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' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _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' else _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' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi _LT_TAGVAR(link_all_deplibs, $1)=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. _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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _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)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _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' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then _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' else _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' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test "$with_gnu_ld" = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then _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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS="$save_LDFLAGS"]) if test "$lt_cv_irix_exported_symbol" = yes; then _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' fi else _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' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _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' _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _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~ $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' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting ${shlibpath_var} if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC="$CC" AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report which library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC="$lt_save_CC" ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to `libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" _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" else if test "$host_cpu" = ia64; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _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" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared # libraries. _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' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $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' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then _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' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _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' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _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' ;; *) _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' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _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' _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' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _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' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then _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' else _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' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $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' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _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' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' _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' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _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' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd2*) # C++ shared libraries are fairly broken _LT_TAGVAR(ld_shlibs, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then _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' _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' _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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _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' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $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~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) _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' ;; *) _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' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _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' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no _LT_TAGVAR(GCC, $1)="$GXX" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)="${prev}${p}" else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)="$p" else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)="$p" else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' fi ;; esac ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test "X$F77" = "Xno"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_F77" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$G77" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC="$lt_save_CC" CFLAGS="$lt_save_CFLAGS" fi # test "$_lt_disable_F77" != yes AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test "X$FC" = "Xno"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_disable_FC" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" _LT_TAGVAR(LD, $1)="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test "$_lt_disable_FC" != yes AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)="$LD" _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to `libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code="$lt_simple_compile_test_code" # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC="$CC" lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f $lt_ac_sed && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test $lt_ac_count -gt 10 && break lt_ac_count=`expr $lt_ac_count + 1` if test $lt_ac_count -gt $lt_ac_max; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [AC_MSG_CHECKING([whether the shell understands some XSI constructs]) # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes AC_MSG_RESULT([$xsi_shell]) _LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) AC_MSG_CHECKING([whether the shell understands "+="]) lt_shell_append=no ( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes AC_MSG_RESULT([$lt_shell_append]) _LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) # ------------------------------------------------------ # In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and # '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. m4_defun([_LT_PROG_FUNCTION_REPLACE], [dnl { sed -e '/^$1 ()$/,/^} # $1 /c\ $1 ()\ {\ m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) } # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: ]) # _LT_PROG_REPLACE_SHELLFNS # ------------------------- # Replace existing portable implementations of several shell functions with # equivalent extended shell implementations where those features are available.. m4_defun([_LT_PROG_REPLACE_SHELLFNS], [if test x"$xsi_shell" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl case ${1} in */*) func_dirname_result="${1%/*}${2}" ;; * ) func_dirname_result="${3}" ;; esac func_basename_result="${1##*/}"]) _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary parameter first. func_stripname_result=${3} func_stripname_result=${func_stripname_result#"${1}"} func_stripname_result=${func_stripname_result%"${2}"}]) _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl func_split_long_opt_name=${1%%=*} func_split_long_opt_arg=${1#*=}]) _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl case ${1} in *.lo) func_lo2o_result=${1%.lo}.${objext} ;; *) func_lo2o_result=${1} ;; esac]) _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) fi if test x"$lt_shell_append" = xyes; then _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl func_quote_for_eval "${2}" dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) fi ]) # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine which file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS # Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, # Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 7 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option `$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl `shared' nor `disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) ]) ])# _LT_SET_OPTIONS # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the `shared' and # `disable-shared' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the `static' and # `disable-static' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the `fast-install' # and `disable-fast-install' LT_INIT options. # DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the `pic-only' and `no-pic' # LT_INIT options. # MODE is either `yes' or `no'. If omitted, it defaults to `both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac], [pic_mode=default]) test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the `pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) # ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 6 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59 which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) # ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # @configure_input@ # serial 3337 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.2]) m4_define([LT_PACKAGE_REVISION], [1.3337]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.2' macro_revision='1.3337' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) # lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004. # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # serial 5 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.11' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.11.6], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.11.6])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009, # 2010, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 12 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 5 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 16 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.62])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) _AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl dnl The `parallel-tests' driver may need to know about EXEEXT, so add the dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl ]) dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005, 2008, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 6 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006, 2011 Free Software Foundation, # Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 Free Software # Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005, 2011 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 1 # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006, 2008, 2010 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005, 2012 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([acinclude.m4]) libgdiplus-2.11/cairo/AUTHORS0000664000175000017500000001555512225470167012704 00000000000000Josh Aas Memory leak fix for quartz backend Daniel Amelang Many (magic) floating-point optimizations Shawn T. Amundson Build fix Olivier Andrieu PNG backend Peter Dennis Bartok Bug fix for clipping Dave Beckett Build fixes, Debian packaging Christian Biesinger BeOS backend Billy Biggs Pixman code merge. Optimization. Fixes for subtle rendering bugs. Hans Breuer win32 bug fixes, build fixes, and improvements Brian Cameron Flag bug in Sun's X server Damien Carbery Build fixes Andrew Chant Adding const where needed Steve Chaplin Bug fixes for PNG reading Tomasz Cholewo Bug fixes Manu Cornet SVG build fix Frederic Crozat Fix test suite for OPD platforms (IA64 or PPC64) Radek Doulík Bug report and test case John Ehresman Build fixes for win32 John Ellson First font/glyph extents functions Michael Emmel DirectFB backend Miklós Erdélyi Fix typo leading to a crash Behdad Esfahbod Huge piles of bug fixes, improvements, and general maintenance Brian Ewins ATSUI maintenance (first success at making it really work) Bertram Felgenhauer Fixes for subtle arithmetic errors Bdale Garbee Provided essential support for cairo achitecture sessions Jens Granseuer Fixes to generate proper compiler flags Laxmi Harikumar Build fix J. Ali Harlow win32 backend updates Mathias Hasselmann Significant reduction of calls to malloc Richard Henderson "slim" macros for better shared libraries James Henstridge Build fixes related to freetype Graydon Hoare Support for non-render X server, first real text support Thomas Hunger Initial version of cairo_in_stroke/fill Kristian Høgsberg PDF backend, PS backend with meta-surfaces Amaury Jacquot Documentation review, appplication testing Adrian Johnson PDF backend improvement Michael Johnson Bug fix for pre-C99 compilers Jonathon Jongsma Fix documentation typos Øyvind KolÃ¥s Bug fixes. Better default values. Martin Kretzschmar Arithmetic fix for 64-bit architectures Mathieu Lacage several bug/typo fixes Dominic Lachowicz PDF conformance fix, fix image surface to zero out contents Alexander Larsson Profiling and performance fixes. Tor Lillqvist win32 build fixes, build scripts Jinghua Luo Add bitmap glyph transformation, many freetype and glitz fixes Luke-Jr Build fix for cross-compiling Kjartan Maraas Several fixes for sparse, lots of debug help for multi-thread bugs Jordi Mas Bug fix for cairo_show_text Nicholas Miell Fixes for linking bugs on AMD64 Eugeniy Meshcheryakov PS/PDF font subsetting improvements Zakharov Mikhail Build fix for HP-UX Christopher (Monty) Montgomery Performnace fix (subimage_copy), multi-thread testing Tim Mooney Fix test suite to compile with Solaris compiler Jeff Muizelaar Patient, painful, pixman code merge. Many fixes for intricacies of dashing. Yevgen Muntyan win32 build fix Declan Naughton Fix documentation typos Peter Nilsson Glitz backend Henning Noren Fix memory leak Geoff Norton Build fixes Robert O'Callahan Const-correctness fixes, several new API functions for completeness (and to help mozilla) Ian Osgood XCB backend maintenance Benjamin Otte Refinements to cairo/perf timing Mike Owens Bug fixes Emmanuel Pacaud SVG backend Keith Packard Original concept, polygon tessellation, dashing, font metrics rewrite Stuart Parmenter Original GDI+ backend, win32 fixes Alfred Peng Fixes for Sun compilers and for a memory leak Christof Petig Build fixes related to freetype Joonas Pihlaja Huge improvements to the tessellator performance Mart Raudsepp Build fixes David Reveman New pattern API, glitz backend Calum Robinson Quartz backend Pavel Roskin Several cleanups to eliminate warnings Tim Rowley Quartz/ATSUI fixes, X server workarounds, win32 glyph path support, test case to expose gradient regression Soeren Sandmann Lots of MMX love for pixman compositing Torsten Schönfeld Build fixes Jamey Sharp Surface/font backend virtualization, XCB backend Jason Dorje Short Build fixes and bug fixes Jeff Smith Fixes for intricacies of stroking code Travis Spencer XCB backend fix Bill Spitzak Build fix to find Xrender.h without xrender.pc Zhe Su Add support for fontconfig's embeddedbitmap option Owen Taylor Font rewrite, documentation, win32 backend Alp Toker Fix several code/comment typos Malcolm Tredinnick Documentation fixes David Turner Optimize gradient calculations Kalle Vahlman Allow perf reports to be compared across different platforms Sasha Vasko Build fix to compile without xlib backend Vladimir Vukicevic Quartz backend rewrite, win32/quartz maintenance Jonathan Watt win32 fixes Peter Weilbacher OS/2 backend Dan Williams Implemnt MMX function to help OLPC Chris Wilson Large-scale robustness improvements, (warn_unsed_result and malloc failure injection) Carl Worth Original library, support for paths, images Richard D. Worth Build fixes for cygwin Kent Worsnop Fix PDF dashing bug Dave Yeo Build fix for win32 (please let us know if we have missed anyone) libgdiplus-2.11/cairo/BUGS0000664000175000017500000000720112225470167012304 00000000000000If you find a bug in cairo we would love to hear about it. We're also trying to make cairo better, and learning about the bugs that users encounter is an essential part of that. So we really appreciate the extra effort users put in to providing high-quality bug reports. There are two acceptable ways to report cairo bugs, and you can choose which you prefer: 1) Bugzilla bug tracking database: You can use the following web interface to report new bugs, follow up on previous bug reports, and search for existing, known bugs. Just use the "cairo" product: http://bugs.freedesktop.org It is necessary to go through a quick account creation process, (with email address verification), in order to be able to report new bugs in bugzilla. We apologize for any inconvenience that might cause, and hope it won't prevent you from reporting bugs. 2) Cairo mailing list: For people who cannot stand the bugzilla interface, you can just send an email to cairo mailing list (cairo@cairographics.org). The mailing list only allows posting from subscribers, so use the following page for subscription instructions: http://cairographics.org/lists Again, we apologize for any inconvenience this subscription step might cause, but we've found it necessary to require this in order to enjoy spam-free discussions on the list. If you don't actually _want_ to be a subscriber to the mailing list, but just want to be able to send a message, the easiest thing to do is to go through the subscription process, and then use the preferences page to disable message delivery to your address. Which of the above you use to report bugs depends on your own preferences. Some people find just typing an email message much easier than using the web-based forms on bugzilla. Others greatly prefer the ability to check back on a specific bug entry in bugzilla without having to ask on the mailing list if an issue has been resolved. Regardless of which method you use, here are some general tips that will help you improve the quality of your bug report, (which will help in getting the bug fixed sooner): 1) Check to see if the bug has been reported already. It's pretty easy to run a search or two against the cairo product in the http://bugs.freedesktop.org bugzilla database. Another place to look for known bugs is the cairo ROADMAP: http://cairographics.org/ROADMAP which shows a planned schedule of releases and which bug fixes are being planned for each release. 2) Provide an accurate description of the bug with detailed steps for how we can reproduce the problem. 3) If possible provide a minimal test case demonstrating the bug. A great test case would be a minimal self-contained function in C or python or whatever language you are using for cairo. The function might accept nothing more than a cairo context, (cairo_t* in C). 4) If you feel like being particularly helpful, you could craft this minimal test case in the form necessary for cairo's test suite. This isn't much more work than writing a minimal function. Just look at the cairo/test/README file and imitate the style of existing test cases. If you do submit a test case, be sure to include Copyright information, (with the standard MIT licensing blurb if you want us to include your test in the test case). Also, including a reference image showing the expected result will be extremely useful. 5) Finally, the best bug report also comes attached with a patch to cairo to fix the bug. So send this too if you have it! Otherwise, don't worry about it and we'll try to fix cairo when we can. Thanks, and have fun with cairo! -Carl libgdiplus-2.11/cairo/configure.in0000664000175000017500000011542512225470167014142 00000000000000AC_PREREQ(2.58) dnl cairo package version number, (as distinct from shared library version) dnl For the minor number: odd => unstable series dnl even => stable series dnl For the micro number: odd => in-progress development (from git) dnl even => tar-file snapshot or release m4_define(cairo_version_major, 1) m4_define(cairo_version_minor, 6) m4_define(cairo_version_micro, 4) AC_INIT([cairo], cairo_version_major.cairo_version_minor.cairo_version_micro, [http://bugs.freedesktop.org/enter_bug.cgi?product=cairo]) AC_CONFIG_SRCDIR(src/cairo.h) AC_CONFIG_HEADERS(config.h) dnl automake 1.8 requires autoconf 2.58 dnl automake 1.7 requires autoconf 2.54 dnl automake < 1.8 does not handle TESTS=some-test$(EXEXT) as used dnl in test/Makefile.am and perf/Makefile.am AM_INIT_AUTOMAKE([1.8]) dnl =========================================================================== # libtool shared library version # Increment if the interface has additions, changes, removals. m4_define(LT_CURRENT, 19) # Increment any time the source changes; set to # 0 if you increment CURRENT m4_define(LT_REVISION, 5) # Increment if any interfaces have been added; set to 0 # if any interfaces have been removed. removal has # precedence over adding, so set to 0 if both happened. +m4_define(LT_AGE, 17) dnl =========================================================================== VERSION_INFO="LT_CURRENT():LT_REVISION():LT_AGE()" AC_SUBST(VERSION_INFO) LT_CURRENT_MINUS_AGE=m4_eval(LT_CURRENT() - LT_AGE()) AC_SUBST(LT_CURRENT_MINUS_AGE) CAIRO_VERSION_MAJOR=cairo_version_major() CAIRO_VERSION_MINOR=cairo_version_minor() CAIRO_VERSION_MICRO=cairo_version_micro() AC_SUBST(CAIRO_VERSION_MAJOR) AC_SUBST(CAIRO_VERSION_MINOR) AC_SUBST(CAIRO_VERSION_MICRO) dnl =========================================================================== AC_PATH_PROG(FIND, find) AC_PATH_PROG(XARGS, xargs) dnl =========================================================================== AC_PROG_CC AC_PROG_CPP AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL dnl required version (1.4) DON'T REMOVE! AC_STDC_HEADERS AC_C_INLINE case $host_os in darwin*) AH_VERBATIM([X_BYTE_ORDER],[ /* Deal with multiple architecture compiles on Mac OS X */ #ifdef __APPLE_CC__ #ifdef __BIG_ENDIAN__ #define WORDS_BIGENDIAN 1 #define FLOAT_WORDS_BIGENDIAN 1 #else #undef WORDS_BIGENDIAN #undef FLOAT_WORDS_BIGENDIAN #endif #endif ]) ;; *) AC_C_BIGENDIAN AX_C_FLOAT_WORDS_BIGENDIAN ;; esac dnl =========================================================================== dnl === Local macros dnl =========================================================================== dnl _CHECK_FUNCS_WITH_FLAGS(FUNCTION..., CFLAGS, LIBS dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) dnl Like AC_CHECK_FUNCS but with additional CFLAGS and LIBS dnl -------------------------------------------------------------------- AC_DEFUN([_CHECK_FUNCS_WITH_FLAGS], [ save_cflags="$CFLAGS" save_libs="$LIBS" CFLAGS="$CFLAGS $2" LIBS="$LIBS $3" AC_CHECK_FUNCS($1, $4, $5) CFLAGS="$save_cflags" LIBS="$save_libs" ]) dnl =========================================================================== AC_CHECK_FUNCS(vasnprintf ctime_r drand48) AC_MSG_CHECKING([for Sun Solaris (non-POSIX ctime_r)]) case "$host" in *-*-solaris*) CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS" solaris_posix_pthread=yes ;; *) solaris_posix_pthread=no ;; esac AC_MSG_RESULT([$solaris_posix_pthread]) dnl =========================================================================== dnl dnl Test for native atomic operations. dnl AC_MSG_CHECKING([for native atomic primitives]) cairo_atomic_primitives="none" AC_TRY_LINK([int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); }], [], AC_DEFINE(CAIRO_HAS_INTEL_ATOMIC_PRIMITIVES, 1, [Enable if your compiler supports the Intel __sync_* atomic primitives]) cairo_atomic_primitives="Intel" ) AC_MSG_RESULT([$cairo_atomic_primitives]) AC_MSG_CHECKING([whether atomic ops require a memory barrier]) case $host_cpu in i?86) cairo_atomic_op_needs_memory_barrier="no" ;; x86_64) cairo_atomic_op_needs_memory_barrier="no" ;; arm*) cairo_atomic_op_needs_memory_barrier="no" ;; *) cairo_atomic_op_needs_memory_barrier="yes" ;; esac if test "x$cairo_atomic_op_needs_memory_barrier" = "xyes"; then AC_DEFINE_UNQUOTED(CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER, 1, [whether Cairo needs memory barriers around atomic ops]) fi AC_MSG_RESULT([$cairo_atomic_op_needs_memory_barrier]) dnl =========================================================================== AC_CHECK_LIBM LIBS="$LIBS $LIBM" AC_CHECK_LIB(z, compress, [AC_CHECK_HEADER(zlib.h, [have_libz=yes], [have_libz="no (requires zlib http://www.gzip.org/zlib/)"])], [have_libz="no (requires zlib http://www.gzip.org/zlib/)"]) dnl =========================================================================== PKG_PROG_PKG_CONFIG() if test "x$PKG_CONFIG" = x; then AC_MSG_ERROR([pkg-config >= $PKGCONFIG_REQUIRED required but not found (http://pkgconfig.freedesktop.org/)]) fi dnl =========================================================================== dnl dnl cairo_cache_version should be increased every time that the backend dnl detection stuff changes in a way that removing the config.cache file may be dnl needed for correct operation. (this is only for the backend detection dnl changes; it doesn't have any effect on any other cached thing.) dnl m4_define(cairo_cache_version, 4) dnl =========================================================================== dnl dnl Define a macro to enable backends. dnl - Macro: CAIRO_BACKEND_ENABLE (NAMESPACE, NAME, ARG, FEATURE_NAME, DEFAULT, COMMANDS) dnl dnl where: dnl dnl NAMESPACE is the sub-namespace in function names, eg. "ft" for cairo_ft_... dnl NAME is the human-readable name of the backend, eg. "FreeType font" dnl ARG is what enables the backend, eg. "freetype" for --enable-freetype dnl FEATURE_NAME is what's used in cairo-features.h, eg. FT_FONT for CAIRO_HAS_FT_FONT dnl DEFAULT is the default state of the backend: dnl "no" for experimental backends, eg. your favorite new backend dnl "yes" for mandatory backends, eg. png dnl "auto" for other supported backends, eg. xlib dnl COMMANDS are run to check whether the backend can be enabled. Their dnl result may be cached, so user should not count on them being run. dnl They should set use_$(NAMESPACE) to something other than yes if the dnl backend cannot be built, eg. "no (requires SomeThing)". It then dnl should also set $(NAMESPACE)_REQUIRES/CFLAGS/LIBS/... dnl appropriately. Look at the macro definition for more details, dnl or ask if in doubt. dnl AC_DEFUN([CAIRO_BACKEND_ENABLE], [AC_ARG_ENABLE([$3], AS_HELP_STRING([--enable-$3=@<:@no/auto/yes@:>@], [Enable cairo's $2 backend @<:@default=$5@:>@]), enable_$1=$enableval, enable_$1=$5) if test "x$enable_$1" = xno; then use_$1="no (disabled, use --enable-$3 to enable)" else if test "x$cairo_cv_backend_[]$1[]_cache_version" != "x[]cairo_cache_version"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_[]$1[]_use fi AC_CACHE_CHECK([for cairo's $2 backend], cairo_cv_backend_[]$1[]_use, [echo use_[]$1=yes $1[]_REQUIRES=$ac_env_[]$1[]_REQUIRES_value $1[]_CFLAGS=$ac_env_[]$1[]_CFLAGS_value $1[]_LIBS=$ac_env_[]$1[]_LIBS_value $1[]_NONPKGCONFIG_CFLAGS=$ac_env_[]$1[]_NONPKGCONFIG_CFLAGS_value $1[]_NONPKGCONFIG_LIBS=$ac_env_[]$1[]_NONPKGCONFIG_LIBS_value $1[]_BASE=cairo $6 cairo_cv_backend_[]$1[]_use=$use_[]$1 cairo_cv_backend_[]$1[]_cache_version=cairo_cache_version cairo_cv_backend_[]$1[]_requires=$[]$1[]_REQUIRES cairo_cv_backend_[]$1[]_cflags=$[]$1[]_CFLAGS cairo_cv_backend_[]$1[]_libs=$[]$1[]_LIBS cairo_cv_backend_[]$1[]_nonpkgconfig_cflags=$[]$1[]_NONPKGCONFIG_CFLAGS cairo_cv_backend_[]$1[]_nonpkgconfig_libs=$[]$1[]_NONPKGCONFIG_LIBS cairo_cv_backend_[]$1[]_base=$[]$1[]_BASE AC_MSG_CHECKING([whether cairo's $2 backend could be enabled])]) use_[]$1=$cairo_cv_backend_[]$1[]_use $1[]_BASE=$cairo_cv_backend_[]$1[]_base $1[]_REQUIRES="$cairo_cv_backend_[]$1[]_requires " $1[]_CFLAGS="$cairo_cv_backend_[]$1[]_cflags " $1[]_LIBS="$cairo_cv_backend_[]$1[]_libs " $1[]_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_[]$1[]_nonpkgconfig_cflags " $1[]_NONPKGCONFIG_LIBS="$cairo_cv_backend_[]$1[]_nonpkgconfig_libs " # null the ones that only have space test "x$$1[]_REQUIRES" = "x " && $1[]_REQUIRES="" test "x$$1[]_CFLAGS" = "x " && $1[]_CFLAGS="" test "x$$1[]_LIBS" = "x " && $1[]_LIBS="" test "x$$1[]_NONPKGCONFIG_CFLAGS" = "x " && $1[]_NONPKGCONFIG_CFLAGS="" test "x$$1[]_NONPKGCONFIG_LIBS" = "x " && $1[]_NONPKGCONFIG_LIBS="" case $enable_[]$1 in yes) AS_IF([test "x$use_[]$1" = xyes],,[ AC_MSG_ERROR([requested $2 backend could not be enabled]) ]) ;; auto) ;; *) AC_MSG_ERROR([invalid argument passed to --enable-$3: $use_$1, should be one of @<:@no/auto/yes@:>@]) ;; esac if test "x$use_[]$1" = xyes; then CAIRO_FEATURES="$4 $CAIRO_FEATURES" CAIRO_REQUIRES="$$1_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$$1_NONPKGCONFIG_CFLAGS$$1_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$$1_NONPKGCONFIG_LIBS$$1_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$$1_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$$1_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-$1.pc | sed -e s/_/-/g` AC_MSG_NOTICE([creating $outfile]) mkdir -p src AS_IF([sed \ -e "s,@backend_name@,$1,g" \ -e "s,@Backend_Name@,$2,g" \ -e "s,@BACKEND_BASE@,$$1_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$$1_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$$1_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$$1_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile],,[ rm -f "$outfile" AC_MSG_ERROR([failed creating $outfile]) ]) else CAIRO_NO_FEATURES="$4 $CAIRO_NO_FEATURES" fi fi AM_CONDITIONAL(CAIRO_HAS_$4, test "x$use_$1" = xyes) ]) CAIRO_FEATURES="" CAIRO_NO_FEATURES="" CAIRO_REQUIRES="" CAIRO_NONPKGCONFIG_CFLAGS="" CAIRO_NONPKGCONFIG_LIBS="$LIBM" CAIRO_LDADD="" CAIRO_CFLAGS=$CAIRO_NONPKGCONFIG_CFLAGS CAIRO_LIBS=$CAIRO_NONPKGCONFIG_LIBS dnl =========================================================================== #PIXMAN_VERSION="0.10.0" #PIXMAN_REQUIRES="pixman-1 >= $PIXMAN_VERSION" #PKG_CHECK_MODULES(pixman, $PIXMAN_REQUIRES, , # [AC_MSG_ERROR([pixman >= $PIXMAN_VERSION is required #(http://cairographics.org/releases/)])]) pixman_CFLAGS='-I$(top_srcdir)/../pixman/pixman' pixman_LIBS='$(top_builddir)/../pixman/pixman/libpixman-1.la' #CAIRO_REQUIRES="$PIXMAN_REQUIRES $CAIRO_REQUIRES" CAIRO_CFLAGS="$pixman_CFLAGS $CAIRO_CFLAGS" CAIRO_LIBS="$pixman_LIBS $CAIRO_LIBS" dnl =========================================================================== CAIRO_BACKEND_ENABLE(xlib, Xlib, xlib, XLIB_SURFACE, auto, [ xlib_REQUIRES="x11" PKG_CHECK_MODULES(xlib, $xlib_REQUIRES, , [AC_MSG_RESULT(no) xlib_REQUIRES="" AC_PATH_XTRA if test "x$no_x" = xyes; then use_xlib="no (requires X development libraries)" else xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS fi]) ]) CAIRO_BACKEND_ENABLE(xlib_xrender, Xlib Xrender, xlib-xrender, XLIB_XRENDER_SURFACE, auto, [ if test "x$use_xlib" != "xyes"; then use_xlib_xrender="no (requires --enable-xlib)" else dnl Check for Xrender header files if the Xrender package is not installed: xlib_xrender_BASE=cairo-xlib xlib_xrender_REQUIRES="xrender >= 0.6" PKG_CHECK_MODULES(xlib_xrender, $xlib_xrender_REQUIRES, , [AC_MSG_RESULT(no) xlib_xrender_REQUIRES="" old_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" AC_CHECK_HEADER(X11/extensions/Xrender.h, [xlib_xrender_NONPKGCONFIG_LIBS="-lXrender"], [use_xlib_xrender="no (requires Xrender http://freedesktop.org/Software/xlibs)"]) CPPFLAGS=$old_CPPFLAGS ]) fi ]) dnl =========================================================================== CAIRO_BACKEND_ENABLE(xcb, XCB, xcb, XCB_SURFACE, no, [ xcb_REQUIRES="xcb >= 0.9.92 xcb-render >= 0.9.92 xcb-renderutil" PKG_CHECK_MODULES(xcb, $xcb_REQUIRES, , [AC_MSG_RESULT(no) use_xcb="no (requires XCB http://xcb.freedesktop.org)"]) ]) dnl =========================================================================== CAIRO_BACKEND_ENABLE(quartz, Quartz, quartz, QUARTZ_SURFACE, auto, [ dnl There is no pkgconfig for quartz; lets do a header check AC_CHECK_HEADER(ApplicationServices/ApplicationServices.h, , [use_quartz="no (ApplicationServices framework not found)"]) if test "x$use_quartz" != "xyes" ; then dnl check for CoreGraphics as a separate framework AC_CHECK_HEADER(CoreGraphics/CoreGraphics.h, , [use_quartz="no (CoreGraphics framework not found)"]) quartz_LIBS="-Xlinker -framework -Xlinker CoreGraphics" else quartz_LIBS="-Xlinker -framework -Xlinker ApplicationServices" fi ]) CAIRO_BACKEND_ENABLE(quartz_font, Quartz font, quartz-font, QUARTZ_FONT, auto, [ use_quartz_font=$use_quartz ]) CAIRO_BACKEND_ENABLE(quartz_image, Quartz Image, quartz-image, QUARTZ_IMAGE_SURFACE, no, [ use_quartz_image=$use_quartz ]) dnl =========================================================================== AC_MSG_CHECKING([for native Win32]) case "$host" in *-*-mingw*) cairo_os_win32=yes ;; *) cairo_os_win32=no ;; esac AC_MSG_RESULT([$cairo_os_win32]) AM_CONDITIONAL(OS_WIN32, test "$cairo_os_win32" = "yes") AC_CHECK_HEADERS([windows.h], have_windows=yes, have_windows=no) CAIRO_BACKEND_ENABLE(win32, Microsoft Windows, win32, WIN32_SURFACE, auto, [ if test "x$have_windows" != xyes; then use_win32="no (requires a Win32 platform)" fi win32_LIBS="-lgdi32 -lmsimg32" ]) CAIRO_BACKEND_ENABLE(win32_font, Microsoft Windows font, win32-font, WIN32_FONT, auto, [ use_win32_font=$use_win32 ]) test_win32_printing=no if test "x$use_win32" = "xyes"; then AC_CHECK_PROG(GS, gs, gs) if test "$GS"; then AC_DEFINE([CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE], 1, [Define to 1 if the Win32 Printing backend can be tested (needs ghostscript)]) test_win32_printing="yes" else AC_MSG_WARN([Win32 Printing backend will not be tested since ghostscript is not available]) test_win32_printing="no (requires ghostscript)" fi fi AM_CONDITIONAL(CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE, test "x$test_win32_printing" = "xyes") dnl =========================================================================== CAIRO_BACKEND_ENABLE(os2, OS/2, os2, OS2_SURFACE, no, [ case "$host" in *-*-os2*) : ;; *) use_os2="no (requires an OS/2 platform)" ;; esac ]) dnl =========================================================================== CAIRO_BACKEND_ENABLE(beos, BeOS/Zeta, beos, BEOS_SURFACE, no, [ case "$host" in *-*-beos) dnl Add libbe and libzeta if available AC_CHECK_LIB(be,main,beos_LIBS="$beos_LIBS -lbe") AC_CHECK_LIB(zeta,main,beos_LIBS="$beos_LIBS -lzeta") ;; *) use_beos="no (requires a BeOS platform)" ;; esac ]) # Uncomment the if, since with it in place compilation breaks on OpenSuSE 11.1b4 #if test "x$use_beos" = "xyes"; then AC_PROG_CXX #fi dnl =========================================================================== CAIRO_BACKEND_ENABLE(png, PNG, png, PNG_FUNCTIONS, yes, [ use_png=no AC_ARG_VAR([png_REQUIRES], [module name for libpng to search for using pkg-config]) if test "x$png_REQUIRES" = x; then # libpng13 is GnuWin32's libpng-1.2.8 :-( for l in libpng12 libpng13 libpng10 ; do if $PKG_CONFIG --exists $l ; then png_REQUIRES=$l use_png=yes break fi done else use_png=yes fi if test "x$use_png" = "xyes" ; then PKG_CHECK_MODULES(png, $png_REQUIRES, , AC_MSG_RESULT(no)) else AC_MSG_WARN([Could not find libpng in the pkg-config search path]) fi ]) if test "x$use_png" = "xyes"; then : else AC_MSG_WARN([*** To run the tests, cairo must be built with png support ***]) fi dnl =========================================================================== GLITZ_MIN_VERSION=0.5.1 CAIRO_BACKEND_ENABLE(glitz, glitz, glitz, GLITZ_SURFACE, no, [ glitz_REQUIRES="glitz >= $GLITZ_MIN_VERSION" PKG_CHECK_MODULES(glitz, $glitz_REQUIRES, , [AC_MSG_RESULT(no) use_glitz="no (requires glitz http://freedesktop.org/Software/glitz)"]) ]) if test "x$use_glitz" = "xyes";then PKG_CHECK_MODULES(GLITZ_AGL, glitz-agl >= $GLITZ_MIN_VERSION, [have_glitz_agl=yes], [have_glitz_agl=no; AC_MSG_RESULT(no)]) PKG_CHECK_MODULES(GLITZ_EGL, glitz-egl >= $GLITZ_MIN_VERSION, [have_glitz_egl=yes], [have_glitz_egl=no; AC_MSG_RESULT(no)]) PKG_CHECK_MODULES(GLITZ_GLX, glitz-glx >= $GLITZ_MIN_VERSION, [have_glitz_glx=yes], [have_glitz_glx=no; AC_MSG_RESULT(no)]) PKG_CHECK_MODULES(GLITZ_WGL, glitz-wgl >= $GLITZ_MIN_VERSION, [have_glitz_wgl=yes], [have_glitz_wgl=no; AC_MSG_RESULT(no)]) if test "x$have_glitz_agl" = "xyes";then AC_DEFINE(CAIRO_CAN_TEST_GLITZ_AGL_SURFACE, 1, [define if glitz backend can be tested against agl]) fi if test "x$have_glitz_egl" = "xyes";then AC_DEFINE(CAIRO_CAN_TEST_GLITZ_EGL_SURFACE, 1, [define if glitz backend can be tested against egl]) fi if test "x$have_glitz_glx" = "xyes";then AC_DEFINE(CAIRO_CAN_TEST_GLITZ_GLX_SURFACE, 1, [define if glitz backend can be tested against glx]) fi if test "x$have_glitz_wgl" = "xyes";then AC_DEFINE(CAIRO_CAN_TEST_GLITZ_WGL_SURFACE, 1, [define if glitz backend can be tested against wgl]) fi fi AM_CONDITIONAL(CAIRO_CAN_TEST_GLITZ_AGL_SURFACE, test "x$have_glitz_agl" = "xyes") AM_CONDITIONAL(CAIRO_CAN_TEST_GLITZ_EGL_SURFACE, test "x$have_glitz_egl" = "xyes") AM_CONDITIONAL(CAIRO_CAN_TEST_GLITZ_GLX_SURFACE, test "x$have_glitz_glx" = "xyes") AM_CONDITIONAL(CAIRO_CAN_TEST_GLITZ_WGL_SURFACE, test "x$have_glitz_wgl" = "xyes") dnl =========================================================================== CAIRO_BACKEND_ENABLE(directfb, directfb, directfb, DIRECTFB_SURFACE, no, [ directfb_REQUIRES=directfb PKG_CHECK_MODULES(directfb, $directfb_REQUIRES, , AC_MSG_RESULT(no) [use_directfb="no (requires directfb http://www.directfb.org)"]) ]) dnl =========================================================================== # We use pkg-config to look for freetype2, but fall back to # freetype-config if it fails. We prefer pkg-config, since we can # then just put freetype2 >= $FREETYPE_MIN_VERSION in # Requires.private, but at least up to 2003-06-07, there was no # freetype2.pc in the release. # # FreeType versions come in three forms: # release (such as 2.1.9) # libtool (such as 9.7.3) (returned by freetype-config and pkg-config) # platform-specific/soname (such as 6.3.4) # and they recommend you never use the platform-specific version # (see docs/VERSION.DLL in freetype2 sources) # # Set these as appropriate: # release number - for information only FREETYPE_MIN_RELEASE=2.1.0 # libtool-specific version - this is what is checked FREETYPE_MIN_VERSION=8.0.2 CAIRO_BACKEND_ENABLE(ft, FreeType font, freetype, FT_FONT, auto, [ ft_REQUIRES="fontconfig" PKG_CHECK_MODULES(FONTCONFIG, $ft_REQUIRES, [use_ft=yes], [AC_MSG_RESULT(no) use_ft=no]) if test "x$use_ft" = "xyes"; then PKG_CHECK_MODULES(FREETYPE, freetype2 >= $FREETYPE_MIN_VERSION, [freetype_pkgconfig=yes], [AC_MSG_RESULT(no) freetype_pkgconfig=no]) if test "x$freetype_pkgconfig" = "xyes"; then ft_REQUIRES="freetype2 >= $FREETYPE_MIN_VERSION $ft_REQUIRES" else if test -z "$FREETYPE_CONFIG"; then AC_PATH_PROG(FREETYPE_CONFIG, freetype-config, no) fi if test "x$FREETYPE_CONFIG" = "xno" ; then use_ft='no (freetype-config not found in path or $FREETYPE_CONFIG)' else AC_MSG_CHECKING(freetype2 libtool version) FREETYPE_VERSION=`$FREETYPE_CONFIG --version` VERSION_DEC=`echo $FREETYPE_VERSION | awk -F. '{printf("%d\n", 10000*$1 + 100*$2 + $3)};'` MIN_VERSION_DEC=`echo $FREETYPE_MIN_VERSION | awk -F. '{printf("%d\n", 10000*$1 + 100*$2 + $3)};'` if test $VERSION_DEC -lt $MIN_VERSION_DEC; then AC_MSG_RESULT($FREETYPE_VERSION - Too old) use_ft="no ($FREETYPE_VERSION found; version $FREETYPE_MIN_VERSION from release $FREETYPE_MIN_RELEASE required)" else AC_MSG_RESULT($FREETYPE_VERSION - OK) ft_NONPKGCONFIG_CFLAGS=`$FREETYPE_CONFIG --cflags` ft_NONPKGCONFIG_LIBS=`$FREETYPE_CONFIG --libs` fi fi fi fi ft_CFLAGS="$FREETYPE_CFLAGS $FONTCONFIG_CFLAGS" ft_LIBS="$FREETYPE_LIBS $FONTCONFIG_LIBS" ]) if test "x$use_ft" = "xyes"; then temp_save_libs="$LIBS" temp_save_cflags="$CFLAGS" LIBS="$LIBS $ft_LIBS" CFLAGS="$CFLAGS $ft_CFLAGS" AC_CHECK_MEMBER(FT_Bitmap_Size.y_ppem, HAVE_FT_BITMAP_SIZE_Y_PPEM=1, HAVE_FT_BITMAP_SIZE_Y_PPEM=0, [#include #include FT_FREETYPE_H]) AC_DEFINE_UNQUOTED(HAVE_FT_BITMAP_SIZE_Y_PPEM,$HAVE_FT_BITMAP_SIZE_Y_PPEM, [FT_Bitmap_Size structure includes y_ppem field]) AC_CHECK_FUNCS(FT_GlyphSlot_Embolden FT_Load_Sfnt_Table) LIBS="$temp_save_libs" CFLAGS="$temp_save_cflags" fi dnl =========================================================================== AC_ARG_ENABLE(pthread, AS_HELP_STRING([--disable-pthread], [Do not use pthread]), [use_pthread=$enableval], [use_pthread=auto]) have_pthread=no if test "x$use_pthread" != "xno"; then AC_CHECK_HEADERS([pthread.h], have_pthread=yes, have_pthread=no) fi AM_CONDITIONAL(HAVE_PTHREAD, test "x$have_pthread" = "xyes") if test "x$have_pthread" = xno -a "x$use_pthread" = xyes; then AC_MSG_ERROR([pthread requested but not found]) fi dnl =========================================================================== CAIRO_BACKEND_ENABLE(ps, PostScript, ps, PS_SURFACE, yes, [ # The ps backend requires zlib. use_ps=$have_libz ps_NONPKGCONFIG_LIBS=-lz ]) test_ps=no if test "x$use_ps" = "xyes"; then AC_CHECK_PROG(GS, gs, gs) if test "$GS"; then AC_DEFINE([CAIRO_CAN_TEST_PS_SURFACE], 1, [Define to 1 if the PS backend can be tested (needs ghostscript)]) test_ps="yes" else AC_MSG_WARN([PS backend will not be tested since ghostscript is not available]) test_ps="no (requires ghostscript)" fi fi AM_CONDITIONAL(CAIRO_CAN_TEST_PS_SURFACE, test "x$test_ps" = "xyes") dnl =========================================================================== CAIRO_BACKEND_ENABLE(pdf, PDF, pdf, PDF_SURFACE, yes, [ # The pdf backend requires zlib. use_pdf=$have_libz pdf_NONPKGCONFIG_LIBS=-lz ]) POPPLER_VERSION_REQUIRED=0.8.0 test_pdf=no if test "x$use_pdf" = "xyes"; then poppler_DEPENDENCY="poppler-glib >= $POPPLER_VERSION_REQUIRED" PKG_CHECK_MODULES(POPPLER, $poppler_DEPENDENCY pango gtk+-2.0, [_CHECK_FUNCS_WITH_FLAGS(poppler_page_render_to_pixbuf, [$POPPLER_CFLAGS], [$POPPLER_LIBS], [test_pdf=yes], [AC_MSG_RESULT(no); test_pdf="no (requires $poppler_DEPENDENCY)"])], [AC_MSG_RESULT(no); test_pdf="no (requires $poppler_DEPENDENCY)"]) if test "x$test_pdf" = "xyes"; then AC_DEFINE([CAIRO_CAN_TEST_PDF_SURFACE], 1, [Define to 1 if the PDF backend can be tested (need poppler and other dependencies for pdf2png)]) else AC_MSG_WARN([PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available]) fi fi AM_CONDITIONAL(CAIRO_CAN_TEST_PDF_SURFACE, test "x$test_pdf" = "xyes") AC_SUBST(POPPLER_CFLAGS) AC_SUBST(POPPLER_LIBS) AM_CONDITIONAL(CAIRO_HAS_MULTI_PAGE_SURFACES, test "x$use_ps" = "xyes" -o "x$use_pdf" = "xyes") dnl =========================================================================== CAIRO_BACKEND_ENABLE(svg, SVG, svg, SVG_SURFACE, yes, [ if test "x$use_png" != "xyes"; then use_svg="no (requires --enable-png)" fi ]) LIBRSVG_VERSION_REQUIRED=2.15.0 test_svg=no if test "x$use_svg" = "xyes"; then librsvg_DEPENDENCY="librsvg-2.0 >= $LIBRSVG_VERSION_REQUIRED" PKG_CHECK_MODULES(LIBRSVG, $librsvg_DEPENDENCY gdk-2.0, [_CHECK_FUNCS_WITH_FLAGS(rsvg_pixbuf_from_file, [$LIBRSVG_CFLAGS], [$LIBRSVG_LIBS], [test_svg=yes], [AC_MSG_RESULT(no); test_svg="no (requires $librsvg_DEPENDENCY)"])], [AC_MSG_RESULT(no); test_svg="no (requires $librsvg_DEPENDENCY)"]) if test "x$test_svg" = "xyes"; then AC_DEFINE([CAIRO_CAN_TEST_SVG_SURFACE], 1, [Define to 1 if the SVG backend can be tested]) else AC_MSG_WARN([SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available]) fi fi AM_CONDITIONAL(CAIRO_CAN_TEST_SVG_SURFACE, test "x$test_svg" = "xyes") AC_SUBST(LIBRSVG_CFLAGS) AC_SUBST(LIBRSVG_LIBS) dnl =========================================================================== dnl dump backend checking results AC_CACHE_SAVE dnl =========================================================================== dnl Checks for precise integer types AC_CHECK_HEADERS([stdint.h signal.h inttypes.h sys/int_types.h]) AC_CHECK_TYPES([uint64_t, uint128_t]) dnl =========================================================================== dnl check for CPU affinity support AC_CHECK_HEADERS([sched.h], [ AC_CHECK_FUNCS([sched_getaffinity], [ AC_DEFINE([HAVE_SCHED_GETAFFINITY], [1], [Define to 1 if you have Linux compatible sched_getaffinity]) ]) ]) AC_CHECK_LIB(rt, sched_yield, [RT_LIBS=-lrt], [RT_LIBS=]) CAIROPERF_LIBS=$RT_LIBS dnl =========================================================================== dnl Checks for misc headers AC_CHECK_HEADERS([libgen.h]) dnl =========================================================================== dnl check compiler flags AC_DEFUN([CAIRO_CC_TRY_FLAG], [ AC_MSG_CHECKING([whether $CC supports $1]) cairo_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $1" AC_COMPILE_IFELSE([ ], [cairo_cc_flag=yes], [cairo_cc_flag=no]) CFLAGS="$cairo_save_CFLAGS" if test "x$cairo_cc_flag" = "xyes"; then ifelse([$2], , :, [$2]) else ifelse([$3], , :, [$3]) fi AC_MSG_RESULT([$cairo_cc_flag]) ]) dnl Use lots of warning flags with with gcc and compatible compilers dnl Note: if you change the following variable, the cache is automatically dnl skipped and all flags rechecked. So there's no need to do anything dnl else. If for any reason you need to force a recheck, just change dnl MAYBE_WARN in an ignorable way (like adding whitespace) MAYBE_WARN="-Wall -Wextra \ -Wsign-compare -Werror-implicit-function-declaration \ -Wpointer-arith -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \ -Wpacked -Wswitch-enum -Wmissing-format-attribute \ -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ -Wdeclaration-after-statement -Wold-style-definition \ -Wno-missing-field-initializers -Wno-unused-parameter \ -Wno-attributes -Wno-long-long -Winline" # invalidate cached value if MAYBE_WARN has changed if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then unset cairo_cv_warn_cflags fi AC_CACHE_CHECK([for supported warning flags], cairo_cv_warn_cflags, [ echo WARN_CFLAGS="" # Some warning options are not supported by all versions of # gcc, so test all desired options against the current # compiler. # # Note that there are some order dependencies # here. Specifically, an option that disables a warning will # have no net effect if a later option then enables that # warnings, (perhaps implicitly). So we put some grouped # options (-Wall and -Wextra) up front and the -Wno options # last. for W in $MAYBE_WARN; do CAIRO_CC_TRY_FLAG([$W], [WARN_CFLAGS="$WARN_CFLAGS $W"]) done cairo_cv_warn_cflags=$WARN_CFLAGS cairo_cv_warn_maybe=$MAYBE_WARN AC_MSG_CHECKING([which warning flags were supported])]) WARN_CFLAGS="$cairo_cv_warn_cflags" CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS" # We only wish to enable attribute(warn_unused_result) if we can prevent # gcc from generating thousands of warnings about the misapplication of the # attribute to void functions and variables. AC_MSG_CHECKING([how to enable unused result warnings]) warn_unused_result="" if echo $WARN_CFLAGS | grep -e '-Wno-attributes' >/dev/null; then AC_TRY_COMPILE([__attribute__((__warn_unused_result__)) int f (int i) { return i; }], [], [warn_unused_result="__attribute__((__warn_unused_result__))"]) fi AC_DEFINE_UNQUOTED([WARN_UNUSED_RESULT], [$warn_unused_result], [Define to the value your compiler uses to support the warn-unused-result attribute]) AC_MSG_RESULT([$warn_unused_result]) CAIRO_CC_TRY_FLAG([-fno-strict-aliasing], [CAIRO_CFLAGS="$CAIRO_CFLAGS -fno-strict-aliasing"]) AC_SUBST(CAIRO_REQUIRES) AC_SUBST(CAIRO_NONPKGCONFIG_CFLAGS) AC_SUBST(CAIRO_NONPKGCONFIG_LIBS) AC_SUBST(CAIRO_CFLAGS) AC_SUBST(CAIRO_LDADD) AC_SUBST(CAIRO_LIBS) AC_SUBST(CAIROPERF_LIBS) dnl =========================================================================== dnl Check for gtk-doc and docbook GTK_DOC_CHECK([1.6]) dnl =========================================================================== dnl Check for recent pkg-config which supports Requires.private case `$PKG_CONFIG --version` in [0.?|0.?.?|0.1[0-7]|0.1[0-7].?]) PKGCONFIG_REQUIRES="Requires"; ;; *) PKGCONFIG_REQUIRES="Requires.private"; ;; esac AC_SUBST(PKGCONFIG_REQUIRES) dnl =========================================================================== dnl Check for MMX MMX_CFLAGS="-mmmx -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_mmx_intrinsics=no AC_MSG_CHECKING(for MMX/SSE intrinsics in the compiler) xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $MMX_CFLAGS" AC_COMPILE_IFELSE([ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for MMX intrinsics" #endif #include int main () { __m64 v = _mm_cvtsi32_si64 (1); __m64 w = _mm_slli_si64 (v, 1); v = _mm_or_si64 (v, w); return _mm_cvtsi64_si32 (v); }], have_mmx_intrinsics=yes) CFLAGS=$xserver_save_CFLAGS AC_MSG_RESULT($have_mmx_intrinsics) dnl =========================================================================== cairo_has_lcov=no AC_ARG_ENABLE(gcov, AS_HELP_STRING([--enable-gcov], [Enable gcov]), [use_gcov=$enableval], [use_gcov=no]) if test "x$use_gcov" = "xyes"; then dnl we need gcc: if test "$GCC" != "yes"; then AC_MSG_ERROR([GCC is required for --enable-gcov]) fi dnl Check if ccache is being used AC_CHECK_PROG(SHTOOL, shtool, shtool) case `$SHTOOL path $CC` in *ccache*[)] gcc_ccache=yes;; *[)] gcc_ccache=no;; esac if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then AC_MSG_ERROR([ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1.]) fi ltp_version_list="1.4 1.5" AC_CHECK_PROG(LTP, lcov, lcov) AC_CHECK_PROG(LTP_GENHTML, genhtml, genhtml) if test "$LTP"; then AC_CACHE_CHECK([for ltp version], cairo_cv_ltp_version, [ cairo_cv_ltp_version=invalid ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` for ltp_check_version in $ltp_version_list; do if test "$ltp_version" = "$ltp_check_version"; then cairo_cv_ltp_version="$ltp_check_version (ok)" fi done ]) fi case $cairo_cv_ltp_version in ""|invalid[)] ;; *) cairo_has_lcov=yes ;; esac if test "x$cairo_has_lcov" != "xyes"; then AC_MSG_ERROR([[To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list. Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again.]]) fi if test -z "$LTP_GENHTML"; then AC_MSG_ERROR([[Could not find genhtml from the LTP package. Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again.]]) fi AC_DEFINE(HAVE_GCOV, 1, [Whether you have gcov]) dnl PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Makefile.gcov, $abs_srcdir) dnl Remove all optimization flags from CFLAGS changequote({,}) CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` CAIRO_CFLAGS=`echo "$CAIRO_CFLAGS" | $SED -e 's/-O[0-9]*//g'` changequote([,]) dnl Add the special gcc flags CAIRO_CFLAGS="$CAIRO_CFLAGS -O0 -fprofile-arcs -ftest-coverage" CAIRO_LDADD="$CAIRO_LDADD -lgcov" fi AM_CONDITIONAL(CAIRO_HAS_LCOV, test "x$cairo_has_lcov" = "xyes") dnl =========================================================================== AC_ARG_ENABLE(test-surfaces, AS_HELP_STRING([--enable-test-surfaces], [Add backends for more test suite coverage (no additional public functionality)]), [use_test_surfaces=$enableval], [use_test_surfaces=no]) AM_CONDITIONAL(CAIRO_HAS_TEST_SURFACES, test "x$use_test_surfaces" = "xyes") if test "x$use_test_surfaces" = "xyes"; then AC_DEFINE(CAIRO_HAS_TEST_SURFACES, 1, [define in the extra test surface have been built into cairo for the test suite]) fi dnl =========================================================================== AC_ARG_ENABLE(some-floating-point, AS_HELP_STRING([--disable-some-floating-point], [Disable certain code paths that rely heavily on double precision floating-point calculation. This option can improve performance on systems without a double precision floating-point unit, but might degrade performance on those that do.]), [ if test "x$enableval" = "xno"; then # A value of 'no' for $enableval means that they want to disable, which # means 'yes' for $disable_some_floating_point. disable_some_floating_point=yes fi ], [disable_some_floating_point=no]) AM_CONDITIONAL(DISABLE_SOME_FLOATING_POINT, test "x$disable_some_floating_point" = "xyes") if test "x$disable_some_floating_point" = "xyes"; then AC_DEFINE(DISABLE_SOME_FLOATING_POINT, 1, [Define to 1 to disable certain code paths that rely heavily on double precision floating-point calculation]) fi dnl =========================================================================== AC_CONFIG_COMMANDS([src/cairo-features.h], [ featuresfile=src/cairo-features.h outfile=$featuresfile.tmp AC_MSG_NOTICE([creating $featuresfile]) cat > $outfile <<_EOF /* Generated by configure. Do not edit */ #ifndef CAIRO_FEATURES_H #define CAIRO_FEATURES_H #ifdef __cplusplus # define CAIRO_BEGIN_DECLS extern "C" { # define CAIRO_END_DECLS } #else # define CAIRO_BEGIN_DECLS # define CAIRO_END_DECLS #endif #ifndef cairo_public # define cairo_public #endif #define CAIRO_VERSION_MAJOR $CAIRO_VERSION_MAJOR #define CAIRO_VERSION_MINOR $CAIRO_VERSION_MINOR #define CAIRO_VERSION_MICRO $CAIRO_VERSION_MICRO #define CAIRO_VERSION_STRING "$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" _EOF for FEATURE in $CAIRO_FEATURES; do echo "#define CAIRO_HAS_$FEATURE 1" >> $outfile done echo '' >> $outfile for FEATURE in $CAIRO_NO_FEATURES; do echo "/*#undef CAIRO_HAS_$FEATURE */" >> $outfile done echo '' >> $outfile echo '#endif' >> $outfile if cmp -s $outfile $featuresfile; then AC_MSG_NOTICE([$featuresfile is unchanged]) rm -f $outfile else mv $outfile $featuresfile fi ],[ CAIRO_FEATURES='$CAIRO_FEATURES' CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' CAIRO_VERSION_MAJOR=$CAIRO_VERSION_MAJOR CAIRO_VERSION_MINOR=$CAIRO_VERSION_MINOR CAIRO_VERSION_MICRO=$CAIRO_VERSION_MICRO ]) AC_CONFIG_COMMANDS([src/cairo-no-features.h], [ nofeaturesfile=src/cairo-no-features.h outfile=$nofeaturesfile.tmp AC_MSG_NOTICE([creating $nofeaturesfile]) cat > $outfile <<_EOF /* Generated by configure. Do not edit */ #ifndef CAIRO_NO_FEATURES_H #define CAIRO_NO_FEATURES_H #include /* This is a dummy header, to trick gtk-doc only */ _EOF for FEATURE in $CAIRO_NO_FEATURES; do echo "#define CAIRO_HAS_$FEATURE 1" >> $outfile done echo '' >> $outfile echo '#endif' >> $outfile if cmp -s $outfile $nofeaturesfile; then AC_MSG_NOTICE([$nofeaturesfile is unchanged]) rm -f $outfile else mv $outfile $nofeaturesfile fi ],[ CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' ]) AC_CONFIG_FILES([ Makefile src/Makefile src/cairo.pc ]) AC_OUTPUT dnl =========================================================================== V="$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" echo "" echo "cairo (version $V) will be compiled with the following surface backends:" echo " image: yes (always builtin)" echo " Xlib: $use_xlib" echo " Xlib Xrender: $use_xlib_xrender" echo " Quartz: $use_quartz" echo " Quartz-image: $use_quartz_image" echo " XCB: $use_xcb" echo " Win32: $use_win32" echo " OS2: $use_os2" echo " PostScript: $use_ps" echo " PDF: $use_pdf" echo " SVG: $use_svg" echo " glitz: $use_glitz" echo " BeOS: $use_beos" echo " DirectFB: $use_directfb" echo "" echo "the following font backends:" echo " FreeType: $use_ft" echo " Win32: $use_win32_font" echo " Quartz: $use_quartz_font" echo "" echo "the following features:" echo " PNG functions: $use_png" echo "" echo "and the following debug options:" echo " gcov support: $use_gcov" echo " test surfaces: $use_test_surfaces" echo " ps testing: $test_ps" echo " pdf testing: $test_pdf" echo " svg testing: $test_svg" if test x"$use_win32" = "xyes"; then echo " win32 printing testing: $test_win32_printing" fi echo "" echo "using CFLAGS:" echo $CAIRO_CFLAGS echo "" if test x"$use_ft" != "xyes" && \ test x"$use_win32_font" != "xyes" && \ test x"$use_quartz_font" != "xyes" ; then AC_MSG_ERROR([Cairo requires at least one font backend. Please install freetype and fontconfig, then try again: http://freetype.org/ http://fontconfig.org/ ]) fi WARNING_MESSAGE=' *** The @BACKEND@ backend is still under active development and *** is included in this release only as a preview. It does not *** fully work yet and incompatible changes may yet be made *** to @BACKEND@-backend specific API. ' if test x"$use_glitz" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/Glitz/' fi if test x"$use_xcb" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/XCB/' fi if test x"$use_quartz_image" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/Quartz Image/' fi if test x"$use_os2" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's,@BACKEND@,OS/2,' fi if test x"$use_beos" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/BeOS/' fi if test x"$use_directfb" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/DirectFB/' fi libgdiplus-2.11/cairo/ChangeLog.mk0000664000175000017500000000536012225470167014005 00000000000000# Creating ChangeLog files from git log: # We always create a ChangeLog that contains the most recent changes, and # multiple others for changes between major releases (other than the last such # segment that we put in 'ChangeLog'. The old ones are named # ChangeLog.pre-X.Y where X.Y is the version number of the major release. CURR_CHANGELOG_VERSION=$(CAIRO_VERSION_MAJOR).$$(echo "($(CAIRO_VERSION_MINOR)+1)/2*2" | bc) # examines $version PREV_CHANGELOG_VERSION=$$(if test "x$$(echo "($$version-0.1)*2/2"|bc)" = "x$$(echo "$$version*2/2"|bc)"; \ then echo "$$version-$$(echo "$$version" | sed 's/[0-9]/0/g;s/[0-9]$$/2/')"; \ else echo "$$version-1.0"; \ fi | bc | sed 's/[.]0*/./;s/^0[.]\?$$/initial/;s/[.]$$/.0/') CHANGELOGS = ChangeLog \ `version=$(CURR_CHANGELOG_VERSION); \ version=$(PREV_CHANGELOG_VERSION); \ while test "x$$version" != xinitial; do \ echo ChangeLog.pre-$$version; \ version=$(PREV_CHANGELOG_VERSION); \ done` MAINTAINERCLEANFILES += $(srcdir)/ChangeLog $(srcdir)/ChangeLog.pre-* DISTCLEANFILES += $(srcdir)/ChangeLog.cache-* changelogs: @$(MAKE) $(AM_MAKEFLAGS) $(CHANGELOGS) dist-hook: changelogs changelogs="$(CHANGELOGS)"; \ for changelog in $$changelogs; do \ cp $(srcdir)/$$changelog $(distdir)/ 2>/dev/null || \ cp $$changelog $(distdir)/; \ done $(srcdir)/ChangeLog: @if test -d "$(srcdir)/.git"; then \ version=$(CURR_CHANGELOG_VERSION); \ prev=$(PREV_CHANGELOG_VERSION).0; \ nearest_tag=`git-describe | sed 's/-.*//'`; \ before=$(srcdir)/ChangeLog.cache-$$prev..$$nearest_tag; \ after=$(srcdir)/ChangeLog.cache-$$nearest_tag..; \ $(MAKE) $(AM_MAKEFLAGS) $$before $$after && \ echo Creating $@ && \ { cat $$after; echo; cat $$before; } > $@; \ else \ test -f $@ || \ (echo A git checkout is required to generate $@ >&2 && \ echo A git checkout is required to generate this file >> $@); \ fi DISTCLEANFILES += ChangeLog.cache-* ChangeLog.cache-*..: .git/HEAD ChangeLog%: $(srcdir)/ChangeLog% $(srcdir)/ChangeLog.cache-% $(srcdir)/ChangeLog.pre-%: @echo Creating $@ @if test -d "$(srcdir)/.git"; then \ (cd "$(srcdir)" && \ version=$$(echo "$@" | sed 's/.*ChangeLog\([.].*-\)\?//'); \ if echo "$@" | grep -q '^ChangeLog[.]cache'; then \ spec=$$version; \ else \ to=$$version; \ test "x$$version" = x && version=$(CURR_CHANGELOG_VERSION); \ from=$(PREV_CHANGELOG_VERSION); \ test "x$$to" = x || to=$$to.0; \ test "x$$from" = xinitial || from=$$from.0; \ spec=$$from..$$to; \ fi; \ ./missing --run git-log --stat "$$spec") > $@.tmp \ && mv -f $@.tmp $@ \ || ($(RM) $@.tmp; \ echo Failed to generate $@, your $@ may be outdated >&2); \ else \ echo A git checkout is required to generate $@ >&2; \ fi .PHONY: changelogs ChangeLog $(srcdir)/ChangeLog libgdiplus-2.11/cairo/ChangeLog.pre-1.20000664000175000017500000161521312225470635014467 00000000000000commit 61404bd5022b913f58ecda8dc9e8922b4fc6f80b Author: Carl Worth Date: Tue Jun 27 15:44:52 2006 +0200 Update version to 1.2.0 and add notes to NEWS file. Also update libtool version information to 11:0:9. NEWS | 40 ++++++++++++++++++++++++++++++++++++++++ ROADMAP | 8 ++++---- configure.in | 8 ++++---- 3 files changed, 48 insertions(+), 8 deletions(-) commit cea70741e851993fe181a76872fb97549d0769d5 Author: Carl Worth Date: Sat Jul 1 03:24:21 2006 +0200 Add src/cairo-features.h and test/*.ps to CLEANFILES src/Makefile.am | 2 +- test/Makefile.am | 1 + 2 files changed, 2 insertions(+), 1 deletions(-) commit 55b5fedbc1df32e4dc9d1fccf40e12e14f7b6cd0 Author: Carl Worth Date: Sat Jul 1 02:54:22 2006 +0200 Add many references images (and a font) missing from EXTRA_DIST test/Makefile.am | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 74 insertions(+), 3 deletions(-) commit 3d4a8fd741df328bd969454791163bc945d3ad8b Author: Carl Worth Date: Sat Jul 1 02:53:26 2006 +0200 Don't remove INSTALL during maintainer-clean Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit cfddf93afb692819548adb85c5b75f60be7e7349 Author: Behdad Esfahbod Date: Sat Jul 1 01:55:12 2006 +0200 Make CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD not crash on surface patterns, but return error. src/cairo-surface.c | 30 ++++++++++++++++++++++++++++++ src/cairo.h | 5 +++-- 2 files changed, 33 insertions(+), 2 deletions(-) commit 01b1f3572c3c15a08dd6f32788106c0e42fd2436 Author: Behdad Esfahbod Date: Fri Jun 30 22:01:24 2006 +0200 Detect and report crashes in tests. test/cairo-test.c | 59 +++++++++++++++++++++++++++++++++++++++++----------- test/cairo-test.h | 3 +- 2 files changed, 48 insertions(+), 14 deletions(-) commit 19c4700101bfce7d73a50017021b4ec198ddd783 Author: Carl Worth Date: Sat Jul 1 01:05:30 2006 +0200 Even _more_ valgrind suppresions for Xrm (XrmGetFileDatabase this time) test/.valgrind-suppressions | 190 +++++++++++++++++++++++++++++++++++++++--- 1 files changed, 176 insertions(+), 14 deletions(-) commit 84b06eed4e53eb34b0ec378216fa246286998acd Author: Carl Worth Date: Sat Jul 1 00:47:59 2006 +0200 SVG: Fix leak in _cairo_svg_surface_mask src/cairo-svg-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 35ec5747ca5eb8a63ec334d61eb13357b4aa3802 Author: Carl Worth Date: Sat Jul 1 00:38:06 2006 +0200 Add yet another XrmGetStringDatabase valgrind suppression. test/.valgrind-suppressions | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) commit 80cb0d5ba1e3622b4b71639cf03e7dc277cbb457 Author: Carl Worth Date: Sat Jul 1 00:37:44 2006 +0200 Fix some leaks in the test suite itself. test/cairo-test.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 14e7883fae58e51c2deab5b97c9a405c5dbb3aeb Author: Carl Worth Date: Sat Jul 1 00:00:43 2006 +0200 Fix a memory leak by removing accidentally duplicated code. test/cairo-test.c | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) commit 8919b6b3243db5db59a73f804854364a00a8586d Author: Carl Worth Date: Fri Jun 30 23:24:23 2006 +0200 Add valgrind suppressions for pthread initialization still reachable/possibly lost memory test/.valgrind-suppressions | 39 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) commit 98cc1651cf19699a0c90e8e2e7f2c2da2ae83760 Author: Carl Worth Date: Fri Jun 30 23:21:06 2006 +0200 Add valgrind suppressions for still-reachable memory from XGetDefault and XrmGetStringDatabase test/.valgrind-suppressions | 142 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 142 insertions(+), 0 deletions(-) commit f6b10a6aabb121e1a4ca092ca175aad39b3c828d Author: Carl Worth Date: Fri Jun 30 23:06:56 2006 +0200 Add another suppression due to mysterious occurences in libc test/.valgrind-suppressions | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit c6c943f3cfefa535e6c2da6adcac15507a8f0952 Author: Carl Worth Date: Fri Jun 30 23:00:39 2006 +0200 ps: Fix to not walk off the end of the data array. This fixes a bug recently introduced with the special case for the ~> sequence. src/cairo-ps-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 0853ccd05314d618afd0d640a33f0a744842a0d2 Author: Carl Worth Date: Fri Jun 30 22:58:36 2006 +0200 Add new libz/libpng suppressions. It would appear we have to keep updating these for new library versions. test/.valgrind-suppressions | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) commit ee75e1e6853ada5c4218788148e2f5a09669a2b3 Author: Carl Worth Date: Fri Jun 30 17:07:42 2006 +0200 Add ps-specific reference image for test/degenerate-path test/degenerate-path-ps-argb32-ref.png | Bin 0 -> 197 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit e0db22c6bc40d4576d9c1131d3192f1df3b942ca Author: Carl Worth Date: Fri Jun 30 16:54:16 2006 +0200 ps: Fix degenerate-path test failure. This is as simple as simply not emitting any degenerate sub-paths when the cap style is CAIRO_LINE_CAP_SQUARE or CAIRO_LINE_CAP_BUTT. src/cairo-ps-surface.c | 84 ++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 68 insertions(+), 16 deletions(-) commit 057c0abeea1ee80c7156be5a1c15594765d88fe0 Author: Carl Worth Date: Fri Jun 30 16:07:11 2006 +0200 ps: Fix transformation of source surfaces. This makes the following four tests pass, (which were previously failing on the ps backend). move-to-show-surface scale-source-surface-paint source-surface-scale-paint translate-show-surface src/cairo-ps-surface.c | 63 +++++++++++++++++++++++++++++------------------ 1 files changed, 39 insertions(+), 24 deletions(-) commit 54ce585817d78ffeeb0ba6b03b868e63b9552cb8 Author: Carl Worth Date: Thu Jun 29 23:34:29 2006 +0200 Update PDF-specific reference image for scale-source-surface-paint test/scale-source-surface-paint-pdf-argb32-ref.png | Bin 152 -> 182 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit a6fc321d1793e97e4601429a98c36bed9af365a0 Author: Carl Worth Date: Thu Jun 29 23:28:48 2006 +0200 Add PDF-specific reference image for paint-source-alpha test/paint-source-alpha-pdf-argb32-ref.png | Bin 0 -> 475 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit aaef92f8307fedd864fca66054b06c8bfe7ae40d Author: Carl Worth Date: Thu Jun 29 23:27:05 2006 +0200 Add PDF-specific reference image for composite-integer-translate-over ...osite-integer-translate-over-pdf-argb32-ref.png | Bin 0 -> 12946 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 45ebf2d1f3c6cb4588c3bebf6acf1818eb723515 Author: Behdad Esfahbod Date: Fri Jun 30 01:45:47 2006 +0200 Fix an oops. src/cairo-xlib-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit e5d18d7696eb9a48369b89517738dbaa101106d7 Author: Behdad Esfahbod Date: Fri Jun 30 01:44:55 2006 +0200 Use $no_x in configure.in. configure.in | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit 6c3deb0be1b9d6db0104af02fb193849a8329133 Author: Behdad Esfahbod Date: Fri Jun 30 01:33:14 2006 +0200 Minor doc syntax fixes. src/cairo-surface.c | 2 +- src/cairo.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit 8860263c6a18a0b196e2b462a538dfc166fbea04 Author: Behdad Esfahbod Date: Fri Jun 30 01:29:54 2006 +0200 Remove CAIRO_SVG_VERSION_LAST from public header file. src/cairo-svg-surface.c | 8 ++++++-- src/cairo-svg.h | 13 ++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) commit 6672529541e01b0da53fff279cb1f8030c931ffb Author: Behdad Esfahbod Date: Fri Jun 30 00:58:01 2006 +0200 Hook some more symbols into docs. doc/public/cairo-sections.txt | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 66436d132772af627447a929ced3a8a18cc6915f Author: Behdad Esfahbod Date: Fri Jun 30 00:46:48 2006 +0200 Update lots of docs. doc/public/Makefile.am | 9 ++++- doc/public/cairo-sections.txt | 90 +++++++++++++++++++++++------------------ src/cairo-pdf-surface.c | 10 ++-- src/cairo-ps-surface.c | 16 +++---- src/cairo-svg-surface.c | 14 +++--- src/cairo-win32-font.c | 19 ++++++++- src/cairo-win32-surface.c | 3 + src/cairo-xlib-surface.c | 72 ++++++++++++++++++++++++++++++++ src/cairo.h | 18 ++++----- 9 files changed, 177 insertions(+), 74 deletions(-) commit de939f52061ba9a1c739c193e3e4f549668855cc Author: Behdad Esfahbod Date: Thu Jun 29 18:54:02 2006 +0200 Require gtk-doc 1.6, and make it ignore cairo_public and cairo_private decorators. configure.in | 2 +- doc/public/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 647ca37ca3d4b1954f7400deeeaaf245b5c90e69 Author: Behdad Esfahbod Date: Thu Jun 29 18:47:35 2006 +0200 Mark enum additions as "Since 1.2" too. src/cairo.h | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) commit 320ce67d630e4aac1f0007982aef27c831b04b66 Author: Behdad Esfahbod Date: Thu Jun 29 18:36:53 2006 +0200 Add "Since: 1.2" to docs for most new API functions. src/cairo-font.c | 2 ++ src/cairo-image-surface.c | 6 ++++++ src/cairo-pattern.c | 2 ++ src/cairo-pdf-surface.c | 6 ++++++ src/cairo-ps-surface.c | 14 +++++++++++++- src/cairo-scaled-font.c | 12 ++++++++++++ src/cairo-surface.c | 14 +++++++------- src/cairo-svg-surface.c | 14 ++++++++++---- src/cairo.c | 14 ++++++++++++++ 9 files changed, 72 insertions(+), 12 deletions(-) commit bd92eb7f3c58fdcbe05f67b9a879798246c616bc Author: Carl Worth Date: Thu Jun 29 19:47:26 2006 +0200 Move device_transform of path to before floating->fixed conversion. This is an attempt to fix the following bug: http://bugzilla.gnome.org/show_bug.cgi?id=332266 With the recent rewrite of the device-offset code, which pushed things from the gstate to the surface layer, the 16-bit limitations on coordinates which previously applied to device space only, have lately been applying to user space. This commit moves the device_transform back up above the conversion from floating-point to fixed-point values so that once again the limitation only applies to device space. src/cairo-clip.c | 10 ------- src/cairo-gstate.c | 8 ++++-- src/cairo-surface-fallback.c | 1 + src/cairo-surface.c | 54 ++++++++++++++++++------------------------ src/cairo-xlib-surface.c | 1 + src/cairoint.h | 1 + 6 files changed, 31 insertions(+), 44 deletions(-) commit 29caf8915f822778f0e59add7d364a03bcdb8327 Author: Behdad Esfahbod Date: Thu Jun 29 16:09:46 2006 +0200 Fix support for non-pkg-config cflags and libs (needed for supporting freetype-config) configure.in | 20 ++++++++++++-------- src/cairo-backend.pc.in | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) commit 195b1142e7a1652e0f65cfd822bba7ea8b6ba505 Author: Behdad Esfahbod Date: Thu Jun 29 15:22:44 2006 +0200 Prefix "cairo_*_test_*" symbols with underscore. src/cairo-pdf-surface.c | 4 ++-- src/cairo-pdf-test.h | 4 ++-- src/cairo-ps-surface.c | 4 ++-- src/cairo-ps-test.h | 4 ++-- src/cairo-scaled-font-test.h | 4 ++-- src/cairo-scaled-font.c | 2 +- src/cairo-svg-surface.c | 4 ++-- src/cairo-svg-test.h | 4 ++-- src/cairo-xlib-surface.c | 4 ++-- src/cairo-xlib-test.h | 4 ++-- test/fallback-resolution.c | 6 +++--- test/glyph-cache-pressure.c | 2 +- test/xlib-surface.c | 2 +- 13 files changed, 24 insertions(+), 24 deletions(-) commit f26da6c464c60ab2ed87175ab0a9b81e3cf363fb Author: Behdad Esfahbod Date: Thu Jun 29 12:32:58 2006 +0200 Remove cairo_public from source files. src/cairo-atsui-font.c | 2 +- src/cairo-svg-surface.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit 8effd25c1b05607ff6501821f1d80745677d8e72 Author: Carl Worth Date: Thu Jun 29 06:25:24 2006 +0200 Update PDF and PS reference images for test/text-pattern. test/text-pattern-pdf-argb32-ref.png | Bin 0 -> 1632 bytes test/text-pattern-ps-argb32-ref.png | Bin 0 -> 1681 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit a64b946ee0512d85d3c790c67aad8a882c5c3533 Author: Carl Worth Date: Thu Jun 29 06:24:44 2006 +0200 Mark test/leaky-dash as an expected failure. test/Makefile.am | 1 + test/leaky-dash.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) commit 734e10709f5c62c0b64e51a03df8e109e7eebe0d Author: Carl Worth Date: Thu Jun 29 06:12:48 2006 +0200 Add several more stress tests to test/dash-zero-length test/dash-zero-length-ps-argb32-ref.png | Bin 214 -> 272 bytes test/dash-zero-length-ref.png | Bin 235 -> 238 bytes test/dash-zero-length-rgb24-ref.png | Bin 222 -> 218 bytes test/dash-zero-length.c | 85 ++++++++++++++++++++----------- 4 files changed, 56 insertions(+), 29 deletions(-) commit 8aa306caac99ebe074a6cde8b424b1780cafefee Author: Carl Worth Date: Thu Jun 29 05:13:37 2006 +0200 PS: Fix for dash-zero-length src/cairo-ps-surface.c | 79 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 75 insertions(+), 4 deletions(-) commit 7285499700a4f0f4bb95f003d0c730246bf3eabd Author: Carl Worth Date: Thu Jun 29 05:07:51 2006 +0200 Squelch some bogus compiler warnings about possibly uninitialized values. pixman/src/fbcompose.c | 9 +++++---- src/cairo-font-subset.c | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) commit 20e3a99bbaa2624ecad7b505158edc8dce706ea8 Author: Keith Packard Date: Thu Jun 29 04:10:35 2006 +0200 Skip TrueType font output for PS/PDF until it handles vertical layout. The TrueType font subsetting code fails to emit VHEA/VMTX headers for the font, so WMode 1 doesn't work to switch to vertical metrics. Added a bug about this, and changed the PS/PDF output code to just use Type3 in this case until the bug is fixed. Updated the reference images to match the output for PDF/PS backends for the vertical font check. BUGS | 7 +++++++ src/cairo-font-subset.c | 3 +++ src/cairo-ft-font.c | 16 +++++++++++++++- src/cairo-ft-private.h | 3 +++ test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 1018 -> 956 bytes test/ft-text-vertical-layout-pdf-rgb24-ref.png | Bin 1037 -> 0 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 351 -> 349 bytes test/ft-text-vertical-layout-ps-rgb24-ref.png | Bin 1086 -> 0 bytes 8 files changed, 28 insertions(+), 1 deletions(-) commit 2e2799d4f921b22030eb63585dcec2ed4503fd5b Author: Carl Worth Date: Thu Jun 29 02:41:46 2006 +0200 Ignore degenerate-path test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c90cc4e33f1549cde1d7a6a94599dbb3de84d387 Author: Carl Worth Date: Thu Jun 29 02:41:17 2006 +0200 Update reference images for ft-text-vertical-layout test/ft-text-vertical-layout-ref.png | Bin 1130 -> 1130 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1100 -> 1098 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 92021d169fea48eed9349e5821353f976df56be1 Author: Behdad Esfahbod Date: Wed Jun 28 04:14:07 2006 +0200 Make docs not build by "make all", but by "make doc", "make dist", and "make install". Makefile.am | 4 ++++ doc/Makefile.am | 4 +++- doc/public/tmpl/cairo-types.sgml | 4 +--- doc/public/tmpl/cairo-version.sgml | 7 +++++++ gtk-doc.make | 8 ++++++-- 5 files changed, 21 insertions(+), 6 deletions(-) commit 0d073c2e86ced3a94ef76e7e4c2a00f8fb76efb1 Author: Behdad Esfahbod Date: Wed Jun 28 03:25:08 2006 +0200 Use $RELEASE_OR_SNAPSHOT to determine upload directory. Turn distcheck on release-check on again, as CAIRO_TEST_TARGET="" can be used to disable all failures now. Makefile.am | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit b37562868d2254d2dbd93a8808d32f0a0d769195 Author: Behdad Esfahbod Date: Wed Jun 28 03:16:33 2006 +0200 Ignore *.bak doc/public/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 9fe0ea16d344d5b9bed1cd7f6046e378ce76ae1f Author: Behdad Esfahbod Date: Wed Jun 28 03:15:41 2006 +0200 Update list of ignored header files. doc/public/Makefile.am | 44 ++++++++++++++++++++++++++++---------------- 1 files changed, 28 insertions(+), 16 deletions(-) commit ddb81d3cade326fecfe1ed05037542e958e734b5 Author: Behdad Esfahbod Date: Tue Jun 27 16:55:53 2006 +0200 Report Xlib Xrender status. configure.in | 29 +++++++++++++++-------------- 1 files changed, 15 insertions(+), 14 deletions(-) commit 34f24d2aad90d4a737b513ac6858ed879316e132 Author: Carl Worth Date: Tue Jun 27 15:38:45 2006 +0200 ROADMAP: Note that degenerate path stuff has been pushed out now. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 988a28e259924e7ce50f4d3119bcef7a3b18c931 Merge: 973c9ab... ce2b9e1... Author: Carl Worth Date: Tue Jun 27 15:37:58 2006 +0200 Merge branch 'degenerate-path' into cairo commit 973c9abd53df4e6d6583de045514e003827bc7b9 Author: Jeff Muizelaar Date: Tue Jun 27 15:33:47 2006 +0200 PS: Workaround to avoid splitting final ~> terminating sequence. src/cairo-ps-surface.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 5d60ceb9b85a6b39865bc760ef7467c10f2ec7b6 Author: Michael Emmel Date: Mon Jun 26 22:27:14 2006 -0700 Added major updates fixes and enhancements by Claudio Ciccani klan@directfb.org Almost a full rewrite src/cairo-directfb-surface.c | 2175 +++++++++++++++++++++++++++++------------- 1 files changed, 1523 insertions(+), 652 deletions(-) commit 289e8b8af30ae3f00e7649109a933a673f346b37 Author: Behdad Esfahbod Date: Mon Jun 26 12:26:15 2006 +0200 Remove config.cache in make distclean. Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 73a0e792b4115a1012c5f618650a6265377cc6e5 Author: Behdad Esfahbod Date: Mon Jun 26 12:21:18 2006 +0200 More configure foo fixes for .pc files. configure.in | 14 ++++++++------ src/Makefile.am | 9 ++++++++- src/cairo-backend.pc.in | 4 ++-- 3 files changed, 18 insertions(+), 9 deletions(-) commit 5ba974ea0b7974e8c985d7414fcf6a8a5e415c12 Author: Behdad Esfahbod Date: Mon Jun 26 11:54:04 2006 +0200 Fix circular dependency in cairo.pc and cairo-xlib.pc. configure.in | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 53a478d233e7b8e02ecbc93bf102fb4dc29e0d57 Author: Behdad Esfahbod Date: Sun Jun 25 17:43:27 2006 +0200 Rewrite configure caching. configure.in | 285 ++++++++++++++++++++++++------------------------------ src/cairo.pc.in | 2 +- 2 files changed, 128 insertions(+), 159 deletions(-) commit ce2b9e1b5cc816e4a6a4345daab539cc58e2d043 Author: Carl Worth Date: Sun Jun 25 16:57:59 2006 +0200 Prefer TRUE and FALSE over 1 and 0 for assigning cairo_bool_t values src/cairo-path-stroke.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) commit 58a60ed9fdd53a4cf29d33624b866bf6ccd637ae Author: Carl Worth Date: Sun Jun 25 16:53:13 2006 +0200 Prefer sub-path over subpath in documentation. src/cairo.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) commit 773cb6475b68199e5ef0839cd22c9f3445d7d5d3 Author: Carl Worth Date: Sun Jun 25 16:51:25 2006 +0200 Prefer sub_path over subpath in identifiers. src/cairo-path-stroke.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 8f0dd658b1fff3f4e9225b8fb23884f0bbcdb822 Author: Carl Worth Date: Sun Jun 25 16:49:45 2006 +0200 Add documentation for how degenerate segments and sub-paths are treated. src/cairo.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) commit 15caa88c6416ce8e0c4c026e76f84ccaf7a3c840 Author: Jeff Muizelaar Date: Sun Jun 25 16:12:38 2006 +0200 Initial support for degenerate-path stroking This follows the PDF and SVG specifications which only draw degenerate paths when round caps are in effect. With this commit, the degenerate-path test passes with the image, xlib, and pdf backends, (but still fails with ps and svg backends). src/cairo-path-stroke.c | 54 +++++++++++++++++++++++++++++----------------- 1 files changed, 34 insertions(+), 20 deletions(-) commit 20df4af12617ad6459dcb234dfd98954282710f5 Author: Jeff Muizelaar Date: Sun Jun 25 15:48:48 2006 +0200 Add new test case degenerate-path to show current 'bug' test/Makefile.am | 4 ++ test/degenerate-path-ref.png | Bin 0 -> 193 bytes test/degenerate-path-rgb24-ref.png | Bin 0 -> 174 bytes test/degenerate-path.c | 68 ++++++++++++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 0 deletions(-) commit e747bbd350e9630c18849dd7975036d1260264be Author: Torsten Schoenfeld Date: Sun Jun 25 15:07:19 2006 +0200 Fix build after recent pixman.h change. The recent pixman.h change to use configure-generated defines accidentally broke the build. Pulling in config.h fixes it. pixman/src/pixman.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit e32138aa93ba37d760af87294fbb47046bfe6dec Author: Carl Worth Date: Sun Jun 25 14:42:27 2006 +0200 Prefer using configure-generated variable for finding stdint.h or similar. We were doing something more complicated originally, and that was because pixman.h was an installed public header file at one time. But that hasn't been the case for quite a long time. pixman/src/pixman.h | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit 14ffde038038deda66973856a5f3b9442c8d3c7d Author: Carl Worth Date: Sun Jun 25 12:16:36 2006 +0200 ROADMAP: Note that bug 6759 is now fixed. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d2ea21b4aef8ab5338718ddd6ccdff35609e9f6c Author: Carl Worth Date: Sun Jun 25 11:48:32 2006 +0200 ft-text-antialias-none: Update reference images and igore list. Add a new ps reference image due to slightly different rasterization. Also update pdf and svg backends to ignore this test since those backends do not support ANTIALIAS_NONE. Note in ROADMAP that bug 6759 is fixed now. test/cairo-test.c | 2 ++ test/ft-text-antialias-none-ps-argb32-ref.png | Bin 0 -> 335 bytes 2 files changed, 2 insertions(+), 0 deletions(-) commit 7e0e503fba80767dc68556054e937123fdcea359 Author: Carl Worth Date: Sun Jun 25 11:32:36 2006 +0200 xlib: Fix failure path to do cache thawing cleanup. src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4bff3d559e1d931cd47701f11765b1a574a7eac4 Author: Carl Worth Date: Sun Jun 25 11:28:03 2006 +0200 ROADMAP: Note that cairo_xlib_surface_get_width/height exist now. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ddead8e0612162e121868ba561498b8565112f8b Author: Robert O'Callahan Date: Wed Jun 21 15:47:03 2006 +1200 Surface size getters for xlib When accessing the underlying drawable etc of an xlib surface, it is also helpful to be able to get the width and height without a server round trip. This patch provides those functions. src/cairo-xlib-surface.c | 26 ++++++++++++++++++++++++++ src/cairo-xlib.h | 6 ++++++ test/xlib-surface.c | 7 ++++++- 3 files changed, 38 insertions(+), 1 deletions(-) commit 113bef399a2ca27f4c49a3d917ac1e6075449616 Author: Carl Worth Date: Sun Jun 25 11:20:50 2006 +0200 ROADMAP: Note that bug 6617 might already be fixed. ROADMAP | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 9ab5678e53219f95de7183e300bba3edac7fe72d Author: Carl Worth Date: Sun Jun 25 10:02:10 2006 +0200 Fix bug 7268: Fix coordinate space for _cairo_surface_get_extents Previously this function was attempting to return values in surface space, (but even then it was doing it wrong). However, all callers actually expect values in backend space. Fixing this cleans up bug 7268 quite nicely. ROADMAP | 2 +- src/cairo-surface.c | 31 +++++++++++++------------------ 2 files changed, 14 insertions(+), 19 deletions(-) commit 95355c854f1894e7bbcd370f3bb0d00223c077b6 Author: Carl Worth Date: Sun Jun 25 02:25:16 2006 +0200 ROADMAP: Note that SVG bitmap glyphs now work. Move some bugs to a punt list. ROADMAP | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) commit 4c7074ceb42c50fc55929291330658f693c66bc7 Author: Carl Worth Date: Sun Jun 25 02:23:14 2006 +0200 Remove comment which had been incorrectly copied src/cairo-ft-font.c | 16 +--------------- 1 files changed, 1 insertions(+), 15 deletions(-) commit 3a313070e5b5a1168225dec008f63ff68ed20559 Author: Emmanuel Pacaud Date: Fri Jun 23 20:13:58 2006 +0200 SVG: fix bit order for bitmap font data and use a group with matrix transformation instead of applying the same matrix on each rect coordinates. src/cairo-svg-surface.c | 55 +++++++++++++++++++--------------------------- 1 files changed, 23 insertions(+), 32 deletions(-) commit 8b6fcaf8ff17786ab5394a4aa2d6289f5d9601c2 Author: Jonathon Jongsma Date: Fri Jun 23 08:29:17 2006 -0500 Fix a minor documentation typo in cairo_pop_group_to_source src/cairo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bfa133f9e6dbe511ab696cb1d4b1cea59451f1c1 Author: Carl Worth Date: Thu Jun 22 22:39:39 2006 -0700 ROADMAP: Note that bug 6955 is fixed. ROADMAP | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 5488c3b462260126a000928aa599684d7b1041e7 Author: Carl Worth Date: Thu Jun 22 22:38:17 2006 -0700 xlib: Prefer BAIL over FAIL when the cleanup code is also used in succesful cases. src/cairo-xlib-surface.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) commit 7e457cb4c1e69670f27e3e8e134a9e32a8f75788 Author: Carl Worth Date: Thu Jun 22 22:32:57 2006 -0700 Bug 6955: Fix by adding freeze/thaw around scaled_font glyph cache in _cairo_xlib_surface_show_glyphs src/cairo-scaled-font.c | 12 ++++++++++++ src/cairo-xlib-surface.c | 15 ++++++++++++++- src/cairoint.h | 6 ++++++ test/glyph-cache-pressure.c | 7 +++++++ 4 files changed, 39 insertions(+), 1 deletions(-) commit 6a58658b73924fa6897bd1e290d754ce1df44b0d Author: Carl Worth Date: Thu Jun 22 22:05:20 2006 -0700 Add test/glyph-cache-pressure to demonstrate xlib failure (bug 6955) test/.gitignore | 1 + test/Makefile.am | 2 + test/glyph-cache-pressure-pdf-argb32-ref.png | Bin 0 -> 2879 bytes test/glyph-cache-pressure-ps-argb32-ref.png | Bin 0 -> 591 bytes test/glyph-cache-pressure-ref.png | Bin 0 -> 3223 bytes test/glyph-cache-pressure-svg-argb32-ref.png | Bin 0 -> 3635 bytes test/glyph-cache-pressure-svg-rgb24-ref.png | Bin 0 -> 3165 bytes test/glyph-cache-pressure.c | 89 ++++++++++++++++++++++++++ 8 files changed, 92 insertions(+), 0 deletions(-) commit 333ac8f4d9ccc356cb91e7118ed56bfc07e78c2f Author: Carl Worth Date: Thu Jun 22 22:03:06 2006 -0700 Add 'private' cairo_scaled_font_test_set_max_glyphs_cached_per_font for testing src/Makefile.am | 1 + src/cairo-scaled-font-test.h | 49 ++++++++++++++++++++++++++++++++++++++++++ src/cairo-scaled-font.c | 17 +++++++++++++- 3 files changed, 66 insertions(+), 1 deletions(-) commit d5197c1e0defc1018320efcb461977557a7d5d6e Author: Emmanuel Pacaud Date: Thu Jun 22 22:32:47 2006 +0200 SVG: dumb implementation of bitmap glyphs. Bitmap glyphs are emited as tiny svg rectangles. An improvement would be to calculate glyph outline from bitmap data. src/cairo-svg-surface.c | 39 ++++++++++++++++++++++++++++++++------- 1 files changed, 32 insertions(+), 7 deletions(-) commit cd5eb70e4e45962c88b4bfe13de6f26211601e55 Author: Carl Worth Date: Wed Jun 21 22:36:27 2006 -0700 ROADMAP: Update with 1.1.10 notes as well as new blockers and fixes ROADMAP | 23 +++++++++++++++++++---- 1 files changed, 19 insertions(+), 4 deletions(-) commit 25e0acfee0ae790329c2f558ce6a9f997eeace6d Author: Carl Worth Date: Wed Jun 21 17:23:35 2006 -0700 PDF: Fix display of bitmapped glyphs (bitmap-font test now passes) src/cairo-pdf-surface.c | 37 ++++++++++++++++++++++++++++++++----- 1 files changed, 32 insertions(+), 5 deletions(-) commit b4720ca51d4b1de02d6beb898b7d04a33e1d99fd Author: Carl Worth Date: Tue Jun 20 23:12:58 2006 -0700 PDF: Push glyph stream creation down from emit glyph to outline/bitmap variants src/cairo-pdf-surface.c | 42 +++++++++++++++++++++++++----------------- 1 files changed, 25 insertions(+), 17 deletions(-) commit 83a8a50735746a4591c3bcc1aaa46fb7a0f87224 Author: Behdad Esfahbod Date: Wed Jun 21 19:57:40 2006 -0400 Pass --cache-file=config.cache and --disable-static to configure from autogen.sh. autogen.sh | 2 +- src/Makefile.am | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletions(-) commit f5ee9557c3dc7bc72098cd08698f147ed685ccb2 Author: Behdad Esfahbod Date: Wed Jun 21 07:22:50 2006 -0400 Removed excess mkdir. configure.in | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit f71313d427565cb37a25393ff8a5a2ffdcfb798b Author: Behdad Esfahbod Date: Wed Jun 21 07:00:34 2006 -0400 Minor refinements, mostly to configure.in. configure.in | 113 +++++++++++++++++++++++++++++------------------------ test/.gitignore | 1 + test/Makefile.am | 3 +- 3 files changed, 65 insertions(+), 52 deletions(-) commit c88bab66ab258e0bbd2cb80eaf4edc9e5f1ad6f0 Author: Behdad Esfahbod Date: Wed Jun 21 06:25:01 2006 -0400 Make configure generate cairo-features.h. Generate AC_DEFINE and AM_CONDITIONALS for all CAIRO_HAS_* in CAIRO_BACKEND_ENABLE. configure.in | 198 ++++++++++++++++++++++------------------------- src/Makefile.am | 2 + src/cairo-features.h.in | 86 -------------------- 3 files changed, 96 insertions(+), 190 deletions(-) commit c6c1da2a2346de6c1df82fab2e7bafec7f37db50 Author: Carl Worth Date: Tue Jun 20 17:49:05 2006 -0700 PS: Add support for emitting bitmapped glyphs into type3 fonts. The bitmap-font now passes when run against the ps backend. src/cairo-ps-surface.c | 45 +++++++++++++++++++++++++++++++++++++++------ 1 files changed, 39 insertions(+), 6 deletions(-) commit cca08d9bce1647444acdb78aedb6ad6967c07661 Author: Carl Worth Date: Tue Jun 20 17:48:06 2006 -0700 New bitmap-font test with bundled 6x13 font. The 6x13 font is a public-domain terminal font from the X distribution. test/.gitignore | 1 + test/6x13.pcf | Bin 10560 -> 5239 bytes test/Makefile.am | 3 + test/bitmap-font-ref.png | Bin 0 -> 552 bytes test/bitmap-font-rgb24-ref.png | Bin 0 -> 513 bytes test/bitmap-font.c | 106 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 110 insertions(+), 0 deletions(-) commit ab8ae66f9d5c92af96b4a530957537ec7d33c128 Author: Carl Worth Date: Tue Jun 20 17:15:07 2006 -0700 SVG: Fix to not crash on bitmapped glyphs This is similar to a change that was recently made to the PDF and PS backends. Bitmap glyphs are not yet drawn correctly, (drawn as filled rectangles instead), but the crash is at least eliminated. src/cairo-svg-surface.c | 87 ++++++++++++++++++++++++++++++++++------------- test/6x13.pcf | Bin 0 -> 10560 bytes 2 files changed, 63 insertions(+), 24 deletions(-) commit 2f43a79e4e87341dd0df49fc6c11fd17a21350c2 Author: Carl Worth Date: Tue Jun 20 11:28:23 2006 -0700 ft-font: Use compile-time test (WORDS_BIGENDIAN) rather than run-time function to test endian-ness. src/cairo-ft-font.c | 11 ++--------- 1 files changed, 2 insertions(+), 9 deletions(-) commit b806b50cfe890b534dbf86f0b4d2cc0c22b880ff Author: Carl Worth Date: Tue Jun 20 10:59:22 2006 -0700 Add new CAIRO_BITSWAP8 macro for swapping the bits within a byte. This uses a technique devised by Sean Anderson, July 13, 2001 as found at http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits This technique uses 3 multiplies rather than just shifts and masks, but performance seems comparable to the old approach, (but more significantly, the new approach is easier to implement as a macro, and I plan to start using this bit-swapping elsewhere very soon). src/cairo-ft-font.c | 9 +++------ src/cairoint.h | 12 ++++++++++++ 2 files changed, 15 insertions(+), 6 deletions(-) commit 3465ae1c58a87382c33117f6c5dec52403c9694e Author: Carl Worth Date: Tue Jun 20 10:43:53 2006 -0700 output-stream: Support %X in addition to %x src/cairo-output-stream.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit bb11980f14560ea16174c6531678b9b7a623f813 Author: Kristian Høgsberg Date: Tue Jun 20 02:16:17 2006 -0400 Add 'x' case to printf switch so we actually implement %02x. src/cairo-output-stream.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 651b2a9ab0bdb5f8fa952e47e95c21d2f530950d Author: Carl Worth Date: Mon Jun 19 21:16:03 2006 -0700 test/fallback-resolution: Remove extra call to cairo_show_page test/fallback-resolution.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 7026e24548fd0e4fbfb2bd3af7cffab8eab88d44 Author: Carl Worth Date: Mon Jun 19 21:15:26 2006 -0700 PS PDF: Drop unused hex_digit functions, (now that output stream supports %02x) src/cairo-pdf-surface.c | 8 -------- src/cairo-ps-surface.c | 8 -------- 2 files changed, 0 insertions(+), 16 deletions(-) commit cd5e08a9fee70b1ed2252d24e04db806769babcd Author: Kristian Høgsberg Date: Mon Jun 19 22:42:32 2006 -0400 Implement 0-padding and field width for _cairo_output_stream_printf(). Use it instead of %c%c in PS and PDF surfaces. src/cairo-output-stream.c | 46 +++++++++++++++++++++++++++++--------------- src/cairo-pdf-surface.c | 5 +-- src/cairo-ps-surface.c | 5 +-- 3 files changed, 34 insertions(+), 22 deletions(-) commit a3f2d92f11a1ab4d30dd0e33a0cd5ee19495eeb1 Author: Carl Worth Date: Mon Jun 19 11:03:32 2006 -0700 PDF: Don't fallback due to CAIRO_ANTIALIAS_NONE This was a gratuitous thing that was causing excessive fallbacks in mozilla printing to PDF. The only reason it was ever there was to get some of the tests that rely on CAIRO_ANTIALIAS_NONE to pass. Instead we now simply don't run those tests against the PDF backend. src/cairo-pdf-surface.c | 16 ++-------------- test/cairo-test.c | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 15 deletions(-) commit 72e7667ed904b93475d7e4540778c498aa781cdf Author: Behdad Esfahbod Date: Mon Jun 19 04:29:49 2006 -0400 Replace noinst_ with check_, such that nothing is built with default make target. test/Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit fdc109dc5902f362bfec2f90b5d357c2d16b96d6 Author: Behdad Esfahbod Date: Mon Jun 19 04:17:19 2006 -0400 Add create-for-stream.* to .gitignore. test/.gitignore | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit d12afb7eac80d66cc140721031940feddc2586c6 Author: Behdad Esfahbod Date: Mon Jun 19 04:10:56 2006 -0400 Update .gitignore test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit a28557f55a49ac812e69b59fe803fd0cba10d10b Author: Behdad Esfahbod Date: Mon Jun 19 04:10:19 2006 -0400 Reference images for new test... test/device-offset-positive-ref.png | Bin 0 -> 139 bytes test/device-offset-positive-rgb24-ref.png | Bin 0 -> 130 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 2f59dd4a5e9f4ce3853b055620bbada4526e3f58 Author: Jinghua Luo Date: Mon Jun 19 15:52:36 2006 +0800 Turn hinting off to get consistent results for ft-text-vertical-layout test case. test/ft-text-vertical-layout-ref.png | Bin 1145 -> 1130 bytes test/ft-text-vertical-layout-rgb24-ref.png | Bin 1059 -> 0 bytes test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 1106 -> 1021 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1106 -> 1100 bytes test/ft-text-vertical-layout.c | 5 +++++ 5 files changed, 5 insertions(+), 0 deletions(-) commit f5b6fc139c8e455b27df52139578d2546a826e6d Author: Jinghua Luo Date: Mon Jun 19 15:51:43 2006 +0800 Turn hinting off to get consistent results for ft-text-antialias-none test case. test/ft-text-antialias-none-ref.png | Bin 332 -> 336 bytes test/ft-text-antialias-none.c | 3 +++ 2 files changed, 3 insertions(+), 0 deletions(-) commit ddc01a3c5530aa9480eb19aded7ba08f97529440 Author: Behdad Esfahbod Date: Mon Jun 19 03:22:53 2006 -0400 Correct comment about expected result in device-offset-positive test. test/device-offset-positive.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 70d3719ec9d0dbe7e37f3ad3c5cfbe596be4f409 Author: Behdad Esfahbod Date: Mon Jun 19 03:13:56 2006 -0400 Add test device-offset-positive. test/.gitignore | 1 + test/Makefile.am | 2 + test/device-offset-positive.c | 88 +++++++++++++++++++++++++++++++++++++++++ test/device-offset.c | 2 +- 4 files changed, 92 insertions(+), 1 deletions(-) commit fde08da55f293cd40927c8a1d41db0e478785e8e Author: Jinghua Luo Date: Mon Jun 19 14:49:46 2006 +0800 freetype: Don't ignore antialias in some cases. src/cairo-ft-font.c | 57 ++++++++++++++++++++++++++------------------------- 1 files changed, 29 insertions(+), 28 deletions(-) commit c9de7b1286309fc2da1a5ea798674b528aa2eab6 Author: Jinghua Luo Date: Mon Jun 19 14:17:24 2006 +0800 freetype: Compare all elements in ft_options but not use memcmp. src/cairo-ft-font.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit e4736fcf76855c7ca5c9e8b922622dfffe08e4e1 Author: Jinghua Luo Date: Sun Jun 18 23:50:51 2006 +0800 freetype: Clear target mode correctly in _cairo_ft_options_merge. src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1e0e56e0223116bf48e5acd4a974f16fae824df2 Author: Jinghua Luo Date: Sun Jun 18 17:30:39 2006 +0800 freetype: Fix warnings in _decompose_glyph_outline. src/cairo-ft-font.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 117b062756de9fc99f635b3e712ea3e258c53165 Author: Jinghua Luo Date: Sun Jun 18 17:26:19 2006 +0800 freetype: cleanup _cairo_ft_scaled_glyph_init. src/cairo-ft-font.c | 32 ++++++++++++++++++-------------- 1 files changed, 18 insertions(+), 14 deletions(-) commit 54b4a2fccdcaa4fbc126818c7cb7b96a1a8acf35 Author: Jinghua Luo Date: Sun Jun 18 17:20:38 2006 +0800 freetype: Respect configurations in font pattern. cairo freetype font backend doesn't handle fontconfig configurations quiet well, it always renders glyphs using configurations in scaled_font->base.options which usually isn't corresponding to font pattern used to create the font face and the load flags. As a result, turning antialias off with fontconfig doesn't work with cairo HEAD, subpixel order either. This commit make cairo respect configurations in font pattern and handle load flags correctly. The ft-text-antialias-none test case passess now. And should fix bug #6759 and #4792. src/cairo-ft-font.c | 232 ++++++++++++++++++++++++++++----------------------- 1 files changed, 129 insertions(+), 103 deletions(-) commit 4b2b8f939a9e786ead080f85d1b101680230f168 Author: Jinghua Luo Date: Sat Jun 17 16:29:54 2006 +0800 Add ft-text-antilaias-none test case demonstrating bug #6759. test/.gitignore | 1 + test/Makefile.am | 1 + test/ft-text-antialias-none-ref.png | Bin 0 -> 332 bytes test/ft-text-antialias-none.c | 128 +++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 0 deletions(-) commit efaf88d4092db5e4ca37508d87fdb8ac39496018 Author: Jinghua Luo Date: Sat Jun 17 15:52:05 2006 +0800 Add missing prototype for _cairo_lzw_compress. src/cairoint.h | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 6f0a85c8f76ba2fb77862f2da506bfd405ce218d Author: Ian Osgood Date: Fri Jun 16 08:18:37 2006 -0700 Update the XCB backend for screen sensitivity. src/cairo-xcb-surface.c | 87 +++++++++++++++++++++++++++++++++++----------- src/cairo-xcb-xrender.h | 1 + src/cairo-xcb.h | 1 + test/cairo-test.c | 2 +- 4 files changed, 69 insertions(+), 22 deletions(-) commit bc4a6796f851a9f10764feb783988641d26cf2ce Author: Behdad Esfahbod Date: Fri Jun 16 19:01:20 2006 -0400 Accept CAIRO_TEST_TARGET being empty or containing a list of backends to test. The list can be separated by any of space, tab, comma, colon, or semicolon. Moreover, a CAIRO_TEST_TARGET of e.g. "glitz" matches any subtarget like "glitz-glx". test/cairo-test.c | 33 ++++++++++++++++++++++++--------- 1 files changed, 24 insertions(+), 9 deletions(-) commit 8bc05f15ab3f2054f802cfbc9564476a4acbb4a8 Author: Behdad Esfahbod Date: Fri Jun 16 18:39:36 2006 -0400 Note that create_similar clears surface. src/cairo-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 3bad1f0b0c431f1e5832d8755d0e22fe31120007 Author: Carl Worth Date: Fri Jun 16 10:09:54 2006 -0700 Increment CAIRO_VERSION to 1.1.11 after making the 1.1.10 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 65e73c81b83222de873935cf384e514ea20ac854 Author: Carl Worth Date: Fri Jun 16 09:45:44 2006 -0700 Update version to 1.1.10 and add notes to NEWS file. Also update libtool version information to 10:0:8. NEWS | 17 +++++++++++++++++ configure.in | 6 +++--- 2 files changed, 20 insertions(+), 3 deletions(-) commit b992e1e29d6d63de2a6b5b48b93d23be50fc29ca Author: Carl Worth Date: Fri Jun 16 09:44:33 2006 -0700 Annoying doc template churn. doc/public/tmpl/cairo-image.sgml | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 4a5111695c25ce9178f1eb69acd825b3466fcb11 Author: Carl Worth Date: Fri Jun 16 09:22:36 2006 -0700 Update release rules in Makefile to add git signature information. Makefile.am | 25 ++++++++++++++++++++++--- RELEASING | 2 +- 2 files changed, 23 insertions(+), 4 deletions(-) commit c6164d0d2a9ca16a00c2768f24a0230de6cbc6f6 Author: Carl Worth Date: Thu Jun 15 16:22:52 2006 -0700 New API: Add support for new CAIRO_FORMAT_RGB16_565 pixman/src/icformat.c | 6 ++++++ pixman/src/pixman.h | 3 ++- src/cairo-image-surface.c | 17 ++++++++++++++++- src/cairo.h | 6 +++++- 4 files changed, 29 insertions(+), 3 deletions(-) commit 36e59ca5f854de2740c7ef4f0b6022785dd9dc4c Author: Jinghua Luo Date: Fri Jun 16 21:13:21 2006 +0800 xlib: free resources before return if looking up glyph surface fails. src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bf2c0e44d8c8e1e692eafba7bccddd26f1f31c1b Merge: b8231f8... a8b736c... Author: Behdad Esfahbod Date: Fri Jun 16 00:13:18 2006 -0400 Merge branch 'cairo' into cairo-origin commit a8b736c1608c3d0b98b81f79ab1f5607cce245ed Author: Behdad Esfahbod Date: Fri Jun 16 00:08:44 2006 -0400 Use enum time instead of int (shuts intel compiler up.) pixman/src/pixregion.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b8231f8949818099c4e6ed4e0669de6f8c8bf856 Author: Kristian Høgsberg Date: Thu Jun 15 22:07:17 2006 -0400 Add cairo-output-stream-private.h to libcairo_la_SOURCES. We now pass distcheck again. src/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit abe1bfad8d8a3252bdc65da40bf303626881b163 Author: Carl Worth Date: Thu Jun 15 15:43:00 2006 -0700 Add missing breaks in switch statement. Yes, I am an idiot. src/cairo-image-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 9fa24975b4b9cc9983331991d2a3c53a37272162 Author: Carl Worth Date: Thu Jun 15 15:33:45 2006 -0700 Drop _cairo_surface_is_opaque now that we have cairo_surface_get_content src/cairo-pattern.c | 2 +- src/cairo-surface.c | 37 +------------------------------------ src/cairoint.h | 1 + 3 files changed, 3 insertions(+), 37 deletions(-) commit 0ba040d7f63c62e482d40fc6db0e1f0714806839 Author: Carl Worth Date: Thu Jun 15 14:56:59 2006 -0700 Remove _cairo_image_surface_is_alpha_only in favor of just looking at content value. src/cairo-image-surface.c | 16 +--------------- 1 files changed, 1 insertions(+), 15 deletions(-) commit 82496a6f7c5b0a9f91db6abc9e34202b8ffa77c4 Author: Carl Worth Date: Thu Jun 15 14:15:42 2006 -0700 _cairo_format_from_pixman_format: Add useful error mesage and assertion when failing. src/cairo-image-surface.c | 62 ++++++++++++++++++++++++++------------------- 1 files changed, 36 insertions(+), 26 deletions(-) commit dedc51ba51eaa61e4b11f274fac06c6f0acd8a87 Author: Kristian Høgsberg Date: Wed Jun 14 19:25:37 2006 -0400 Only call close function for output streams if it's non-NULL. src/cairo-output-stream.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 9ef99d10bb7eb6cde421e0d93ae55988882d9b56 Author: Kristian Høgsberg Date: Wed Jun 14 19:15:50 2006 -0400 Add test case for the PDF, PS and SVG stream constructors. test/Makefile.am | 1 + test/create-for-stream.c | 218 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+), 0 deletions(-) commit 8c8bcaf99b1c8d6cb26dfc89751d71de535c11e7 Author: Emmanuel Pacaud Date: Wed Jun 14 20:57:42 2006 +0200 SVG: Update of reference images. test/linear-gradient-svg-argb32-ref.png | Bin 947 -> 1000 bytes test/linear-gradient-svg-rgb24-ref.png | Bin 947 -> 1000 bytes test/mask-svg-argb32-ref.png | Bin 87715 -> 87728 bytes test/mask-svg-rgb24-ref.png | Bin 81874 -> 81753 bytes test/paint-source-alpha-svg-argb32-ref.png | Bin 353 -> 505 bytes test/paint-source-alpha-svg-rgb24-ref.png | Bin 353 -> 505 bytes test/paint-with-alpha-svg-argb32-ref.png | Bin 420 -> 516 bytes test/paint-with-alpha-svg-rgb24-ref.png | Bin 420 -> 516 bytes test/push-group-svg-argb32-ref.png | Bin 2945 -> 2935 bytes test/push-group-svg-rgb24-ref.png | Bin 2901 -> 2887 bytes test/scale-source-surface-paint-svg-argb32-ref.png | Bin 146 -> 182 bytes test/scale-source-surface-paint-svg-rgb24-ref.png | Bin 158 -> 192 bytes test/text-pattern-svg-argb32-ref.png | Bin 1720 -> 1708 bytes test/text-pattern-svg-rgb24-ref.png | Bin 1567 -> 1563 bytes test/trap-clip-svg-argb32-ref.png | Bin 71765 -> 71728 bytes test/trap-clip-svg-rgb24-ref.png | Bin 73066 -> 73082 bytes 16 files changed, 0 insertions(+), 0 deletions(-) commit 2cea3a2710cd4c6eb68e25eadaaf96cdc921ef14 Merge: 17ea755... 4932d09... Author: Kristian Høgsberg Date: Wed Jun 14 15:00:33 2006 -0400 Merge branch 'svg-rewrite' commit 4932d09a06228a08d1c8f4d2892378c004ff3313 Author: Kristian Høgsberg Date: Wed Jun 14 14:12:55 2006 -0400 Actually add src/cairo-output-stream-private.h. src/cairo-output-stream-private.h | 156 +++++++++++++++++++++++++++++++++++++ 1 files changed, 156 insertions(+), 0 deletions(-) commit 17ea7552355d9925fb99cd4ca98cf38946f99421 Author: Torsten Schönfeld Date: Wed Jun 14 11:09:00 2006 -0700 Add missing cairo_public tag for cairo_image_surface_get_stride src/cairo.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1599ab8fa91fd2b5b611825d1e1b46fcacfb7982 Author: Carl Worth Date: Wed Jun 14 10:41:29 2006 -0700 Increment CAIRO_VERSION to 1.1.9 after making the 1.1.8 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit dd859b8736bb4d1bcf3ed78d0bd1f72a7aad9ca9 Author: Carl Worth Date: Wed Jun 14 08:14:43 2006 -0700 Update version to 1.1.8 and add notes to NEWS file. Also update libtool version information to 9:0:7. NEWS | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 6 +- 2 files changed, 135 insertions(+), 3 deletions(-) commit 65c9c072d207b04cac8da21b40b2dd5c14791547 Author: Carl Worth Date: Wed Jun 14 06:39:23 2006 -0700 Update refefence images due to pattern source shift. The commit that introduced this change is: commit b104a79502e2c01c508e40d83613ecfa001a2a4e Author: Bertram Felgenhauer Date: Tue Jun 13 20:07:28 2006 -0400 Patch to fix pixman samping location bug (#2488). test/gradient-alpha-ref.png | Bin 155 -> 147 bytes test/gradient-alpha-rgb24-ref.png | Bin 142 -> 142 bytes test/linear-gradient-ref.png | Bin 972 -> 1023 bytes test/mask-ref.png | Bin 87837 -> 87890 bytes test/mask-rgb24-ref.png | Bin 71069 -> 70978 bytes test/operator-source-ref.png | Bin 19684 -> 19726 bytes test/operator-source-rgb24-ref.png | Bin 14699 -> 14701 bytes test/push-group-ref.png | Bin 3012 -> 2996 bytes test/push-group-rgb24-ref.png | Bin 2858 -> 2840 bytes test/text-pattern-ref.png | Bin 1721 -> 1721 bytes test/text-pattern-rgb24-ref.png | Bin 1423 -> 1418 bytes test/trap-clip-ref.png | Bin 71785 -> 71753 bytes test/trap-clip-rgb24-ref.png | Bin 63087 -> 63049 bytes 13 files changed, 0 insertions(+), 0 deletions(-) commit 4bdfff477a1d7fa19890f0a5c4f3cc6533e39149 Author: Carl Worth Date: Wed Jun 14 06:00:11 2006 -0700 PS PDF: Update reference images due to truetype subsetting test/select-font-face-pdf-argb32-ref.png | Bin 2782 -> 2237 bytes test/select-font-face-ps-argb32-ref.png | Bin 528 -> 481 bytes test/show-text-current-point-pdf-argb32-ref.png | Bin 3838 -> 2157 bytes test/show-text-current-point-ps-argb32-ref.png | Bin 645 -> 602 bytes test/text-antialias-gray-pdf-argb32-ref.png | Bin 1004 -> 950 bytes test/text-antialias-gray-ps-argb32-ref.png | Bin 306 -> 310 bytes test/text-antialias-none-pdf-argb32-ref.png | Bin 1004 -> 950 bytes test/text-antialias-none-ps-argb32-ref.png | Bin 306 -> 310 bytes test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 1004 -> 950 bytes test/text-antialias-subpixel-ps-argb32-ref.png | Bin 306 -> 310 bytes 10 files changed, 0 insertions(+), 0 deletions(-) commit 7e0be461b595c3561fa75472fdfd5954e4666cfc Author: Behdad Esfahbod Date: Tue Jun 13 22:40:50 2006 -0400 Rename cairo-wideint.h to cairo-wideint-private.h. RELEASING | 2 +- src/Makefile.am | 2 +- src/cairo-wideint-private.h | 313 +++++++++++++++++++++++++++++++++++++++++++ src/cairo-wideint.h | 313 ------------------------------------------- src/cairoint.h | 2 +- 5 files changed, 316 insertions(+), 316 deletions(-) commit b9cfe941c8e1ae427780117fedfd47d458e29f02 Author: Behdad Esfahbod Date: Tue Jun 13 22:37:34 2006 -0400 Add backend-specific pkg-config files. .gitignore | 1 - configure.in | 56 +++++++++++++++++++++++++++++++--------------- src/.gitignore | 1 + src/Makefile.am | 35 ++++++++++++++++++++++------ src/cairo-backend.pc.in | 12 ++++++++++ 5 files changed, 78 insertions(+), 27 deletions(-) commit 2249fb89ae36859d1d3f6c9d0b72e95e45726170 Author: Behdad Esfahbod Date: Tue Jun 13 19:13:05 2006 -0400 Move cairo.pc into src/. Makefile.am | 8 ++------ cairo.pc.in | 12 ------------ configure.in | 2 +- src/Makefile.am | 3 +++ src/cairo.pc.in | 12 ++++++++++++ 5 files changed, 18 insertions(+), 19 deletions(-) commit e346eca1386e8ec14f9bda7d76662a16706f1e7c Author: Carl Worth Date: Wed Jun 14 04:58:54 2006 -0700 Add zero-alpha reference image to Makefile.am for the sake of make dist test/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 211741cce61075b526edfacd728c9c5de8dd1aac Author: Bertram Felgenhauer Date: Wed Jun 14 04:51:27 2006 -0700 Bug 4723: configure.in: Fix m4 quoting when examining pkg-config version configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b8e93f9c5598d5452e08728546677a977e41617f Author: Brian Cameron Date: Wed Jun 14 04:44:01 2006 -0700 Bug 4882: Flag Sun's X server has having buggy_repeat. This is the Sun labelling of Xorg 6.8 as shipped with Solaris 10. src/cairo-xlib-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 32d049a7bf9549f8c797c50654546b6526518f0a Author: Dom Lachowicz Date: Wed Jun 14 04:37:08 2006 -0700 Bug 5306: test/pdf2png: Add missing include of stdio.h test/pdf2png.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e9269aefcbc96a417012107c17ec2bc4de608cc1 Author: Behdad Esfahbod Date: Wed Jun 14 04:07:29 2006 -0700 Bug 7075: Fix make clean to remove cairo.def src/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit c8e7ff096648a53b780f14c2cd2467157fae8385 Author: Carl Worth Date: Wed Jun 14 04:04:21 2006 -0700 ROADMAP: Update with PDF bugs from minefield test. Slip non-1.0 regressions off of 1.2. ROADMAP | 32 +++++++++++++++++++------------- 1 files changed, 19 insertions(+), 13 deletions(-) commit c515b15cfc8c88b330f16a9263841476c29ded99 Author: Carl Worth Date: Wed Jun 14 03:53:18 2006 -0700 ft: If glyph->format is not OUTLINE use _render_glyph_bitmap to coerce to a bitmap src/cairo-ft-font.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit 61a3260e44b40b8aa344f806979b60a82400105e Author: Jinghua Luo Date: Wed Jun 14 15:57:23 2006 +0800 ROADMAP: Mark bugs FC_ADVANCE and _transform_glyph_bitmap as fixed. ROADMAP | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0d2900477cd6edfe6025be06c3f1eda63cbe5230 Author: Jinghua Luo Date: Wed Jun 14 15:56:17 2006 +0800 freetype: Return an error if the glyph format isn't outline or bitmap while getting glyph surface. src/cairo-ft-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit b104a79502e2c01c508e40d83613ecfa001a2a4e Author: Bertram Felgenhauer Date: Tue Jun 13 20:07:28 2006 -0400 Patch to fix pixman samping location bug (#2488). pixman/src/fbcompose.c | 21 +++++++++++++++------ test/pixman-rotate-rgb24-ref.png | Bin 385 -> 244 bytes test/pixman-rotate-svg-argb32-ref.png | Bin 0 -> 258 bytes test/pixman-rotate-svg-rgb24-ref.png | Bin 0 -> 358 bytes 4 files changed, 15 insertions(+), 6 deletions(-) commit 0ee64b84689c22bba1d9bb2758170bbc104f5cf1 Author: Carl Worth Date: Tue Jun 13 16:50:43 2006 -0700 Bug 4196: undef MIN an MAX before defining to avoid duplicate definition pixman/src/icint.h | 2 ++ pixman/src/pixregion.c | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) commit 1b11d3830b26f6ce7f0d8ddcc315a9c19f56658a Author: Carl Worth Date: Tue Jun 13 16:42:06 2006 -0700 test/zero-alpha: Drop REPS from 100 to 10 for a faster test. Hopefully this still triggers the bug of interest. I think it should. test/zero-alpha.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2d269664f166c4fc835e70a176ad46b2d7ccb41d Author: Carl Worth Date: Tue Jun 13 16:13:23 2006 -0700 Add new zero-alpha test to demonstrate (X server?) bug found by Paul Giblock test/.gitignore | 1 + test/Makefile.am | 3 +- test/zero-alpha-ref.png | Bin 0 -> 115 bytes test/zero-alpha.c | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletions(-) commit 1d18af9f5adb0ce2e01bc42578fe117c4e924ce8 Merge: c7b194c... 27e9e3c... Author: Carl Worth Date: Tue Jun 13 15:51:57 2006 -0700 Merge branch 'type1-subsetting' into cairo Conflicts: src/cairo-ps-surface.c commit c7b194c59544ff441d1e83827242667c0e86dc5a Merge: 4b063c6... 127fab4... Author: Carl Worth Date: Tue Jun 13 15:46:14 2006 -0700 Merge branch 'truetype-subsetting' into cairo Conflicts: src/Makefile.am src/cairo-font-subset.c src/cairo-pdf-surface.c src/cairo-ps-surface.c commit cdf07a9be87515b75156a6f02f050bc5b1e6b5d1 Author: Kristian Høgsberg Date: Tue Jun 13 17:45:55 2006 -0400 Remove libxml2 checks from configure.in. configure.in | 14 -------------- 1 files changed, 0 insertions(+), 14 deletions(-) commit ed60128bd0822e56c8002f3503044d5b0efaec79 Author: Kristian Høgsberg Date: Tue Jun 13 17:25:24 2006 -0400 Rewrite SVG backend to just use cairo output stream instead of libxml2. src/cairo-svg-surface.c | 1161 +++++++++++++++++++---------------------------- 1 files changed, 471 insertions(+), 690 deletions(-) commit 17d41d1f71a5d5af489bc395e3bb3cf414aeda57 Author: Kristian Høgsberg Date: Tue Jun 13 17:24:36 2006 -0400 Only run fallback-resolution test case when all of PDF, PS and SVG are enabled. test/Makefile.am | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit 4b063c607208935fad040d481d42085c4ed6e64d Author: Carl Worth Date: Tue Jun 13 12:48:00 2006 -0700 PS, PDF: Re-organize handling of bitmapped fonts to avoid invalid output. Previously, using the ps or pdf backend with a bitmapped font would result in a coorupt output file, filled with uninitialized values and missing procedures for drawing the glyphs. Now, the file should actually be valid, but it's simply drawing black boxes instead of the correct glyphs. src/cairo-pdf-surface.c | 92 ++++++++++++++++++++++++++++++++-------------- src/cairo-ps-surface.c | 91 +++++++++++++++++++++++++++++++++------------- 2 files changed, 129 insertions(+), 54 deletions(-) commit d2045c1f7465f7f3625ce14a7b0e395b35ba8dc0 Author: Carl Worth Date: Tue Jun 13 12:45:16 2006 -0700 Change return type of _cairo_scaled_glyph_lookup to allow UNSUPPORTED. This allows graceful recovery when first requesting a path from a font that only supports bitmapped glyph. The changed return type is also pushed down into the scaled_glyph_init function of the cairo_scaled_font backend. src/cairo-atsui-font.c | 2 +- src/cairo-ft-font.c | 4 ++-- src/cairo-scaled-font.c | 10 ++++++++-- src/cairoint.h | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) commit 0e30fc44363435c52c762fa8a353de43fe087822 Author: Carl Worth Date: Mon Jun 12 08:45:58 2006 -0700 Add aliases for deprecated cairo_{pdf,ps,svg}_surface_set_dpi The aliases should allow binaries with the old symbols to continue to run. Meanwhile, the macros in cairo.h prevent any code from being compiled without using the new, future-proof function names. This is a temporary, transition strategy and the aliases will be dropped before the next major release. src/cairo-surface.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 7015cc0b90f99898852ca276368854f9465f4c82 Author: Carl Worth Date: Mon Jun 12 08:18:09 2006 -0700 Add cairo-ps-test.h and cairo-svg-test.h to Makefile.am src/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8581447e7b26f34c7be43fef7dfa5458f2278556 Author: Kristian Høgsberg Date: Mon Jun 12 03:15:33 2006 -0400 Add an in-memory output-stream implementation. src/cairo-output-stream.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) commit d43321066081eacca2e0c86258c68bae49036087 Author: Kristian Høgsberg Date: Mon Jun 12 03:10:40 2006 -0400 Convert the word wrap stream, the base85 stream and the ps string stream. src/cairo-base85-stream.c | 27 ++++++++++++--------------- src/cairo-ps-surface.c | 44 +++++++++++++++++++++----------------------- 2 files changed, 33 insertions(+), 38 deletions(-) commit 45cbe055d9cf4ac2cf2fbcd21b020c8f869a0380 Author: Kristian Høgsberg Date: Mon Jun 12 03:08:51 2006 -0400 Convert the stdio output stream to use the new output stream interface. src/cairo-output-stream.c | 50 +++++++++++++++++++++++++++++++++----------- 1 files changed, 37 insertions(+), 13 deletions(-) commit 3575c942f81d54c88fd48aee2352ecd29406e711 Author: Kristian Høgsberg Date: Mon Jun 12 03:07:19 2006 -0400 Make cairo_output_stream_t an embeddable type. Most internal cairo types are transparent within cairo and have init and fini functions to intialize and finialize them in place. This way they can be easily be embedded in other structs or derived from. Initially, the cairo_output_stream_t type was proposed as a publically visible type and thus kept opaque. However, now it's only used internally and derived from in a number of places so let's make it an embeddable type for consistency and ease of use. The patch keeps _cairo_output_stream_create() and _cairo_output_stream_close() around for (internal) backwards compatibility by deriving a cairo_output_stream_with_closure_t stream type. The patch also moves all cairo_output_stream_t functions out of cairoint.h and into new file cairo-output-stream-private.h, thus chipping away at the monolithic cairoint.h. src/cairo-base85-stream.c | 1 + src/cairo-output-stream.c | 76 ++++++++++++++++++++++++++++++----------- src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-svg-surface.c | 1 + src/cairoint.h | 84 --------------------------------------------- 6 files changed, 60 insertions(+), 104 deletions(-) commit 9d3443e86ab32711d332b1474bc2fe23f9796723 Author: Jinghua Luo Date: Mon Jun 12 14:18:25 2006 +0800 xlib: bugfix for #7172. When the glyph format does not match the font format, the glyph will be rendered incorrectly. Setting the {x, y}_offset correctly when converting glyph format fix that. src/cairo-xlib-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 79928101352a84af1884e993fd06bf6cd44f2af3 Author: Emmanuel Pacaud Date: Sun Jun 11 20:56:09 2006 +0200 SVG: Sets fallback resolution when compositing a meta surface. For doing so, I've changed document owner to be the paginated surface, instead of the svg surface like previously. That's because fallback resolution is stored in paginated surface. src/cairo-svg-surface.c | 29 ++++++++++++++--------------- 1 files changed, 14 insertions(+), 15 deletions(-) commit 7e1a01092c94c7b67e95f4f4ff27c76fb5b21295 Author: Jinghua Luo Date: Sun Jun 11 18:37:59 2006 +0800 freetype: build fix for _transform_glyph_bitmap. I sorry for this noise, I didn't notice cworth's device_{x, y}_offset changes. Now cairo builds again. paths... src/cairo-ft-font.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) commit 4af28e639dcf7fe3332c0302295e6d590a505af7 Author: Jinghua Luo Date: Sun Jun 11 18:16:46 2006 +0800 ignore FC_MATRIX in font pattern. With previous commit, freetype font backend is able to transform both bitmap and outline glyphs, so ignores FC_MATRIX from now, cairo doesn't need this for artificial oblique. And cairo doesn't use FC_MATRIX direct anyway, it has its own font matrix that may be not equal to FC_MATRIX in the font pattern! You should pass the matrix (usually the matrix is multiplied by font's pixel size) to cairo when creating scaled font. src/cairo-ft-font.c | 11 +---------- 1 files changed, 1 insertions(+), 10 deletions(-) commit f5bc26b75dd030ada70f87113e2d132dfcb0b0f3 Author: Jinghua Luo Date: Sun Jun 11 18:09:05 2006 +0800 freetype: rework _transform_glyph_bitmap. This function is used to shape bitmap glyphs(outline glyphs are transformed by freetype). That means freetype backend is able to tranform both bitmap & outline glyphs now. This is needed for glyph rotating, artificial oblique etc. src/cairo-ft-font.c | 58 +++++++++++++++++++++++++++++---------------------- 1 files changed, 33 insertions(+), 25 deletions(-) commit da9cd55afbb55ae70991e3f5b4c0dc5b9a58e0d6 Author: Carl Worth Date: Sat Jun 10 16:31:05 2006 -0700 ROADMAP: Note that cairo_surface_set_fallback_resolution is in place now. ROADMAP | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) commit 2f4210d346d10a2bff9a1ba74e6e9279cd4dddc3 Author: Carl Worth Date: Sat Jun 10 11:20:21 2006 -0700 Change _cairo_meta_surface_get_extents to return a bounded size. The old behavior of returning "infinite" extents is inconsistent with the current usage of meta-surface where it is always created for replay against a particular (sized) target surface and that size is passed to _cairo_meta_surface_create. Also clarify documentation of _cairo_surface_get_extents to eliminate the possibility of inifinite extents. src/cairo-meta-surface.c | 25 ++++++++++++++++--------- src/cairo-surface.c | 20 +++++++++++--------- 2 files changed, 27 insertions(+), 18 deletions(-) commit d758d5104a09019b65c1b2e93fd5ab80b0e4d056 Author: Carl Worth Date: Sat Jun 10 10:42:32 2006 -0700 Don't create a new scaled_font if there's a device_offset but no device_scale. (This is covering up my mistake from the last batch of 12 commits which wasn't ready to be pushed yet. This fixes some of the crashes which were introduced, and is a good thing to do regardless.) src/cairo-surface.c | 34 ++++++++++++++++------------------ 1 files changed, 16 insertions(+), 18 deletions(-) commit 0662928e4fd7bd432fdd815b95271d5c74eaba70 Author: Carl Worth Date: Sat Jun 10 09:44:30 2006 -0700 Clarify that fallback_resolution acts on a per-page granularity. This explains why the SVG result from the fallback-resolution test doesn't actually show multiple resolutions in effect at the same time. src/cairo-surface.c | 5 +++++ test/fallback-resolution.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 0 deletions(-) commit 13ba5316fbc4b9d2aac13da644f4c87069447246 Author: Carl Worth Date: Sat Jun 10 09:15:31 2006 -0700 Test PS and SVG backends in addition to PDF in test/fallback-resolution. test/.gitignore | 2 + test/fallback-resolution.c | 112 +++++++++++++++++++++++++++++++------------ 2 files changed, 83 insertions(+), 31 deletions(-) commit 6ca30e108f32862948fa332b31f60fa79b566d77 Author: Carl Worth Date: Sat Jun 10 09:14:47 2006 -0700 Add cairo_{ps,svg}_test_force_fallbacks so tests can force fallbacks. src/cairo-ps-surface.c | 24 ++++++++++++++++++++ src/cairo-ps-test.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-svg-surface.c | 24 ++++++++++++++++++++ src/cairo-svg-test.h | 54 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 156 insertions(+), 0 deletions(-) commit 100b30d1c09cb7fe73414c4d3466032a8c99b088 Author: Carl Worth Date: Sat Jun 10 08:35:01 2006 -0700 Fix font size when drawing text with a device_scale. The trick is to create a new scaled_font with the device_transform multiplied into the CTM within _cairo_surface_show_glyphs before calling into the backend. The fallback-resolution test shows that the font size is now correct. src/cairo-surface.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) commit 74857181c96c734d7e735cfc9862e22b01599913 Author: Carl Worth Date: Sat Jun 10 08:29:14 2006 -0700 Fix line width for stroking with a device_scale. The trick is to simply multiply the device_transform into the CTM within _cairo_surface_stroke before passing the CTM down to the backend. The fallback-resolution test shows that the stroke width is now correct. src/cairo-surface.c | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) commit ebb53b2572cc74f90d2afd03807b7d4f41a4965a Author: Carl Worth Date: Sat Jun 10 08:21:18 2006 -0700 Add text and stroke to falback-resolution test (showing bugs in each). test/fallback-resolution.c | 42 +++++++++++++++++++++++++++++++++++------- 1 files changed, 35 insertions(+), 7 deletions(-) commit 6efeb1e19b4c30d6a88bd9248a1d67b791b8df0d Author: Carl Worth Date: Sat Jun 10 08:19:41 2006 -0700 Hook up device scaling so fallback_resolution starts working. Add new, private _cairo_surface_set_device_scale for getting at the scaling components of device_transform. Use this in paginated surface when replaying to an image surface. The fallback-resolution test now clearly shows that image fallback resolution can be controlled by the user. Hurrah! src/cairo-paginated-surface.c | 11 +++++++++-- src/cairo-surface.c | 39 +++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 5 +++++ 3 files changed, 53 insertions(+), 2 deletions(-) commit b129f747c5c7edc37982f286940d3583c74cfee9 Author: Carl Worth Date: Sat Jun 10 00:12:51 2006 -0700 Change {x,y}_device_offset values to a device_transform matrix. This is a step toward allowing device scaling in addition to device offsets. So far, the scale values are still always 1.0 so only the translation is actually being used. But most of the code is in place for doing scaling as well and it just needs to be hooked up. There are some fragile parts in this code, all of which involve using the translation without the scale, (so grep for device_transform.x0 or device_transform->x0). Some of these are likely bugs that will hopefully be obvious once we start using the scale. Others are OK if only because we 'know' that we aren't ever setting device scaling on a surface that has a device offset (we only set device scaling on surfaces we create internally and we don't export device scaling to the user). All of these fragile parts in the code have been marked with comments of the form: XXX: FRAGILE. src/cairo-clip.c | 15 +++-- src/cairo-directfb-surface.c | 5 +- src/cairo-ft-font.c | 12 ++-- src/cairo-glitz-surface.c | 8 +- src/cairo-gstate.c | 13 +--- src/cairo-matrix.c | 8 +++ src/cairo-path.c | 29 ++++++++-- src/cairo-scaled-font.c | 5 +- src/cairo-surface-fallback.c | 3 +- src/cairo-surface.c | 129 ++++++++++++++++++++++------------------- src/cairo-xlib-surface.c | 8 +- src/cairo.c | 4 +- src/cairoint.h | 13 ++-- 13 files changed, 144 insertions(+), 108 deletions(-) commit 24da744d03e961078e68691225fb1363e47b2b22 Author: Carl Worth Date: Fri Jun 9 23:59:24 2006 -0700 doc: SGML template churn doc/public/tmpl/cairo-pdf.sgml | 7 +++++++ doc/public/tmpl/cairo-ps.sgml | 7 +++++++ doc/public/tmpl/cairo-status.sgml | 7 ------- doc/public/tmpl/cairo-svg.sgml | 7 +++++++ 4 files changed, 21 insertions(+), 7 deletions(-) commit 999315cc0ad326d31c66f2e6fa1ae72dfb9bb57e Author: Carl Worth Date: Fri Jun 9 21:12:44 2006 -0700 Rename device_{x,y}_offset to {x,y}_device_offset for better consitency/grepability src/cairo-clip.c | 4 +- src/cairo-directfb-surface.c | 4 +- src/cairo-ft-font.c | 8 +++--- src/cairo-glitz-surface.c | 8 +++--- src/cairo-gstate.c | 8 +++--- src/cairo-scaled-font.c | 4 +- src/cairo-surface-fallback.c | 4 +- src/cairo-surface.c | 56 +++++++++++++++++++++--------------------- src/cairo-xlib-surface.c | 8 +++--- src/cairo.c | 4 +- src/cairoint.h | 4 +- 11 files changed, 56 insertions(+), 56 deletions(-) commit 6f6bdb6663fc439387db6b410bf742de6b501015 Author: Carl Worth Date: Fri Jun 9 16:54:09 2006 -0700 Add REPLACED_BY macros to help porting to new set_fallback_resolution src/cairo.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit b2f274b3e86983b312ec19e33b3a1231bd3e51d0 Author: Carl Worth Date: Fri Jun 9 16:52:17 2006 -0700 New API: Replace cairo_{ps,pdf,svg}_set_dpi with new cairo_surface_set_fallback_resolution. This just provides the mechanics for storing the value and removing the old function calls. The new value is still not used anywhere (though nor where the old values), so there should be no functional change (other than forcing any programs calling the old API to be updated). src/cairo-pdf-surface.c | 35 ----------------------------------- src/cairo-pdf.h | 5 ----- src/cairo-ps-surface.c | 35 ----------------------------------- src/cairo-ps.h | 5 ----- src/cairo-surface.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-svg-surface.c | 38 -------------------------------------- src/cairo-svg.h | 5 ----- src/cairo.h | 5 +++++ src/cairoint.h | 5 +++++ test/cairo-test.c | 6 +++--- test/fallback-resolution.c | 2 +- 11 files changed, 58 insertions(+), 127 deletions(-) commit a812b3c4908ff296877a648915d5f06696eebe9e Author: Carl Worth Date: Fri Jun 9 15:37:50 2006 -0700 Ignore ft-text-vertical-layout binary test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit ac20c80960ccf233f9582da88f0d7aa4a181099e Author: Jinghua Luo Date: Fri Jun 9 07:06:51 2006 +0800 freetype: Ignore global advance unconditionally. Global advance exists for historical reasons. Nowadays, most of fonts support unicode, means it's no guaranteed to every glyphs in the font has the same advance.Sometimes it maybe is biger/smaller then the global advance even for monospace fonts!So forcing their advance to global advance, it's obviously wrong. src/cairo-ft-font.c | 3 +++ src/cairo-xlib-surface.c | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) commit d3c782320a76d8e79099e5c5dc03c7dd819573d7 Author: Carl Worth Date: Wed Jun 7 17:38:09 2006 -0700 Rename ft-text-vertical-layout reference image according to standard convention. The standard convention is that the ARGB32 reference image has no -argb32- component in its name (no real important reason, just historical). So let's be consist and rename: test/ft-text-vertical-layout-argb32-ref.png -> test/ft-text-vertical-layout-ref.png test/ft-text-vertical-layout-argb32-ref.png | Bin 1145 -> 0 bytes test/ft-text-vertical-layout-ref.png | Bin 0 -> 1145 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit b7b3d05d78f22b6b45c6a54f2647dbdaeb034d37 Author: Carl Worth Date: Wed Jun 7 13:51:58 2006 -0700 Fix bug in get-group-target (in the test itself) letting it now pass. test/get-group-target.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) commit 45ca22e5e1a177a4dc9854cd310e5c683df058cb Author: Jinghua Luo Date: Thu Jun 8 04:06:30 2006 +0800 Make image-*-ref.png image as reference image. test/ft-text-vertical-layout-argb32-ref.png | Bin 0 -> 1145 bytes test/ft-text-vertical-layout-image-argb32-ref.png | Bin 1145 -> 0 bytes test/ft-text-vertical-layout-image-rgb24-ref.png | Bin 1059 -> 0 bytes test/ft-text-vertical-layout-rgb24-ref.png | Bin 0 -> 1059 bytes 4 files changed, 0 insertions(+), 0 deletions(-) commit 5ae2a78a297730cd9d2f45be9f23fbf6e2bffe7d Author: Jinghua Luo Date: Thu Jun 8 03:45:38 2006 +0800 freetype: Fix for test case ft-text-vertial-layout. Fix scaled font metrics and glyph metrics calculation for vertical layout. Test case ft-text-vertial-layout passes now. src/cairo-ft-font.c | 130 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 97 insertions(+), 33 deletions(-) commit 6b5be506ed160675232bea31b17f458040f6b2d8 Author: Jinghua Luo Date: Thu Jun 8 03:33:38 2006 +0800 Add ft-text-vertical-layout test case for vertical layout. test/Makefile.am | 1 + test/ft-text-vertical-layout-image-argb32-ref.png | Bin 0 -> 1145 bytes test/ft-text-vertical-layout-image-rgb24-ref.png | Bin 0 -> 1059 bytes test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 0 -> 1018 bytes test/ft-text-vertical-layout-pdf-rgb24-ref.png | Bin 0 -> 1037 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 0 -> 351 bytes test/ft-text-vertical-layout-ps-rgb24-ref.png | Bin 0 -> 1086 bytes test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 0 -> 1106 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 0 -> 1106 bytes test/ft-text-vertical-layout.c | 131 +++++++++++++++++++++ 10 files changed, 132 insertions(+), 0 deletions(-) commit bb66d15a7998740b6ce2525ab5d852fb2966f8f8 Merge: 3594fd2... b7c7d2e... Author: Jinghua Luo Date: Thu Jun 8 02:38:17 2006 +0800 Merge branch 'master' of git+ssh://jinghua@git.cairographics.org/git/cairo commit 3594fd2d273398b10748c8ed03c7a9da7af377fa Author: Jinghua Luo Date: Thu Jun 8 02:35:42 2006 +0800 glitz: Don't hardcode content type when initializing cairo surface since we can compute it from glitz format. src/cairo-glitz-surface.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) commit b7c7d2e57c2721c3a900694d5620b3f45f495233 Author: Carl Worth Date: Wed Jun 7 10:37:29 2006 -0700 Add new test get-group-target (currently failing with paginated). This test exercises the combination of cairo_get_group_target along with cairo_surface_get_device_offset. Something funny is currently going on with the surfaces based on the paginated surface. test/.gitignore | 1 + test/Makefile.am | 2 + test/get-group-target-ref.png | Bin 0 -> 134 bytes test/get-group-target.c | 80 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 0 deletions(-) commit 53bf2f8d5dd82e9cff0960ebec536597bc7701e9 Author: Carl Worth Date: Wed Jun 7 10:29:33 2006 -0700 Remove debugging "prints" of images from test/device-offset.c test/device-offset.c | 8 +------- 1 files changed, 1 insertions(+), 7 deletions(-) commit 32c0e85d45ee26c34ba1af0e4ba6ced044e469cc Author: Zakharov Mikhail Date: Wed Jun 7 18:32:16 2006 +0400 pixman: fix compilation on HP-UX 11.11 pixman/src/pixman.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3690eeb44cd86ac02eb21163d9a5e84784f6417d Author: Carl Worth Date: Wed Jun 7 02:59:51 2006 -0700 Change all instances of UINT16_MAX to INT16_MAX to avoid new bug. A recent renaming from CAIRO_MAXSHORT also changed the range of some values from INT16_MAX to UINT16_MAX. The test suite shows one case where this introduces a bug, (push/pop_group with SVG and RGB24 surfaces). I haven't tracked the bug down, (presumably there's overflow of the unsigned value at some point), but I'm now reverting this to avoid triggering the bug. src/cairo-meta-surface.c | 4 ++-- src/cairo-pattern.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 7f2cf378d595fa559401c76f051ca9b5e6809763 Author: Carl Worth Date: Wed Jun 7 01:17:53 2006 -0700 Fix MAX vs. MIN bug introduced with rename away from CAIRO_MINSHORT src/cairo-traps.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bf458c9c67120a2d175f18447dd710060f0ba014 Author: Carl Worth Date: Tue Jun 6 17:06:57 2006 -0700 win32: Add conditional definitions for INT16_{MIN,MAX} and UINT16_MAX now that we use them. src/cairo-wideint.h | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit c1855f17624c62e1f7451b3c673bca23a4575ff7 Author: Carl Worth Date: Tue Jun 6 16:59:59 2006 -0700 Remove CAIRO_{MIN,MAX}SHORT which did not distinguish signed vs. unsigned. Instead, use the standard INT16_{MIN,MAX} and UINT16_{MIN,MAX} as appropriate. src/cairo-meta-surface.c | 4 ++-- src/cairo-pattern.c | 8 ++++---- src/cairo-scaled-font.c | 4 ++-- src/cairo-traps.c | 4 ++-- src/cairoint.h | 3 --- 5 files changed, 10 insertions(+), 13 deletions(-) commit 746f66c3fce6de39ac9afa7be8bcf8f74c750e85 Author: Carl Worth Date: Tue Jun 6 16:54:03 2006 -0700 Fix bogus cairo_rectangle_fixed_t to be cairo_rectangle_int16_t. This rectangle has regular integer values, not fixed-point values. So the old name was horribly wrong and misleading, (and yes I think it was even I that had suggested it). src/cairo-analysis-surface.c | 2 +- src/cairo-atsui-font.c | 2 +- src/cairo-clip-private.h | 6 ++-- src/cairo-clip.c | 6 ++-- src/cairo-directfb-surface.c | 16 ++++++------ src/cairo-glitz-surface.c | 16 ++++++------ src/cairo-image-surface.c | 12 ++++---- src/cairo-meta-surface.c | 2 +- src/cairo-paginated-surface.c | 6 ++-- src/cairo-pattern.c | 4 +- src/cairo-pdf-surface.c | 4 +- src/cairo-ps-surface.c | 4 +- src/cairo-quartz-private.h | 2 +- src/cairo-quartz-surface.c | 10 ++++---- src/cairo-rectangle.c | 10 ++++---- src/cairo-region.c | 8 +++--- src/cairo-scaled-font.c | 2 +- src/cairo-surface-fallback-private.h | 2 +- src/cairo-surface-fallback.c | 42 ++++++++++++++++---------------- src/cairo-surface.c | 36 ++++++++++++++-------------- src/cairo-svg-surface.c | 2 +- src/cairo-win32-private.h | 4 +- src/cairo-win32-surface.c | 12 ++++---- src/cairo-xcb-surface.c | 18 +++++++------- src/cairo-xlib-surface.c | 20 +++++++------- src/cairo.c | 2 +- src/cairoint.h | 44 +++++++++++++++++----------------- src/test-fallback-surface.c | 10 ++++---- src/test-meta-surface.c | 4 +- src/test-paginated-surface.c | 2 +- 30 files changed, 155 insertions(+), 155 deletions(-) commit 5570bf0a9e99019ac24b2b856455afcf360c14fc Author: Carl Worth Date: Tue Jun 6 16:36:24 2006 -0700 CODING_STYLE: Fix misspellings. CODING_STYLE | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit a21a2e935d3a75b045ce5f7e917524052f018758 Author: Carl Worth Date: Tue Jun 6 16:28:15 2006 -0700 CODING_STYLE: Add notes on avoiding trailing whitespace. CODING_STYLE | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) commit ef10a0403a8a466199615e34a34df9ea860ef9c0 Author: Carl Worth Date: Tue Jun 6 15:50:33 2006 -0700 Remove initial, final, and duplicate blank lines. This patch was produced by running git-stripspace on all *.[ch] files within cairo. Note that this script would have also created all the changes from the previous commits to remove trailing whitespace. doc/tutorial/src/include/cairo-tutorial.h | 1 - pixman/src/fbcompose.c | 15 --------------- pixman/src/fbedge.c | 1 - pixman/src/fbmmx.c | 7 ------- pixman/src/fbpict.c | 4 ---- pixman/src/fbpict.h | 1 - pixman/src/icbltone.c | 1 - pixman/src/icimage.c | 1 - pixman/src/icimage.h | 1 - pixman/src/icint.h | 11 ----------- pixman/src/icpixels.c | 1 - pixman/src/icrect.c | 2 -- pixman/src/ictransform.c | 1 - pixman/src/ictri.c | 1 - pixman/src/icutil.c | 1 - pixman/src/pixman-xserver-compat.h | 1 - pixman/src/pixman.h | 10 ---------- pixman/src/pixregion.c | 12 ------------ pixman/src/pixregionint.h | 1 - pixman/src/renderedge.c | 1 - src/cairo-analysis-surface.c | 2 -- src/cairo-array.c | 1 - src/cairo-atsui-font.c | 6 ------ src/cairo-base85-stream.c | 1 - src/cairo-beos.h | 1 - src/cairo-cache.c | 2 -- src/cairo-clip.c | 2 -- src/cairo-debug.c | 1 - src/cairo-directfb-surface.c | 11 ----------- src/cairo-directfb.h | 9 --------- src/cairo-font-subset-private.h | 1 - src/cairo-font-subset.c | 2 -- src/cairo-ft-font.c | 1 - src/cairo-glitz-surface.c | 1 - src/cairo-matrix.c | 3 --- src/cairo-output-stream.c | 2 -- src/cairo-path-fill.c | 1 - src/cairo-path.c | 1 - src/cairo-pdf-surface.c | 2 -- src/cairo-pdf-test.h | 1 - src/cairo-png.c | 1 - src/cairo-ps-surface.c | 1 - src/cairo-quartz-surface.c | 1 - src/cairo-quartz.h | 1 - src/cairo-region.c | 1 - src/cairo-scaled-font-subsets.c | 1 - src/cairo-scaled-font.c | 1 - src/cairo-slope.c | 4 ---- src/cairo-spline.c | 1 - src/cairo-stroke-style.c | 1 - src/cairo-svg-surface.c | 1 - src/cairo-traps.c | 1 - src/cairo-unicode.c | 3 --- src/cairo-win32-font.c | 3 --- src/cairo-win32-surface.c | 2 -- src/cairo-xcb-surface.c | 1 - src/cairo-xlib-surface.c | 3 --- src/cairo-xlib-test.h | 1 - src/cairo-xlib-xrender.h | 1 - src/cairo-xlib.h | 1 - src/cairo.c | 3 --- src/cairo.h | 3 --- src/cairoint.h | 4 ---- test/buffer-diff.c | 1 - test/buffer-diff.h | 2 -- test/cairo-test-directfb.c | 4 ---- test/cairo-test.c | 2 -- test/font-face-get-type.c | 4 ---- test/push-group.c | 2 -- test/read-png.c | 1 - test/surface-finish-twice.c | 1 - test/text-cache-crash.c | 1 - test/xmalloc.c | 1 - 73 files changed, 0 insertions(+), 184 deletions(-) commit 5278de09973c3e41028dc80a8862db01fc70cf11 Author: Carl Worth Date: Tue Jun 6 15:41:31 2006 -0700 Remove all remaining trailing whitespace. This patch was produced with the following (GNU) sed script: sed -i -r -e 's/[ \t]+$//' run on all *.[ch] files within cairo. Note that the above script would have also created all the changes from the previous commits to remove trailing whitespace. doc/tutorial/src/include/cairo-tutorial-gtk.h | 6 +- doc/tutorial/src/include/cairo-tutorial-pdf.h | 2 +- doc/tutorial/src/include/cairo-tutorial-png.h | 2 +- pixman/src/fbcompose.c | 2 +- pixman/src/fbmmx.c | 8 +- pixman/src/fbpict.c | 10 +- pixman/src/icblt.c | 42 ++++---- pixman/src/icbltone.c | 8 +- pixman/src/icformat.c | 4 +- pixman/src/icimage.c | 6 +- pixman/src/icimage.h | 2 +- pixman/src/icint.h | 8 +- pixman/src/icrect.c | 16 ++-- pixman/src/ictransform.c | 2 +- pixman/src/ictrap.c | 4 +- pixman/src/ictri.c | 4 +- pixman/src/pixman-xserver-compat.h | 2 +- pixman/src/pixman.h | 8 +- pixman/src/pixregion.c | 22 ++-- pixman/src/pixregionint.h | 8 +- pixman/src/slim_internal.h | 2 +- src/cairo-atsui-font.c | 18 ++-- src/cairo-clip.c | 4 +- src/cairo-directfb-surface.c | 60 ++++++------ src/cairo-directfb.h | 4 +- src/cairo-font-options.c | 4 +- src/cairo-font-subset.c | 4 +- src/cairo-font.c | 8 +- src/cairo-ft-font.c | 34 ++++---- src/cairo-gstate.c | 32 +++--- src/cairo-hash.c | 6 +- src/cairo-matrix.c | 28 +++--- src/cairo-meta-surface.c | 4 +- src/cairo-path.c | 2 +- src/cairo-pattern.c | 4 +- src/cairo-pen.c | 6 +- src/cairo-polygon.c | 2 +- src/cairo-ps-surface.c | 8 +- src/cairo-quartz-surface.c | 6 +- src/cairo-scaled-font-subsets.c | 2 +- src/cairo-scaled-font.c | 34 ++++---- src/cairo-slope.c | 2 +- src/cairo-surface-fallback.c | 12 +- src/cairo-surface.c | 8 +- src/cairo-svg-surface.c | 126 ++++++++++++------------ src/cairo-traps.c | 2 +- src/cairo-unicode.c | 2 +- src/cairo-wideint.c | 2 +- src/cairo-win32-font.c | 30 +++--- src/cairo-win32-surface.c | 12 +- src/cairo-xcb-surface.c | 4 +- src/cairo-xlib-surface.c | 32 +++--- src/cairo.c | 18 ++-- src/cairo.h | 14 ++-- src/cairoint.h | 56 ++++++------ test/cairo-test-directfb.c | 16 ++-- test/cairo-test.c | 28 +++--- test/cairo-test.h | 2 +- test/imagediff.c | 2 +- test/write-png.c | 2 +- 60 files changed, 404 insertions(+), 404 deletions(-) commit 00592e075754594605fddfb2a702f3d2caa7c55c Author: Carl Worth Date: Tue Jun 6 15:38:58 2006 -0700 Remove trailing whitespace from lines with a single brace. This patch was produced with the following (GNU) sed script: sed -i -r -e '/^[ \t]*[{}][ \t]*/ s/[ \t]+$//' run on all *.[ch] files within cairo. pixman/src/fbmmx.c | 6 +++--- pixman/src/icimage.c | 4 ++-- src/cairo-atsui-font.c | 2 +- src/cairo-clip.c | 2 +- src/cairo-directfb-surface.c | 4 ++-- src/cairo-font-options.c | 2 +- src/cairo-font-subset.c | 2 +- src/cairo-font.c | 2 +- src/cairo-ft-font.c | 2 +- src/cairo-hash.c | 4 ++-- src/cairo-image-surface.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-png.c | 2 +- src/cairo-rectangle.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-svg-surface.c | 4 ++-- src/cairo-win32-surface.c | 4 ++-- test/clip-operator.c | 2 +- test/operator-clear.c | 4 ++-- test/operator-source.c | 4 ++-- test/unbounded-operator.c | 4 ++-- 21 files changed, 31 insertions(+), 31 deletions(-) commit 4670366ede0b0ed1abf47f4595a64bc5cd3c19fc Author: Carl Worth Date: Tue Jun 6 15:35:48 2006 -0700 Remove trailing whitespace from lines that look like comments. This patch was produced with the following (GNU) sed script: sed -i -r -e '/^[ \t]*\/?\*/ s/[ \t]+$//' run on all *.[ch] files within cairo, (though I manually excluded src/cairo-atsui-font.c which has a code line that appears as a comment to this script). doc/tutorial/src/include/cairo-tutorial-xlib.h | 2 +- pixman/src/fbmmx.c | 8 +- pixman/src/fbmmx.h | 2 +- pixman/src/icbltone.c | 10 +- pixman/src/iccolor.c | 2 +- pixman/src/icformat.c | 2 +- pixman/src/icimage.c | 4 +- pixman/src/icint.h | 8 +- pixman/src/icrop.h | 2 +- pixman/src/ictransform.c | 2 +- pixman/src/pixregion.c | 12 +- pixman/src/slim_internal.h | 2 +- src/cairo-arc.c | 4 +- src/cairo-array.c | 32 +++--- src/cairo-base85-stream.c | 2 +- src/cairo-cache.c | 30 ++-- src/cairo-clip-private.h | 2 +- src/cairo-debug.c | 2 +- src/cairo-font-options.c | 46 ++++---- src/cairo-font.c | 22 ++-- src/cairo-ft-font.c | 22 ++-- src/cairo-gstate.c | 14 +- src/cairo-hash.c | 30 ++-- src/cairo-hull.c | 2 +- src/cairo-image-surface.c | 30 ++-- src/cairo-matrix.c | 28 ++-- src/cairo-meta-surface.c | 6 +- src/cairo-output-stream.c | 2 +- src/cairo-path-data.c | 14 +- src/cairo-path-stroke.c | 6 +- src/cairo-pattern.c | 60 +++++----- src/cairo-pdf-surface.c | 2 +- src/cairo-pen.c | 2 +- src/cairo-png.c | 20 ++-- src/cairo-ps-surface.c | 16 +- src/cairo-region.c | 6 +- src/cairo-scaled-font-subsets-private.h | 12 +- src/cairo-scaled-font.c | 38 +++--- src/cairo-surface-fallback.c | 6 +- src/cairo-surface.c | 68 +++++----- src/cairo-svg-surface.c | 18 ++-- src/cairo-svg.h | 2 +- src/cairo-traps.c | 8 +- src/cairo-unicode.c | 10 +- src/cairo-win32-font.c | 14 +- src/cairo-win32-surface.c | 16 +- src/cairo-xcb-surface.c | 20 ++-- src/cairo-xlib-surface.c | 24 ++-- src/cairo.c | 166 ++++++++++++------------ src/cairo.h | 6 +- src/cairoint.h | 8 +- test/buffer-diff.c | 2 +- test/buffer-diff.h | 2 +- test/cairo-test.c | 4 +- test/cairo-test.h | 2 +- test/imagediff.c | 2 +- test/rectangle-rounding-error.c | 8 +- 57 files changed, 446 insertions(+), 446 deletions(-) commit 80b8deb1e4f9d0b856106031c6a7a629cca7552c Author: Carl Worth Date: Tue Jun 6 15:25:49 2006 -0700 Remove extraneous whitespace from "blank" lines. This patch was produced with the following (GNU) sed script: sed -i -r -e 's/^[ \t]+$//' run on all *.[ch] files within cairo. doc/tutorial/src/include/cairo-tutorial-gtk.h | 2 +- doc/tutorial/src/include/cairo-tutorial-pdf.h | 2 +- doc/tutorial/src/include/cairo-tutorial-png.h | 2 +- doc/tutorial/src/lca.c | 6 +- pixman/src/fbcompose.c | 6 +- pixman/src/fbedge.c | 4 +- pixman/src/fbedgeimp.h | 8 +- pixman/src/fbmmx.c | 530 ++++++++++++------------ pixman/src/fbpict.c | 8 +- pixman/src/fbpict.h | 2 +- pixman/src/fbtrap.c | 24 +- pixman/src/icblt.c | 54 ++-- pixman/src/icbltone.c | 38 +- pixman/src/icformat.c | 24 +- pixman/src/icimage.c | 18 +- pixman/src/icimage.h | 6 +- pixman/src/icint.h | 26 +- pixman/src/icrect.c | 12 +- pixman/src/icrop.h | 4 +- pixman/src/icstipple.c | 6 +- pixman/src/ictrap.c | 8 +- pixman/src/ictri.c | 26 +- pixman/src/icutil.c | 2 +- pixman/src/pixregion.c | 32 +- pixman/src/renderedge.c | 12 +- src/cairo-analysis-surface.c | 2 +- src/cairo-arc.c | 2 +- src/cairo-atsui-font.c | 24 +- src/cairo-base85-stream.c | 2 +- src/cairo-clip.c | 26 +- src/cairo-directfb-surface.c | 6 +- src/cairo-font-options.c | 8 +- src/cairo-font-subset.c | 6 +- src/cairo-font.c | 10 +- src/cairo-ft-font.c | 196 +++++----- src/cairo-gstate-private.h | 2 +- src/cairo-gstate.c | 80 ++-- src/cairo-hash.c | 14 +- src/cairo-image-surface.c | 28 +- src/cairo-lzw.c | 2 +- src/cairo-matrix.c | 84 ++-- src/cairo-meta-surface.c | 10 +- src/cairo-operator.c | 8 +- src/cairo-output-stream.c | 14 +- src/cairo-paginated-surface.c | 8 +- src/cairo-path-bounds.c | 8 +- src/cairo-path-fill.c | 2 +- src/cairo-path-stroke.c | 16 +- src/cairo-pattern.c | 44 +- src/cairo-pen.c | 10 +- src/cairo-png.c | 12 +- src/cairo-ps-surface.c | 36 +- src/cairo-quartz-surface.c | 16 +- src/cairo-region.c | 2 +- src/cairo-scaled-font-subsets.c | 2 +- src/cairo-scaled-font.c | 90 ++-- src/cairo-spline.c | 2 +- src/cairo-surface-fallback.c | 82 ++-- src/cairo-surface.c | 44 +- src/cairo-svg-surface.c | 100 +++--- src/cairo-traps.c | 38 +- src/cairo-unicode.c | 30 +- src/cairo-wideint.c | 16 +- src/cairo-wideint.h | 2 +- src/cairo-win32-font.c | 106 +++--- src/cairo-win32-private.h | 6 +- src/cairo-win32-surface.c | 96 +++--- src/cairo-xcb-surface.c | 36 +- src/cairo-xlib-private.h | 4 +- src/cairo-xlib-screen.c | 32 +- src/cairo-xlib-surface.c | 154 ++++---- src/cairo.c | 18 +- src/cairo.h | 8 +- src/cairoint.h | 34 +- src/test-fallback-surface.c | 4 +- src/test-meta-surface.c | 2 +- test/cairo-test.c | 24 +- test/caps-joins.c | 2 +- test/clip-all.c | 2 +- test/clip-nesting.c | 4 +- test/clip-operator.c | 12 +- test/dash-offset-negative.c | 8 +- test/fill-and-stroke.c | 2 +- test/filter-nearest-offset.c | 2 +- test/font-face-get-type.c | 2 +- test/get-and-set.c | 2 +- test/gradient-alpha.c | 2 +- test/linear-gradient.c | 8 +- test/mask.c | 8 +- test/operator-clear.c | 12 +- test/operator-source.c | 14 +- test/ps-features.c | 2 +- test/rectangle-rounding-error.c | 2 +- test/rel-path.c | 4 +- test/self-copy.c | 6 +- test/source-clip.c | 2 +- test/surface-pattern.c | 2 +- test/svg-clip.c | 2 +- test/text-pattern.c | 10 +- test/text-rotate.c | 2 +- test/transforms.c | 2 +- test/trap-clip.c | 4 +- test/unbounded-operator.c | 12 +- test/user-data.c | 2 +- test/write-png.c | 2 +- test/xlib-surface.c | 18 +- 106 files changed, 1311 insertions(+), 1311 deletions(-) commit 28d47d332aafa81bcbc669603357298cb0a14322 Author: Carl Worth Date: Mon Jun 5 14:25:13 2006 -0700 Move rectangle functions to new cairo-rectangle.c src/Makefile.am | 1 + src/cairo-gstate.c | 46 -------------------------- src/cairo-rectangle.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 46 deletions(-) commit 3d9dc96d186c9093da24c7bbf36614f3d8df1758 Author: Carl Worth Date: Thu May 25 02:28:09 2006 -0700 New API: Add cairo_image_surface_get_{data,format,stride} src/cairo-image-surface.c | 69 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 9 ++++++ 2 files changed, 78 insertions(+), 0 deletions(-) commit 0c49666231e42a3f968ad46a0aa58fc7b854b258 Author: Jeff Muizelaar Date: Sat May 27 02:23:09 2006 -0400 Only destroy scaled glyphs if they are not in the cache. Previously, when scaled_glyph_init failed we would destroy the scaled glyph in CLEANUP. However, this causes trouble later because there is still a reference to the glyph in the cache. This remaining reference causes a number of bad things, including a double destruction when the cache is destroyed. src/cairo-scaled-font.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit bafdded8ee43632e5f60307e53f0489be0afc3c4 Author: Kristian Høgsberg Date: Sun May 28 13:25:57 2006 -0400 Remove cairo_public from _cairo_lzw_compress() definition. src/cairo-lzw.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 84c6f879631b3d3ca63c3fd99b9cb68b111d283f Author: Kristian Høgsberg Date: Sun May 28 13:38:50 2006 -0400 Clarify licensing of float formatting code. src/cairo-output-stream.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 79c86b04a7848830998e1a5344c6a9ecf9113789 Author: Christian Biesinger Date: Sun May 28 16:50:54 2006 +0200 Add "html" Makefile target to run make-html.pl test/Makefile.am | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 508d0955fb3a851919233f27b5fe9408c85fa053 Author: Christian Biesinger Date: Thu May 25 21:54:54 2006 +0200 Distribute make-html.pl test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit f072d4ed66f78bd4fba4fb44e30f3ddd3f10fc33 Author: Christian Biesinger Date: Thu May 25 21:21:31 2006 +0200 Add missing reference images to EXTRA_DIST test/Makefile.am | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 0b63baba6e8c3f2f6da52d4476ec595ff87dfc93 Author: Christian Biesinger Date: Thu May 25 17:29:01 2006 +0200 Make BeOS compile again ..by passing the cairo_content_t to _cairo_surface_init src/cairo-beos-surface.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 22232be7592dadc22fef614aefee9c9398a8510c Author: Carl Worth Date: Wed May 24 17:24:52 2006 -0700 Note the changed semantics of cairo_surface_set_device_offset Specifically, device offsets now affect using the offset surface in a source pattern as well as drawing to the surface. This behavior os also verified with a new test case: test/device-offset.c src/cairo-surface.c | 4 +- test/.gitignore | 1 + test/Makefile.am | 1 + test/device-offset-ref.png | Bin 0 -> 137 bytes test/device-offset-rgb24-ref.png | Bin 0 -> 130 bytes test/device-offset.c | 93 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 97 insertions(+), 2 deletions(-) commit d0dd3b822e98358e88f8c9261ef633331548ccfd Author: Carl Worth Date: Wed May 24 17:05:51 2006 -0700 New API: Add new function cairo_surface_get_content This assumes that the directfb, glitz, and quartz backends always create surfaces with content of COLOR_ALPHA which might be totally wrong. src/cairo-analysis-surface.c | 5 ++- src/cairo-directfb-surface.c | 4 +- src/cairo-glitz-surface.c | 4 +- src/cairo-image-surface.c | 3 +- src/cairo-meta-surface.c | 6 ++- src/cairo-paginated-surface.c | 3 +- src/cairo-pdf-surface.c | 3 +- src/cairo-ps-surface.c | 3 +- src/cairo-quartz-surface.c | 4 +- src/cairo-surface.c | 22 +++++++++- src/cairo-svg-surface.c | 3 +- src/cairo-win32-surface.c | 6 ++- src/cairo-xcb-surface.c | 29 ++++++++++++- src/cairo-xlib-surface.c | 93 ++++++++++++++++++++++------------------ src/cairo.h | 3 + src/cairoint.h | 5 ++- src/test-fallback-surface.c | 3 +- src/test-meta-surface.c | 3 +- src/test-paginated-surface.c | 3 +- test/cairo-test.c | 18 ++++++++ 20 files changed, 162 insertions(+), 61 deletions(-) commit 0796845ae6923f3ccef5df231b7d9a2c145063fd Author: Carl Worth Date: Wed May 24 14:03:49 2006 -0700 Add new fallback-resolution test for bug in cairo_pdf_surface_set_dpi test/.gitignore | 2 + test/Makefile.am | 1 + test/fallback-resolution.c | 84 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 87 insertions(+), 0 deletions(-) commit 11b2481862e15a2cdedae347eab4347f7b63f715 Author: Carl Worth Date: Wed May 24 14:02:30 2006 -0700 PDF: Add new, private test function: cairo_pdf_test_force_fallbacks doc/public/Makefile.am | 1 + src/Makefile.am | 2 +- src/cairo-pdf-surface.c | 26 +++++++++++++++++++++- src/cairo-pdf-test.h | 55 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) commit 65b9217cadcd09f1ed18aa0da38d0b72b6438780 Author: Carl Worth Date: Wed May 24 11:37:05 2006 -0700 cairo-xlib-test: Rename cairo_test_xlib function prefix to cairo_xlib_test src/cairo-xlib-surface.c | 4 ++-- src/cairo-xlib-test.h | 2 +- test/xlib-surface.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) commit 5acce60291fe0b61a67ff1e803b6226db576c233 Author: Carl Worth Date: Wed May 24 10:35:24 2006 -0700 Typo fixes test/pdf-features.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit a5a72676bd34ac6bfdf5e0bcfd3fb21fcbada673 Author: Carl Worth Date: Tue May 23 13:41:44 2006 -0700 ROADMAP: Note that the cairo_set_line_width issue is resolved ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e4476dda49b709875b8204567168752c15927480 Author: Carl Worth Date: Tue May 23 13:41:00 2006 -0700 PDF: Move dash operator before path construction operators. I don't recall anything about this in the PDF reference, (though I also didn't look specifically for it), but without this acroread is quite unhappy with cairo's PDF output when it includes dashing. src/cairo-pdf-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 59885c6a122f593b417cb47dbd676eeac0cd8f69 Author: Carl Worth Date: Tue May 23 12:08:20 2006 -0700 Clarify the documentation for cairo_set_dash Note that dash length units are evaluated in the user space at the time of the stroke operation, (not the user space at the time of cairo_set_dash). src/cairo.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) commit 68b41cfd06dd6c798f8045ba1580342669ef5539 Author: Carl Worth Date: Tue May 23 11:23:27 2006 -0700 PDF: Share path callbacks for fill and stroke. src/cairo-pdf-surface.c | 112 +++++++++++++++-------------------------------- 1 files changed, 36 insertions(+), 76 deletions(-) commit 7e5bef2439be93e46583c0922f68ad770179fa1e Author: Carl Worth Date: Tue May 23 11:17:01 2006 -0700 PDF: Rename pdf_stroke_t to pdf_path_into_t for future sharing with fill src/cairo-pdf-surface.c | 38 +++++++++++++++++++------------------- 1 files changed, 19 insertions(+), 19 deletions(-) commit 1b1b59a4a9cdeab0f3c360c09721aff23154015f Author: Carl Worth Date: Tue May 23 11:12:09 2006 -0700 New test: dash-scale Tests interactions of cairo_set_dash and cairo_scale, (in particular with a non-uniformly scaled pen). test/.gitignore | 1 + test/Makefile.am | 2 + test/dash-scale-ps-argb32-ref.png | Bin 0 -> 2950 bytes test/dash-scale-ref.png | Bin 0 -> 7791 bytes test/dash-scale.c | 125 +++++++++++++++++++++++++++++++++++++ 5 files changed, 128 insertions(+), 0 deletions(-) commit 0755a619a101b89f5c5439f12e0544ab5ecac997 Author: Carl Worth Date: Tue May 23 10:54:54 2006 -0700 SVG: Fix for line-width-scale Use the same approach as the PDF backend: emit the pen matrix as the SVG transform for the stroke, and compensate by first transforming all path coordinates by the ctm_inverse. src/cairo-svg-surface.c | 63 ++++++++++++++++++++++++++++++---------------- 1 files changed, 41 insertions(+), 22 deletions(-) commit b1231e2ef349af1c0b130880603a924ff67b2967 Author: Carl Worth Date: Tue May 23 10:45:18 2006 -0700 Codify 1.0 behavior of cairo_set_line_width as a feature, not a bug. Clarify the documentation of cairo_set_line_width to indicate that the value will be interpreted within the user space at the time of the stroke. Also adjust the comments in test/line-width-scale as well as the reference images for that test to match. src/cairo.c | 25 +++++++++++++++++++------ test/line-width-scale-ps-argb32-ref.png | Bin 1470 -> 1599 bytes test/line-width-scale-ref.png | Bin 4884 -> 6445 bytes test/line-width-scale.c | 28 +++++++++++++++------------- 4 files changed, 34 insertions(+), 19 deletions(-) commit 0a1ec91977ef05f04e2cc52895fd98a903f1c8eb Author: Carl Worth Date: Mon May 22 09:22:42 2006 -0700 Move prototype of cairo_debug_reset_static_data from uninstalled cairo-debug.h to cairo.h src/Makefile.am | 4 +--- src/cairo-debug.h | 48 ------------------------------------------------ src/cairo.h | 4 ++++ src/cairoint.h | 1 - test/cairo-test.h | 1 - 5 files changed, 5 insertions(+), 53 deletions(-) commit 27e9e3cecd354475047ac268d5ef52eba3f041f1 Author: Kristian Høgsberg Date: Fri May 19 02:17:35 2006 -0400 Handle seac charstring commands correctly. - Include PS standard encoding table so we can map from standard encoding indices to glyph names and then make sure to include the glyph of that name. - Cut out verbose debugging code. - Fix a couple of bugs in glyph name to index lookup code. src/cairo-type1-subset.c | 218 +++++++++++++++++++--------------------------- 1 files changed, 90 insertions(+), 128 deletions(-) commit 89384ae12474c257fb47e4231229235207ab8f85 Author: Carl Worth Date: Thu May 18 21:48:38 2006 -0700 PDF: Squelch a couple of bogus "may be used uninitialized" warnings. src/cairo-pdf-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit e2713057f80c412a3ba947f9c7af2f18dd26105e Author: Vladimir Vukicevic Date: Wed Mar 15 14:10:59 2006 -0800 Define kCGBitmapByteOrder32Host for when the SDK doesn't define it (cherry picked from bd9b5d29e39f424e912184dcd0dc2610637d5fdf commit) src/cairo-atsui-font.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 5bdcfd14136d02ccaec275b2bcd5fb2744352f87 Author: Vladimir Vukicevic Date: Thu Mar 16 14:14:35 2006 -0800 Whitespace fix (cherry picked from 0bb567a2f1807d83508e2d7598a8bd8f4d94208d commit) src/cairo-win32-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit e8069da97bc5c09d9bac91cf401d9e3c3ba91607 Author: Vladimir Vukicevic Date: Thu Mar 16 17:00:37 2006 -0800 CAIRO_SCALED_FONT_TYPE_* -> CAIRO_FONT_TYPE_* Some of these were missed when CAIRO_SCALED_FONT_TYPE_* was renamed. (cherry picked from 33dba4a690a5e4ec13ed294307b89cceac1ca696 commit) src/cairo-win32-surface.c | 2 +- src/cairo.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit fb7ae2a28e46895f764754c6961cb99989be7a04 Author: Kristian Høgsberg Date: Thu May 18 21:01:20 2006 -0400 Remember to call cairo_type1_font_subset_destroy(). src/cairo-type1-subset.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 1d2b60454fb1e7a1e4b7614029f02dfb0e33acb3 Author: Kristian Høgsberg Date: Thu May 18 20:50:36 2006 -0400 Consolidate a few arrays into a array of structs. src/cairo-type1-subset.c | 76 ++++++++++++++++++++++----------------------- 1 files changed, 37 insertions(+), 39 deletions(-) commit 9b84b3da58a62b25c129626f918713036e41cc88 Author: Vladimir Vukicevic Date: Fri Mar 17 00:06:21 2006 -0800 [win32] GDI is nearly always faster than pixman; use it whenever possible Remove local image check from fill_rectangles and fix check for whether we can AlphaBlend or not (ARGB->ARGB AlphaBlend works fine) (cherry picked from f099783b3e7f895a59d4d4a67a8534f1d21d44e1 commit) src/cairo-win32-surface.c | 22 +++++++++++++--------- 1 files changed, 13 insertions(+), 9 deletions(-) commit 2a89526edf1f42dfc3e8592b82a51b9970015bda Author: Vladimir Vukicevic Date: Thu Mar 16 14:04:49 2006 -0800 [win32] Add GdiFlush() calls after DIB creation, as per MSDN docs Also fixes some spacing/tab issues (cherry picked from 123ca7c9f9d8984be5ed4fb42a2897508e8ff44a commit) src/cairo-win32-surface.c | 38 +++++++++++++++++++++----------------- 1 files changed, 21 insertions(+), 17 deletions(-) commit a9c42e8fc264e3d07e4888d5965eea130c1e9d0a Author: Stuart Parmenter Date: Wed Mar 15 14:20:35 2006 -0800 [win32] fix win32_show_glyphs glyph offsets (cherry picked from 947a4a1bc6a0a0ee78c44b71fef32c924ebc9397 commit) src/cairo-win32-surface.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) commit 59a45f1c4a914c9640bbea37c72b1ec222f56ff3 Author: Stuart Parmenter Date: Fri Mar 10 12:25:07 2006 -0800 [win32] implement win32 show_glyphs (cherry picked from 9c7d0cbde415d02b6e8298a02b3b62cf4513a59e commit) src/cairo-win32-font.c | 14 ++--- src/cairo-win32-private.h | 1 + src/cairo-win32-surface.c | 115 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 121 insertions(+), 9 deletions(-) commit a10bbecaf8f122726c3e5b55b07bcd7882f6f319 Author: Stuart Parmenter Date: Fri Mar 10 12:12:36 2006 -0800 [win32] Allow for creating a font from a HFONT (cherry picked from 677f6c84f9beae3afd375663fed0a440007ebca2 commit) src/cairo-win32-font.c | 35 +++++++++++++++++++++++++++++++---- src/cairo-win32.h | 3 +++ 2 files changed, 34 insertions(+), 4 deletions(-) commit 244c111fca042b15d6718295ca2f7c7843fa7ab5 Author: Vladimir Vukicevic Date: Fri Mar 10 11:56:27 2006 -0800 [win32] Add SHADEBLENDCAPS and SB_NONE definitions for older SDKs (cherry picked from 7a68b7d035b1c63076d6fa6c54d40944459d206d commit) src/cairo-win32-surface.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 92a015ff8ec5c11aac6d9c0c6702fa4873c04381 Author: Vladimir Vukicevic Date: Mon Mar 27 13:49:58 2006 -0800 [xlib] only do glyph extents computation if non-solid source. xlib_show_glyphs was always calculating the glyph extents, even when it didn't need to; this only does it when necessary. Also adds an implementation of surface_flush() for xlib that just calls XSync. (cherry picked from 8770ac5b5cdba8007c4c6a6a980e6e06acf6aeb6 commit) src/cairo-xlib-surface.c | 49 +++++++++++++++++++++++++++++---------------- 1 files changed, 31 insertions(+), 18 deletions(-) commit 108431414faa8792659616bae35584b8fced3b21 Author: Vladimir Vukicevic Date: Wed Mar 8 21:08:57 2006 -0800 [xlib] implement _cairo_xlib_surface_show_glyphs Avoid using the fallback paths as much as possible; implement real show_glyphs, falling back for OPERATOR_SOURCE (due to Render bug), and all unbounded operators (let the fallback code deal with fixup). Also fall back if we have a fallback mask clip set. (cherry picked from 3225a4ec820fd4051dd893ffc4258b182bd62dca commit) src/cairo-xlib-surface.c | 276 +++++++++++++++++++++++++--------------------- 1 files changed, 152 insertions(+), 124 deletions(-) commit 6d53687058dc35bb1abd1f9552f43fccad61474f Author: Kristian Høgsberg Date: Thu May 18 20:03:53 2006 -0400 Look for /-| or /RD tokens to determine the charstring delimiter tokens. src/cairo-type1-subset.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-) commit 3487191b2230571323201ed045263433e77e5345 Author: Carl Worth Date: Thu May 18 15:36:43 2006 -0700 xlib: Style cleanups for _cairo_xlib_surface_create_similar Including style cleanups for _xrender_format_matches_content. There's even a bug fix here as well. Previously, we would miss compatibility if the existing xlib surface had a NULL visual, (even if it had a compatible xrender_format). We now catch this case, and don't bother even trying to store a visual into the resulting surface. src/cairo-xlib-surface.c | 97 +++++++++++++++++++++++++--------------------- 1 files changed, 53 insertions(+), 44 deletions(-) commit a96bd2b4f9ab399eee5198c0d27a6cd67798931b Author: Carl Worth Date: Thu May 18 15:20:25 2006 -0700 xlib: Rename surface->format to surface->xrender_format to avoid confusion With both XRenderPictFormat* and cairo_format_t values being manipulated in the same functions, this really needed to be done. src/cairo-xlib-surface.c | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) commit ea05e027111d5f336b7e3f2170f929b0b1e37692 Author: Robert O'Callahan Date: Fri May 19 08:26:08 2006 +1200 [xlib] Have create_similar try harder to create the right surface I recently discovered that cairo_create_similar on a 16-bit xlib surface creates a surface backed by a 24-bit pixmap. This results in absymal performance --- I can actually watch a copy from the similar to the original move down the screen, on my dual Xeon, NVidia vendor driver machine. It also means xlib-based code like GTK themes can't render to the surface because it doesn't match the screen depth. The attached patch makes _cairo_xlib_surface_create_similar match the characteristics of the input surface as closely as I know how, and fixes my issues. src/cairo-xlib-surface.c | 54 +++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 51 insertions(+), 3 deletions(-) commit d09d95a3231d9137c00da72e5bf56fe246671e15 Author: Kristian Høgsberg Date: Thu May 18 15:10:05 2006 -0400 Track glyph subset indices and use them in the output. src/cairo-type1-subset.c | 50 +++++++++++++++++++++++---------------------- 1 files changed, 26 insertions(+), 24 deletions(-) commit 5f55ae7d91174d29f83b2a15e4def0f6baea7344 Author: Kristian Høgsberg Date: Thu May 18 13:57:03 2006 -0400 Make ps surface use type1 subset code. - Add _cairo_ps_surface_emit_type1_font_subset() which just dumps the type1 subset into the ps document. - Add a 'name' parameter to _cairo_type1_subset_init() so it will be defined under the right name in the ps document. - Quiet down debug output from type1 subset code. - Reenable code to output custom /Encoding table. src/cairo-pdf-surface.c | 5 +++- src/cairo-ps-surface.c | 34 +++++++++++++++++++++++++++++++ src/cairo-scaled-font-subsets-private.h | 1 + src/cairo-type1-subset.c | 26 ++++++++++++++++++----- 4 files changed, 59 insertions(+), 7 deletions(-) commit fe58e7a81fe9f787ef262615bc1802243770a432 Author: Kristian Høgsberg Date: Thu May 18 13:35:57 2006 -0400 Only use the word wrap stream when emitting paths. This patch also factors the word wrap stream setup and teardown and the call to _cairo_path_fixed_interpret() out into a new function, _cairo_ps_surface_emit_path(). src/cairo-ps-surface.c | 287 +++++++++++++++++++++++------------------------ 1 files changed, 140 insertions(+), 147 deletions(-) commit 2fafbac390f13c8c47464defc8c30e705be98bbb Author: Kristian Høgsberg Date: Thu May 18 02:24:02 2006 -0400 Use RD and ND for delimiting glyph data instead of -| and |-. We probably should figure out from the private dictionary which of the two pairs the font defines and uses, but I don't actually have fonts that use -| and |-, so for now for flip the default. src/cairo-type1-subset.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 466d3da4ef2267287095e67342da8eb360198542 Author: Kristian Høgsberg Date: Wed May 17 17:17:02 2006 -0400 Add code to emit type1 dicts to the pdf backend. src/cairo-pdf-surface.c | 110 +++++++++++++++++++++++++++++++ src/cairo-scaled-font-subsets-private.h | 2 + src/cairo-type1-subset.c | 12 ++- 3 files changed, 120 insertions(+), 4 deletions(-) commit c36de5b7c5173639712074d0f98365b107707ae7 Author: Kristian Høgsberg Date: Wed May 17 12:05:16 2006 -0400 Pull in type1 subset code from the cvs repo it was sitting in. src/Makefile.am | 1 + src/cairo-font-subset.c | 1 - src/cairo-scaled-font-subsets-private.h | 41 ++ src/cairo-type1-subset.c | 1035 +++++++++++++++++++++++++++++++ 4 files changed, 1077 insertions(+), 1 deletions(-) commit 127fab4695ef849364e755e10c2b960add78782b Author: Kristian Høgsberg Date: Thu May 18 02:12:06 2006 -0400 Remember to call _cairo_truetype_subset_fini() after outputting subset. src/cairo-ps-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit b16c29ff0c38b8fa8e5753770bb93ad9ff084579 Author: Kristian Høgsberg Date: Wed May 17 01:30:43 2006 -0400 Set libcairo_font_subset_sources for ps, pdf, and svg backends. Backends that use the font subsetting code should add the font subsetting sources to the build. This is dont by setting libcairo_font_subset_sources, in the conditional section for each backend. If any one is enabled, the sources will be added to the build. src/Makefile.am | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit d42b2c7a89451e95e6e9ec6bc439f06855c66802 Author: Kristian Høgsberg Date: Tue May 16 23:56:38 2006 -0400 Remember to destroy cairo_pdf_ft_font_t once we've generated the subset. Also, remove cairo_private from function definitions. src/cairo-font-subset.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit f3209660c33bc128c58ec487c51440271f30a923 Author: Kristian Høgsberg Date: Tue May 16 23:24:09 2006 -0400 Print out ps comment in the truetype emit code and update type3 ps comment. src/cairo-ps-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 3975d7f8a26b53d4d2c7d587fbcfe9ed6ddf78d8 Author: Kristian Høgsberg Date: Tue May 16 23:20:08 2006 -0400 Add support for truetype subset to ps backend. Same story as for the pdf backend: try to output a truetype subset if possible, otherwise fall back to a type3 font. Ajdust text output code to scale font accordingly and scale type3 fonts to unity. src/cairo-ps-surface.c | 113 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 105 insertions(+), 8 deletions(-) commit 2c6e799ee64cfc00145ecbe0d0b93256c237dcf4 Author: Kristian Høgsberg Date: Tue May 16 22:53:05 2006 -0400 Switch to using Tm for text positioning and scale type3 fonts to unit size. This change changes the text output code to use the Tm operator for positioning the glyphs. This allows us to set the scale matrix from the cairo_scaled_font_t so truetype glyphs get transformed correctly. However, we now need to scale type3 glyph to unity to compensate. Longer term we should just only output one unit sized type3 subset for a cairo_font_face_t and use that for all cairo_scaled_font_t's coming from that font face. Also, this fixes a num_glyphs initialization bug. src/cairo-font-subset.c | 2 +- src/cairo-pdf-surface.c | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) commit e846dca44e8c60bf45ab84d7adaf7eefe3088f43 Author: Kristian Høgsberg Date: Tue May 16 21:41:07 2006 -0400 Hook _cairo_truetype_subset_init() up to existing truetype subset code. This is a minimal first change to get things working. The truetype subset code still needs to be renamed and moved around a bit. src/cairo-font-subset.c | 151 ++++++++++++++++++++++++++++------------------- 1 files changed, 91 insertions(+), 60 deletions(-) commit f4f11eba5b6daa6f82b967dcb21715b7f16d9719 Author: Kristian Høgsberg Date: Tue May 16 19:01:15 2006 -0400 Output pdf dicts for truetype subset fonts. src/cairo-font-subset.c | 21 +++++++ src/cairo-pdf-surface.c | 97 ++++++++++++++++++++++++++++++- src/cairo-scaled-font-subsets-private.h | 41 +++++++++++++ 3 files changed, 158 insertions(+), 1 deletions(-) commit 13a05830f5e524cd69b75796888c7a99ba9ce106 Author: Kristian Høgsberg Date: Tue May 16 16:42:44 2006 -0400 Update pdf font emit code to try to emit a truetype subset before type3. src/cairo-pdf-surface.c | 34 +++++++++++++++++++++++++++++----- 1 files changed, 29 insertions(+), 5 deletions(-) commit 05b1d2f9c5b827d52f3eb837c6c591c877dde419 Author: Carl Worth Date: Tue May 16 01:04:16 2006 -0700 PDF: Fix broken per-page sizes in PDF output. This was first broken in: PDF: Fold (unused) cairo_pdf_document_t into cairo_pdf_surface_t f500cef19f049a4a0ed296172618db2f26794932 Thanks, git bisect! src/cairo-pdf-surface.c | 17 +++++------------ 1 files changed, 5 insertions(+), 12 deletions(-) commit d70ade00fb67c6f77d23653481079996ec1e1292 Merge: 41d4354... c7ef4cb... Author: Kristian Høgsberg Date: Mon May 15 17:53:56 2006 -0400 Merge branch 'master' of git://git.freedesktop.org/git/cairo commit 41d435418c414405035eb911239dc6580edabd6b Author: Kristian Høgsberg Date: Mon May 15 17:36:12 2006 -0400 Documentation fixes (cairo_font_create -> cairo_scaled_font_create). src/cairo-ft-font.c | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) commit c7ef4cb3f3b14543842bf538dcb216d1ea51d89f Author: Carl Worth Date: Mon May 15 10:25:44 2006 -0700 ROADMAP: Note that PDF type 3 font support is done ROADMAP | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit 621ebc4726c075c183028818af1944f67a60b7ce Author: Carl Worth Date: Mon May 15 10:16:06 2006 -0700 pixman: Remove unused code to quiet compiler warnings pixman/src/fbpict.c | 14 ---------- pixman/src/icimage.c | 66 -------------------------------------------------- 2 files changed, 0 insertions(+), 80 deletions(-) commit 636cbe5a191cf8065facfbe45f32620cea2009a5 Author: Carl Worth Date: Mon May 15 10:14:39 2006 -0700 pixman: Add default case to quiet compiler warning pixman/src/fbpict.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 2e4c8924ad1c27d807e86a155c6582fd506c66c0 Author: Carl Worth Date: Mon May 15 10:07:57 2006 -0700 pixman: Fix build to enable warnings again configure.in | 2 ++ pixman/src/Makefile.am | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) commit bf2ab0de927dae4a1dd67a0cbacefabaf0e4255b Author: Carl Worth Date: Mon May 15 10:04:53 2006 -0700 PDF: Add Type3 font support to PDF output. This uses the recently added cairo-scaled-font-subsets interface in a style very similar to what the PS surface does. src/cairo-pdf-surface.c | 242 ++++++++++++++++++++++++++++-- test/select-font-face-pdf-argb32-ref.png | Bin 2781 -> 2782 bytes 2 files changed, 231 insertions(+), 11 deletions(-) commit 6f417fed51672ccca305b7fcc8b1bc3af7609534 Author: Carl Worth Date: Mon May 15 10:00:18 2006 -0700 PDF: Move Resources dictionary up from Page objects to Pages object. This allows for more sharing of resource objects. It also avoids some confusion in trying to set independent resources at a global and a per-page level, (which doesn't work since the inheritance only works for an entire resources object---it can only be overriden in its entirety, not for subsets of the resources). src/cairo-pdf-surface.c | 118 +++++++++++++++++++++++------------------------ 1 files changed, 58 insertions(+), 60 deletions(-) commit 049100fb870bee89b28bd14a9625add33f38a2bd Author: Carl Worth Date: Mon May 15 09:52:57 2006 -0700 PDF: Use consistent style for typedef struct and macro naming. src/cairo-pdf-surface.c | 22 +++++++++------------- 1 files changed, 9 insertions(+), 13 deletions(-) commit 45d0540c3375bfdb09973a809c08b5dec1ae2219 Author: Carl Worth Date: Mon May 15 09:41:36 2006 -0700 PS: Remove the fallback case from _cairo_ps_surface_show_glyphs The only expected errors that would lead to this fallback are serious problems such as out of memory. There's no reason to go to heroic efforts to draw as much as possible in face of an error like that. Prefer simpler code instead. src/cairo-ps-surface.c | 26 ++++++-------------------- 1 files changed, 6 insertions(+), 20 deletions(-) commit cb32b41a4e24df612dc0cabbe1e22098584759e9 Author: Carl Worth Date: Mon May 15 09:39:16 2006 -0700 PS: Fix arguments to setcachedevice Since we are only ever displaying a single glyph at a time we don't care about the width values passed to setcachedevice at all---we only care about the bounding box. That's what the code was trying to do before, but the arguments were misaligned and we were instead passing bounding-box values for the widths and hard-coding half of the bounding-box values as 0. src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e2c03d51daa60bf18b66ace148e6f8df7c454e2c Author: Carl Worth Date: Mon May 15 09:28:32 2006 -0700 Change scaled_font_subsets_callback to have return type of void. The return of status from this callback was misleading. The function actually calling the callback was also a hash table callback function, which itself is void---so any status value returned was being lost. Instead, we now stash any errors that occur during the fallback into surface->status. src/cairo-ps-surface.c | 30 +++++++++++++++--------------- src/cairo-scaled-font-subsets-private.h | 2 +- src/cairo-svg-surface.c | 25 ++++++++++--------------- 3 files changed, 26 insertions(+), 31 deletions(-) commit f500cef19f049a4a0ed296172618db2f26794932 Author: Carl Worth Date: Fri May 12 14:56:11 2006 -0700 PDF: Fold (unused) cairo_pdf_document_t into cairo_pdf_surface_t src/cairo-pdf-surface.c | 932 ++++++++++++++++++++--------------------------- 1 files changed, 392 insertions(+), 540 deletions(-) commit d84a1cac1cc2da8a34fb6aa91c3c4f4058527207 Author: Carl Worth Date: Fri May 12 13:31:12 2006 -0700 PDF: Use cairo_pdf_resource_t more consistently. Eliminate the named structure cairo_pdf_stream_t. This structure was being dynamically allocated, passed around, and leaked when only an ID was actually needed to be passed around. Similarly, many other uses of PDF resources were passing bare unsigned int types rather than the safer and more legible cairo_pdf_resource_t. src/cairo-pdf-surface.c | 487 +++++++++++++++++++++++------------------------ 1 files changed, 236 insertions(+), 251 deletions(-) commit b7e9506707878367493a8a45c74bb6eb048b7e88 Author: Tim Mooney Date: Wed May 10 20:51:53 2006 -0700 bug #6890: fix the signature for main() in pthread-show-text test/pthread-show-text.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1ba537be18316154781e36fb66545f82afb3c3a0 Author: Carl Worth Date: Wed May 10 19:01:40 2006 -0700 Fix memory leak in _cairo_scaled_font_subsets_foreach src/cairo-scaled-font-subsets.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 7bd3a037daadaed5b720d9590a479320de533af5 Author: Carl Worth Date: Wed May 10 18:52:36 2006 -0700 Add documentation for the _cairo_scaled_font_subsets interface. src/cairo-scaled-font-subsets-private.h | 109 ++++++++++++++++++++++++++++++- 1 files changed, 106 insertions(+), 3 deletions(-) commit 7c137b7e2ccbe76bb7870756a8fd29458b571a71 Author: Carl Worth Date: Wed May 10 15:14:10 2006 -0700 SVG: Discard custom font subsetting in favor of sharing cairo-scaled-font-subsets ROADMAP | 2 +- src/cairo-svg-surface.c | 272 ++++++++--------------------------------------- 2 files changed, 45 insertions(+), 229 deletions(-) commit f459c1f0de1d874da55ab9eff075834c4b8633b8 Author: Carl Worth Date: Wed May 10 15:12:53 2006 -0700 Tweak names to match those of cairo-scaled-font-subsets Also, remove a now obsolete field from cairo_ps_surface_t src/cairo-ps-surface.c | 19 ++++++++----------- 1 files changed, 8 insertions(+), 11 deletions(-) commit 8a209e6ad9a77b8b922687e08731c4b3bbd5621b Author: Carl Worth Date: Wed May 10 14:50:31 2006 -0700 Fix cairo_output_stream_destroy to do nothing on nil stream objects. src/cairo-output-stream.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 0544515279f9051a418f2079dd4fbeafd256b3ac Author: Carl Worth Date: Wed May 10 14:47:28 2006 -0700 Generalize font subsetting code in cairo-scaled-font-subsets for use by more than just PS backend ROADMAP | 1 + src/Makefile.am | 2 +- src/cairo-ps-surface.c | 228 ++++++++----------- src/cairo-scaled-font-subsets-private.h | 82 +++----- src/cairo-scaled-font-subsets.c | 378 +++++++++++++++++++++++------- 5 files changed, 416 insertions(+), 275 deletions(-) commit 906a17a6b1ba1fc120d90f9f3cec29b914300a93 Author: Carl Worth Date: Wed May 10 14:40:32 2006 -0700 Rename cairo-ps-font to cairo-scaled-font-subsets (file names only) src/cairo-ps-font-private.h | 101 ----------------- src/cairo-ps-font.c | 181 ------------------------------- src/cairo-scaled-font-subsets-private.h | 101 +++++++++++++++++ src/cairo-scaled-font-subsets.c | 181 +++++++++++++++++++++++++++++++ 4 files changed, 282 insertions(+), 282 deletions(-) commit f7f9bdc05bd0afc4b709ab6a83074b7e66b1cc60 Author: Carl Worth Date: Tue May 9 10:05:44 2006 -0700 PS: Put functions in more logical order. src/cairo-ps-surface.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) commit f3703b1806d1086be30323ca0576819b70a47771 Author: Carl Worth Date: Tue May 9 09:55:23 2006 -0700 PS: Move type 3 support out into cairo-ps-font.c This is in preparation for generalizing this code for sharing among several backends. src/Makefile.am | 2 +- src/cairo-ps-font-private.h | 101 ++++++++++++++++++++++++ src/cairo-ps-font.c | 181 +++++++++++++++++++++++++++++++++++++++++++ src/cairo-ps-surface.c | 181 +++---------------------------------------- 4 files changed, 295 insertions(+), 170 deletions(-) commit 7ebdf4825d677b3b63671eb44298ea2764df2966 Author: Carl Worth Date: Mon May 8 17:47:31 2006 -0700 PS: Remove stale comment (the stuff TODO is done already) src/cairo-ps-surface.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) commit 172fd2f6a668b6b0e4a7cbce24e006b65417d9b1 Author: Carl Worth Date: Tue May 9 14:39:08 2006 -0700 Fix typo in select-font-face.c and update reference images test/select-font-face-pdf-argb32-ref.png | Bin 0 -> 2781 bytes test/select-font-face-ps-argb32-ref.png | Bin 0 -> 528 bytes test/select-font-face-ref.png | Bin 2460 -> 2481 bytes test/select-font-face-svg-argb32-ref.png | Bin 0 -> 3064 bytes test/select-font-face-svg-rgb24-ref.png | Bin 0 -> 3064 bytes test/select-font-face.c | 4 ++-- 6 files changed, 2 insertions(+), 2 deletions(-) commit f0d7e3f858858937168c6cfdfae12dbe751ee683 Author: Carl Worth Date: Tue May 9 14:15:27 2006 -0700 Add select-font-face test for whosing multiple faces at once. test/.gitignore | 1 + test/Makefile.am | 2 + test/select-font-face-ref.png | Bin 0 -> 2460 bytes test/select-font-face.c | 83 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 0 deletions(-) commit 9595de96ac96bbfdc20177c0228c1673ad701d96 Author: Carl Worth Date: Mon May 8 17:41:17 2006 -0700 ROADMAP: non-substantive changes ROADMAP | 19 +++++++------------ 1 files changed, 7 insertions(+), 12 deletions(-) commit 7d0bcc3f1cf5dff292289420c3e5e73410997993 Author: Emmanuel Pacaud Date: Sat May 6 15:31:53 2006 +0200 SVG: Emit glyphs at the beginning of defs section. src/cairo-svg-surface.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 1da2ca0f3575fe00e7e3f2ce27cf0e3416517573 Author: Emmanuel Pacaud Date: Sat May 6 14:56:20 2006 +0200 SVG: Implementation of glyph cache This is an adaptation of Keith ps-type3 branch for SVG backend. Main differences with ps stuff are font cache is a property of document, and there's no need of subfonts. src/cairo-svg-surface.c | 571 +++++++++++++++++++++++++++++++++++++---------- 1 files changed, 450 insertions(+), 121 deletions(-) commit 09e94c6a31e58ff85c597d4791b6ec5006f73797 Author: Emmanuel Pacaud Date: Fri May 5 20:31:48 2006 +0200 SVG: Add reference images for fill-and-stroke-alpha. It fails on a one digit color error. test/fill-and-stroke-alpha-svg-argb32-ref.png | Bin 0 -> 509 bytes test/fill-and-stroke-alpha-svg-rgb24-ref.png | Bin 0 -> 509 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit ac470b02384528f9fda3ee7c80b64d27825b927a Author: Carl Worth Date: Fri May 5 07:57:10 2006 -0700 Don't build pdf2svg until we start depending on newer poppler test/Makefile.am | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) commit 44572fdcc8627a5c13d8fc68b55290f414166095 Author: Carl Worth Date: Fri May 5 07:51:59 2006 -0700 Revert "pdf2png: Use new poppler_page_render to render directly through cairo." This introduced a rather gratuitous dependency on a newer version of poppler, which caused a fair amount of pain for no significant benefit. This reverts 253472492ee2a690646a30b32cf8180f5b6e3299 commit. test/pdf2png.c | 38 +++++++++++--------------------------- 1 files changed, 11 insertions(+), 27 deletions(-) commit d76701f465669f843c12aee6b533c9fb6399ec99 Author: Emmanuel Pacaud Date: Fri May 5 16:47:06 2006 +0200 Use CLEAR operator for initialisation of similar surface with a transparent color. src/cairo-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 36fcaa76d66c16fcedddf3c3e967afa3f4a96615 Author: Emmanuel Pacaud Date: Fri May 5 16:02:04 2006 +0200 SVG: Fix cairo_svg_surface_restrict_to_version. surface parameter is actually a paginated surface. Use the same logic as pdf backend. src/cairo-svg-surface.c | 62 +++++++++++++++++++++++++++++++---------------- src/cairo-svg.h | 2 +- 2 files changed, 42 insertions(+), 22 deletions(-) commit 6b40ba283b6d09a7bf3bd0ec795a19b05b9bfec4 Author: Emmanuel Pacaud Date: Fri May 5 12:59:29 2006 +0200 SVG: Remove special case for unclipped CLEAR and SOURCE in paint when we're in analysis mode. intersect_clip_path is not analyzed, so we can't know if we're clipped when we're in analysis mode. src/cairo-svg-surface.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit fb269aac0887711298241113717aa8bddecbd097 Author: Emmanuel Pacaud Date: Fri May 5 11:10:02 2006 +0200 SVG: Sets something sane in width and height if acquire source image fails. In composite_image_pattern. src/cairo-svg-surface.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit c399b7a04777823fc32c65020616b39196795214 Author: Carl Worth Date: Thu May 4 23:48:28 2006 -0700 Increment CAIRO_VERSION to 1.1.7 after making the 1.1.6 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7ba3b75efd56113411ed141a86675099ae82d5d5 Author: Carl Worth Date: Thu May 4 23:44:07 2006 -0700 Fix typos in EXTRA_DIST list of reference images. test/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 5b3425972dd8864a754ca4551f375151b409fdb5 Author: Carl Worth Date: Thu May 4 23:39:12 2006 -0700 Update version to 1.1.6 and add notes to NEWS file. Also update libtool version information to 8:0:6. NEWS | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++- ROADMAP | 16 +++++---- configure.in | 6 ++-- 3 files changed, 108 insertions(+), 11 deletions(-) commit cfdb9a1c5372f261e6d495392aa6c052a6ebdee3 Author: Carl Worth Date: Thu May 4 23:33:44 2006 -0700 RELEASING: Add a few more steps that we've been somtimes forgetting RELEASING | 19 ++++++++++++++----- ROADMAP | 2 +- 2 files changed, 15 insertions(+), 6 deletions(-) commit b948683917e26315fdec773db8780662071554a1 Author: Carl Worth Date: Thu May 4 22:43:22 2006 -0700 Flesh out the documentation for cairo_push_group, cairo_pop_group and friends src/cairo.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 99 insertions(+), 20 deletions(-) commit 344c2c7acd0a87a7a28b4a73ba340b333fefb2bf Author: Carl Worth Date: Thu May 4 21:35:23 2006 -0700 Add a couple more group-using tests: fill-and-stroke-alpha[-add] test/.gitignore | 2 + test/Makefile.am | 4 + test/fill-and-stroke-alpha-add-ref.png | Bin 0 -> 588 bytes test/fill-and-stroke-alpha-add.c | 112 ++++++++++++++++++++++++++++++++ test/fill-and-stroke-alpha-ref.png | Bin 0 -> 532 bytes test/fill-and-stroke-alpha.c | 106 ++++++++++++++++++++++++++++++ 6 files changed, 224 insertions(+), 0 deletions(-) commit a16f0b4223a5cc9faa68d844b8fd3ff1bfb996b7 Author: Carl Worth Date: Thu May 4 15:34:15 2006 -0700 Add push-group to test/.gitignore test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 57a0242d0621020279bd33c3b0312463bf78cc42 Author: Ian Osgood Date: Thu May 4 14:29:03 2006 -0700 Additional piece of "Fix the XCB backend build for the XCB 0.9 release." test/cairo-test.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8c9da52dc285576e47b4e527487f0b2451ab87cc Author: Ian Osgood Date: Thu May 4 14:29:03 2006 -0700 Fix the XCB backend build for the XCB 0.9 release. * use split out xcb-render package * fix deprecated calls * use XCB-specific symbols configure.in | 2 +- src/cairo-xcb-surface.c | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) commit 450e29ce091e352569518bb5d6a9bf5236f14bfe Author: Carl Worth Date: Thu May 4 14:24:18 2006 -0700 pixman: Remove potential memory leak in failure path. Thanks to Petr Kobalicek for pointing this out. pixman/src/ictri.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit ec94f0a7e2e82bee3973f4c64eb23bb60cac846c Author: Carl Worth Date: Thu May 4 12:50:50 2006 -0700 Remove trailing comma in enum to pander to non-C99-conformant compilers src/cairo.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 457132fc2b1380cfd189ecec2f4ab1c02cd22fe4 Author: Emmanuel Pacaud Date: Thu May 4 21:41:36 2006 +0200 SVG: Don't test rectangle-rounding-error. This test uses CAIRO_ANTIALIAS_NONE, which is not supported yet by the SVG backend. test/cairo-test.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit f6748ad030a6b6b7fdf5e43d7636c6641c48c673 Author: Emmanuel Pacaud Date: Thu May 4 21:40:17 2006 +0200 SVG: Add reference image for tests failing on composited image misplacement. There's a bug in librsvg/cairo that offsets composited images by half a pixel. http://bugzilla.gnome.org/show_bug.cgi?id=330055 ...osite-integer-translate-over-svg-argb32-ref.png | Bin 0 -> 15465 bytes ...posite-integer-translate-over-svg-rgb24-ref.png | Bin 0 -> 15465 bytes test/paint-source-alpha-svg-argb32-ref.png | Bin 0 -> 353 bytes test/paint-source-alpha-svg-rgb24-ref.png | Bin 0 -> 353 bytes test/paint-with-alpha-svg-argb32-ref.png | Bin 0 -> 420 bytes test/paint-with-alpha-svg-rgb24-ref.png | Bin 0 -> 420 bytes test/scale-source-surface-paint-svg-argb32-ref.png | Bin 0 -> 146 bytes test/scale-source-surface-paint-svg-rgb24-ref.png | Bin 0 -> 158 bytes 8 files changed, 0 insertions(+), 0 deletions(-) commit 720edfe865fde9dff49198edaa9029a989045334 Author: Emmanuel Pacaud Date: Thu May 4 18:53:51 2006 +0200 SVG: Add reference images for push-groups test. Tests just fail for a one digit color on error. test/push-group-svg-argb32-ref.png | Bin 0 -> 2945 bytes test/push-group-svg-rgb24-ref.png | Bin 0 -> 2901 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit a3997501fad548988135e1aff6b906e96a9b744c Author: Emmanuel Pacaud Date: Thu May 4 18:40:37 2006 +0200 SVG: Update reference images for shrinked tests. test/linear-gradient-svg-argb32-ref.png | Bin 12707 -> 947 bytes test/linear-gradient-svg-rgb24-ref.png | Bin 12707 -> 947 bytes test/text-pattern-svg-argb32-ref.png | Bin 2643 -> 1720 bytes test/text-pattern-svg-rgb24-ref.png | Bin 2490 -> 1567 bytes 4 files changed, 0 insertions(+), 0 deletions(-) commit 135449ae03e74910c9ac359772d4ad790f6b7bed Author: Emmanuel Pacaud Date: Thu May 4 18:06:06 2006 +0200 SVG: Fix the previous fix for xlink namespace. It seems libxml2 2.6.24 now requires a node using xlink namespace to be linked to a node where it can find this namespace. src/cairo-svg-surface.c | 34 +++++++++++++++++++--------------- 1 files changed, 19 insertions(+), 15 deletions(-) commit a428f11738a52ffabbde3925254278585a72aadb Author: Emmanuel Pacaud Date: Thu May 4 14:18:59 2006 +0200 SVG: Fix bug in test suite causing SVG to fail with rgb24 and device offsets. Same fix as for PDF and PS surfaces. test/cairo-test.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit 1431a9d4d3655f488b6f6698fdc18c6d65d733b5 Author: Carl Worth Date: Thu May 4 04:01:06 2006 -0700 Clean up error management of xlib surface getter functions. src/cairo-xlib-surface.c | 61 ++++++++++++++++++++++----------------------- src/cairo-xlib.h | 8 +++--- 2 files changed, 34 insertions(+), 35 deletions(-) commit 4a4603d5517f4e0b014a34ec05bee42fc3640ed3 Author: Robert O'Callahan Date: Thu May 4 03:59:56 2006 -0700 Add Xlib surface getter functions. Add the following five functions: cairo_public Display * cairo_xlib_surface_get_display (cairo_surface_t *surface); cairo_public Drawable cairo_xlib_surface_get_drawable (cairo_surface_t *surface); cairo_public Screen * cairo_xlib_surface_get_screen (cairo_surface_t *surface); cairo_public Visual * cairo_xlib_surface_get_visual (cairo_surface_t *surface); cairo_public int cairo_xlib_surface_get_depth (cairo_surface_t *surface); src/cairo-xlib-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-xlib.h | 15 ++++++++++ 2 files changed, 81 insertions(+), 0 deletions(-) commit 68915fdfcb7a1c99ebd237b08192732a7409b5ec Author: Emmanuel Pacaud Date: Thu May 4 12:56:06 2006 +0200 SVG: Fix xml namespace declaration. It looks like since libxml2 2.6.24, we can't just use xmlSetProp for namespace declaration anymore. src/cairo-svg-surface.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) commit 7aa2b05e48f4431639b821661c91103d2b60b482 Author: Carl Worth Date: Thu May 4 03:44:26 2006 -0700 Add missing prototype for _cairo_clip_translate src/cairo-clip-private.h | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 7bcf957b4e2a986a94bbc29192f61b8c9c0067be Author: Robert O'Callahan Date: Thu May 4 03:43:34 2006 -0700 Rename cairo_rectangle_t to cairo_rectangle_fixed_t. This is in preparation for a later function addition for extracting clip rectangles from a cairo_t, (which will add a public cairo_rectangle_t). src/cairo-analysis-surface.c | 4 +- src/cairo-atsui-font.c | 2 +- src/cairo-beos-surface.cpp | 44 +++++----- src/cairo-clip-private.h | 18 ++-- src/cairo-clip.c | 18 ++-- src/cairo-directfb-surface.c | 42 +++++----- src/cairo-glitz-surface.c | 42 +++++----- src/cairo-gstate.c | 10 +- src/cairo-image-surface.c | 28 +++--- src/cairo-meta-surface.c | 4 +- src/cairo-paginated-surface.c | 8 +- src/cairo-pattern.c | 6 +- src/cairo-pdf-surface.c | 6 +- src/cairo-ps-surface.c | 6 +- src/cairo-quartz-private.h | 2 +- src/cairo-quartz-surface.c | 26 +++--- src/cairo-region.c | 10 +- src/cairo-scaled-font.c | 8 +- src/cairo-surface-fallback-private.h | 6 +- src/cairo-surface-fallback.c | 164 +++++++++++++++++----------------- src/cairo-surface.c | 58 ++++++------ src/cairo-svg-surface.c | 4 +- src/cairo-win32-private.h | 4 +- src/cairo-win32-surface.c | 20 ++-- src/cairo-xcb-surface.c | 32 ++++---- src/cairo-xlib-surface.c | 40 ++++---- src/cairo.c | 2 +- src/cairoint.h | 72 ++++++++-------- src/test-fallback-surface.c | 24 +++--- src/test-meta-surface.c | 4 +- src/test-paginated-surface.c | 4 +- 31 files changed, 358 insertions(+), 360 deletions(-) commit d71ddec8dfcfd4a8eb39edc9f34f93dc1683a62d Author: Carl Worth Date: Thu May 4 03:05:12 2006 -0700 ROADMAP: Note that device-offset and push-pop-group have landed. ROADMAP | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit fb7f7c2f27f0823d7702f960204d6e638d697624 Author: Vladimir Vukicevic Date: Tue Mar 14 15:56:08 2006 -0800 Fix up clip at pop_group time, to keep it in surface backend coordinates We keep the clip in surface-backend coordinates always, so it needs fixing whenever we change the target surface out in the gstate. The only place this happens is in push_group, so fix it as part of gstate_redirect(). src/cairo-clip-private.h | 5 +++ src/cairo-clip.c | 77 +++++++++++++++++++++++++++++++++++++++++++-- src/cairo-gstate.c | 32 +++++-------------- src/cairo.c | 9 ++++- 4 files changed, 93 insertions(+), 30 deletions(-) commit 7fa3c6eee5a19d3486a200a6a14b96210f2b6dab Author: Vladimir Vukicevic Date: Wed Mar 1 17:19:45 2006 +0100 Add push-group test and reference images test/push-group-ref.png | Bin 0 -> 3012 bytes test/push-group-rgb24-ref.png | Bin 0 -> 2858 bytes test/push-group.c | 119 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 119 insertions(+), 0 deletions(-) commit ee02c1b91452e5b34af4f02d7132840a4bf44fe1 Author: Vladimir Vukicevic Date: Wed Feb 15 13:46:53 2006 -0800 Implement push_group/pop_group This patch adds the following API calls: cairo_push_group cairo_push_group_with_content cairo_pop_group cairo_pop_group_to_source cairo_get_group_target These methods support implementing layers on top of a cairo context, allowing for drawing with transparency and temporary buffering. cairo_get_group_target allows an app to get access to the actual surface created by the last push_group call, in case itneeds to perform native drawing to it. src/cairo-gstate-private.h | 4 +- src/cairo-gstate.c | 214 +++++++++++++++++++++++++++++--------------- src/cairo.c | 150 ++++++++++++++++++++++++++++--- src/cairo.h | 51 ++++++----- src/cairoint.h | 19 ++++ test/Makefile.am | 3 +- 6 files changed, 332 insertions(+), 109 deletions(-) commit 5e708b38e00f6b2066028c60a5526bf5d5e66356 Merge: a6b1b01... 99719bd... Author: Carl Worth Date: Thu May 4 01:46:34 2006 -0700 Merge branch 'device-offset-history' into cairo commit a6b1b014bbd12be0f20c44d38d8847181be6d3ae Author: Carl Worth Date: Thu May 4 01:45:41 2006 -0700 Implement the device_offset functionality at surface, not gstate layer This is a mega-patch that has the advantage that the entire test suite passes both immediately before and immediately after this commit. The disadvantage of the mega-patch is that it does not reflect the development history of the device-offset branch, (with its various fumblings and flailings). To capture that history, we will next merge in that branch. src/cairo-clip.c | 11 ++ src/cairo-gstate.c | 61 +++------- src/cairo-path.c | 46 +++++++ src/cairo-ps-surface.c | 6 +- src/cairo-scaled-font.c | 8 +- src/cairo-surface-fallback.c | 64 ++++----- src/cairo-surface.c | 292 ++++++++++++++++++++++++++++++++++-------- src/cairo-traps.c | 49 +++++++- src/cairo-xlib-surface.c | 4 +- src/cairo.h | 5 + src/cairoint.h | 19 +++- test/buffer-diff.c | 8 +- test/cairo-test.c | 23 ++++ 13 files changed, 444 insertions(+), 152 deletions(-) commit 99719bde9ee0697bd43d97f034ccf4058c9484a0 Author: Carl Worth Date: Fri Mar 10 14:57:08 2006 -0800 Move device-offset touchups from the surface layer up to the gstate. This fixes the self-copy test which was the last one that was really failing due to device offsets. src/cairo-gstate.c | 16 ++++++++++++++++ src/cairo-surface.c | 12 ------------ 2 files changed, 16 insertions(+), 12 deletions(-) commit ee687d722a315ff9cefd8755ca38b194187a693c Author: Carl Worth Date: Thu Mar 9 14:39:44 2006 -0800 Add support to handle the device-offset of a source surface. This change caused all self-copy failures to now pass. But, it also causes all previous self-copy passes to now fail. src/cairo-surface.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) commit ea2faa5fae619a6b813348eda925060f3ed16ee3 Author: Carl Worth Date: Thu Mar 9 14:38:20 2006 -0800 Rip out device_{x,y}_scale. This device scale stuff is currently not being used. However it is also adding complexity to the current device-offset rework. And since it's not being tested I'm sure we're getting it wrong. It's better to not even have it here rather than having it be broken. src/cairo-clip.c | 8 ++--- src/cairo-path.c | 25 ++++++++++++------ src/cairo-ps-surface.c | 6 +--- src/cairo-surface-fallback.c | 2 - src/cairo-surface.c | 56 ++++++++++------------------------------- src/cairoint.h | 12 +++----- 6 files changed, 41 insertions(+), 68 deletions(-) commit 0e230727f8f925b85fffd0359195be4a704fed69 Author: Carl Worth Date: Thu Mar 9 14:01:30 2006 -0800 Prefer classic C style comments rather than C++/C99-style src/cairo-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f9333e9975cbb3a0e167de1f78076eb779da4317 Author: Carl Worth Date: Thu Mar 9 14:01:10 2006 -0800 Remove dead code from _cairo_surface_{acquire,release}_dest_image src/cairo-surface.c | 35 ++++------------------------------- 1 files changed, 4 insertions(+), 31 deletions(-) commit f66ce88e0ec1ef91bb85e795fd53a99f71877e4a Author: Carl Worth Date: Thu Mar 9 13:42:16 2006 -0800 cairo_surface_mark_dirty_rectangle: correct sense of device-offset handling src/cairo-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 460820cb58b9a9e893cdb2d48d1457defe797246 Author: Carl Worth Date: Thu Mar 9 13:39:55 2006 -0800 Remove undesired device-offset handling during unbounded fixups. This code was already commented as being suspicious and its removal causes some tests to start passing once again. src/cairo-surface.c | 12 ------------ 1 files changed, 0 insertions(+), 12 deletions(-) commit b0c047ad95957b46922bbb4f6320a4a7b0c32726 Author: Carl Worth Date: Thu Mar 9 13:37:32 2006 -0800 _cairo_surface_show_glyphs: Fix reversed device-offset handling so text works again. src/cairo-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ee1c642cd85fc4d5408d65578cc9ca48ee4b58cc Author: Carl Worth Date: Thu Mar 9 13:36:30 2006 -0800 cairo-surface.c: Correct reversed semantics of SURFACE_TO_BACKEND and BACKEND_TO_SURFACE src/cairo-surface.c | 56 +++++++++++++++++++++++++------------------------- 1 files changed, 28 insertions(+), 28 deletions(-) commit a5cb54621259d0a6057543bc0e4edd4d16216007 Author: Carl Worth Date: Wed Mar 8 15:02:35 2006 -0800 _cairo_surface_set_clip_region: Remove device-offset handling that is now taken care of in _cairo_clip_clip. src/cairo-surface.c | 36 ------------------------------------ 1 files changed, 0 insertions(+), 36 deletions(-) commit 69affa5fafe41edf6c88af7722538b550804284c Author: Carl Worth Date: Wed Mar 8 14:51:57 2006 -0800 Move device-offset handling for clipping from _cairo_surface_interesect_clip_path to the more general _cairo_clip_clip to handle more cases correctly. src/cairo-clip.c | 13 +++++++++++++ src/cairo-surface.c | 17 +---------------- src/cairoint.h | 3 +++ 3 files changed, 17 insertions(+), 16 deletions(-) commit 50dcd4d1ac3d4b90bcea04e53836d73b8e7c1aa4 Author: Carl Worth Date: Wed Mar 8 12:58:13 2006 -0800 _cairo_surface_copy_pattern_for_destination: Don't do any transform if there is no offset src/cairo-surface.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) commit 6d212c9e391ad8fc5b273269a54740790cbb1ee3 Author: Carl Worth Date: Wed Mar 8 12:51:46 2006 -0800 _cairo_surface_copy_pattern_for_destination: Remove leaking second call to pattern_init_copy src/cairo-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 81e469523fbc83b9ddcd74a6be5d8137a6d71c38 Author: Carl Worth Date: Wed Mar 8 12:44:49 2006 -0800 Abstract away repeated test as _cairo_surface_has_device_offset_or_scale src/cairo-surface.c | 34 ++++++++++++++-------------------- 1 files changed, 14 insertions(+), 20 deletions(-) commit 4ed3e60a25a877f65b82cf7c426659a89d195728 Author: Carl Worth Date: Wed Mar 8 11:56:27 2006 -0800 _cairo_surface_copy_pattern_for_destination: Fix transformation sign/order. This allows the scale-source-surface-paint test to start passing again at least. src/cairo-surface.c | 26 ++++++++++++-------------- 1 files changed, 12 insertions(+), 14 deletions(-) commit d3ff6f0e4b17972361c28f490eaf05222ac97e10 Author: Carl Worth Date: Wed Mar 8 11:54:33 2006 -0800 _cairo_surface_fallback_composite_trapezoids: Remove unused variable. src/cairo-surface-fallback.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 46a1f40b7d1787b570a8381a914a372400ef39a9 Author: Vladimir Vukicevic Date: Thu Mar 2 15:05:32 2006 +0100 Move device offsets handling into high-level operations only (stroke/fill/paint/etc) Remove all device offsets handling from internal cairo_surface methods, which will become truly internal shortly. Have all device offsets handled by top-level entry points (stroke/fill/paint/show_glyphs/mask, and clipping). src/cairo-scaled-font.c | 3 +- src/cairo-surface.c | 402 +++++++++++++++++++++++------------------------ 2 files changed, 201 insertions(+), 204 deletions(-) commit 6197d5a7618900f25155af16b91f082ee05ddd03 Author: Carl Worth Date: Wed Mar 1 11:54:21 2006 +0100 Fix bug in test suite causing PS and PDF to fail with rgb24 and device offsets. Patch from cworth@cworth.org. The trick with this one is that the test suite is using device offsets in a rather fabricated way, and the final copy from an offset surface to a non-offset surface is between two surfaces of the same size, so must be 1:1. To get this we turn the device offset off before the copy. In a more conventional use of device offsets the surfaces would be of different sizes, and the offset would be desired during the copy. test/cairo-test.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 51cf7900e4987d18173ded806988d412752717f5 Author: Vladimir Vukicevic Date: Wed Mar 1 11:23:15 2006 +0100 Take device offsets into account when compositing scaled glyph images Scaled glyph image surfaces have device offsets set on them to indicate the location of the glyph origin; however, those offsets weren't being taken into account for the call to composite, so the glyphs were being doubly-offset by this amount. src/cairo-scaled-font.c | 11 ++++++----- src/cairo-xlib-surface.c | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) commit 4894f5a234959a0e50269c1adcc6b4faf08ba053 Author: Vladimir Vukicevic Date: Wed Feb 15 13:46:52 2006 -0800 Implement device offset/scale at cairo-surface layer This patch implements device offset/scale at the cairo-surface layer, instead of them just being multiplied into the CTM at operation time. This allows identical drawing operations/clips/paths/etc. to operate identically on a surface with or without a device offset (and still have things end up in the same place relative to the dev offset). src/cairo-gstate.c | 47 +----- src/cairo-path.c | 37 ++++ src/cairo-surface-fallback.c | 65 ++++---- src/cairo-surface.c | 375 ++++++++++++++++++++++++++++++++++++++---- src/cairo-traps.c | 49 ++++++- src/cairo.h | 5 + src/cairoint.h | 14 ++ test/buffer-diff.c | 8 +- test/cairo-test.c | 5 + 9 files changed, 488 insertions(+), 117 deletions(-) commit 40b39dddf9cd919fb2f456a8e296a60cc8296fbf Author: Carl Worth Date: Fri Mar 10 16:37:50 2006 -0800 Shrink the size of a couple of tests (and update reference images). Shrink linear-gradient and text-pattern test outuput. The real motivation for this is to hide an annoying difference in the gradient output that occurs when under the influence of a device offsets. My opinion is that the gradient output should not change due to just an integer offset, but we currently don't have a precise gradient specification, so this minor deviation really isn't relevant. A better fix for this might have been to make the test suite more forgiving of tiny differences, (perhaps on a per-test basis), but another advantage of shrinking these tests is that they now run a lot faster. It is true that these tests now also exercise fewer different output values, but that's not the designed purpose of the tests so I don't feel bad about losing that characteristic. test/linear-gradient-ref.png | Bin 12750 -> 972 bytes test/linear-gradient.c | 6 +++--- test/text-pattern-ref.png | Bin 2725 -> 1721 bytes test/text-pattern-rgb24-ref.png | Bin 2339 -> 1423 bytes test/text-pattern.c | 4 ++-- 5 files changed, 5 insertions(+), 5 deletions(-) commit b3e2252b94297b7fbdbd3a3776781ea6df7c8bc6 Author: Vladimir Vukicevic Date: Wed Feb 15 13:46:52 2006 -0800 Augment test framework to test everything under device offsets as well. [With this change, two tests with gradients exhibit subtle differences under device offsets. I don't think we actually care about them though. -cworth] test/.gitignore | 36 ++------------- test/buffer-diff.c | 98 +++++++++++++++++++++++++++++----------- test/buffer-diff.h | 21 +++++++-- test/cairo-test.c | 111 +++++++++++++++++++++++++++++----------------- test/imagediff.c | 45 +++++-------------- test/make-html.pl | 124 ++++++++++++++++++++++++++++----------------------- test/xlib-surface.c | 4 ++ 7 files changed, 244 insertions(+), 195 deletions(-) commit 7beb3e27a552c724bbdb147bc27b775af0d61063 Author: Carl Worth Date: Wed May 3 16:45:33 2006 -0700 Quiet some 'may be used uninitialized' warnings. src/cairo-lzw.c | 4 ++-- src/cairo-pdf-surface.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 8a174a11395af97bf1bffeca7a6ee8e5c1d50281 Author: Carl Worth Date: Wed May 3 13:20:07 2006 -0700 Add test/pdf-features.c missing from an earlier commit test/pdf-features.c | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 150 insertions(+), 0 deletions(-) commit 7c825797c85fca79ea1229d49cf3ae1b24b6daf2 Author: Carl Worth Date: Wed May 3 13:18:40 2006 -0700 Add pdf2svg utility for manual testing (not used in test suite) test/.gitignore | 1 + test/Makefile.am | 5 +++ test/pdf2svg.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 0 deletions(-) commit 6f9aa014aeee03bd6acc31124de05cfd931a88e1 Author: Carl Worth Date: Wed May 3 13:13:10 2006 -0700 ROADMAP: Note that PDF per-page size setting is done. Sort things that appear in 1.1.4 ROADMAP | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) commit c35bfffa1057cfe2aeca6fe681ea59aa628f5315 Author: Carl Worth Date: Wed May 3 12:39:45 2006 -0700 Add new pdf-features test to exercise cairo_pdf_surface_set_size test/.gitignore | 2 ++ test/Makefile.am | 5 +++++ 2 files changed, 7 insertions(+), 0 deletions(-) commit eb1b102e9a9e16cfc38948f8d37e08f263d10f7c Author: Carl Worth Date: Wed May 3 12:39:23 2006 -0700 PDF: Add new cairo_pdf_surface_set_size for doing per-page size changes src/cairo-pdf-surface.c | 90 +++++++++++++++++++++++++++++++++++++++-------- src/cairo-pdf.h | 5 +++ 2 files changed, 80 insertions(+), 15 deletions(-) commit 5448278d6e9c7452f855f8b262295818b27c5a11 Author: Carl Worth Date: Wed May 3 12:38:49 2006 -0700 ps-features: Minor touchups (missing include, typo in error message) test/ps-features.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) commit a4fc0c2e2c9ce52750f43dabc2be5daeb8aee9c4 Author: Carl Worth Date: Wed May 3 11:10:24 2006 -0700 PS: Use ceil, not rounding when computing integers for BoundingBox src/cairo-ps-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit e91b2c87ccf75e1c4935f1593dfdd10b1992de34 Author: Emmanuel Pacaud Date: Wed May 3 14:53:25 2006 +0200 SVG: Emit "svg" version in document_finish. At least when there's something valid in document->svg_version. src/cairo-svg-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 5336cf5a984cdeb4d4887cd3c643a3e051aca338 Author: Emmanuel Pacaud Date: Wed May 3 14:47:01 2006 +0200 SVG: Only "comp-op" property when svg_version >= 1.2 src/cairo-svg-surface.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) commit 57ddc7a8699eac61af2086546130081b897aa3a2 Author: Emmanuel Pacaud Date: Wed May 3 14:29:54 2006 +0200 SVG: Emit correct version property of "svg" element. src/cairo-svg-surface.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit 3ee4bae92071b63ace5570795cf57cb94b06257d Author: Carl Worth Date: Wed May 3 01:58:03 2006 -0700 Increment CAIRO_VERSION to 1.1.5 after making the 1.1.4 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 044bc5b2a51558046bc2d0bc3a8a50897571674a Author: Carl Worth Date: Wed May 3 01:31:51 2006 -0700 Update version to 1.1.4 and add notes to NEWS file. Also update libtool version information to 7:0:5. NEWS | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 65 insertions(+), 0 deletions(-) commit 7cf6bcaeca168394074413925c35c0cf2f3fb12a Author: Carl Worth Date: Wed May 3 01:29:24 2006 -0700 RELEASING: Replace references to ChangeLog with git log commands (and improve those) RELEASING | 25 ++++++++++++++----------- configure.in | 6 +++--- 2 files changed, 17 insertions(+), 14 deletions(-) commit 65dd361c49a984a508cb53153a45612028fa49ef Author: Carl Worth Date: Wed May 3 01:18:06 2006 -0700 SVG: Enable the SVG backend to be built by default (if dependencies are met) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6acc836df28e0e97e4d0a146c96f04f9a4db30c4 Author: Carl Worth Date: Wed May 3 00:57:28 2006 -0700 Add backend-specific reference images to EXTRA_DIST so they'll go out in the tar file. test/Makefile.am | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) commit b6fefaef9bd280715366a44d9f0bef91471e8e3a Author: Carl Worth Date: Wed May 3 00:56:34 2006 -0700 ROADMAP: Indicate that PS printing-oriented API is done now. ROADMAP | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 09dfd6c3c16ed36b0e9693cfcbb3b679bd18f585 Author: Carl Worth Date: Wed May 3 00:26:22 2006 -0700 PS: Add three new public functions for emitting DSC comments. This commit adds the following new functions to the cairo-ps API: cairo_ps_surface_dsc_comment cairo_ps_surface_dsc_begin_setup cairo_ps_surface_dsc_begin_page_setup Many thanks are due to Michael Sweet who provided invaluble guidance during the design of this API. It is hoped that with this API in place, basically all printer control that is likely to be desired to be performed with cairo PostScript output is now possible. This commit augments the ps-features test to exercise the new API. doc/public/tmpl/cairo-status.sgml | 1 + src/cairo-array.c | 4 +- src/cairo-ps-surface.c | 271 ++++++++++++++++++++++++++++++++++++- src/cairo-ps.h | 12 ++- src/cairo.c | 4 +- src/cairo.h | 4 +- test/ps-features.c | 54 +++++--- 7 files changed, 325 insertions(+), 25 deletions(-) commit 253472492ee2a690646a30b32cf8180f5b6e3299 Author: Carl Worth Date: Tue May 2 16:54:49 2006 -0700 pdf2png: Use new poppler_page_render to render directly through cairo. ...as opposed to using poppler_page_render_to_pixbuf. test/pdf2png.c | 38 +++++++++++++++++++++++++++----------- 1 files changed, 27 insertions(+), 11 deletions(-) commit e7459428dc87f7372dd7d5bd903341d619ee726f Author: Emmanuel Pacaud Date: Tue May 2 23:37:23 2006 +0200 SVG: Convert SVG file with a resolution of 72 dpi. That means 1 point = 1 pixel test/svg2png.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 1264ae9af4f4aa3bc9f6495e84a7888cd16809da Author: Emmanuel Pacaud Date: Tue May 2 23:35:06 2006 +0200 SVG: Really use width and height in point unit. I guess it makes more sense to use a unit for specifying image size that doesn't depend on context. src/cairo-svg-surface.c | 25 +++++++++++++++++++++++-- 1 files changed, 23 insertions(+), 2 deletions(-) commit 773692b7df9f0ccf250f259c1bc430c343765651 Merge: bd85701... 8488aae... Author: Emmanuel Pacaud Date: Tue May 2 21:52:41 2006 +0200 Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo commit bd85701b4f97f0750df050c1a8d995f103a52fc1 Author: Emmanuel Pacaud Date: Tue May 2 21:48:11 2006 +0200 SVG: Minor documentation fixes. src/cairo-svg-surface.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 8488aaee1a8f25d3cc9bf2af986b32710cea91f0 Author: Carl Worth Date: Tue May 2 12:36:23 2006 -0700 PS: Add cairo_ps_surface_set_size along with ps-features test Add a new cairo_ps_surface_set_size which can be used to produce a PostScript file consisting of pages of various different sizes (or orientations). Also add a new test (ps-features.c) for testing this and subsequent ps-specific function calls. src/.gitignore | 1 + src/cairo-ps-surface.c | 113 +++++++++++++++++++++++++++++++++------ src/cairo-ps.h | 5 ++ test/.gitignore | 2 + test/Makefile.am | 5 ++ test/ps-features.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 243 insertions(+), 18 deletions(-) commit e59f35291fa5f97acfe408b7bce8652ec20566c8 Author: Carl Worth Date: Tue May 2 11:36:41 2006 -0700 atsui: Add missing check of return-value of malloc. This addresses the original problem noted in mozilla's bug #336129: Missing out-of-memory check at gfx/cairo/cairo/src/cairo-atsui-font.c:185 https://bugzilla.mozilla.org/show_bug.cgi?id=336129 This also adds a comment pointing out another malloc that is not checked, (but does not fix it). src/cairo-atsui-font.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 41e288a88023cac9ced77099bceced41cf526a99 Author: Carl Worth Date: Mon May 1 15:44:58 2006 -0700 Make backend-specific function set a surface error on type mismatch. If any backend-specific, surface-modifying function is called with the wrong surface type we set an error on that surface. src/cairo-surface.c | 2 +- src/cairo-xcb-surface.c | 5 +++-- src/cairo-xlib-surface.c | 19 +++++++++++-------- src/cairoint.h | 4 ++++ 4 files changed, 19 insertions(+), 11 deletions(-) commit 0e4527c67e623801544be05de32f21a0c10e5b5d Author: Emmanuel Pacaud Date: Tue May 2 14:50:40 2006 +0200 SVG: Rework of API for SVG selection. I've removed cairo_svg_surface_create_xxx functions, and instead implemented the following ones: cairo_svg_surface_restrict_to_version cairo_svg_get_versions cairo_svg_version_to_string doc/public/cairo-sections.txt | 7 +- doc/public/tmpl/cairo-svg.sgml | 79 --------------- src/cairo-svg-surface.c | 209 ++++++++++++++++----------------------- src/cairo-svg.h | 41 ++++---- 4 files changed, 109 insertions(+), 227 deletions(-) commit 32f120e4888fd9344f699fd47c1aea6a5ec3df8e Author: Carl Worth Date: Mon May 1 15:12:46 2006 -0700 Don't return void from void-returning function (fix #6792). It's a dumb part of the C standard and it's even dumber when compilers are picky about it. But oh, well. src/cairo-paginated-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit df2f05876d754ecc4fbc5aee53080bdd672d0de9 Author: Carl Worth Date: Mon May 1 14:54:57 2006 -0700 ROADMAP: Mark bug #4705 as fixed. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 87bd00326e0b6ac2ac29939d0ab1e59d9ab05a47 Author: Carl Worth Date: Mon May 1 14:52:25 2006 -0700 Fix silly typo from previous commit. src/cairo-xlib-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 8dff692db6e7083633fc9b81548b0554a985fabd Author: Carl Worth Date: Mon May 1 10:17:08 2006 -0700 Support multiple glyph image formats within the same font (fix #4705). If we find a glyph image of a format that is different from the font's format, then we use a temporary image and convert to the font's format. This provides a simple fix for the crash identified in bug #4705: crash at XRenderAddGlyphs https://bugs.freedesktop.org/show_bug.cgi?id=4705 A later improvement would guarantee that the "font's format" was carefully chosen to be able to contain all glyphs in the font without information loss. src/cairo-xlib-surface.c | 61 ++++++++++++++++++++++++++++++++++++---------- 1 files changed, 48 insertions(+), 13 deletions(-) commit 0c927c53880f9ece2903a9b2c7843aaff1c78dec Author: Emmanuel Pacaud Date: Mon May 1 23:23:02 2006 +0200 SVG: Add reference images for tests failing on 1 digit error on color. test/caps-joins-alpha-svg-argb32-ref.png | Bin 0 -> 2454 bytes test/caps-joins-alpha-svg-rgb24-ref.png | Bin 0 -> 2454 bytes test/linear-gradient-svg-argb32-ref.png | Bin 0 -> 12707 bytes test/linear-gradient-svg-rgb24-ref.png | Bin 0 -> 12707 bytes test/mask-ctm-svg-argb32-ref.png | Bin 0 -> 108 bytes test/mask-ctm-svg-rgb24-ref.png | Bin 0 -> 118 bytes test/mask-surface-ctm-svg-argb32-ref.png | Bin 0 -> 108 bytes test/mask-surface-ctm-svg-rgb24-ref.png | Bin 0 -> 118 bytes test/mask-svg-argb32-ref.png | Bin 0 -> 87715 bytes test/mask-svg-rgb24-ref.png | Bin 0 -> 81874 bytes test/set-source-svg-argb32-ref.png | Bin 0 -> 104 bytes test/set-source-svg-rgb24-ref.png | Bin 0 -> 104 bytes test/trap-clip-svg-argb32-ref.png | Bin 0 -> 71765 bytes test/trap-clip-svg-rgb24-ref.png | Bin 0 -> 73066 bytes 14 files changed, 0 insertions(+), 0 deletions(-) commit e3b3402eb82786c4b1faf0d25b6ed322bf5545aa Author: Emmanuel Pacaud Date: Mon May 1 23:21:37 2006 +0200 SVG: Correct use of paginated surface. Fix emit of alpha filter. src/cairo-svg-surface.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) commit 8e5ada5201dd8a39026e8973d2590fec5ebf2d00 Author: Emmanuel Pacaud Date: Mon May 1 22:53:46 2006 +0200 SVG: Trivial indentation and comment fixes. src/cairo-svg-surface.c | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-) commit 62831dc10ec7601869a01041c845d5dc2f15db49 Author: Emmanuel Pacaud Date: Mon May 1 22:53:12 2006 +0200 SVG: Remove outdated comment. src/cairo-svg-surface.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) commit 22c799d5b3cae2a98ab927b2b38911ac89cac61e Author: Emmanuel Pacaud Date: Mon May 1 22:52:47 2006 +0200 SVG: Fix error handling in create_for_document and in composite_image_pattern. src/cairo-svg-surface.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) commit 6f49f7b76d69c185d6f97e50d8a57914a9a9fca1 Author: Emmanuel Pacaud Date: Mon May 1 22:51:25 2006 +0200 SVG: Add an additionnal API for creating SVG 1.1 or 1.2 files. And update documentation. doc/public/cairo-sections.txt | 4 + doc/public/tmpl/cairo-svg.sgml | 46 +++++++++++ src/cairo-svg-surface.c | 164 +++++++++++++++++++++++++++++++++------ src/cairo-svg.h | 18 +++++ 4 files changed, 206 insertions(+), 26 deletions(-) commit 2e4d0e5ba71fc320e2b96526a28b654231cb9dbe Author: Emmanuel Pacaud Date: Mon May 1 22:50:42 2006 +0200 SVG: Some variable/type renaming. src/cairo-svg-surface.c | 50 +++++++++++++++++++++++----------------------- 1 files changed, 25 insertions(+), 25 deletions(-) commit e5ea8268b0c693b7b0940d2f638c94dff93e8d9b Author: Emmanuel Pacaud Date: Mon May 1 22:49:58 2006 +0200 SVG: Reenable optimisation of CLEAR and SOURCE in paint when there's no active clipping path. src/cairo-svg-surface.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit 55685d7173adc2e13c21f8830aa38ffc7d1e026f Author: Emmanuel Pacaud Date: Mon May 1 22:49:29 2006 +0200 SVG: Code cleanup. src/cairo-svg-surface.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit 926bb6480c0542a0928e8b109009be4b24c81344 Author: Emmanuel Pacaud Date: Mon May 1 22:47:41 2006 +0200 SVG: Initial support of operators support via image fallbacks. We need to add a public API that will let user select a compatibility level regarding produced SVG files. This patch also plugs a memleak. src/cairo-svg-surface.c | 100 +++++++++++++++++++++++++++++++--------------- 1 files changed, 67 insertions(+), 33 deletions(-) commit 061d5088985a5e0b16202a4f031938772749940a Author: Emmanuel Pacaud Date: Mon May 1 22:43:15 2006 +0200 SVG: Sort of working implementation of a SVG backend with paginated surface support. Unoptimized and with memory leaks. src/cairo-svg-surface.c | 134 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 97 insertions(+), 37 deletions(-) commit 59dcb95ce5fed8264bc161979e615609c38ace2d Author: Emmanuel Pacaud Date: Mon May 1 22:41:12 2006 +0200 SVG: First pass for analyze-surface support src/cairo-svg-surface.c | 92 +++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 85 insertions(+), 7 deletions(-) commit 0625d4cd3fb6145e7f9a7474d03945a497b12406 Author: Emmanuel Pacaud Date: Mon May 1 22:15:38 2006 +0200 SVG: Ignore SVG test files. test/.gitignore | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit d1dcbbb8c34ed160d2b24a9afc8f30ac9de87d91 Author: Emmanuel Pacaud Date: Tue Apr 25 22:48:21 2006 +0200 SVG: Update rgb24 reference files. (cherry picked from 7173951535f4b95da37cbf3d51143deeec95e47a commit) test/show-text-current-point-svg-rgb24-ref.png | Bin 4236 -> 2398 bytes test/text-antialias-gray-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes test/text-antialias-none-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 1077 -> 1033 bytes test/text-pattern-svg-rgb24-ref.png | Bin 2428 -> 2490 bytes 5 files changed, 0 insertions(+), 0 deletions(-) commit bdc1c1ac783f1d2bda742ea7150de2c4b0751a29 Author: Emmanuel Pacaud Date: Mon May 1 22:12:20 2006 +0200 Copy content property when doing a snapshot of a meta surface. src/cairo-meta-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 6a33993b1510d1c0d311f4a10832ab2bc5ea8f4e Merge: b920dfd... 3aa5d76... Author: Emmanuel Pacaud Date: Mon May 1 22:01:38 2006 +0200 Merge branch 'origin' commit b920dfd3df7ac1a0e49b7417b710f111a3780700 Author: Emmanuel Pacaud Date: Mon May 1 21:59:53 2006 +0200 SVG: Reenable operator tests, and rgb24 surface are meta-surfaces. test/cairo-test.c | 10 +--------- 1 files changed, 1 insertions(+), 9 deletions(-) commit 3aa5d76d23ad9005d296fbb852e75924b0933c82 Author: Carl Worth Date: Sat Apr 29 14:28:21 2006 -0700 Add missing file leaky-dash-ref.png test/leaky-dash-ref.png | Bin 0 -> 241 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 516ac16de1ac0cab8e2972e2ac1443fd58c39746 Author: Henning Noren Date: Fri Apr 28 07:04:56 2006 -0700 Fix PS Surface Memleak Fixes leak of 16 bytes when calling _cairo_ps_surface_finish by never freeing the closure allocated in _word_wrap_stream_create. src/cairo-ps-surface.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-) commit 9729fe60246c7d98ddc1f690b924cd10daabf096 Author: Carl Worth Date: Thu Apr 27 09:54:58 2006 -0700 Add line-width-scale test to demonstrate cairo_set_line_width bug test/.gitignore | 1 + test/Makefile.am | 2 + test/line-width-scale-ps-argb32-ref.png | Bin 0 -> 1470 bytes test/line-width-scale-ref.png | Bin 0 -> 4884 bytes test/line-width-scale.c | 184 +++++++++++++++++++++++++++++++ 5 files changed, 187 insertions(+), 0 deletions(-) commit 5821d88119740dbbd489909f3bde2f41c7e7ce71 Author: Carl Worth Date: Thu Apr 27 11:45:26 2006 -0700 Correct documentation to say "user space", not "user-space" where appropriate. src/cairo.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 5515191f84bb837383278495f1f7034e7a97bdce Author: Emmanuel Pacaud Date: Tue Apr 25 21:55:56 2006 +0200 Use CLEAR operator in mask.c in order to not trig image fallback for polygon masking. (cherry picked from 30b2d1c5df9d1c6b536838a6a3407fdfa7198e29 commit) test/mask.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 9bca27a1adc89b12905ec95ebb4e006830010df1 Author: Emmanuel Pacaud Date: Sun Apr 23 22:55:37 2006 +0200 Optimisation of CLEAR operator in meta-surface. This optimisation takes care to not replay what was done before surface is cleared. We don't erase recorded commands since we may have earlier snapshots of this surface. (cherry picked from 926e2494ca2211e9117ab70fc427208d125e1bd5 commit) src/cairo-meta-surface-private.h | 3 +++ src/cairo-meta-surface.c | 14 +++++++++++++- 2 files changed, 16 insertions(+), 1 deletions(-) commit a7320589207088351c035df55644f1d94600f313 Author: Emmanuel Pacaud Date: Thu Apr 20 22:07:52 2006 +0200 Implement paginated create_similar, moving similar images down to PS and PDF. The new paginated create_similar simply forwards to target backend create_similar. We maintain the fact that PS and PDF surfaces are returning image surfaces for create_similar by moving that explicitly to their own create_similar functions. (This commit is the combination of the following original commits: 6b69e8c012adb4f2fc2ee9c1579fed8214e8f510 2589db92a4395f8e900dbc4eafc45982f0d985d3 ) src/cairo-paginated-surface.c | 9 +-------- src/cairo-pdf-surface.c | 7 ++++--- src/cairo-ps-surface.c | 15 ++++++++++++++- 3 files changed, 19 insertions(+), 12 deletions(-) commit e1be80b02080955e29d17c50118471158593b86f Author: Carl Worth Date: Thu Apr 27 06:02:46 2006 -0700 paginated: Remove memory leak of analysis surface from _paint_page Thanks to Henning Noren for pointing this out. src/cairo-paginated-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 09a51a4e037473fc104c788c87730b7e97d9fd26 Author: Carl Worth Date: Thu Apr 27 05:44:57 2006 -0700 Add reference to cairo_surface_set_user_data in docs. for cairo_image_surface_create_for_data src/cairo-image-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 08733a2228ac4b2739355b536adf955d982a40f0 Author: Carl Worth Date: Wed Apr 26 21:22:58 2006 -0700 Move 1.4 schedule up. Add more bugs from sunmoon1997 To hit the Firefox 3 schedule in early 2007 we'll need to have a 1.4 release out much sooner. Let's shoot for October 2006 which gives 6 months between 1.2 and 1.4. Also, sunmoon1997 has identified a couple more important issues to be fixed before 1.2 releases. ROADMAP | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit b10a0a9a21216bd4ddcc53a566aac409333ef294 Author: Carl Worth Date: Wed Apr 26 15:13:41 2006 -0700 Add a couple more items to the 1.2.0 ROADMAP ROADMAP | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit c7a45ab49b98225152542370905b593bb8a14188 Author: Carl Worth Date: Wed Apr 26 14:42:20 2006 -0700 Update ROADMAP with suggestions from discussion of 1.1.2 snapshot ROADMAP | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 9ab4b81a096bd5f9839b90cb2a3cdafa2460fd55 Author: Christian Biesinger Date: Thu Apr 27 00:51:01 2006 +0200 Use a single LDADD variable instead of a per-test one to avoid repeating the list of tests. test/Makefile.am | 93 ++++------------------------------------------------- 1 files changed, 7 insertions(+), 86 deletions(-) commit 7601a07ae942be8e63263ab7c7e559d7665c3b81 Author: Carl Worth Date: Wed Apr 26 14:34:02 2006 -0700 Remove cairo.def from the generated tar file. It's not useful there. ROADMAP | 230 ++++++++++++++++++++++++++++--------------------------- src/Makefile.am | 3 - 2 files changed, 118 insertions(+), 115 deletions(-) commit 74ec21b2a7f3435cb4f8ab152fdfb9381bb9eef6 Author: Behdad Esfahbod Date: Wed Mar 15 14:02:14 2006 -0500 WIN32: Define SHADEBLENDCAPS and SB_NONE if they are not defined. (from Tor Lillqvist) (cherry picked from d3ff5228a205ffb29e85907830d5fc72e2ef5358 commit) src/cairo-win32-private.h | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit e0a2e1fd14a53e646fb6b1a861fd9ca78aa6b603 Author: Carl Worth Date: Wed Apr 26 12:51:54 2006 -0700 Add leaky-dash test case demonstrating bug #4863. Test case for bug #4863: stroking problems with wide dashed lines https://bugs.freedesktop.org/show_bug.cgi?id=4863 test/.gitignore | 1 + test/Makefile.am | 3 ++ test/leaky-dash.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 0 deletions(-) commit e4b3cb1e71549af6910665e99d2a0dd57e30cede Author: Carl Worth Date: Wed Apr 26 12:49:58 2006 -0700 Remove deleted reference images from Makefile.am test/Makefile.am | 33 +-------------------------------- 1 files changed, 1 insertions(+), 32 deletions(-) commit 7110c168f7edadcedaea74a73b7ac6f095165931 Author: Carl Worth Date: Wed Apr 26 12:36:22 2006 -0700 Remove redeundant -rgb24-ref.png images. In several cases the -rgb24 reference images were identical to the -ref images. So we change the logic to find the latter if the former doesn't exist, and then we remove the redundant images. test/a8-mask-rgb24-ref.png | Bin 128 -> 0 bytes test/cairo-test.c | 20 +++++++++++++------- test/caps-joins-alpha-rgb24-ref.png | Bin 2283 -> 0 bytes test/caps-joins-rgb24-ref.png | Bin 1398 -> 0 bytes test/caps-sub-paths-rgb24-ref.png | Bin 186 -> 0 bytes test/clip-all-rgb24-ref.png | Bin 114 -> 0 bytes ...ite-integer-translate-over-repeat-rgb24-ref.png | Bin 353 -> 0 bytes .../composite-integer-translate-over-rgb24-ref.png | Bin 13041 -> 0 bytes ...omposite-integer-translate-source-rgb24-ref.png | Bin 14017 -> 0 bytes test/create-from-png-rgb24-ref.png | Bin 115 -> 0 bytes test/create-from-png-stream-rgb24-ref.png | Bin 115 -> 0 bytes test/dash-caps-joins-rgb24-ref.png | Bin 2465 -> 0 bytes test/dash-offset-negative-rgb24-ref.png | Bin 170 -> 0 bytes test/filter-nearest-offset-rgb24-ref.png | Bin 254 -> 0 bytes test/imagediff.c | 15 +++++++++------ test/leaky-polygon-rgb24-ref.png | Bin 344 -> 0 bytes test/line-width-rgb24-ref.png | Bin 199 -> 0 bytes test/linear-gradient-rgb24-ref.png | Bin 11700 -> 0 bytes test/move-to-show-surface-rgb24-ref.png | Bin 115 -> 0 bytes test/paint-rgb24-ref.png | Bin 116 -> 0 bytes test/paint-source-alpha-rgb24-ref.png | Bin 248 -> 0 bytes test/paint-with-alpha-rgb24-ref.png | Bin 255 -> 0 bytes test/path-data-rgb24-ref.png | Bin 523 -> 0 bytes test/rectangle-rounding-error-rgb24-ref.png | Bin 298 -> 0 bytes test/self-copy-rgb24-ref.png | Bin 291 -> 0 bytes test/show-glyphs-many-rgb24-ref.png | Bin 115 -> 0 bytes test/show-text-current-point-rgb24-ref.png | Bin 2173 -> 0 bytes test/source-clip-rgb24-ref.png | Bin 180 -> 0 bytes test/surface-pattern-rgb24-ref.png | Bin 194 -> 0 bytes test/text-antialias-gray-rgb24-ref.png | Bin 995 -> 0 bytes test/text-antialias-none-rgb24-ref.png | Bin 284 -> 0 bytes test/text-antialias-subpixel-rgb24-ref.png | Bin 1121 -> 0 bytes test/transforms-rgb24-ref.png | Bin 318 -> 0 bytes test/translate-show-surface-rgb24-ref.png | Bin 115 -> 0 bytes test/unantialiased-shapes-rgb24-ref.png | Bin 4449 -> 0 bytes 35 files changed, 22 insertions(+), 13 deletions(-) commit fe8bf47afc11b12034fd2c92caf424c8911d630b Author: Zhe Su Date: Tue Apr 25 10:20:42 2006 -0700 Support fontconfig embeddedbitmap option/handle transformation issue as well. src/cairo-ft-font.c | 24 +++++++++++++++++++++--- 1 files changed, 21 insertions(+), 3 deletions(-) commit 90b7a2d5fc5d195a0e521e48d17a78a98b53b224 Author: Carl Worth Date: Tue Apr 25 09:47:30 2006 -0700 Increment CAIRO_VERSION to 1.1.3 after making the 1.1.2 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d5dd5e6ebc43db103071b8b86284f4e38572b053 Author: Carl Worth Date: Tue Apr 25 09:12:30 2006 -0700 Remove from EXTRA_DIST reference images which don't exist test/Makefile.am | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) commit e89de1030eae71da469c9c4c7176d0fdfe0df595 Author: Carl Worth Date: Tue Apr 25 08:56:23 2006 -0700 Change release targets as appropriate for a snapshot, not a release. The big change here is to change the upload directory to be the snapshots directory rather than the releases directory. We also use make dist rather than make distcheck since there are currently a few tests still failing. Makefile.am | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 3d6cdc996f3a3f4d54d0d8926daa3973d69e4dc2 Author: Carl Worth Date: Tue Apr 25 08:54:59 2006 -0700 Add release vs. snapshot distinction to version increment instructions RELEASING | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 68c5382b6cdc442f3057b8e4eed2dfe7084ef7f1 Author: Carl Worth Date: Tue Apr 25 08:51:08 2006 -0700 Increment CAIRO_VERSION to 1.1.2 and libtool versioning to 6:0:4 configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 3002c6cc8b4722a324de27a20f04ae810b6dc573 Author: Carl Worth Date: Tue Apr 25 08:44:45 2006 -0700 Add some notes for the 1.1.2 snapshot NEWS | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ RELEASING | 4 ++- 2 files changed, 116 insertions(+), 1 deletions(-) commit a0df6fa696d44533adec1ecec7398e851b2eb37a Author: Carl Worth Date: Tue Apr 25 07:07:48 2006 -0700 Update PS and PDF reference images for change in font options test/show-text-current-point-pdf-argb32-ref.png | Bin 2143 -> 3838 bytes test/show-text-current-point-ps-argb32-ref.png | Bin 638 -> 645 bytes test/text-antialias-gray-pdf-argb32-ref.png | Bin 945 -> 1004 bytes test/text-antialias-gray-ps-argb32-ref.png | Bin 305 -> 306 bytes test/text-antialias-none-pdf-argb32-ref.png | Bin 945 -> 1004 bytes test/text-antialias-none-ps-argb32-ref.png | Bin 305 -> 306 bytes test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 945 -> 1004 bytes test/text-antialias-subpixel-ps-argb32-ref.png | Bin 305 -> 306 bytes 8 files changed, 0 insertions(+), 0 deletions(-) commit 6237437f412d9d007e1c49c33f6e81117b612d39 Merge: 22ab0e5... f1c3754... Author: Carl Worth Date: Tue Apr 25 07:02:41 2006 -0700 Merge branch 'behdad-colored-fails' into cairo commit f1c37547530c0c6c134526ea4bac7d11013160f1 Author: Behdad Esfahbod Date: Tue Apr 25 09:58:48 2006 -0400 Use white on red for failures. test/cairo-test.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9668b6592f805b6e05f9e75354956e4119483b6a Author: Behdad Esfahbod Date: Tue Apr 25 09:03:26 2006 -0400 Set background color to red for test failures printing on a terminal. test/cairo-test.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit 22ab0e5f1615e28f77d8dc0c8a26929e0f0279b6 Author: Carl Worth Date: Tue Apr 25 05:44:08 2006 -0700 Fix default font options for PS and PDF backends. The paginated surface layer was missing its get_font_options function. It now defers to the target surface. The PDF backend already had a get_font_options function, but the PS backend was also missing it. This should fix the problem with 72DPI hinting seen in glyph paths in PostScript output. Thanks to Owen Taylor for identifying this problem and the correct fix. src/cairo-paginated-surface.c | 11 ++++++++++- src/cairo-pdf-surface.c | 6 +++--- src/cairo-ps-surface.c | 12 +++++++++++- 3 files changed, 24 insertions(+), 5 deletions(-) commit 6723547f0035e6c41abee165ebefb7406e40b7d8 Merge: 8d635a3... e912512... Author: Behdad Esfahbod Date: Tue Apr 25 08:28:59 2006 -0400 Merge branch 'configure-backends' commit e912512c6ddff517f3afa4635bbaa81a869475c8 Author: Behdad Esfahbod Date: Tue Apr 25 08:26:35 2006 -0400 Better message when backends are disabled. configure.in | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 05fc4ca32363366a3637443d525834bc91b5203d Author: Behdad Esfahbod Date: Tue Apr 25 07:30:16 2006 -0400 Unified handling of --enable-backend options. configure.in | 203 +++++++++++++++++++++++++++------------------------------ 1 files changed, 96 insertions(+), 107 deletions(-) commit 8d635a3aa967b16de5047eceadf3d350d1169a76 Author: Keith Packard Date: Tue Apr 25 04:04:10 2006 -0700 PDF: Execute entire path in user coordinates when stroking so that line params are interpreted correctly src/cairo-pdf-surface.c | 95 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 86 insertions(+), 9 deletions(-) commit 134c508bf04d8674af632644095b78256f2e350d Author: Carl Worth Date: Tue Apr 25 03:45:37 2006 -0700 PDF: Add SMask output and simplify analysis to support all OVER operations. With this SMask support, the PDF backend is now able to handle a very large subset of the things that are likely to be thrown at it in common operation, (for example, when handling images and text from web pages). src/cairo-pdf-surface.c | 289 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 199 insertions(+), 90 deletions(-) commit c0721190438826d7222ed87c36b4e48e57ad0323 Author: Carl Worth Date: Tue Apr 25 02:33:18 2006 -0700 PDF: Remove unused backend functions. Since the switch to using paginated, we have a guarantee that the following functions will never be called. So we drop them now: _cairo_pdf_surface_composite _cairo_pdf_surface_fill_rectangles _cairo_pdf_surface_composite_trapezoids _cairo_pdf_surface_old_show_glyphs src/cairo-pdf-surface.c | 366 +---------------------------------------------- 1 files changed, 4 insertions(+), 362 deletions(-) commit bef621e870e3d4038e00ed56ad40d726d5a7ca77 Author: Carl Worth Date: Tue Apr 25 01:56:51 2006 -0700 Augment tests to do better testing of paths/images with alpha. Add a new cairo_test_paint_checkered function so that tests that draw with alpha can easily put an easy-to-see checkered background in place first. Add new tests caps-joins-alpha and paint-source-alpha that do simple tests of strokes and image painting with source pattern alpha. Also, add the checkered background to paint-with-alpha for consistency. test/.gitignore | 2 + test/Makefile.am | 8 +++ test/cairo-test.c | 45 ++++++++++++++++ test/cairo-test.h | 3 + test/caps-joins-alpha-ref.png | Bin 0 -> 2434 bytes test/caps-joins-alpha-rgb24-ref.png | Bin 0 -> 2283 bytes test/caps-joins-alpha.c | 94 +++++++++++++++++++++++++++++++++ test/paint-source-alpha-ref.png | Bin 0 -> 258 bytes test/paint-source-alpha-rgb24-ref.png | Bin 0 -> 248 bytes test/paint-source-alpha.c | 67 +++++++++++++++++++++++ test/paint-with-alpha-ref.png | Bin 164 -> 268 bytes test/paint-with-alpha-rgb24-ref.png | Bin 142 -> 255 bytes test/paint-with-alpha.c | 9 ++- 13 files changed, 225 insertions(+), 3 deletions(-) commit a5afc59d0ad90125c0593ab60c8e1e01f51bdc3c Author: Carl Worth Date: Mon Apr 24 16:16:19 2006 -0700 Add PDF-specific reference image for scale-source-surface-paint It only fails because the PDF ouput doesn't preserve the NEAREST filter attribute. There might be a way to get something like this in the PDF, but it's not the point of the test. test/scale-source-surface-paint-pdf-argb32-ref.png | Bin 0 -> 152 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 32a7edc42dae507678e4eed98fcb41802b8ee69c Author: Carl Worth Date: Mon Apr 24 16:11:21 2006 -0700 PDF: Fix surface pattern transformation and support for EXTEND_NONE. There's a bunch of careful matrix transformation here needed to resolve the differences between cairo and PDF pattern matrices, (primarily due to the different location for the origin). This fixes the several PDF test suite failures that recently appeared when we switched from ARGB32 to RGB24 source surface patterns. src/cairo-pdf-surface.c | 85 +++++++++++++++++++++++++++++++++++++++------- 1 files changed, 72 insertions(+), 13 deletions(-) commit a1bba71eb9442a1c3a5f9fb227353971d58cecba Author: Carl Worth Date: Mon Apr 24 14:51:31 2006 -0700 Trivial indentation fix test/mask-ctm.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 893239248a9a6ef1a7b9f770aec334f20c5c0861 Author: Carl Worth Date: Mon Apr 24 14:50:52 2006 -0700 Prefer RGB24 over ARGB32 for source surfaces in tests. Some tests were using source surfaces created as ARGB32 even though all alpha values are entirely opaque. This meant these tests were triggering more fallbacks than strictly necessary for what the tests are ttrying to do. test/filter-nearest-offset.c | 2 +- test/move-to-show-surface.c | 2 +- test/paint-with-alpha.c | 2 +- test/scale-source-surface-paint.c | 2 +- test/source-surface-scale-paint.c | 2 +- test/translate-show-surface.c | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) commit 28e25e1cce0a4e4c612743effb8927c5cb6b3c5b Author: Carl Worth Date: Mon Apr 24 12:40:30 2006 -0700 Fix broken error-checking in cairo_{ps,pdf}_surface_set_dpi src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 12c4c375af7efe367bb6128babd14b4c1d05be65 Author: Carl Worth Date: Fri Apr 21 02:46:20 2006 -0700 Fix invalid restore that was causing subsequent pages after first to be inverted src/cairo-pdf-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit e0bf1378044d606273ee876663498878e0b2edd4 Author: Christian Biesinger Date: Sun Apr 23 21:20:55 2006 +0200 Fix create_xcb_surface signature test/cairo-test.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 810d9d19854f671d6a5d985b950d7442e59176e3 Author: Carl Worth Date: Thu Apr 20 10:54:01 2006 -0700 PDF: Fix reference images inadvertently committed as PDF not PNG test/text-antialias-gray-pdf-argb32-ref.png | Bin 7264 -> 945 bytes test/text-antialias-none-pdf-argb32-ref.png | Bin 7264 -> 945 bytes test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 7264 -> 945 bytes 3 files changed, 0 insertions(+), 0 deletions(-) commit 7fa8bfd738f939c06480c40162e347a2ecadd4d6 Author: Carl Worth Date: Thu Apr 20 10:01:45 2006 -0700 PDF: Cleanup error handling of emit_image_rgb_data src/cairo-pdf-surface.c | 37 ++++++++++++++++++++----------------- 1 files changed, 20 insertions(+), 17 deletions(-) commit c5d5687ac09049ca5b942993fc259e54ad5b6721 Author: Carl Worth Date: Wed Apr 19 11:04:37 2006 -0700 PDF: Add simple implementation of _cairo_pdf_surface_show_glyphs (text as paths). This isn't very exciting text output---it simply turns every call to cairo_show_glyphs into a single filled path. But at the very least, text will no longer trigger image fallbacks for the PDF backend. With this commit, the following tests change from all-fallback to all-native for the PDF backend: show-text-current-point text-antialias-gray text-antialias-none text-antialias-subpixel text-cache-crash text-rotate There are rasterization differences in the output (cairo vs. freetype) so this commit also adds new PDF-specific reference images for some of those tests so that the suite continues to report PASS. src/cairo-pdf-surface.c | 27 +++++++- test/show-text-current-point-pdf-argb32-ref.png | Bin 0 -> 2143 bytes test/text-antialias-gray-pdf-argb32-ref.png | 80 +++++++++++++++++++++++ test/text-antialias-none-pdf-argb32-ref.png | 80 +++++++++++++++++++++++ test/text-antialias-subpixel-pdf-argb32-ref.png | 80 +++++++++++++++++++++++ 5 files changed, 264 insertions(+), 3 deletions(-) commit ab2546009ff246bd0e7bbc07437330cf307e00f7 Author: Carl Worth Date: Tue Apr 18 23:31:16 2006 -0700 Use fallbacks in PDF backend for CAIRO_ANTIALIAS_NONE. Perhaps there's a way to preserve that hint in PDF output, but until we have code that actually does that, the correct thing to do is to call it unsupported and let the fallbacks do their thing. With this commit, the two regressions that were recently introduced now pass again. Specifically: rectangle-rounding-error unantialiased-shapes src/cairo-pdf-surface.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-) commit 241c6480cd9a5f63ea67f8cb1407f22503697ca3 Author: Carl Worth Date: Tue Apr 18 23:24:14 2006 -0700 Add implementation of _cairo_pdf_surface_paint (and fix emit_surface_pattern). Fix general broken-ness in emit_surface_pattern, enough so that a new implementation of _cairo_pdf_surface_paint does something useful. With this commit, the following tests switch from all-fallback to all-native and still pass the test suite with flying colors: caps-joins caps-sub-paths clip-fill-rule clip-fill-rule-pixel-aligned clip-nesting clip-twice dash-caps-joins dash-offset-negative leaky-polygon line-width paint path-data transforms Meanwhile, the following two tests also switch from fallback to native, but cause the test suite to complain about failures. These both look like a mostly harmless failure to respect the ANTIALIAS_NONE hint in the PDF output: rectangle-rounding-error-pdf-argb32-out.pdf unantialiased-shapes-pdf-argb32-out.pdf src/cairo-pdf-surface.c | 65 +++++++++++++++++++++++++++++++++------------- 1 files changed, 46 insertions(+), 19 deletions(-) commit 8be1697f2bd8026b28f2f24c2fab967ee01b6d8c Author: Carl Worth Date: Tue Apr 18 23:18:39 2006 -0700 Fix stale code in comment. src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a98b44a1deab5fd15607b50df63189a74a269909 Author: Christian Biesinger Date: Wed Apr 19 02:34:24 2006 +0200 Fixing bad merge The merge in 66ed9811cc542d99cb5a6b6b792c9a9f0832fbf9 re-added this line, which makes cairo link to C++ libraries even on non-BeOS systems. This was originally fixed in 69acfa6576e8d2b97e3e3b8c06badf5486ae0315 src/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit b1b699593b820ac4e011f89ad700f052b2f20205 Author: Carl Worth Date: Tue Apr 18 16:53:23 2006 -0700 Add support for _cairo_pdf_surface_stroke. Generalize all functions that emit a source pattern to emit both for the stroking and non-stroking PDF properties. Also add an implementation of _cairo_pdf_surface_stroke. With this commit in place, the following tests change from all-fallback to all-native output while no tests report any new failures: dash-zero-legnth fill-and-stroke multi-page new-sub-path rel-path self-intersecting src/cairo-pdf-surface.c | 144 ++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 130 insertions(+), 14 deletions(-) commit efbe40bb8f770fbf60de794488803d3edacd7ed6 Author: Christian Biesinger Date: Wed Apr 19 00:29:48 2006 +0200 Use calloc rather than malloc+memset pixman/src/icpixels.c | 3 +-- pixman/src/ictrap.c | 6 +----- src/cairo-glitz-surface.c | 4 +--- 3 files changed, 3 insertions(+), 10 deletions(-) commit eadb26a1c13da1af292f0262e108878133cbadf0 Author: Carl Worth Date: Tue Apr 18 15:19:36 2006 -0700 Add new PS-specific reference image for new-sub-path. test/new-sub-path-ps-argb32-ref.png | Bin 0 -> 316 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 448e904b2a64769aa9cfd8ea011c2b5fb6ec883b Merge: cb77876... ffab259... Author: Carl Worth Date: Tue Apr 18 15:18:31 2006 -0700 Merge branch 'cairo' into new-sub-path Conflicts: src/cairo-path-stroke.c src/cairo-pdf-surface.c src/cairo-ps-surface.c commit ffab2592fc5d0ccd498aff2f4e645eefe351b61b Author: Emmanuel Pacaud Date: Tue Apr 18 21:52:06 2006 +0200 Clear completely the temporary surface between each subtest in mask.c That helps SVG backend to pass this test, since CAIRO_OPERATOR_CLEAR on a part of a surface use "comp-op" element which is not supported with current librsvg. test/mask.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) commit 9c65dee86b469c1eedf2690334d5a2b4afc849c8 Merge: 36fb36f... 3f84df9... Author: Emmanuel Pacaud Date: Tue Apr 18 21:23:59 2006 +0200 Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo commit 36fb36fe8c4d8b2ac2b2de3f53842ae196bdca04 Author: Emmanuel Pacaud Date: Tue Apr 18 21:22:58 2006 +0200 SVG: Add validating ref file for unantialias tests. Antialias property is not directly supported by SVG, and probably not the most wanted feature. In the future, we could use an image fallback in order to emulate it, or try to use text-rendering, shape-rendering and image-rendering properties (http://www.w3.org/TR/SVG/painting.html#RenderingProperties). test/text-antialias-none-svg-argb32-ref.png | Bin 0 -> 1077 bytes test/text-antialias-none-svg-rgb24-ref.png | Bin 0 -> 1077 bytes test/text-antialias-subpixel-svg-argb32-ref.png | Bin 0 -> 1077 bytes test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 0 -> 1077 bytes test/unantialiased-shapes-svg-argb32-ref.png | Bin 0 -> 19689 bytes test/unantialiased-shapes-svg-rgb24-ref.png | Bin 0 -> 19689 bytes 6 files changed, 0 insertions(+), 0 deletions(-) commit 3f84df97ddd639c9e1d3706be7c9c86eba22c5bb Author: Carl Worth Date: Tue Apr 18 11:31:59 2006 -0700 Enable real analysis for _cairo_pdf_surface_paint. After this patch we have three PDF tests passing with native output: clip-all fill-rule nil-surface src/cairo-pdf-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 55 insertions(+), 6 deletions(-) commit 170a028bfa00286324d8598d831e570d868a26f1 Author: Emmanuel Pacaud Date: Mon Apr 17 23:26:30 2006 +0200 SVG: Fix mask and try to support CAIRO_CONTENT_ALPHA. Cairo and SVG differ in their implementation of mask. Cairo only uses alpha channel where SVG uses all channels. So, before using a surface for masking, we use a filter that sets RGB channels to 1.0. Support for CAIRO_CONTENT_ALPHA is similar and use the same filter when a SVG alpha surface is composited. src/cairo-svg-surface.c | 49 ++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 44 insertions(+), 5 deletions(-) commit 9e2a2ea0da93065c46a6d6249f98a319ee6158dd Author: Emmanuel Pacaud Date: Mon Apr 17 11:07:15 2006 +0200 SVG: Don't insert /n/r in base64 encoded image data That doesn't work since libxml replace them by They were intended to ease readability of generated files. src/cairo-svg-surface.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) commit c01805bafd5ad68263a3e644787cd7c04838124b Author: Emmanuel Pacaud Date: Mon Apr 17 10:21:50 2006 +0200 SVG: Don't check for content type in create_similar, and mark surface as modified when clearing it. src/cairo-svg-surface.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit 62d2f7cbf3718cfc982286ec62878c9d6eff09fa Author: Emmanuel Pacaud Date: Mon Apr 17 09:54:03 2006 +0200 SVG: Return UNTESTED for test involving operators. unbounded-operator, operator-clear, operator-source, clip-operator test/cairo-test.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-) commit 347083b3f0be2f07d1953278b8516774253752f1 Author: Emmanuel Pacaud Date: Sun Apr 16 16:00:27 2006 +0200 SVG: Add reference files for antialiased text tests. Currently, text are rendered as paths in SVG files, so, when rendered to png through librsvg, they don't match general reference images. test/show-text-current-point-svg-argb32-ref.png | Bin 0 -> 4236 bytes test/show-text-current-point-svg-rgb24-ref.png | Bin 0 -> 4236 bytes test/text-antialias-gray-svg-argb32-ref.png | Bin 0 -> 1077 bytes test/text-antialias-gray-svg-rgb24-ref.png | Bin 0 -> 1077 bytes test/text-pattern-svg-argb32-ref.png | Bin 0 -> 2643 bytes test/text-pattern-svg-rgb24-ref.png | Bin 0 -> 2428 bytes 6 files changed, 0 insertions(+), 0 deletions(-) commit 714bb88832f0e6324cd4737aaa37a4ba39f8d14e Author: Emmanuel Pacaud Date: Sun Apr 16 15:42:49 2006 +0200 SVG: Add support for CAIRO_CONTENT_COLOR in create_similar. Also add support for testing this feature in test/cairo-test.c And a bunch of unwanted commit of sgml files. doc/public/tmpl/cairo-beos.sgml | 3 + doc/public/tmpl/cairo-font-options.sgml | 3 + doc/public/tmpl/cairo-font.sgml | 3 + doc/public/tmpl/cairo-ft.sgml | 3 + doc/public/tmpl/cairo-glitz.sgml | 3 + doc/public/tmpl/cairo-image.sgml | 3 + doc/public/tmpl/cairo-matrix.sgml | 3 + doc/public/tmpl/cairo-paths.sgml | 3 + doc/public/tmpl/cairo-pattern.sgml | 3 + doc/public/tmpl/cairo-pdf.sgml | 3 + doc/public/tmpl/cairo-png.sgml | 3 + doc/public/tmpl/cairo-ps.sgml | 3 + doc/public/tmpl/cairo-quartz.sgml | 3 + doc/public/tmpl/cairo-scaled-font.sgml | 3 + doc/public/tmpl/cairo-status.sgml | 3 + doc/public/tmpl/cairo-surface.sgml | 3 + doc/public/tmpl/cairo-text.sgml | 3 + doc/public/tmpl/cairo-transforms.sgml | 3 + doc/public/tmpl/cairo-types.sgml | 3 + doc/public/tmpl/cairo-version.sgml | 3 + doc/public/tmpl/cairo-win32-fonts.sgml | 3 + doc/public/tmpl/cairo-win32.sgml | 3 + doc/public/tmpl/cairo-xcb-xrender.sgml | 3 + doc/public/tmpl/cairo-xcb.sgml | 3 + doc/public/tmpl/cairo-xlib-xrender.sgml | 3 + doc/public/tmpl/cairo-xlib.sgml | 3 + doc/public/tmpl/cairo.sgml | 3 + src/cairo-svg-surface.c | 69 ++++++++++++++++++++++++------- test/cairo-test.c | 36 ++++++++++++++-- 29 files changed, 167 insertions(+), 19 deletions(-) commit d0356a87f7b274a0721c2644c4a62a8424923eb9 Author: Behdad Esfahbod Date: Sat Apr 15 03:58:42 2006 -0400 Implement cairo_set_scaled_font(). doc/public/tmpl/cairo-beos.sgml | 3 -- doc/public/tmpl/cairo-font-options.sgml | 3 -- doc/public/tmpl/cairo-font.sgml | 3 -- doc/public/tmpl/cairo-ft.sgml | 3 -- doc/public/tmpl/cairo-glitz.sgml | 3 -- doc/public/tmpl/cairo-image.sgml | 3 -- doc/public/tmpl/cairo-matrix.sgml | 3 -- doc/public/tmpl/cairo-paths.sgml | 3 -- doc/public/tmpl/cairo-pattern.sgml | 3 -- doc/public/tmpl/cairo-pdf.sgml | 3 -- doc/public/tmpl/cairo-png.sgml | 3 -- doc/public/tmpl/cairo-ps.sgml | 3 -- doc/public/tmpl/cairo-quartz.sgml | 3 -- doc/public/tmpl/cairo-scaled-font.sgml | 3 -- doc/public/tmpl/cairo-status.sgml | 3 -- doc/public/tmpl/cairo-surface.sgml | 3 -- doc/public/tmpl/cairo-text.sgml | 3 -- doc/public/tmpl/cairo-transforms.sgml | 3 -- doc/public/tmpl/cairo-types.sgml | 3 -- doc/public/tmpl/cairo-version.sgml | 3 -- doc/public/tmpl/cairo-win32-fonts.sgml | 3 -- doc/public/tmpl/cairo-win32.sgml | 3 -- doc/public/tmpl/cairo-xcb-xrender.sgml | 3 -- doc/public/tmpl/cairo-xcb.sgml | 3 -- doc/public/tmpl/cairo-xlib-xrender.sgml | 3 -- doc/public/tmpl/cairo-xlib.sgml | 3 -- doc/public/tmpl/cairo.sgml | 3 -- src/cairo.c | 40 +++++++++++++++++++++++++++++++ src/cairo.h | 4 +++ 29 files changed, 44 insertions(+), 81 deletions(-) commit db111197ac436ace0c3aceb88a6d7c1abca03b02 Author: Carl Worth Date: Fri Apr 14 17:29:19 2006 -0700 Fix _cairo_surface_is_opaque to return FALSE not TRUE for non-image surfaces. src/cairo-surface.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit e890bfd2bf04a973ead9f5d53d06728165faa28d Author: Carl Worth Date: Fri Apr 14 17:26:23 2006 -0700 Ignore dash-zero-length test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit b7309d065e49ae73ff8d90feca35f6b8f35922d2 Author: Carl Worth Date: Fri Apr 14 17:25:54 2006 -0700 Farm out the surface and pattern analysis functions away from cairo-ps-surface.c. We're setting things up here for better sharing as PDF surface (and others) now want to do some of the same analysis. src/cairo-pattern.c | 44 ++++++++++++++++++++++++++++- src/cairo-pdf-surface.c | 6 +++- src/cairo-ps-surface.c | 69 +---------------------------------------------- src/cairo-surface.c | 28 +++++++++++++++++++ src/cairoint.h | 8 +++++- 5 files changed, 83 insertions(+), 72 deletions(-) commit a7f4f1b350e158eca394da63eed0e14a97480a5a Author: Carl Worth Date: Fri Apr 14 17:03:39 2006 -0700 Move analysis of operators from cairo-ps-surface.c to cairo-operator.c src/Makefile.am | 1 + src/cairo-operator.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-ps-surface.c | 73 ++--------------------------- src/cairoint.h | 7 +++ 4 files changed, 132 insertions(+), 68 deletions(-) commit c7fd35fac2bc7c93e85ccbe50b20529ae4d9479d Author: Carl Worth Date: Fri Apr 14 16:50:16 2006 -0700 Add tests for PAGINATED_MODE_ANALYZE to PDF (no real analysis yet) src/cairo-pdf-surface.c | 39 +++++++++++++++++++++++++++++++++++---- 1 files changed, 35 insertions(+), 4 deletions(-) commit 0e44e798b5f6fd58cc586e40f926d363cd8fff50 Author: Dom Lachowicz Date: Fri Apr 14 16:15:29 2006 -0700 Change cairo_image_surface_create to zero out surface contents. This closes bug #5816: Image surfaces do not start out blank by default https://bugs.freedesktop.org/show_bug.cgi?id=5816 This also fixes all of the test suite failures introduced by moving the CLEAR on blank page optimization up to the paginated surface from the PS surface. pixman/src/icpixels.c | 1 + src/cairo-image-surface.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) commit e8a0da637fda4a29281cfb4f463169e51c300c42 Author: Carl Worth Date: Fri Apr 14 16:18:36 2006 -0700 Move optimization of CLEAR on blank page up from PS to paginated surface. src/cairo-paginated-surface-private.h | 8 ++++++++ src/cairo-paginated-surface.c | 30 ++++++++++++++++++++++++++++++ src/cairo-ps-surface.c | 27 --------------------------- 3 files changed, 38 insertions(+), 27 deletions(-) commit b8fb8dc375d2828a962bac2e1f50f44d8ec8cbee Author: Carl Worth Date: Fri Apr 14 15:23:30 2006 -0700 Add stub implementations of drawing operations for the PDF backend. These new stubs explicitly return UNSUPPORTED unconditionally. This is no different than the implicit UNSUPPORTED which the analysis surface was inferring from NULL for 4 of the functions before. However, _cairo_pdf_surface_fill was actually trying to draw things, but without correctly characterizing it during the analysis stage. This was just an oversight, as the PDF surface was always triggereing full page fall backs anway due to the initial unsupported paint with CLEAR. Now, we explicitly return UNSUPPORTED for all drawing operations so we get image fallbacks by design and not by accident. src/cairo-pdf-surface.c | 160 ++++++++++++++++++++++++++++++----------------- 1 files changed, 103 insertions(+), 57 deletions(-) commit 2726f684547de7d381e56dce13bb7c025cd75b80 Author: Carl Worth Date: Fri Apr 14 14:53:13 2006 -0700 Update documentation of cairo_paginated_surface src/cairo-paginated-surface-private.h | 12 ++++++++++++ src/cairo-paginated-surface.c | 29 ++--------------------------- 2 files changed, 14 insertions(+), 27 deletions(-) commit 8d3a800b82ccd4a39bf04cc1d602eb84d90f81d1 Author: Carl Worth Date: Fri Apr 14 14:46:59 2006 -0700 Add a start_page function to the paginated_surface_backend. This allows for any surface using the paginated_surface backend to easily do stuff at the beginning of each page, (such as writing out any per-page header necessary). This replaces some of the per-page state tracking that the PS surface was doing, (though it still has some left for its optimization of CLEAR on a blank page). src/cairo-paginated-surface-private.h | 60 ++++++++++++++++++++++++- src/cairo-paginated-surface.c | 19 ++++++++ src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 78 ++++++++++++++------------------- src/test-paginated-surface.c | 1 + 5 files changed, 112 insertions(+), 47 deletions(-) commit 687802cca67ce4157725316d769fc28bc75f5dcd Author: Carl Worth Date: Fri Apr 14 14:44:16 2006 -0700 Obnoxious churn of gtk-doc templates. We really need to get these built files out from under version control, (or else abandon gtk-doc altogether). doc/public/tmpl/cairo-svg.sgml | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit d284c2b5a475ff1672dad10e7bf76763877690a3 Author: Emmanuel Pacaud Date: Fri Apr 14 23:11:35 2006 +0200 SVG: enable SVG backend API documentation in /doc doc/public/cairo-docs.xml | 1 + doc/public/cairo-sections.txt | 8 ++++++ doc/public/tmpl/cairo-svg.sgml | 54 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 0 deletions(-) commit b9eb4f018e77a3f797116f0915f261d8453b3993 Author: Emmanuel Pacaud Date: Fri Apr 14 22:55:48 2006 +0200 PDF: Fix typo in documentation. src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e952e0aff89412e67fb72ba2cf3a30c3ddd332b4 Author: Emmanuel Pacaud Date: Fri Apr 14 22:53:58 2006 +0200 SVG: Add documentation for public API. Fix test filenames and add testing of CAIRO_CONTENT_COLOR src/cairo-svg-surface.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ test/cairo-test.c | 6 +++++- 2 files changed, 52 insertions(+), 1 deletions(-) commit f919ba858f405aa5c1cc64e7c25c3de5ffbce88f Author: Emmanuel Pacaud Date: Fri Apr 14 22:06:28 2006 +0200 SVG: Emulate CLEAR and SOURCE operators on paint call when no clipping region is defined. src/cairo-svg-surface.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit 8f3c60096d88b3c0368970273828e7a011c5e9dd Author: Carl Worth Date: Fri Apr 14 11:33:48 2006 -0700 Add a new cairo_paginated_surface_backend_t rather than just a single function pointer. src/cairo-paginated-surface-private.h | 17 ++++++++++------- src/cairo-paginated-surface.c | 29 +++++++++++++++-------------- src/cairo-pdf-surface.c | 17 +++++++++-------- src/cairo-ps-surface.c | 27 ++++++++++++++------------- src/test-paginated-surface.c | 25 +++++++++++++++---------- 5 files changed, 63 insertions(+), 52 deletions(-) commit 5461f25df9888aa5fd79e1e371cd1af2cf8964ab Author: Carl Worth Date: Fri Apr 14 11:01:39 2006 -0700 Fix _composite_trap_region to restore the original clip when done. src/cairo-surface-fallback.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit c81569d2f1b8c396f789f4c49d87772a596862d9 Author: Carl Worth Date: Fri Apr 14 10:38:11 2006 -0700 Flesh test-paginated-surface out into a complete surface. This adds an aactual test_paginated_surface_backend rather than just having this test surface create a paginated surface around an image surface. This is a more realistic test of what a paginated surface is and should be more useful as an example of how to use the paginated surface, (and in particular the analysis portions). src/cairo-image-surface.c | 2 +- src/cairoint.h | 13 +++ src/test-paginated-surface.c | 219 +++++++++++++++++++++++++++++++++++++++--- test/cairo-test.c | 4 +- 4 files changed, 222 insertions(+), 16 deletions(-) commit 41dc06d7111d246d4b5802c700a83e4be9091449 Author: Carl Worth Date: Fri Apr 14 10:08:31 2006 -0700 Add new PS-specific image for dash-zero-length test. This reference image demonstrates the bug that occurs when we emit zero-length dash segments into a PostScript file with butt caps. test/dash-zero-length-ps-argb32-ref.png | Bin 222 -> 214 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 11b4d24671a0527a45971e9fdf245ac28facc822 Author: Carl Worth Date: Thu Apr 13 12:56:58 2006 -0700 Move cairo_pdf_surface_backend to file end so it's easier to find. src/cairo-pdf-surface.c | 66 +++++++++++++++++++++++----------------------- 1 files changed, 33 insertions(+), 33 deletions(-) commit 2078557c5c9e10cf8ae16fb3fa8a225f908ab528 Author: Jeff Muizelaar Date: Sun Apr 9 23:11:27 2006 -0400 Fix skipping zero length dash segments in dash_start. The extra check makes sure zero length segments are not skipped when computing the dash start state. This is needed so that we get proper line capping if, for example, the first dash segment has zero length and we have a dash offset of zero. src/cairo-path-stroke.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 5eaf71e77bd975f5865cc059b4aa4d57c096688e Author: Jeff Muizelaar Date: Sun Apr 9 23:11:11 2006 -0400 Move the test for zero length sub edges below the computation of faces. Face computation still works if a line has zero length, all that is needed is a slope and a point. This patch fixes bug #5561 because the faces are initialized even if the segment has zero length as expected by _cairo_stroker_line_to_dashed. src/cairo-path-stroke.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 20fca01a2cc539df017e442be0cc6ad35353571f Author: Jeff Muizelaar Date: Sun Apr 9 23:10:59 2006 -0400 Move calculation of slope outside of _cairo_stroker_add_sub_edge. This makes the slope calculation more accurate for dashed lines by computing it once for the entire line instead for each individual dash segment. It also adjusts stroker_line_to() to match the new convention for stroker_add_sub_edge(). src/cairo-path-stroke.c | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) commit 8a2ea660fb59beb4eacaf73978368c8db7a6b584 Author: Jeff Muizelaar Date: Sun Apr 9 23:10:46 2006 -0400 Check for zero length dashed lines. This makes line_to_dashed more like line_to by returning immediately on degenerate paths. This is needed so that we can do the slope calculation for the entire line. src/cairo-path-stroke.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit 584109d5e6160c1e74da0e79b6e024701a354293 Author: Jeff Muizelaar Date: Sun Apr 9 23:11:47 2006 -0400 Add test case for dashed lines. The new test case tests a variety of circumstances involved with zero length dashing. test/Makefile.am | 4 ++ test/dash-zero-length-ps-argb32-ref.png | Bin 0 -> 222 bytes test/dash-zero-length-ref.png | Bin 0 -> 235 bytes test/dash-zero-length-rgb24-ref.png | Bin 0 -> 222 bytes test/dash-zero-length.c | 88 +++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 0 deletions(-) commit f17b347ab443fcc12f9098f9b601334f85d20a30 Author: Carl Worth Date: Thu Apr 13 07:59:52 2006 -0700 Fix page numbers in PostScript output to start at 1 src/cairo-ps-surface.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 6beababd47aabfb4896a878de09d729f287aa714 Author: Carl Worth Date: Wed Apr 12 16:19:08 2006 -0700 Optimize PostScript file size with procedures instead of builtin operators. This is based on a suggestion by Michael Sweet. src/cairo-ps-surface.c | 42 +++++++++++++++++++++++++++--------------- 1 files changed, 27 insertions(+), 15 deletions(-) commit d60eaab222fb1ce19ef7bbbf496ad444f07aa703 Author: Carl Worth Date: Wed Apr 12 15:48:59 2006 -0700 Add simple word wrapping to keep PostScript output within 80 columns or less. src/cairo-ps-surface.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 109 insertions(+), 0 deletions(-) commit 6a5d8fc7ffb5f425ceffd313b8a875f38126b324 Merge: b30e281... 0727e3c... Author: Carl Worth Date: Wed Apr 12 14:15:08 2006 -0700 Merge branch 'ps-type3' into cairo (no bitmap support for type 3 yet). Conflicts: src/cairo-hash.c src/cairo-ps-surface.c commit b30e281627d86f3c0d0f4d5008bbbf7e77c09350 Author: Carl Worth Date: Wed Apr 12 13:55:24 2006 -0700 Add documentation for _cairo_output_stream_create_for_file. src/cairoint.h | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 193b43001de11945b0ae7ca4ee685590d9f79137 Author: Carl Worth Date: Wed Apr 12 14:06:26 2006 -0700 Propagate stream status values through _cairo_ps_surface_finish src/cairo-ps-surface.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit d9137e56b6a8f1ddb44a01bf34301117b0696f0b Author: Carl Worth Date: Wed Apr 12 13:44:14 2006 -0700 Use ferror to get error checking for stdio-based output streams. src/cairo-output-stream.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) commit 32994379db92ef8208ba11b825b1246e2b442566 Author: Carl Worth Date: Wed Apr 12 13:40:05 2006 -0700 Fix missing argument to printf in _cairo_ps_surface_stat_page src/cairo-ps-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 5444aa55b35aff7d6cff8b5e8a5ab020711562ac Author: Carl Worth Date: Wed Apr 12 13:34:03 2006 -0700 Clean up output_stream error handling in _cairo_ps_surface_create. We teach the output stream to catch a NULL file error here, which allows for less checking in ps_surface_create. We also fix the ps surface code to look for the status of a nil stream rather than checking for NULL. src/cairo-output-stream.c | 3 +++ src/cairo-ps-surface.c | 23 ++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) commit a7abf8e4513a7ca03cdb7db6f80a438a4897d208 Merge: 0386a72... ade195c... Author: Carl Worth Date: Wed Apr 12 12:54:28 2006 -0700 Merge 'Save PS output in temp file' from ps-type3 branch commit 0386a728957bdb3549da8e772c31b86295175a4b Author: Carl Worth Date: Wed Apr 12 11:06:06 2006 -0700 Add some documentation to string_array_stream src/cairo-ps-surface.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit 39592788b38a8e8db5335d836a8eaa7ace08fc1c Author: Carl Worth Date: Wed Apr 12 10:56:42 2006 -0700 Print both page label and number in PostScript %%Page headers. src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 523f9e46d87392a539c26ade18d99a3db7ed833d Author: Kristian Høgsberg Date: Tue Apr 11 20:49:55 2006 -0400 Make cairo_t and cairo_output_stream_t destructors handle NULL. All other cairo destructors and reference functions accept and ignore NULL, so fix up cairo_destroy(), cairo_reference(), and cairo_output_stream_destroy() to do so too. src/cairo-output-stream.c | 3 +++ src/cairo.c | 6 ++++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 6e77a0e248c337bf3f39c0de239a7743c6969efe Author: Keith Packard Date: Tue Apr 11 12:28:41 2006 -0700 Allow hash entry deletion during cairo_hash_foreach I discovered that _cairo_hash_table_foreach walks over the hash table without preventing it from being resized as a result of deletions occuring from the callback. Kinda nasty when you're trying to free everything from a hash table. It was also easy to fix; just prevent the table from being resized while iterating and clean it up after the iteration is completed. src/cairo-hash.c | 43 ++++++++++++++++++++++++++++++++++++++----- 1 files changed, 38 insertions(+), 5 deletions(-) commit 9231ab40437e70818c9525fa9648ff7a5d11e44a Merge: 1e5f5ae... baa3436... Author: Anders Carlsson Date: Tue Apr 11 01:09:30 2006 +0200 Merge with git+ssh://git.cairographics.org/git/cairo commit 1e5f5aed07137d3a823c2d22e29eb0e53e359fef Author: Anders Carlsson Date: Tue Apr 11 01:07:33 2006 +0200 Make the API more like Vlad's new API.# src/cairo-quartz-private.h | 2 +- src/cairo-quartz-surface.c | 11 ++++++----- src/cairo-quartz.h | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) commit 3ed576522df8a4e41e856a500539ca3e6f69e2da Author: Anders Carlsson Date: Mon Apr 10 22:29:51 2006 +0200 Remove unused function src/cairo-quartz-surface.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) commit 8ba59b0336ddc581c8f43b4aa5cf9acdb2c001ad Author: Anders Carlsson Date: Mon Apr 10 22:24:02 2006 +0200 Rework the quartz backend to not always hold an image but instead to create it on demand.# src/cairo-quartz-private.h | 8 +- src/cairo-quartz-surface.c | 220 ++++++++++++++++++++++---------------------- 2 files changed, 111 insertions(+), 117 deletions(-) commit df3c02c9ca0c704df3960416fbe689af0cedf2fa Author: Anders Carlsson Date: Mon Apr 10 22:23:39 2006 +0200 Don't set can_draw_directly to FALSE. src/cairo-atsui-font.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit baa3436e9d8ea37c1204f752cac78a8cbc891f18 Author: Laxmi Harikumar Date: Mon Apr 10 12:04:01 2006 -0700 Simple fix for build failure on DEC/OSF1. Apparently this platform also requires inttypes.h rather than stdint.h. This should fix the bug reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=331428 pixman/src/pixman.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 08b109fb9a8c54f4764fe7a94ce7833e832bc157 Author: Carl Worth Date: Mon Apr 10 11:00:26 2006 -0700 Add new ps-specific reference image for dash-caps-joins test. With the recent fix to the treatment of sub-paths with respect to dashing, this test is now correct except for slight difference in ghostscript vs. cairo rasterization. This commit records the ghostscript output as the new reference image against which the ps output should be tested. test/dash-caps-joins-ps-argb32-ref.png | Bin 0 -> 1247 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 65e706ee14b9bfbc2ce0e83b35a813d51d97592f Author: Jeff Muizelaar Date: Sun Apr 9 23:13:36 2006 -0400 Reset dashing for new subpaths. Fixes the bug mentioned in b87726ee2aa0220b66ee4d97513c0ac89ffc4621 by reseting the dash pattern for each new subpath. This is correct behaviour according to the end of PDF Reference v1.6 section 4.3.2. This commit now makes the dash-caps-joins test case pass for all backends except for the PostScript backend. src/cairo-path-stroke.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) commit f02aacbb5f8068f6b0101b3200bd3a0d73746dd4 Author: Carl Worth Date: Mon Apr 10 10:54:24 2006 -0700 Update dash-caps-joins test cases to show independent dashing of sub-paths. We would like to be compatible with PostScript/PDF dash semantics. And according to the description of the setdash operator in section 8.2 of the PostScript Language Reference Manual, (as well as the description of the line dash pattern in section 4.3.2 of the PDF Reference), each sub-path should be treated independently with respect to dashing. With this change, this test now fails for most backends for which it previously passed. test/dash-caps-joins-ref.png | Bin 3219 -> 2583 bytes test/dash-caps-joins-rgb24-ref.png | Bin 2946 -> 2465 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 807f64d57c616e2ce8a61202cd9b59ac7a6a26cb Merge: 5ee26e3... 732e062... Author: Anders Carlsson Date: Mon Apr 10 19:32:47 2006 +0200 Merge with git+ssh://git.cairographics.org/git/cairo commit 5ee26e3b0eec85ac2e9c07d828eae0c8e1a57364 Author: Anders Carlsson Date: Mon Apr 10 19:18:36 2006 +0200 * Save and restore state when drawing glyphs using the short circuit. src/cairo-atsui-font.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 0727e3c1a980f57d48f3dfaee801f05e5395a71a Author: Keith Packard Date: Sun Apr 9 00:38:43 2006 -0700 Use Type3 fonts for PostScript output. No bitmap support yet. src/cairo-ps-surface.c | 737 +++++++++++++++++++++++++++++------------------- 1 files changed, 440 insertions(+), 297 deletions(-) commit da2c5e44abd98f1f1aed4f716b7e9bc97a667058 Author: Keith Packard Date: Sun Apr 9 00:37:58 2006 -0700 Allow hash entry deletion during cairo_hash_foreach src/cairo-hash.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) commit ade195cdba5b0d13c121e44709151bfbb0c44085 Author: Keith Packard Date: Sat Apr 8 21:29:14 2006 -0700 Save PS output in temp file so we can prepend global data (like fonts) src/cairo-output-stream.c | 20 +++++++++++++- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 59 ++++++++++++++++++++++++++++++++++++-------- src/cairo-svg-surface.c | 2 +- src/cairoint.h | 5 +++- 5 files changed, 72 insertions(+), 16 deletions(-) commit 732e06258c81427cf7fedfca98107e21244264eb Author: Carl Worth Date: Fri Apr 7 15:46:32 2006 -0700 Rename write_data to write_func in cairo_output_stream_t. src/cairo-base85-stream.c | 8 ++++---- src/cairo-output-stream.c | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) commit bfd467453c5213341ae2c396ac3d32ba76df8de9 Author: Anders Carlsson Date: Fri Apr 7 17:40:30 2006 +0200 * Fix build * Add shortcut to cairo-atsui-font.c for the common case. src/cairo-atsui-font.c | 148 ++++++++++++++++++++++++------------------- src/cairo-quartz-surface.c | 1 + 2 files changed, 84 insertions(+), 65 deletions(-) commit b87726ee2aa0220b66ee4d97513c0ac89ffc4621 Author: Carl Worth Date: Thu Apr 6 09:43:39 2006 -0700 Tweak initial erase so it doesn't trigger fallbacks for every PS test case. Add an optimization to cairo-ps-surface.c so that it ignores any CAIRO_OPERATOR_CLEAR drawing operation that occurs on a blank page. Also change the test suite to erase with OPERATOR_CLEAR instead of OPERATOR_SOURCE with an all-0 source pattern. With this change, 32 of the 61 test cases change from all-fallback to all-native for the ps backend. Of these 32 test cases, 13 pass the test suite with the original reference images. Another 18 cases differ only in the single-pixel boundary of objects due to cairo vs. ghostscript rasterization differences. We ignore these by adding new ps-specific reference images, (included in this commit). Finally, there appears to be one genuine failure, (dash-caps-joins), in which the PostScript dashes (at least as rendered by ghostscript) differ significantly from the cairo-rendered dashes. src/cairo-ps-surface.c | 69 ++++++++++++++++------- test/cairo-test.c | 3 +- test/caps-joins-ps-argb32-ref.png | Bin 0 -> 995 bytes test/caps-sub-paths-ps-argb32-ref.png | Bin 0 -> 170 bytes test/clip-fill-rule-ps-argb32-ref.png | Bin 0 -> 280 bytes test/clip-nesting-ps-argb32-ref.png | Bin 0 -> 488 bytes test/clip-twice-ps-argb32-ref.png | Bin 0 -> 460 bytes test/dash-offset-negative-ps-argb32-ref.png | Bin 0 -> 170 bytes test/fill-and-stroke-ps-argb32-ref.png | Bin 0 -> 243 bytes test/fill-rule-ps-argb32-ref.png | Bin 0 -> 1078 bytes test/leaky-polygon-ps-argb32-ref.png | Bin 0 -> 233 bytes test/line-width-ps-argb32-ref.png | Bin 0 -> 201 bytes test/path-data-ps-argb32-ref.png | Bin 0 -> 322 bytes test/rectangle-rounding-error-ps-argb32-ref.png | Bin 0 -> 258 bytes test/show-text-current-point-ps-argb32-ref.png | Bin 0 -> 638 bytes test/text-antialias-gray-ps-argb32-ref.png | Bin 0 -> 305 bytes test/text-antialias-none-ps-argb32-ref.png | Bin 0 -> 305 bytes test/text-antialias-subpixel-ps-argb32-ref.png | Bin 0 -> 305 bytes test/transforms-ps-argb32-ref.png | Bin 0 -> 287 bytes test/unantialiased-shapes-ps-argb32-ref.png | Bin 0 -> 4076 bytes 20 files changed, 50 insertions(+), 22 deletions(-) commit c4fc7b06b53c811ddc20def91aaccd756c28a924 Author: Carl Worth Date: Thu Apr 6 08:54:59 2006 -0700 Revert "Use ghostscript's pngalpha rather than png16m target for PS->PNG" This reverts 3b873c66be54522d6cc3f025572a78bbef0efba7 commit. It seemed like a good idea at the time, but... The pngalpha target only gets the fully transparent regions correct. But we still need to get the partially translucent regions correct. The pngalpha target doesn't help here---instead we were already flattening the reference image during testing. And in that case, having anything other than alpha==1 in the output png doesn't really help, (and meanwhile it was tripping up the current buffer_diff code). test/cairo-test.c | 15 ++++++--------- 1 files changed, 6 insertions(+), 9 deletions(-) commit e01047a76a5c44302c24e2ab285cf1b1cd490677 Author: Carl Worth Date: Wed Apr 5 17:15:48 2006 -0700 Build fix for typo from recent commit. test/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 3b873c66be54522d6cc3f025572a78bbef0efba7 Author: Carl Worth Date: Wed Apr 5 17:03:23 2006 -0700 Use ghostscript's pngalpha rather than png16m target for PS->PNG This target allows the output files to actually be transparent where there is no PostScript "ink", which allows for much better testing. test/cairo-test.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) commit 6d5627ca2a5b96edf0b37fe6e16002726f72d86d Author: Carl Worth Date: Wed Apr 5 17:00:13 2006 -0700 Add a call to _cairo_ps_surface_start_page in _cairo_ps_surface_intersect_clip_path. If clipping occurs before any drawing, then we still need to issue a start page call. Otherwise, the clip ends up being inverted since the scaling transformation that puts PostScript into a cairo-oriented coordinate system only happens in start_page. src/cairo-ps-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 341d61cda0247eebd26da1e3b71c43ee8f761833 Author: Carl Worth Date: Wed Apr 5 16:55:51 2006 -0700 Disable show-glyphs-many test to avoid abusing ghostscript too badly. test/Makefile.am | 22 ++++++++++++++++++++-- 1 files changed, 20 insertions(+), 2 deletions(-) commit 5baae7ff21a4236ebc9eaff087eb29fd1432c7ff Author: Emmanuel Pacaud Date: Wed Apr 5 21:24:06 2006 +0200 SVG: Fix typo and stream status handling src/cairo-svg-surface.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit 4fd30e6f402ae031c2084c20f136b84307a128cc Merge: a8e5a77... 66ed981... Author: Carl Worth Date: Tue Apr 4 15:04:36 2006 -0700 Merge branch 'analysis-surface' into cairo commit a8e5a77ad496c1716acdd279d5d5bebf1bc71eee Author: Carl Worth Date: Thu Mar 23 16:02:02 2006 -0800 Add attribution for Bdale Garbee to the AUTHORS file. AUTHORS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 66ed9811cc542d99cb5a6b6b792c9a9f0832fbf9 Merge: edb83e3... 45bbdf9... Author: Carl Worth Date: Tue Apr 4 14:58:52 2006 -0700 Merge branch 'cairo-origin' into analysis-surface With the string-array-stream stuff that this merge picks up, the analysis-surface branch is now passing all of the test suite again. commit 45bbdf94cbac736c9f854012581e8f914a6e27df Author: Carl Worth Date: Tue Apr 4 12:50:44 2006 -0700 Break PostScript image data into chunks that each fit into a string. This solves the problem with the previous commit that made strings longer than the "standard" 65k implementation limit for strings. It's achieved by removing the line-wrapping from the base85 stream and instead adding a new string-array stream between the base85 stream and the output stream (the string-array stream does the line wrapping and enforces the 65k characters per string limit). src/cairo-base85-stream.c | 30 +++------- src/cairo-ps-surface.c | 129 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 124 insertions(+), 35 deletions(-) commit d1134cd7e25a78c70819df879336f895134bafe1 Author: Carl Worth Date: Tue Apr 4 11:21:17 2006 -0700 Emit images into PostScript output as strings rather than inline. This is a baby step toward having shared source patterns in the PostScript output. This patch is based on original work by Keith Packard in the following commit: 06b83b89fc4271060c63b284d7909162b92152f1 One problem with this approach is that it attempts to put an entire image into a PostScript string object. However, PostScript strings are typically limited to 65k bytes. So, as is, this commit causes a few failures for tests in the suite with large output images. src/cairo-ps-surface.c | 58 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 43 insertions(+), 15 deletions(-) commit 0114393a132471cbf87bc3abc2f298b4ca38c69c Author: Carl Worth Date: Tue Apr 4 11:17:25 2006 -0700 Explicitly remove the output png image before creating it during testing. What was happening here is that some backends (such as the PS surface backend) directly generate an output file, and then run a conversion process to generate the png file. Some bugs were such that a broken file would successfully be generated, the conversion would fail (the failure was unnoticed), and the test suite would happily verify the old image from a previously successful run. This fix eliminates this source of false positives. test/cairo-test.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit dd67cf6616c2e819e7e8e4452c1e14e68b4a66bd Author: Carl Worth Date: Tue Apr 4 10:45:38 2006 -0700 Implement proper cairo-style error-handling for cairo_output_stream_t. The cairo_output_stream_t object already had an internal status value, but it was annoyingly returning status values from various functions. It also was missing proper shutdown-on-error as well as nil-create semantics. This fixes those shortcomings and adjusts all callers for the new semantics, (leading to simpler and more correct calling code---particularly in the case of cairo-base85-stream.c). src/cairo-base85-stream.c | 40 ++++++---------------- src/cairo-output-stream.c | 82 +++++++++++++++++++++++++++++--------------- src/cairo-pdf-surface.c | 12 ++++-- src/cairo-ps-surface.c | 27 +++++++-------- src/cairo-svg-surface.c | 16 ++++++-- src/cairoint.h | 35 +++++++++++++++---- 6 files changed, 125 insertions(+), 87 deletions(-) commit 5a06133eb2e13a4c0354dad7f7da414c85733c4e Author: Carl Worth Date: Mon Apr 3 23:44:51 2006 -0700 Implement cairo-base85-stream as a filtering output stream not just a write function. Now _cairo_output_stream_create accepts a new close callback, (which the base85 stream uses to write its trailer). This eliminates the former kludge used to fclose the stdio output streams, and required a bit of touchup to the pdf, ps, and svg-surface usage of streams. src/cairo-base85-stream.c | 142 ++++++++++++++++++++++++++++++++------------- src/cairo-output-stream.c | 52 ++++++++++------ src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 22 +++++-- src/cairo-svg-surface.c | 2 +- src/cairoint.h | 23 +++++-- 6 files changed, 169 insertions(+), 74 deletions(-) commit 57fe9b17b0a1a36acf0d8d524df05215ea48361f Author: Carl Worth Date: Mon Apr 3 15:26:17 2006 -0700 Move base85 code out of cairo-output-stream.c into new cairo-base85-stream.c src/Makefile.am | 1 + src/cairo-base85-stream.c | 98 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-output-stream.c | 63 ----------------------------- 3 files changed, 99 insertions(+), 63 deletions(-) commit 9bdb4f6ff713db0d101a0c0735dbb27e54fd7846 Author: Christian Biesinger Date: Sun Apr 2 15:55:27 2006 +0200 Use more portable shell syntax Reported by Dave Yeo in http://lists.freedesktop.org/archives/cairo/2006-April/006600.html Fixed for the other tests in 0883155111ab9597d335c7d43ae47c163b5c0e4d configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 03eb1b85a906fac4acfbf3ee2839d13ccac97668 Author: Vladimir Vukicevic Date: Fri Mar 10 11:57:41 2006 -0800 [win32] Add missing depth-16 format check (cherry picked from 969d624db8d32d35361bbcc89dbcc354f3d48eaa commit) src/cairo-win32-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6a430478f508361767bff91132c3978234b76e95 Author: Christian Biesinger Date: Tue Mar 14 13:25:51 2006 +0100 Add an assert for the unsupported image surface formats src/cairo-beos-surface.cpp | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8fbd0d448dbdf8f556315366b64abe2468588ea6 Author: Christian Biesinger Date: Mon Mar 27 02:31:51 2006 +0200 Implement create_similar for BeOS src/cairo-beos-surface.cpp | 202 ++++++++++++++++++++++++++++++++++---------- 1 files changed, 158 insertions(+), 44 deletions(-) commit edb83e306bda8a78a8a72006f257922cda7adc69 Author: Carl Worth Date: Fri Mar 24 12:07:21 2006 -0800 cairo-ps-surface: Simplify operation analysis. Introduce a new pattern_operation_analyze function which allows a much simpler idiom to be used by all of the drawing operations. This also provides new assertions that when we are not analyzing we are never called to perform an operation that we would analyze as unsupported. src/cairo-ps-surface.c | 57 +++++++++++++++++++++++++++++------------------ 1 files changed, 35 insertions(+), 22 deletions(-) commit 29dad9867aa5f00f4f38da5da7df6aded794682c Author: Carl Worth Date: Fri Mar 24 11:58:45 2006 -0800 cairo-ps-surface: Don't support meta-surfaces. This isn't ready yet. src/cairo-ps-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 7cee03957b805db55df6f54deef5012535dfa7f4 Author: Carl Worth Date: Fri Mar 24 11:57:18 2006 -0800 cairo-ps-surface: Fix characterization of CLEAR and SOURCE operators. CLEAR should always be considered a translucent operator, while SOURCE is not necessarily always opaque. src/cairo-ps-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 498094027e18fbc8f190a225a87787a5b445e547 Author: Carl Worth Date: Fri Mar 24 11:49:48 2006 -0800 Back out use of meta-surface for similar-paginated-surface. It's not ready yet. src/cairo-paginated-surface.c | 11 +---------- 1 files changed, 1 insertions(+), 10 deletions(-) commit ecb062a6792d39f7ddb670ef35ea89b868e79353 Author: Carl Worth Date: Fri Mar 24 11:48:35 2006 -0800 Update PDF backend for new paginated API so it at least doesn't crash. src/cairo-pdf-surface.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) commit 3259efed7690670754d7c1e76176ff26464111c3 Author: Carl Worth Date: Thu Mar 23 15:36:41 2006 -0800 _cairo_lzw_compress: Remove unused code which we had for testing conformance with the LZW compression from libtiff. src/cairo-lzw.c | 13 ------------- 1 files changed, 0 insertions(+), 13 deletions(-) commit bcfe344608150aa56b1cb37dbc774455bfcf6830 Author: Carl Worth Date: Thu Mar 23 15:27:00 2006 -0800 Optimize the implementation of _cairo_lzw_compress. This switches the implementation of _cairo_lzw_compress from using cairo-hash.c to a custom implementation of the same algorithm that takes advantage of the specific details of what is needed here. This final version now has comparable performance to the libtiff code, but should hopefully be easier to understand. Add a bunch of comments explaining how the various pieces work. src/cairo-lzw.c | 377 ++++++++++++++++++++++++++++++++----------------------- 1 files changed, 217 insertions(+), 160 deletions(-) commit 639c2fe4df880546d71b2c73ea972fb08b609603 Author: Carl Worth Date: Thu Mar 23 15:23:29 2006 -0800 cairo-lzw: Replace LZW code from libtiff with an original implementation. This new implementation is an entirely original work directly from the description of the LZWDecode filter in the PostScript Language Reference, (and in spite of the bugs in the examples provided in that reference). This implementation uses the existing cairo-hash.c for the symbol table. This implementation is somewhat easier to read than the libtiff code, and avoids any code that may have an advertising clause attached. This new implementation is the simplest thing I could implement. It is not as efficient as the libtiff code, (though I did expect better things from cairo-hash.c). src/cairo-lzw.c | 709 ++++++++++++++++++++++--------------------------------- src/cairoint.h | 4 +- 2 files changed, 285 insertions(+), 428 deletions(-) commit ec60bb0a606cadf3120d1cebc88e248a3e056c19 Author: Carl Worth Date: Thu Mar 23 15:00:40 2006 -0800 Rename _cairo_compress_lzw to _cairo_lzw_compress and tighten the parameter list. src/cairo-lzw.c | 8 ++++---- src/cairo-ps-surface.c | 3 ++- src/cairoint.h | 4 +--- 3 files changed, 7 insertions(+), 8 deletions(-) commit cabe94a15c277bb8a5f0c71f25cc8bc9e22ecb41 Author: Carl Worth Date: Wed Mar 22 23:12:23 2006 -0800 Make all hash/cache keys_equal function accept const pointers. src/cairo-cache-private.h | 2 +- src/cairo-font.c | 12 ++++++------ src/cairo-ft-font.c | 12 ++++++------ src/cairo-hash-private.h | 2 +- src/cairo-scaled-font.c | 14 +++++++------- 5 files changed, 21 insertions(+), 21 deletions(-) commit a193f70b94667808f573caa5b82a1bf50281555e Author: Emmanuel Pacaud Date: Wed Mar 22 11:48:44 2006 +0100 SVG: return len in _cairo_svg_document_write when operation succeed. src/cairo-svg-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit ef04471b1b90057c00ec51e1f3d7c7ed4ab1e34c Author: Christian Biesinger Date: Sat Mar 18 18:08:20 2006 +0100 More consistent naming for the BeOS surface functions src/cairo-beos-surface.cpp | 44 ++++++++++++++++++++++---------------------- 1 files changed, 22 insertions(+), 22 deletions(-) commit 69acfa6576e8d2b97e3e3b8c06badf5486ae0315 Author: Christian Biesinger Date: Fri Mar 17 21:26:27 2006 +0100 Don't link to C++ libraries on non-BeOS systems src/Makefile.am | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) commit 0623f8a7d1452c27892f938fe28e6e173e67e136 Merge: 26b06b3... a7f58f8... Author: Behdad Esfahbod Date: Wed Mar 15 15:25:59 2006 -0500 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo commit 26b06b3638ec768da01839cfa3c75e9807b14ee8 Author: Behdad Esfahbod Date: Wed Mar 15 15:17:26 2006 -0500 Clarify that git tag -s does GPG signing. (cherry picked from e94251861565ed154e15ca3a7198ffe3828536fe commit) RELEASING | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit f5013b6dc6442493ea38949fdcc137e5c44b6872 Author: Behdad Esfahbod Date: Wed Mar 15 14:19:08 2006 -0500 Add a release-publish-message target to only get the message. (cherry picked from 98facc6c2d0f57f05de7b98c2aaa592c895d1a09 commit) Makefile.am | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 46e5ed66d3329f1608950d817e7248c91087893a Author: Behdad Esfahbod Date: Wed Mar 15 11:25:02 2006 -0500 Note using "git diff" instead of "git status" as the latter is a bit tricky when it says nothing to commit... (cherry picked from a1621eadb655806de8bb47c2e701de6eaa9d2090 commit) RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f00a1833341699135e792e3a77e19dca0d1dba86 Author: Behdad Esfahbod Date: Wed Mar 15 11:18:40 2006 -0500 Update release infra to reflect git transition. (cherry picked from 508b0be5f2023dabe9561f4ca62481d6a4c8c5ae commit) INSTALL | 2 +- Makefile.am | 4 ++-- RELEASING | 21 +++++++++------------ configure.in | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) commit 037732cac9ff402e51d80d6ed54cc32d669aa0d9 Author: Behdad Esfahbod Date: Wed Mar 15 10:59:59 2006 -0500 Add make bits to autogenerate ChangeLog (cherry picked from 393000021c2e082d4b3c235939009a90035b0daf commit) .gitignore | 1 + Makefile.am | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 0 deletions(-) commit a7f58f886253f4ae66c9b0ed4472f575eaf2ec1d Author: Alexander Larsson Date: Wed Mar 15 10:44:09 2006 -0800 Add LZW image compression and ASCII85 encoding for PostScript image output. * src/Makefile.am: Add cairo-lzw.c to sources Remove erronous space at start of line * src/cairo-lzw.c: New file implementing _cairo_compress_lzw which does Lempel-Ziv & Welch compression as used by postscript. Based on code from libtiff. * src/cairo-output-stream.c: Add _cairo_output_stream_write_base85_string which implements an encoder for the ASCII85Decode postscript filter. * src/cairoint.h: Add _cairo_compress_lzw and _cairo_output_stream_write_base85_string. * src/cairo-ps-surface.c: Write Images LZW + Base85 encoded. Change ps level to 2 (we only needed level 3 for FlateDecode). Change DocumentData to Clean7Bit as we don't include binary data anymore. src/Makefile.am | 3 +- src/cairo-lzw.c | 499 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-output-stream.c | 63 ++++++ src/cairo-ps-surface.c | 37 +--- src/cairoint.h | 10 + 5 files changed, 582 insertions(+), 30 deletions(-) commit d6f8df7417bdab75dbcfe9658616dd3367276ed0 Author: Carl Worth Date: Wed Mar 15 07:31:48 2006 -0800 Remove annoyinc RCS magic lines that are not being used, but cause conflicts. pixman/src/fbedge.c | 2 -- pixman/src/fbedgeimp.h | 2 -- pixman/src/fbpict.c | 2 -- pixman/src/fbpict.h | 2 -- pixman/src/icpixels.c | 2 -- pixman/src/ictrap.c | 2 -- pixman/src/pixman.h | 2 -- pixman/src/pixregionint.h | 2 -- pixman/src/renderedge.c | 2 -- pixman/src/renderedge.h | 2 -- 10 files changed, 0 insertions(+), 20 deletions(-) commit 2af29f720faac0a9ee3961a81b81acae9a716220 Author: Emmanuel Pacaud Date: Tue Mar 14 23:02:39 2006 +0100 SVG: use xmlOutputBuffer for file creation, instead of dumping xml tree in a memory buffer. src/cairo-svg-surface.c | 23 +++++++++++++++++------ 1 files changed, 17 insertions(+), 6 deletions(-) commit 5d89faf6b37bb0367c8ba8f8637fc80bd745c888 Author: Carl Worth Date: Mon Mar 13 13:20:29 2006 -0800 fbCompositeTrans_0888xnx0888: Fix suspicious logical negation of pointer value. Surely, the ! instead of ~ here was just a typo. I'd feel better if I had a failing test case for this though, (time to break out gcov again). Fixes bug #6185: Strange pointer operations in fbCompositeTrans_0888xnx0888 (pixman/src/fbpict.c) https://bugs.freedesktop.org/show_bug.cgi?id=6185 pixman/src/fbpict.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6f0d8eedc504e8af2224c502be25dc82b5df70f4 Author: Carl Worth Date: Mon Mar 13 12:25:25 2006 -0800 _clip_and_composite_trapezoids: Avoid NULL pointer dereference due to OOM. This closes bug #6197: Null pointer dereference on OOM in _clip_and_composite_trapezoids() https://bugs.freedesktop.org/show_bug.cgi?id=6197 src/cairo-surface-fallback.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 79075b2cb1ce1397506fc10572df96f6fd00ecc3 Author: Carl Worth Date: Mon Mar 13 12:20:23 2006 -0800 cairo-clip: Fix memory leak during OOM handling. This closes bug #6196: Memory leak in _cairo_clip_intersect_path (src/cairo-clip.c) https://bugs.freedesktop.org/show_bug.cgi?id=6196 src/cairo-clip.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit fc51a78a1ed5f7649ce55ab30fc42939a9b295d1 Author: Carl Worth Date: Mon Mar 13 12:14:47 2006 -0800 cairo-pdf-surface: Close memory leak during OOM handling. This fixes bug #6186: Memory leak in emit_image_rgb_data (src/cairo-pdf-surface.c) https://bugs.freedesktop.org/show_bug.cgi?id=6186 src/cairo-pdf-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 25cccaaa1f6d337a1a0423a298f94456e72a820a Merge: c780f4a... 118f71b... Author: Carl Worth Date: Mon Mar 13 12:05:37 2006 -0800 Merge branch 'cairo-origin' into cairo commit c780f4a5624f27a6cbf7829e10e8cd3544ae4f38 Author: Carl Worth Date: Mon Mar 13 12:05:13 2006 -0800 cairo-output-stream: Don't dereference a NULL pointer due to OOM. This close bug #6176: Null pointer dereference on OOM in _cairo_output_stream_create_for_file() https://bugs.freedesktop.org/show_bug.cgi?id=6176 src/cairo-output-stream.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 118f71b43870551db520ad56234c650aa4b61296 Merge: 6659991... 92e09ee... Author: Emmanuel Pacaud Date: Sun Mar 12 19:30:29 2006 +0100 Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo commit 66599911e0664afd145975e3afb0f580e6d1bb3c Author: Emmanuel Pacaud Date: Thu Mar 9 22:09:14 2006 +0100 Don't duplicate unmodified SVG surfaces src/cairo-svg-surface.c | 30 ++++++++++++++++++++++++------ 1 files changed, 24 insertions(+), 6 deletions(-) commit 92e09ee72fdde9059300b2b63d87e2bbd4286605 Author: Mart Raudsepp Date: Thu Mar 9 08:23:43 2006 -0800 Complete the CAIRO_PATTERN_TYPE renaming This fixes compilation of the glitz backend, and also fixes missing renames in win32, atsui, and directfb backends. src/cairo-atsui-font.c | 2 +- src/cairo-directfb-surface.c | 6 +++--- src/cairo-glitz-surface.c | 14 +++++++------- src/cairo-win32-surface.c | 4 ++-- 4 files changed, 13 insertions(+), 13 deletions(-) commit 1cffb39ff04bbb29bb070e42c51aa1ae6aaf5a4c Author: Carl Worth Date: Wed Mar 8 08:16:49 2006 -0800 cairo_show_glyphs: Do nothing if num_glyphs == 0 src/cairo.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 7563a23921a4d6f9f826a13b42d61f3ba3c31c10 Author: Emmanuel Pacaud Date: Sun Mar 5 23:49:38 2006 +0100 Fix self-copy test src/cairo-svg-surface.c | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-) commit 3333bba82d26a0b11961af3cb5c29c79a1a0d07b Merge: 62812b2... 3370cd6... Author: Carl Worth Date: Fri Mar 3 15:41:14 2006 -0800 Merge branch 'show-glyphs-many' into cairo commit 3370cd631858cac0fd3ce33c74db3af40991e6f1 Author: Carl Worth Date: Fri Mar 3 15:40:58 2006 -0800 _cairo_xlib_surface_old_show_glyphs: Break up rendering into chunks to fit into X max request length protocol limits. This fixes bug #5528: _XError from XRenderCompositeText8 https://bugs.freedesktop.org/show_bug.cgi?id=5528 (cherry picked from 7d498ca91279a4e793d704c5b878f070be4c878f commit) src/cairo-xlib-surface.c | 49 ++++++++++++++++++++++++++++++++------------- 1 files changed, 35 insertions(+), 14 deletions(-) commit 34a4ad1e5bca8db34933718db245a232ebe30ce2 Author: Carl Worth Date: Thu Mar 2 10:32:38 2006 -0800 test/show-glyphs-many: New test case to demonstrate bug #5528 This demonstrates an Xlib crash when rendering many glyphs. See: _XError from XRenderCompositeText8 https://bugs.freedesktop.org/show_bug.cgi?id=5528 for more details. test/.gitignore | 1 + test/Makefile.am | 2 + test/show-glyphs-many-ref.png | Bin 0 -> 118 bytes test/show-glyphs-many-rgb24-ref.png | Bin 0 -> 115 bytes test/show-glyphs-many.c | 127 +++++++++++++++++++++++++++++++++++ 5 files changed, 130 insertions(+), 0 deletions(-) commit 62812b25c7f0c11aa6c973b722fa8e1bd088d4b8 Author: Emmanuel Pacaud Date: Thu Mar 2 14:54:37 2006 +0100 Fix gcc 4.0 signedness warnings src/cairo-svg-surface.c | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) commit 3490ed989672eaf2c08468ba81e3376fa362e41f Author: Christian Biesinger Date: Wed Mar 1 19:16:01 2006 +0100 Remove trailing comma in enumeration This fixes a gcc -pedantic warning and compilation with the xlc compiler. src/cairo-meta-surface-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2fb016c75b950b3b1fe077dc349713f61118fd7c Merge: 8176c93... 3490ed9... Author: Vladimir Vukicevic Date: Wed Mar 1 11:26:48 2006 +0100 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo commit 8176c93bc481414c1584bf4721ac1680ed827d97 Author: Vladimir Vukicevic Date: Wed Mar 1 11:26:30 2006 +0100 Revert "Remove ft-font's usage of device offset surface fields for storing bearings" Bogus fix; misunderstood the relationship between the font bearings and the computed device offsets. Real fix on my device offsets branch. This reverts 49b4fe10d0acdf6b9776d2908e98f2f0c596fbe5 commit. src/cairo-ft-font.c | 22 +++++++++++++++++++++- src/cairo-scaled-font.c | 6 +++--- src/cairo-xlib-surface.c | 4 ++-- 3 files changed, 26 insertions(+), 6 deletions(-) commit e2855502f2f2e701b96a2a7eee4cda8c374bcbb9 Author: Carl Worth Date: Tue Feb 28 14:10:36 2006 -0800 Fix last piece of merge resolution missing from previous commit src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e3017c3c8de2b90e1d3470866f9bd6cc2cd313fa Merge: ce683a2... 2984f60... Author: Carl Worth Date: Tue Feb 28 12:07:14 2006 -0800 Merge in upstream 'ps-surface' changes commit f5566c9b20edf04b44f60bba164c226f2718a935 Merge: 49b4fe1... d985a9d... Author: Vladimir Vukicevic Date: Tue Feb 28 16:29:45 2006 +0100 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo commit d985a9d6696f1ed653a48d95bc401ede3ba86d5f Author: Christian Biesinger Date: Wed Mar 1 00:40:35 2006 +0100 Fixing BeOS surface part II src/cairo-beos-surface.cpp | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 566bb18dfee2daaaaf86e7a22e8a7883e81efd97 Author: Christian Biesinger Date: Wed Mar 1 00:06:43 2006 +0100 Updating BeOS surface per the get_type changes src/cairo-beos-surface.cpp | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit a69b3f211654d1f221859f8e7f9608f8030e1ac4 Author: manu Date: Tue Feb 28 23:44:01 2006 +0100 s/CAIRO_PATTERN/CAIRO_PATTERN_TYPE/ src/cairo-svg-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 0341305fd2f303a23d10b448ac385a981b8b35fe Author: manu Date: Tue Feb 28 23:33:00 2006 +0100 Revert "Git test" This reverts ef1c5c3961c2dff1a48606a45a6c9877924e5f15 commit. src/cairo-svg-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit ef1c5c3961c2dff1a48606a45a6c9877924e5f15 Author: manu Date: Tue Feb 28 22:52:45 2006 +0100 Git test src/cairo-svg-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 49b4fe10d0acdf6b9776d2908e98f2f0c596fbe5 Author: Vladimir Vukicevic Date: Tue Feb 28 16:21:46 2006 +0100 Remove ft-font's usage of device offset surface fields for storing bearings cairo-ft-font was being naughty and storing glyph bearings in the surface device_[xy]_offset fields -- this had no effect previously, because _cairo_surface_composite ignored those fields, but once it starts handling device offsets itself, this causes ft text rendering to break. src/cairo-ft-font.c | 22 +--------------------- src/cairo-scaled-font.c | 6 +++--- src/cairo-xlib-surface.c | 4 ++-- 3 files changed, 6 insertions(+), 26 deletions(-) commit 6fe93cbf5b368a9a6daf54370aa0e7735b411474 Merge: f2245a7... 210dd59... Author: Carl Worth Date: Tue Feb 28 02:36:45 2006 -0800 Merge branch 'get-type' into cairo commit 210dd59a7441424f71658ca248f6657482c74c7e Author: Carl Worth Date: Tue Feb 28 02:30:27 2006 -0800 Add some basic testing of cairo_font_face_get_type and cairo_scaled_font_get_type. test/.gitignore | 1 + test/Makefile.am | 2 + test/font-face-get-type.c | 64 +++++++++++++++++++++++++++++++++++++ test/ft-font-create-for-ft-face.c | 14 ++++++++ 4 files changed, 81 insertions(+), 0 deletions(-) commit bd2136a23f8a3d5f6a1306d18499fdcfc1e87f48 Author: Carl Worth Date: Tue Feb 28 01:31:15 2006 -0800 Correct copyright date test/pattern-get-type.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f9534c856a71b0f56a1e5bc58141b7bc192a27e8 Author: Carl Worth Date: Tue Feb 28 01:30:58 2006 -0800 test/pattern-get-type: Add new test case for cairo_pattern_get_type. test/.gitignore | 1 + test/Makefile.am | 2 + test/pattern-get-type.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 0 deletions(-) commit 1dd6e417c10c90894c87565d4f7fa3f63e97f212 Author: Carl Worth Date: Tue Feb 28 00:55:27 2006 -0800 Add testing for cairo_surface_get_type. All test targets now list an expected cairo_surface_type_t. Add notes on current limitations of PDF/PS/meta-surface support that causes CAIRO_CONTENT_COLOR similar surfaces of PDF and PS surfaces to be returned as image surfaces. Add cairo_internal_surface_type_t for the meta, paginated, and various test surfaces. src/cairo-paginated-surface.c | 20 +++++++- src/cairoint.h | 6 ++- src/test-fallback-surface.c | 1 + src/test-meta-surface.c | 1 + test/cairo-test.c | 107 ++++++++++++++++++++++++++++++----------- 5 files changed, 103 insertions(+), 32 deletions(-) commit cd84e2ab32fe4648f9d172cdefe08798336938d2 Author: Carl Worth Date: Mon Feb 27 23:15:45 2006 -0800 Add documentation for cairo_font_face_get_type, cairo_scaled_font_get_type, cairo_surface_get_type, and cairo_pattern_get_type. src/cairo-font.c | 6 ++++++ src/cairo-pattern.c | 6 ++++++ src/cairo-scaled-font.c | 6 ++++++ src/cairo-surface.c | 6 ++++++ 4 files changed, 24 insertions(+), 0 deletions(-) commit 5797f814852bb4f6ef559890640b8cd24ec5fa45 Author: Carl Worth Date: Mon Feb 27 23:12:43 2006 -0800 Implement cairo_pattern_get_type src/cairo-pattern.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 5ae0b9f912b7f5fd1700cbf18763a05493f55b62 Author: Carl Worth Date: Mon Feb 27 23:11:32 2006 -0800 Implement cairo_surface_get_type src/cairo-directfb-surface.c | 1 + src/cairo-glitz-surface.c | 1 + src/cairo-image-surface.c | 1 + src/cairo-meta-surface.c | 1 + src/cairo-paginated-surface.c | 5 +++++ src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-surface.c | 15 +++++++++++++++ src/cairo-svg-surface.c | 1 + src/cairo-win32-surface.c | 1 + src/cairo-xcb-surface.c | 1 + src/cairo-xlib-surface.c | 1 + src/cairoint.h | 12 ++++++++++++ 13 files changed, 42 insertions(+), 0 deletions(-) commit 2984f60a3a4571a8d4179fdc64a9e67ce9854f21 Author: Keith Packard Date: Mon Feb 27 20:09:24 2006 -0800 Need cairo_analyze_surface_get_extents src/cairo-analyze-surface.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) commit 9ca67992a5816db49e8dca866816481483896814 Author: Keith Packard Date: Mon Feb 27 20:05:57 2006 -0800 Support meta surface patterns src/cairo-paginated-surface.c | 11 ++++++++++- src/cairo-ps-surface.c | 39 ++++++++++++++++++++++++++------------- 2 files changed, 36 insertions(+), 14 deletions(-) commit ad247974ebcfc5ede9fd3856eeaee4860318d118 Author: Keith Packard Date: Mon Feb 27 19:34:32 2006 -0800 Release pattern source image when done with it src/cairo-ps-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 59e4a32d550d14cfaa0687e716c7df0cadf56adc Author: Keith Packard Date: Mon Feb 27 19:23:47 2006 -0800 Primitive ps glyph support. Fix ps strokes to not leave path defined src/cairo-ps-surface.c | 52 +++++++++++++++++++++++++++++++++++++++++++--- src/cairo-scaled-font.c | 2 +- src/cairoint.h | 2 +- 3 files changed, 50 insertions(+), 6 deletions(-) commit 06b83b89fc4271060c63b284d7909162b92152f1 Author: Keith Packard Date: Mon Feb 27 17:49:53 2006 -0800 Support image surface patterns src/cairo-ps-surface.c | 39 +++++++++++++++++++++++++++++++-------- 1 files changed, 31 insertions(+), 8 deletions(-) commit 1769830e6eea08744830c1c7ea9220d56808831a Author: Carl Worth Date: Mon Feb 27 17:22:45 2006 -0800 Implement cairo_scaled_font_get_type src/cairo-atsui-font.c | 1 + src/cairo-ft-font.c | 1 + src/cairo-scaled-font.c | 6 ++++++ src/cairo-win32-font.c | 1 + src/cairoint.h | 2 ++ 5 files changed, 11 insertions(+), 0 deletions(-) commit f2245a7932b857ff70dc0476490090d906ae61f8 Author: Carl Worth Date: Mon Feb 27 17:07:22 2006 -0800 Remove unused RCS $Id:$ tags. src/cairo-wideint.c | 3 +-- src/cairo-wideint.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) commit ce683a240236fbe8083f284195acf0f78aa05048 Author: Carl Worth Date: Mon Feb 27 15:12:15 2006 -0800 Drop gratuitous structure with single function pointer. Rename paginated_set_mode to set_paginated_mode. src/cairo-paginated-surface-private.h | 10 +++------- src/cairo-paginated-surface.c | 12 ++++++------ src/cairo-ps-surface.c | 31 +++++++++++++++---------------- 3 files changed, 24 insertions(+), 29 deletions(-) commit aecb07a26d1db73cf6eee183de0f77615dea6830 Author: Carl Worth Date: Mon Feb 27 14:58:51 2006 -0800 cairo_analysis_surface: Rename region_[un]supported() to get_[un]supported(). src/cairo-analysis-surface-private.h | 4 ++-- src/cairo-analysis-surface.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 2660e79e674a55e71014f83e9247372edd9ab531 Author: Carl Worth Date: Mon Feb 27 14:56:41 2006 -0800 Rename cairo_analyze_surface_t to cairo_analysis_surface_t. src/Makefile.am | 6 +- src/cairo-analysis-surface-private.h | 55 ++++++++ src/cairo-analysis-surface.c | 246 ++++++++++++++++++++++++++++++++++ src/cairo-analyze-surface-private.h | 55 -------- src/cairo-analyze-surface.c | 246 ---------------------------------- src/cairo-paginated-surface.c | 18 ++-- 6 files changed, 313 insertions(+), 313 deletions(-) commit f9d4482137e7f13e634cc578c64d84ffdea16bca Author: Keith Packard Date: Mon Feb 27 17:14:57 2006 -0500 rename evaluate surface to analyze surface, pull to separate files src/Makefile.am | 2 + src/cairo-analyze-surface-private.h | 55 ++++++++ src/cairo-analyze-surface.c | 246 +++++++++++++++++++++++++++++++++ src/cairo-paginated-surface-private.h | 2 +- src/cairo-paginated-surface.c | 210 ++-------------------------- src/cairo-ps-surface.c | 10 +- 6 files changed, 319 insertions(+), 206 deletions(-) commit cb3a445150e3771d23854849c2a1c991eaee712c Author: Keith Packard Date: Mon Feb 27 19:47:14 2006 +0100 Primitive "real" postscript output for stroke/fill/paint src/cairo-paginated-surface-private.h | 15 +- src/cairo-paginated-surface.c | 241 ++++++++++++++++- src/cairo-pdf-surface.c | 3 +- src/cairo-ps-surface.c | 470 +++++++++++++++----------------- 4 files changed, 467 insertions(+), 262 deletions(-) commit 1a1441912604c89e2912ec764fe26b7a9db995a3 Author: Vladimir Vukicevic Date: Fri Feb 17 23:37:54 2006 -0800 Win32: Handle BitBlt in get_image failure and AlphaBlend not being supported If the BitBlt in get_image fails, we pretty much can't do anything -- so fill the destination with white and hope for the best. This enables somewhat accurate printing of complex operations. Also, check the destination device caps before calling AlphaBlend; return UNSUPPORTED if the destination DC can't do AlphaBlend. (cherry picked from 9831de538e347a624af5b0ca38242b198b64bd45 commit) src/cairo-win32-surface.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-) commit 2d784815ffac1ca8c10dac12525f2e8d0b412c1a Author: Vladimir Vukicevic Date: Fri Feb 17 23:34:51 2006 -0800 Win32: Set surface format based on device caps If the DC is a display DC, inspect its depth and set out local format appropriately. If it's not a display DC, assume RGB24. (cherry picked from 6dd0a70d271f93df95f4bcaff5073b9bf90cecb6 commit) src/cairo-win32-surface.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-) commit 68ed40b6da242816a43cd68cc2c7feb779cf0acf Author: Vladimir Vukicevic Date: Fri Feb 17 23:24:06 2006 -0800 Win32: Fix up src coords before calling AlphaBlend/BitBlt to avoid invalid calls Fixes up src coords and width/height before calling AlphaBlend/BitBlt; it's an error to try to use a region that extents outside of the source surface as a source DC. Doesn't repair the extra region relative to the operator -- e.g. regions outside of an ARGB source surface with SOURCE operator should be cleared to fully transparent black in the destination. (cherry picked from bc19c5b64b0e38e9d20045907d7b47d79f6afc60 commit) src/cairo-win32-surface.c | 31 +++++++++++++++++++++++++++++-- 1 files changed, 29 insertions(+), 2 deletions(-) commit 0852cd449259eb9a52bfa63f19428c47c78baf91 Author: Vladimir Vukicevic Date: Mon Feb 27 12:49:27 2006 +0100 Win32: rename cairo_surface_create_dib to cairo_surface_create_with_dib Also adds some documentation for the win32 creation functions. (cherry picked from 3a148bd620d709237d98a72f65118759bfc5a76d commit) src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 55 +++++++++++++++++++++++++++----------------- src/cairo-win32.h | 6 ++-- 3 files changed, 38 insertions(+), 25 deletions(-) commit 0fe8a93d95ab0b2235133fa089be8ec99d1a5248 Author: Vladimir Vukicevic Date: Fri Feb 17 23:17:23 2006 -0800 Win32: expose win32 DIB (image) surface creation function, and DC getter Adds cairo_win32_surface_create_dib() for creating a win32 DIB-backed surface with a particular format. Also exposes cairo_win32_surface_get_dc() to obtain the DC of a win32 surface. (cherry picked from 0813a1b9b6f35d786fe8cb0d4748771023956cde commit) src/cairo-win32-font.c | 2 +- src/cairo-win32-private.h | 5 ----- src/cairo-win32-surface.c | 31 ++++++++++++++++++++++++++++--- src/cairo-win32.h | 8 ++++++++ 4 files changed, 37 insertions(+), 9 deletions(-) commit f4b34df6b6c07024a1b552236d8e0db959771b15 Author: Vladimir Vukicevic Date: Wed Feb 15 13:14:52 2006 -0800 Have mark_dirty always invalidate the last clip set on the surface mark_dirty will force cairo to set its own clip the next time the cairo clip is applied after mark_dirty; otherwise we run the risk of cairo's cached clip and the device clip getting out of sync if any clip-related functions are used on the native device back-end. (cherry picked from 1935a28949da8569f924e37714ec19571fa95987 commit) (cherry picked from ef8b472f0ffab7b8b828d7297c7e454bb22bd5ec commit) src/cairo-surface.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) commit e0f4eecb91c8f7f09ef4977703d4ca21b06797a9 Author: Vladimir Vukicevic Date: Wed Feb 15 12:43:01 2006 -0800 Win32: Rework clip and extents handling - Save extents at surface creation and always return these - Simplify clipping paths (cherry picked from a67722b3d7280e6c2375778c2d46556cca261bfc commit) (cherry picked from 7ce09732a978749a4da814feb77f50161dc42c91 commit) src/cairo-win32-private.h | 2 +- src/cairo-win32-surface.c | 92 +++++++++++++++++---------------------------- 2 files changed, 36 insertions(+), 58 deletions(-) commit f6b4fabaf59227d6cafcdd7e27cf0d8e26b4eeb8 Author: Vladimir Vukicevic Date: Tue Feb 14 11:55:00 2006 -0800 Misc compilation fixes (C++-style comments, M_PI decls, etc.) (cherry picked from d0cc56b9a24fa59febc15ac5de073da0e785e1cc commit) (cherry picked from a6a054abe45287eb950c294e20366594313138f5 commit) pixman/src/fbcompose.c | 8 ++++++++ pixman/src/pixregion.c | 6 +++--- src/cairo-atsui-font.c | 10 ++++++++++ src/cairoint.h | 4 ++++ 4 files changed, 25 insertions(+), 3 deletions(-) commit dba214b944a16dd7ee781f495cd5fbe83f678451 Author: Christian Biesinger Date: Sun Feb 26 10:46:04 2006 +0100 Use C-style comments rather than C++-style pixman/src/fbcompose.c | 4 ++-- pixman/src/pixman-xserver-compat.h | 2 +- src/cairo-atsui-font.c | 23 ++++++++++++----------- src/cairo-directfb-surface.c | 2 +- src/cairo-quartz-surface.c | 11 ++++++----- 5 files changed, 22 insertions(+), 20 deletions(-) commit 5a3c30eafe0b77f69434e139a2e247c8eb4230d7 Author: Carl Worth Date: Fri Feb 24 15:32:26 2006 -0800 Implement cairo_font_face_get_type. Add font type to font_face_backend. Also export new CAIRO_FONT_TYPE_TOY. src/cairo-atsui-font.c | 1 + src/cairo-font.c | 7 +++++++ src/cairo-ft-font.c | 1 + src/cairo-win32-font.c | 1 + src/cairo.h | 1 + src/cairoint.h | 3 +++ 6 files changed, 14 insertions(+), 0 deletions(-) commit 5928d03b496420b2d0a89cf8e2d294081a60cc67 Author: Carl Worth Date: Fri Feb 24 15:25:19 2006 -0800 Remove private cairo_pattern_type in favor of new public one. Rename all values to now include TYPE. Drop _GRADIENT from LINEAR and RADIAL. src/cairo-meta-surface.c | 2 +- src/cairo-pattern.c | 68 +++++++++++++++++++++--------------------- src/cairo-pdf-surface.c | 10 +++--- src/cairo-ps-surface.c | 26 ++++++++-------- src/cairo-surface-fallback.c | 2 +- src/cairo-xlib-surface.c | 2 +- src/cairo.h | 12 ++++---- src/cairoint.h | 7 ---- 8 files changed, 61 insertions(+), 68 deletions(-) commit f58f39d7afee8d8a663569f149651c789aa95da8 Author: Carl Worth Date: Fri Feb 24 15:06:50 2006 -0800 cairo.h: Fix typo (thanks to Torsten Schoenfeld) src/cairo.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2fc9fd79e794129b26cc8f9b62a5aa4604cb99d9 Author: Carl Worth Date: Fri Feb 24 11:37:50 2006 -0800 cairo.h: Fix two typos in the documentation. src/cairo.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 9287d60d60f55ae3838a7cecfa9fa04a5f95e8de Author: Carl Worth Date: Fri Feb 24 11:24:03 2006 -0800 Add get_type functions: cairo_surface_get_type, cairo_pattern_get_type, cairo_font_face_get_type, and cairo_scaled_font_get_type. src/cairo-surface.c | 3 +- src/cairo.h | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 134 insertions(+), 3 deletions(-) commit d0e02a948e83e3b1b330c9cb0aa4930b42bf485c Author: Carl Worth Date: Fri Feb 24 09:18:17 2006 -0800 autogen.sh: Pass --foreign option to automake so that it doesn't complain that ChangeLog does not exist. autogen.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cb778760cb87e727a701603bcea3a2cdc063d785 Author: Carl Worth Date: Thu Feb 23 22:07:13 2006 -0800 cairo_close_path: Document that there will be a current point after cairo_close_path. src/cairo.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 1dc1b57b4eaa55b7a5cafe39f818f7c87352ea6d Author: Carl Worth Date: Thu Feb 23 22:01:07 2006 -0800 cairo_new_sub_path: Making cairo_arc easier to use and more. This adds a new function which has as its only effect the elimination of the current point. This makes it much easier to use the various cairo_arc calls when the initial line_to is not actually desired. This function also unifies and generalizes the long-existing behavior of cairo_line_to being treated as cairo_move_to when there is no current point. With the addition of cairo_new_sub_path this becomes a documented feature with similar behavior in cairo_curve_to as well. .gitignore | 1 + src/cairo-path-stroke.c | 24 +++--------- src/cairo-path.c | 40 +++++++++++++++----- src/cairo-pdf-surface.c | 48 ++++++------------------ src/cairo-ps-surface.c | 53 +++++++------------------- src/cairo-svg-surface.c | 17 +------- src/cairo.c | 60 ++++++++++++++++++++++++++--- src/cairo.h | 3 + src/cairoint.h | 3 + test/.gitignore | 1 + test/Makefile.am | 4 ++ test/new-sub-path-ref.png | Bin 0 -> 386 bytes test/new-sub-path-rgb24-ref.png | Bin 0 -> 355 bytes test/new-sub-path.c | 79 +++++++++++++++++++++++++++++++++++++++ 14 files changed, 209 insertions(+), 124 deletions(-) commit 0354956a09cf5a45feed256c1d880bbb9b7c7c42 Author: Carl Worth Date: Thu Feb 23 20:45:30 2006 -0800 Remove ChangeLog as it is no longer maintained as a separate file (instead it is implicitly generated) ChangeLog |13825 ------------------------------------------------------------- 1 files changed, 0 insertions(+), 13825 deletions(-) commit 07205ddc4b3f7ee0416e487fffcf59d324d18bfe Author: Christian Biesinger Date: Fri Feb 24 00:04:05 2006 +0100 Mark private functions as cairo_private (cherry picked from a1c72cd8f244e97d4b6fe3e5d3efa622c8b3f7f9 commit) src/cairo-paginated-surface-private.h | 2 +- src/cairoint.h | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) commit b2912241f63bf3f8ee14ab4309fc820afdf33e1c Author: Christian Biesinger Date: Tue Feb 21 21:00:48 2006 +0100 Add missing gradient functions to pixman-remap.h pixman/src/pixman-remap.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 0fc25c9853441f1fc2e49e7c77dbf9a99f590868 Author: Christian Biesinger Date: Sat Feb 18 21:45:58 2006 +0100 Don't call _cairo_error when returning an error Only return it when returning a nil surface. src/cairo-beos-surface.cpp | 26 +++++++------------------- 1 files changed, 7 insertions(+), 19 deletions(-) commit 5c5ea6d5233a669f6a7dff57ed0afba01131b7b5 Author: Christian Biesinger Date: Sat Feb 18 19:36:18 2006 +0100 Fix typo. src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f4d9e5596258284fa7fef01c91ad854544e2b9a2 Author: Christian Biesinger Date: Thu Feb 16 23:37:16 2006 +0100 Use TRUE/FALSE instead of 1/0 for boolean values (cherry picked from e1703520169e0cf972a6edcaa8660d14806d8c6f commit) src/cairo-xcb-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 57edf3f28fa09d2ec24d85dcc91a220d901a4452 Author: Carl Worth Date: Thu Feb 16 09:05:52 2006 -0800 Normalize indentation after previous commit. src/cairo-ft-font.c | 312 +++++++++++++++++++++++++-------------------------- 1 files changed, 155 insertions(+), 157 deletions(-) commit 0152bd3a562442853ab930eaea316c08b34f6ba6 Author: Carl Worth Date: Thu Feb 16 09:02:29 2006 -0800 Allow _get_bitmap_surface to work for 0x0 glyphs, (fix for bug #5734). Patch from: Behdad Esfahbod Reviewed by: Carl Worth src/cairo-ft-font.c | 11 ++++------- 1 files changed, 4 insertions(+), 7 deletions(-) commit f12aa15466844b67ec22544c4feee17389ba4aeb Author: Carl Worth Date: Wed Feb 15 16:50:57 2006 -0800 Add Mozilla patches to ROADMAP ROADMAP | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) commit fd9566ebd921f1d5b06ac25d466e15f28fd3112b Author: Carl Worth Date: Wed Feb 15 16:36:12 2006 -0800 Slip 1.2.0 release date out to 2006-03-08 ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 32ec3ccf1729fbf6da73924238e4a30f1975bbd2 Author: Carl Worth Date: Wed Feb 15 15:40:41 2006 -0800 Annoying churn of tmpl file. (We really need to get all of these built files out of version control.) doc/public/tmpl/cairo-beos.sgml | 19 ------------------- 1 files changed, 0 insertions(+), 19 deletions(-) commit d88c19071f6748b190cb17e6724b67705863a9b0 Author: Carl Worth Date: Wed Feb 15 15:00:26 2006 -0800 Rename .cvsignore to .gitignore. Add *~ and *.o. .cvsignore | 20 ------- .gitignore | 24 ++++++++ doc/.cvsignore | 2 - doc/.gitignore | 3 + doc/public/.cvsignore | 16 ------ doc/public/.gitignore | 17 ++++++ doc/public/tmpl/.cvsignore | 1 - doc/public/tmpl/.gitignore | 3 + doc/tutorial/slides/.cvsignore | 7 --- doc/tutorial/slides/.gitignore | 7 +++ doc/tutorial/src/.cvsignore | 7 --- doc/tutorial/src/.gitignore | 8 +++ pixman/.cvsignore | 19 ------- pixman/.gitignore | 20 +++++++ pixman/src/.cvsignore | 8 --- pixman/src/.gitignore | 10 ++++ src/.cvsignore | 11 ---- src/.gitignore | 13 +++++ test/.cvsignore | 114 --------------------------------------- test/.gitignore | 116 ++++++++++++++++++++++++++++++++++++++++ 20 files changed, 221 insertions(+), 205 deletions(-) commit f4270b3dfc5e6905c58adb2f6b5d9a049dc616fa Author: Emmanuel Pacaud Date: Mon Feb 13 14:11:36 2006 +0000 convert _cairo_svg_surface_old_show_glyphs to _cairo_svg_surface_show_glyphs. ChangeLog | 5 +++++ src/cairo-svg-surface.c | 22 ++++++++-------------- 2 files changed, 13 insertions(+), 14 deletions(-) commit 921dcc16f980fcf9a8df4c193720e8ec1e53f1dd Author: Emmanuel Pacaud Date: Mon Feb 13 12:41:10 2006 +0000 Add mask support and switch to SVG 1.2 for compositing operators. return xml node instead of cairo status. (emit_composite_svg_pattern): ditto. (emit_composite_pattern): ditto. (emit_operator): use SVG 1.2 operators, since feComposite filter always composite resulting surface to current canvas. (_cairo_svg_surface_composite): removed. (_cairo_svg_surface_fill_rectangles): removed. (intersect): removed. (_cairo_svg_surface_composite_trapezoids): removed. (emit_paint): new. (_cairo_svg_surface_paint): new. (_cairo_svg_surface_mask): new. (_cairo_svg_surface_stroke): emit operator. ChangeLog | 19 +++ src/cairo-svg-surface.c | 294 ++++++++++++++--------------------------------- 2 files changed, 105 insertions(+), 208 deletions(-) commit 8ff1866724a8c82a3332db828ffada4ebd4ca144 Author: Christian Biesinger Date: Sat Feb 11 12:57:56 2006 +0000 Adds the BeOS surface functions to the list of functions for which to generate documentation. ChangeLog | 10 ++++++++++ doc/public/cairo-docs.xml | 1 + doc/public/cairo-sections.txt | 7 +++++++ doc/public/language-bindings.xml | 1 + doc/public/tmpl/cairo-beos.sgml | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 0 deletions(-) commit 9c05d2aab15b589197436af5287ae9297c0314bd Author: Emmanuel Pacaud Date: Thu Feb 2 12:47:58 2006 +0000 fix filename. shh! ChangeLog | 5 +++++ test/.cvsignore | 4 ++-- test/cairo-test.c | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) commit be7b6251f3ff6b86df3456fad561f4c0acb3c3ab Author: Emmanuel Pacaud Date: Sun Jan 29 13:25:10 2006 +0000 fix offset of pattern stops. ChangeLog | 5 +++++ src/cairo-svg-surface.c | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) commit d157e1fcd5f74e51587fc9eb342ce38ccbf73433 Author: Keith Packard Date: Wed Jan 25 19:17:34 2006 +0000 Make watermark consistently translucent Use fill for dung outline Fix text locations ChangeLog | 12 ++++ doc/tutorial/slides/cairo-code.svg | 4 +- doc/tutorial/slides/cairo-large-content.svg | 2 +- doc/tutorial/slides/cairo-separator.svg | 8 ++-- doc/tutorial/slides/cairo-title.svg | 4 +- doc/tutorial/slides/cairo.svg | 79 +++++++++++---------------- 6 files changed, 54 insertions(+), 55 deletions(-) commit 3bcaab9fe1cd05ace2073922975d07f6fb01a20f Author: Carl Worth Date: Wed Jan 25 15:34:30 2006 +0000 Add a CONTROL-Q keybinding to quit. ChangeLog | 5 +++++ doc/tutorial/src/include/cairo-tutorial-gtk.h | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) commit 29479a8b12e3f2575de6ef899142dcd0cd8e21a4 Author: Keith Packard Date: Wed Jan 25 15:29:25 2006 +0000 Adopt proposed new cairo color scheme. Recolor scarab, eliminate gradient in dung Use new blue background color. Rework font sizes, use bold for titles. Change tutorial title. reviewed by: cworth ChangeLog | 17 + doc/tutorial/slides/cairo-blank.svg | 22 +- doc/tutorial/slides/cairo-code.svg | 114 ++++-- doc/tutorial/slides/cairo-large-content.svg | 102 ++++-- doc/tutorial/slides/cairo-separator.svg | 97 ++++- doc/tutorial/slides/cairo-title.svg | 563 ++++++++++++++++++++++++++- doc/tutorial/slides/cairo.svg | 113 ++++-- doc/tutorial/slides/tutorial.xml | 4 +- 8 files changed, 869 insertions(+), 163 deletions(-) commit 2d2c5fd5b003d681b57380a5d11ffc4dd3903b35 Author: Carl Worth Date: Wed Jan 25 14:31:17 2006 +0000 Shrink the font size to make the tutorial instructions fit. Format text to solve all problematic line wrapping. Add my name to the README. ChangeLog | 10 ++++ doc/tutorial/slides/cairo-blank.svg | 2 +- doc/tutorial/slides/tutorial.xml | 89 ++++++++++++++++++----------------- doc/tutorial/src/README | 4 +- 4 files changed, 58 insertions(+), 47 deletions(-) commit dc64fcc68ccbe92392a88167e83cc5994f69cf66 Author: Carl Worth Date: Wed Jan 25 10:22:32 2006 +0000 Move the magic header files to be down in an include directory and more out of the way. Look for the headers in -I./include. Make the circle track the width and height of the window dynamically. Remove boring expander example. Add more interesting LCA exmaple. Add some notes about how to use this stuff. ChangeLog | 28 +++ doc/tutorial/src/Makefile | 12 +- doc/tutorial/src/README | 66 ++++++ doc/tutorial/src/cairo-tutorial-gtk.h | 116 ----------- doc/tutorial/src/cairo-tutorial-pdf.h | 74 ------- doc/tutorial/src/cairo-tutorial-png.h | 74 ------- doc/tutorial/src/cairo-tutorial-xlib.h | 219 --------------------- doc/tutorial/src/cairo-tutorial.h | 41 ---- doc/tutorial/src/circle.c | 13 +- doc/tutorial/src/expander.c | 13 -- doc/tutorial/src/include/cairo-tutorial-gtk.h | 116 +++++++++++ doc/tutorial/src/include/cairo-tutorial-pdf.h | 74 +++++++ doc/tutorial/src/include/cairo-tutorial-png.h | 74 +++++++ doc/tutorial/src/include/cairo-tutorial-xlib.h | 251 ++++++++++++++++++++++++ doc/tutorial/src/include/cairo-tutorial.h | 41 ++++ doc/tutorial/src/lca.c | 32 +++ 16 files changed, 696 insertions(+), 548 deletions(-) commit 9abe21ac70e0d1ae75397f40455f1d55fc5b5018 Author: Carl Worth Date: Wed Jan 25 08:41:14 2006 +0000 Here's the actual template I was referring to in my previous commit. Add a bunch more slides. Most of the text is in place now---just missing some formatting and a bunch of examples. ChangeLog | 9 + doc/tutorial/slides/cairo-large-content.svg | 855 +++++++++++++++++++++++++++ doc/tutorial/slides/tutorial.xml | 434 +++++++------- 3 files changed, 1084 insertions(+), 214 deletions(-) commit 649d8a09187490c68c9b110385f043ceb13a8972 Author: Carl Worth Date: Wed Jan 25 07:33:56 2006 +0000 Add Red Hat logos to slide templates. Add header/footer-less slide variant for slides needed an extra bit of space. Start getting slides ready for linux.conf.au 2006 tutorial, updating for cairo 1.0 API, and adding better organization. Verify and fix all the little example shell programs. Really remove the building of the -pdf programs this time. ChangeLog | 18 ++ doc/tutorial/slides/cairo-blank.svg | 2 +- doc/tutorial/slides/cairo-code.svg | 367 ++++++++++++++++++++++++++++++- doc/tutorial/slides/cairo-separator.svg | 367 ++++++++++++++++++++++++++++++- doc/tutorial/slides/cairo.svg | 368 ++++++++++++++++++++++++++++++- doc/tutorial/slides/rendering-model.png | Bin 0 -> 63917 bytes doc/tutorial/slides/tutorial.xml | 105 +++++++-- doc/tutorial/src/Makefile | 2 +- 8 files changed, 1200 insertions(+), 29 deletions(-) commit ea9f65b0d4cc88b504a6c104b242477264fef1e7 Author: Carl Worth Date: Wed Jan 25 02:10:23 2006 +0000 A few random changes to the slides. Remove pdf build by default, (since it is disabled by defalt in cairo 1.0.2). Change draw interface to accept a width and height. Fix the destroy event handler so that clicking on the window manager's 'close window' button works. ChangeLog | 20 ++++++++++++++++++++ doc/tutorial/slides/tutorial.xml | 29 ++++++++++++++++------------- doc/tutorial/src/Makefile | 1 + doc/tutorial/src/cairo-tutorial-gtk.h | 6 +++--- doc/tutorial/src/cairo-tutorial-pdf.h | 4 ++-- doc/tutorial/src/cairo-tutorial-png.h | 4 ++-- doc/tutorial/src/cairo-tutorial-xlib.h | 4 ++-- doc/tutorial/src/circle.c | 5 +---- doc/tutorial/src/expander.c | 5 +---- 9 files changed, 48 insertions(+), 30 deletions(-) commit d6ff77c297ebfd97707479d3850f4c2c86f0678f Author: Behdad Esfahbod Date: Sun Jan 22 02:33:26 2006 +0000 Add cairo_scaled_font_text_extents. New function. Improve documentation. ChangeLog | 11 +++++++++ src/cairo-scaled-font.c | 55 +++++++++++++++++++++++++++++++++++++++++++--- src/cairo.h | 5 ++++ 3 files changed, 67 insertions(+), 4 deletions(-) commit bfc2b49ad921c62a36154dd761ebca7490a57d9f Author: Christian Biesinger Date: Sat Jan 21 11:54:17 2006 +0000 Updating BeOS reference images, the tests use a black background now. ChangeLog | 13 +++++++++++++ test/mask-beos-rgb24-ref.png | Bin 73512 -> 71028 bytes test/mask-beos_bitmap-argb32-ref.png | Bin 87641 -> 87641 bytes test/mask-beos_bitmap-rgb24-ref.png | Bin 73512 -> 71028 bytes test/set-source-beos-rgb24-ref.png | Bin 124 -> 124 bytes test/set-source-beos_bitmap-rgb24-ref.png | Bin 124 -> 124 bytes test/trap-clip-beos-rgb24-ref.png | Bin 64729 -> 63088 bytes test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 64729 -> 63088 bytes 8 files changed, 13 insertions(+), 0 deletions(-) commit 9fe49346354e1785ff83be69bc1b775a41b7960a Author: Christian Biesinger Date: Sat Jan 21 09:46:13 2006 +0000 Update BeOS test code per the cairo_format_t -> cairo_content_t changes. ChangeLog | 9 +++++++++ test/cairo-test-beos.cpp | 8 ++++---- test/cairo-test-beos.h | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) commit 2afe78c0c2c61186d532d3fa5717e295c8c6272b Author: Christian Biesinger Date: Sat Jan 21 09:39:10 2006 +0000 Don't mix declarations and code. This makes the code valid ISO C, fixes a gcc -pedantic warning, and unbreaks the build with the compiler Zeta ships with. ChangeLog | 11 +++++++++++ pixman/src/fbpict.c | 6 +++--- src/cairo-paginated-surface.c | 5 +++-- test/cairo-test.c | 2 +- 4 files changed, 18 insertions(+), 6 deletions(-) commit f1fd1cc7a9043ae277e4abe421b13812214a3c64 Author: Carl Worth Date: Fri Jan 20 15:25:54 2006 +0000 Add getter functions for cairo_scaled_font_t. ChangeLog | 8 +++++ src/cairo-scaled-font.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++- src/cairo.h | 15 +++++++++ 3 files changed, 99 insertions(+), 1 deletions(-) commit a6ad853ee1a78585859ed77d5d8707fcfd448eab Author: Carl Worth Date: Fri Jan 20 15:15:40 2006 +0000 Fix test to use fontconfig properly so that the test no longer fails. Fixes bug #4674. (Thnks to sunmoon1997 for the fix). ChangeLog | 6 ++++++ test/ft-font-create-for-ft-face.c | 24 +++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) commit 13511972b612c322815a2849fa8f812249d71d8e Author: Carl Worth Date: Fri Jan 20 14:48:07 2006 +0000 Check font_face->status and return a nil scaled font if it is in an error state. (Thanks to Christian Biesinger and sunmoon1997 who pointed this out as part of bug #4674). With this bug fix, the ft-font-create-for-ft-face test fails (as it should) since it is abusing fontconfig. ChangeLog | 10 ++++++++++ src/cairo-scaled-font.c | 5 ++++- 2 files changed, 14 insertions(+), 1 deletions(-) commit 074f886c00d560daec90f1d6f6212ecf923f4d66 Author: Carl Worth Date: Thu Jan 19 17:48:22 2006 +0000 Rip the cairo_content_t argument out of ps/pdf_surface_create as per discussion on cairo mailing list. Instead these surface will behave as if CONTENT_COLOR_ALPHA had been passed (that is, compositing operators will behave as if destination alpha were available). This also has the benefit of preserving the API that has been in place for PS/PDF surface since the (experimental) stuff in 1.0.0. Track API change. Continue testing PS/PDF surfaces in the CAIRO_CONTENT_COLOR mode but do it by rendering to an intermediate similar surface rather than constructing the target surface differently. ChangeLog | 29 +++++++++++++++++++ src/cairo-pdf-surface.c | 27 +++-------------- src/cairo-pdf.h | 2 - src/cairo-ps-surface.c | 24 +-------------- src/cairo-ps.h | 2 - test/cairo-test.c | 71 +++++++++++++++++++++++++++++++++++++++------- test/multi-page.c | 4 +- 7 files changed, 98 insertions(+), 61 deletions(-) commit 14acc7f132fd90d1ba37ddf7ffe9688261cd587b Author: Emmanuel Pacaud Date: Thu Jan 19 12:44:00 2006 +0000 add missing header. Fix #5544. ChangeLog | 4 ++++ test/svg2png.c | 1 + 2 files changed, 5 insertions(+), 0 deletions(-) commit ec45efa57cded99f70e65b23989625243d57eb1e Author: Carl Worth Date: Wed Jan 18 16:44:19 2006 +0000 Fix compilation-breaking typo. ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit c634e547758aa73d229ed209a8c6e56f06a90d0d Author: Carl Worth Date: Wed Jan 18 16:40:17 2006 +0000 Change documentation to recommend cairo_paint rather than cairo_rectangle;cairo_fill for clearing a surface. Add documentation. Add a cairo_content_t argument to PDF surface constructors. Add documentation. Add a cairo_content_t argument to PS surface constructors. Track changes in PS/PDF surface constructor API. ChangeLog | 20 +++++++++++ src/cairo-image-surface.c | 4 +- src/cairo-pdf-surface.c | 79 ++++++++++++++++++++++++++++++++++++-------- src/cairo-pdf.h | 2 + src/cairo-ps-surface.c | 70 ++++++++++++++++++++++++++++++++++----- src/cairo-ps.h | 2 + test/cairo-test.c | 4 +- test/multi-page.c | 4 +- 8 files changed, 155 insertions(+), 30 deletions(-) commit ba69dfefa793d26805ba2ffb17c67d31f5a99ad1 Author: Carl Worth Date: Wed Jan 18 09:46:42 2006 +0000 Fix documentation of cairo_arc which erroneously claimed M_PI radians == 90 degrees to correctly say that M_PI/2.0 radians == 90 degrees. This closes bug #5649 (with thanks to kengruven@gmail.com). ChangeLog | 7 +++++++ src/cairo.c | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit b5c5fb613d5d554f6ebb3e1a10dbb1e7038b47c7 Author: Carl Worth Date: Tue Jan 17 16:59:08 2006 +0000 Big change to the test infrastructure and supporting internals. The goal now is to test both a COLOR_ALPHA and a COLOR content for each surface backend, (since the semantics are different and we probably need to support both in each backend. The PS/PDF backends don't allow a content to be passed in right now, so they fail against the rgb24 tests, but the trivial addition to the constructors will allow them to pass all tests with both content values. And new constructors (currently internal only) to create an image surface with a cairo_content_t rather than a cairo_format_t. Add a cairo_content_t argument to the constructor. Add a cairo_content_t to the constructor and use this content value when constructing intermediate image surfaces in acquire_source, show_page, copy_page, and snapshot. Add image flattening by compositing over white, as is done in cairo-ps-surface.c. Track changes to cairo-paginates-surface which now requires a cairo_content_t value (no change to public PS/PDF constructors yet). Track change in meta-surface and paginated-surface interfaces by now accepting a cairo_content_t rather than a cairo_format_t. Ignore new output files (argb32 from pdf and ps as well as rgb24 from test-fallback, test-meta, and test-paginated). Add new utility for flattening PNG images in order to generate the -argbf-ref.png images. Add image_diff_flattened for comparing flattened output from PS and PDF backend with ARGB reference images by first blending the reference images over white. Get rid of conditional, format-specific background-color initialization before running tests. Now uses ARGB(0,0,0,0) in all cases. Switch from specifying tests with a format value to specifying tests with a content value. Add support for a 'fake' COLOR_ALPHA_FLATTENED content for testing the PS and PDF output against a flattened version of the argb32 reference images (first blended over white). Track change in cairo_ps_surface_create (now requires cairo_content_t value). Adjust tests that draw in default (black) to first paint white so that the results are visible. Adjust ARGB32 reference images for new white background for changed tests. Adjust RGB24 reference images for new black background due to changed initialization (and the tests themselves being unchanged). ChangeLog | 143 +++++++++++ src/cairo-image-surface.c | 31 +++- src/cairo-meta-surface-private.h | 6 +- src/cairo-meta-surface.c | 7 +- src/cairo-paginated-surface-private.h | 1 + src/cairo-paginated-surface.c | 25 ++- src/cairo-pdf-surface.c | 87 ++++++-- src/cairo-pdf.h | 6 +- src/cairo-ps-surface.c | 16 +- src/cairo-ps.h | 6 +- src/cairoint.h | 12 + src/test-fallback-surface.c | 6 +- src/test-fallback-surface.h | 2 +- src/test-meta-surface.c | 11 +- src/test-meta-surface.h | 2 +- src/test-paginated-surface.c | 17 +- src/test-paginated-surface.h | 10 +- test/.cvsignore | 8 + test/Makefile.am | 3 +- test/buffer-diff.c | 94 ++++++++ test/buffer-diff.h | 7 + test/cairo-test.c | 287 ++++++++++++++--------- test/caps-joins-ref.png | Bin 1262 -> 1488 bytes test/caps-joins.c | 6 + test/caps-sub-paths-ref.png | Bin 164 -> 197 bytes test/caps-sub-paths.c | 6 + test/clip-fill-rule-pixel-aligned-rgb24-ref.png | Bin 194 -> 184 bytes test/clip-fill-rule-rgb24-ref.png | Bin 495 -> 380 bytes test/clip-nesting-rgb24-ref.png | Bin 846 -> 955 bytes test/clip-operator-rgb24-ref.png | Bin 20991 -> 16507 bytes test/clip-twice-rgb24-ref.png | Bin 1278 -> 1120 bytes test/dash-caps-joins-ref.png | Bin 2347 -> 3219 bytes test/dash-caps-joins.c | 6 + test/dash-offset-negative-ref.png | Bin 155 -> 171 bytes test/dash-offset-negative.c | 6 + test/fill-and-stroke-rgb24-ref.png | Bin 299 -> 257 bytes test/fill-rule-rgb24-ref.png | Bin 2320 -> 1722 bytes test/gradient-alpha-rgb24-ref.png | Bin 152 -> 142 bytes test/leaky-polygon-ref.png | Bin 255 -> 368 bytes test/leaky-polygon.c | 6 + test/line-width-ref.png | Bin 171 -> 201 bytes test/line-width.c | 4 + test/mask-ctm-rgb24-ref.png | Bin 140 -> 124 bytes test/mask-rgb24-ref.png | Bin 73292 -> 71069 bytes test/mask-surface-ctm-rgb24-ref.png | Bin 140 -> 124 bytes test/multi-page.c | 2 +- test/nil-surface-rgb24-ref.png | Bin 106 -> 106 bytes test/operator-clear-rgb24-ref.png | Bin 5677 -> 4218 bytes test/operator-source-rgb24-ref.png | Bin 16746 -> 14699 bytes test/paint-with-alpha-rgb24-ref.png | Bin 146 -> 142 bytes test/path-data-ref.png | Bin 387 -> 579 bytes test/path-data.c | 6 + test/png-flatten.c | 77 ++++++ test/rel-path-rgb24-ref.png | Bin 115 -> 228 bytes test/scale-source-surface-paint-rgb24-ref.png | Bin 146 -> 136 bytes test/set-source-rgb24-ref.png | Bin 114 -> 120 bytes test/show-text-current-point-ref.png | Bin 1606 -> 2411 bytes test/show-text-current-point.c | 6 + test/source-surface-scale-paint-rgb24-ref.png | Bin 136 -> 133 bytes test/text-antialias-gray-ref.png | Bin 740 -> 1084 bytes test/text-antialias-gray.c | 6 + test/text-antialias-none-ref.png | Bin 276 -> 298 bytes test/text-antialias-none.c | 6 + test/text-pattern-rgb24-ref.png | Bin 2704 -> 2339 bytes test/transforms-ref.png | Bin 302 -> 361 bytes test/transforms.c | 6 + test/trap-clip-rgb24-ref.png | Bin 64728 -> 63087 bytes test/unbounded-operator-rgb24-ref.png | Bin 7555 -> 6047 bytes 68 files changed, 756 insertions(+), 174 deletions(-) commit 0b48d620f11a1efb611d2ad6888c8e5d8f64db03 Author: Christian Biesinger Date: Sun Jan 15 04:44:45 2006 +0000 Update BeOS reference images per the recent gradient changes ChangeLog | 9 +++++++++ test/mask-beos-rgb24-ref.png | Bin 73554 -> 73512 bytes test/mask-beos_bitmap-argb32-ref.png | Bin 87543 -> 87641 bytes test/mask-beos_bitmap-rgb24-ref.png | Bin 73554 -> 73512 bytes test/trap-clip-beos-rgb24-ref.png | Bin 64724 -> 64729 bytes test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 64724 -> 64729 bytes 6 files changed, 9 insertions(+), 0 deletions(-) commit c79cda6150a71846ce546b27f243d858ec5fd037 Author: Christian Biesinger Date: Sat Jan 14 06:53:43 2006 +0000 Ignore glitz-glx test output ChangeLog | 4 ++++ test/.cvsignore | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 59eff46fdf201f6269daf5fa101eafdf4f881e30 Author: Carl Worth Date: Fri Jan 13 13:41:45 2006 +0000 Fix things up to conform with Adobe PostScript Document Structuring Conventions Specification. Thanks to Michael Sweet for bringing several items to our attention. Things that are fixed: Add Pages: (atend) to header, add Pages: N to trailer, properly advertise DocumentData of Binary rather than Clean7Bit, remove fictitious EndPage, move showpage to after the grestore. ChangeLog | 12 ++++++++++++ src/cairo-ps-surface.c | 25 +++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) commit 6f3cb04d9c8bb1e72de3b6ea71b475f9457ffcb9 Author: Carl Worth Date: Fri Jan 13 11:02:25 2006 +0000 Rip out the misguided paint-with-white and RGB24 surface code and go back to using ARGB32. It turns out that the PS backend already has its own blend-with-white code, and the test-paginated-surface really wants ARGB32. ChangeLog | 10 ++++++++++ src/cairo-paginated-surface.c | 28 ++++------------------------ 2 files changed, 14 insertions(+), 24 deletions(-) commit b4e4568962e53c6b85027165da62b73020ec4586 Author: Carl Worth Date: Fri Jan 13 09:25:28 2006 +0000 Eliminate cast of state->dx.elements which has been wrong since the internals of cairo_array_t changed on 2005-12-21. Now, hopefully less than all text will be broken on win32. ChangeLog | 7 +++++++ src/cairo-win32-font.c | 4 +++- 2 files changed, 10 insertions(+), 1 deletions(-) commit 4e4b38e75930e3da8c33a02eae77fb736659ff44 Author: Carl Worth Date: Thu Jan 12 16:47:05 2006 +0000 Add a call to cairo_copy_page, so that that gets called at least once within the test suite. Fix broken implementation of copy_page in the paginated surface by hiding it from the target surface which sees only show_page operations. (It's hard to do better than that unless we can guarantee thathe subsequent page won't trigger any image fallbacks.) ChangeLog | 13 +++++++++++++ src/cairo-paginated-surface.c | 29 ++++++++--------------------- test/multi-page.c | 20 ++++++++++++++------ 3 files changed, 35 insertions(+), 27 deletions(-) commit 25882cd5e9d51f84338af6278c50d268b3d0091c Author: Carl Worth Date: Thu Jan 12 16:35:12 2006 +0000 Add a new CAIRO_HAS_MULTI_PAGE_SURFACES automake conditional. Remove backend-specific tests (ps-surface, pdf-surface, and pdf-clip) that are now redundant with the ps and pdf support in the rest of the test suite. Add a new one-off test for testing show_page with both the ps and pdf backends. ChangeLog | 17 +++++ configure.in | 2 + test/.cvsignore | 9 +-- test/Makefile.am | 21 ++---- test/multi-page.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++ test/pdf-clip.c | 134 ----------------------------------------- test/pdf-surface.c | 111 ---------------------------------- test/ps-surface.c | 122 ------------------------------------- 8 files changed, 199 insertions(+), 387 deletions(-) commit 3647ff95f968a68f938fa7cdea9d48880f1064bd Author: Carl Worth Date: Thu Jan 12 13:36:36 2006 +0000 Some fixes for the fact that multi-page output was totally broken for cairo_ps_surface_t (at least): Move the Y-axis-flipping to be on a per-page basis (as it was before and as it must be). Put page number back in, (still missing th number of pages from the header). Add multi-page output for better testing. ChangeLog | 20 +++++++++++++ src/cairo-ps-surface.c | 72 ++++++++++++++++++++++++++++++++++------------- test/ps-surface.c | 29 +++++++++++++------ 3 files changed, 92 insertions(+), 29 deletions(-) commit 107a52ed6190a72882598eec5f2cf0fab24f4cb1 Author: Carl Worth Date: Wed Jan 11 16:29:17 2006 +0000 Paint with white to intermediate RGB24 images before replaying meta-surface to preserve default white background instead of forcing a black background instead. ChangeLog | 9 +++++++++ src/cairo-paginated-surface.c | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletions(-) commit ebeaeeccece1a6cbe68db347ad782f2dd482afc3 Author: Carl Worth Date: Wed Jan 11 16:01:25 2006 +0000 Note that PS backend has now been switched over to use cairo_paginated_surface_t. Switch from ARGB32 to RGB24 for intermediate image surface since that's all that the current users of cairo_paginated_surface support anyway. Switch cairo_ps_surface_t over to use the new cairo_paginated_surface_t. This drastically simplifies the implementation, but temporarily puts the PostScript output back into the land of one-image-per-page. To be fixed soon though with improvements to cairo_paginated_surface_t. Everything still passes the test suite which is good. The test suite currently does no testing of multi-page output, which is quite bad. ChangeLog | 34 ++ ROADMAP | 11 +- src/cairo-paginated-surface.c | 6 +- src/cairo-ps-surface.c | 758 ++++++++++++----------------------------- 4 files changed, 254 insertions(+), 555 deletions(-) commit c23d7d4758c7915505437b0fc8b57df9ef628289 Author: Carl Worth Date: Wed Jan 11 11:53:33 2006 +0000 Note that from here on out, the PDF output should always pass the entire test suite! Add new functions needed by users of cairo_paginated_surface_t. Always snapshot a paginated surface to an image surface, rather than a surface similar to the target. We do this since paginated target surfaces are allowed to not be complete surfaces, (such as not implementing acquire_source_surface). Switch the implementation of cairo_pdf_surface_t to use cairo_paginated_surface_t. For now this means that all PDF output is fallback images, but this can change incrementally as we go forward. ChangeLog | 25 +++++++++++++++++++++++++ ROADMAP | 22 ++++++++++++---------- src/cairo-paginated-surface-private.h | 6 ++++++ src/cairo-paginated-surface.c | 24 ++++++++++++++++++++---- src/cairo-pdf-surface.c | 32 +++++++++++++++++++++++++++----- 5 files changed, 90 insertions(+), 19 deletions(-) commit 953561ebbd7e58ecb3e6cec0e2446cf3dac3f146 Author: Anders Carlsson Date: Tue Jan 10 07:54:17 2006 +0000 Remove old scale matrix since it exists in our base class. (_cairo_atsui_font_set_metrics): Fix descent calculation. ChangeLog | 12 ++++++++++++ src/cairo-atsui-font.c | 18 +++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) commit ae807fc9361fcb77b1cefc09cb180f045510768b Author: Anders Carlsson Date: Tue Jan 10 05:28:59 2006 +0000 Add cairo-quartz-private.h If the destination surface is a quartz surface, get the clip mask from it. Added. Keep a copy of the clip mask around. (_cairo_surface_is_quartz): New function which determines if a given surface is a quartz surface. ChangeLog | 21 +++++++++++++++ src/Makefile.am | 2 +- src/cairo-atsui-font.c | 33 +++++++++++++++++++++++- src/cairo-quartz-private.h | 61 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-quartz-surface.c | 37 +++++++++++++++----------- 5 files changed, 136 insertions(+), 18 deletions(-) commit d6cb82c37284aa0b5fb8e427faf0b360c9b26168 Author: Carl Worth Date: Mon Jan 9 17:18:12 2006 +0000 Add printf format attribute to cairo_test_log. ChangeLog | 4 ++++ test/cairo-test.h | 9 ++++++++- 2 files changed, 12 insertions(+), 1 deletions(-) commit ff5207ed11ed04df8f436c5d59e04ed0c3f4cc7f Author: Anders Carlsson Date: Mon Jan 9 10:29:22 2006 +0000 Use uint32_t instead of uint; pixman/ChangeLog | 7 +++++++ pixman/src/icimage.c | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) commit 7ce7b20a821c93c0edb9b2899c52b13f8067d860 Author: Carl Worth Date: Fri Jan 6 14:24:55 2006 +0000 Reviewed by keithp Change the paginated surface to force all output to come from an image surface (to be refined incrementally as we hook real surface backends up to it). ChangeLog | 10 ++++++++++ src/cairo-paginated-surface.c | 24 ++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) commit fbb8a62797657a98905b92bd01bfa995cc823def Author: Carl Worth Date: Fri Jan 6 14:11:07 2006 +0000 Reviewed by keithp Implement copy_page for paginated surface. Fix show_page to destroy the meta-surface and create a new one. Change these functions to advertise when they are not supported, so that _cairo_paginated_copy_page can implement things differently depending on whether or not it is personal. Check return values from _cairo_surface_show/copy_page. ChangeLog | 21 ++++++++++++++++ src/cairo-gstate.c | 20 +++++++++++++- src/cairo-paginated-surface.c | 54 ++++++++++++++++++++++++++++++++++++++++- src/cairo-surface.c | 16 +++++++---- src/cairoint.h | 4 +- 5 files changed, 104 insertions(+), 11 deletions(-) commit 88875100d6910d62edcaf7fadc2146594ad3268b Author: Carl Worth Date: Thu Jan 5 15:17:02 2006 +0000 Slip 1.2.0 projected data (again) out to 2006-01-13. Note that win32 is now incorporated into the test suite and is only failing two tests (self-copy and trap-clip). Note new progress on cairo_push/pop_group. Add item to support pango's hex-box drawing. Note that gradient computation performance has been improved. Note that experimental SVG backend has been added. ChangeLog | 10 ++++++++++ ROADMAP | 28 ++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) commit 6995a83597217bd422e74d79ce3c989334ada871 Author: David Reveman Date: Thu Jan 5 15:00:37 2006 +0000 Gradient updates in SVG backend and no sorting of color stops in SVG or PDF backend ChangeLog | 7 ++++ src/cairo-pdf-surface.c | 20 ------------- src/cairo-svg-surface.c | 73 ++++++++++++++++++++++------------------------- 3 files changed, 41 insertions(+), 59 deletions(-) commit 421504802570978aa6a107a96587cc8014fbd58c Author: David Reveman Date: Thu Jan 5 05:14:14 2006 +0000 Update gradient code in glitz backend ChangeLog | 3 +++ src/cairo-glitz-surface.c | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 15 deletions(-) commit 5ac6e85455fce862989033d5ff98576d159664bd Author: David Reveman Date: Thu Jan 5 05:06:50 2006 +0000 Update gradient code in PDF backend ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 30 +++++++++++++++--------------- 2 files changed, 20 insertions(+), 15 deletions(-) commit 9737b4de39162a86844e07f50aa76e881063dab9 Author: Carl Worth Date: Wed Jan 4 17:59:03 2006 +0000 2005-10-10 David Reveman Throw away old gradient code from within cairo-pattern.c in favor of using new support in pixman for gradients. Update reference images for all tests involving gradients since the gradient output has changed slightly. ChangeLog | 40 +++ src/cairo-image-surface.c | 14 +- src/cairo-matrix.c | 17 + src/cairo-pattern.c | 594 ++++++++------------------------- src/cairoint.h | 29 +- test/clip-operator-ref.png | Bin 37134 -> 36956 bytes test/clip-operator-rgb24-ref.png | Bin 21014 -> 20991 bytes test/gradient-alpha-ref.png | Bin 154 -> 155 bytes test/gradient-alpha-rgb24-ref.png | Bin 147 -> 152 bytes test/linear-gradient-ref.png | Bin 12719 -> 12750 bytes test/linear-gradient-rgb24-ref.png | Bin 12719 -> 11700 bytes test/mask-ref.png | Bin 87846 -> 87837 bytes test/mask-rgb24-ref.png | Bin 73124 -> 73292 bytes test/operator-clear-ref.png | Bin 4971 -> 4933 bytes test/operator-clear-rgb24-ref.png | Bin 5704 -> 5677 bytes test/operator-source-ref.png | Bin 19982 -> 19684 bytes test/operator-source-rgb24-ref.png | Bin 16909 -> 16746 bytes test/text-pattern-ref.png | Bin 2731 -> 2725 bytes test/text-pattern-rgb24-ref.png | Bin 2686 -> 2704 bytes test/trap-clip-ref.png | Bin 71701 -> 71785 bytes test/trap-clip-rgb24-ref.png | Bin 64724 -> 64728 bytes test/unbounded-operator-ref.png | Bin 11994 -> 11964 bytes test/unbounded-operator-rgb24-ref.png | Bin 7581 -> 7555 bytes 23 files changed, 221 insertions(+), 473 deletions(-) commit 19441311e471b661b6b2a6854f030aafa7715d5d Author: Carl Worth Date: Wed Jan 4 16:39:23 2006 +0000 2005-10-10 David Reveman Some major performance improvements to the general composite code used for gradients and transformed images. Like fetching of mask scanline before source scanline so that only the necessary pixels from source needs to be computed in case of gradients or transformed images as source. This patch also include some gradient specific fixes and performance improvement. pixman/ChangeLog | 22 +- pixman/src/fbcompose.c | 1187 ++++++++++++++++++++++++++++++------------------ pixman/src/icimage.c | 17 +- pixman/src/icimage.h | 9 + 4 files changed, 776 insertions(+), 459 deletions(-) commit 305a83721f5c6423fc1e7fbb0cf1d67c0f92ecb7 Author: Carl Worth Date: Wed Jan 4 16:26:10 2006 +0000 Originally: 2005-10-10 David Reveman Add entries for gradient support. Add PictureGradientColor. Add necessary functionality for gradient support. Enable gradient support. pixman/ChangeLog | 13 ++ pixman/src/fbcompose.c | 91 +++++++++----- pixman/src/icimage.c | 334 +++++++++++++++++++++++++++++++++++++++++++++--- pixman/src/icimage.h | 72 +++++++++++ pixman/src/icint.h | 7 + pixman/src/pixman.h | 48 ++++++-- 6 files changed, 510 insertions(+), 55 deletions(-) commit c6cdfc5770c6bfb5d708cb1c13921079f611299a Author: Vladimir Vukicevic Date: Tue Jan 3 09:23:48 2006 +0000 Clamp surface dimensions to a minimum of 1. (_cairo_glitz_surface_get_image): Set the glitz clip to NULL before calling glitz_get_pixels, to return the full surface contents. Restore clip afterwards. (_cairo_glitz_surface_composite_trapezoid): Return UNSUPPORTED if the antialias is anything other than DEFAULT/GRAY. Try to recover a standard cairo_format_t from given pixman format masks, so that various things that only work with a standard format work correctly. Remove cairo_glitz_surface_write_to_png, replace with generic cairo_surface_write_to_png (since it works with image-surface create_with_masks fix) ChangeLog | 19 ++++++++++++++++++ src/cairo-glitz-surface.c | 30 +++++++++++++++++++++++++++- src/cairo-image-surface.c | 45 +++++++++++++++++++++++++++++++++++++++++++- test/cairo-test.c | 46 ++++++++++++-------------------------------- 4 files changed, 104 insertions(+), 36 deletions(-) commit bd265e008b6cb48565569733d48cb5bd2d4ba1b9 Author: Vladimir Vukicevic Date: Tue Jan 3 07:29:57 2006 +0000 Clean up output some; show only images that fail, otherwise just show pass/fail squares. ChangeLog | 5 +++ test/make-html.pl | 81 +++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 68 insertions(+), 18 deletions(-) commit 71369489d831ef0ec050f3e9da6226617e2ffa1b Author: Emmanuel Pacaud Date: Fri Dec 30 14:16:10 2005 +0000 no more has_clip boolean. Init clip_level. (_cairo_surface_intersect_clip_path): a NULL path means reset of clipping region, not back to previous clipping level. ChangeLog | 11 +++++++++-- src/cairo-svg-surface.c | 12 ++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) commit 23e5e558414cbbb5e20a6b8b5e68f21c6a3ed15d Author: Michael Emmel Date: Thu Dec 29 07:17:01 2005 +0000 New directfb backend for cairo includes test suite and example to run the test is in the comment at the top of cairo-test-directfb.c enable with --enable-directfb configure.in | 25 ++ src/Makefile.am | 9 +- src/cairo-directfb-surface.c | 804 ++++++++++++++++++++++++++++++++++++++++++ src/cairo-directfb.h | 60 ++++ src/cairo-features.h.in | 2 + test/Makefile.am | 4 + test/cairo-test-directfb.c | 127 +++++++ test/cairo-test-directfb.h | 23 ++ test/cairo-test.c | 11 + 9 files changed, 1064 insertions(+), 1 deletions(-) commit f7236b84603c45d9c67cc5dfed6305a8a1241f6c Author: Emmanuel Pacaud Date: Wed Dec 28 02:28:56 2005 +0000 namespace declarations for SVG and XLINK (#5411). ChangeLog | 5 +++++ src/cairo-svg-surface.c | 5 ++++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 78d892d70eb28a92f3300727ecc753cd564a5fe7 Author: Christian Biesinger Date: Tue Dec 27 09:47:58 2005 +0000 Add BeOS-specific reference images for tests where the maximum color difference is 1. ChangeLog | 13 +++++++++++++ test/mask-beos-rgb24-ref.png | Bin 0 -> 73554 bytes test/mask-beos_bitmap-argb32-ref.png | Bin 0 -> 87543 bytes test/mask-beos_bitmap-rgb24-ref.png | Bin 0 -> 73554 bytes test/set-source-beos-rgb24-ref.png | Bin 0 -> 124 bytes test/set-source-beos_bitmap-rgb24-ref.png | Bin 0 -> 124 bytes test/trap-clip-beos-rgb24-ref.png | Bin 0 -> 64724 bytes test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 0 -> 64724 bytes 8 files changed, 13 insertions(+), 0 deletions(-) commit f036c28fa3aa7f9d18cd47b4b5dc7f728af04d5f Author: Christian Biesinger Date: Mon Dec 26 19:08:53 2005 +0000 Implement composite for the beos backend. Don't map CAIRO_OPERATOR_ADD to B_OP_ADD for now, something's broken there. ChangeLog | 6 +++ src/cairo-beos-surface.cpp | 99 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 104 insertions(+), 1 deletions(-) commit 4fe93bcf92f4aeb5ea78bf48e109b4f5b7555181 Author: Christian Biesinger Date: Mon Dec 26 16:44:41 2005 +0000 Don't require that the caller locks the view; do it in cairo code. Remove the now-unneeded locking ChangeLog | 6 +++++ src/cairo-beos-surface.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++- test/cairo-test-beos.cpp | 19 ++++++--------- 3 files changed, 65 insertions(+), 12 deletions(-) commit 36850c7f32c25031a1ed8387a78c6edc43d9f67d Author: Carl Worth Date: Wed Dec 21 17:08:28 2005 +0000 Remove some unneeded backend functions (composite, fill_rectangles, composite_trapezoids, old_show_glyphs). ChangeLog | 6 ++ src/cairo-ps-surface.c | 128 ++---------------------------------------------- 2 files changed, 10 insertions(+), 124 deletions(-) commit 0a009c925f34ad82f2130a6dae731c7cda0bcb35 Author: Carl Worth Date: Wed Dec 21 17:04:01 2005 +0000 Don't implement create_similar for the test-meta or the paginated surface. This was slowing things down a _lot_ (about 11× for the mask test for example) without any improvement in output quality. We can revisit this again later if there's any output improvement to be had down the road. ChangeLog | 10 ++++++++++ src/cairo-paginated-surface.c | 11 +---------- src/test-meta-surface.c | 14 +------------- 3 files changed, 12 insertions(+), 23 deletions(-) commit e71e2fc4f186eecde0b987c3e82ffbecafeebcad Author: Carl Worth Date: Wed Dec 21 16:46:44 2005 +0000 Add a private cairo_paginated_surface_t which builds on top of the meta surface and is intended to provide an easy interface with common functionality for the various paginated surface types (ps, pdf, etc.). Add test_paginated_surface_t which is another test surface enabled with --enable-test-surfaces. The test_meta_surface code served as the basis for cairo_paginated_surface_t so that test surface may be entirely superfluous now. ChangeLog | 32 +++ src/Makefile.am | 5 +- src/cairo-paginated-surface-private.h | 46 +++++ src/cairo-paginated-surface.c | 337 +++++++++++++++++++++++++++++++++ src/test-paginated-surface.c | 67 +++++++ src/test-paginated-surface.h | 52 +++++ test/cairo-test.c | 85 +++++++++ 7 files changed, 623 insertions(+), 1 deletions(-) commit c78685399307431903613733ddc936a104376943 Author: Carl Worth Date: Wed Dec 21 16:35:32 2005 +0000 Here is a cleaner implementation of the _cairo_array_t change which was previously committed inadvertently. Fix buggy implementation of _cairo_array_snapshot by changing array->elements to be a pointer to a pointer. This extra level of indirection allows the snapshot array to point to a pointer which will itself get changed when new storage is needed for a growing array. Previously, the snapshot would be left pointing at stale storage. Fix to call _cairo_array_index rather than grabbing array->elements directly and casting (which cast is now wrong with the change in implementation of array->index). ChangeLog | 23 +++++++++++++++++++++++ src/cairo-array.c | 42 ++++++++++++++++++++++++++++++++++-------- src/cairo-meta-surface.c | 4 ++-- src/cairo-win32-font.c | 4 +++- src/cairoint.h | 2 +- 5 files changed, 63 insertions(+), 12 deletions(-) commit 122a83643b79ec197979e01620dd5dc21620e0e0 Author: Carl Worth Date: Wed Dec 21 12:20:06 2005 +0000 Revert inadvertent commit (immediately previous). ChangeLog | 13 +++++++++++ src/cairo-array.c | 53 ++++++++++++++------------------------------- src/cairo-meta-surface.c | 15 ++++-------- src/cairo-win32-font.c | 18 +++++++-------- src/cairoint.h | 2 +- 5 files changed, 44 insertions(+), 57 deletions(-) commit 5280c09b7d5d903455cad75dd4885478e8fa2761 Author: Carl Worth Date: Wed Dec 21 12:08:57 2005 +0000 Fix indentation. ChangeLog | 4 +++ src/cairo-array.c | 53 +++++++++++++++++++++++++++++++-------------- src/cairo-meta-surface.c | 15 ++++++++---- src/cairo-win32-font.c | 18 ++++++++------- src/cairoint.h | 2 +- src/test-meta-surface.h | 4 +- test/.cvsignore | 1 + 7 files changed, 64 insertions(+), 33 deletions(-) commit 3eb2a252ad22295725281908448e88a2c53462ae Author: Carl Worth Date: Wed Dec 21 12:07:25 2005 +0000 Remove cruft from old commands that the meta surface no longer implements (composite, fill_rectangles, composite_trapezoids, and set_clip_region). ChangeLog | 6 ++++ src/cairo-meta-surface-private.h | 49 -------------------------------------- 2 files changed, 6 insertions(+), 49 deletions(-) commit 088c664b9c891580b4f92bf5419f6757a09e96cc Author: Christian Biesinger Date: Wed Dec 21 08:19:47 2005 +0000 Fix some typos ChangeLog | 8 ++++++++ src/cairo-ft-font.c | 2 +- src/cairo-gstate.c | 4 ++-- src/cairoint.h | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) commit 90c1837e175f3380b29ad8bb929f9e5787371e24 Author: Emmanuel Pacaud Date: Wed Dec 21 07:25:01 2005 +0000 store surfaces in a node, and clip to surface area. Now SVG backend should pass pixman-rotate test. (emit_composite_svg_pattern): emit transformation matrix. (_cairo_svg_surface_intersect_clip_path): don't use xmlBuffer here. ChangeLog | 8 +++++ src/cairo-svg-surface.c | 72 ++++++++++++++++++++++++++++------------------ 2 files changed, 52 insertions(+), 28 deletions(-) commit e95376c1c3d586d52808e16a4b13a8eef9a9abad Author: Carl Worth Date: Tue Dec 20 10:30:11 2005 +0000 Add some comments describing what a cairo_meta_surface_t is. Remove unused _test_fallback_surface_create_for_data. Remove unused _test_meta_surface_create_for_data. Add missing source file src/test-meta-surface.h. ChangeLog | 14 ++++++++++++ src/cairo-meta-surface.c | 19 ++++++++++++++++ src/test-fallback-surface.c | 28 ------------------------ src/test-fallback-surface.h | 7 ------ src/test-meta-surface.c | 38 -------------------------------- src/test-meta-surface.h | 50 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 83 insertions(+), 73 deletions(-) commit 7cc38be7d1e5967cf4f09bd6c0a1ac8f7b059ad8 Author: Carl Worth Date: Tue Dec 20 09:37:15 2005 +0000 Move more fallback code from cairo-gstate.c to cairo-surface-fallback.c where it belongs. In the process, clean up the function names a bit and make the whole mess static. ChangeLog | 16 ++ src/cairo-gstate.c | 538 ------------------------------------- src/cairo-surface-fallback.c | 607 +++++++++++++++++++++++++++++++++++++++--- src/cairoint.h | 25 -- 4 files changed, 592 insertions(+), 594 deletions(-) commit ff486bec0fb1f991217ac9023c0559176ba19a0f Author: Carl Worth Date: Mon Dec 19 22:45:41 2005 +0000 Begin moving fallback code out of cairo-surface.c and into cairo-surface-fallback.c. ChangeLog | 22 ++ src/Makefile.am | 2 + src/cairo-surface-fallback-private.h | 119 +++++++ src/cairo-surface-fallback.c | 625 +++++++++++++++++++++++++++++++++ src/cairo-surface.c | 644 ++-------------------------------- 5 files changed, 797 insertions(+), 615 deletions(-) commit 75b2fe93f09324b509630d86e0b01de830d853cf Author: Carl Worth Date: Mon Dec 19 22:01:39 2005 +0000 Use _cairo_surface_paint rather than _cairo_surface_fill_rectangle as only the former is guaranteed to work with all backends. Refine the comment describing this test surface. Add new test surface for exercising cairo_meta_surface. Simplify the image and test_fallback targets by not using create_for_data. Allow for NULL cleanup target functions. Add support for the test_meta_surface. ChangeLog | 31 ++++ src/Makefile.am | 3 +- src/cairo-surface.c | 15 ++- src/test-fallback-surface.c | 8 +- src/test-meta-surface.c | 375 +++++++++++++++++++++++++++++++++++++++++++ test/.cvsignore | 1 + test/cairo-test.c | 53 ++---- 7 files changed, 444 insertions(+), 42 deletions(-) commit 606d23b2874288c18f7373ffa47b0fb6b63b3451 Author: Christian Biesinger Date: Mon Dec 19 17:16:28 2005 +0000 Use correct color when OPERATOR_SOURCE is used on a surface without alpha information. ChangeLog | 5 +++++ src/cairo-beos-surface.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) commit d0eaab305c69b386fde72fb0a325df2c5d62385d Author: Emmanuel Pacaud Date: Mon Dec 19 15:33:32 2005 +0000 fix stroke linewidth and dashes, I hope. Emit stroke-dashoffset. ChangeLog | 5 +++++ src/cairo-svg-surface.c | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) commit a83a42b248a8fe22e513b0b61dd7ca1981d7b4dd Author: Keith Packard Date: Mon Dec 19 15:08:05 2005 +0000 Use NULL clip instead of special serial zero cairo_clip_t Should make using surfaces easier. ChangeLog | 11 +++++++++++ src/cairo-clip.c | 6 ++++++ src/cairo-gstate.c | 31 ++++++++++++++++++------------- src/cairo-surface.c | 28 +++++++++++++++++++--------- 4 files changed, 54 insertions(+), 22 deletions(-) commit ffe10b7c877ef71ee4e982fcf4a1de5b4476b243 Author: Emmanuel Pacaud Date: Mon Dec 19 14:18:06 2005 +0000 Shhhh... test/.cvsignore | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit ec574cd6f0a4244a45d69894f41db1910585e05d Author: Emmanuel Pacaud Date: Mon Dec 19 13:59:34 2005 +0000 CAIRO_CAN_TEST_SVG_SURFACE depends on librsvg. cairo_svg_surface_t owns a xml node, for support of svg_surface_composite. (_cairo_svg_surface_create_for_document): init xml_node. All surfaces except first one are stored in defs node. (emit_composite_image_pattern): returns pattern size, and don't call emit_transform if is_pattern == TRUE. (emit_composite_svg_pattern): do something. (emit_composite_pattern): returns pattern size. (_cairo_svg_surface_composite): xml_node is stored in cairo_svg_surface_t now. (emit_surface_pattern): emit surface pattern width here. Fix property names. (_cairo_svg_path_close_path): don't close path if no current point. (_cairo_svg_surface_fill_rectangles): new. (_cairo_svg_surface_fill): emit fill rule. xml_node is in surface now. (_cairo_svg_surface_composite_trapezoids): xml_node is in surface now. (_cairo_svg_surface_stroke): ditto. (_cairo_svg_surface_intersect_clip_path): ditto. Emit fill rule. ignore svg2png. build svg2png utility. test SVG backend if CAIRO_HAS_SVG_SURFACE && CAIRO_CAN_TEST_SVG_SURFACE. new. ChangeLog | 30 ++++++++ configure.in | 10 +++ src/cairo-svg-surface.c | 178 +++++++++++++++++++++++++++++++++++++++-------- test/.cvsignore | 1 + test/Makefile.am | 8 ++- test/cairo-test.c | 69 ++++++++++++++++++ test/svg2png.c | 62 ++++++++++++++++ 7 files changed, 329 insertions(+), 29 deletions(-) commit 70c45dd5020af78ee2532ceb8d55eea619bc4aaa Author: Christian Biesinger Date: Mon Dec 19 11:01:42 2005 +0000 Some final changes to the beos backend before checkin were wrong, fixing. ChangeLog | 6 ++++++ configure.in | 2 +- src/cairo-beos-surface.cpp | 4 ++-- 3 files changed, 9 insertions(+), 3 deletions(-) commit 9af7220b68f97db4dd2b91ce414d2d7ac3194410 Author: Christian Biesinger Date: Mon Dec 19 10:17:22 2005 +0000 Use gtk-doc syntax rather than doxygen syntax for internal functions (to avoid warnings from gtk-doc when it processes this file) ChangeLog | 6 ++++++ src/cairo-beos-surface.cpp | 30 +++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) commit 6142bc534850dda7ecf823c2a672ed65c13978eb Author: Christian Biesinger Date: Sun Dec 18 17:20:06 2005 +0000 Mention new --enable-svg option Add notes for the new BeOS backend Add disabled by default BeOS backend Add BeOS files New New BEOS_SURFACE_FEATURE BeOS mutex functions Ignore files generates by the BeOS tests Add cairo-test-beos.* New. Test BeOS backend. ChangeLog | 17 + INSTALL | 1 + README | 5 + configure.in | 44 +++ src/Makefile.am | 11 + src/cairo-beos-surface.cpp | 731 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-beos.h | 61 ++++ src/cairo-features.h.in | 2 + src/cairoint.h | 11 + test/.cvsignore | 3 + test/Makefile.am | 6 + test/cairo-test-beos.cpp | 239 +++++++++++++++ test/cairo-test-beos.h | 26 ++ test/cairo-test.c | 13 + 14 files changed, 1170 insertions(+), 0 deletions(-) commit 93da7fa203a8e4bce40aab590a8c245400013787 Author: Christian Biesinger Date: Sun Dec 18 16:37:14 2005 +0000 Move enum to cairoint.h add CAIRO_BEGIN_DECLS and CAIRO_END_DECLS, and move an enum from cairo-clip-private.h here (C++ doesn't like forward-declarations of enums). Final patch for allowing C++ backends. reviewed by: cworth ChangeLog | 10 ++++++++++ src/cairo-clip-private.h | 6 ------ src/cairoint.h | 10 +++++++++- 3 files changed, 19 insertions(+), 7 deletions(-) commit 2c8859c8b51b10fd52b032aef54bb394e9acb011 Author: Christian Biesinger Date: Fri Dec 16 16:23:04 2005 +0000 make the SVG backend freetype message actually mention SVG rather than PDF. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 464d3fc563442ebe0efcdd1689e4b83cc92c794b Author: Carl Worth Date: Fri Dec 16 11:48:48 2005 +0000 Return a test_fallback_surface_t rather than a cairo_image_surface_t for better testing, (otherwise, an image surface would meet the semantic demands of create_similar just fine). ChangeLog | 8 ++++++++ src/test-fallback-surface.c | 10 +++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) commit c75232f8abfb1dc56ff669d3b102f71f9cd892c1 Author: Carl Worth Date: Fri Dec 16 11:31:10 2005 +0000 Add a new option --enable-test-surfaces. New surface backend for testing only. It has as many NULL backend entries as possible. Add support to test the new test_fallback backend. ChangeLog | 22 ++++ configure.in | 19 ++++- src/Makefile.am | 11 ++- src/test-fallback-surface.c | 225 +++++++++++++++++++++++++++++++++++++++++++ src/test-fallback-surface.h | 57 +++++++++++ test/.cvsignore | 1 + test/Makefile.am | 18 ++-- test/cairo-test.c | 34 +++++++ 8 files changed, 373 insertions(+), 14 deletions(-) commit 79eee2c303c09c33d2f5bc4fc4d88b9608c201d6 Author: Carl Worth Date: Fri Dec 16 11:21:24 2005 +0000 Don't export cairo_image_surface_set_clip_region. Eliminate some unnecessary _cairo_image_abstract_surface variations of backend function. Remove errant include of cairo-pdf.h. ChangeLog | 11 +++++++++++ src/cairo-font-subset.c | 4 ++-- src/cairo-image-surface.c | 32 +++++++++----------------------- src/cairoint.h | 4 ---- 4 files changed, 22 insertions(+), 29 deletions(-) commit 6ba7772138d5ce64cef13b296cb61f94b49f9c24 Author: Christian Biesinger Date: Fri Dec 16 03:02:35 2005 +0000 Globally rename "operator" to "op", to allow writing backends in C++ reviewed by: cworth CODING_STYLE | 2 +- ChangeLog | 88 +++++++++++++++++++++++++++ src/cairo-atsui-font.c | 2 +- src/cairo-clip-private.h | 2 +- src/cairo-clip.c | 4 +- src/cairo-ft-font.c | 2 +- src/cairo-gstate-private.h | 2 +- src/cairo-gstate.c | 90 ++++++++++++++-------------- src/cairo-image-surface.c | 24 ++++---- src/cairo-meta-surface-private.h | 16 +++--- src/cairo-meta-surface.c | 30 +++++----- src/cairo-pdf-surface.c | 10 ++-- src/cairo-ps-surface.c | 90 ++++++++++++++-------------- src/cairo-scaled-font.c | 10 ++-- src/cairo-surface.c | 122 +++++++++++++++++++------------------- src/cairo-svg-surface.c | 20 +++--- src/cairo-win32-font.c | 8 +- src/cairo-win32-surface.c | 16 +++--- src/cairo-xcb-surface.c | 18 +++--- src/cairo-xlib-surface.c | 80 ++++++++++++------------ src/cairoint.h | 56 +++++++++--------- test/get-and-set.c | 8 +- 22 files changed, 394 insertions(+), 306 deletions(-) commit 11d20940b28906af2d9dac687b96d38895c7eec1 Author: Carl Worth Date: Thu Dec 15 08:58:08 2005 +0000 Make poppler check require poppler >= 0.4.1. ChangeLog | 4 ++++ configure.in | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 88615148caa317200efcb9768a9f310323546697 Author: Stuart Parmenter Date: Wed Dec 14 19:56:09 2005 +0000 #define access _access and #define F_OK to 0 on for MSVC add CAIRO_BEGIN_DECLS and CAIRO_END_DECLS ChangeLog | 6 ++++++ test/cairo-test.c | 2 ++ test/cairo-test.h | 4 ++++ 3 files changed, 12 insertions(+), 0 deletions(-) commit 9becae35c085d5f7afe08781c4e2546ee7c7287c Author: Carl Worth Date: Wed Dec 14 16:45:39 2005 +0000 Remove dead code from cairo-meta-surface: vestiges of meta-surface backend implementations of composite, fill_rectangles, composite_trapezoids, set_clip_region, and old_show_glyphs. ChangeLog | 9 ++ pixman/src/.cvsignore | 2 + src/cairo-meta-surface-private.h | 6 +- src/cairo-meta-surface.c | 233 +------------------------------------- 4 files changed, 15 insertions(+), 235 deletions(-) commit 77540a2dfafeea1de9d45847bd93621d7cafa92d Author: Carl Worth Date: Wed Dec 14 16:22:06 2005 +0000 Add preliminary support for --enable-gcov. Thanks to Pierre-Alain Joye (with inspiration from the PHP gcov support by Jani Taskinen and Ilia Alshanetsky). Ignore *.gcda and *.gcno gcov data files. ChangeLog | 9 ++++++ configure.in | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/.cvsignore | 2 + test/.cvsignore | 1 + 4 files changed, 85 insertions(+), 3 deletions(-) commit bb418ab4e538b035f3a5d7a56d142198d8e432ff Author: Carl Worth Date: Tue Dec 13 16:31:14 2005 +0000 Make creator be cairo, not Cairo. ChangeLog | 5 +++++ src/cairo-ps-surface.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit c2c4f0bb251423737d46fcde7ffe8711547abf09 Author: Vladimir Vukicevic Date: Mon Dec 12 11:56:40 2005 +0000 bump glitz req to 0.5.1, test for backends Add glitz backend (original patches from sunmoon1997@gmail.com), including glx, wgl, and agl support. Add CAIRO_TEST_TARGET environment variable for limiting backends to test. Takes all *.log files and spits out html to stdout that can be used to view all test results at once. ChangeLog | 12 ++ configure.in | 31 +++- src/Makefile.am | 21 ++- test/Makefile.am | 14 ++ test/cairo-test.c | 540 +++++++++++++++++++++++++++++++++++++++++++++++++++-- test/make-html.pl | 161 ++++++++++++++++ 6 files changed, 753 insertions(+), 26 deletions(-) commit 840f93698d5a89634c573f25911e9dc6020a46e1 Author: Emmanuel Pacaud Date: Thu Dec 8 13:22:09 2005 +0000 shhh... ChangeLog | 4 ++++ test/.cvsignore | 4 ++++ 2 files changed, 8 insertions(+), 0 deletions(-) commit b2f973e7f4a5bf4d953d52dfb71cb84472d32770 Author: Emmanuel Pacaud Date: Thu Dec 8 13:09:26 2005 +0000 add optionnal disabled by default SVG backend. include SVG backend files. include SVG_SURFACE_FEATURE. rename dtostr to _cairo_dtostr for use in cairo-svg-surface.c. _cairo_dtostr declaration. new. new. build svg-surface and svg-clip. new. new. ChangeLog | 16 + configure.in | 50 ++- src/Makefile.am | 7 + src/cairo-features.h.in | 2 + src/cairo-output-stream.c | 6 +- src/cairo-svg-surface.c | 1330 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-svg.h | 63 +++ src/cairoint.h | 3 + test/Makefile.am | 10 +- test/svg-clip.c | 134 +++++ test/svg-surface.c | 115 ++++ 11 files changed, 1723 insertions(+), 13 deletions(-) commit 73df5f2d6222d4847e4a4b821867be6b6963abf6 Author: Carl Worth Date: Wed Dec 7 16:16:20 2005 +0000 Note that that PDF backend has been incorporated into the test suite. ChangeLog | 5 +++++ ROADMAP | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 45c350e32810fecc09adecf5941ce9640543fb75 Author: Carl Worth Date: Wed Dec 7 16:06:11 2005 +0000 Add checks for poppler and friends which are needed by pdf2png. Set CAIRO_CAN_TEST_PDF_SURFACE as both a #define and an automake conditional. Build pdf2png if possible. Add support for testing the PDF backend. New utility program to convert a PDF file into a PNG image using poppler (thanks to Kristian Høgsberg). Ignore new stuff generated by PDF backend testing. ChangeLog | 18 +++++++++++ configure.in | 11 ++++++ test/.cvsignore | 3 ++ test/Makefile.am | 6 +++ test/cairo-test.c | 70 +++++++++++++++++++++++++++++++++++++++++- test/pdf2png.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 194 insertions(+), 2 deletions(-) commit 964c56e72bf5d4b1911b59070413e3424b88b6f4 Author: Carl Worth Date: Wed Dec 7 12:19:10 2005 +0000 Note that self-copy now works with the PS backend. Add _cairo_array_init_snapshot and checks for is_snapshot throughout. Add a new surface->backend->snapshot function. Implement _cairo_meta_surface_snapshot and _cairo_meta_surface_acquire/release_source_image. Change _cairo_meta_surface_create to require the width and height in pixels to be used when replaying for purposed of _cairo_meta_surface_aquire_source_image. Track change in prototype of _cairo_meta_surface_create. Implement _cairo_ps_surface_snapshot by deferring down into _cairo_meta_surface_snapshot. ChangeLog | 35 +++++++++++ ROADMAP | 6 +- src/cairo-array.c | 36 ++++++++++++ src/cairo-meta-surface-private.h | 12 +++- src/cairo-meta-surface.c | 116 +++++++++++++++++++++++++++++++++++-- src/cairo-ps-surface.c | 23 +++++++- src/cairo-surface.c | 53 ++++++++++------- src/cairoint.h | 12 ++++ 8 files changed, 257 insertions(+), 36 deletions(-) commit 96be55124f3abcb03ed3a901bc4f099185ab8864 Author: Carl Worth Date: Wed Dec 7 11:53:30 2005 +0000 Fix to check cairo_surface_status rather than !surface which is always false. (cleanup_ps): Fix leak of filename memory. ChangeLog | 6 ++++++ test/cairo-test.c | 4 +++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 0883155111ab9597d335c7d43ae47c163b5c0e4d Author: Carl Worth Date: Wed Dec 7 11:44:28 2005 +0000 Use more portable shell syntax, ('test =' rather than 'test =='). Thanks to Richard Lloyd and Klaus Heinz. Closes bug #4823. ChangeLog | 6 ++++++ configure.in | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit 4484830d6cbb5792304e3b6e4c4a07b6172f1a72 Author: David Reveman Date: Mon Dec 5 08:33:04 2005 +0000 glitz backend gradient fix ChangeLog | 5 +++++ src/cairo-glitz-surface.c | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit 57fe7920195474a865cc18f0c976f3ae5df87973 Author: David Reveman Date: Sun Dec 4 07:47:44 2005 +0000 More updates to track latest changes to glitz ChangeLog | 6 ++++++ src/cairo-glitz-surface.c | 3 +++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 2802950123c808246d0e9c40b1b7cc45043f9335 Author: David Reveman Date: Tue Nov 29 15:48:34 2005 +0000 Track changes to glitz ChangeLog | 5 +++ src/cairo-glitz-surface.c | 68 ++++++++++++++++----------------------------- 2 files changed, 29 insertions(+), 44 deletions(-) commit 9e7076fd27b69b4de21a617a9cb0fa74f91f6bec Author: Carl Worth Date: Mon Nov 21 11:46:40 2005 +0000 Remove duplicate definitions of pixman_color_to_pixel and pixman_composite. ChangeLog | 5 +++++ pixman/ChangeLog | 5 +++++ pixman/src/pixman-remap.h | 2 -- 3 files changed, 10 insertions(+), 2 deletions(-) commit 674ed1932e2264493e5f746989f02a6f2e0259a9 Author: Carl Worth Date: Mon Nov 21 10:50:20 2005 +0000 Add reminder to fix all memory leaks (as determined by the test suite) before release 1.2.0. Patch leak of patterns as noted in bug #5100 (thanks to Richard Stellingwerff ). ChangeLog | 9 +++++++++ ROADMAP | 4 ++++ src/cairo-gstate.c | 4 ++++ 3 files changed, 17 insertions(+), 0 deletions(-) commit 345ba540b1977db7e1a31f88aa8c8b2cdb32f11d Author: Carl Worth Date: Fri Nov 18 09:15:43 2005 +0000 Remove spurios INT_ prefixes which break the build with very recent binutils. ChangeLog | 5 +++++ pixman/ChangeLog | 5 +++++ pixman/src/pixman-remap.h | 4 ++-- 3 files changed, 12 insertions(+), 2 deletions(-) commit 49136c04f2fcbf463334bf256c72b7b280e2e819 Author: Stuart Parmenter Date: Thu Nov 17 11:55:20 2005 +0000 Hooked up tests to run on Windows with a Windows surface ChangeLog | 6 ++++++ test/cairo-test.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 7 deletions(-) commit a16d93f367af721a535ed13fc5bc07636e6549d2 Author: Anders Carlsson Date: Mon Nov 14 12:57:31 2005 +0000 If the surface is flipped, flip the CG coordinate system before drawing the images. (cairo_quartz_surface_create): Add "flipped" argument to cairo_quartz_surface_create. ChangeLog | 11 +++++++++++ src/cairo-quartz-surface.c | 13 +++++++++++++ src/cairo-quartz.h | 1 + 3 files changed, 25 insertions(+), 0 deletions(-) commit b5759f9e0746b48064c031009be8cd203f9bbaa5 Author: Carl Worth Date: Thu Nov 10 16:25:18 2005 +0000 Change scheduled release date of 1.2.0 out to 2005-12-15. ChangeLog | 5 +++++ ROADMAP | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 5b6c912667f62f808b9cf533b4486ce906197543 Author: Carl Worth Date: Tue Nov 8 17:43:13 2005 +0000 Note that PS is now passing all tests except for self-copy. Add missing glue to hook up PS backend with new meta-surface support for the 5 basic drawing operations. Currently, this forces image fallbacks for all operations. Switch from gs device of pngalpha to png16m which for some reason gives the correct result for nil-surface now, while pngalpha does not. Key off of N_OPERATORS as the loop control for easier trimming down of this test case when debugging. Rename stroke_style parameter to style in backend->stroke parameter list. Remove PS-specific reference images for many tests which are now using more fallback paths than before. ChangeLog | 46 ++++++ ROADMAP | 10 +- src/cairo-ps-surface.c | 196 +++++++++++++++++++++--- src/cairoint.h | 2 +- test/cairo-test.c | 2 +- test/caps-joins-ps-rgb24-ref.png | Bin 1420 -> 0 bytes test/caps-sub-paths-ps-rgb24-ref.png | Bin 237 -> 0 bytes test/clip-fill-rule-ps-rgb24-ref.png | Bin 309 -> 0 bytes test/clip-nesting-ps-rgb24-ref.png | Bin 517 -> 0 bytes test/clip-operator.c | 2 +- test/clip-twice-ps-rgb24-ref.png | Bin 605 -> 0 bytes test/dash-caps-joins-ps-rgb24-ref.png | Bin 2362 -> 0 bytes test/dash-offset-negative-ps-rgb24-ref.png | Bin 202 -> 0 bytes test/fill-and-stroke-ps-rgb24-ref.png | Bin 328 -> 0 bytes test/fill-rule-ps-rgb24-ref.png | Bin 2167 -> 0 bytes test/leaky-polygon-ps-rgb24-ref.png | Bin 353 -> 0 bytes test/line-width-ps-rgb24-ref.png | Bin 242 -> 0 bytes test/path-data-ps-rgb24-ref.png | Bin 440 -> 0 bytes test/rectangle-rounding-error-ps-rgb24-ref.png | Bin 365 -> 0 bytes test/show-text-current-point-ps-rgb24-ref.png | Bin 1477 -> 0 bytes test/text-antialias-gray-ps-rgb24-ref.png | Bin 714 -> 0 bytes test/text-antialias-none-ps-rgb24-ref.png | Bin 714 -> 0 bytes test/text-antialias-subpixel-ps-rgb24-ref.png | Bin 714 -> 0 bytes test/transforms-ps-rgb24-ref.png | Bin 418 -> 0 bytes test/unantialiased-shapes-ps-rgb24-ref.png | Bin 9899 -> 0 bytes 25 files changed, 231 insertions(+), 27 deletions(-) commit 48218fec48d1bfa2a93cc21f8f9df569e40ca79e Author: Carl Worth Date: Tue Nov 8 17:16:21 2005 +0000 Add support to cairo_meta_surface for the 5 basic drawing operations. Remove _cairo_meta_surface_get_extents and _cairo_meta_surface_old_show_glyphs. Remove size for _cairo_meta_surface_create. It is no longer needed now that get_extents is not a required backend function. Track change in cairo_meta_surface_create no longer requiring a size Qualify the glyphs argument to backend->show_glyphs as const. Whitespace style cleanup. ChangeLog | 31 +++ src/cairo-meta-surface-private.h | 99 +++++--- src/cairo-meta-surface.c | 553 +++++++++++++++++++++++--------------- src/cairo-ps-surface.c | 6 +- src/cairo-scaled-font.c | 4 +- src/cairo-surface.c | 10 +- src/cairoint.h | 8 +- 7 files changed, 451 insertions(+), 260 deletions(-) commit c66a3db4c3e33f10ebadfa818f532e21e9b8927f Author: Carl Worth Date: Tue Nov 8 11:44:18 2005 +0000 Split the 1.2.0 features into "essential" and "desired". ChangeLog | 5 +++++ ROADMAP | 12 ++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) commit 75881041f009af01a7f13b3488db493d7a91b456 Author: Carl Worth Date: Tue Nov 8 11:39:21 2005 +0000 Slip the 1.2 release by two weeks to 2005-11-15. ChangeLog | 4 ++++ ROADMAP | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 632b948c8c162b90c8d8bc5eb56c505af89e61de Author: Carl Worth Date: Mon Nov 7 13:23:31 2005 +0000 Add new _cairo_array_allocate function for growing the array and getting a pointer to the buffer of new data. This is intended to be used in place of the abuse of passing data=NULL to _cairo_array_append_multiple. Add new function to be used instead of the abuse of pasing data=NULL to cairo_pdf_ft_font_write. Just return a status now instead of a pointer to the written buffer, since cairo_pdf_ft_font_allocate_write_buffer should now be used instead when a pointer is needed. Switch to use cairo_pdf_ft_font_allocate_write_buffer. Fix use of uninitialized status value. initialization just to keep the compiler quiet about possibly uninitialized variables. ChangeLog | 39 ++++++++++++++++++++++++++++++++ src/cairo-array.c | 46 ++++++++++++++++++++++++++++--------- src/cairo-font-subset.c | 56 ++++++++++++++++++++++++++++++++++++---------- src/cairo-meta-surface.c | 6 +--- src/cairo-pattern.c | 3 +- src/cairoint.h | 10 ++++++- 6 files changed, 130 insertions(+), 30 deletions(-) commit 3930b6ab775113cbeae7375cab3ed5854a795755 Author: Carl Worth Date: Mon Nov 7 10:50:39 2005 +0000 Use field-by-field copying rather than whole structure copying. This avoids the hidden copies being overlooked in future code modifications. ChangeLog | 7 +++++++ src/cairo-gstate.c | 28 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 9 deletions(-) commit 9cf7fafffc4a6275f30bd946626ec9932a74caa0 Author: Carl Worth Date: Mon Nov 7 10:48:01 2005 +0000 Fix to copy region if NULL. ChangeLog | 5 +++++ src/cairo-clip.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletions(-) commit 80e4c6307d0967b2a9ab0f1ca95443d5b00540e5 Author: Carl Worth Date: Mon Nov 7 10:46:23 2005 +0000 Reorder function bodies to match the order of fields in the structure definition. Some style cleanups. Fix bug in that several fields were not being copied. ChangeLog | 9 +++++++++ src/cairo-clip.c | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 35 insertions(+), 17 deletions(-) commit 8d09247fcd456881ede2ef277baa7a9c71721b2c Author: Carl Worth Date: Mon Nov 7 10:29:37 2005 +0000 Two more instances of copy-and-reference in a single step. ChangeLog | 5 +++++ src/cairo-gstate.c | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 66e69f18ec4e61a195039dc100ac5db3f389f476 Author: Carl Worth Date: Mon Nov 7 10:26:18 2005 +0000 Perform copy and reference in a single step. Remove unnecessary checks for NULL before _destroy() functions. Reset pointers to NULL after _destroy(). ChangeLog | 9 +++++++++ src/cairo-gstate.c | 21 +++++++++------------ 2 files changed, 18 insertions(+), 12 deletions(-) commit 36523b96565a4b4015ddb3172c14690774edb92c Author: Carl Worth Date: Mon Nov 7 10:17:37 2005 +0000 Reorder function bodies to match to match the order of the fields in the structure definition. ChangeLog | 6 ++++++ src/cairo-gstate.c | 14 +++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) commit 9796a54fa197206df914252a3511bfb30ce95039 Author: Carl Worth Date: Mon Nov 7 10:02:06 2005 +0000 Style fix: test-and-bail rather than making the working body conditional. Allow destroy to work on a NULL object. ChangeLog | 9 +++++++++ src/cairo-gstate.c | 44 +++++++++++++++++++++++++------------------- 2 files changed, 34 insertions(+), 19 deletions(-) commit 201d4e2ce76fe534009c6910cf42c5456b497047 Author: Carl Worth Date: Mon Nov 7 09:49:51 2005 +0000 Add functions to initialize and copy cairo_stroke_style_t objects. Use new _cairo_stroke_style functions rather than direct modification. Add missing prototype for _cairo_font_options_init_copy. ChangeLog | 15 ++++++++ src/Makefile.am | 1 + src/cairo-gstate.c | 26 ++++---------- src/cairo-stroke-style.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 16 ++++++++ 5 files changed, 126 insertions(+), 19 deletions(-) commit a9e2cf8d9b6e49375cb6051b749c72b8dea97bfd Author: Carl Worth Date: Mon Nov 7 09:33:38 2005 +0000 Remove unused prototypes for _cairo_gstate_begin_group and _cairo_gstate_end_group. ChangeLog | 5 +++++ src/cairoint.h | 6 ------ 2 files changed, 5 insertions(+), 6 deletions(-) commit ed160b63a12a8018f6fa40a026c8b9bb942523c7 Author: Carl Worth Date: Mon Nov 7 09:30:38 2005 +0000 Add documentation for _cairo_gstate_create, _cairo_gstate_init_copy, and _cairo_gstate_clone. ChangeLog | 5 +++++ src/cairo-gstate.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 0 deletions(-) commit fe324c44153cf37a51b51883780daee5500173be Author: Carl Worth Date: Mon Nov 7 09:26:47 2005 +0000 Add a function for copying font options rather than just using direct structure copying. ChangeLog | 6 ++++++ src/cairo-font-options.c | 12 +++++++++++- 2 files changed, 17 insertions(+), 1 deletions(-) commit f79d48640f26fd5c02d949ac759090dafaa002ec Author: Carl Worth Date: Sat Nov 5 22:43:06 2005 +0000 Add missing declarations for status variables. Thanks to Mikael Hallendal for pointing this out. ChangeLog | 6 ++++++ src/cairo-ps-surface.c | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 9341c254a00c732c9ce415233447ed47a7cbce7c Author: Carl Worth Date: Fri Nov 4 16:13:30 2005 +0000 Rename old, rarely used _cairo_array_append to _cairo_array_append_multiple. Add much more common _cairo_array_append. Fix both to return a cairo_status_t. Remove undocumented code to allow a non-copying append when elements is NULL, (let's not encourage unintialized data, shall we?) Cleanup to not rely on undocumented copy-avoidance in _cairo_array_append. Track change in number of arguments and return value of _cairo_array_append. ChangeLog | 31 +++++++++++++++ src/cairo-array.c | 96 +++++++++++++++++++++++++++++---------------- src/cairo-font-subset.c | 11 +++-- src/cairo-meta-surface.c | 57 +++++++++++++++++++--------- src/cairo-pdf-surface.c | 29 ++++++++++---- src/cairo-ps-surface.c | 9 +++- src/cairo-win32-font.c | 19 ++++++--- src/cairoint.h | 9 +++- 8 files changed, 185 insertions(+), 76 deletions(-) commit feef096e2586d162c4ccd072bfadc39f1de4502a Author: Carl Worth Date: Fri Nov 4 15:15:30 2005 +0000 Add documentation for all _cairo_array interface functions. ChangeLog | 5 +++ src/cairo-array.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 0 deletions(-) commit 39eca22bfe2af91c926d00a4c3f19c03280b6c8b Author: Carl Worth Date: Fri Nov 4 11:16:38 2005 +0000 Rework support in the surface backend for the five basic drawing operations (paint, mask, stroke, fill, and show_glyphs). Now, all 5 operations have backend functions, and all use a consistent convention for argument naming and ordering. The old fill_path has been replaced with a new fill. The old show_glyphs function was recently renamed to old_show_glyphs and has not yet been ported to the new show_glyphs, (so all backends have a NULL show_glyphs function). In fact, of the 5 new backend functions, fill is the only one that has an implementation in any backend. As part of this cleanup a new cairo_stroke_style_t object is introduced to capture the many settings unique to the stroke operation, (line_width, line_cap, line_join, miter_limit, dash, num_dashes, and dash_offset). Track changes in surface backend from fill_path to fill. Track the new canonical argument naming and ordering for the 5 drawing operations. Move various stroke style settings into new cairo_stroke_style_t. Drop NULL fill_path backend function which no longer exists. ChangeLog | 57 ++++++++ src/cairo-glitz-surface.c | 1 - src/cairo-gstate-private.h | 10 +-- src/cairo-gstate.c | 161 ++++++++++------------- src/cairo-meta-surface-private.h | 8 +- src/cairo-meta-surface.c | 71 ++++++---- src/cairo-path-stroke.c | 142 +++++++------------- src/cairo-pdf-surface.c | 31 +++-- src/cairo-ps-surface.c | 87 +++++++------ src/cairo-surface.c | 265 +++++++++++++++++--------------------- src/cairo-win32-surface.c | 1 - src/cairo-xcb-surface.c | 1 - src/cairo-xlib-surface.c | 1 - src/cairoint.h | 142 ++++++++++++-------- 14 files changed, 497 insertions(+), 481 deletions(-) commit 719334c52cd8dd8aaf10284632b018fd1a3b9d6c Author: Carl Worth Date: Tue Nov 1 16:40:37 2005 +0000 Rename surface->backend->show_glyphs to surface->backend->old_show_glyphs. Move show_glyphs fallback from gstate to surface where it belongs. Reviewed by: keithp ChangeLog | 29 +++++++ src/cairo-atsui-font.c | 26 +++--- src/cairo-glitz-surface.c | 26 +++--- src/cairo-gstate.c | 109 +++------------------------ src/cairo-image-surface.c | 2 +- src/cairo-meta-surface.c | 28 ++++---- src/cairo-pdf-surface.c | 26 +++--- src/cairo-ps-surface.c | 78 ++++++++++---------- src/cairo-quartz-surface.c | 2 +- src/cairo-surface.c | 180 +++++++++++++++++++++++++++++++++++++++----- src/cairo-win32-surface.c | 2 +- src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 104 +++++++++++++------------- src/cairoint.h | 34 +++++--- 14 files changed, 372 insertions(+), 276 deletions(-) commit a3ae0aecc47863145e5dd9f461d696e89c9e7c30 Author: Keith Packard Date: Tue Nov 1 10:33:34 2005 +0000 Clean up argument order for _fallback_stroke to match other functions ChangeLog | 6 ++++++ src/cairo-surface.c | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) commit a7228cc37a0cd967296e41639e624e9af1520a22 Author: Carl Worth Date: Mon Oct 31 16:55:21 2005 +0000 Originally 2005-10-28 Keith Packard : Remove pen_regular field from the gstate. Move stroke fallback from gstate to surface where it belongs. Eliminate dependence on cairo_gstate_t object. Fix to include just cairo-clip-private.h rather than cairo-gstate.private.h. ChangeLog | 28 +++++++ src/cairo-gstate-private.h | 2 - src/cairo-gstate.c | 113 +++++++++++--------------- src/cairo-meta-surface.c | 2 +- src/cairo-path-stroke.c | 185 +++++++++++++++++++++++++++++--------------- src/cairo-pen.c | 27 ++---- src/cairo-surface.c | 90 +++++++++++++++++++++- src/cairoint.h | 41 +++++++++- 8 files changed, 335 insertions(+), 153 deletions(-) commit 3cae05c4c503ce71c4967bd3f748cdfa3bb76ebc Author: Tor Lillqvist Date: Mon Oct 31 11:10:13 2005 +0000 Call _cairo_scaled_glyph_set_path(). ChangeLog | 5 +++++ src/cairo-win32-font.c | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 1a25220634013c4ef475f92110ede366e0847572 Author: Keith Packard Date: Fri Oct 28 21:00:42 2005 +0000 Use _cairo_pattern_get_extents in _fallback_paint to bound paint operators. ChangeLog | 6 ++++++ src/cairo-surface.c | 27 ++++++++++++++++++--------- 2 files changed, 24 insertions(+), 9 deletions(-) commit 83ff8ea194763659be84e7cfa59ad2e1711fb3da Author: Keith Packard Date: Fri Oct 28 20:49:59 2005 +0000 Bound mask fallback operation by transformed mask and source. This should speed up any applications calling cairo_mask with a bounded source or mask operand. ChangeLog | 9 +++++ src/cairo-pattern.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairo-surface.c | 23 +++++++++---- src/cairoint.h | 4 ++ 4 files changed, 113 insertions(+), 8 deletions(-) commit 93cbc71a7998485d768a3b4cb4f26b2a443c81c5 Author: Keith Packard Date: Fri Oct 28 20:41:22 2005 +0000 Split _cairo_operator_bounded into two separate functions _cairo_operator_bounded_by_mask and _cairo_operator_bound_by_source to distinguish between how operators use source and mask operands. ChangeLog | 18 ++++++++++++++ src/cairo-gstate.c | 56 ++++++++++++++++++++++++++++++++++++++------ src/cairo-image-surface.c | 6 +--- src/cairo-xlib-surface.c | 8 ++---- src/cairoint.h | 5 +++- 5 files changed, 75 insertions(+), 18 deletions(-) commit 1540504bd66a75a2fed8352ebfe8b029b3f199dd Author: Carl Worth Date: Thu Oct 27 17:16:46 2005 +0000 Fix leak of pattern (missing _cairo_pattern_fini). Move mask fallback from gstate to surface where it belongs. Temporarily export some previously private cairo_gstate functions, (soon to become private cairo_fallback functions). ChangeLog | 17 +++++++++++ src/cairo-gstate.c | 76 ++++++------------------------------------------ src/cairo-surface.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 25 +++++++++++++++- 4 files changed, 131 insertions(+), 68 deletions(-) commit ce7b19fc3434ff733fd6f00add017386ad4a7974 Author: Carl Worth Date: Thu Oct 27 15:06:53 2005 +0000 Move paint fallback from gstate to surface where it belongs. Add clip pointer to surface. ChangeLog | 11 ++++++++ src/cairo-gstate.c | 27 ++++---------------- src/cairo-surface.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairoint.h | 7 +++++ 4 files changed, 89 insertions(+), 22 deletions(-) commit e406f4b0f0fc90dc6ad8aba000122a7345195478 Author: Carl Worth Date: Tue Oct 25 16:02:08 2005 +0000 Add explicit NULLs for unimplmented backend functions to better document what might be improved here. ChangeLog | 5 +++++ src/cairo-xcb-surface.c | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletions(-) commit 8471ad29abb7abf96b5762675dd05b6ca3cca186 Author: Carl Worth Date: Tue Oct 25 15:57:28 2005 +0000 Add critical bug #4863 to the 1.0.4 roadmap. ChangeLog | 4 ++++ ROADMAP | 1 + 2 files changed, 5 insertions(+), 0 deletions(-) commit 09114cc62759efaee4102d05d6e0331193dba75e Author: Carl Worth Date: Tue Oct 25 15:55:57 2005 +0000 Add mention of suspected bug in PS backend. BUGS | 10 ++++++++++ ChangeLog | 4 ++++ 2 files changed, 14 insertions(+), 0 deletions(-) commit 16d79e212986d814bdc03b2f83c03371811ebb9f Author: Carl Worth Date: Tue Oct 18 16:09:21 2005 +0000 Mark the composite-integer-translate-source test as now passing for the PS backend (6 to go). Use fallbacks for any operation using a pattern other than a solid pattern, since it's the only type that will actually emit anything right now. Add comments indicating these functions are not yet implemented. ChangeLog | 14 ++++++++++++++ ROADMAP | 2 +- src/cairo-ps-surface.c | 13 +++++++++++++ 3 files changed, 28 insertions(+), 1 deletions(-) commit 85abc42302529192a3e3eecf0bc3ff54258cbb4e Author: Carl Worth Date: Tue Oct 18 15:58:32 2005 +0000 Mark the operator-source and trap-clip tests as now passing for the PS backend (7 to go). Replace the surface->fallback_region with a page-level surface->fallback Boolean instead, since that's all it was being used as anyway. Do nothing in the ps_output->fallback case. Do nothing in the ! ps_output->fallback case. Reviewed by: keithp ChangeLog | 20 ++++++++++++++++++++ ROADMAP | 4 ++-- src/cairo-ps-surface.c | 38 ++++++++++++++++++++++++-------------- 3 files changed, 46 insertions(+), 16 deletions(-) commit c88dbd077a8f501409f7a9ecd5b3f93aad21bdfa Author: Carl Worth Date: Tue Oct 18 12:41:01 2005 +0000 Added list of 9 remaining PS backend test suite failures to the 1.2.0 roadmap. ChangeLog | 5 +++++ ROADMAP | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletions(-) commit d93767c6ee4ca18ad2c93d8fce2ec82dca7ee21c Author: Carl Worth Date: Tue Oct 18 12:04:41 2005 +0000 Add reference images for antialiasing modes which are basically not applicable to the PS output. ChangeLog | 7 +++++++ test/text-antialias-none-ps-rgb24-ref.png | Bin 0 -> 714 bytes test/text-antialias-subpixel-ps-rgb24-ref.png | Bin 0 -> 714 bytes 3 files changed, 7 insertions(+), 0 deletions(-) commit 99d02f2adc24c98b6f2e2d49f4cb909ff35d7926 Author: Carl Worth Date: Thu Oct 13 21:04:28 2005 +0000 Add verified image for PS output for dash-offset-negative. ChangeLog | 6 ++++++ test/Makefile.am | 1 + test/dash-offset-negative-ps-rgb24-ref.png | Bin 0 -> 202 bytes 3 files changed, 7 insertions(+), 0 deletions(-) commit 4f97b2edb533c9b0329a8d7ec8e4f16447a04f12 Author: Carl Worth Date: Thu Oct 13 21:00:52 2005 +0000 New function to create a snapshot copy of a pattern. Port code to use _init_pattern_with_snapshot rather than _cairo_pattern_init_copy for all source and mask patterns. New function to create a snapshot copy of a surface (still preliminary---no support for meta-surfaces or any other surface for which acquire_source_surface will fail). Add new surface->is_snapshot and initialize to FALSE. Assert that none of these surface-modifying functions are ever called with a snapshot surface. Reviewed by: keithp, otaylor ChangeLog | 37 ++++++++++++++++++ src/cairo-meta-surface.c | 33 +++++++++++++-- src/cairo-surface.c | 95 +++++++++++++++++++++++++++++++++++++++++++++- src/cairoint.h | 6 +++ 4 files changed, 165 insertions(+), 6 deletions(-) commit 9d27993cedf512f17b232986b6667e26c3a06ed0 Author: Carl Worth Date: Thu Oct 13 20:15:29 2005 +0000 Add comment for obviously broken function. ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-) commit 31a561e2c233ab93c6e644e00d8e6d26e12b9bef Author: Carl Worth Date: Thu Oct 13 16:55:14 2005 +0000 Push fill_path fallbacks down from gstate into the surface where all the other fallbacks are. Add _cairo_surface_is_meta. Add antialias to the fill_path meta-surface command. Add an antialias parameter to the backend fill_path function. Fix test description. Reviewed by: keithp ChangeLog | 26 +++++++++++++++ src/cairo-gstate.c | 27 ++------------- src/cairo-meta-surface-private.h | 3 ++ src/cairo-meta-surface.c | 22 +++++++++++- src/cairo-pdf-surface.c | 9 +++-- src/cairo-ps-surface.c | 22 +++++++++++-- src/cairo-surface.c | 65 +++++++++++++++++++++++++++++++------ src/cairoint.h | 21 +++++++----- test/fill-and-stroke.c | 2 +- 9 files changed, 144 insertions(+), 53 deletions(-) commit 097f240c6d2403f1a3530c61a8c437444f936d97 Author: Carl Worth Date: Thu Oct 13 07:33:07 2005 +0000 Fix indentation. ChangeLog | 5 +++++ src/cairo-gstate.c | 22 +++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) commit d31d5db04fe5706e26f117def1fffda627ccf8cf Author: Carl Worth Date: Thu Oct 13 07:30:15 2005 +0000 Increment libtool versioning to 5:0:3 in anticipation of 1.2.0 which will add interfaces. The motivation for this is to make the 1.1.1 release install a library which will be considered newer than 1.0.2. Add a release-verify-soname-major check to verify that the soname major number is always 2 as part of the release-publish target. Reviewed by: otaylor ChangeLog | 13 +++++++++++++ Makefile.am | 10 +++++++++- configure.in | 6 +++--- 3 files changed, 25 insertions(+), 4 deletions(-) commit cd859a23d022d2aa84649e6e076cd75834800263 Author: Tor Lillqvist Date: Wed Oct 12 15:05:09 2005 +0000 Intersect clip region with target surface so we don't waste time and memory. Reviewed by: cworth ChangeLog | 7 +++++++ src/cairo-clip.c | 9 ++++++++- 2 files changed, 15 insertions(+), 1 deletions(-) commit 1fa004f2a6a8cb7147657c74a3b3fc469b778f34 Author: Carl Worth Date: Wed Oct 12 14:23:11 2005 +0000 Add extend-reflect to the 1.2.0 roadmap. Mark dashed splines and clip-all as fixed. Mark extend-reflect as an expected failure. ChangeLog | 9 +++++++++ ROADMAP | 6 ++++-- test/Makefile.am | 1 + test/extend-reflect.c | 3 ++- 4 files changed, 16 insertions(+), 3 deletions(-) commit 7dcbcdf75c5d9a7a691d741ecd1d36160fb725e3 Author: Carl Worth Date: Wed Oct 12 13:37:00 2005 +0000 Add a couple of tests to improve our coverage (clipping under both fill rules). ChangeLog | 14 ++++ test/.cvsignore | 2 + test/Makefile.am | 6 ++ test/clip-fill-rule-pixel-aligned-ref.png | Bin 0 -> 195 bytes test/clip-fill-rule-pixel-aligned-rgb24-ref.png | Bin 0 -> 194 bytes test/clip-fill-rule-pixel-aligned.c | 95 +++++++++++++++++++++++ test/clip-fill-rule-ps-rgb24-ref.png | Bin 0 -> 309 bytes test/clip-fill-rule-ref.png | Bin 0 -> 431 bytes test/clip-fill-rule-rgb24-ref.png | Bin 0 -> 495 bytes test/clip-fill-rule.c | 79 +++++++++++++++++++ 10 files changed, 196 insertions(+), 0 deletions(-) commit 990dfde44762a2e85f4d85f1e2a93a7b976533cd Author: Carl Worth Date: Wed Oct 12 13:33:38 2005 +0000 Add return value at ASSERT_NOT_REACHED. ChangeLog | 5 +++++ src/cairo-pdf-surface.c | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 67d20cd4b247c4c9fef88067915d27e934b4356d Author: Carl Worth Date: Wed Oct 12 13:24:35 2005 +0000 Doc churn doc/public/tmpl/cairo-pattern.sgml | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d794c624cc81512ab89301f0bb7bc033a9006d00 Author: Kristian Høgsberg Date: Tue Oct 11 13:20:44 2005 +0000 Implement non-uniformly spaced color stops for PDF gradients. Patch from Jens Taprogge (#4722). ChangeLog | 8 +++ src/cairo-pdf-surface.c | 155 ++++++++++++++++++++++++++++++++++++----------- 2 files changed, 127 insertions(+), 36 deletions(-) commit f1044bb3c7753e17833a2dc0db508a80eeb810b7 Author: Billy Biggs Date: Mon Oct 10 12:45:15 2005 +0000 Call it CAIRO_EXTEND_PAD instead of CAIRO_EXTEND_NEAREST. Update everybody to use _PAD instead of _NEAREST. ChangeLog | 14 ++++++++++++++ src/cairo-glitz-surface.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- src/cairo.h | 4 ++-- src/cairoint.h | 2 +- 8 files changed, 22 insertions(+), 8 deletions(-) commit f39816e0161d357d8a23ae943d1bd70633795d63 Author: Kristian Høgsberg Date: Mon Oct 10 09:36:39 2005 +0000 Transform source pattern for _cairo_surface_fill_path() also (#4673). Use cairo_fill_preserve() instead of cairo_save()/cairo_restore(). Add missing return values. ChangeLog | 11 +++++++++++ src/cairo-gstate.c | 7 ++++++- src/cairo-pdf-surface.c | 7 +++---- test/pdf-surface.c | 6 +----- test/ps-surface.c | 6 +----- 5 files changed, 22 insertions(+), 15 deletions(-) commit 7fdf45ce61f958aaecf6e8c7042947d3ebbcfd9d Author: Billy Biggs Date: Mon Oct 10 09:16:21 2005 +0000 Add documentation for the extend modes. Document the extend functions for patterns. Remove some redundancy in the documentation. ChangeLog | 10 ++++++++++ src/cairo-pattern.c | 20 ++++++++++++++++++++ src/cairo.c | 4 ---- src/cairo.h | 13 +++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) commit 935764d91c6fee4aa30ea59464f4670e5f70f7c8 Author: Keith Packard Date: Sun Oct 9 20:40:12 2005 +0000 Switch fallback from list of rects to region. Check operator and patterns for non-ps drawing ability. Operators can sometimes be always opaque, independent of the pattern, sometimes always translucent, independent of the pattern and sometimes depend on whether is translucent. reviewed by: cworth ChangeLog | 20 +++++ src/cairo-ps-surface.c | 183 ++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 165 insertions(+), 38 deletions(-) commit a0e970fad268c90ab79a682116773b21d4120ccc Author: Keith Packard Date: Sun Oct 9 20:31:44 2005 +0000 Add const to _cairo_surface_is_image parameter ChangeLog | 6 ++++++ src/cairo-image-surface.c | 2 +- src/cairoint.h | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) commit 2a3593e35ccedb9f9eb82390652e566dc651896b Author: Carl Worth Date: Sun Oct 9 20:01:42 2005 +0000 Doc SGML churn doc/public/tmpl/cairo-pattern.sgml | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit b207dfe8228d624b88ee871c1f82d0321df4a3ef Author: Billy Biggs Date: Sun Oct 9 14:51:55 2005 +0000 Add a new test to start investigating bug 4183. The new test. Ignore the new test. ChangeLog | 6 ++++++ test/.cvsignore | 1 + test/Makefile.am | 4 ++++ test/extend-reflect.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 0 deletions(-) commit bb86d6664d607cb4f6b88618209d1c5dc74683ba Author: Billy Biggs Date: Sun Oct 9 14:29:54 2005 +0000 Make space for the new bits needed by expand. pixman/ChangeLog | 4 ++++ pixman/src/icimage.h | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit eeb56e713b26e55cf1a5704d1e09b65457a7c457 Author: Keith Packard Date: Sun Oct 9 14:28:15 2005 +0000 The comment said 'blend over white', the code did 'blend under garbage'. I made the code look like the comment. More tests pass now. mmm. reviewed by: cworth ChangeLog | 9 +++++++++ src/cairo-ps-surface.c | 7 ++++++- 2 files changed, 15 insertions(+), 1 deletions(-) commit 951c7a65924146c6acf6658ea17eca946fe0f069 Author: Carl Worth Date: Sun Oct 9 13:33:21 2005 +0000 Make surface image data static to work around a bug in cairo-meta-surface.c (not copying source surface pattern data). ChangeLog | 11 +++++++++++ test/filter-nearest-offset.c | 2 +- test/mask-ctm.c | 2 +- test/mask-surface-ctm.c | 2 +- test/paint-with-alpha.c | 2 +- test/scale-source-surface-paint.c | 2 +- test/source-surface-scale-paint.c | 2 +- 7 files changed, 17 insertions(+), 6 deletions(-) commit ea7ac21d3b5c488e3d1ec82c18d66ae3f356d16f Author: Billy Biggs Date: Sun Oct 9 09:18:16 2005 +0000 Add a "nearest" extend mode, where the closest pixel is repeated for pixels outside of the source area. Note that for gradients, applications which had explicitly set a repeat mode of NONE will now need to change to use NEAREST to get the same behaviour. Split CARIO_EXTEND_DEFAULT to indicate defaults for surfaces and gradients. The default for gradients is still the NEAREST beaviour. Support the NEAREST mode, change NONE to be TRANSPARENT. Update the extend mode code to use the pixman support. Handle NEAREST, note that support for NONE is not yet handled for gradients. Add a check for NEAREST but don't do anything useful. Add a check for NEAREST but don't do anything useful. Update a comment about the extend support in the image backend. reviewed by: davidr, cworth, otaylor ChangeLog | 26 ++++++++++++++++++++++++++ src/cairo-glitz-surface.c | 5 ++++- src/cairo-image-surface.c | 18 ++++++------------ src/cairo-pattern.c | 16 +++++++++++----- src/cairo-pdf-surface.c | 2 -- src/cairo-xcb-surface.c | 2 ++ src/cairo-xlib-surface.c | 1 + src/cairo.h | 3 ++- src/cairoint.h | 3 ++- 9 files changed, 54 insertions(+), 22 deletions(-) commit 32eb6ce206e225c5ae972d44fcd704b807555dd1 Author: Billy Biggs Date: Sun Oct 9 09:09:53 2005 +0000 Add extended repeat modes, copied from XRender. Cleanup to use the new repeat modes. Be explicit about which repeat mode we want. reviewed by: davidr, cworth, otaylor pixman/ChangeLog | 10 ++++++++++ pixman/src/icimage.c | 9 +++++---- pixman/src/icrect.c | 2 +- pixman/src/pixman.h | 14 +++++++++++--- 4 files changed, 27 insertions(+), 8 deletions(-) commit a8dbfc42a75d1304bd1ddb6f885f507d47e96e76 Author: Carl Worth Date: Sat Oct 8 22:44:56 2005 +0000 Remove 1.0.2 entries now that it is out. Note that the PS backend has now been added to the test suite. ChangeLog | 5 +++++ ROADMAP | 17 +++++------------ 2 files changed, 10 insertions(+), 12 deletions(-) commit e26dbd950084477ffe26ba405fd7558ed74196cf Author: Carl Worth Date: Sat Oct 8 13:04:18 2005 +0000 Add ps-backend-specific reference images for test for which the current output is fine, but just happens to not be identical to the existing reference images, (ie. just minor differences shape-boundary pixels). ChangeLog | 17 +++++++++++++++++ test/caps-sub-paths-ps-rgb24-ref.png | Bin 0 -> 237 bytes test/dash-caps-joins-ps-rgb24-ref.png | Bin 0 -> 2362 bytes test/fill-and-stroke-ps-rgb24-ref.png | Bin 0 -> 328 bytes test/fill-rule-ps-rgb24-ref.png | Bin 0 -> 2167 bytes test/leaky-polygon-ps-rgb24-ref.png | Bin 0 -> 353 bytes test/line-width-ps-rgb24-ref.png | Bin 0 -> 242 bytes test/path-data-ps-rgb24-ref.png | Bin 0 -> 440 bytes test/rectangle-rounding-error-ps-rgb24-ref.png | Bin 0 -> 365 bytes test/show-text-current-point-ps-rgb24-ref.png | Bin 0 -> 1477 bytes test/text-antialias-gray-ps-rgb24-ref.png | Bin 0 -> 714 bytes test/transforms-ps-rgb24-ref.png | Bin 0 -> 418 bytes 12 files changed, 17 insertions(+), 0 deletions(-) commit 94dece56a5dca2f10b9c8d2914ff62177a88410b Author: Carl Worth Date: Sat Oct 8 11:58:20 2005 +0000 Ignore output of PS tests. Fix the PS tests to work again, (track change in create_surface interface). ChangeLog | 7 +++++++ test/.cvsignore | 2 ++ test/cairo-test.c | 9 +++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) commit 24dce0dbb30ca7864416185b11cafff42db9a2b7 Author: Carl Worth Date: Sat Oct 8 11:57:45 2005 +0000 Enable PS and PDF backends by default, (in preparation for 1.2.0) ChangeLog | 5 +++++ configure.in | 15 ++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) commit 4d84a70b9f4799d66641a3a0c5438098011690c2 Author: Carl Worth Date: Sat Oct 8 10:50:08 2005 +0000 Fix typo leading to truncated error message (Christian Biesinger ). ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 27e12fc1dbbed563788a8088b31459ae6cffb77a Author: Kristian Høgsberg Date: Fri Oct 7 13:21:01 2005 +0000 Apply patch from #4672 by Jens Taprogge to implement color stop sorting and multiple color stops for gradients. ChangeLog | 11 ++++ src/cairo-pdf-surface.c | 117 +++++++++++++++++++++++++++++++++++------------ 2 files changed, 98 insertions(+), 30 deletions(-) commit e6239b1d93bb88594310e57d8e7a2fd9e655ca58 Author: Carl Worth Date: Thu Oct 6 12:50:08 2005 +0000 Add ChangeLog information for code that was accidentally committed along with an earlier bug fix: Add missing initialization for ximage.xoffset. Ignore the -argb32-out.png and -rgb24-out.png images as well. Pass a format to the surface create functions. (create_image_surface): Condense create_argb_image_surface and create_rgb_image_surface into a single function. (create_xlib_surface): Add support for CAIRO_FORMAT_RGB24 in addition to CAIRO_FORMAT_ARGB32. Add a new target for testing xlib with CAIRO_FORMAT_RGB24. ChangeLog | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit 74af57339c271ab26b5e32647ef26b23929a57a7 Author: Carl Worth Date: Thu Oct 6 11:32:54 2005 +0000 Add missing initialization for ximage.xoffset. ChangeLog | 5 +++++ src/cairo-xlib-surface.c | 1 + test/.cvsignore | 6 ++++++ test/cairo-test.c | 45 +++++++++++++++++++++++---------------------- 4 files changed, 35 insertions(+), 22 deletions(-) commit de3358f883eabfe819f68bc2c2c8c4d43a4d0056 Author: Anders Carlsson Date: Tue Oct 4 13:48:25 2005 +0000 Invoke PKG_PROG_PKG_CONFIG so $PKG_CONFIG will be set early on. ChangeLog | 5 +++++ configure.in | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit 1810eaf8f2317faa976d0be3f538e8d036227f22 Author: Carl Worth Date: Mon Oct 3 17:49:25 2005 +0000 Add notes for the 1.0.2 release. ChangeLog | 4 +++ NEWS | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 0 deletions(-) commit 9529d20d323ecf9012b010cf16b2df52e405ba2b Author: Carl Worth Date: Mon Oct 3 17:39:33 2005 +0000 Add a couple of potential bugs to BUGS. BUGS | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) commit cdaa48655c328fd2fd34c264b6f8e1d9ec2af1f7 Author: Anders Carlsson Date: Fri Sep 30 08:31:36 2005 +0000 Bring the ATSUI backend up to date wrt the new font backend changes. Also, add cairo_atsui_font_face_create_for_atsu_font_id which takes an ATSUFontID and returns a cairo_font_face_t. ChangeLog | 24 ++ src/cairo-atsui-font.c | 708 +++++++++++++++++++++++------------------------- src/cairo-atsui.h | 3 + 3 files changed, 359 insertions(+), 376 deletions(-) commit a0286781793bf2da6ba67029c8719eb614cb345a Author: Bertram Felgenhauer Date: Thu Sep 29 20:00:14 2005 +0000 simplify id initialisation of last patch reviewed by: keithp ChangeLog | 5 +++++ src/cairo-hull.c | 13 +++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) commit 04170ed2854c7cb4506ddc3c64470748f1e67ffd Author: Bertram Felgenhauer Date: Thu Sep 29 17:34:31 2005 +0000 ChangeLog cosmetics. ChangeLog | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit fa2d0ab5b7744fa929e77ee61e93476c425777e3 Author: Bertram Felgenhauer Date: Thu Sep 29 17:26:20 2005 +0000 Using a pointer comparison as the fallback total order was wrong - these pointers are not stable. So we introduce our own total order instead. mark 4599 as fixed reviewed by: cworth ChangeLog | 10 ++++++++++ ROADMAP | 2 +- src/cairo-hull.c | 14 +++++++++----- 3 files changed, 20 insertions(+), 6 deletions(-) commit d3e7dad53eb25aff2608af08057bb86d864de145 Author: Keith Packard Date: Thu Sep 29 14:31:08 2005 +0000 Add rgb24 surface tests, support per-target reference images and support PS surface testing reviewed by: cworth ChangeLog | 69 ++++++++ test/Makefile.am | 159 ++++++++++++------ test/a8-mask-rgb24-ref.png | Bin 0 -> 128 bytes test/cairo-test.c | 176 +++++++++++++++++--- test/caps-joins-ps-rgb24-ref.png | Bin 0 -> 1420 bytes test/caps-joins-rgb24-ref.png | Bin 0 -> 1398 bytes test/caps-sub-paths-rgb24-ref.png | Bin 0 -> 186 bytes test/clip-all-rgb24-ref.png | Bin 0 -> 114 bytes test/clip-nesting-ps-rgb24-ref.png | Bin 0 -> 517 bytes test/clip-nesting-rgb24-ref.png | Bin 0 -> 846 bytes test/clip-operator-rgb24-ref.png | Bin 0 -> 21014 bytes test/clip-twice-ps-rgb24-ref.png | Bin 0 -> 605 bytes test/clip-twice-rgb24-ref.png | Bin 0 -> 1278 bytes ...ite-integer-translate-over-repeat-rgb24-ref.png | Bin 0 -> 353 bytes .../composite-integer-translate-over-rgb24-ref.png | Bin 0 -> 13041 bytes ...omposite-integer-translate-source-rgb24-ref.png | Bin 0 -> 14017 bytes test/create-from-png-rgb24-ref.png | Bin 0 -> 115 bytes test/create-from-png-stream-rgb24-ref.png | Bin 0 -> 115 bytes test/dash-caps-joins-rgb24-ref.png | Bin 0 -> 2946 bytes test/dash-offset-negative-rgb24-ref.png | Bin 0 -> 170 bytes test/fill-and-stroke-rgb24-ref.png | Bin 0 -> 299 bytes test/fill-rule-rgb24-ref.png | Bin 0 -> 2320 bytes test/filter-nearest-offset-rgb24-ref.png | Bin 0 -> 254 bytes test/gradient-alpha-rgb24-ref.png | Bin 0 -> 147 bytes test/leaky-polygon-rgb24-ref.png | Bin 0 -> 344 bytes test/line-width-rgb24-ref.png | Bin 0 -> 199 bytes test/linear-gradient-rgb24-ref.png | Bin 0 -> 12719 bytes test/mask-ctm-rgb24-ref.png | Bin 0 -> 140 bytes test/mask-rgb24-ref.png | Bin 0 -> 73124 bytes test/mask-surface-ctm-rgb24-ref.png | Bin 0 -> 140 bytes test/move-to-show-surface-rgb24-ref.png | Bin 0 -> 115 bytes test/nil-surface-rgb24-ref.png | Bin 0 -> 106 bytes test/operator-clear-rgb24-ref.png | Bin 0 -> 5704 bytes test/operator-source-rgb24-ref.png | Bin 0 -> 16909 bytes test/paint-rgb24-ref.png | Bin 0 -> 116 bytes test/paint-with-alpha-rgb24-ref.png | Bin 0 -> 146 bytes test/path-data-rgb24-ref.png | Bin 0 -> 523 bytes test/pixman-rotate-rgb24-ref.png | Bin 0 -> 385 bytes test/rectangle-rounding-error-rgb24-ref.png | Bin 0 -> 298 bytes test/rel-path-rgb24-ref.png | Bin 0 -> 115 bytes test/scale-source-surface-paint-rgb24-ref.png | Bin 0 -> 146 bytes test/self-copy-rgb24-ref.png | Bin 0 -> 291 bytes test/self-intersecting-rgb24-ref.png | Bin 0 -> 304 bytes test/set-source-rgb24-ref.png | Bin 0 -> 114 bytes test/show-text-current-point-rgb24-ref.png | Bin 0 -> 2173 bytes test/source-clip-rgb24-ref.png | Bin 0 -> 180 bytes test/source-surface-scale-paint-rgb24-ref.png | Bin 0 -> 136 bytes test/surface-pattern-rgb24-ref.png | Bin 0 -> 194 bytes test/text-antialias-gray-rgb24-ref.png | Bin 0 -> 995 bytes test/text-antialias-none-rgb24-ref.png | Bin 0 -> 284 bytes test/text-antialias-subpixel-rgb24-ref.png | Bin 0 -> 1121 bytes test/text-pattern-rgb24-ref.png | Bin 0 -> 2686 bytes test/text-rotate-rgb24-ref.png | Bin 0 -> 16508 bytes test/transforms-rgb24-ref.png | Bin 0 -> 318 bytes test/translate-show-surface-rgb24-ref.png | Bin 0 -> 115 bytes test/trap-clip-rgb24-ref.png | Bin 0 -> 64724 bytes test/unantialiased-shapes-ps-rgb24-ref.png | Bin 0 -> 9899 bytes test/unantialiased-shapes-rgb24-ref.png | Bin 0 -> 4449 bytes test/unbounded-operator-rgb24-ref.png | Bin 0 -> 7581 bytes 59 files changed, 330 insertions(+), 74 deletions(-) commit 76634781e20b1854e4b49a70b98d9f6900c3aedf Author: Carl Worth Date: Thu Sep 29 10:09:59 2005 +0000 Oops. Reverting debug output that was mistakenly committed. ChangeLog | 5 +++++ src/cairo-surface.c | 31 ------------------------------- 2 files changed, 5 insertions(+), 31 deletions(-) commit 4ef5f08563c3f149d52eed26aa16965740ad8de6 Author: Carl Worth Date: Thu Sep 29 06:49:47 2005 +0000 Add date of 2005-10-03 for 1.0.2. Add 4630 to the 1.0.2 roadmap. ChangeLog | 5 +++++ ROADMAP | 6 +++--- src/cairo-surface.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) commit 303e3e9748b6e1970c06203c192ea1b2743f10df Author: Tor Lillqvist Date: Wed Sep 28 10:35:55 2005 +0000 Use _cairo_utf8_to_utf16 for character conversion. ChangeLog | 5 +++++ src/cairo-atsui-font.c | 24 ++++++------------------ 2 files changed, 11 insertions(+), 18 deletions(-) commit dc711cd88d6cc5aa87b41bd72a2ab2fe67554760 Author: Tor Lillqvist Date: Wed Sep 28 10:25:23 2005 +0000 Note that Bug #4612 (Text not being drawn if first character entirely out of surface) is now fixed. Add cast so that sign conversion doesn't alter comparison. ChangeLog | 8 ++++++++ ROADMAP | 2 +- src/cairo-win32-font.c | 8 ++++---- 3 files changed, 13 insertions(+), 5 deletions(-) commit f41377bc0cbd2dd9df13d1d09437349eb2bcf62a Author: Carl Worth Date: Tue Sep 27 15:07:15 2005 +0000 Add 4612 to the 1.0.2 roadmap. ChangeLog | 4 ++++ ROADMAP | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 58113099f987c003eba22ae6e084520ea920e688 Author: Tor Lillqvist Date: Tue Sep 27 13:22:46 2005 +0000 Note that Bug #4602 (use of 0x0 images causes win32 backend failure) is now fixed. Avoid creating size-0 bitmap, which fails. ChangeLog | 8 ++++++++ ROADMAP | 2 +- src/cairo-win32-surface.c | 4 ++-- 3 files changed, 11 insertions(+), 3 deletions(-) commit abaf346810dc5756d3c12b1cc24e24b1d6acf165 Author: Carl Worth Date: Tue Sep 27 12:44:32 2005 +0000 Note that bug #4409 (Dashes are missing initial caps) is now fixed. Move face-flipping from inside _cairo_stroker_add_caps to new _cairo_stroker_add_leading_cap variant of _cairo_stoker_add_cap. Change to call _cairo_stroker_add_leading_cap or _cairo_stroker_add_trailing_cap as appropriate. Remove dash-caps-joins from the XFAIL list and add reference image. ChangeLog | 21 +++++++++++++++++ ROADMAP | 2 +- src/cairo-path-stroke.c | 51 ++++++++++++++++++++++++++++------------- test/Makefile.am | 1 - test/dash-caps-joins-ref.png | Bin 0 -> 2347 bytes test/dash-caps-joins.c | 3 +- 6 files changed, 58 insertions(+), 20 deletions(-) commit 8a6792fe4128a4c15d6d0e798643626416e82a6c Author: Carl Worth Date: Tue Sep 27 11:35:18 2005 +0000 Add two test cases. One for caps and joins (passes), and one for dashed caps and joins, (fails, see bug #4409). ChangeLog | 10 +++++ test/.cvsignore | 2 + test/Makefile.am | 7 +++ test/caps-joins-ref.png | Bin 0 -> 1262 bytes test/caps-joins.c | 85 ++++++++++++++++++++++++++++++++++++++++++ test/dash-caps-joins.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 199 insertions(+), 0 deletions(-) commit 38d526f8bedeab53a1cbd5b8424e0c4f15f3b705 Author: Carl Worth Date: Mon Sep 26 17:21:47 2005 +0000 Added bug 4599 and 4602 to the 1.0.2 roadmap. ChangeLog | 4 ++++ ROADMAP | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 1010e9052ff7e2283bb4fb6ada81dd1c8bb785ca Author: Tor Lillqvist Date: Mon Sep 26 07:48:10 2005 +0000 Set LOGFONT::lfHeight negative. A negative lfHeight means "em height" which is what we want, and matches how other toolkits interpret font sizes on Win32. (Positive lfHeight means "cell height".) (#4593) (_cairo_win32_scaled_font_init_glyph_metrics): If GetGlyphOutlineW() fails, print error message and set metrics to zero. (#3927, Hans Breuer) (cairo_win32_scaled_font_select_font): Add detail on what API failed to the error messages. ChangeLog | 13 +++++++++++++ src/cairo-win32-font.c | 26 ++++++++++++++++---------- 2 files changed, 29 insertions(+), 10 deletions(-) commit 8649fc9f18f991ef1e02b58bb6a0a874aef16cda Author: Carl Worth Date: Mon Sep 19 17:30:27 2005 +0000 Note that the clip-all test now passes. ChangeLog | 4 ++++ ROADMAP | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 8fc9e099fd0c53c4e2119cfd0f6c63b48b293043 Author: Carl Worth Date: Mon Sep 19 17:24:52 2005 +0000 Avoid attempting to create a size-0 Pixmap, (to prevent the associated X error). This actually showed up when the clip region is empty. Thanks to Radek Doulík for the bug report. Remove clip-all from the XFAIL list since it works now. ChangeLog | 11 +++++++++++ src/cairo-xlib-surface.c | 3 ++- test/Makefile.am | 1 - test/clip-all.c | 3 +-- 4 files changed, 14 insertions(+), 4 deletions(-) commit fa5d17f4667719803fe27207ca1ec1e7a5882080 Author: Carl Worth Date: Mon Sep 19 14:24:00 2005 +0000 Originally: 2005-09-19 Hans Breuer src/cairoint.h : win32 specific definitions for CAIRO_MUTEX_DECLARE, CAIRO_MUTEX_LOCK etc. [not based on win32 mutex but critical sections] src/cairo-win32-surface.c : add DllMain() to do global, single-threaded 'mutex' (de)initialization. No ifdefs needed, some variables would simply not be used when the respective backend would not be compiled in. ChangeLog | 13 +++++++++++++ src/cairo-win32-surface.c | 34 ++++++++++++++++++++++++++++++++++ src/cairoint.h | 10 ++++++++++ 3 files changed, 57 insertions(+), 0 deletions(-) commit d7bdc9477552382163ee0a0521a13c212015a4e8 Author: Carl Worth Date: Mon Sep 19 14:14:03 2005 +0000 Add cairo-cache-private.h which was missing from the list, (thanks to sunmoon1997). ChangeLog | 5 +++++ src/Makefile.am | 1 + 2 files changed, 6 insertions(+), 0 deletions(-) commit 80561375c43d1769c9e1f05b700137b424f20565 Author: Carl Worth Date: Mon Sep 19 11:56:27 2005 +0000 Note that 4414 is now fixed. ChangeLog | 4 ++++ ROADMAP | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 91e188bc78f0f2b3703c249c2fac4e3f6e3c5bcc Author: David Reveman Date: Mon Sep 19 07:18:51 2005 +0000 Add missing break to switch statement src/cairo-glitz-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 079ee492b518c735046032a118f8662ec8982f71 Author: Billy Biggs Date: Sun Sep 18 19:53:23 2005 +0000 Fix the MMX test to only check for MMX intrinsics and not the SSE intrinsics. ChangeLog | 5 +++++ configure.in | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) commit 759166f795ab960ddf679f467638be49657f91c1 Author: Billy Biggs Date: Sun Sep 18 19:52:08 2005 +0000 Only include xmmintrin.h if USE_SSE is defined. pixman/ChangeLog | 4 ++++ pixman/src/fbmmx.c | 2 ++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 0978f97e9e606c2ec62fe369b584ece6ad4905ef Author: Billy Biggs Date: Sun Sep 18 19:37:44 2005 +0000 Bug #4414, reviewed by otaylor, cworth. Remove -msse from the MMX CFLAGS as it causes gcc to emit SSE instructions, however the detection code only checks for processors supporting MMX and does not require SSE. ChangeLog | 8 ++++++++ configure.in | 2 +- 2 files changed, 9 insertions(+), 1 deletions(-) commit b7c02401b9c0470f5a95b33f8fde3adebfcec397 Author: Billy Biggs Date: Sun Sep 18 19:34:36 2005 +0000 Bug #4414, reviewed by otaylor, cworth. Remove CPU detection code. Move CPU detection code out of the MMX file and into the generic code to avoid compiling it with -mmmx and -msse. Using these options causes gcc to use MMX and SSE instructions in the CPU detection code which causes SIGILLs on older processors. pixman/ChangeLog | 11 +++++ pixman/src/fbmmx.c | 113 ------------------------------------------------ pixman/src/fbpict.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 129 insertions(+), 114 deletions(-) commit 6d14b3c1fc6c8dfb389495e88a8c63ff10110ec4 Author: Carl Worth Date: Fri Sep 16 10:49:48 2005 +0000 Prefer cairo_bool_t, TRUE, and FALSE over int, 1, and 0. ChangeLog | 6 ++++++ src/cairo-path-stroke.c | 18 +++++++++--------- 2 files changed, 15 insertions(+), 9 deletions(-) commit 9cb31827aa81d175309b8c81b99482ebde3ba6d6 Author: Carl Worth Date: Fri Sep 16 10:27:32 2005 +0000 Mark 4408 as resolved. ChangeLog | 4 ++++ ROADMAP | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 5b9be26d269d7e120d73652f7c6d2894cc556939 Author: Carl Worth Date: Fri Sep 16 10:24:54 2005 +0000 Tested by: John Ellson Closes bug #4408 https://bugs.freedesktop.org/show_bug.cgi?id=4408 Add support for dashed splines. (The antialiasing quality isn't perfect, but at least the curves are dashed now). ChangeLog | 11 +++++++ src/cairo-path-stroke.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 86 insertions(+), 1 deletions(-) commit a7459e0057e1a73b7eeb7f6d88e86061b198cbf9 Author: Carl Worth Date: Fri Sep 16 10:11:52 2005 +0000 Mark 4260 as resolved. Add 4414 to the 1.0.2 roadmap. ChangeLog | 4 ++++ ROADMAP | 3 ++- 2 files changed, 6 insertions(+), 1 deletions(-) commit 34c6f5de9be6102741db455e8447d39deb1289b7 Author: David Reveman Date: Wed Sep 14 09:25:07 2005 +0000 Change Carl's comment about saturate operator ChangeLog | 1 + src/cairo-glitz-surface.c | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) commit 6121df6b72b56ebe9e775c1b12494dc29817f311 Author: David Reveman Date: Wed Sep 14 09:12:13 2005 +0000 White-space cleanups to glitz backend src/cairo-glitz-surface.c | 200 +++++++++++++++++++++++---------------------- 1 files changed, 102 insertions(+), 98 deletions(-) commit 82cb5baeb2440545708d66573b29b69c0951de71 Author: David Reveman Date: Wed Sep 14 09:07:00 2005 +0000 Track changes to glitz and update glyph caching in glitz backend ChangeLog | 5 + configure.in | 2 +- src/cairo-glitz-surface.c | 675 ++++++++++++++++++++++----------------------- 3 files changed, 331 insertions(+), 351 deletions(-) commit c9ad68e6e9a86ea0c6c020c9073b4f86c00bb4a6 Author: Carl Worth Date: Tue Sep 13 15:53:19 2005 +0000 Set return-value *glyphs to NULL after freeing it in the error case. ChangeLog | 5 +++++ src/cairo-scaled-font.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletions(-) commit b18a3c0580a9ab9dc130b5908d4f21da382f6243 Author: Carl Worth Date: Tue Sep 13 15:47:59 2005 +0000 Mark bug #4299 fixed (by the several lock-related commits below). Add clip-all XFAIL to the 1.0.2 roadmap. ChangeLog | 5 +++++ ROADMAP | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit 56e7e9d5bd6ccc0a94d4b41058cab200f9dc2654 Author: Carl Worth Date: Tue Sep 13 12:40:36 2005 +0000 Add missing locking around the call into the thread-shared cache here. ChangeLog | 5 +++++ src/cairo-scaled-font.c | 42 +++++++++++++++++++++++++----------------- 2 files changed, 30 insertions(+), 17 deletions(-) commit e8708af118458c95ec08148375411627c03c0fca Author: Carl Worth Date: Tue Sep 13 12:37:45 2005 +0000 Adjust parameters to stress things a bit more, (better exposing another locking bug). ChangeLog | 5 +++++ test/pthread-show-text.c | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) commit ef35d00615fcd95d9db8c22378caa5cb934465b5 Author: Carl Worth Date: Tue Sep 13 12:26:29 2005 +0000 Expand locking to encapsulate any modification to the reference count of a scaled font, rather than just modifcations of the scaled_font_map, since scaled fonts are shared between threads. ChangeLog | 8 ++++ src/cairo-scaled-font.c | 87 ++++++++++++++++++++++++++-------------------- 2 files changed, 57 insertions(+), 38 deletions(-) commit 258f6f4903eb91187384c2df7591413d9041f184 Author: Carl Worth Date: Tue Sep 13 12:11:32 2005 +0000 Add documentation for cairo_test functions. Abstract log fie creation into cairo_test_init for use by tests that don't use cairo_test(). Add new test for bug #4299 as reported by Alexey Shabalin. ChangeLog | 13 +++++ test/.cvsignore | 3 +- test/Makefile.am | 7 +++- test/cairo-test.c | 30 ++++++++---- test/cairo-test.h | 48 ++++++++++++++++++-- test/pthread-show-text.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 195 insertions(+), 16 deletions(-) commit 999c2a8a2b27412ac2fb59041837c780e6d7eec3 Author: Carl Worth Date: Mon Sep 12 11:15:52 2005 +0000 Originally 2005-09-06 Carl Worth : _cairo_cache_preserve -> _cairo_cache_freeze _cairo_cache_release -> _cairo_cache_thaw Track rename of _cairo_cache_freeze/thaw. Track rename. Add stacking behavior to _cairo_cache_freeze/thaw. Abstract out shrinking from _cairo_cache_insert so that _cairo_cache_thaw will also shrink as necessary. Make this function static since its current limitation to accept an entry rather than a key makes it not as externally useful as would be desirable. Document this limitation. ChangeLog | 24 +++++++++ src/cairo-cache-private.h | 8 +-- src/cairo-cache.c | 121 +++++++++++++++++++++++++++++++-------------- src/cairo-scaled-font.c | 7 +-- 4 files changed, 112 insertions(+), 48 deletions(-) commit b1a38efd34c6b87581846de88b134b0dd6656753 Author: Carl Worth Date: Mon Sep 12 11:11:33 2005 +0000 Fix for bug #4401 as reported by Tim Mooney: Don't bother checking for sincos function. Don't use sincos function since it is apparently buggy on some platforms, (Tru64 at least). ChangeLog | 10 ++++++++++ configure.in | 2 -- src/cairo-matrix.c | 6 ++---- 3 files changed, 12 insertions(+), 6 deletions(-) commit a1bca924b9296d769d735d8abaf1353143770def Author: Owen Taylor Date: Mon Sep 12 05:55:11 2005 +0000 Bug #4260, Reviewed by B. Biggs Use & not && for bitwise AND. src/fbpict.c src/fbmmx.c: Take 'dest' as an argument, if pict and dest don't match for RGB, BGR, swap result. pixman/ChangeLog | 11 +++++++++++ pixman/src/fbcompose.c | 4 ++-- pixman/src/fbmmx.c | 14 +++++++------- pixman/src/fbpict.c | 20 ++++++++++---------- pixman/src/fbpict.h | 12 ++++++++++-- 5 files changed, 40 insertions(+), 21 deletions(-) commit e06df6a38aa949730ca5497c4e6210b95dc0f117 Author: Carl Worth Date: Fri Sep 9 17:10:52 2005 +0000 Add two bugs to the 1.0.2 roadmap: 4408 Missing dashes on stroked curves 4409 Dashes are missing initial caps ChangeLog | 6 ++++++ ROADMAP | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-) commit 761cef26677bc7c928d64aa78084e0389de9679f Author: Carl Worth Date: Thu Sep 8 16:18:00 2005 +0000 Add open bug list for 1.0.2. ChangeLog | 4 ++++ ROADMAP | 14 ++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) commit 0b9c0efc3a939c2078f0200e9bfaa14651fd7529 Author: Carl Worth Date: Wed Sep 7 16:57:59 2005 +0000 Put win32 mutex locking on the 1.2.0 roadmap. Portability improvements for win32 thanks to Hans Breuer : Defined sized-integer types when under the influence of _MSC_VER and without stdint.h. Use #error which is more portable than #warning, (and more indicative of where we want to be before the next release). AUTHORS | 1 + ChangeLog | 14 + ROADMAP | 4 + doc/public/tmpl/cairo-font-options.sgml | 136 ---------- doc/public/tmpl/cairo-font.sgml | 48 ---- doc/public/tmpl/cairo-ft.sgml | 45 ---- doc/public/tmpl/cairo-glitz.sgml | 9 - doc/public/tmpl/cairo-image.sgml | 42 --- doc/public/tmpl/cairo-matrix.sgml | 119 --------- doc/public/tmpl/cairo-paths.sgml | 186 -------------- doc/public/tmpl/cairo-pattern.sgml | 165 ------------ doc/public/tmpl/cairo-pdf.sgml | 33 --- doc/public/tmpl/cairo-png.sgml | 40 --- doc/public/tmpl/cairo-ps.sgml | 33 --- doc/public/tmpl/cairo-quartz.sgml | 11 - doc/public/tmpl/cairo-scaled-font.sgml | 60 ----- doc/public/tmpl/cairo-status.sgml | 9 - doc/public/tmpl/cairo-surface.sgml | 119 --------- doc/public/tmpl/cairo-text.sgml | 123 --------- doc/public/tmpl/cairo-transforms.sgml | 106 -------- doc/public/tmpl/cairo-types.sgml | 4 +- doc/public/tmpl/cairo-version.sgml | 16 -- doc/public/tmpl/cairo-win32-fonts.sgml | 36 --- doc/public/tmpl/cairo-win32.sgml | 9 - doc/public/tmpl/cairo-xcb-xrender.sgml | 13 - doc/public/tmpl/cairo-xcb.sgml | 35 --- doc/public/tmpl/cairo-xlib-xrender.sgml | 14 - doc/public/tmpl/cairo-xlib.sgml | 47 ---- doc/public/tmpl/cairo.sgml | 424 ------------------------------- pixman/src/pixman.h | 19 +- src/cairoint.h | 3 +- 31 files changed, 37 insertions(+), 1886 deletions(-) commit 63c208d83d4a6e66ee2b15af8e1cd92ed67626b9 Author: Carl Worth Date: Wed Sep 7 16:31:22 2005 +0000 Give cairo_public an empty definition by default. Add new cairo_public macro before every public function call prototype. ChangeLog | 18 +++ src/cairo-features.h.in | 4 + src/cairo-ft.h | 10 +- src/cairo-glitz.h | 2 +- src/cairo-pdf.h | 6 +- src/cairo-ps.h | 6 +- src/cairo-quartz.h | 2 +- src/cairo-win32.h | 10 +- src/cairo-xcb-xrender.h | 2 +- src/cairo-xcb.h | 6 +- src/cairo-xlib-xrender.h | 2 +- src/cairo-xlib.h | 8 +- src/cairo.h | 338 +++++++++++++++++++++++----------------------- 13 files changed, 218 insertions(+), 196 deletions(-) commit 05c0c98aee3c67f7a708ad9bfb248ae5c4066312 Author: Tor Lillqvist Date: Wed Sep 7 09:07:13 2005 +0000 Pass appropriate pointer for image_extra to release_dest_image. ChangeLog | 5 +++++ src/cairo-atsui-font.c | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit c00698ebf5730d2d0bff35e1b6cb69914789529f Author: Tor Lillqvist Date: Wed Sep 7 08:38:43 2005 +0000 Pass scratch space instead of NULL for image_extra to acquire/release_dest_image. ChangeLog | 6 ++++++ src/cairo-atsui-font.c | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) commit f2dc1ebe82e9b26346d2948de33ffef0f5bf921b Author: Carl Worth Date: Tue Sep 6 15:19:00 2005 +0000 Ignore cairo.def. Remove cairo_private since we only use it in .h files, not .c files. ChangeLog | 7 +++++++ src/.cvsignore | 1 + src/cairo-gstate.c | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) commit 5b5eecc2e16109e16b9da78e023274197cb3082c Author: Carl Worth Date: Fri Sep 2 16:17:48 2005 +0000 Make a very preliminary attempt at 1.0.2, 1.2.0, and 1.4.0 roadmaps. ChangeLog | 5 ++ ROADMAP | 173 +++++++++++++++++++++++++++++++----------------------------- 2 files changed, 94 insertions(+), 84 deletions(-) commit 7d93d26e1edd9d0340e7a00b1a74b56667e84b44 Author: Carl Worth Date: Fri Sep 2 13:42:34 2005 +0000 Add description of cairo's versioning scheme. ChangeLog | 5 ++ doc/public/tmpl/cairo-version.sgml | 102 +++++++++++++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletions(-) commit 93289f14ccc3d1db5c0b64672b8cd49703542010 Author: Carl Worth Date: Fri Sep 2 11:22:40 2005 +0000 Clean up some documentation issues pointed out by otaylor. ChangeLog | 6 ++++++ src/cairo-cache-private.h | 10 ++++------ src/cairo-cache.c | 24 ++++++++++++------------ 3 files changed, 22 insertions(+), 18 deletions(-) commit 0cfa350fa86c7894eec4e1b99ac7b69bc0c8f296 Author: Keith Packard Date: Thu Sep 1 20:38:07 2005 +0000 Oops. Call _cairo_scaled_font_set_metrics to set user-space metrics for scaled fonts. reviewed by: otaylor deserves credit for noticing a problem ChangeLog | 8 ++++++++ src/cairo-ft-font.c | 22 ++++++++++++---------- 2 files changed, 20 insertions(+), 10 deletions(-) commit 25edf235f090a95f30ea877aa00bc7ee642d4cc5 Author: Bertram Felgenhauer Date: Thu Sep 1 06:13:46 2005 +0000 Add missing pair of braces. This fixes a crash on text output. ChangeLog | 5 +++++ src/cairo-scaled-font.c | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit 7e4465819b7f0da3f16a18c6ffcf2b8f7a9ee04a Author: Carl Worth Date: Thu Sep 1 02:14:31 2005 +0000 Add includes to get sized-integer types such as uint32_t. Fix declaration of image data array to be uint32_t rather than unsigned long. Fixes four out of the remaining five failures in bug #4245. ChangeLog | 17 +++++++++++++++++ test/cairo-test.h | 26 ++++++++++++++++++++++++++ test/filter-nearest-offset.c | 2 +- test/mask-ctm.c | 2 +- test/mask-surface-ctm.c | 2 +- test/move-to-show-surface.c | 2 +- test/paint-with-alpha.c | 2 +- test/scale-source-surface-paint.c | 2 +- test/set-source.c | 2 +- test/source-surface-scale-paint.c | 2 +- test/translate-show-surface.c | 2 +- 11 files changed, 52 insertions(+), 9 deletions(-) commit 0f4beab5070ce6f7129ca52953eb002ac7f40b93 Author: Carl Worth Date: Wed Aug 31 19:11:22 2005 +0000 Add call to XSynchronize, (the expected clip-all failure isn't occuring without it for some reason). Note reason for expected failure. src/cairo-scaled-font.c: Add an optional text_to_glyphs() virtual function that the backend can implement instead of ucs4_to_index(). Protect inclusion of fontconfig.h with HAVE_FCFINI. ChangeLog | 19 ++ src/cairo-ft-font.c | 1 + src/cairo-scaled-font.c | 10 +- src/cairo-win32-font.c | 403 +++++++++++++++++++++++------------------ src/cairoint.h | 12 ++ test/cairo-test.c | 2 + test/create-from-png-stream.c | 6 +- test/nil-surface.c | 2 +- 8 files changed, 277 insertions(+), 178 deletions(-) commit f25ebec368caa6b88d39a5c42cd48b8459396505 Author: Carl Worth Date: Wed Aug 31 16:17:28 2005 +0000 Add call to XSynchronize, (the expected clip-all failure isn't occuring without it for some reason). Note reason for expected failure. ChangeLog | 8 ++++++++ test/cairo-test.c | 2 ++ test/clip-all.c | 3 ++- 3 files changed, 12 insertions(+), 1 deletions(-) commit d56b0d1d80032a26501465106dc76abc713c77bf Author: Owen Taylor Date: Wed Aug 31 15:09:35 2005 +0000 Handle displays which don't match the local endianness by byteswapping on GetImage/PutImage. (#4321, reported by Sjoerd Simons) ChangeLog | 7 ++ src/cairo-xlib-surface.c | 170 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 147 insertions(+), 30 deletions(-) commit b0c58593b30c1fa085b1e7c8e4897da623b8686d Author: Keith Packard Date: Wed Aug 31 15:08:02 2005 +0000 Split out scaled font code to cairo-scaled-font.c Replace cairo cache implementation (this code from cworth) No more global glyph cache to clean up Store glyphs in new per-scaled font caches which hold user-space metrics and device space bounding boxes Refactor glyph drawing APIs so that the surface API is invoked directly from the gstate code. Add path creation/destruction routines (to hold glyph paths) New implementation of scaled fonts which uses per-scaled_font caches for glyphs and keeps user-space metrics, device-space bboxes along with glyph images and/or glyph paths. Adapt to new scaled font API changes. New cache and scaled_font APIs Repond to bug fix in metrics computation for glyphs where y values were rounded up instead of down because of a sign difference between cairo and FreeType. Reviewed by: otaylor, cworth ChangeLog | 95 +++ src/Makefile.am | 1 + src/cairo-cache-private.h | 131 ++++ src/cairo-cache.c | 660 +++++++------------ src/cairo-debug.c | 1 - src/cairo-font.c | 847 ------------------------ src/cairo-ft-font.c | 1130 ++++++++++++--------------------- src/cairo-gstate.c | 47 +- src/cairo-path.c | 18 + src/cairo-scaled-font.c | 1165 ++++++++++++++++++++++++++++++++++ src/cairo-xlib-surface.c | 801 +++++++----------------- src/cairoint.h | 391 +++++------- test/clip-operator-ref.png | Bin 37330 -> 37134 bytes test/operator-clear-ref.png | Bin 4988 -> 4971 bytes test/operator-source-ref.png | Bin 19958 -> 19982 bytes test/text-antialias-gray-ref.png | Bin 727 -> 740 bytes test/text-antialias-gray.c | 2 +- test/text-antialias-none-ref.png | Bin 278 -> 276 bytes test/text-antialias-none.c | 2 +- test/text-antialias-subpixel-ref.png | Bin 1081 -> 1121 bytes test/text-antialias-subpixel.c | 2 +- test/unbounded-operator-ref.png | Bin 11929 -> 11994 bytes 22 files changed, 2460 insertions(+), 2833 deletions(-) commit 568ce860264e63f86ae45258eb106fb7a74a33a3 Author: Carl Worth Date: Wed Aug 31 14:43:31 2005 +0000 Increment CAIRO_VERSION to 1.1.1 after making branch tag BRANCH_1_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) commit 41c321fffaaa035b71aa8d149e748e1aae6d2317 Author: Carl Worth Date: Wed Aug 31 13:52:19 2005 +0000 Add note to use ./autogen.sh instead of ./configure when working with source from cvs. ChangeLog | 5 +++++ INSTALL | 4 ++++ 2 files changed, 9 insertions(+), 0 deletions(-) commit eb2316ecc7dfe2f7a87153c0094bda8754f6d36f Author: Carl Worth Date: Wed Aug 31 13:33:42 2005 +0000 Fix test to not try to set a non-invertible matrix. (We'd gotten away with this due to round-off error on many systems). Fixes one out of six failures in bug #4245. ChangeLog | 6 ++++++ test/get-and-set.c | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit 464c6dffcf251d4b0089e50b716979da5e3b9a5a Author: Carl Worth Date: Wed Aug 31 09:00:01 2005 +0000 Add Radek Doulík. Add test exposing a BadValue (0-size pixmap) bug in cairo-xlib-surface when everything is clipped away (thanks to Radek Doulík ). AUTHORS | 1 + ChangeLog | 10 +++++++ test/.cvsignore | 1 + test/Makefile.am | 4 +++ test/clip-all-ref.png | Bin 0 -> 118 bytes test/clip-all.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 85 insertions(+), 0 deletions(-) commit 44d6afc8a82c2ede19ccc1e27a123b241be6dc67 Author: Owen Taylor Date: Tue Aug 30 10:50:27 2005 +0000 Liberalize the ServerVendor check so that we can handle the Mandriva vendor string. (#4298, Frederic Crozat) ChangeLog | 6 ++++++ src/cairo-xlib-surface.c | 2 +- 2 files changed, 7 insertions(+), 1 deletions(-) commit a4418a63d7b837f0f7c20f5ce6a0e8b31edd97d7 Author: Owen Taylor Date: Tue Aug 30 10:42:17 2005 +0000 Use a 8xN rather than a 1xN strip for a vertical gradient. This is much more tolerant of slow compositing code, and is worth some extra expense computing the gradient. (#4263, found in test case from Richard Stellingwerff) ChangeLog | 8 ++++++++ src/cairo-pattern.c | 11 +++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) commit 2120864edfb1bc51251dca3aeefbfadffb442ad0 Author: Owen Taylor Date: Sun Aug 28 12:52:10 2005 +0000 Use local labels rather than global labels in the assembly, to be robust if the code is inlined in multiple places. (#4283, Reported by Marco Manfredini) pixman/ChangeLog | 6 ++++++ pixman/src/fbmmx.c | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) commit a83537fe02d29fc36a78be0f5599421edf75dc62 Author: Billy Biggs Date: Sat Aug 27 19:32:57 2005 +0000 Some fixes for warnings from sparse (Part of bug #4208, Kjartan Maraas) Use NULL not 0. pixman/ChangeLog | 15 +++++++++++ pixman/src/fbcompose.c | 66 ++++++++++++++++++++++++------------------------ pixman/src/fbpict.c | 4 +- pixman/src/icbltone.c | 6 ++-- pixman/src/icimage.c | 10 +++--- pixman/src/icrect.c | 2 +- pixman/src/ictrap.c | 6 ++-- 7 files changed, 62 insertions(+), 47 deletions(-) commit 96342fe7beee1d0c2084cb6e0f44969d5b05b100 Author: Owen Taylor Date: Sat Aug 27 18:54:03 2005 +0000 Make the check for rectangular trapezoids simpler and more accurate. (#4220, found using test case from Richard Stellingwerff) reviewed by: cworth ChangeLog | 8 ++++++++ src/cairo-traps.c | 16 +++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) commit 30e3d538dfbd763872117760ec473481e2c5926d Author: Owen Taylor Date: Sat Aug 27 18:49:06 2005 +0000 Make the vendor string check for XFree86 more liberal, to deal with older versions of gentoo that modified it in a different way. (#4231, fix from Billy Biggs) ChangeLog | 7 +++++++ src/cairo-xlib-surface.c | 2 +- 2 files changed, 8 insertions(+), 1 deletions(-) commit a6acc962f76c1eba9dec3ee1646413f6c82ac6e0 Author: Owen Taylor Date: Sat Aug 27 18:46:34 2005 +0000 Undef MIN/MAX before defining them in case some system header happens to define them. (#4196, Christian Biesinger) ChangeLog | 8 +++++++- src/cairoint.h | 3 +++ 2 files changed, 10 insertions(+), 1 deletions(-) commit 3c53414cf34d2027284bdbd4836d10a2c0d998c0 Author: Owen Taylor Date: Sat Aug 27 18:40:46 2005 +0000 Fix docs not to talk about %NULL returns. #4271, Duncan Coutts. ChangeLog | 6 ++++++ src/cairo-image-surface.c | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) commit c0da73e1b8e5933ca117512499ccac4e208bd8e0 Author: Owen Taylor Date: Sat Aug 27 18:36:09 2005 +0000 Make the code work with -fomit-frame-pointer by making sure that %esp isn't modified at the point where we access output operands. (#4269, Patch from Ronald Wahl) pixman/ChangeLog | 7 +++++++ pixman/src/fbmmx.c | 24 +++++++++++++++++------- 2 files changed, 24 insertions(+), 7 deletions(-) commit 03c3935471ad69e8e2d0e6543b7667f972ef1f0c Author: Tor Lillqvist Date: Thu Aug 25 02:59:40 2005 +0000 Include the documentation, too. ChangeLog | 4 ++++ Makefile.am | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 1f975f4e82f3090b5f677241c1ca4d344788d27c Author: Billy Biggs Date: Wed Aug 24 19:20:08 2005 +0000 Update formatting of the title and short description, as this actually changes how the TOC appears in devhelp. ChangeLog | 30 ++++++++++++++++++++++++++++++ doc/public/tmpl/cairo-font-options.sgml | 6 ++---- doc/public/tmpl/cairo-font.sgml | 6 ++---- doc/public/tmpl/cairo-ft.sgml | 6 ++---- doc/public/tmpl/cairo-glitz.sgml | 6 ++---- doc/public/tmpl/cairo-image.sgml | 6 ++---- doc/public/tmpl/cairo-matrix.sgml | 6 ++---- doc/public/tmpl/cairo-paths.sgml | 6 ++---- doc/public/tmpl/cairo-pattern.sgml | 6 ++---- doc/public/tmpl/cairo-pdf.sgml | 6 ++---- doc/public/tmpl/cairo-png.sgml | 6 ++---- doc/public/tmpl/cairo-ps.sgml | 6 ++---- doc/public/tmpl/cairo-quartz.sgml | 6 ++---- doc/public/tmpl/cairo-scaled-font.sgml | 6 ++---- doc/public/tmpl/cairo-status.sgml | 6 ++---- doc/public/tmpl/cairo-surface.sgml | 6 ++---- doc/public/tmpl/cairo-text.sgml | 6 ++---- doc/public/tmpl/cairo-transforms.sgml | 6 ++---- doc/public/tmpl/cairo-types.sgml | 6 ++---- doc/public/tmpl/cairo-version.sgml | 6 ++---- doc/public/tmpl/cairo-win32-fonts.sgml | 6 ++---- doc/public/tmpl/cairo-win32.sgml | 6 ++---- doc/public/tmpl/cairo-xcb-xrender.sgml | 6 ++---- doc/public/tmpl/cairo-xcb.sgml | 6 ++---- doc/public/tmpl/cairo-xlib.sgml | 6 ++---- doc/public/tmpl/cairo.sgml | 6 ++---- 26 files changed, 80 insertions(+), 100 deletions(-) commit 241a4eb8f76fcd1e6ca7db127410fcca8adf907e Author: Bertram Felgenhauer Date: Wed Aug 24 17:44:16 2005 +0000 add docs-publish as a phony target ChangeLog | 4 ++++ Makefile.am | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) commit 0bcad6002a62cb5ba2eb733fe1863ac045db1c86 Author: Carl Worth Date: Wed Aug 24 10:16:14 2005 +0000 Increment CAIRO_VERSION to 1.0.1 after tagging RELEASE_1_0_0. ChangeLog | 5 +++++ configure.in | 2 +- 2 files changed, 6 insertions(+), 1 deletions(-) libgdiplus-2.11/cairo/PORTING_GUIDE0000664000175000017500000002076512225470167013615 00000000000000 ...-----=======-----... Cairo 1.0 Porting Guide ...-----=======-----... Here are some notes on more easily porting cairo_code from cairo 0.4 to cairo 1.0. It is sorted roughly in order of importance, (the items near the top are expected to affect the most people). Automated API renamings ======================= There have been a lot of simple renamings where the functionality is the same but the name of the symbol is different. We have provided a script to automate the conversion of these symbols. It can be found within the cairo distribution in: util/cairo-api-update This script is used by installing it somewhere on your PATH, and the running it and providing the names of your source files on the command line. For example: cairo-api-update *.[ch] The script will first save backup copies of each file (renamed with a .bak extension) and then will perform all of the simple renamings. For your benefit, the script also produces messages giving filenames and line numbers for several of the manual API updates that you will need to perform as described below. Manual API changes ================== This section of the porting guide describes changes you will have to manually make to your source code. In addition to the information in this guide, the cairo-api-update script will notify you of some of these issues as described above. Cairo's deprecation warnings ---------------------------- Also, if your compiler provides warnings for implicit declarations of functions, (eg. "gcc -Wall"), then simply attempting to compile your program will cause cairo to generate messages intended to guide you through the porting process. For example, if you neglect to update an old call to cairo_set_target_drawable, you might see an error message as follows: foo.c:10: warning: implicit declaration of function ‘cairo_set_target_drawable_DEPRECATED_BY_cairo_xlib_surface_create’ This message is indicating to you that the deprecatd function cairo_set_target_drawable appears in your program foo.c on line 10, and you should rewrite your program to call cairo_xlib_surface_create instead. The remainder of this porting guide is arranged as a set of common code patterns that appear in old (cairo-0.4) code and how it should be transformed to new (cairo-0.5) code. cairo_create ------------ Was: cr = cairo_create (); cairo_set_target_foo (cr, args); /* draw */ cairo_destroy (cr); Now: cairo_surface_t *surface; surface = cairo_foo_surface_create (args); cr = cairo_create (surface); /* draw */ cairo_destroy (cr); cairo_surface_destroy (surface); Or: cairo_surface_t *surface; surface = cairo_foo_surface_create (args); cr = cairo_create (surface); cairo_surface_destroy (surface); /* draw */ cairo_destroy (cr); NOTE: Many of the cairo_foo_surface_create functions accept the identical arguments as the the old cairo_set_target_foo functions, (minus the cairo_t*), making this transformation quite easy. One notable exception is cairo_set_target_drawable which, when it becomes cairo_xlib_surface_create must pickup new arguments for the Visual*, the width, and the height. cairo_set_alpha (1) ------------------- Was: cairo_set_rgb_color (cr, red, green, blue); cairo_set_alpha (cr, alpha); Now: cairo_set_source_rgba (cr, red, green, blue, alpha); cairo_show_surface ------------------ Was: cairo_show_surface (cr, surface, width, height); Now: cairo_set_source_surface (cr, surface, x, y); cairo_paint (cr); NOTE: The type signatures of cairo_show_surface and cairo_set_source are the same, but pay attention that cairo_show_surface required the width and height, while cairo_set_source_surface requires the X,Y location to where the surface will be placed. cairo_set_alpha (2) ------------------- Was: cairo_set_alpha (cr, alpha); cairo_show_surface (cr, surface, width, height); Now: cairo_set_source_surface (cr, surface, x, y); cairo_paint_with_alpha (cr, alpha); filling and stroking -------------------- Was: cairo_save (cr); /* set fill color */ cairo_fiill (cr); cairo_restore (cr); /* set stroke color */ cairo_stroke (cr); Now: /* set fill color */ cairo_fill_preserve (cr); /* set stroke color */ cairo_stroke (cr); NOTE: The current path is no longer saved/restored by cairo_save/cairo_restore. This can lead to some subtle surprises, so look out. cairo_matrix_t -------------- Was: cairo_matrix_t *matrix; matrix = cairo_matrix_create (); /* Do stuff with matrix */ cairo_matrix_destroy (matrix); Now: cairo_matrix_t matrix; cairo_matrix_init_identity (&matrix); /* Do stuff with &matrix */ NOTE: If you are really lazy, you can still use a cairo_matrix_t* and avoid putting the &matrix all over by just replacing cairo_matrix_create() with malloc() and cairo_matrix_destroy() with free(). That's not as nice, and you still need to be careful to see if you need to initialize it to an identity matrix as cairo_matrix_create() did for you. Rendering to a temporary surface -------------------------------- Was: cairo_save (cr); { cairo_set_target_surface (cr, temporary); /* draw through cr onto temporary */ } cairo_restore (cr); /* use temporary as source on cr */ Now: { cr2 = cairo_create (temporary); /* draw through cr2 onto temporary */ cairo_destory (cr2); } /* use temporary as source on cr */ NOTE: Having to create another cairo_t is a bit annoying, but having to invent a new name for it is just awful, (imagine a deeply nested version of this code). Fortunately, the style above is just a stop-gap measure until the new group API comes along. Iterating over a path --------------------- Was: cairo_current_path (cr, my_move_to, my_line_to, my_curve_to, my_close_path, closure); Now: int i; cairo_path_t *path; cairo_path_data_t *data; path = cairo_copy_path (cr); for (i=0; i < path->num_data; i += path->data[i].header.length) { data = &path->data[i]; switch (data->header.type) { case CAIRO_PATH_MOVE_TO: my_move_to (closure, data[1].point.x, data[1].point.y); break; case CAIRO_PATH_LINE_TO: my_line_to (closure, data[1].point.x, data[1].point.y); break; case CAIRO_PATH_CURVE_TO: my_curve_to (closure, data[1].point.x, data[1].point.y, data[2].point.x, data[2].point.y, data[3].point.x, data[3].point.y); break; case CAIRO_PATH_CLOSE_PATH: my_close_path (closure); break; } } cairo_path_destroy (path); NOTE: This version makes it looks like the new form is a _lot_ more verbose than the old version. But realize that the old version required the support of 4 additional functions. The new approach allows great flexibility including the ability to inline the entire operation within the switch statement when appropriate. Erasing a surface to transparent -------------------------------- Was: cairo_set_rgb_color (cr, 0., 0., 0.); cairo_set_alpha (cr, 0.) cairo_set_operator (cr, CAIRO_OPERATOR_SRC); cairo_rectangle (cr, 0., 0., surface_width, surface_height); cairo_fill (cr); or: cairo_set_rgb_color (cr, 0., 0., 0.); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_rectangle (cr, 0., 0., surface_width, surface_height); cairo_fill (cr); Now: cairo_set_source_rgba (cr, 0., 0., 0., 0.); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); or: cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); NOTE: Using cairo_rectangle and fill would still work just fine. It's just a lot more convenient to use cairo_paint now, (particularly as it doesn't require you to even know what the bounds of the target surface are). Drawing to a PNG file --------------------- Was: file = fopen (filename, "w"); cr = cairo_create (); cairo_set_target_png (cr, file, format, width, height); /* draw image */ cairo_destroy (cr); fclose (file); Now: surface = cairo_image_surface_create (format, width, height); cr = cairo_create (surface); /* draw image */ cairo_surface_write_to_png (surface, filename); cairo_destroy (cr); cairo_surface_destroy (surface); NOTE: The png backend is gone. So there is no cairo_png_surface_create to take the place of cairo_set_target_png. And notice that we used an image surface here, but it is just as easy to use cairo_surface_write_to_png with an xlib or other surface, (but not PDF at the moment). This is one of the big advantages of this approach as opposed to a PNG surface. libgdiplus-2.11/cairo/Makefile.am0000664000175000017500000002174412225470167013665 00000000000000DIST_SUBDIRS = src #boilerplate test perf doc util SUBDIRS = src #doc # libpng is required for our test programs if CAIRO_HAS_PNG_FUNCTIONS #SUBDIRS += boilerplate test perf endif .PHONY: doc test retest recheck check-valgrind # We have some generated header files, so we really need to build the # library before we can build the docs doc: all cd doc && $(MAKE) $(AM_MAKEFLAGS) doc test: all cd test && $(MAKE) $(AM_MAKEFLAGS) test retest: all cd test && $(MAKE) $(AM_MAKEFLAGS) retest recheck: all cd test && $(MAKE) $(AM_MAKEFLAGS) recheck check-valgrind: all cd test && $(MAKE) $(AM_MAKEFLAGS) check-valgrind cd perf && $(MAKE) $(AM_MAKEFLAGS) check-valgrind perf: all cd perf && $(MAKE) $(AM_MAKEFLAGS) perf if CAIRO_HAS_LCOV # use recursive makes in order to ignore errors during check/perf lcov: -$(MAKE) $(AM_MAKEFLAGS) check $(MAKE) $(AM_MAKEFLAGS) genlcov lcov-perf: -$(MAKE) $(AM_MAKEFLAGS) perf $(MAKE) $(AM_MAKEFLAGS) genlcov # we have to massage the lcov.info file slightly to hide the effect of libtool # placing the objects files in the .libs/ directory separate from the *.c genlcov: $(LTP) --directory $(top_builddir) --path $(top_builddir) --capture --output-file cairo-lcov.info --test-name CAIRO_TEST --no-checksum $(SED) -e 's#.libs/##' \ -e 's#boilerplate/src#src#' \ -e 's#$(shell pwd)#$(shell cd $(top_srcdir) && pwd)#' \ < cairo-lcov.info > cairo-lcov.info.tmp LANG=C $(LTP_GENHTML) --prefix $(top_builddir) --output-directory cairo-lcov --title "Cairo Code Coverage" --show-details cairo-lcov.info.tmp $(RM) cairo-lcov.info.tmp else lcov lcov-perf genlcov: @echo You need to configure Cairo with support for gcov enabled. @echo e.g, ./configure --enable-gcov endif lcov-clean: if CAIRO_HAS_LCOV -$(LTP) --directory $(top_builddir) -z endif -$(RM) -r cairo-lcov.info cairo-lcov -$(FIND) -name '*.gcda' -print | $(XARGS) $(RM) EXTRA_DIST = \ AUTHORS \ BIBLIOGRAPHY \ BUGS \ CODING_STYLE \ COPYING \ COPYING-LGPL-2.1 \ COPYING-MPL-1.1 \ INSTALL \ NEWS \ PORTING_GUIDE \ README \ RELEASING DISTCLEANFILES = config.cache distclean-local: lcov-clean MAINTAINERCLEANFILES = \ $(srcdir)/aclocal.m4 \ $(srcdir)/autoscan.log \ $(srcdir)/compile \ $(srcdir)/config.guess \ $(srcdir)/config.h.in \ $(srcdir)/config.sub \ $(srcdir)/configure.scan \ $(srcdir)/depcomp \ $(srcdir)/install-sh \ $(srcdir)/ltmain.sh \ $(srcdir)/missing \ $(srcdir)/mkinstalldirs \ `find "$(srcdir)" -type f -name Makefile.in -print` DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-test-surfaces include $(srcdir)/ChangeLog.mk # Some custom targets to make it easier to release things. # # To make real stable releases or devel snapshots, use either: # make release-check # or make release-publish # # To make a quick properly named (date and git hash stamped) tarball: # make snapshot snapshot: distdir="$(distdir)-`date '+%Y%m%d'`"; \ test -d "$(srcdir)/.git" && distdir=$$distdir-`cd "$(srcdir)" && git-rev-parse HEAD | cut -c 1-6`; \ $(MAKE) $(AM_MAKEFLAGS) distdir="$$distdir" dist RELEASE_OR_SNAPSHOT = $$(if test "x$(CAIRO_VERSION_MINOR)" = "x$$(echo "$(CAIRO_VERSION_MINOR)/2*2" | bc)" ; then echo release; else echo snapshot; fi) RELEASE_UPLOAD_HOST = cairographics.org RELEASE_UPLOAD_BASE = /srv/cairo.freedesktop.org/www RELEASE_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE)/$(RELEASE_OR_SNAPSHOT)s RELEASE_URL_BASE = http://cairographics.org/$(RELEASE_OR_SNAPSHOT)s RELEASE_ANNOUNCE_LIST = cairo-announce@cairographics.org (and CC gnome-announce-list@gnome.org) MANUAL_DATED = cairo-manual-`date +%Y%m%d` MANUAL_TAR_FILE = $(MANUAL_DATED).tar.gz MANUAL_UPLOAD_DIR = $(RELEASE_UPLOAD_BASE) tar_file = $(PACKAGE)-$(VERSION).tar.gz sha1_file = $(tar_file).sha1 gpg_file = $(sha1_file).asc $(sha1_file): $(tar_file) sha1sum $^ > $@ $(gpg_file): $(sha1_file) @echo "Please enter your GPG password to sign the checksum." gpg --armor --sign $^ # Win32 package zipfiles runtime_zip_file = /tmp/$(PACKAGE)-$(VERSION).zip developer_zip_file = /tmp/$(PACKAGE)-dev-$(VERSION).zip $(runtime_zip_file): install -$(RM) $@ cd $(prefix); \ zip $@ bin/libcairo-$(LT_CURRENT_MINUS_AGE).dll $(developer_zip_file): install -$(RM) $@ cd $(prefix); \ zip -r $@ include/cairo lib/libcairo.dll.a lib/cairo.lib lib/pkgconfig/cairo.pc lib/pkgconfig/cairo-*.pc share/gtk-doc/html/cairo zips: $(runtime_zip_file) $(developer_zip_file) release-verify-sane-changelogs: changelogs @echo -n "Checking that the ChangeLog files are sane..." @if grep -q "is required to generate" $(CHANGELOGS); then \ (echo "Ouch." && echo "Some of the ChangeLogs are not generated correctly." \ && echo "Remove ChangeLog* and make changelogs" \ && false); else :; fi @echo "Good." release-verify-sane-tests: @echo "Checking that the test suite is sane..." @cd test && $(MAKE) $(AM_MAKEFLAGS) release-verify-sane-tests release-verify-soname-major: @echo -n "Checking that the cairo soname major number is 2..." @test "$(LT_CURRENT_MINUS_AGE)" = "2" \ || (echo "Ouch." && echo "The soname major number is $(LT_CURRENT_MINUS_AGE) instead of 2." \ && echo "The libtool shared library version numbers in configure.in must be incremented properly." \ && false) @echo "Good." release-verify-even-micro: @echo -n "Checking that $(VERSION) has an even micro component..." @test "$(CAIRO_VERSION_MICRO)" = "`echo $(CAIRO_VERSION_MICRO)/2*2 | bc`" \ || (echo "Ouch." && echo "The version micro component '$(CAIRO_VERSION_MICRO)' is not an even number." \ && echo "The version in configure.in must be incremented before a new release." \ && false) @echo "Good." release-verify-newer: @echo -n "Checking that no $(VERSION) release already exists..." @ssh $(RELEASE_UPLOAD_HOST) test ! -e $(RELEASE_UPLOAD_DIR)/$(tar_file) \ || (echo "Ouch." && echo "Found: $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR)/$(tar_file)" \ && echo "Are you sure you have an updated checkout?" \ && echo "This should never happen." \ && false) @echo "Good." release-remove-old: $(RM) $(tar_file) $(sha1_file) $(gpg_file) # Maybe it's just my system, but somehow group sticky bits keep # getting set and this causes failures in un-tarring on some systems. # Until I figure out where the sticky bit is coming from, just clean # these up before building a release. release-cleanup-group-sticky: find . -type f | xargs chmod g-s release-check: release-verify-sane-changelogs release-verify-sane-tests release-verify-soname-major release-verify-even-micro release-verify-newer release-remove-old release-cleanup-group-sticky distcheck release-upload: release-check $(tar_file) $(sha1_file) $(gpg_file) mkdir -p releases scp $(tar_file) $(sha1_file) $(gpg_file) $(RELEASE_UPLOAD_HOST):$(RELEASE_UPLOAD_DIR) mv $(tar_file) $(sha1_file) $(gpg_file) releases ssh $(RELEASE_UPLOAD_HOST) "rm -f $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-[0-9]* && ln -s $(tar_file) $(RELEASE_UPLOAD_DIR)/LATEST-$(PACKAGE)-$(VERSION)" git-tag -s -m "cairo $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release" $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) release-publish-message: releases/$(sha1_file) @echo "Please follow the instructions in RELEASING to push stuff out and" @echo "send out the announcement mails. Here is the excerpt you need:" @echo "" @echo "Subject: $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) now available" @echo "" @echo "============================== CUT HERE ==============================" @echo "A new $(PACKAGE) $(RELEASE_OR_SNAPSHOT) $(VERSION) is now available from:" @echo "" @echo " $(RELEASE_URL_BASE)/$(tar_file)" @echo "" @echo " which can be verified with:" @echo "" @echo " $(RELEASE_URL_BASE)/$(sha1_file)" @echo -n " " @cat releases/$(sha1_file) @echo "" @echo " $(RELEASE_URL_BASE)/$(gpg_file)" @echo " (signed by `getent passwd "$$USER" | cut -d: -f 5 | cut -d, -f 1`)" @echo "" @echo " Additionally, a git clone of the source tree:" @echo "" @echo " git clone git://git.cairographics.org/git/cairo" @echo "" @echo " will include a signed $(VERSION) tag which points to a commit named:" @echo " `git cat-file tag $(VERSION) | grep ^object | sed -e 's,object ,,'`" @echo "" @echo " which can be verified with:" @echo " git verify-tag $(VERSION)" @echo "" @echo " and can be checked out with a command such as:" @echo " git checkout -b build $(VERSION)" @echo "" @echo "============================== CUT HERE ==============================" release-publish: release-upload release-publish-message doc-publish: doc rm -rf ./$(MANUAL_DATED) cp -a doc/public/html $(MANUAL_DATED) tar czf $(MANUAL_TAR_FILE) $(MANUAL_DATED) scp $(MANUAL_TAR_FILE) $(RELEASE_UPLOAD_HOST):$(MANUAL_UPLOAD_DIR) ssh $(RELEASE_UPLOAD_HOST) "cd $(MANUAL_UPLOAD_DIR) && tar xzf $(MANUAL_TAR_FILE) && rm -f manual && ln -s $(MANUAL_DATED) manual && ln -sf $(MANUAL_TAR_FILE) cairo-manual.tar.gz" .PHONY: release-verify-even-micro release-verify-newer release-remove-old release-cleanup-group-sticky release-check release-upload release-publish docs-publish lcov lcov-perf lcov-clean genlcov EXTRA_DIST += Makefile.win32 libgdiplus-2.11/cairo/ChangeLog0000664000175000017500000332163212225470635013405 000000000000002008-11-05 Marek Habersack * configure.in: always call AC_PROG_CXX, fixes compilation on OpenSuSE 11.1b4 commit 08a804806355d99d7968976d6afb98bbc0f2613d Author: Carl Worth Date: Fri Apr 11 14:33:12 2008 -0700 Increment version to 1.6.4 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit a96176e12fa99b293453fa0321b1dfa4fd242917 Author: Carl Worth Date: Fri Apr 11 14:32:37 2008 -0700 NEWS: Add notes for cairo 1.6.4 NEWS | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) commit 32e576382bc08ffaf98ebfc11c96e1453c437bbe Author: Carl Worth Date: Fri Apr 11 14:13:03 2008 -0700 Prevent cairo from being linked unnecessarilly with g++ The beos backend involves a source file written in C++. Apparently, automake sees the conditional inclusion of that source file and insists on doing the final link of cairo with g++ even though that file isn't being compiled at all. We definitely don't want that as it makes libcairo link and depend on libstdc++ unnecessarily, (which can break distribution packaging when not expecting it, etc.). src/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 8f1c8d4b26d6da11101c51ef388d1dcc7177cfb4 Author: Carl Worth Date: Fri Apr 11 13:48:38 2008 -0700 Revert "[xlib] Add locking around GC cache." This reverts commit 9cfd82e87b60c0d65e9cafda026cb9a498874575. The fix was broken as it introduced crashes by calling XSetClipMask with a NULL GC, (basically a reintroduction of the bug originally fixed here: 7802de6d5edaf998c98b141870dc2c6b4c0f3e91 Let's revert for sake of the release, and fix this correctly on master. src/cairo-xlib-private.h | 1 - src/cairo-xlib-screen.c | 31 ++++++++++--------------------- 2 files changed, 10 insertions(+), 22 deletions(-) commit a5770c3335fccd1591f2cd58ab950a6eba77f271 Author: Carl Worth Date: Fri Apr 11 10:05:18 2008 -0700 Increment version to 1.6.3 after the 1.6.2 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5bc6fd71398f8aa902fcffe2da5d1e70fb94aa8a Author: Carl Worth Date: Fri Apr 11 09:52:28 2008 -0700 Increment version to 1.6.2 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0c32497c3447d6d02d45a14ff4c400b6d1ea37da Author: Carl Worth Date: Fri Apr 11 09:50:53 2008 -0700 NEWS: Add notes for 1.6.2 release NEWS | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-) commit 9cfd82e87b60c0d65e9cafda026cb9a498874575 Author: Chris Wilson Date: Thu Apr 10 14:49:47 2008 +0100 [xlib] Add locking around GC cache. The per-screen cached of most-recently freed GCs lacks suitable locking for it to be threadsafe. (cherry picked from commit dc714106e156cb7901e376c0935922446ae9bcdf) src/cairo-xlib-private.h | 1 + src/cairo-xlib-screen.c | 31 +++++++++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) commit cf057c1e8603014033c079189369e91aecac2adf Author: Adrian Johnson Date: Fri Apr 11 21:42:19 2008 +0930 PS: Fix inefficient implementation of Tm/Td operators that was crashing printers The Td and Tm operator emulation were setting the font matrix like this: /some_font [xx yx xy yy x0 y0] selectfont where [xx yx xy yy] is the font matrix and [x0 y0] is the position of the first glyph to be drawn. This seemed to be the easiest way to emulate the Tm operator since the six arguments to Tm required by PDF are xx,yx,xy,yy,x0,y0. Before the switch to pdf-operators the font matrix was set like this: /somefont [xx yx xy yy 0 0] selectfont x0 y0 moveto The selectfont operator is equivalent to calling findfont, makefont, and setfont. The makefont operator creates a new font dictionary for specified font that contains the specified font matrix. The description of the makefont operator in the PostScript Language Reference Manual states: "The interpreter keeps track of font dictionaries recently created by makefont. Calling makefont multiple times with the same font and matrix will usually return the same font rather than create a new one." So the emulation of Tm and Td was creating a new font dictionary every time a text string was displayed due to the change in the translation components of the font matrix. Previously the font dictionary was re-used as with the translation components of the matrix set to zero, the font matrix did not change frequently. Some printers did not handle well the frequent creation a font dictionary every time a few glyphs were displayed. Fix this by ensuring the translation components of the font matrix used in the emulation of Tm and Td operators is always set to zero. Use moveto instead for the translation components. (cherry picked from commit c5814d2aa3cb68a13bc9cc8b6a47f660febcad71) src/cairo-ps-surface.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) commit eac9251d9a78e8d7bf00098b367a5176ed7dbce6 Author: Carl Worth Date: Thu Apr 10 18:02:59 2008 -0700 Increment version to 1.6.1 after 1.6.0 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d6263bec89bcd1565fb0f56a9840cd6f7761097f Author: Carl Worth Date: Thu Apr 10 17:34:41 2008 -0700 Increment cairo version to 1.6.0 configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 709805c26f567b7fa90d04e701ccbf1cccc34da7 Author: Carl Worth Date: Thu Apr 10 17:33:51 2008 -0700 NEWS: Add notes for 1.6.0 release NEWS | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 190 insertions(+), 8 deletions(-) commit aadbaf7d990d0d5cd7c25cc856dbcfcc357b44f1 Author: Carl Worth Date: Tue Apr 8 02:45:56 2008 -0700 Increment version to 1.5.20 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8f123d035af0c02dc0a668a073410756edafbdd6 Author: Carl Worth Date: Tue Apr 8 02:45:31 2008 -0700 NEWS: Add notes for 1.5.20 snapshot NEWS | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) commit f7dea9a8d3da7f57286db4b1b6300726483a0d76 Author: Carl Worth Date: Tue Apr 8 02:28:52 2008 -0700 Fix distcheck by renaming large-source-ref.c to large-source-ref.png (oops!) test/large-source-ref.c | Bin 137 -> 0 bytes test/large-source-ref.png | Bin 0 -> 137 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit c26a7de9707e26d0552b0fedcd4bf2e0ba6542b2 Author: Carl Worth Date: Tue Apr 8 01:54:27 2008 -0700 Prevent potentially infinite wandering through memeory in _cairo_hull_prev_valid It is possible for _cairo_hull_prev_valid to be called just once right before the calling loop is going to terminate. In this case we really don't want to walk off the beginning of the array and start wandering. Thanks to Jonathan Watt for noticing this problem: https://bugzilla.mozilla.org/show_bug.cgi?id=306649#c21 src/cairo-hull.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit c19133eb9ab31bbdc7e82573033e513e9eb867f2 Author: Carl Worth Date: Tue Apr 8 01:34:37 2008 -0700 Revert "[test] Repeat tests using cairo_push_group()." This reverts commit 07122e64fa9529e7ba9323988a5af1d1e7c2c55f. The extra testing did find a pdf bug, and that should be fixed, but the extra maintenance burden of running another iteration of all tests does not seem justfied at all---particularly since it looks like dozens of new reference images would be needed for the svg backend. Also, the new "failures" of the image backend with this new testing look like a misunderstanding of exactly what the new testing is actually drawing. test/cairo-test.c | 119 +++++++--------------------------------------------- 1 files changed, 16 insertions(+), 103 deletions(-) commit c1f7655f2fd5373a74d3fbf5977ebbd84e401e25 Author: Carl Worth Date: Tue Apr 8 00:40:58 2008 -0700 Check surface->status and finished in cairo_surface_write_to_png Without these checks, a user could hit an assertion failure by passing a finished surface to cairo_surface_write_to_png. Now we return a nice CAIRO_STATUS_SURFACE_FINISHED error in that case instead. src/cairo-png.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 33c54ed240b319acb28ef370eef5188ad42a5737 Author: Chris Wilson Date: Mon Apr 7 22:14:04 2008 +0100 [test] Add large-source to exercise handling of massive images. This test exercises https://bugzilla.mozilla.org/show_bug.cgi?id=424333. The test is expected to fail due to issues with pixman, but cairo should fail gracefully and neither crash nor cause XErrors. test/.gitignore | 1 + test/Makefile.am | 3 + test/large-source-ref.c | Bin 0 -> 137 bytes test/large-source.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 0 deletions(-) commit 4924d4d928666981f3e64bec685e8f90e524e62e Author: Chris Wilson Date: Mon Apr 7 23:48:36 2008 +0100 [cairo-xlib] Do not create surface with mismatching Visual and PictFormat. As identified by Vladimir Vukicevic, _cairo_xlib_surface_create_similar_with_format() was erroneously passing down the source Visual when creating a surface with a different XRenderPictFormat. src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9aac5916bcb4a3e62194315b12961d97f193a585 Author: Chris Wilson Date: Mon Apr 7 23:42:47 2008 +0100 [test/xlib-surface] Check for mismatching Visuals and XRenderPictFormats Vladimir Vukicevic reported that surfaces were being created with mismatching Visuals and XRenderPictFormats - and demonstated here. test/xlib-surface.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 63 insertions(+), 0 deletions(-) commit f6afba8f5453b8e3af9101fa2cde4c05a67f6d4b Author: Chris Wilson Date: Mon Apr 7 23:25:57 2008 +0100 [cairo-xlib] Create Pixmap using depth from xrender_format. Use the depth as specified by the xrender_format when creating the pixmap (as opposed to a guess based on the cairo_format_t). src/cairo-xlib-surface.c | 21 ++------------------- 1 files changed, 2 insertions(+), 19 deletions(-) commit 922fefdde4af28f9fc1e42fcba1b315980b01dc7 Author: Chris Wilson Date: Mon Apr 7 23:06:18 2008 +0100 [cairo-xlib] Handle missing RENDER during similar surface creation If the xserver doesn't support the RENDER extension or simply doesn't have the matching PictFormat then xrender_format might be NULL. Check and fallback in this case. src/cairo-xlib-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 07122e64fa9529e7ba9323988a5af1d1e7c2c55f Author: Chris Wilson Date: Mon Apr 7 22:00:51 2008 +0100 [test] Repeat tests using cairo_push_group(). Test surfaces using similar surfaces with both CONTENT_COLOR and CONTENT_COLOR_ALPHA, if applicable. This seems justified by the apparent bugs in the pdf backend when going from an ARGB32 similar surface to a destination RGB24 surface as well as isolated bugs in the image backend. The original goal was to try and trick the test suite into producing a xlib surface with mismatching Visual/XRenderPictFormat. This succeeds, although with a little bit of brute force in the xlib backend, but the search to reproduce a BadMatch error fruitless. test/cairo-test.c | 119 +++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 103 insertions(+), 16 deletions(-) commit e04e4262386b8735d2ceabbc187405cace89dc80 Author: Chris Wilson Date: Mon Apr 7 10:56:38 2008 +0100 [test/get-xrender-format] Free static data on exit. Free the internal caches so that valgrind reports zero leaks. test/get-xrender-format.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit e57ef66fab7cb05b84175b3cfb5c032150cfa682 Author: Chris Wilson Date: Mon Apr 7 10:51:27 2008 +0100 [test/xlib-surface] Zero pixel buffers before use. As we only use RGB24 surface data the alpha channel is undefined, so zero it to prevent valgrind warnings. test/xlib-surface.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) commit d0672e85ef120a4e3cd0dfcbdb717afbf9526f17 Author: Chris Wilson Date: Mon Apr 7 10:42:57 2008 +0100 [test/surface-source] Skip tests if we cannot create the source surface. Check that the test environment supports the desired source and avoid triggering asserts in the test routines. test/glitz-surface-source.c | 15 ++++++++++----- test/surface-source.c | 8 ++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) commit 056d3c853e6660db31ee4a50d0e990a6013aa703 Author: Chris Wilson Date: Mon Apr 7 10:35:04 2008 +0100 [test/stroke-image] Fix memleak. Release the temporary image surface after setting it as the source. test/stroke-image.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit e460e586d7d093c1e03052efa3bfb45a2d5cf6ef Author: Carl Worth Date: Mon Apr 7 22:02:44 2008 -0700 Update several pdf-specific reference images I don't know if we made minor changes to the pdf backend, or if this was due to a poppler change, (we recently bumped the poppler required for testing up to 0.8.0), but any way around it these test results look just as good as the reference images they are replacing. test/Makefile.am | 2 ++ test/clip-operator-pdf-argb32-ref.png | Bin 11429 -> 11145 bytes test/ft-text-vertical-layout-type1-pdf-ref.png | Bin 0 -> 3604 bytes test/ft-text-vertical-layout-type3-pdf-ref.png | Bin 0 -> 3634 bytes test/push-group-pdf-ref.png | Bin 2694 -> 2807 bytes test/push-group-pdf-rgb24-ref.png | Bin 2611 -> 2714 bytes 6 files changed, 2 insertions(+), 0 deletions(-) commit fdcd1445846b59d2ffd1780dd0f6d70169036ad4 Author: Carl Worth Date: Mon Apr 7 13:30:59 2008 -0700 Add filter-bilinear-extents to the XFAIL list This test case does show a bug, and we have lots of ideas on how to fix the bug, but we want to wait until after the 1.6 release before we fix it. See: http://bugs.freedesktop.org/show_bug.cgi?id=15349 test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 36246c51ba720713ebf93573da29b098e87f0bd0 Author: Carl Worth Date: Mon Apr 7 12:10:24 2008 -0700 Revert "_cairo_pattern_get_extents: Fix to allow for expansion based on filter" This reverts commit 731e121c802a7b1c3429d1bde7a93bc471d70880. This commit introduced various problems, (some likely noticeable in the test suite, and others perhaps not). For some details, see the latest comments in the original bug report leading to the fix now being reverted: http://bugs.freedesktop.org/show_bug.cgi?id=15349 src/cairo-pattern.c | 22 ---------------------- 1 files changed, 0 insertions(+), 22 deletions(-) commit c88adb6aee650c8c544b212f539bd5da9ed88734 Author: Carl Worth Date: Mon Apr 7 16:09:03 2008 -0700 Add svg-specific reference images for smask and smask-mask The most recent change for the mask_id allocation fixes these two test, (it fixes mask-image-mask as well, but it didn't need a new reference image). test/Makefile.am | 2 ++ test/smask-mask-svg-ref.png | Bin 0 -> 2529 bytes test/smask-svg-ref.png | Bin 0 -> 3634 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit 164e9c195c16fbed08539b859a06cc6f042fb5d9 Author: Carl Worth Date: Mon Apr 7 15:50:22 2008 -0700 SVG: Fix generation of mask_id identifiers In tests such as smask-mask (and others) the cairo_mask operation is used in the construction of a mask. In this case, the single document->mask_id value was being incremented at inappropriate times. We fix this by adding a new _cairo_svg_document_allocate_mask_id that returns the current value and increments it. That way, callers can hold onto this reliable value for the desired lifetime that the code needs the identifier. src/cairo-svg-surface.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) commit 8aa306ec08dcf0ae8803cdb1bda0fb31658f9e83 Author: Carl Worth Date: Mon Apr 7 14:17:40 2008 -0700 Add svg-specific reference images for smask-fill, smask-paint, and smask-text tests test/Makefile.am | 3 +++ test/smask-fill-svg-ref.png | Bin 0 -> 1166 bytes test/smask-paint-svg-ref.png | Bin 0 -> 2612 bytes test/smask-text-svg-ref.png | Bin 0 -> 1886 bytes 4 files changed, 3 insertions(+), 0 deletions(-) commit 3d86023281d7d18ad72be85ad8b53c29f20dfc7e Author: Carl Worth Date: Mon Apr 7 14:09:32 2008 -0700 Add ps-specific reference images for smask and smask-text tests test/Makefile.am | 2 ++ test/smask-ps-ref.png | Bin 0 -> 3669 bytes test/smask-text-ps-ref.png | Bin 0 -> 2023 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit f2a94c84a160f205ee72cc0c538a556d7d611e7b Author: Carl Worth Date: Mon Apr 7 13:03:58 2008 -0700 Add underscore prefix to private _cairo_pdf_surface_set_size_internal src/cairo-pdf-surface.c | 48 +++++++++++++++++++++++----------------------- 1 files changed, 24 insertions(+), 24 deletions(-) commit 3d22902fa37623a56dee9e4a20d0dc215deabd72 Author: Adrian Johnson Date: Sun Apr 6 19:29:25 2008 +0930 Add PDF ref images for the smask tests These tests render correctly in acroread 8.1. test/Makefile.am | 7 +++++++ test/smask-fill-pdf-ref.png | Bin 0 -> 1075 bytes test/smask-image-mask-pdf-ref.png | Bin 0 -> 421 bytes test/smask-mask-pdf-ref.png | Bin 0 -> 3731 bytes test/smask-paint-pdf-ref.png | Bin 0 -> 3800 bytes test/smask-pdf-ref.png | Bin 0 -> 3800 bytes test/smask-stroke-pdf-ref.png | Bin 0 -> 449 bytes test/smask-text-pdf-ref.png | Bin 0 -> 1806 bytes 8 files changed, 7 insertions(+), 0 deletions(-) commit 688fbc24c38119a505e54a8a2fd0e71e988bf969 Author: Adrian Johnson Date: Sun Apr 6 19:04:27 2008 +0930 PDF: Add a function for changing the surface size The smask-fill test was failing for PDF output because in some places where the surface size is changed (eg when emitting patterns or smasks) the cairo_to_pdf matrix was not updated. Fix this by adding a function to handle the surface size change and replace all the duplicated code for changing surface size with a call to this function. src/cairo-pdf-surface.c | 69 ++++++++++++++++++++++------------------------ 1 files changed, 33 insertions(+), 36 deletions(-) commit 6e5e852f739b63f0325927c70e4d4456c60d0ba9 Author: Carl Worth Date: Sun Apr 6 03:25:58 2008 -0700 Increment cairo version to 1.5.19 after the 1.5.18 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6d6c8aa643603c2b5fd7baedc897d4698ba8bafb Author: Carl Worth Date: Sun Apr 6 03:11:04 2008 -0700 Increment cairo version to 1.5.18 and library versioning to 19:1:17 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 44cd51ada62f831e4fddd363797b3ad4568fb443 Author: Carl Worth Date: Sun Apr 6 03:10:07 2008 -0700 NEWS: Add notes for 1.5.18 snapshot NEWS | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 111 insertions(+), 0 deletions(-) commit 3f5ce00e99bcbb17594441301ad0845007d0aedf Author: Carl Worth Date: Sun Apr 6 03:09:45 2008 -0700 Add missing parens() to function name in gtk-doc comment src/cairo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c08e2ba974ad7f5d9343d0d815a00a8e9ad51f81 Author: Carl Worth Date: Sun Apr 6 02:56:19 2008 -0700 Document default opaque black source pattern. src/cairo.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit e07e1b7bbbac59ae2ea25ed762c017b477e22cc4 Author: Carl Worth Date: Sun Apr 6 02:47:32 2008 -0700 Document many more defaults Including: fallback_resolution, fill_rule, line_cap, line_join, miter_limit, font_face, font_size, and operator. src/cairo-surface.c | 3 +++ src/cairo.c | 30 ++++++++++++++++++++++++++---- src/cairo.h | 10 +++++++++- 3 files changed, 38 insertions(+), 5 deletions(-) commit a55669c325c341fa6175a193cb0d6fa30b8247c9 Author: Carl Worth Date: Sun Apr 6 02:17:33 2008 -0700 Document toy nature of cairo_select_font_face src/cairo.c | 32 ++++++++++++++++++++++++++------ 1 files changed, 26 insertions(+), 6 deletions(-) commit d1fe0084405a49f33d4ab6d80e9398e281483900 Author: Carl Worth Date: Sun Apr 6 02:17:09 2008 -0700 Document default extend modes src/cairo-pattern.c | 3 +++ src/cairo.h | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) commit abe6f9541eb1fe10c063540dbffe3499ec8a9d3e Author: Carl Worth Date: Sun Apr 6 02:01:04 2008 -0700 Document EXTEND_REFLECT and EXTEND_PAD as implemented for surfaces since 1.6 src/cairo.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 657b348e0172f3b5f2c91a406c2eca039a790ca1 Author: Carl Worth Date: Sun Apr 6 01:57:45 2008 -0700 README: Update dependencies README | 139 +++++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 89 insertions(+), 50 deletions(-) commit c642a401959c183de2afa3fba2c4206aa0fdbc0c Author: Carl Worth Date: Sun Apr 6 01:13:17 2008 -0700 Revert "[README] Remove the Dependencies section as it falls out of date easily" This reverts commit 5f38e215ed4ec930492ee373db37a767d85a6ee8. It's true that the dependencies can fall out of date, but it's really unkind to not provide users with this information. I think we can compromise by committing to update this information before major releases. README | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 89 insertions(+), 0 deletions(-) commit b61d1b01e94b3d8daa288b8d5d183f093d989582 Author: Carl Worth Date: Sun Apr 6 01:07:32 2008 -0700 Change default filter from BEST to GOOD Right now the two filters are implemented identically, so there's no real change for now. But in the future, it's conceivable that an X server could implement some crazy, high-quality filter for BEST without regard to performance, (since that's what BEST means). Meanwhile, GOOD actually captures what we want by default which is a good mix of both quality and performance. src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 14b056945cef7e016ec07c87725348f3f0649d9f Author: Carl Worth Date: Sun Apr 6 00:34:59 2008 -0700 Update smask-text reference image It appears the reference image wasn't generated on a gold-standard machine, (and yes, the gold standard is, *ahem* whatever happens to match what Carl's machine does---eventually we'll make the test- based tests less picky about system configuration like this). test/smask-text-ref.png | Bin 1796 -> 1739 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 3a89bf4a1dd37852ca603c2ba472de73959dc69a Author: Chris Wilson Date: Sat Apr 5 22:01:24 2008 +0100 [test] Remove some redundant evals from the summary. In a couple of places we used eval to execute a simple assignment - complete overkill. test/Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit fc0a2988cdcbc54292377b00fe9a82b4a7407918 Author: Chris Wilson Date: Sat Apr 5 21:58:10 2008 +0100 [test] Disable jobserver with make check. make -j check has the unfortunate side-effect of performing the summary before the TESTS have completed, both hiding in the stream of test output and making it useless. Forcibly disable the jobserver so that the summary is always last at the expense of not compiling the tests in parallel. test/Makefile.am | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit ae6fbe9e6e153a917f3ae8d733e88303e2816b2b Author: Adrian Johnson Date: Sun Apr 6 01:08:31 2008 +1030 scaled-font-subsets: Special case .notdef in a new subset If the .notdef glyph is the first glyph in the subset to be mapped in scaled font, we do not know if the subset will scaled or unscaled. We can put it in the unscaled subset as Type1-fallback will embded an empty glyph if it can not get the path. src/cairo-scaled-font-subsets.c | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-) commit 0d5902b7167f8cb4bfc96fd813003cd220441151 Author: Adrian Johnson Date: Sat Apr 5 23:33:29 2008 +1030 Type1-fallback: Use correct glyph metrics for .notdef glyph Bug 15348 references the following PDF that was printing incorrectly when running through poppler and cairo to generate PostScript. http://launchpadlibrarian.net/12921700/UbuntuDesktop.pdf The PostScript output had too much space between each word causing strings of glyphs printed with the TJ operator to overlap. The original PDF file contains an CFF font with CID Identity-H encoding. The PDF file is using character code 0 (glyph 0 due to Identity-H encoding) as a space character. The CFF specification defines glyph 0 to be the .notdef glyph. The PS backend subsets CFF fonts as a Type1-fallback font. Type1-fallback creates it's own empty .notdef glyph with an arbitrary glyph advance of 500. The problem here is the TJ operator used to output the glyphs depends on the glyph advance being correct. pdf-operators.c uses the glyph advance returned by _scaled_glyph_init(). However the PostScript interpreter sees the glyph advance of 500 for .notdef. This problem does not occur when generating PDF as the PDF font dictionary contains an list of glyph advances that override the font metrics. Fix this by making Type1-fallback not treat .notdef as special and to create it the path and metrics obtained from _scaled_glyph_init(). As a special case, make it not fail if _scaled_glyph_init() is unable to return a path for .notdef. This was probably the reason Type1-fallback previously created it's own .notdef glyph as calling _scaled_glyph_init(_GLYPH_INFO_PATH) for glyph 0 returns CAIRO_INT_STATUS_UNSUPPORTED for some fonts. This ensures the Type1-fallback font metrics match the metrics used by pdf-operators.c to position the glyphs. This also results in the removal of some duplicated code. src/cairo-type1-fallback.c | 92 ++++++++++++++------------------------------ 1 files changed, 29 insertions(+), 63 deletions(-) commit 03d2b098ff245ff6724b1d83a121f5ce9dcd0b51 Author: Adrian Johnson Date: Sat Apr 5 21:15:15 2008 +1030 Type1-fallback: Use correct glyph advance in Type 1 charstrings 5050c55f93af fixed type1-fallback to use the glyph advance instead of glyph width in the stored glyph metrics in the font. However it did not fix the same bug in Type 2 charstrings (used by CFF fallback in PDF). This problem was not noticed since the glyph widths in the PDF font dictionary overrides these values. Fix this in case any software reading cairo PDFs uses these values. src/cairo-type1-fallback.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 40cee8c57879d37d77c5a93de8f7bdef28851923 Author: Adrian Johnson Date: Sat Apr 5 20:53:39 2008 +1030 Add assert to scaled_glyph_lookup in scaled-font-subsets If _cairo_scaled_glyph_lookup() returns CAIRO_INT_STATUS_UNSUPPORTED it will be caught by the ASSERT_NOT_REACHED in _emit_unscaled_font_subset in PS/PDF. It is more useful to catch this closer to the source. src/cairo-scaled-font-subsets.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 93536bf3ac251d17c4d8630cad93c37b0d4a8326 Author: Chris Wilson Date: Sat Apr 5 09:31:22 2008 +0100 [test] Summarise failures per backend. Enhance the test failure summary to list the tests that failed per backend. test/Makefile.am | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) commit 731e121c802a7b1c3429d1bde7a93bc471d70880 Author: Carl Worth Date: Fri Apr 4 19:00:28 2008 -0700 _cairo_pattern_get_extents: Fix to allow for expansion based on filter This fixes the filter-bilinear-extents test case and the related bug entry: bad clipping with EXTEND_NONE http://bugs.freedesktop.org/show_bug.cgi?id=15349 Though there are still differences in the PDF and PostScript backends, (primarily because we can't capture cairo's filter modes in those file formats). src/cairo-pattern.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) commit 04608952e2efb9bffaa131ab39780c3e1a7430ba Author: Carl Worth Date: Fri Apr 4 18:56:38 2008 -0700 Replace open-coded transformation with a call to _cairo_matrix_transform_bounding_box It's a wonderful feeiling to remove duplicate code. src/cairo-pattern.c | 61 ++++++++++++++++++++++---------------------------- 1 files changed, 27 insertions(+), 34 deletions(-) commit 89567f9278c002ac5e4e25ddccec88b1b1eea420 Author: Carl Worth Date: Fri Apr 4 18:28:23 2008 -0700 Add new filter-bilinear-extents test This test exercises code that computes the extents of a surface pattern with CAIRO_FILTER_BILINEAR, (where the filtering effectively increases the extents of the pattern). The original bug was reported by Owen Taylor here: bad clipping with EXTEND_NONE http://bugs.freedesktop.org/show_bug.cgi?id=15349 test/.gitignore | 1 + test/Makefile.am | 2 + test/filter-bilinear-extents-ref.png | Bin 0 -> 1340 bytes test/filter-bilinear-extents.c | 91 ++++++++++++++++++++++++++++++++++ 4 files changed, 94 insertions(+), 0 deletions(-) commit 80f7aa03b35921a96683a0442f885c4b8335f3d9 Author: Carl Worth Date: Fri Apr 4 11:29:47 2008 -0700 Enable buggy_repeat workaround for X.Org servers < 1.4 This covers the known-to-broken 1.3 servers such as appeared in Fedora 8. It also leaves the workaround off, (since it's a severe slowdown), for the known-to-be-working 1.4.99.901 server as appears in Fedora 9 Betas. src/cairo-xlib-display.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit 2c8ead12a64d0deff4dc9e32c60f2815fe7c4a63 Author: Chris Wilson Date: Fri Apr 4 17:46:54 2008 +0100 [xlib] Avoiding sending glyphs > XMaxRequestSize. XRenderAddGlyph() does not split its image data across multiple requests and so the glyph surface must be smaller than XMaxRequestSize or else the server will disconnect the client, causing "Fatal IO error 104". As this will require an extension to the XRender spec, we can work around the issue by using our fallbacks if we detect that the glyph will be too large for a single request. See bugs https://bugs.freedesktop.org/show_bug.cgi?id=4339 and http://bugs.freedesktop.org/show_bug.cgi?id=13266 for examples. src/cairo-xlib-surface.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit a4f94624b2f4a85bafbc2dc01b08788a7a88deba Author: Chris Wilson Date: Fri Apr 4 15:56:22 2008 +0100 [test] Add bilevel image test case. Add a simple test to exercise the embedding of an image with a bilevel alpha channel into a postscript level 3 document. test/.gitignore | 1 + test/Makefile.am | 2 + test/bilevel-image-ref.png | Bin 0 -> 131 bytes test/bilevel-image.c | 68 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 0 deletions(-) commit f72799a2520feb7ed04fd14e53db59fe697a58d1 Author: Chris Wilson Date: Fri Apr 4 14:15:58 2008 +0100 [configure.in] Add a link to the LTP homepage. If ./configure --enable-gcov fails due to a missing LTP package, then include a link to LTP homepage in the error message. configure.in | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) commit c0593d16c7f2ca9c1ba4d05b6cbf3cf9c2f0524b Author: Chris Wilson Date: Fri Apr 4 12:53:13 2008 +0100 [pdf] Copy the glyphs for use within an smask group. When constructing an smask group using PDF_SHOW_GLYPHS, we need a copy of the glyphs else they'll be freed be we use them (in _show_page()). src/cairo-pdf-surface.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit a74db7e7bc092533d244123ea2ae272edf3f5d8f Author: Chris Wilson Date: Fri Apr 4 12:34:40 2008 +0100 [test] Exercise "soft" masks. PDF has a concept of "soft" masks, for which it is able to construct a mask out of PDF drawing operations. These tests exercise constructing various masks using the high level drawing operations. test/.gitignore | 7 ++ test/Makefile.am | 14 +++++ test/smask-fill-ref.png | Bin 0 -> 1223 bytes test/smask-fill.c | 83 ++++++++++++++++++++++++++ test/smask-image-mask-ref.png | Bin 0 -> 643 bytes test/smask-image-mask.c | 92 +++++++++++++++++++++++++++++ test/smask-mask-ref.png | Bin 0 -> 2523 bytes test/smask-mask.c | 107 +++++++++++++++++++++++++++++++++ test/smask-paint-ref.png | Bin 0 -> 2639 bytes test/smask-paint.c | 90 ++++++++++++++++++++++++++++ test/smask-ref.png | Bin 0 -> 3587 bytes test/smask-stroke-ref.png | Bin 0 -> 1845 bytes test/smask-stroke.c | 83 ++++++++++++++++++++++++++ test/smask-text-ref.png | Bin 0 -> 1796 bytes test/smask-text.c | 92 +++++++++++++++++++++++++++++ test/smask.c | 130 +++++++++++++++++++++++++++++++++++++++++ 16 files changed, 698 insertions(+), 0 deletions(-) commit 2d42f5ac27494f2bfd75e7bba42fd36783e053eb Author: Adrian Johnson Date: Fri Apr 4 20:29:12 2008 +1030 TrueType: Fix buffer check bb76eb50 added some checks to ensure we do not read past the end of the buffer for the loaded glyph. However the checks assumed tt_composite_glyph_t has a fixed size. tt_composite_glyph_t has a variable size that depends on the values with the struct. src/cairo-truetype-subset.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit 7dbb2dec33bb91b3d89a8072283297025817d0c6 Author: Adrian Johnson Date: Fri Apr 4 19:48:55 2008 +1030 TrueType: Remove assert If the status is UNSUPPORTED we should let type1-fallback subset it. src/cairo-truetype-subset.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 6192001816053403b8e51fc2aa44cf6d0a9baece Author: Adrian Johnson Date: Fri Apr 4 19:26:00 2008 +1030 Add PS reference image for ft-show-glyphs-table test/Makefile.am | 1 + test/ft-show-glyphs-table-ps-ref.png | Bin 0 -> 5687 bytes 2 files changed, 1 insertions(+), 0 deletions(-) commit e50324d3cc66df83120f908845657382e0020868 Author: Adrian Johnson Date: Fri Apr 4 19:21:40 2008 +1030 PS: Fix emulation of 'Td' pdf operator src/cairo-ps-surface.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 759793cad1459c2b70daa6adb3deb7af5fe705aa Author: Chris Wilson Date: Fri Apr 4 09:43:32 2008 +0100 Add links to the font specifications. Add links to specifications for the Type1, CFF, and TrueType font file formats, provided by Adrian Johnson. src/cairo-cff-subset.c | 5 +++++ src/cairo-truetype-subset.c | 6 ++++++ src/cairo-type1-subset.c | 5 +++++ 3 files changed, 16 insertions(+), 0 deletions(-) commit 8a78760f15c29c72e6a945b2157fd214e8045e1e Author: Carl Worth Date: Thu Apr 3 17:12:14 2008 -0700 Add new ft-show-glyphs-table test to exercise recent glyph positioning bug fix Interestingly, this test case does demonstrate that cairo-pdf is fixed, (where without commit f6509933a4e0 the Y positions of the glyphs were inverted); however, cairo-ps is failing with this test, (all the glyphs are ending up on top of each other). test/.gitignore | 1 + test/Makefile.am | 2 + test/ft-show-glyphs-table-ref.png | Bin 0 -> 11439 bytes test/ft-show-glyphs-table.c | 116 +++++++++++++++++++++++++++++++++++++ 4 files changed, 119 insertions(+), 0 deletions(-) commit f6509933a4e0abde3b7bca861f65e433b7e8dcf0 Author: Adrian Johnson Date: Fri Apr 4 08:41:08 2008 +1030 PDF: Fix glyph positioning bug src/cairo-pdf-operators.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bb76eb508b2d97a4455393a12540ceb7427bc271 Author: Chris Wilson Date: Thu Apr 3 18:36:16 2008 +0100 [cairo-truetype-subset] Check reads are within valid data. Check cairo_truetype_font_remap_composite_glyph() does not read beyond the end of the buffer loaded for the glyf. src/cairo-truetype-subset.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit a5e2a2ad2d03c217b9b27c537ee6a945bdc98a44 Author: Chris Wilson Date: Thu Apr 3 18:24:00 2008 +0100 [cairo-truetype-subset] Prevent accesses beyond the end of the glyph array. Reject the font if we try to remap a composite glyph that exists outside the known set of glyphs. src/cairo-truetype-subset.c | 43 ++++++++++++++++++++++++++++++------------- 1 files changed, 30 insertions(+), 13 deletions(-) commit 13cdfed894d48b30e28296c3a27c8361bf5506fb Author: Chris Wilson Date: Thu Apr 3 17:43:37 2008 +0100 [cairo-truetype-subset] Perform a quick sanity check that glyf end >= begin. Check for a bogus glyf position and prevent an integer overflow. src/cairo-truetype-subset.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit cfff3c3bd04df5257176d9e43add52fc6daba329 Author: Chris Wilson Date: Thu Apr 3 17:23:48 2008 +0100 [cairo-array] Guard against integer overflow whilst growing the array. Sanity check the arguments to _cairo_array_grow_by() such that the array size does not overflow, similar to the defensive checking of parameters to malloc. src/cairo-array.c | 12 ++++++++---- src/cairoint.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) commit 6101dc3e93b20294c75734d7f29e55694ed58e74 Author: Chris Wilson Date: Thu Apr 3 14:53:17 2008 +0100 [cairo-pdf-surface] Do not bitswap big-endian A1 masks. Pixman stores the bits A1 surfaces in native byte order, PDF stores A1 masks in MSb - so only perform swapping for little-endian machines. Note this also removes the extraneous packing as per the PDF spec 4.8.2: "Byte boundaries are ignored, except that each row of sample data must begin on a byte boundary. If the number of data bits per row is not a multiple of 8, the end of the row is padded with extra bits to fill out the last byte." src/cairo-pdf-surface.c | 30 +++++++----------------------- 1 files changed, 7 insertions(+), 23 deletions(-) commit 7901eb29efb04e469f4bf94e2da6fd6b79b140b0 Author: Chris Wilson Date: Thu Apr 3 12:12:25 2008 +0100 [test] Add a1-mask. Add a variant of the a8-mask test case that exercises the FORMAT_A1 code paths instead. test/.gitignore | 1 + test/Makefile.am | 2 + test/a1-mask-ref.png | Bin 0 -> 131 bytes test/a1-mask.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 201 insertions(+), 0 deletions(-) commit 5aa5aeb1f56493cf7a6bafd22c6921d8415db64e Author: Chris Wilson Date: Thu Apr 3 12:09:03 2008 +0100 [cairo-font-face] Cleanup up the font_face on the error path. A missing _cairo_toy_font_face_fini() was leaking the strdup(family). src/cairo-font-face.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 048160d44c564b0265b2e740b13d6ed3b367661d Author: Chris Wilson Date: Thu Apr 3 12:11:44 2008 +0100 [.gitignore] Add test/stroke-image test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 9e749d0a287b8038d8a8524ed74626b2d3071538 Author: Vladimir Vukicevic Date: Wed Apr 2 23:37:24 2008 -0700 [cgfont] typo fix src/cairo-quartz-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3f9b1ceac78976f34a18b551eec376c07db40775 Author: Vladimir Vukicevic Date: Wed Apr 2 16:13:53 2008 -0700 [cgfont] Implement missing scaled font metrics src/cairo-quartz-font.c | 74 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 71 insertions(+), 3 deletions(-) commit eb3eb0252b13b3d2a3b6acfd13306ff3c6b0506e Author: Chris Wilson Date: Wed Apr 2 14:53:25 2008 +0100 [cairo-xlib-surface] Avoid writing to the error surface. Insert status checks during construction of temporary glyph surfaces to avoid potentially writing to the inert error object. src/cairo-xlib-surface.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit c1062bf20ab60f6335be0814de245616a8d24bd2 Author: Chris Wilson Date: Wed Apr 2 10:43:39 2008 +0100 [cairo-xlib-surface] Preserve Visuals for non-TrueColor similar surfaces. Previously, given a valid XRenderFormat the Visual was discarded when creating similar surfaces. However the original Visual is required to support reading back from non-TrueColor surfaces. src/cairo-xlib-surface.c | 32 ++++++++++++++++++++------------ 1 files changed, 20 insertions(+), 12 deletions(-) commit b3a70629f8d1f5d7c23f4369d3395af73318eb28 Author: Chris Wilson Date: Wed Apr 2 09:19:11 2008 +0100 [test/text-transform] Fix pattern leak. Add missing cairo_pattern_destroy. test/text-transform.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) commit 37c69c0d54c4b77c96497db4d6633558d4e1300d Author: Chris Wilson Date: Mon Mar 31 21:49:34 2008 +0100 [cairo-xlib] Handle malloc failures for cairo_xlib_visual_info_t. Tidy the error paths whilst handling visuals, in particular avoiding a couple of potential NULL deferences, missed status checks and fresh leaks. src/cairo-xlib-private.h | 15 +++++++++--- src/cairo-xlib-screen.c | 52 +++++++++++++++++++++++++++++++-------------- src/cairo-xlib-surface.c | 30 ++++++++++++++++++-------- src/cairo-xlib-visual.c | 19 +++++++++++++--- 4 files changed, 83 insertions(+), 33 deletions(-) commit 0cd42c25a6f4be1ff27ed3a9ba7fa9a91d076e0d Author: Chris Wilson Date: Mon Mar 31 19:15:48 2008 +0100 [cairo-svg-surface] Check surface status before extracting the svg target. We need to check and report the existent status, else we may try to modify the inert error object. src/cairo-svg-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 013bbda6373d84d39e080c5e0b305581a2c6919c Author: Chris Wilson Date: Mon Mar 31 19:15:16 2008 +0100 [cairo-ps-surface] Check surface status before extracting the ps target. We need to check and report the existent status, else we may try to modify the inert error object. src/cairo-ps-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit cebb1eef431a38c7c3a96ae60a5bee188f41dc0b Author: Chris Wilson Date: Mon Mar 31 19:09:21 2008 +0100 [cairo-svg-surface] Missing status check. Check and, if necessary, propagate the error status - do not allow the status to be overwritten, potentially masking the original error. src/cairo-svg-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 94db91b65ef42228c963f2d6d82da085f9148895 Author: Chris Wilson Date: Mon Mar 31 15:47:45 2008 +0100 [cairo-pdf-surface] Do not mask error during cleanup. Be careful to preserve the original error status whilst on the common cleanup path for _cairo_pdf_surface_emit_meta_surface(). src/cairo-pdf-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 3580b99a8f99db207b54529f5ac7d0e4325cc123 Author: Chris Wilson Date: Mon Mar 31 14:25:17 2008 +0100 [cairo-pdf-surface] Check surface status before extracting the pdf target. We need to check and report the existent status, else we may try to modify the inert error object. src/cairo-pdf-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 34d734365bdc1c02cf1880804ab15af48c8d03e1 Author: Chris Wilson Date: Mon Mar 31 11:27:10 2008 +0100 [cairo-svg-surface] Release acquired surface on error path. Ensure the surface returned from _cairo_pattern_acquire_surface() is released on the error path. src/cairo-svg-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit ba2e82d138eecb451c3d0bf53d9c349fb560f039 Author: Chris Wilson Date: Mon Mar 31 10:55:39 2008 +0100 [cairo-ps-surface] Check error status before potential illegal dereference. After acquiring the source image, check for the error status to ensure that we do not attempt to deference an invalid surface. src/cairo-ps-surface.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 767add1ee356660075aaf02283f62a23ef9bcb24 Author: Chris Wilson Date: Fri Mar 28 11:51:13 2008 +0000 [cairo-pdf-operators] Destroy stream on error. We cannot guarantee that a newly created error stream is a static error object, so we need to always destroy the stream on the error path. (One day this may change with the global pool of error objects...) src/cairo-pdf-operators.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 2f06284ad6154d1f5fac1a195edbcbc9ed3432cb Author: Carl Worth Date: Tue Apr 1 16:07:22 2008 -0700 Increment cairo version to 1.5.17 after 1.5.16 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5366c8f483dc7bd40b5d0a184c9b16826007c032 Author: Carl Worth Date: Tue Apr 1 15:52:41 2008 -0700 Increment version to 1.5.16 and library versioning to 19:0:17 configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit eb6721f4ccc6ac861e16ec21c7b420645c4f572b Author: Carl Worth Date: Tue Apr 1 15:51:57 2008 -0700 NEWS: Add notes for the cairo 1.5.16 snapshot NEWS | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 109 insertions(+), 0 deletions(-) commit 8707892b218cb79ef544ba396d4501827b900c32 Author: Carl Worth Date: Tue Apr 1 15:40:54 2008 -0700 Doc SGML template churn doc/public/tmpl/cairo-ft.sgml | 7 +++++++ doc/public/tmpl/cairo-xlib.sgml | 7 +++++++ 2 files changed, 14 insertions(+), 0 deletions(-) commit 5d0b2ede52eb6d05a7d5579e6bcd1d4d1850300c Author: Carl Worth Date: Tue Apr 1 15:24:48 2008 -0700 Mark cairo-quartz as officially supported An especial thanks to Vladimir Vukicevic and the Mozilla Foundation for a tremendous amount of work on cairo-quartz while it has been marked as "experimental" configure.in | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) commit 07130a9061b012bb5c206dc547b4cc0cc69dcbf1 Author: Carl Worth Date: Tue Apr 1 15:20:42 2008 -0700 Include cairoint.h first to satisfy the test suite Forgetting to include cairoint.h (or not including it first) can cause some subtle bugs due to specific feature flags not being set, etc. src/cairo-quartz-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 46ea00d829bc50ab5316d2257e0d1ed1d8e3f4b6 Author: Carl Worth Date: Tue Apr 1 14:53:55 2008 -0700 More quieting of subtle potentially-uninitialized warnings The compiler isn't clever enough to notice that these variables are always initialized (in either the TrueColor or ! TrueColor conditions corresponding to the later identical conditions in which the variables are used). src/cairo-xlib-surface.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 1489e66d250c070c46cb42a1db9ea9f447f464b9 Author: Carl Worth Date: Tue Apr 1 14:49:03 2008 -0700 Quiet a more subtle potentially-uninitialized warning The compiler isn't clever enough to notice that these variables are always initialized. src/cairo-rectangle.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit afc6e3b69dcadc63b1dd26a6d67a7da20d7397fe Author: Carl Worth Date: Tue Apr 1 14:40:18 2008 -0700 Quiet some trivial unused and potentially-uninitialized compiler warnings src/cairo-gstate.c | 2 +- src/cairo-hull.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-xlib-visual.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) commit d09b0394d59b50ffd3ea8e58f9f57ea4717de754 Author: Carl Worth Date: Mon Mar 31 16:50:24 2008 -0700 Add some reference images that were missing from the distribution list test/Makefile.am | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit 56800e6ea0f7153e44f0cba14c89c4239067a60e Author: Vladimir Vukicevic Date: Tue Apr 1 13:28:03 2008 -0700 [quartz] Remove cairo-atsui-font.c src/cairo-atsui-font.c | 1028 ------------------------------------------------ 1 files changed, 0 insertions(+), 1028 deletions(-) commit 8ddae11b544c35057a96ca0bdea34b4f473ee261 Author: Vladimir Vukicevic Date: Tue Apr 1 13:26:00 2008 -0700 [quartz] Update documentation doc/public/tmpl/cairo-ft.sgml | 8 -------- doc/public/tmpl/cairo-quartz-fonts.sgml | 25 +++++++++++++++++++++++++ doc/public/tmpl/cairo-quartz.sgml | 25 +++++++------------------ doc/public/tmpl/cairo-xlib.sgml | 8 -------- src/cairo-quartz-font.c | 14 ++++++++++++-- src/cairo-quartz-surface.c | 18 ++++++++---------- 6 files changed, 52 insertions(+), 46 deletions(-) commit 9a7162cfdf48f47bb8ee0a7c24c55c061e4fbc90 Author: Vladimir Vukicevic Date: Tue Apr 1 13:17:14 2008 -0700 [doc] Add some Quartz/CGFont documentation templates doc/public/cairo-docs.xml | 1 + doc/public/cairo-sections.txt | 14 ++++++++++++++ doc/public/tmpl/cairo-quartz-fonts.sgml | 23 +++++++++++++++++++++++ 3 files changed, 38 insertions(+), 0 deletions(-) commit 56cabc352e44ee7cb2989dd81688f6c37c33fc21 Author: Vladimir Vukicevic Date: Tue Apr 1 13:01:41 2008 -0700 [quartz] Update Quartz test reference images test/Makefile.am | 3 +++ test/clip-operator-quartz-ref.png | Bin 9364 -> 9539 bytes test/clip-operator-quartz-rgb24-ref.png | Bin 4359 -> 4412 bytes test/font-matrix-translation-quartz-ref.png | Bin 1041 -> 1090 bytes test/glyph-cache-pressure-quartz-ref.png | Bin 3491 -> 3654 bytes test/linear-gradient-reflect-quartz-ref.png | Bin 0 -> 878 bytes test/operator-clear-quartz-ref.png | Bin 1368 -> 1459 bytes test/operator-clear-quartz-rgb24-ref.png | Bin 1201 -> 1293 bytes test/operator-source-quartz-ref.png | Bin 4572 -> 4637 bytes test/operator-source-quartz-rgb24-ref.png | Bin 3452 -> 3533 bytes test/select-font-face-quartz-ref.png | Bin 2958 -> 2970 bytes test/show-text-current-point-quartz-ref.png | Bin 3198 -> 3093 bytes test/surface-pattern-scale-down-quartz-ref.png | Bin 0 -> 3188 bytes test/text-antialias-gray-quartz-ref.png | Bin 1039 -> 1041 bytes test/text-antialias-none-quartz-ref.png | Bin 304 -> 300 bytes test/text-antialias-subpixel-quartz-ref.png | Bin 1100 -> 1065 bytes test/text-pattern-quartz-ref.png | Bin 0 -> 2158 bytes test/text-pattern-quartz-rgb24-ref.png | Bin 1867 -> 1874 bytes test/text-rotate-quartz-ref.png | Bin 17405 -> 17820 bytes test/unbounded-operator-quartz-ref.png | Bin 4325 -> 4066 bytes test/unbounded-operator-quartz-rgb24-ref.png | Bin 1972 -> 1918 bytes 21 files changed, 3 insertions(+), 0 deletions(-) commit 94b67d13f38d860f1a768f9a088e3b6f5d188f7b Author: Vladimir Vukicevic Date: Tue Apr 1 12:44:32 2008 -0700 [quartz] Handle further 10.4 vs. 10.5 differences; fix text AA handling src/cairo-quartz-surface.c | 74 +++++++++++++++++++++++++------------------ 1 files changed, 43 insertions(+), 31 deletions(-) commit a1d1be4234f7787c078ff096b4101e300494e7d1 Author: Vladimir Vukicevic Date: Thu Mar 27 23:46:53 2008 -0700 [cgfont] Round surface rectangle outwards to ensure whole-pixel dimensions src/cairo-quartz-font.c | 60 +++++++++++++++++++++++++++++++++++++--------- 1 files changed, 48 insertions(+), 12 deletions(-) commit c064ad1b56d11950786a3fd0363e543f5aec1761 Author: Vladimir Vukicevic Date: Thu Mar 27 11:42:53 2008 -0700 [cgfont] Fix whitespace errors src/cairo-quartz-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 2be3e67db24ac34f772b5fc1182dfb9b730dce11 Author: Vladimir Vukicevic Date: Tue Mar 25 22:44:39 2008 -0700 [cgfont] Add CGFont backend to replace deprecated ATSUI backend Create a new font backend that uses the CGFont API on MacOS X 10.4 and beyond. src/cairo-quartz-font.c | 124 ++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 107 insertions(+), 17 deletions(-) commit 30f7fae6475c36549badf1fcc11ae39d1d79b532 Author: Vladimir Vukicevic Date: Thu Mar 20 13:24:48 2008 -0700 [cgfont] Add start of CGFont font backend to replace ATSUI configure.in | 10 +- src/Makefile.am | 3 +- src/cairo-atsui-font.c | 2 +- src/cairo-quartz-font.c | 590 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-quartz-private.h | 5 + src/cairo-quartz-surface.c | 1 - src/cairo-quartz.h | 5 +- src/cairoint.h | 4 +- 8 files changed, 611 insertions(+), 9 deletions(-) commit 9e6d6798700cf629abbd921cf744babeb49215a1 Author: Emmanuel Pacaud Date: Tue Apr 1 16:48:04 2008 +0200 [SVG] Fix stroke-image test failure. The pattern transform inherit the object transform matrix, and that was not taken into account. src/cairo-svg-surface.c | 96 +++++++++++++++++++++++++++++----------------- 1 files changed, 60 insertions(+), 36 deletions(-) commit a571cc56a3e708e37fe112212fbd41ae9071a16b Author: Carl Worth Date: Mon Mar 31 12:17:39 2008 -0700 Update pixman dependency to recent 0.10.0 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e9adba9a57177a1b5755734db25d08513a30c0b7 Author: Carl Worth Date: Mon Mar 31 12:15:06 2008 -0700 Update ps-specifc reference image for ft-text-vertical-layout-type1 Presumably this minor change happened due to a recent fix in cairo-ps glyph positioning. test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1911 -> 1910 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit a30ed53a1ce37f68f2ee8abf0f631bcc180e0e57 Author: Adrian Johnson Date: Sun Mar 30 00:13:35 2008 +1030 Add stroke-image PS/PDF ref images test/stroke-image-pdf-ref.png | Bin 0 -> 1554 bytes test/stroke-image-ps-ref.png | Bin 0 -> 1786 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit a729f27f3c5770277d691257d2355ffb97e3172f Author: Adrian Johnson Date: Sun Mar 30 00:07:05 2008 +1030 Add clip-operator PS/PDF rgb24 ref images test/clip-operator-pdf-rgb24-ref.png | Bin 0 -> 6530 bytes test/clip-operator-ps-rgb24-ref.png | Bin 0 -> 4620 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 9058b9260acce8839263fccf451a982bcb1c54f3 Author: Adrian Johnson Date: Sat Mar 29 23:49:51 2008 +1030 Add operator-source PDF ref images Required due to gradient rendering differences between poppler and cairo. test/operator-source-pdf-argb32-ref.png | Bin 0 -> 4694 bytes test/operator-source-pdf-rgb24-ref.png | Bin 0 -> 3848 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 47981226db1650799ddb5efba01df2564aa1a3b5 Author: Adrian Johnson Date: Sat Mar 29 23:45:31 2008 +1030 Fix PDF analysis of OPERATOR_SOURCE surface patterns src/cairo-pdf-surface.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 53d1a4b0dcb3a1fa62face9d2b5b086d74b6e397 Author: Adrian Johnson Date: Sat Mar 29 23:03:02 2008 +1030 Update operator-source PS ref images test/operator-source-ps-argb32-ref.png | Bin 3893 -> 3890 bytes test/operator-source-ps-rgb24-ref.png | Bin 3241 -> 3181 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit b3b3e3810d6ea9e75d5accd8e0d2ad00f664b4a5 Author: Adrian Johnson Date: Sat Mar 29 19:14:18 2008 +1030 PS: Clear pattern background to when using OPERATOR_SOURCE Set pattern background to white if surface content is COLOR_ALPHA or black if surface content is COLOR when operator is SOURCE. src/cairo-ps-surface.c | 43 +++++++++++++++++++++++++++---------------- 1 files changed, 27 insertions(+), 16 deletions(-) commit 5b8b3a9765d292d554b50df0981652d3bb4ec56f Author: Adrian Johnson Date: Sat Mar 29 01:07:30 2008 +1030 PS/PDF: Save/Restore surface clip when emitting a meta-surface pattern src/cairo-pdf-surface.c | 6 ++++++ src/cairo-ps-surface.c | 6 ++++++ src/cairo-surface.c | 6 ++++++ src/cairoint.h | 3 +++ 4 files changed, 21 insertions(+), 0 deletions(-) commit e4fd9b4ea2e8cc378471c4f536236faa73467977 Author: Adrian Johnson Date: Thu Mar 27 09:06:11 2008 +1030 Bump poppler version required for testing to 0.8.0 The poppler specific reference images are created from the latest version of poppler in git. The main reason has been for support for knockout groups that had not yet been available in a stable release. Poppler 0.8.0 is the first stable release to include the support for knockout groups. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit af8928fa8bb8905515f36b4ddc51e665b4b8da56 Author: Carl Worth Date: Wed Mar 26 14:21:58 2008 -0700 Add svg-specific reference image for ft-show-glyphs-positioning test There was no failure here, just minor rasterization differences. test/ft-show-glyphs-positioning-svg-ref.png | Bin 0 -> 6590 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit fbab4bbb06d875313e9cd0dc38673b79b8460edb Author: Carl Worth Date: Wed Mar 26 13:47:06 2008 -0700 Update clip-operator and operator-clear reference images There were legitimate bugs in the ps and pdf backends for these tests, (particularly with the row of glyphs), but these bugs were recently fixed with: commit d89edde84de9cec9ce6f76f4f2c44dd9c1220528 Author: Vladimir Vukicevic Date: Tue Mar 4 00:15:46 2008 -0800 [meta] always copy glyph array before passing to _cairo_surface_show_glyphs and we just failed to notice the fix at the time. test/clip-operator-pdf-argb32-ref.png | Bin 11005 -> 11429 bytes test/clip-operator-ps-argb32-ref.png | Bin 9084 -> 9102 bytes test/operator-clear-ps-argb32-ref.png | Bin 1400 -> 1435 bytes 3 files changed, 0 insertions(+), 0 deletions(-) commit 75972167a277687b1434c52e791ffe9c18fa2a7a Author: Carl Worth Date: Wed Mar 26 11:31:04 2008 -0700 Use floating-point offsets for color stops Previously we were using the cairo_fixed_t type which meant we've historically only been using 16 bits of precision for these offsets, and recently only 8 bits. Meanwhile, all manipulatons of offsets have been in floating-point anyway, so we might as well store them that way. This change also prevents a rendering regression introduced with the 24.8->16.16 change betwen snapshots 1.5.10 and 1.5.12 . This change affected gradient-rendering details for the clip-operator and operator-source tests, so the corresponding reference images are updated here. src/cairo-glitz-surface.c | 2 +- src/cairo-pattern.c | 10 ++++------ src/cairo-pdf-surface.c | 6 +++--- src/cairo-ps-surface.c | 6 +++--- src/cairo-quartz-surface.c | 6 +++--- src/cairo-svg-surface.c | 31 ++++++++++++++----------------- src/cairo-win32-printing-surface.c | 2 +- src/cairoint.h | 2 +- test/clip-operator-ref.png | Bin 8263 -> 8271 bytes test/operator-source-ref.png | Bin 4422 -> 4420 bytes 10 files changed, 30 insertions(+), 35 deletions(-) commit 80dc1714c87c3902e70fa94e4911945986cc7920 Author: Carl Worth Date: Wed Mar 26 10:31:36 2008 -0700 Remove unused variable src/cairo-image-surface.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit f676f18050383ecf26c36cdbba4ac81d2d45b042 Author: Chris Wilson Date: Wed Mar 26 08:43:23 2008 +0000 [cairo] Fixup make check. make check demands that all function references in the docs are suffixed with (). src/cairo.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 452a1de2a06b57a3ed1b149e152487505dbc04f8 Author: Chris Wilson Date: Tue Mar 25 16:50:33 2008 +0000 [cairo-gstate] Remove dead code. Eliminate _cairo_gstate_recursive_apply_clip_path, as its last caller was removed over 2 years ago. src/cairo-gstate.c | 21 --------------------- 1 files changed, 0 insertions(+), 21 deletions(-) commit ed42916028e4f51949210de6ecf4ebc5095aa45c Author: Adrian Johnson Date: Wed Mar 26 23:04:35 2008 +1030 Win32: Fix bug in cairo_win32_font_face_create_for_hfont() Use GetObjectW for LOGFONTW. src/cairo-win32-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6dc75ab0f8370154aae7719ed805c5a8bdf1c9f4 Author: Carl Worth Date: Tue Mar 25 10:21:50 2008 -0700 Quiet compiler warnings about unhandled PIXMAN_yuy2 and PIXMAN_yv12 We still don't handle these format codes of course, (they're meaningless for the context in which they're used here). Note that we previously avoided adding these to avoid people being forced to upgrade pixman just to get two enum values that cairo doesn't really care about. But now we're depending on a new pixman anyway, (for the pixman_format_code_to_masks function), so we'll go ahead and do this now. src/cairo-image-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 1675713aff7311461e26d7badccb9942573f2bca Author: Carl Worth Date: Tue Mar 25 16:45:21 2008 -0700 Depend on pixman 0.9.7 for new pixman_format_supported_destination function This allows us to do a much more general and complete implementation of _pixman_format_from_masks and _pixman_format_to_masks so that we'll even pick up new pixman formats as they get added. configure.in | 2 +- src/cairo-image-surface.c | 200 +++++++++++++++++++-------------------------- 2 files changed, 86 insertions(+), 116 deletions(-) commit d7e5f6b6a00912e22cb5ca837d0a56d30cf59124 Author: Carl Worth Date: Tue Mar 25 16:32:24 2008 -0700 Rename _popcount to _cairo_popcount and make it available for internal use Both cairo-image-surface.c and cairo-xlib-surface.c want to use this function now. src/cairo-xlib-surface.c | 25 ++----------------------- src/cairoint.h | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+), 23 deletions(-) commit 90cf7c2faf167b4b86443eb340af23cf853b146a Author: Carl Worth Date: Tue Mar 25 10:40:01 2008 -0700 Quiet warning about signed vs. unsigned comparison src/cairo-surface-fallback.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 770633c05acf12b911cdbdaa94b20ccf34ce742a Author: Carl Worth Date: Tue Mar 25 10:27:36 2008 -0700 Quiet warnings about unhandled enum values in _cairo_surface_create_in_error src/cairo-surface.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit d15c7c94bdfc714845bd88f9e3ed5317afcfce72 Author: Carl Worth Date: Tue Mar 25 12:12:40 2008 -0700 Document performance advantage of cairo_path_extents The cairo_path_extents function can perform better than either cairo_stroke_extents or cairo_fill_extents, so provide that pointer from the documentation of the other two functions. src/cairo.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) commit 8aba5b802946530ef481f1461f9894529498cd8a Author: Vladimir Vukicevic Date: Tue Mar 25 11:53:52 2008 -0700 [win32] Prevent crash in create_similar if win32_surface_create fails src/cairo-win32-surface.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 49a140b04bda85c03f824dcf565f1fcdd70b8965 Author: Vladimir Vukicevic Date: Tue Mar 25 11:22:43 2008 -0700 [osx] additional fix to configure for multi-arch OSX builds configure.in | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit ae143d779ba5765f55754cb89af87b065d84ef04 Author: Vladimir Vukicevic Date: Tue Mar 25 11:17:57 2008 -0700 [quartz] When stroking with an image source, use the right CTM for the image Since the CTM was modified for the stroke transform, we need to reset it before calling ConcatCTM for the source transform. src/cairo-quartz-surface.c | 9 ++++- test/Makefile.am | 3 + test/stroke-image-quartz-ref.png | Bin 0 -> 1802 bytes test/stroke-image-ref.png | Bin 0 -> 1866 bytes test/stroke-image.c | 77 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 1 deletions(-) commit e9906ae2021904c8c3d3a4083786475c102196f7 Author: Adrian Johnson Date: Tue Mar 25 21:56:19 2008 +1030 Win32-Printing: Fix fallback resolution when DC ctm is not identity And also move the _cairo_surface_set_resolution() into _cairo_win32_printing_surface_start_page as the DC ctm may be changed between pages. This bug was found in Inkscape now that they are using the cairo win32-printing surface for printing on Windows. src/cairo-win32-printing-surface.c | 19 ++++++++++++++----- 1 files changed, 14 insertions(+), 5 deletions(-) commit ee3981fb92ee5fa9b049dae32421cc0015fd4bf6 Author: Carl Worth Date: Mon Mar 24 16:24:36 2008 -0700 Add new text-transform test Previously, the test suite wasn't supplying any coverage of transformed text rendering. test/.gitignore | 1 + test/Makefile.am | 1 + test/README | 1 + test/text-transform-pdf-ref.png | Bin 0 -> 3796 bytes test/text-transform-ps-ref.png | Bin 0 -> 4154 bytes test/text-transform-ref.png | Bin 0 -> 6200 bytes test/text-transform.c | 113 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 116 insertions(+), 0 deletions(-) commit 184d9cbf9c8967b741209b9d891848c9bd37dd60 Author: Adrian Johnson Date: Mon Mar 24 12:36:37 2008 +1030 Update REFERENCE_IMAGES with PS ref images for finer finer-grained-fallbacks. test/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2ad39157975d71735da936977dd10e66d055ece7 Author: Adrian Johnson Date: Mon Mar 24 12:32:07 2008 +1030 Add PS reference images for finer-grained-fallbacks test test/finer-grained-fallbacks-ps-argb32-ref.png | Bin 0 -> 1047 bytes test/finer-grained-fallbacks-ps-rgb24-ref.png | Bin 0 -> 819 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit ae9635bf33cb989f5c525800b82b81daad699e01 Author: Adrian Johnson Date: Mon Mar 24 12:16:20 2008 +1030 Fix assertion in PS/PDF/Win32-print when fallback image is off the page If during analysis the bounding box of an operation or the number of traps is 0, the operation is marked as natively supported. The problem here is if the operation is unsupported by the backend, we get an assertion when the operation is replayed during CAIRO_PAGINATED_MODE_RENDER. This bug was found in Inkscape when printing to the win32_printing_surface a page that has been layed out as landscape but landscape paper had not been selected in the print dialog. Fix this by being careful not to mark unsupported operations as supported during analysis even they may not be visible on the page. src/cairo-analysis-surface.c | 73 +++++++++++++++++++++++++++++++---------- 1 files changed, 55 insertions(+), 18 deletions(-) commit 179ab7d2860b8ff94fe491896c50505fde7cf6af Author: Adrian Johnson Date: Mon Mar 24 11:43:29 2008 +1030 Add finer-grained-fallbacks test This reproduces the bug in PS/PDF/Win32-printing where an unsupported operation that is off the page causes an unsupported operation assertion in the backend. test/.gitignore | 1 + test/Makefile.am | 3 + test/finer-grained-fallbacks-ref.png | Bin 0 -> 796 bytes test/finer-grained-fallbacks-rgb24-ref.png | Bin 0 -> 590 bytes test/finer-grained-fallbacks.c | 111 ++++++++++++++++++++++++++++ 5 files changed, 115 insertions(+), 0 deletions(-) commit 9a1f7bbc357ecce351b459f883b4ebeaa6640b65 Author: Benjamin Otte Date: Sun Mar 23 15:31:24 2008 +0100 [API] unbreak CAIRO_FONT_TYPE_ATSUI commit 9d61f7db8082baf3a223c4ea41a53de372676e40 broke API by making the CAIRO_FONT_TYPE_ATSUI symbol not work anymore. However, this symbol was part of Cairo's public API and should continue working this way. src/cairo-deprecated.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 104c2825ea66d7d5f405cc8d690d90b45e752c46 Author: Chris Wilson Date: Fri Mar 21 09:11:48 2008 +0000 [cairo-png] Set bKGD gray value. For PNG_COLOR_TYPE_GRAY images the bKGD value is read from white.gray which was uninitialized, triggering the "PNG warning = Ignoring attempt to write bKGD chunk out-of-range for bit_depth" reported by Emmanuel Pacaud. This patch sets the background gray value to white, the same as for RGB images. src/cairo-png.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) commit c4599324820cfb46700bf2f059c46e9245f98ea5 Author: Adrian Johnson Date: Fri Mar 21 18:12:03 2008 +1030 Update PS reference images Some of the text tests require new PS specific reference images as a result of the PS glyph positioning fix. test/font-matrix-translation-ps-argb32-ref.png | Bin 749 -> 748 bytes test/font-matrix-translation-ps-rgb24-ref.png | Bin 749 -> 748 bytes test/glyph-cache-pressure-ps-ref.png | Bin 1413 -> 1454 bytes test/select-font-face-ps-ref.png | Bin 1079 -> 959 bytes test/show-text-current-point-ps-ref.png | Bin 1454 -> 1356 bytes test/text-pattern-ps-argb32-ref.png | Bin 984 -> 966 bytes test/text-pattern-ps-rgb24-ref.png | Bin 936 -> 924 bytes 7 files changed, 0 insertions(+), 0 deletions(-) commit f3a5f7570104c8d48c99a2b6bd34f4142e52f099 Author: Adrian Johnson Date: Fri Mar 21 16:34:01 2008 +1030 Add PS/PDF ref images for ft-show-glyphs-positioning test/Makefile.am | 2 ++ test/ft-show-glyphs-positioning-pdf-ref.png | Bin 0 -> 3114 bytes test/ft-show-glyphs-positioning-ps-ref.png | Bin 0 -> 2269 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit 4f56a6324f16fa58c21180cc362ee18520a59179 Author: Adrian Johnson Date: Fri Mar 21 16:30:53 2008 +1030 Finish the PDF text operator decimal reduction commit Commit 158b32b60bc7e0f6488383c1d4f83203ffe97c98 reduced excess decimals emitted for the TJ operator. However it only fixed the first of the two locations in pdf-operators where the TJ position adjustments are emitted. src/cairo-pdf-operators.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 13e05bffd5cae5690fada24c7a7e2457c39e4dbf Author: Adrian Johnson Date: Fri Mar 21 15:41:31 2008 +1030 Fix PS glyph positioning bug in PDF operator emulation The emulation of the PDF 'TJ' operator in the PS prolog was incorrectly updating the glyph position between strings. The glyph position values are a negative x offset that are in 1/1000 unit of text space. We were incorrectly multiplying the number by -0.0001 instead of -0.001. We also need to transform this to device space before calling rmoveto. src/cairo-ps-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 83486684520f3fd27d1118aa23462d013def83df Author: Adrian Johnson Date: Fri Mar 21 16:06:12 2008 +1030 Add ft-show-glyphs-positioning test This demonstrates the glyph positioning bug in the PS backend. test/.gitignore | 1 + test/Makefile.am | 2 + test/ft-show-glyphs-positioning-ref.png | Bin 0 -> 3444 bytes test/ft-show-glyphs-positioning.c | 167 +++++++++++++++++++++++++++++++ 4 files changed, 170 insertions(+), 0 deletions(-) commit 37fedd108e3defc10f2f749a3a9971287e41706c Author: Carl Worth Date: Thu Mar 20 17:02:01 2008 -0700 Increment cairo version to 1.5.15 after the 1.5.14 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f4d4d7b3d0bd62af6ffd50ba9cd8df0b9a12be71 Author: Carl Worth Date: Thu Mar 20 16:13:28 2008 -0700 Cleanup up png-test.png file in 'make clean' test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 4ad5937648b27cd7a73a6a245ed875de92fa1c07 Author: Carl Worth Date: Thu Mar 20 15:55:28 2008 -0700 Enable PLT avoidance for cairo_image_surface_get_data/stride src/cairo-image-surface.c | 2 ++ src/cairoint.h | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) commit 5d9eefccd6ff4d51e16caa8f3092d3acc33b5549 Author: Carl Worth Date: Thu Mar 20 15:37:04 2008 -0700 Disable enum_regexp test in check-doc-syntax.h It's returning false positives on non-gtk-doc comments with non-public enum values. Ick. src/check-doc-syntax.sh | 29 +++++++++++++++++++---------- 1 files changed, 19 insertions(+), 10 deletions(-) commit 0c17ca52aa63a9c77cff47c4ae42bc16e5220552 Author: Carl Worth Date: Thu Mar 20 15:33:37 2008 -0700 Mark new cairo_xlib_visual_info functions as private. src/cairo-xlib-private.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f32f81fa1badce15403d922002f4fc59fe8b563a Author: Carl Worth Date: Thu Mar 20 13:49:29 2008 -0700 Increment cairo version to 1.5.14 and libtool versioning to 18:1:16 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ffa50c31d38c761b4bf247d3ac27933974b819d3 Author: Carl Worth Date: Thu Mar 20 13:49:19 2008 -0700 Doc template churn doc/public/tmpl/cairo-font-face.sgml | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3bb0474ea7d453793199d3ce7674fbe1ee8a324d Author: Carl Worth Date: Thu Mar 20 13:48:29 2008 -0700 NEWS: Add notes for 1.5.14 snapshot NEWS | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 128 insertions(+), 1 deletions(-) commit 191440101e815fe9be23bb6fbb36114de65d8c2d Author: Carl Worth Date: Thu Mar 20 12:33:17 2008 -0700 Fix the REFERENCE_IMAGES list, (like always before a snapshot) test/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 46bbead898186349094ae69d2b16f88b80cb820e Author: Carl Worth Date: Thu Mar 20 12:18:39 2008 -0700 RELEASING: Clarify steps for verifying no unpushed modifications RELEASING | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit c91a2a2e80f2172a4174cfc3b5e821cb49633da5 Author: Carl Worth Date: Thu Mar 20 11:51:31 2008 -0700 Track minor change in pixman filtering sample location This change in reference image was triggered by the following commit in the pixman library: commit f2d8a5caa63596739b4dc47c00daaaafd9f522e2 Author: Søren Sandmann Date: Mon Mar 10 23:41:52 2008 -0400 Add rounding epsilon for NEAREST filter after transformation, not before. This hasn't appeared in a pixman release yet. So for now, getting correct results is a matter of "use latest pixman". Soon we'll have a new pixman release and we'll make cairo depend on that. test/rotate-image-surface-paint-ref.png | Bin 209 -> 232 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit e96f382549eb3411d461162fdd8989f4ade8b448 Author: Carl Worth Date: Wed Mar 19 13:00:47 2008 -0700 Add support for 8-bit PseudoColor visuals This support involves allocating a 16-bit grayscale ramp as well as a 5x5x5 RGB color cube. Afterwards, the 256 colors are queried and an array is generated mapping from r3g3b3 colors to the closest available color. Both the queried colors and the reverse mapping are stored in a new visual-specific cairo_xlib_visual_info_t structure which hangs off of the cairo_xlib_screen_info_t. Both the color-cube allocation and the distance metric could be improved by someone sufficiently motivated, (for example, allocating and matching in a perceptually linear color space rather than just in RGB space). Also, making this work well in the face of a changing color map, or in the case of GrayScale, StaticGray, or DirectColor visuals are left entirely as exercises for the reader. StaticColor support should be fine as is, but is entirely untested. src/Makefile.am | 1 + src/cairo-xlib-private.h | 15 +++++ src/cairo-xlib-screen.c | 49 ++++++++++++++++ src/cairo-xlib-surface.c | 122 +++++++++++++++++++++++++--------------- src/cairo-xlib-visual.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 278 insertions(+), 46 deletions(-) commit d413c5ab21efb2ccc6a4847ff387f8e39ba2f3e1 Author: Carl Worth Date: Wed Mar 19 14:23:35 2008 -0700 xlib: Add support for arbitrary TrueColor visuals This fixes the following bugs: cairo doesn't support 8-bit truecolor visuals https://bugs.freedesktop.org/show_bug.cgi?id=7735 cairo doesn't support 655 xlib format https://bugs.freedesktop.org/show_bug.cgi?id=9719 src/cairo-xlib-surface-private.h | 5 + src/cairo-xlib-surface.c | 342 ++++++++++++++++++++++++++++++-------- 2 files changed, 276 insertions(+), 71 deletions(-) commit aeaec94fd03b9098efce9d7455f813acf22ec026 Author: Emmanuel Pacaud Date: Thu Mar 20 16:05:34 2008 +0100 [SVG] Replace the color property by stroke. Color property doesn't support URL as value. This pacth fixes http://bugs.freedesktop.org/show_bug.cgi?id=14556 . src/cairo-svg-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 158b32b60bc7e0f6488383c1d4f83203ffe97c98 Author: Adrian Johnson Date: Tue Mar 18 22:29:59 2008 +1030 PDF: Reduce excess decimals in text position offsets The numbers output in the TJ array for adjusting the horizontal position of the next glyph are in 1/1000 of the text space units. Rounding these numbers to an integer should still provide sufficient precision. We use the rounded numbers to update the text position in pdf-operators so subsequent numbers in the TJ array will compensate for the rounding error. src/cairo-pdf-operators.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-) commit 222041530cd5d7f1ef6b41ea1738bf395ef1678a Author: Adrian Johnson Date: Tue Mar 18 22:28:37 2008 +1030 Use %g for printing path coordinates in pdf-operators to eliminate unnecessary decimal places in the output. src/cairo-pdf-operators.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit d78013470b11677df88f246d893c1f019f4ae228 Author: Adrian Johnson Date: Tue Mar 18 22:27:25 2008 +1030 Add %g conversion specifer to output-stream for limited precision The %g conversion specifier is for printing numbers that were at some time stored in a cairo_fixed_t type and as a result have their precision limited by the size of CAIRO_FIXED_FRAC_BITS. Using %g will limit the number of digits after the decimal point to the minimum required to preserve the available precision. src/cairo-output-stream.c | 87 +++++++++++++++++++++++++++++---------------- 1 files changed, 56 insertions(+), 31 deletions(-) commit f3734085a1d1d9b08004a243e28a0233f621847c Author: Adrian Johnson Date: Tue Mar 18 22:25:46 2008 +1030 Make _cairo_dtostr() static It is only used in cairo-output-stream.c src/cairo-output-stream-private.h | 3 --- src/cairo-output-stream.c | 2 +- 2 files changed, 1 insertions(+), 4 deletions(-) commit 4d9e5b51aa4164cf758c6a1f84c7f831becc098b Author: Adrian Johnson Date: Tue Mar 18 22:25:18 2008 +1030 Rescale CTM used for PS/PDF stroking to reduce rounding error The PS/PDF CTM is transformed to the user space CTM when emitting paths to be stroked to ensure the correct pen shape used. However this can result in rounding errors. For example the device space point (1.234, 3.142) when transformed to a user space CTM of [100 0 0 100 0 0] will be emitted as (0.012, 0.031). Fix this by rescaling the user space CTM so that the path coordinates emitted to the PDF file stay within the range the maximizes the precision. The line width and dashing is also rescaled to be the same size in the rescaled CTM. src/cairo-pdf-operators.c | 70 ++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 63 insertions(+), 7 deletions(-) commit 7f4b967c020042779748021fa32fddfc3f0def28 Author: Carl Worth Date: Fri Mar 14 16:51:24 2008 +0100 Make CAIRO_FORMAT_STRIDE_FOR_WIDTH_BPP available to the cairo internals. src/cairo-image-surface.c | 7 ++----- src/cairoint.h | 5 +++++ 2 files changed, 7 insertions(+), 5 deletions(-) commit eb31c52febd615a92ef0c7204f9fa056ef01b536 Author: Carl Worth Date: Fri Mar 14 16:48:41 2008 +0100 Make _pixman_format_to_masks accept a cairo_format_masks_t structure This makes it work similarly to _pixman_format_from_masks src/cairo-image-surface.c | 48 ++++++++++++++++++++------------------------ src/cairo-xlib-surface.c | 12 +++++----- src/cairoint.h | 5 +--- 3 files changed, 29 insertions(+), 36 deletions(-) commit cdb1ae97f241ec6b24d64b0fa5447d26f6bc5318 Author: Carl Worth Date: Sun Jan 27 10:31:58 2008 -0800 Move assertion failure for unsupported masks up one level We're moving the assertion up from inside _pixman_format_to_mask to its callers. This will allow us to selectively eliminate the assertion from the supported xlib backend, while leaving it in the unsupported glitz and xcb backends for now. src/cairo-image-surface.c | 62 ++++++++++++++++++++++++++------------------ src/cairo-xlib-surface.c | 20 +++++++++++++- src/cairoint.h | 5 ++- 3 files changed, 58 insertions(+), 29 deletions(-) commit b83b8c26f5d64fa07b56a747dec681c6626a0297 Author: Adrian Johnson Date: Mon Mar 17 23:38:34 2008 +1030 Optimize generated PostScript when EXTEND_PAD is used Allow image patterns with EXTEND_PAD to use the currentfile optimization. src/cairo-ps-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 1ab804891bb71fd742ccc7a228483c53aee282a4 Author: Vladimir Vukicevic Date: Mon Mar 17 17:37:24 2008 -0700 [quartz] Additional test reference images for quartz test/Makefile.am | 10 ++++++++++ test/clip-operator-quartz-ref.png | Bin 0 -> 9364 bytes test/clip-operator-quartz-rgb24-ref.png | Bin 0 -> 4359 bytes test/dash-curve-quartz-ref.png | Bin 0 -> 47965 bytes test/dash-state-quartz-ref.png | Bin 0 -> 8698 bytes test/degenerate-path-quartz-ref.png | Bin 0 -> 232 bytes test/degenerate-path-quartz-rgb24-ref.png | Bin 0 -> 198 bytes test/operator-source-quartz-ref.png | Bin 0 -> 4572 bytes test/operator-source-quartz-rgb24-ref.png | Bin 0 -> 3452 bytes test/unbounded-operator-quartz-ref.png | Bin 0 -> 4325 bytes test/unbounded-operator-quartz-rgb24-ref.png | Bin 0 -> 1972 bytes 11 files changed, 10 insertions(+), 0 deletions(-) commit df5087992be5f0f1e42d968559c47bf43de9cfb7 Author: Vladimir Vukicevic Date: Mon Mar 17 17:37:22 2008 -0700 [quartz] Fix bogus CGContextGetType warning that's printed on the console This is caused by 0x0 surfaces being special, and not having an associated cgContext. src/cairo-quartz-surface.c | 106 +++++++++++++++++++++++++++++--------------- 1 files changed, 70 insertions(+), 36 deletions(-) commit 9d61f7db8082baf3a223c4ea41a53de372676e40 Author: Vladimir Vukicevic Date: Mon Mar 17 17:37:19 2008 -0700 [quartz] Rename ATSUI font to Quartz font configure.in | 35 +++++++------------------- src/Makefile.am | 17 +++++------- src/cairo-atsui-font.c | 39 ++++++++++++----------------- src/cairo-atsui.h | 58 -------------------------------------------- src/cairo-deprecated.h | 2 + src/cairo-quartz-private.h | 14 ++-------- src/cairo-quartz-surface.c | 14 +++++----- src/cairo-quartz.h | 15 ++++++++++- src/cairo.h | 4 +- src/cairoint.h | 10 ++++---- 10 files changed, 65 insertions(+), 143 deletions(-) commit e4f087b8b944a26d688afeef4b9ea7a0d0a6e9ec Author: Adrian Johnson Date: Sun Mar 16 17:29:48 2008 +1030 Factor out common stroke code in pdf-operators src/cairo-pdf-operators.c | 68 +++++++++++++++++++++----------------------- 1 files changed, 32 insertions(+), 36 deletions(-) commit 8238a9fd4fa672299fd99aa95f5fcec03647f7c8 Author: Adrian Johnson Date: Sat Mar 15 22:08:52 2008 +1030 Add stroke-ctm-caps to .gitignore test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 344af99d356203dce8cb97d3effa380cad0c9238 Author: Adrian Johnson Date: Sat Mar 15 22:07:01 2008 +1030 Improve the PDF operators word wrapping to correctly count the columns and avoid breaking hex strings immediately after the '<' and before any hex digits have been written. src/cairo-pdf-operators.c | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-) commit 0a8478ca1aa37695e84b4875e1efb3d93c7b8434 Author: Vladimir Vukicevic Date: Fri Mar 14 23:23:16 2008 -0700 [quartz] don't say we forced subpixel AA when we didn't Whoops. Net result was that this was disabling subpixel AA on contexts if CAIRO_ANTIALIAS_DEFAULT was being used. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 028d352286991f7ec1da168f7f91bed6449f64e4 Author: Vladimir Vukicevic Date: Fri Mar 14 23:22:08 2008 -0700 [quartz] compare gradient stops as doubles, not as fixed point We use the floating-point value later, and we can end up with weirdness such as negative colors due to the precision mismatch of our fixed point vs. floating point type. So just do everything in floating point. src/cairo-quartz-surface.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit 112bbacea3c06f844af400f34a4a2eadf25d13dd Author: Adrian Johnson Date: Sat Mar 15 00:28:21 2008 +1030 Don't use fill-stroke during analysis Instead ensure the fill and stroke are each analyzed separately. This fixes a bug in the PS output where if a fill-stroke with a translucent fill resulted in a fallback image with the stroke clipped to the fill path. src/cairo-meta-surface.c | 14 +++++--------- 1 files changed, 5 insertions(+), 9 deletions(-) commit 112b43452d302eb4ac62a20bca01bdecbfdcaaf5 Author: Adrian Johnson Date: Sat Mar 15 00:18:59 2008 +1030 Fix bug in _cairo_path_fixed_is_equal Ensure the entire path is compared. src/cairo-path-fixed.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 7e83d6e6fb8c4b11d5d95acac4a35df8969e0944 Author: Adrian Johnson Date: Fri Mar 14 21:26:04 2008 +1030 Do not use PDF fill-stroke operator with transparent fill because the PDF rendering does not match cairo. See PDF Reference 7.6.3. Bug report at https://bugs.launchpad.net/inkscape/+bug/202096 src/cairo-pdf-surface.c | 15 +++++---------- 1 files changed, 5 insertions(+), 10 deletions(-) commit 0aef7c1a34b2522d400b5a1a74567a79696216c9 Author: Adrian Johnson Date: Mon Mar 10 22:19:52 2008 +1030 PDF/PS: Optimize away the stroke ctm when not required The PDF/PS backends change the ctm to user space when emitting and stroking a path. When the user space ctm does not alter the pen shape we can avoid changing the ctm. This patch optimizes the most common case where the user ctm is [1 0 0 -1 0 y] due to conversion from cairo to PDF coordinates. src/cairo-pdf-operators.c | 36 ++++++++++++++++++++++++++++-------- 1 files changed, 28 insertions(+), 8 deletions(-) commit 2bd15d080c562bfcbced1f6bb586cc1e3cae4555 Author: Adrian Johnson Date: Fri Mar 14 19:46:15 2008 +1030 Add PS reference image for stroke-ctm-caps test/stroke-ctm-caps-ps-ref.png | Bin 0 -> 1079 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 761b4ce8dd40b8e5536a19018656c2440a61e71a Author: Jeremy Huddleston Date: Thu Mar 13 17:45:25 2008 -0700 [mac] Correctly handle endianness in multi-architecture compiles on MacOS X configure.in | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 4cc93881d9603c90f1318b2eb822cf2c516ecf7d Author: Vladimir Vukicevic Date: Thu Mar 13 17:30:59 2008 -0700 [test] Add testcase for previous stroker regression fix Add Adrian's original testcase for reproducing the stroker device vector issue. (b4f518f917f5062537ee3c6a7a54180017b2c588) test/Makefile.am | 3 + test/stroke-ctm-caps-quartz-ref.png | Bin 0 -> 1109 bytes test/stroke-ctm-caps-ref.png | Bin 0 -> 1057 bytes test/stroke-ctm-caps.c | 86 +++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 0 deletions(-) commit a33351f9c677144437bef25a794b97f2ac4bb17a Author: Vladimir Vukicevic Date: Thu Mar 13 15:37:26 2008 -0700 [quartz] remove some compiler warnings src/cairo-atsui-font.c | 2 +- src/cairo-quartz-image-surface.c | 4 ---- 2 files changed, 1 insertions(+), 5 deletions(-) commit b4f518f917f5062537ee3c6a7a54180017b2c588 Author: Vladimir Vukicevic Date: Thu Mar 13 15:36:30 2008 -0700 Correctly pass the device-space vector through to stroker Part of the earlier optimization caused the wrong slope to be used for some computations; this passes the correct slope vector down to _compute_face. src/cairo-path-stroke.c | 37 +++++++++++++++++++++++-------------- test/dash-scale-ref.png | Bin 8035 -> 8058 bytes test/reflected-stroke-ref.png | Bin 4802 -> 5704 bytes 3 files changed, 23 insertions(+), 14 deletions(-) commit 5050c55f93afef9b0d0651a78f2c99e06e19b55a Author: Adrian Johnson Date: Thu Mar 13 21:35:12 2008 +1030 Use the correct glyph metrics in Type1 fallback Now that the PS backend is using PDF operators, it uses the glyph metrics in the font to position each glyph in a string. This exposed a bug in Type 1 fallback where the glyph width and height was used in the charstrings instead of x_advance/y_advance. This was causing strings to print diagonally due to the no zero y_advance. src/cairo-type1-fallback.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit ed452713cfa16e5facca8f918ef4ee4fe2ec41c3 Author: Vladimir Vukicevic Date: Wed Mar 12 18:33:05 2008 -0700 [win32] Use a DIB when cloning a surface for a WIN32_PRINTING dest In some cases we were creating a 1bpp temporary surface, losing all color/grayscale data while printing. Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=399388 src/cairo-win32-surface.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit 6ac3eb487cf0de0d28bf6b14852de91b09fecb05 Author: Vladimir Vukicevic Date: Wed Mar 12 18:19:59 2008 -0700 [quartz] correctly force subpixel AA on a context, even if defaults say otherwise In some cases (in my case, having an external monitor attached to my MBP), Quartz seems to default to grayscale AA even when it should be using subpixel AA. CGContextGetAllowsFontSmoothing returns FALSE in this case (pretty sure this is a Quartz bug). We can force subpixel AA in this case by setting CGContextSetAllowsFontSmoothing. src/cairo-quartz-surface.c | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) commit 5d11b937f1b769355a3dc7971ded40f60b001630 Author: Vladimir Vukicevic Date: Wed Mar 12 18:11:57 2008 -0700 [quartz] Apply fixup to unbounded operators to clear area outside of mask src/cairo-quartz-surface.c | 249 +++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 236 insertions(+), 13 deletions(-) commit c86cbcdd644e043dc5ae2eabf5dd6afa020e2358 Author: Chris Wilson Date: Wed Mar 12 17:54:54 2008 +0000 [cairoint.h] Mark _cairo_image_analyze_transparency as private. Add the required cairo_private markup for make check. src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 222eb6f1400ab7a51632cbc18b1526664e50c2e4 Author: Chris Wilson Date: Wed Mar 12 17:52:16 2008 +0000 Define _BSD_SOURCE to enable prototypes for strdup, snprintf. strdup() and friends require at least _BSD_SOURCE or _XOPEN_SOURCE >= 500 to be defined for the prototypes to be included. For the time being, add the define to each source file that requires one of the BSD functions. src/cairo-cff-subset.c | 1 + src/cairo-font-face.c | 1 + src/cairo-ft-font.c | 1 + src/cairo-output-stream.c | 1 + src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-scaled-font-subsets.c | 1 + src/cairo-svg-surface.c | 3 ++- src/cairo-truetype-subset.c | 1 + src/cairo-type1-fallback.c | 1 + src/cairo-type1-subset.c | 1 + 11 files changed, 12 insertions(+), 1 deletions(-) commit 2d9203c349ffba863368e85567b2e89443d51746 Author: Adrian Johnson Date: Mon Mar 10 22:30:16 2008 +1030 win32-printing: Don't scale the miter limit since the miter is a ratio it should not be scaled like the other stroke parameters when the user ctm is scaled. src/cairo-win32-printing-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f534fe434db38c2c24605bdfc251e0186dc7cafc Author: Adrian Johnson Date: Mon Mar 10 17:18:07 2008 +1030 PDF: Use cairo_image_analyse_transparency during analysis OPERATOR_SOURCE is only supported for opaque images. Check if and ARGB image really contains transparency before returing unsupported. src/cairo-pdf-surface.c | 38 +++++++++++++++++++++++++++++++++++++- 1 files changed, 37 insertions(+), 1 deletions(-) commit 61d45c9d1f2322c7c2ee7a58e7b3d5ccfac92db2 Author: Adrian Johnson Date: Sat Feb 16 22:34:39 2008 +1030 Remember the results of _cairo_image_analyze_transparency As _cairo_image_analyze_transparency() is only used on images in the meta surface, we can store the results of the image analysis and return the saved value on second and subsequent calls to analyze the same image. Previously each image was analyzed twice - once during CAIRO_PAGINATED_MODE_ANALYZE and once during CAIRO_PAGINATED_MODE_RENDER. src/cairo-image-surface.c | 21 +++++++++++++++------ src/cairo-ps-surface.c | 3 +++ src/cairo-types-private.h | 3 ++- src/cairoint.h | 1 + 4 files changed, 21 insertions(+), 7 deletions(-) commit 7eb8f497d8ac8ee76809f958170f1e5370744ba8 Author: Adrian Johnson Date: Sat Feb 16 22:13:43 2008 +1030 Move analyze_image_transparency in to cairo-image-surface.c src/cairo-image-surface.c | 29 +++++++++++++++++++++++++++++ src/cairo-ps-surface.c | 44 ++------------------------------------------ src/cairo-types-private.h | 6 ++++++ src/cairoint.h | 3 +++ 4 files changed, 40 insertions(+), 42 deletions(-) commit 00091d50a6187acd0fd35aef16a4fa5fab3c8aa9 Author: Adrian Johnson Date: Sun Mar 9 16:44:18 2008 +1030 Add fallback image comment to PS output To help better understand when fallback images are used, a comment similiar to the following is included with each fallback image in the PS output. % Fallback Image: x=101, y=478, w=50, h=10 res=300dpi size=31500 src/cairo-ps-surface.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit 95acec69d8ee4fd37937f5b466c2baf612e9113a Author: Adrian Johnson Date: Sun Mar 9 16:40:25 2008 +1030 Round fallback image size up instead of down to ensure the fallback image completely covers the fallback region. src/cairo-paginated-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 94e41d5565ef72a0ef6e0235545c660aaf92b825 Author: Vladimir Vukicevic Date: Sat Mar 8 17:45:47 2008 -0800 [quartz] Don't force interpolation off for images Creating a CGImage with interpolation set to FALSE means that it will never be interpolated; otherwise the interoplation is controlled by the destination context's interpolation quality setting. src/cairo-quartz-image-surface.c | 4 ++-- src/cairo-quartz-surface.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit 08e38d3f204911a793d3aa24bf2636caf3e58e20 Author: Vladimir Vukicevic Date: Sat Mar 8 16:06:01 2008 -0800 [quartz] align strides to 16 bytes, as per apple docs The docs indicate that doing so can yield a peformance win, so we align ARGB32/RGB24 surface strides to 16 bytes. src/cairo-quartz-surface.c | 21 ++++++++++++++------- 1 files changed, 14 insertions(+), 7 deletions(-) commit 73444f16fa82b63a19aa938eb42001b5731326da Author: Vladimir Vukicevic Date: Sat Mar 8 15:31:15 2008 -0800 [quartz] Don't try to call CGBitmapContextCreateImage on non-bitmap contexts src/cairo-quartz-surface.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 091df2c59b6dbd53a748955db359443d5d445ba4 Author: Vladimir Vukicevic Date: Sat Mar 8 15:16:05 2008 -0800 [quartz] properly honor text antialiasing modes in show_glyphs src/cairo-quartz-surface.c | 35 +++++++++++++++++++++++---- test/Makefile.am | 2 + test/text-antialias-none-quartz-ref.png | Bin 0 -> 304 bytes test/text-antialias-subpixel-quartz-ref.png | Bin 0 -> 1100 bytes 4 files changed, 32 insertions(+), 5 deletions(-) commit 4f7ac14b8fdafd9fa85e797fb6e4c974788f70fc Author: Vladimir Vukicevic Date: Sat Mar 8 19:22:13 2008 -0800 [quartz] implement REPEAT/REFLECT for gradients Implement REPEAT/REFLECT for gradients in Quartz: for linear gradients, they're implemented natively (by extending the gradient region); for radial gradients, we generate a fallback image using pixman and render that. src/cairo-quartz-surface.c | 203 ++++++++++++++++++++++++++++++++++++++----- 1 files changed, 179 insertions(+), 24 deletions(-) commit 869942a97e34b09a7bd5b8cfc54832ce9dbd08b6 Author: Vladimir Vukicevic Date: Fri Mar 7 16:55:47 2008 -0800 [quartz] some more quartz ref images test/Makefile.am | 2 ++ test/big-line-quartz-ref.png | Bin 0 -> 1075 bytes test/big-line-quartz-rgb24-ref.png | Bin 0 -> 941 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit 2e33d5f57bde82b953ebc5f9c1355327a7ac4967 Author: Vladimir Vukicevic Date: Fri Mar 7 16:46:53 2008 -0800 [quartz] Update a bunch of reference images Generated with Bitstream Vera font family installed, using ATSUI font backend. test/Makefile.am | 14 ++++++++++++++ test/font-matrix-translation-quartz-ref.png | Bin 0 -> 1041 bytes test/glyph-cache-pressure-quartz-ref.png | Bin 0 -> 3491 bytes test/linear-gradient-quartz-ref.png | Bin 0 -> 1164 bytes test/long-dashed-lines-quartz-ref.png | Bin 0 -> 2313 bytes test/mask-quartz-ref.png | Bin 10657 -> 10682 bytes test/operator-clear-quartz-ref.png | Bin 1195 -> 1368 bytes test/operator-clear-quartz-rgb24-ref.png | Bin 1244 -> 1201 bytes test/radial-gradient-quartz-ref.png | Bin 0 -> 92334 bytes test/random-intersections-quartz-ref.png | Bin 0 -> 197778 bytes test/reflected-stroke-quartz-ref.png | Bin 0 -> 5293 bytes test/rotate-image-surface-paint-quartz-ref.png | Bin 257 -> 257 bytes test/select-font-face-quartz-ref.png | Bin 0 -> 2958 bytes test/show-text-current-point-quartz-ref.png | Bin 0 -> 3198 bytes test/text-antialias-gray-quartz-ref.png | Bin 0 -> 1039 bytes test/text-pattern-quartz-rgb24-ref.png | Bin 0 -> 1867 bytes test/text-rotate-quartz-ref.png | Bin 0 -> 17405 bytes test/trap-clip-quartz-ref.png | Bin 6171 -> 6041 bytes test/unantialiased-shapes-quartz-ref.png | Bin 0 -> 4394 bytes 19 files changed, 14 insertions(+), 0 deletions(-) commit fb1378a24b5c6cd65b73aa611bb049ebb6f2b57a Author: Vladimir Vukicevic Date: Fri Mar 7 16:46:15 2008 -0800 [quartz] Correctly handle gradients with non-identity pattern transform Fixes http://bugs.freedesktop.org/show_bug.cgi?id=14248 src/cairo-quartz-private.h | 3 +- src/cairo-quartz-surface.c | 68 ++++++++++++++++++------------------------- 2 files changed, 31 insertions(+), 40 deletions(-) commit 6c7610067f8a131a4fbba8d2b6a88c27ef229bbe Author: Vladimir Vukicevic Date: Fri Mar 7 15:35:31 2008 -0800 [quartz] handle antialiasing correctly in stroke() and clip() A CoreGraphics bug was fixed so strokes are no longer incorrectly drawn with antialiasing disabled; we no longer have to ignore antialiasing for stroke(). Also, antialiasing was not being correctly set for clip(). This fixes both issues. src/cairo-quartz-surface.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 21dab3c5e9fe1ff344ff809053618c2c8f0710f3 Author: Vladimir Vukicevic Date: Fri Mar 7 14:49:46 2008 -0800 [quartz] look up the right symbol name for CGContextGetType src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e52bad5e33e0b69b868525056c95ebd473fd6b10 Author: Vladimir Vukicevic Date: Fri Mar 7 14:49:15 2008 -0800 [quartz] split out (experimental) quartz-image into separate file configure.in | 15 +++++++++ src/Makefile.am | 5 +++ src/cairo-quartz-image-surface.c | 21 +++++++++---- src/cairo-quartz-image.h | 59 ++++++++++++++++++++++++++++++++++++++ src/cairo-quartz-surface.c | 10 ++---- src/cairo-quartz.h | 6 ---- 6 files changed, 97 insertions(+), 19 deletions(-) commit b52f127c12fd7ee2b4f532954cb1e9e4eb8561b4 Author: Vladimir Vukicevic Date: Thu Mar 6 16:52:54 2008 -0800 [quartz] fix text rendering with gradient or image source A quirk in how CGContextShowGlyphsWithAdvances works was causing all non-solid glyphs to be rendered on top of eachother. This fixes the problem. src/cairo-quartz-surface.c | 65 ++++++++++++++++++++++++------------------- 1 files changed, 36 insertions(+), 29 deletions(-) commit de515e0f9a46162dcdef3bce81702a56ac6f29bf Author: Chris Wilson Date: Thu Mar 6 08:10:16 2008 +0000 [cairo-png] Revert accidental chunk from FORMAT_A1 support. Whilst splitting the patches, I left in this line which would preserve 1-bit grayscale unexpanded, but without any of the other FORMAT_A1 support. src/cairo-png.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 8ba8a1192497ff89215f8a1657cbe88609083fb1 Author: Chris Wilson Date: Tue Mar 4 13:59:57 2008 +0000 [win32] make check doc fixup. Add the missing '%' to the macro as demanded by make check. src/cairo-win32-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1dd894115e03aa202941ecebe9fd3420c73645ef Author: Chris Wilson Date: Tue Mar 4 09:04:17 2008 +0000 [cairo-pattern] Raise an error for _cairo_pattern_create_solid() failure. Add a missing _cairo_error() for the malloc failure in _cairo_pattern_create_solid(). src/cairo-pattern.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 5efc5238d548599a90a02d922d031a899424d1c1 Author: Chris Wilson Date: Fri Feb 29 17:06:30 2008 +0000 [cairo-hull] Propagate error during hull computation. Propagate the original error status instead of returning a new NO_MEMORY error. src/cairo-hull.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) commit 11a2444ec875aaaed12c1f1cfed5eb8e139c306d Author: Chris Wilson Date: Fri Jan 18 14:53:50 2008 +0000 [cairo-png] Support generating CAIRO_FORMAT_RGB24 from PNGs. If the PNG does not have an alpha channel, then create an opaque image. src/cairo-png.c | 69 +++++++++++++++++++------ test/.gitignore | 1 + test/Makefile.am | 2 + test/png.c | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 204 insertions(+), 17 deletions(-) commit 06b375aee999220ce294c22fa50a3040c19d5492 Author: Chris Wilson Date: Fri Feb 29 11:55:01 2008 +0000 [cairo-png] Use cairo_format_stride_for_width() Use cairo_format_stride_for_width() instead of assuming the pixel size and manually calculating the row stride. This should make it easier to support loading multiple image formats in future. src/cairo-image-surface.c | 1 + src/cairo-png.c | 16 ++++++++++------ src/cairoint.h | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) commit b181f40949a855c957dc6e7a1033981a2ed7d05a Author: Chris Wilson Date: Thu Feb 28 16:04:08 2008 +0000 [test/a8-mask] Check negative strides as well. Check that we also allow surfaces to be created using a negative stride. test/a8-mask.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) commit b6eb1c5c92321849661198facd53510366050d45 Author: Chris Wilson Date: Fri Feb 29 11:49:14 2008 +0000 [cairo-image-surface] Harden cairo_format_stride_for_width(). Check the user supplied values for validity and potential overflow, returning -1 in such cases, and update the documentation to warn of the new error return. src/cairo-image-surface.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) commit c06d929325710c1a2cbecb8a64803ca8e1ffbec0 Author: Chris Wilson Date: Thu Feb 28 16:07:57 2008 +0000 [cairo-png] Further hardening against malloc failures. On some OOM paths, libpng raises a warning as opposed to an error, these were not being propagated back to the caller. We were also not checking that we did not overwrite a pre-existing error status when raising an error whilst performing I/O. src/cairo-png.c | 38 +++++++++++++++++++++++++++++--------- 1 files changed, 29 insertions(+), 9 deletions(-) commit c985096e6d7c04a780c055387e17ec4bb9334db3 Author: Chris Wilson Date: Fri Feb 29 11:16:39 2008 +0000 [cairo-xlib] Tidy usage of _cairo_error(). Avoid a duplicate call to _cairo_error() and add a missing one. src/cairo-xlib-display.c | 1 + src/cairo-xlib-surface.c | 12 ++++++------ 2 files changed, 7 insertions(+), 6 deletions(-) commit 914f4a3ec5a310c823558c27e500a23be808b9fe Author: Chris Wilson Date: Fri Feb 29 11:15:26 2008 +0000 [cairo-pattern] Tidy usage of _cairo_error(). Remove the duplicate calls to _cairo_error() along the constructor error paths and a missing call to _cairo_error(). src/cairo-pattern.c | 20 +++++--------------- 1 files changed, 5 insertions(+), 15 deletions(-) commit d9fb4d4bc55eae42f6348b142e667be454064e2c Author: Chris Wilson Date: Fri Feb 29 11:12:57 2008 +0000 [cairo-ft-font] Simplify return of the nil font face during construction. Simply return the nil font face from the internal constructor rather than returning NULL and repeating the same fixup in the callers. src/cairo-ft-font.c | 12 +++--------- 1 files changed, 3 insertions(+), 9 deletions(-) commit fd7d5d6e1dbad6c44a607d91ee59361ee19d32f9 Author: Chris Wilson Date: Fri Feb 29 11:11:47 2008 +0000 [cairo-clip] Raise _cairo_error() at original error site. In a couple of places where we detect an error and return an error object to the user, we did not throw a _cairo_error(). src/cairo-clip.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 1654510a349d99167247d1004a481a95388cf0be Author: Chris Wilson Date: Fri Feb 29 11:10:34 2008 +0000 [cairo-cff-subset] Propagate error status. Remove duplicate _cairo_error() by ensuring that the error status is always propagated from the original error site. Note that in one case this eliminates a potential _cairo_error(CAIRO_INT_STATUS_UNSUPPORTED)! src/cairo-cff-subset.c | 47 +++++++++++++++++++++++++---------------------- 1 files changed, 25 insertions(+), 22 deletions(-) commit 3b93d90edde7c065c6484e03e056b8605af85c4d Author: Chris Wilson Date: Fri Feb 29 10:16:05 2008 +0000 [cairo-type1-fallback] Propagate original error status. _cairo_error() has already been called at the originating error site, so remove the duplicate (hard-coded!) call at the return statement. src/cairo-type1-fallback.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 141c54cd276ae86f6677fa8f66a118264d4287bf Author: Chris Wilson Date: Fri Feb 29 08:54:33 2008 +0000 [cairo-truetype-subset] Remove duplicate _cairo_error(). _cairo_error() has already been called at the originating error site, so remove the duplicate call at the return statement. src/cairo-truetype-subset.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-) commit d89edde84de9cec9ce6f76f4f2c44dd9c1220528 Author: Vladimir Vukicevic Date: Tue Mar 4 00:15:46 2008 -0800 [meta] always copy glyph array before passing to _cairo_surface_show_glyphs _cairo_surface_show_glyphs is allowed to mutate the glyph array; if it's handed the internal array that the meta surface holds, then any subsequent playback (such as for fine-grained fallbacks) will result in incorrect glyph rendering. Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=419917 (I was unable to create a simple cairo testcase to demonstrate the problem.) src/cairo-meta-surface.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) commit 4a1f65b63e891436f5896b1ccb0af26dd4b9cfe1 Author: Vladimir Vukicevic Date: Mon Mar 3 21:16:12 2008 -0800 Fix msvc compilation issue in cairo-compiler-private.h __WIN32__ is not a standard define set by MSVC; we have to check for __WIN32__ (for mingw/gcc) and for _MSC_VER, for MSVC. src/cairo-compiler-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4588b016d389bb678ab55f7dbbf2bf8cdf597bc1 Author: Vladimir Vukicevic Date: Mon Mar 3 20:00:08 2008 -0800 [quartz] compilation fix I'm an idiot and forgot to stg refresh, apparently. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2f9350424fd7eb03ecbdbdee2831944d4e9c35af Author: Vladimir Vukicevic Date: Mon Mar 3 17:43:41 2008 -0800 [win32] Treat all incoming HDCs as RGB24, regardless of depth Assuming A8/A1 doesn't really make sense in any case, and doing this allows for rendering to 8bpp displays. src/cairo-win32-surface.c | 28 ++++++---------------------- 1 files changed, 6 insertions(+), 22 deletions(-) commit 9dd55f6fe854ec2365a5c1d264e39ca03f6eceb5 Author: Vladimir Vukicevic Date: Mon Mar 3 17:40:21 2008 -0800 [quartz] use CGContextGetType API if available We need to have a way to figure out if a context is a bitmap context; the current method works, but it prints a warning to the system console if called on a non-bitmap context. There's a private CGContextGetType API that seems to let us get this information. src/cairo-quartz-surface.c | 17 ++++++++++++++++- 1 files changed, 16 insertions(+), 1 deletions(-) commit 5b334b274778f588c997d674c111a8bbf91be1df Author: Antoine Azar Date: Fri Feb 29 03:49:55 2008 -0500 fixed compilation typo on win32 src/cairo-win32-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 39d18ecbfda6b3c1234c5ef4a4723099990b3502 Author: Claudio Ciccani Date: Sat Mar 1 11:07:47 2008 +0100 [cairo-directfb] Fixed bug in clone_similar() (src_x added twice). src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6295c46569de13a96816ed8e30dcefd73af1eb18 Author: Carl Worth Date: Thu Feb 28 17:08:40 2008 -0800 INSTALL: Add notes on running autogen.sh if there is no configure script INSTALL | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 65 insertions(+), 6 deletions(-) commit e7e4a03dd387d264226105dc29c8541f0528fd2c Author: Carl Worth Date: Thu Feb 28 16:39:42 2008 -0800 get-path-extents: Fix APPROX_EQUALS to round values on both sides of the comparison test/get-path-extents.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 602489b150e879bc5cab6b1ad37c107799bf05ae Author: Carl Worth Date: Thu Feb 28 16:33:51 2008 -0800 get-path-extents: Use APPROX_EQUALS instead of EQUALS for text path tests This is done grudgingly due to freetype rounding the coordinates of the extents when hinting is enabled. test/get-path-extents.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 50a6fe1a2aa88e1f5ba40eda21142319f98f3d0d Author: Carl Worth Date: Thu Feb 28 16:32:55 2008 -0800 Remove unnecessary cairo_set_tolerance call from get-path-extents test test/get-path-extents.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 4a73471087f42baf07988e0f2de323ed3b18dac9 Merge: 54a6191... 523c7db... Author: Carl Worth Date: Thu Feb 28 16:21:11 2008 -0800 Merge branch 'master' of git.cairographics.org:/git/cairo commit 54a61911f26b46b6d9b7335ac7dda746081261d9 Author: Carl Worth Date: Thu Feb 28 16:20:56 2008 -0800 Increment version to 1.5.13 after the 1.5.12 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 523c7dbf6db85e75624ae111179dedb570212bb2 Author: Behdad Esfahbod Date: Thu Feb 28 18:53:08 2008 -0500 [cairo-scaled-font] Pedantic check for zero-area glyphs src/cairo-scaled-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 3ec4b9a4fc96572f099d0e9679fec9e5eb97a32e Author: Carl Worth Date: Thu Feb 28 15:46:22 2008 -0800 Increment cairo version to 1.5.12 and libtool versioning to 18:0:16 configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit bf99e355d9d24a4820dc93b49321b15318501b61 Author: Carl Worth Date: Thu Feb 28 15:45:11 2008 -0800 Clarify that 16-bit limit still exists in pixman NEWS | 19 ++++++++++--------- 1 files changed, 10 insertions(+), 9 deletions(-) commit 4cc174f72f635e885b5f5fdc3d67789d3952cd2e Author: Carl Worth Date: Thu Feb 28 15:41:36 2008 -0800 Mark the big-line test as XFAIL test/Makefile.am | 1 + test/big-line.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) commit 5d0bc97b2000a7b7e40a7a3918f09d90bdf5376a Author: Carl Worth Date: Thu Feb 28 15:35:46 2008 -0800 Fix incorrect reference images for big-line test I mistakenly generated the original reference images with a 16.16 version of cairo, (which manifests a different buggy behavior than does the current 24.8 cairo). test/big-line-ps-ref.png | Bin 1161 -> 1148 bytes test/big-line-ps-rgb24-ref.png | Bin 809 -> 830 bytes test/big-line-ref.png | Bin 1421 -> 1486 bytes test/big-line-rgb24-ref.png | Bin 1231 -> 1308 bytes 4 files changed, 0 insertions(+), 0 deletions(-) commit 4c7784e91eb953b905f187dda2a76dc102d73d01 Author: Jody Goldberg Date: Thu Feb 28 15:23:53 2008 -0800 Fix PDF ouput when cross-compiling with mingw Need to use __WIN32__ instead of _MSC_VER to select _snprintf in place of snprintf when cross compiling. Otherwise all all %ld arguments get misprinted resulting in broken PDF output. src/cairo-compiler-private.h | 5 ++++- src/cairo-output-stream.c | 5 +---- 2 files changed, 5 insertions(+), 5 deletions(-) commit 3d9db511c6990481add24f14225e36ea4d3f62d5 Author: Carl Worth Date: Thu Feb 28 15:07:50 2008 -0800 Remove references to PIXMAN_yuy2 and PIXMAN_yv12 enum values These were added in cb5ea8abfdf2c92241d4dea8bb827648697fd8e9 to quiet a compiler warning. We're reverting them now to avoid gratuitously requiring a new pixman version just to pick up two enum values that we aren't actually using. src/cairo-image-surface.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) commit a8e5c6b924447bb1303589cc31792a6c4bcc27ec Author: Carl Worth Date: Thu Feb 28 15:05:12 2008 -0800 Fix typo in comment src/cairo-fixed-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 307a7448ea89c5cf2805bc3a8da31c5ea77e4542 Author: Larry Ewing Date: Thu Feb 28 15:02:23 2008 -0800 Add big-line test showing a 24.8 failure test/.gitignore | 1 + test/Makefile.am | 5 +++ test/big-line-ps-ref.png | Bin 0 -> 1161 bytes test/big-line-ps-rgb24-ref.png | Bin 0 -> 809 bytes test/big-line-ref.png | Bin 0 -> 1421 bytes test/big-line-rgb24-ref.png | Bin 0 -> 1231 bytes test/big-line.c | 69 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 75 insertions(+), 0 deletions(-) commit 81175110ab44e74fe04f2bc8ed3c9983e23a82c6 Author: Carl Worth Date: Thu Feb 28 14:36:47 2008 -0800 NEWS: Add notes for cairo 1.5.12 NEWS | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 94 insertions(+), 0 deletions(-) commit fbd29a4025fc3bca3812d205230151e8c6e80f49 Author: Carl Worth Date: Thu Feb 28 14:36:32 2008 -0800 Fix 'make doc-publish' for when run twice on the same day Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8d515344c4ecded58566b704a740766f85359876 Author: Carl Worth Date: Thu Feb 28 14:35:57 2008 -0800 Add cairo-quartz to the manual doc/public/Makefile.am | 1 - doc/public/cairo-docs.xml | 2 +- doc/public/cairo-sections.txt | 11 ++++++++ doc/public/tmpl/cairo-quartz.sgml | 49 ++++++++++++++++++++++++++++++++++++ doc/public/tmpl/cairo-surface.sgml | 1 + 5 files changed, 62 insertions(+), 2 deletions(-) commit c8c77f01f7429b43dba4840698497187ff4d5779 Author: Carl Worth Date: Thu Feb 28 13:02:27 2008 -0800 Fix typo in documentation src/cairo-quartz-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit fa4b91fcac9b83cb66ac98dbcb395bd7b75c7560 Author: Carl Worth Date: Thu Feb 28 12:56:31 2008 -0800 Add missing reference images to make distcheck happily test/Makefile.am | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) commit a95b22858fa5d65600faf5163966e18760a3cf35 Merge: c84ec58... 67d5437... Author: Carl Worth Date: Thu Feb 28 12:30:13 2008 -0800 Merge branch '24.8' commit 67d543716e294f4af330c52dcc9597e16267425e Author: Carl Worth Date: Wed Feb 27 20:39:53 2008 -0800 PS: Fix to never break the final ~> that terminates a base85 stream. This was recently broken in commit 40d5082c24819968a5ee5a8f72e3b9cd61cb6105 which uses a base85-stream but without strings for encapsulating image data. The bug was that the protection for ~> was only being applied to the string encodings rather than all base85 streams. We got lucky recently that the 24.8 change just happened to put the ~> sequence on the line-wrap boundary so the test suite tripped up the bug. Otherwise, we could have missed this for quite some time. src/cairo-ps-surface.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit c84ec585123be1802b50665e192b80daf14fdd2b Author: Carl Worth Date: Wed Feb 27 16:24:10 2008 -0800 Add some missing .gitignore entries test/.gitignore | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 1df0b001b5b3e1062fa3c3a9070391105fe3d4ba Author: Carl Worth Date: Wed Feb 27 15:08:18 2008 -0800 Change cairo's fixed-point format from 16.16 to 24.8 The additional 8 bits of integer allows device space to be 256 times larger before applications need to start worrying about any issues with overflow. So this should help in many cases. And the loss of 8 bits of sub-pixel precision shouldn't cause any harm at all---16 was really much more than necessary. With this change the details of rasterization for several tests are changed slightly, (particularly on arcs, for example), so many reference images are updated here. NOTE: This change is currently breaking get-path-extents for ps/pdf/svg as well as push-group for ps. We do not yet know the reasons for these new failures. src/cairo-fixed-type-private.h | 2 +- test/clip-operator-ref.png | Bin 8262 -> 8263 bytes test/clip-twice-ref.png | Bin 1191 -> 1362 bytes test/clip-twice-rgb24-ref.png | Bin 1120 -> 1198 bytes test/copy-path-ps-argb32-ref.png | Bin 442 -> 0 bytes test/copy-path-ps-ref.png | Bin 0 -> 474 bytes test/copy-path-ps-rgb24-ref.png | Bin 440 -> 0 bytes test/linear-gradient-ps-ref.png | Bin 718 -> 779 bytes test/mask-ref.png | Bin 8381 -> 8476 bytes test/mask-svg-argb32-ref.png | Bin 8389 -> 8527 bytes test/meta-surface-pattern-svg-argb32-ref.png | Bin 3896 -> 3924 bytes test/operator-clear-ps-argb32-ref.png | Bin 1437 -> 1400 bytes test/operator-source-ref.png | Bin 4422 -> 4422 bytes test/push-group-ref.png | Bin 3005 -> 3126 bytes test/push-group-rgb24-ref.png | Bin 2849 -> 2961 bytes test/random-intersections-ps-ref.png | Bin 89253 -> 89253 bytes test/random-intersections-ref.png | Bin 132210 -> 148722 bytes test/text-pattern-svg-argb32-ref.png | Bin 1749 -> 1733 bytes test/text-rotate-ps-ref.png | Bin 6859 -> 6878 bytes test/trap-clip-ref.png | Bin 5723 -> 5772 bytes test/unantialiased-shapes-ref.png | Bin 3968 -> 4459 bytes 21 files changed, 1 insertions(+), 1 deletions(-) commit 0532cb5c03bac394e22ac4200e8bebc3d959b21c Author: Carl Worth Date: Wed Feb 27 13:18:39 2008 -0800 Remove reference images for text-zero-len This test isn't generating any image output, so it's silly to have a 60x60 reference image for that. Not only that, but the rgb24 cases have always been failing due to a missing rgb24- specific reference image, (but pdiff had been hiding that). test/Makefile.am | 1 + test/text-zero-len-ref.png | Bin 130 -> 0 bytes test/text-zero-len.c | 4 +--- 3 files changed, 2 insertions(+), 3 deletions(-) commit 427a73ab31e2dce9d98820ba921b216176cde182 Author: Carl Worth Date: Wed Feb 27 12:43:37 2008 -0800 Add ps-specific reference images for two recently-added tests test/Makefile.am | 2 ++ test/long-dashed-lines-ps-ref.png | Bin 0 -> 1516 bytes test/reflected-stroke-ps-ref.png | Bin 0 -> 3898 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit 676c869d794f824b6e624d0b9b5c960870102406 Author: Carl Worth Date: Wed Feb 27 11:24:59 2008 -0800 Add some new ps-specific reference images These are necessary now due to the recent change to use pdiff only when the differences are less than a particular threshold. test/Makefile.am | 8 ++++++++ test/caps-joins-ps-ref.png | Bin 0 -> 1459 bytes test/close-path-ps-ref.png | Bin 0 -> 309 bytes test/infinite-join-ps-ref.png | Bin 0 -> 218 bytes test/leaky-polygon-ps-ref.png | Bin 0 -> 354 bytes test/rectilinear-miter-limit-ps-ref.png | Bin 0 -> 221 bytes test/self-copy-ps-ref.png | Bin 0 -> 335 bytes test/skew-extreme-ps-ref.png | Bin 0 -> 1048 bytes test/text-rotate-ps-ref.png | Bin 0 -> 6859 bytes test/transforms-ps-ref.png | Bin 0 -> 418 bytes 10 files changed, 8 insertions(+), 0 deletions(-) commit 1889427e78f2501df78a42c5e75c696745b517a7 Author: Vladimir Vukicevic Date: Wed Feb 27 12:35:56 2008 -0500 Fix usage of rectangle_int16_t in ps surface, and rename types The rectangle_int16_t usage was causing failures on 24.8 (due to a wrong pointer used to get_extents); I removed all the specific int16/int32 typedefs to avoid this situation in the future. src/cairo-ps-surface.c | 2 +- src/cairo-types-private.h | 47 ++++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 27 deletions(-) commit 4f7d3063520b987d3df3bcebfaeed9489b16b12d Author: Chris Wilson Date: Wed Feb 27 10:11:08 2008 +0000 [cairo-paginated-surface] Fix enum compiler warning. Add a CAIRO_SURFACE_TYPE_QUARTZ_IMAGE to the switch to suppress a compiler warning. src/cairo-paginated-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit cb5ea8abfdf2c92241d4dea8bb827648697fd8e9 Author: Chris Wilson Date: Thu Feb 21 16:03:42 2008 +0000 [cairo-image-surface] Compiler warnings and whitespace. Silence a couple of enum compiler warnings and tweak the whitespace. src/cairo-image-surface.c | 45 ++++++++++++++++++++++++--------------------- 1 files changed, 24 insertions(+), 21 deletions(-) commit 22600e2393f2ec5ebe40213c49599167523ddf20 Author: Chris Wilson Date: Fri Feb 22 17:07:45 2008 +0000 [cairo-gstate] Remove a couple of impossible guards. Delete a couple of superfluous gstate != NULL guards. src/cairo-gstate.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) commit 37e597f1e553a98d06c5334aa95b918ed303e89e Author: Chris Wilson Date: Fri Feb 22 17:03:51 2008 +0000 [cairo-gstate] Propagate the error from _cairo_gstate_clone(). Propagate the true status value back from the _cairo_gstate_init_copy() instead of assuming that is a NO_MEMORY and re-raising the error in the caller. src/cairo-gstate.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) commit 127d7f43ea7043bba1d276d9721e80a702d9fd46 Author: Chris Wilson Date: Thu Feb 21 15:56:34 2008 +0000 [cairo-path-bounds] _cairo_path_fixed_bounds() can fail... I was wrong in my assertion that the call to _cairo_path_fixed_interpret_flat() could not possibly fail with the given _cairo_path_bounder_* callbacks - as I had missed the implicit spline decomposition. (An interesting exercise would be to avoid the spline allocation...) As a result we do have to check and propagate the status return through the call stack. src/cairo-analysis-surface.c | 8 ++++++-- src/cairo-gstate.c | 12 +++++++++--- src/cairo-path-bounds.c | 10 +++++----- src/cairo.c | 10 +++++++--- src/cairoint.h | 4 ++-- 5 files changed, 29 insertions(+), 15 deletions(-) commit 65a8a279430a08e6f28b1e0354e9f18fda1a0ad7 Author: Chris Wilson Date: Tue Feb 26 14:14:38 2008 +0000 [test] Add reflected-stroke to exercise stroking with a reflected ctm. Parts of the stroker depend upon whether we have in effect a reflection matrix (one whose determinant < 0). This test incopororates the same drawing under the a couple of reflections to exercise stroking under matrices with both positive and negative determinants. test/.gitignore | 1 + test/Makefile.am | 2 + test/reflected-stroke-ref.png | Bin 0 -> 4802 bytes test/reflected-stroke.c | 100 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 0 deletions(-) commit 76f0613e5f1244557eab31945d7e7c757d987304 Author: Chris Wilson Date: Tue Feb 26 09:50:51 2008 +0000 [test] Add long-dashed-lines to exercise _cairo_box_intersects_line_segment(). Draw a few rectangles whose vertices are outside the bounds of the surface, but whose segments cross the surface. This exercises the new dashed stroker optimisation which tries to determine whether the line segment is visible. test/.gitignore | 1 + test/Makefile.am | 2 + test/long-dashed-lines-ref.png | Bin 0 -> 2116 bytes test/long-dashed-lines.c | 75 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 0 deletions(-) commit cdeffc69d9daa931c3c4ffcbb9e093180da45fe5 Author: Chris Wilson Date: Tue Feb 26 13:04:33 2008 +0000 [cairo-quartz-surface] Make check fixup. A couple of minor corrections to satisfy make check. src/cairo-quartz-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 40f4750f5ec53ca9ca6e3d621fefb2bd1687909e Author: Adrian Johnson Date: Tue Feb 26 23:17:04 2008 +1030 Use PDF 're' operator for rectangle paths Modify cairo-pdf-operators.c to emit to 're' path operator when the path contains only a rectangle. This can only be done when the path is logically equivilent to the the path drawn by the 're' operator. Otherwise dashed strokes may start on the wrong line. ie the path must be equivalent to: cairo_move_to (cr, x, y); cairo_rel_line_to (cr, width, 0); cairo_rel_line_to (cr, 0, height); cairo_rel_line_to (cr, -width, 0); cairo_close_path (cr); which is also equivilent to cairo_rectangle(). src/cairo-path-fixed.c | 24 ++++++++++++++++++++++++ src/cairo-pdf-operators.c | 36 +++++++++++++++++++++++++++++------- src/cairo-ps-surface.c | 2 ++ src/cairoint.h | 4 ++++ 4 files changed, 59 insertions(+), 7 deletions(-) commit 7acfee38b1ac6ef2292d754c7103bd65d58f72d8 Author: Vladimir Vukicevic Date: Mon Feb 25 21:44:04 2008 -0500 [atsui] Make default font 'Helvetica' The previous default font was Monaco, which is a fixed-pitch font; Helvetica is more inline with the other platform defaults. src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9979f786acaf0ebba1bf97e40aeba66287a3c743 Author: Vladimir Vukicevic Date: Mon Feb 25 21:27:33 2008 -0500 [test] update degenerate-pen test pdiff was hiding a rgb24 failure here, as the test was drawing using black ink on the default black background. Instead, explicitly fill the surface with white first. test/degenerate-pen-ps-argb32-ref.png | Bin 795 -> 0 bytes test/degenerate-pen-ps-ref.png | Bin 0 -> 865 bytes test/degenerate-pen-quartz-ref.png | Bin 0 -> 1144 bytes test/degenerate-pen-ref.png | Bin 788 -> 1139 bytes test/degenerate-pen.c | 4 ++++ 5 files changed, 4 insertions(+), 0 deletions(-) commit baec928a69b5b763b30766cddfb1473e4e05fc3c Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:36 2008 -0500 [quartz] More mask fixes -- handle all types via fallback mask image src/cairo-quartz-surface.c | 79 +++++++++++++++++++++++++++++++--------- test/mask-quartz-ref.png | Bin 0 -> 10657 bytes test/mask-quartz-rgb24-ref.png | Bin 0 -> 8418 bytes 3 files changed, 62 insertions(+), 17 deletions(-) commit 3fcd0be52215e1d8a59560d6b0919fb3f53b7a28 Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:35 2008 -0500 Use pdiff only if the pixel difference is less than a limit test/buffer-diff.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-) commit 1dfb1bd45fbe08392e233af67f464b2776de9f19 Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:28 2008 -0500 [quartz] update test suite images for quartz test/dash-scale-quartz-ref.png | Bin 0 -> 8079 bytes test/leaky-dash-quartz-ref.png | Bin 0 -> 241 bytes test/line-width-scale-quartz-ref.png | Bin 0 -> 6434 bytes test/mask-alpha-quartz-argb32-ref.png | Bin 0 -> 641 bytes test/meta-surface-pattern-quartz-ref.png | Bin 0 -> 4572 bytes test/meta-surface-pattern-quartz-rgb24-ref.png | Bin 0 -> 4063 bytes test/new-sub-path-quartz-ref.png | Bin 386 -> 383 bytes test/over-above-source-quartz-ref.png | Bin 0 -> 530 bytes test/over-above-source-quartz-rgb24-ref.png | Bin 0 -> 456 bytes test/over-around-source-quartz-ref.png | Bin 0 -> 612 bytes test/over-around-source-quartz-rgb24-ref.png | Bin 0 -> 491 bytes test/over-between-source-quartz-ref.png | Bin 0 -> 570 bytes test/over-between-source-quartz-rgb24-ref.png | Bin 0 -> 467 bytes test/rotate-image-surface-paint-quartz-ref.png | Bin 0 -> 257 bytes test/trap-clip-quartz-ref.png | Bin 5814 -> 6171 bytes 15 files changed, 0 insertions(+), 0 deletions(-) commit b439e638087d6e76d14ca42cd59dba3915dcc8e8 Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:25 2008 -0500 [quartz] fix mask to correctly take CTM into account src/cairo-quartz-surface.c | 40 ++++++++-------------------------------- 1 files changed, 8 insertions(+), 32 deletions(-) commit a4975ab1173957a293aad8ccac51d1e43cab86da Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:23 2008 -0500 [quartz] Optimize path handling where possible src/cairo-path-fill.c | 66 +---------------------------------- src/cairo-path-fixed.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-quartz-surface.c | 11 ++++++ src/cairoint.h | 7 ++++ 4 files changed, 101 insertions(+), 64 deletions(-) commit 63711b1d4a61f21db070f30b9c153d0923cc24bb Author: Vladimir Vukicevic Date: Mon Feb 25 21:06:21 2008 -0500 [quartz] Add quartz-image-surface type src/Makefile.am | 2 +- src/cairo-quartz-image-surface.c | 370 +++++++++++++++++++++++++++++ src/cairo-quartz-private.h | 31 +++- src/cairo-quartz-surface.c | 476 ++++++++++++++++++-------------------- src/cairo-quartz.h | 6 + src/cairo.h | 4 +- 6 files changed, 634 insertions(+), 255 deletions(-) commit ecb54b96967ae0d1b5ec3a4d0955f46dd68f2b8b Author: Behdad Esfahbod Date: Mon Feb 25 19:48:58 2008 -0500 [test/get-path-extents] Don't use short-circuit && operators That causes some tests to be skipped if the preceding test failed. test/get-path-extents.c | 143 ++++++++++++++++++++-------------------------- 1 files changed, 62 insertions(+), 81 deletions(-) commit be316b7cfae90878d05869329c85c9617019bbec Author: Behdad Esfahbod Date: Mon Feb 25 19:36:22 2008 -0500 [test]/get-path-extents] Use %g instead of %f to print doubles test/get-path-extents.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7c8c9cf334b8687ffe2d6f614e234bd1662689e6 Author: Adrian Johnson Date: Mon Feb 25 21:50:37 2008 +1030 PDF: Support OPERATOR_SOURCE when pattern is opaque src/cairo-pdf-surface.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) commit 35295546ef63821c5eee5336ec73eef2e03a035d Author: Adrian Johnson Date: Fri Feb 22 22:06:25 2008 +1030 Add mask pdf ref images The mask test pdf output is now correct. Poppler ref images are required due to minor gradient rendering differences. test/mask-pdf-argb32-ref.png | Bin 0 -> 7834 bytes test/mask-pdf-rgb24-ref.png | Bin 0 -> 7383 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 1df969158c83b31acbcf0963913bc4d4a9d20730 Author: Adrian Johnson Date: Fri Feb 22 21:59:47 2008 +1030 Refresh clip-operator ps/pdf ref images Because the meta surface analysis fix increased the size of some of the fallback images. test/clip-operator-pdf-argb32-ref.png | Bin 9096 -> 11005 bytes test/clip-operator-ps-argb32-ref.png | Bin 9062 -> 9084 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit eae259168fc4318f2a67f3107f953648e7ab925e Author: Adrian Johnson Date: Fri Feb 22 21:07:31 2008 +1030 Using correct surface size and clip when analyzing meta surface patterns The surface size and clip needs to be saved before and restored after replaying meta surface patterns back to the analysis surface. The clip is reset and the correct surface size is set before replaying the meta surface. src/cairo-analysis-surface.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) commit 0db2c67cc5b29623070465f2cf6eafbff174ed30 Author: Adrian Johnson Date: Thu Feb 21 20:51:20 2008 +1030 PS: Replace gsave/grestore with q/Q src/cairo-ps-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 187ace8024ffadc3ee0b69bbd99c52d189cb7be2 Author: Adrian Johnson Date: Fri Feb 22 19:36:11 2008 +1030 PS: Make debug code compile src/cairo-ps-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 8f0ec1174ad3c7a59ecdcf7724b8e8b96801b3e0 Author: Carl Worth Date: Thu Feb 21 08:05:27 2008 -0800 Patch hole in fabric of time-space continuum NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 70bb2abed04ed25abccbb2d6a5bdc58136701b0a Author: Behdad Esfahbod Date: Wed Feb 20 20:54:01 2008 -0500 [cairo-ft] Handle font sizes smaller than 1px correctly The FT_Set_Char_Size() docs say it replaces sizes smaller than 1.0 with 1.0. So, we can't use x_scale and y_scale values less than one. The fix is easy thouh, cap them to 1.0 and let the FT transform do the scaling down. src/cairo-ft-font.c | 36 ++++++++++++++++++++++-------------- 1 files changed, 22 insertions(+), 14 deletions(-) commit dcab5019d5d9cb70aed0f473642ee840b785c4af Author: Carl Worth Date: Wed Feb 20 17:35:48 2008 -0800 Add poppler-specific reference image for radial-gradient This is justified by the previously mentioned bug on poppler gradients. Note that this test only passes with a patch to fix a bug in poppler (not yet upstream). Here it is: PATCH: Keep 'cairo_shape' and 'cairo' consistent https://bugs.freedesktop.org/show_bug.cgi?id=14593 test/Makefile.am | 1 + test/README | 1 + test/radial-gradient-pdf-ref.png | Bin 0 -> 79490 bytes 3 files changed, 2 insertions(+), 0 deletions(-) commit 70b683363f6e37d8952c8f857dd687022a02ada5 Author: Emmanuel Pacaud Date: Wed Feb 20 23:46:27 2008 +0100 [SVG] Fix a8-mask test failure. For A8 and A1 masks, the embedded mask image doesn't have an alpha channel. In this case, the feColorMatrix should not be used, since it's goal is to discard the color channels and to only keep the alpha one (which is what we want when we have an ARGB32 mask image, since SVG uses all the channels for the mask operation, where cairo only use the alpha channel). src/cairo-svg-surface.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) commit c5d056aaebe51d2c3430807de559b0d8ab3431d5 Author: Emmanuel Pacaud Date: Wed Feb 20 21:42:24 2008 +0100 [SVG] Fix the extend-reflect-similar test failure. SVG doesn't support extend reflect for image pattern, and there isn't any trivial way to emulate this feature. So we use the image fallback for now. This fix also forces an image fallback for extend-reflect, but in the end, it generates more or less the same file (one big image for the pattern). No other test is forced to use an image fallback by this patch. src/cairo-svg-surface.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 1d236521a527d8b07962d1d671daff35134f4d31 Author: Carl Worth Date: Wed Feb 20 10:00:41 2008 -0800 Increment cairo version to 1.5.11 after the 1.5.10 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 83489f623f1239a731c5377d634ea8e9b782d448 Author: Carl Worth Date: Wed Feb 20 10:00:31 2008 -0800 SGML churn doc/public/tmpl/cairo-paths.sgml | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit 0f2ecb5ec65ff13c3aafbe57600c1906f3fe7978 Author: Carl Worth Date: Wed Feb 20 08:24:32 2008 -0800 Update REFERENCE_IMAGES for distcheck test/Makefile.am | 64 +++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 47 insertions(+), 17 deletions(-) commit ee62a5fad6a32a6997600caac8b292aef4e2fe54 Author: Carl Worth Date: Wed Feb 20 08:08:52 2008 -0800 Mention that cairo_get_current_point is void again NEWS | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 118657136d3323f4769bee28ec2435a61540f0eb Author: Carl Worth Date: Wed Feb 20 08:06:39 2008 -0800 Increment cairo version to 1.5.10 and libtool versioning to 17:0:15 configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 5aacc54c430a982b51992d6fac186b955e478045 Author: Carl Worth Date: Wed Feb 20 08:02:45 2008 -0800 NEWS: Add notes for cairo 1.5.10 NEWS | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 94 insertions(+), 5 deletions(-) commit f954db72dd33de837296ede353ad9823b0e32fcd Author: Carl Worth Date: Wed Feb 20 06:24:48 2008 -0800 Add svg-specific reference image for mask-alpha There's no apparent bug here. test/mask-alpha-svg-argb32-ref.png | Bin 0 -> 615 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit c197c684a6b002ad8549d92f15d7f68b7c0068bd Author: Carl Worth Date: Wed Feb 20 05:58:42 2008 -0800 Update ps-specific reference images for ghostscript 8.61 I was wrong in the previous message where I said I had ghostscript 8.61 installed. I do now, (and "gs --version" says the same thing), and here are the new reference images. test/clip-fill-rule-ps-argb32-ref.png | Bin 322 -> 310 bytes test/clip-fill-rule-ps-rgb24-ref.png | Bin 309 -> 302 bytes test/dash-caps-joins-ps-argb32-ref.png | Bin 3854 -> 3870 bytes test/dash-caps-joins-ps-rgb24-ref.png | Bin 3852 -> 3870 bytes test/dash-curve-ps-ref.png | Bin 27206 -> 27293 bytes test/dash-state-ps-argb32-ref.png | Bin 8652 -> 0 bytes test/dash-state-ps-ref.png | Bin 0 -> 10219 bytes test/dash-state-ps-rgb24-ref.png | Bin 8650 -> 0 bytes test/dash-zero-length-ps-argb32-ref.png | Bin 319 -> 0 bytes test/dash-zero-length-ps-ref.png | Bin 0 -> 319 bytes test/dash-zero-length-ps-rgb24-ref.png | Bin 0 -> 304 bytes test/degenerate-pen-ps-argb32-ref.png | Bin 771 -> 795 bytes test/font-matrix-translation-ps-argb32-ref.png | Bin 785 -> 749 bytes test/font-matrix-translation-ps-rgb24-ref.png | Bin 783 -> 749 bytes test/ft-text-vertical-layout-type1-ps-ref.png | Bin 1894 -> 1911 bytes test/ft-text-vertical-layout-type3-ps-ref.png | Bin 1879 -> 1867 bytes test/glyph-cache-pressure-ps-ref.png | Bin 1667 -> 1413 bytes test/gradient-alpha-ps-argb32-ref.png | Bin 179 -> 189 bytes test/line-width-scale-ps-argb32-ref.png | Bin 3903 -> 0 bytes test/line-width-scale-ps-ref.png | Bin 0 -> 3911 bytes test/line-width-scale-ps-rgb24-ref.png | Bin 3901 -> 0 bytes test/linear-gradient-ps-argb32-ref.png | Bin 613 -> 0 bytes test/linear-gradient-ps-ref.png | Bin 0 -> 718 bytes test/linear-gradient-ps-rgb24-ref.png | Bin 613 -> 0 bytes test/linear-gradient-reflect-ps-ref.png | Bin 315 -> 314 bytes test/meta-surface-pattern-ps-argb32-ref.png | Bin 3246 -> 3257 bytes test/meta-surface-pattern-ps-rgb24-ref.png | Bin 3823 -> 3873 bytes test/new-sub-path-ps-argb32-ref.png | Bin 559 -> 556 bytes test/operator-clear-ps-argb32-ref.png | Bin 1409 -> 1437 bytes test/operator-source-ps-argb32-ref.png | Bin 4026 -> 3893 bytes test/operator-source-ps-rgb24-ref.png | Bin 3366 -> 3241 bytes test/pixman-rotate-ps-argb32-ref.png | Bin 411 -> 0 bytes test/pixman-rotate-ps-rgb24-ref.png | Bin 392 -> 0 bytes test/random-intersections-ps-argb32-ref.png | Bin 89733 -> 0 bytes test/random-intersections-ps-ref.png | Bin 0 -> 89253 bytes test/random-intersections-ps-rgb24-ref.png | Bin 89733 -> 0 bytes test/select-font-face-ps-ref.png | Bin 1352 -> 1079 bytes test/show-text-current-point-ps-ref.png | Bin 1475 -> 1454 bytes test/text-pattern-ps-argb32-ref.png | Bin 998 -> 984 bytes test/text-pattern-ps-rgb24-ref.png | Bin 969 -> 936 bytes test/text-rotate-ps-argb32-ref.png | Bin 7156 -> 0 bytes test/text-rotate-ps-rgb24-ref.png | Bin 7156 -> 0 bytes test/trap-clip-ps-argb32-ref.png | Bin 5715 -> 5591 bytes test/trap-clip-ps-rgb24-ref.png | Bin 5630 -> 5512 bytes 44 files changed, 0 insertions(+), 0 deletions(-) commit 8d2d4130146d16676c9ed6cf7d82d6aeaadf1c56 Author: Carl Worth Date: Wed Feb 20 05:11:53 2008 -0800 Expand the documentation of cairo/test/README Add notes on CAIRO_REF_DIR and the version requirements of poppler and ghostscript necessary for getting no failures. test/README | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 87 insertions(+), 12 deletions(-) commit 4d42f569007f23e4cf9713c14f8c3dc640cf0f2c Author: Carl Worth Date: Wed Feb 20 04:22:58 2008 -0800 Update ps-specific reference images Presumably these are due to ghostscript version churn. I don't know what version was used in the past, but we're going to be more careful about documenting versions now. The ghostscript package I used here advertises itself as "8.61" and "gs --version" reports 8.15.3. ...ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 1879 -> 0 bytes test/ft-text-vertical-layout-type1-ps-ref.png | Bin 0 -> 1894 bytes ...ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 1882 -> 0 bytes test/ft-text-vertical-layout-type3-ps-ref.png | Bin 0 -> 1879 bytes test/text-pattern-ps-rgb24-ref.png | Bin 969 -> 969 bytes 5 files changed, 0 insertions(+), 0 deletions(-) commit 78b270601ce54545a0c68075a60a3b85a2f37adb Author: Carl Worth Date: Wed Feb 20 03:49:16 2008 -0800 Add poppler-specific reference image for source-clip-scale This one doesn't have any associated poppler bug report. The rendering by poppler is totally reasonable, and not problematic at all with respect to what the test is actually testing for. test/source-clip-scale-pdf-ref.png | Bin 0 -> 113 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 64b7489a50808bd660a47615d0775842c77dd0f2 Author: Carl Worth Date: Wed Feb 20 03:47:34 2008 -0800 Add poppler-specific reference image for push-group This is justified by the following new bug report: Incorrect clipping of group object (regression?) https://bugs.freedesktop.org/show_bug.cgi?id=14580 test/README | 5 +++++ test/push-group-pdf-ref.png | Bin 0 -> 2694 bytes test/push-group-pdf-rgb24-ref.png | Bin 0 -> 2611 bytes 3 files changed, 5 insertions(+), 0 deletions(-) commit 7aaa3e67c5016357e28476b10d768101e1e5bd41 Author: Carl Worth Date: Wed Feb 20 03:38:07 2008 -0800 Add poppler-specific reference images for tests needing EXTEND_PAD This is justified by the following new bug report: Poppler should paint images with CAIRO_EXTEND_PAD https://bugs.freedesktop.org/show_bug.cgi?id=14578 The four affected tests are: paint-source-alpha paint-with-alpha rotate-image-surface-paint scale-source-surface-paint test/README | 9 +++++++-- test/paint-source-alpha-pdf-ref.png | Bin 0 -> 473 bytes test/paint-with-alpha-pdf-ref.png | Bin 0 -> 466 bytes test/rotate-image-surface-paint-pdf-rgb24-ref.png | Bin 0 -> 207 bytes test/scale-source-surface-paint-pdf-rgb24-ref.png | Bin 0 -> 198 bytes 5 files changed, 7 insertions(+), 2 deletions(-) commit fdd046edccf283bfedb59733516f6110cc96ea82 Author: Carl Worth Date: Wed Feb 20 03:23:38 2008 -0800 Add poppler-specific reference image for text-pattern This is justified with the following new bug report: Poppler renders patterned text as black https://bugs.freedesktop.org/show_bug.cgi?id=14577 test/README | 6 ++++++ test/text-pattern-pdf-argb32-ref.png | Bin 0 -> 1823 bytes test/text-pattern-pdf-rgb24-ref.png | Bin 0 -> 508 bytes 3 files changed, 6 insertions(+), 0 deletions(-) commit 43302f0408d92138ac12afcd855d44c430074859 Author: Carl Worth Date: Wed Feb 20 03:15:17 2008 -0800 Re-enable pdf tests with gradients and add poppler-based reference images This freezes the current (buggy) poppler result in the test suite so that we will notice any future regressions. boilerplate/cairo-boilerplate-pdf.c | 42 -------------------- test/README | 47 +++++++++++++++++++++++ test/gradient-alpha-pdf-argb32-ref.png | Bin 0 -> 126 bytes test/gradient-alpha-pdf-rgb24-ref.png | Bin 0 -> 121 bytes test/gradient-alpha.c | 3 +- test/linear-gradient-pdf-ref.png | Bin 0 -> 935 bytes test/linear-gradient-reflect-pdf-argb32-ref.png | Bin 0 -> 248 bytes test/linear-gradient-reflect-pdf-rgb24-ref.png | Bin 0 -> 248 bytes test/linear-gradient.c | 3 +- test/text-pattern.c | 3 +- test/trap-clip-pdf-argb32-ref.png | Bin 0 -> 5809 bytes test/trap-clip-pdf-rgb24-ref.png | Bin 0 -> 5768 bytes test/trap-clip.c | 3 +- 13 files changed, 51 insertions(+), 50 deletions(-) commit 635fed77676f2446cbedfcf52a85f96e32c3a241 Author: Carl Worth Date: Wed Feb 20 02:24:28 2008 -0800 Re-enable some pdf tests now that poppler has knockout support We had several pdf tests disabled waiting for this bug fix: Poppler does not correctly handle knockout groups https://bugs.freedesktop.org/show_bug.cgi?id=12185 That's in place for poppler now, so we're turning the tests back on. Some of the affected tests now pass perfectly: over-above-source over-around-source over-below-source over-between-source Some just needed new reference images: operator-clear clip-operator-pdf-argb32 The remaining tests still fail, but none of the failures can obviously be ascribed to just poppler problems: clip-operator-pdf-rgb24 operator-source unbounded-operator The first two have some serious problems, while in the case of unbounded-operator the problem is extremely minor (a white grid appears in the background where the reference image is all black). boilerplate/cairo-boilerplate-pdf.c | 13 ------------- test/clip-operator-pdf-argb32-ref.png | Bin 0 -> 9096 bytes test/operator-clear-pdf-argb32-ref.png | Bin 0 -> 1438 bytes test/operator-clear-pdf-rgb24-ref.png | Bin 0 -> 1170 bytes 4 files changed, 0 insertions(+), 13 deletions(-) commit 98189d860e2c4219f994dd19fb199fcf4b457852 Author: Carl Worth Date: Wed Feb 20 01:43:51 2008 -0800 svg: Add support for flattening SOURCE painting when there's nothing beneath it This avoids unnecessary rasterization in many cases when using cairo_surface_create_similar with an SVG surface. Because of that it eliminates test-suite failures for the -similar cases where we have svg-specific reference images. Namely: font-matrix-translation, ft-text-vertical-layout-type1, ft-text-vertical-layout-type3, mask, meta-surface-pattern, paint-source-alpha, paint-with-alpha, rotate-image-surface-paint, scale-source-surface-paint, source-clip-scale, text-pattern, text-rotate In all of these cases the test suite was kindly noticing that we weren't getting the same 'native' SVG output that was desired. src/cairo-svg-surface.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) commit e7c6e291a64391004ae7bafc4d69830af5b0c8b1 Author: Carl Worth Date: Wed Feb 20 01:43:22 2008 -0800 Add svg-specific reference images for meta-surface-pattern test test/meta-surface-pattern-svg-argb32-ref.png | Bin 0 -> 3896 bytes test/meta-surface-pattern-svg-rgb24-ref.png | Bin 0 -> 4593 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit a1867412210db667a02e7b656729e2cf6a64a2d7 Author: Carl Worth Date: Wed Feb 20 01:38:59 2008 -0800 cairo-svg: Make operation_supported depend on analyze_operation instead of the other way around. This prepares for analyze_operation to be able to return more than just two values, (which will allow the svg backend to take advantage of CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY). src/cairo-svg-surface.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) commit 8f11c4583f58f97c348aafcd71db059ac7791fe7 Author: Carl Worth Date: Mon Feb 18 17:32:35 2008 -0800 Revert "[meta-surface] Adjust tolerance when replaying to surfaces with device scale" This reverts commit 7f21bfb0a8265095d68bb5ff6afae7553683a776. We don't yet have consensus on whether this is a good change or not. So for now, we're favoring the existing behavior until we can work that out. src/cairo-meta-surface.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) commit 1747718406b3450bc8869f0e050f9a18b3036030 Author: Carl Worth Date: Thu Feb 14 12:27:47 2008 -0800 Add a spline to the degenerate-pen test case This was triggering an infinite loop (with 24.8 fixed-point) just before the previous fix. NOTE: I usually put bug demonstrations just before the fixes, but this one was quite harsh---not only was cairo looping infinitely, but it was appending to an array on each iteration---so not kind at all. test/degenerate-pen-ps-argb32-ref.png | Bin 374 -> 771 bytes test/degenerate-pen-ref.png | Bin 278 -> 788 bytes test/degenerate-pen.c | 3 +++ 3 files changed, 3 insertions(+), 0 deletions(-) commit d6d81c92b501b32be6c48d134683ebd51f63c134 Author: Carl Worth Date: Sat Feb 16 13:27:02 2008 -0800 Eliminate a potential infinite loop in spline stroking Sometimes > rather than >= can make a bug difference. The infinite loop was noticed here: Infinite loop when scaling very small values using 24.8 http://bugs.freedesktop.org/show_bug.cgi?id=14280 Note that that particular test case only exposes the infinite loop when using 24.8 instead of 16.16 fixed-point values by setting CAIRO_FIXED_FRAC_BITS to 8. src/cairo-pen.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) commit 770b058c9e53c6d0e3a3f600cd5a9631eee39dff Author: Carl Worth Date: Sat Feb 16 13:17:49 2008 -0800 Remove _cairo_slope_[counter_]clockwise These two functions were hiding away some important details about strictness of inequalities. Also, the callers differ on the strictness they need. Everything is cleaner and more flexible by making the callers just call _cairo_slope_compare directly. src/cairo-path-stroke.c | 2 +- src/cairo-pen.c | 30 ++++++++++++++++-------------- src/cairo-slope.c | 23 ----------------------- src/cairoint.h | 6 ------ 4 files changed, 17 insertions(+), 44 deletions(-) commit 2d22d698d32575fd883d2be072c041709254c86d Author: Carl Worth Date: Thu Feb 14 11:50:26 2008 -0800 Make _cairo_slope_compare return a non-zero result for slopes that differ by pi This was an initial attempt to fix the infinite loop bug described here: Infinite loop when scaling very small values using 24.8 http://bugs.freedesktop.org/show_bug.cgi?id=14280 This doesn't actually fix that bug, but having a more robust comparison function can only be a good thing. src/cairo-slope.c | 30 ++++++++++++++++++++++++++++-- 1 files changed, 28 insertions(+), 2 deletions(-) commit 9292c0a1b509ecea8415cdbc21415d9ce7615e04 Author: Chris Wilson Date: Wed Feb 20 10:54:14 2008 +0000 [gitignore] Ignore cairo-no-features.h Add the autogenerated header to the ignore list. src/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e6a8768a0446b9e537bb77bd309ad5719fe74451 Author: Chris Wilson Date: Wed Feb 20 10:53:15 2008 +0000 [cairo-scaled-font-subsets] Fix memleak on failure to reserve .notdef glyph. Remember to destroy the sub_font if we fail to reserve the .notdef glyph during construction. Whilst in the vicinity, adjust the function prototype to remove duplicated calls to _cairo_error(). src/cairo-scaled-font-subsets.c | 57 ++++++++++++++++++++------------------ 1 files changed, 30 insertions(+), 27 deletions(-) commit e208f31236af6b2012d725696485f96fe4acd863 Author: Chris Wilson Date: Tue Feb 19 15:14:37 2008 +0000 [cairo-surface] Check surface status on internal paths as well. Return any error status on the surface to the caller. src/cairo-surface.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 49 insertions(+), 1 deletions(-) commit 1d59daecfe1078ba2ad56f80b35c934312dc4f6b Author: Chris Wilson Date: Tue Feb 19 15:13:53 2008 +0000 [cairo-pdf-operators] Cleanup word_wrap_stream Ensure that the stream is destroyed on the error paths. src/cairo-pdf-operators.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) commit aac5650beebb40068767a7d3ffedf634a3da5002 Author: Chris Wilson Date: Tue Feb 19 14:39:13 2008 +0000 [pdf-operators] Missing private markup. Fixup make check by adding the required cairo_private markup. src/cairo-pdf-operators-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit eaaa1415a9becb8f11ddde4094fcf0aec6d1458f Author: Adrian Johnson Date: Wed Feb 20 21:05:23 2008 +1030 Change PDF newline characters from \r\n to \n The PDF backend has always used "\r\n" for the newline character. There was no particular reason for this choice. PDF allows "\n", "\r", or "\r\n" as the end of line marker. Since the PS backend (which uses "\n") has started sharing cairo-pdf-operators.c with the PDF backend, the PS output has been getting mixed "\n" and "\r\n" newlines. Fix this by changing the PDF backend to use "\n". src/cairo-pdf-operators.c | 40 +- src/cairo-pdf-surface.c | 878 ++++++++++++++++++++++---------------------- 2 files changed, 459 insertions(+), 459 deletions(-) commit 24c319fbae9ea4a43bf4e1fdf94d069b4ad78904 Author: Bertram Felgenhauer Date: Sat Feb 16 09:22:01 2008 +0100 [perf] add tests for magnified and minified image sources. With this change, cairo's performance testsuite will catch performance regressions in pixman's fbFetchTransformed path. perf/cairo-perf-cover.c | 34 ++++++++++++++++++++++++++++++++++ 1 files changed, 34 insertions(+), 0 deletions(-) commit 21049a9a5eb7ba0873771428bde0db8f8b1ece08 Author: Antoine Azar Date: Mon Feb 18 23:57:38 2008 -0500 Added cairo-misc.c to makefile src/Makefile.win32 | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit f2d21e73827d81da559ee4cd046bfb02dfd66a83 Author: Vladimir Vukicevic Date: Mon Feb 18 17:18:51 2008 -0800 [stroker] fix _compute_normalized_device_slope to return correct sign The optimization to avoid sqrt() for horizontal/vertical lines in _compute_normalized_device_slope was causing us to return a negative magnitude with a positive slope for left-to-right and bottom-to-top lines, instead of always returning a positive magnitude and a slope with an appropriate sign. src/cairo-path-stroke.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) commit 8fb624dbf2c660fbbf6d6964f7876656e1b62e41 Author: Adrian Johnson Date: Sun Feb 17 19:49:39 2008 +1030 Use correct prefix for _cairo_pdf_operators_stroke s/operator/operators/ src/cairo-pdf-operators-private.h | 10 +++++----- src/cairo-pdf-operators.c | 10 +++++----- src/cairo-pdf-surface.c | 20 ++++++++++---------- src/cairo-ps-surface.c | 10 +++++----- 4 files changed, 25 insertions(+), 25 deletions(-) commit d2a1576941e46fb71eda8b27bd3df4de691df6ff Author: Adrian Johnson Date: Sun Feb 17 19:48:01 2008 +1030 PDF/PS: Fix mismatched save restore when using fill-stroke src/cairo-pdf-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 3a05b5d2d5989386e1500ffcf8738ca89ef8457d Author: Adrian Johnson Date: Sun Feb 17 19:45:45 2008 +1030 PDF/PS: No need to use save/restore for solid colors src/cairo-pdf-surface-private.h | 1 + src/cairo-pdf-surface.c | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) commit c7204adcf3ff6614aae75c4c1c5ef0fc5269d834 Author: Behdad Esfahbod Date: Sun Feb 17 02:32:00 2008 -0500 [cairo-misc.c] Add misc functions to this file Anything functions that doesn't group with other functions enough to justify its own file should go here now. src/Makefile.am | 1 + src/cairo-gstate.c | 79 ---------- src/cairo-misc.c | 407 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.c | 287 ------------------------------------ 4 files changed, 408 insertions(+), 366 deletions(-) commit a1360322c4e2867d7060a7f65bf0d96d9af36174 Author: Adrian Johnson Date: Sun Feb 17 17:16:53 2008 +1030 PS: Remove unused code src/cairo-ps-surface.c | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) commit 2dfe32a0ff9272ade481796f0f25fd83863c7600 Author: Adrian Johnson Date: Sun Feb 17 16:45:15 2008 +1030 Implement PDF fill-stroke src/cairo-meta-surface.c | 15 ++++++- src/cairo-pdf-operators-private.h | 8 +++ src/cairo-pdf-operators.c | 51 ++++++++++++++++++++- src/cairo-pdf-surface.c | 92 +++++++++++++++++++++++++++++++++++++ 4 files changed, 164 insertions(+), 2 deletions(-) commit 1e7fa4b9f5c478bcb7c49667192f239c2bd1d03e Author: Behdad Esfahbod Date: Sat Feb 16 22:47:31 2008 -0500 [cairo-pdf-operators] Pass matrix by reference, not by value src/cairo-pdf-operators-private.h | 4 ++-- src/cairo-pdf-operators.c | 8 ++++---- src/cairo-pdf-surface.c | 12 ++++++------ src/cairo-ps-surface.c | 9 +++++---- 4 files changed, 17 insertions(+), 16 deletions(-) commit 357f2334f0bd518815c80905e451b6ac1ba43553 Author: Adrian Johnson Date: Sat Feb 16 20:37:16 2008 +1030 PDF: Allow word_wrap_stream to split hex strings src/cairo-pdf-operators.c | 50 +++++++++++++++++++++++++++++++++++++++----- 1 files changed, 44 insertions(+), 6 deletions(-) commit 204a27aadb2390b62bd75857d8736b34870f79b1 Author: Adrian Johnson Date: Sat Feb 16 20:35:42 2008 +1030 PDF: Word wrap _cairo_pdf_operators_show_glyphs output src/cairo-pdf-operators.c | 38 ++++++++++++++++++++++++-------------- 1 files changed, 24 insertions(+), 14 deletions(-) commit bcb0395288128da7dd8f24c503b8badacc806720 Author: Behdad Esfahbod Date: Fri Feb 15 15:56:29 2008 -0500 [docs] Fix typo src/cairo-font-options.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 536e1963b774038d9afc7fbf63303e118b0250a2 Author: Shailendra Jain Date: Fri Feb 15 13:21:29 2008 +0000 Compile fix for AIX. Minor correction for a build failure on AIX: "mozilla/gfx/cairo/cairo/src/cairo-gstate.c", line 45.43: 1506-294 (S) Syntax error in expression on #if directive. (Fixes https://bugzilla.mozilla.org/show_bug.cgi?id=415867.) src/cairo-gstate.c | 2 +- src/cairo-matrix.c | 2 +- test/invalid-matrix.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) commit 31a67c5f22eb2cbb94878d47be19b32ff319c5b3 Author: Chris Wilson Date: Fri Feb 15 13:16:58 2008 +0000 [pdf] Minor make check fix. Add a missing '%' in the documentation. src/cairo-pdf-operators.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9e9fda047879f0336c2627483c78499af8ef5458 Author: Chris Wilson Date: Tue Feb 12 11:16:37 2008 +0000 [test/bitmap-font] Destroy the font options after use. Fix the leak of the font options. test/bitmap-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 92970ec83687435e75e60110cb7434670515ae57 Author: Chris Wilson Date: Mon Feb 11 17:00:30 2008 +0000 [test/invalid-matrix] Test detection of infinities. Feed infinities into the API and check that we correctly return INVALID_MATRIX. test/invalid-matrix.c | 123 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 122 insertions(+), 1 deletions(-) commit 012f68e043d3594fa6cb5235eafb1ca1bfe2d099 Author: Chris Wilson Date: Mon Feb 11 16:48:24 2008 +0000 [test/invalid-matrix] Check scale(0,0) Test that INVALID_MATRIX is returned if the user calls cairo_scale(0,0) or a variant thereof. test/invalid-matrix.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) commit eb7488e1e67b872d29d1bd459bb7994ad3789576 Author: Chris Wilson Date: Mon Feb 11 16:45:18 2008 +0000 [test/invalid-matrix] Promote incorrect status warning to an error. As the last warning for an incorrect status has been resolved, throw an error if we regress and no longer report an INVALID_MATRIX under testing. test/invalid-matrix.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit fc732c3aaa53d8abcea46ad28da696ad08d09b63 Author: Chris Wilson Date: Mon Feb 11 16:17:34 2008 +0000 [cairo-scaled-font] Create error objects on demand. In order to correctly report the error back to the user during the creation of a scaled font, we need to support a nil object per error. Instead of statically allocating all possible errors, lazily allocate the nil object the first time we need to report a particular error. This fixes the misreporting of an INVALID_MATRIX or NULL_POINTER that are common user errors during the construction of a scaled font. src/cairo-debug.c | 2 + src/cairo-mutex-list-private.h | 1 + src/cairo-scaled-font.c | 65 +++++++++++++++++++++++++++++++++++---- src/cairo.c | 10 +----- src/cairo.h | 2 +- src/cairoint.h | 15 ++++++++- test/font-options.c | 2 +- 7 files changed, 79 insertions(+), 18 deletions(-) commit 38fcc015a5106e5007035c22355da863b3bc9def Author: Chris Wilson Date: Mon Feb 11 16:14:40 2008 +0000 [cairo-ft-font] Propagate error detected during determination of scale factors. Ensure that if an invalid matrix is detected when creating the toy font, the error is propagated to the caller. src/cairo-ft-font.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit ad265cc9f26a20f2336747d69b28bc6ca0d91f4b Author: Chris Wilson Date: Mon Feb 11 14:58:21 2008 +0000 [cairo-font-options] Disallow use of NULL font-options. Partial revert of commit 0086db893cba90dc73824d77c661d2965ad48112. This is a follow to the earlier commit that allowed creation of scaled fonts using a NULL font options (by interpreting the NULL as meaning use the default options) to reflect the comments made by Behdad (http://lists.cairographics.org/archives/cairo/2008-January/012714.html). The intent is that the public font options getter/setter API has similar defensive behaviour to that of the core objects - i.e. do not overwrite the nil object and if the object is in error then return the default value. For the indirect use of a NULL/nil font options (e.g. creation of scaled fonts), then an error should be returned rather than crashing. src/cairo-font-face.c | 8 ++---- src/cairo-font-options.c | 36 ++++++++++++------------------- src/cairo-ft-font.c | 8 ++---- src/cairo-scaled-font.c | 13 +++-------- src/cairo-win32-font.c | 4 +- src/cairo.c | 10 +++----- test/font-options.c | 51 ++++++++++++++++++++++++++------------------- 7 files changed, 59 insertions(+), 71 deletions(-) commit 790eaef71cbd30e1994c9499ab553f2ef5e5d620 Author: Chris Wilson Date: Mon Feb 11 10:31:33 2008 +0000 [boilerplage] Add getopts to the boilerplate library. Remember to compile the _cairo_getopts() function into the boilerplate convenience library for cairo-perf. boilerplate/Makefile.am | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) commit fe93038ef343c769b38b9e7f15c1be415e6bcdd9 Author: Chris Wilson Date: Fri Feb 8 08:36:34 2008 +0000 [test/font-options] Check for HAVE_FCFINI Only pull in the fontconfig headers if we actually use FcFini(). test/font-options.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2eb03b8cf2b2c0520d018127b377071a8a63799d Author: Chris Wilson Date: Thu Feb 7 17:07:43 2008 +0000 [cairo-ps-surface] Tidy return from _analyze_image_transparency(). _analyze_image_transparency() only returned SUCCESS, so use the return parameter to pass back the transparency type instead of using an out parameter. src/cairo-ps-surface.c | 37 +++++++++++++------------------------ 1 files changed, 13 insertions(+), 24 deletions(-) commit bc83e028b8d12223164263a9f9cfc822ed40f8c8 Author: Chris Wilson Date: Thu Feb 7 11:47:11 2008 +0000 [cairo-output-stream] Add format(printf) markup. Add CAIRO_PRINTF_FORMAT attribute to the printf-esque output stream functions, and fixup the one warning caught by the compiler. src/cairo-output-stream-private.h | 6 ++++-- src/cairo-pdf-surface.c | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) commit 4430157841d4b55061c6af58576cfe6ec66fcfe5 Author: Chris Wilson Date: Wed Feb 6 11:37:13 2008 +0000 [test] Summarise the tests failures per backend. After the summary, show the total number of failures per backend. test/Makefile.am | 15 +++++++++++++++ 1 files changed, 15 insertions(+), 0 deletions(-) commit af88d4d9ae66152ac885531bfc73a47eb78d1d03 Author: Chris Wilson Date: Wed Jan 30 15:20:50 2008 +0000 [test/a8-mask] Fix memleak. Destroy the auxiallary surfaces and contexts. test/a8-mask.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) commit a3f071aee707e66e637587f1e9ae327b21243a60 Author: Chris Wilson Date: Wed Jan 30 15:19:49 2008 +0000 [cairo-ft-font] Tidy usage of cairo_error(). Remove a redundant use of cairo_error(NO_MEMORY). src/cairo-ft-font.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit a4c960a93cf5f37819b933d19f92e17e6c047c66 Author: Chris Wilson Date: Fri Jan 18 17:14:17 2008 +0000 [test] Add tests using each backend as a source. Inspired by bug 7362 (painting a glitz surface onto an xlib surface crashes cairo) and the lack of coverage for _cairo_paginated_surface_acquire_source_image(), these tests attempt to use each backend as a source surface for all the other backends. For example, this checks that one can construct a PS file ready for printing and then copy that surface to an image/xlib for previewing. test/.gitignore | 6 + test/Makefile.am | 19 +++- test/glitz-surface-source-ref.png | Bin 0 -> 268 bytes test/glitz-surface-source.c | 196 +++++++++++++++++++++++++++++++++++++ test/image-surface-source-ref.png | Bin 0 -> 268 bytes test/image-surface-source.c | 35 +++++++ test/pdf-surface-source-ref.png | Bin 0 -> 268 bytes test/pdf-surface-source.c | 41 ++++++++ test/ps-surface-source-ref.png | Bin 0 -> 268 bytes test/ps-surface-source.c | 41 ++++++++ test/surface-source.c | 93 +++++++++++++++++ test/svg-surface-source-ref.png | Bin 0 -> 268 bytes test/svg-surface-source.c | 41 ++++++++ test/xlib-surface-source-ref.png | Bin 0 -> 268 bytes test/xlib-surface-source.c | 76 ++++++++++++++ 15 files changed, 544 insertions(+), 4 deletions(-) commit f59f22eecba7cbf2151e01533ba936ca94d25056 Author: Chris Wilson Date: Tue Jan 29 09:29:10 2008 +0000 [check] Only build documents during make check if we have GTK_DOC Check that gtk-doc has been enabled before running attempting to build the docs during make check. doc/public/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit e5f0253b67801ad79eb881e189b9835aea0fcf57 Author: Chris Wilson Date: Tue Jan 29 09:07:14 2008 +0000 [cairo-surface] Hide the compiler warnings. Assign the return value from _cairo_surface_set_error() to hide the compiler warnings. src/cairo-surface.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) commit 53c1ed25abb7e8e22b24aa64fcd29d210c6b7903 Author: Chris Wilson Date: Tue Jan 29 08:52:28 2008 +0000 [test/a1-sample-image] Fix the memleak. Destroy the surface after use. test/a1-image-sample.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 5efc88e9108df2331772cc22dc52ef0a9cc93869 Author: Chris Wilson Date: Tue Jan 29 08:50:25 2008 +0000 [xmalloc] Hide valgrind warning. Allocate the string to the next integer boundary to hide a valgrind warning. boilerplate/xmalloc.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) commit 1faf208093a8cce77d2f7d6b248bc1eb1bd19a8a Author: Chris Wilson Date: Fri Jan 18 14:41:03 2008 +0000 [cairo-png] Improve error return for invalid parameters. Only translate an UNSUPPORTED error into a SURFACE_TYPE_MISMATCH, all others can be returned to the user unadulterated. PNG doesn't support width==0 or height==0 and generates an error whilst writing - which without further information is assumed to be a NO_MEMORY error. So check the image size at the start and return a WRITE_ERROR for a zero sized image. src/cairo-png.c | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-) commit d0cc1d929119d2e05578a60af3b873af1d7f6b13 Author: Chris Wilson Date: Fri Jan 18 14:34:41 2008 +0000 [cairo-pdf-surface] Minor code tidy. Remove code duplication. src/cairo-pdf-surface.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) commit d7ce0582f1eb86b2af5964820378b75297822dd1 Author: Chris Wilson Date: Thu Jan 17 23:18:46 2008 +0000 [test/font-options] Check the defaults values. Exercise the getters by checking that a fresh cairo_font_options_t has the default values. test/font-options.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) commit f40f24e272cf05a7a727217ae7a35844bf95f5d2 Author: Chris Wilson Date: Thu Jan 17 23:05:53 2008 +0000 [test/invalid] Test cairo_translate() and friends for NaN safety. Pass NaNs to cairo_translate() and friends and check that they raise an INVALID_MATRIX error. test/invalid-matrix.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) commit 896da0305a09e53518d6d1af6f58bbfaf3ddc89c Author: Adrian Johnson Date: Fri Feb 15 23:54:55 2008 +1030 Win32-printing: Fix meta surface patterns Ensure the win32-printing surface has the same fixes for meta surface patterns with more than one level of push/pop group that PS/PDF received in 060f384310e887f7f431a98e847b8a36fc303a0c src/cairo-win32-printing-surface.c | 28 ++++++++++++++++------------ 1 files changed, 16 insertions(+), 12 deletions(-) commit fbde0fb872a3af78236f4cbc8024d4df245de9c8 Author: Adrian Johnson Date: Fri Feb 15 08:17:25 2008 +1030 Update PS ref images test/degenerate-pen-ps-argb32-ref.png | Bin 390 -> 374 bytes test/extend-reflect-ps-ref.png | Bin 0 -> 153322 bytes test/extend-reflect-similar-ps-ref.png | Bin 0 -> 153322 bytes test/glyph-cache-pressure-ps-ref.png | Bin 0 -> 1667 bytes test/meta-surface-pattern-ps-argb32-ref.png | Bin 0 -> 3246 bytes test/meta-surface-pattern-ps-rgb24-ref.png | Bin 0 -> 3823 bytes test/random-intersections-ps-argb32-ref.png | Bin 89416 -> 89733 bytes test/random-intersections-ps-rgb24-ref.png | Bin 89414 -> 89733 bytes test/select-font-face-ps-ref.png | Bin 0 -> 1352 bytes test/show-text-current-point-ps-ref.png | Bin 0 -> 1475 bytes test/text-pattern-ps-argb32-ref.png | Bin 997 -> 998 bytes test/text-rotate-ps-argb32-ref.png | Bin 7198 -> 7156 bytes test/text-rotate-ps-rgb24-ref.png | Bin 7196 -> 7156 bytes test/trap-clip-ps-argb32-ref.png | Bin 5700 -> 5715 bytes test/trap-clip-ps-rgb24-ref.png | Bin 5616 -> 5630 bytes 15 files changed, 0 insertions(+), 0 deletions(-) commit 40d5082c24819968a5ee5a8f72e3b9cd61cb6105 Author: Adrian Johnson Date: Sun Feb 10 14:53:17 2008 +1030 PS: Use currentfile as the image data source When the emitted image is not inside a PS procedure we can use the currentfile operator as the datasource instead of an array of strings. This avoids having to read to entire image data into printer memory before the image can be decoded. This improves the performance and reduces the chance of running out of memory on printers with limited memory. src/cairo-ps-surface-private.h | 1 + src/cairo-ps-surface.c | 268 +++++++++++++++++++++++++--------------- 2 files changed, 168 insertions(+), 101 deletions(-) commit fe334bb476bb1d7496b197b47ac60167e3fb10bd Author: Adrian Johnson Date: Sun Feb 10 14:52:39 2008 +1030 PS: Use InterleaveType 2 for image and mask To be able to use the currentfile operator we need to combine the image data and mask data into the one data source. InterleaveType 2 scan line interleaves the image and data. src/cairo-ps-surface.c | 129 +++++++++++++++++------------------------------ 1 files changed, 47 insertions(+), 82 deletions(-) commit b053aaba80e1118ddd7f9c695f6491458f4f5794 Author: Adrian Johnson Date: Tue Feb 5 22:46:01 2008 +1030 PS: Don't use patterns for fill surface extend none _ps_surface_fill() can also avoid using PS patterns for EXTEND_NONE surface patterns. A clip path is set around the fill path then the surface is painted. src/cairo-ps-surface.c | 38 ++++++++++++++++++++++++++++++-------- 1 files changed, 30 insertions(+), 8 deletions(-) commit 2324a48c95d88ae0b6a066bfc9b6722f42945efa Author: Adrian Johnson Date: Tue Feb 5 22:35:06 2008 +1030 Update rotate-image-surface-paint ps ref image test/rotate-image-surface-paint-ps-argb32-ref.png | Bin 276 -> 0 bytes test/rotate-image-surface-paint-ps-ref.png | Bin 0 -> 275 bytes test/rotate-image-surface-paint-ps-rgb24-ref.png | Bin 274 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) commit 67374af22fe60c27517dd3bef2c8f3cc2f683b12 Author: Adrian Johnson Date: Tue Feb 5 22:31:58 2008 +1030 PS: Don't use patterns for paint surface extend none This is the first of four patches intended to fix the bug reported in http://lists.cairographics.org/archives/cairo/2007-December/012226.html Previously the PS backend would draw all cairo patterns (except solid colors) by emitting a PS pattern. As PS does not support non repeating patterns, the PS backend would set a large repeat step to ensure that only one copy of the pattern is on the page. Some printers with limited memory are unable to print large images inside a pattern. This was probably because when using patterns the printer tries to keep the uncompressed image in memory so it can tile the pattern. When painting surface patterns with the extend mode EXTEND_NONE we do not need to use PS patterns. The image or meta surface commands can be emitted directly. src/cairo-ps-surface-private.h | 2 + src/cairo-ps-surface.c | 234 +++++++++++++++++++++++++++------------- 2 files changed, 162 insertions(+), 74 deletions(-) commit 6f9d71c10bf3e38c88378950037d1c81a2413617 Author: Adrian Johnson Date: Thu Feb 7 00:28:19 2008 +1030 Make PS backend use cairo-pdf-operators.c Changes include: - Replace PS prolog with new prolog that emulates PDF operators - Remove the [1 0 0 -1 0 height] ctm on each page. PS and PDF surfaces now both transform all output to PS/PDF coordinates. - Invert images to match PDF images where (0,0) is top left - emit_surface_pattern now uses the same transform as PDF - move the special dash handling into cairo-pdf-operators.c src/cairo-pdf-operators.c | 82 ++++- src/cairo-ps-surface-private.h | 4 + src/cairo-ps-surface.c | 767 +++++++-------------------------------- 3 files changed, 219 insertions(+), 634 deletions(-) commit 49f755ed2d517adabcdbe9f3834ff18b220dfa7f Author: Adrian Johnson Date: Wed Jan 30 20:42:28 2008 +1100 PS: Remove the Type 3 outline glyph code This code is never used because outline glyphs that go through the fallback path are always embedded with Type 1 fallback. The only fonts that are embedded as Type 3 are bitmap fonts. src/cairo-ps-surface.c | 54 ++++------------------------------------------- 1 files changed, 5 insertions(+), 49 deletions(-) commit 0c6a362122657d5c9804fa7f45c3404aef052688 Author: Adrian Johnson Date: Wed Jan 30 20:38:17 2008 +1100 pdf-operators: only one path matrix is required The PDF emit path orginally had two matrix transforms in the path struct. One for strokes and one for fill/clip. As only one transform at a time is ever used this can be simplified. src/cairo-pdf-operators.c | 41 ++++++++--------------------------------- 1 files changed, 8 insertions(+), 33 deletions(-) commit 5639643efe12bee4252e8cb433d343999e34ec32 Author: Adrian Johnson Date: Wed Jan 30 20:16:08 2008 +1100 Add PS linecap path workarounds to pdf_operators So that pdf_operators can be used by the PS backend. PDF also needs this workaround. src/cairo-pdf-operators.c | 123 +++++++++++++++++++++++++++++++------------- 1 files changed, 86 insertions(+), 37 deletions(-) commit 0987fdee24d60573249a7fa3acc15e67454bd8b3 Author: Adrian Johnson Date: Wed Jan 30 17:22:52 2008 +1100 Add word_wrap stream to pdf-operators The word_wrap stream in ps-surface will be removed in a later commit. src/cairo-pdf-operators.c | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 114 insertions(+), 0 deletions(-) commit d05f08bceebe832844ab97a5660af4fa1452697d Author: Behdad Esfahbod Date: Tue Feb 12 15:44:21 2008 -0500 [configure.in] Make PS/PDF/SVG default enabled Previously they were default auto-detected. We really want people have to go out of their way to not build them, hence the change. configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit fd3181c7bfdb468557d8c845a016b19c5a897955 Author: Adrian Johnson Date: Tue Feb 12 20:22:38 2008 +1030 PDF: Remove stale comments src/cairo-pdf-surface.c | 23 ----------------------- 1 files changed, 0 insertions(+), 23 deletions(-) commit bdb857a78b41d926b1c239cf988539842a72130b Author: Adrian Johnson Date: Tue Feb 12 20:19:03 2008 +1030 PDF: Fix uninitialized variable in previous commit src/cairo-pdf-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit ba6788fc968477cfae6ed76414dd91b21671d028 Author: Kristian Høgsberg Date: Mon Feb 11 13:44:48 2008 -0500 [pdf] Use compressed PDF stream instead of compress_dup() The deflate stream has bounded (constant) memory overhead, whereas compress_dup() allocates memory proportional to the uncompressed data. This replaces compress_dup() usage with a compressed PDF stream for emitting images, alpha masks and font subsets, and eliminates the compress_dup() function. src/cairo-pdf-surface.c | 204 +++++++++++++---------------------------------- 1 files changed, 55 insertions(+), 149 deletions(-) commit e68584d3a16da7db30bc53a42fa8367c8356bd7e Author: Behdad Esfahbod Date: Fri Feb 8 17:36:59 2008 -0500 [xlib] Move multiple CAIRO_MUTEX_INITIALIZE into one place they all end up anyway src/cairo-xlib-surface.c | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) commit 0626cac6dba91d0ee20458858275745b7c6a1bfd Author: Peter Weilbacher Date: Fri Feb 8 15:09:19 2008 +0100 [os2] fix typo in comment src/cairo-os2-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b4fe25d9afff5d5b0ebaa315ad0e42f36853d5d1 Author: Peter Weilbacher Date: Fri Feb 8 15:04:49 2008 +0100 [os2] only call FcInit/Fini when compiled with FT font backend src/cairo-os2-surface.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 5e9cdcca00a490f3a36b4229f5353d795ca53a5d Author: Antoine Azar Date: Thu Feb 7 17:09:41 2008 -0500 Fixed rounding function call test/get-path-extents.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 80e11a85a95c5f2c814eef90a8e6ab60c8835104 Author: Vladimir Vukicevic Date: Thu Feb 7 14:36:39 2008 -0800 [pdf] restore alpha_size back to correct bit size src/cairo-pdf-surface.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 95db215cc15d228fcb38bc43d2d918fccec0a9cd Author: Azar@.(none) Date: Fri Feb 1 18:45:59 2008 -0800 Some fixes and improvements to the Win32 build Makefile.win32 | 32 ++++- boilerplate/Makefile.win32 | 25 +++- boilerplate/cairo-boilerplate-getopt.c | 250 ++++++++++++++++++++++++++++++++ boilerplate/cairo-boilerplate-getopt.h | 63 ++++++++ boilerplate/cairo-boilerplate.h | 4 + perf/Makefile.win32 | 54 ++++++- perf/cairo-perf.c | 7 +- perf/cairo-perf.h | 2 +- perf/world-map.c | 2 + src/Makefile.win32 | 36 ++++- test/Makefile.win32 | 25 +++- test/font-matrix-translation.c | 2 +- test/pdiff/Makefile.win32 | 3 + 13 files changed, 470 insertions(+), 35 deletions(-) commit 7800cfd7de347bb8c54fc36ed886018a2d9ec503 Author: Carl Worth Date: Wed Feb 6 17:00:29 2008 -0800 Add several Makefile.win32 files to EXTRA_DIST Otherwise, these files were being omitted from the tar files. Makefile.am | 2 ++ boilerplate/Makefile.am | 2 ++ perf/Makefile.am | 2 ++ src/Makefile.am | 2 ++ test/Makefile.am | 2 ++ 5 files changed, 10 insertions(+), 0 deletions(-) commit ac743e25fa7f8bd720219a5c909fe8bbd20b11b2 Author: Carl Worth Date: Thu Jan 31 16:13:44 2008 +1100 cairo_xlib_surface_create_similar: Pass the original drawable to XCreatePixmap Previously we were passing the root window of the same screen. Letting the X server know the actual Drawable for which we're trying to be similar allows the X server to be more efficient. src/cairo-xlib-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit cb9f9086a1c8ad312cfc5314fc8e352a6046d75e Merge: c11b036... a9b0e54... Author: Peter Weilbacher Date: Thu Feb 7 00:07:20 2008 +0100 Merge branch 'master' of ssh://pmw@git.freedesktop.org/git/cairo commit c11b036b75f3c71ff57ff4578b388bf5e35b2057 Author: Peter Weilbacher Date: Thu Feb 7 00:03:33 2008 +0100 [os2] Improve documentation Move the API documentation for the OS/2 backend from the .h file to the .c file and use the correct format. src/cairo-os2-surface.c | 139 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-os2.h | 115 --------------------------------------- 2 files changed, 139 insertions(+), 115 deletions(-) commit a9b0e54d386811dc750b5e676a0dfd84c32f4625 Author: Vladimir Vukicevic Date: Wed Feb 6 13:52:33 2008 -0800 Avoid buffer overflow in ps/pdf surface A few places weren't using _cairo_malloc_*; fixed. src/cairo-pdf-surface.c | 22 ++++++++++++++++------ src/cairo-ps-surface.c | 4 ++-- 2 files changed, 18 insertions(+), 8 deletions(-) commit bf1f7f70b61b5bb657b2531dab63c541ac8fb59d Author: Vladimir Vukicevic Date: Wed Feb 6 13:01:52 2008 -0800 Do correct calculation of pen dimensions for stroke optimization src/cairo-path-stroke.c | 33 +++++++++++++-------------------- src/cairo-rectangle.c | 2 +- src/cairo-stroke-style.c | 17 +++++++++++++++++ src/cairoint.h | 11 ++++++++++- 4 files changed, 41 insertions(+), 22 deletions(-) commit e104fcab1c8c8d9a7a7962a1dbea0c87867c8f9a Author: Alp Toker Date: Thu Jan 31 01:33:50 2008 +0000 Introduce cairo_has_current_point() cairo_has_current_point() can be used to determine whether a current point is defined. We introduce this new symbol with a boolean return value to avoid the versioning ambiguity of modifying cairo_get_current_point(). This way we also don't have to map what should be a routine operation to an error condition as was previously proposed. doc/public/cairo-sections.txt | 1 + src/cairo.c | 25 +++++++++++++++++++++++-- src/cairo.h | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) commit 1f0c3d06895ebcbfbae252e6b7298da0b64b37a9 Author: Alp Toker Date: Thu Jan 31 00:54:52 2008 +0000 Revert "Change cairo_get_current_point() to return cairo_status_t instead of void" This reverts commit b3eea75d1f7b56c2046b5387a5eb186d8f154184. Reverted in favour of an alternative approach. Conflicts: src/cairo.c src/cairo.c | 22 ++++------------------ src/cairo.h | 2 +- 2 files changed, 5 insertions(+), 19 deletions(-) commit 4c005f7ce385f3f8b161cffac11bb9766f4ef9a9 Author: Azar@.(none) Date: Fri Feb 1 14:29:24 2008 -0800 replaced round with _cairo_lround. Round doesn't compile on Win32 test/get-path-extents.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1d93e148766ded8f3105277f944849f6297974fb Author: Vladimir Vukicevic Date: Tue Feb 5 16:14:51 2008 -0800 Followup patch to dashed stroke optimization Make sure that we don't test lines that start or end inside the box, since our algorithm will find intersections on the wrong ends on the line, and not count them. src/cairo-rectangle.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit 7b788ce7cace4fd24c568248c22b4ec6c88b563b Author: Vladimir Vukicevic Date: Tue Feb 5 15:04:38 2008 -0800 Update test ref images that changed with stroking changes test/dash-scale-ref.png | Bin 7908 -> 8035 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 4471e58c12c20723f1ddac3d0284239be6eb27a8 Author: Vladimir Vukicevic Date: Mon Feb 4 03:55:55 2008 -0800 Optimize dashed strokes, part 2 Pass down the bounding box to the stroker, and avoid doing expensive calculations for dash segments that are outside the box. src/cairo-path-stroke.c | 122 ++++++++++++++++++++++++++++++++--------------- src/cairo-rectangle.c | 94 ++++++++++++++++++++++++++++++++++++ src/cairo-traps.c | 8 +++ src/cairoint.h | 10 ++++ 4 files changed, 195 insertions(+), 39 deletions(-) commit afbd82671fe5ebebe5d58bef3d372312be1c5aeb Author: Vladimir Vukicevic Date: Sat Feb 2 23:48:16 2008 -0800 Optimize stroker by hoisting some calculations out of loops sqrt and a few other floating-point operations were being done repeatedly within a loop; those are now precalculated and passed down where needed. src/cairo-path-stroke.c | 142 +++++++++++++++++++++++++++++------------------ 1 files changed, 87 insertions(+), 55 deletions(-) commit bda0baa255801dbc21b63b364eff32de98dd6c7f Author: Vladimir Vukicevic Date: Tue Feb 5 15:04:15 2008 -0800 Fix text-zero-len on ATSUI to not infinite loop src/cairo-atsui-font.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit 03256d0f2be15e7ba57bc041f8cdfc1c3e718660 Author: Vladimir Vukicevic Date: Tue Feb 5 15:04:11 2008 -0800 Remove get-xrender-format from list of tests to be run on all platforms test/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 6140776b4e7d5787467606fbe8a961dbee6bd9fb Author: Adrian Johnson Date: Tue Feb 5 00:22:26 2008 +1030 Update operator-source ps ref images test/operator-source-ps-argb32-ref.png | Bin 4053 -> 4026 bytes test/operator-source-ps-rgb24-ref.png | Bin 2567 -> 3366 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit dee6e27537a26e93266c0a2d2071ad8d4ed2c9ee Author: Adrian Johnson Date: Tue Feb 5 00:12:48 2008 +1030 Add dash-curve ps ref image test/dash-curve-ps-ref.png | Bin 0 -> 27206 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 2b0da0503baba111085a23e5e5e5feb8788d6650 Author: Adrian Johnson Date: Tue Feb 5 00:02:17 2008 +1030 Ensure PS/PDF miter is >= 1.0 The PS Language Reference requires the PS miter to be >= 1. The PDF Reference does not specify miter limits however acroread fails to display pages when the miter is < 1. Older versions of ghostscript crash when the PDF miter is < 1. src/cairo-pdf-operators.c | 2 +- src/cairo-ps-surface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 381fcf01d71d6c83183f9764507ebbafd783d18a Author: Adrian Johnson Date: Sun Feb 3 20:05:41 2008 +1030 Update over-around-source ps ref image test/over-around-source-ps-argb32-ref.png | Bin 637 -> 632 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 9dda017af9bffeda59756cb3b15028ae83ed19ef Author: Adrian Johnson Date: Sun Feb 3 19:53:35 2008 +1030 Update gradient-alpha ps ref images test/gradient-alpha-ps-argb32-ref.png | Bin 187 -> 179 bytes test/gradient-alpha-ps-rgb24-ref.png | Bin 184 -> 179 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 3f943a98f69b90b066217b19c47851ce03e50551 Author: Adrian Johnson Date: Sun Feb 3 19:49:23 2008 +1030 Add linear-gradient-reflect ps ref image test/linear-gradient-reflect-ps-ref.png | Bin 0 -> 315 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit a74e6692341daeff9ab266b3b29fcc8b8e917d88 Author: Adrian Johnson Date: Sun Feb 3 19:34:53 2008 +1030 PS: Implement reflected surface patterns The image/meta-pattern is written once. A PS pattern twice the size of the cairo pattern is created and the surface drawn four times in a reflect pattern inside the PS pattern. This fixes the extend-reflect and extend-reflect-similar PS test failures. src/cairo-ps-surface.c | 41 +++++++++++++++++++++++++++++++++-------- 1 files changed, 33 insertions(+), 8 deletions(-) commit 7c5bc5fde819014f62ebb9bac86d4529f056956d Author: Adrian Johnson Date: Sun Feb 3 18:58:02 2008 +1030 Add operator-clear ps ref image test/operator-clear-ps-argb32-ref.png | Bin 0 -> 1409 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 06b2d009ba50a2908fd9c93ff3e467f511b233cf Author: Adrian Johnson Date: Sun Feb 3 18:50:14 2008 +1030 Update clip-operator ps ref image test/clip-operator-ps-argb32-ref.png | Bin 8594 -> 9062 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 13663d1d500a6c2254097011e66199d6dd81c62d Author: Adrian Johnson Date: Sun Feb 3 17:10:56 2008 +1030 PS: Implement linear gradient repeat and reflect src/cairo-ps-surface.c | 250 +++++++++++++++++++++++++++++++++++++----------- 1 files changed, 196 insertions(+), 54 deletions(-) commit 92a2e851df6668f60c63165466d2ee85dd600f47 Author: Adrian Johnson Date: Sat Feb 2 23:00:30 2008 +1030 Update operator-source PS ref images test/operator-source-ps-argb32-ref.png | Bin 3885 -> 4053 bytes test/operator-source-ps-rgb24-ref.png | Bin 3548 -> 2567 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 367e50137eb1b2b3952a87c580eed08a79fd211f Author: Adrian Johnson Date: Sat Feb 2 20:59:56 2008 +1030 PDF: Use correct surface size when emitting patterns Store the surface size in each pattern and smask group and use this size when the pattern/group is emitted. This is required as a pattern or group may be used from a meta surface with a different size to the PDF surface. However the pattern or group is emitted after the the meta surface content has been emitted and the surface size has been restored to the the page size. This fixes the following pdf test failures: extend-reflect-similar extend-repeat-similar mask src/cairo-pdf-surface-private.h | 4 +++ src/cairo-pdf-surface.c | 53 ++++++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 6 deletions(-) commit d08d5c421a45c4e5f30b308823e90a86f1ec2052 Author: Carl Worth Date: Wed Jan 30 05:35:50 2008 -0800 Increment cairo version to 1.5.9 after the 1.5.8 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4ccb8cb29546432858e778e1b88cada1327f6f45 Author: Carl Worth Date: Wed Jan 30 05:16:26 2008 -0800 Add some more reference images to REFERENCE_IMAGES test/Makefile.am | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit b31a7a904f8413c34970beabce6fecf6e1fdc925 Author: Carl Worth Date: Wed Jan 30 05:13:53 2008 -0800 Increment cairo version to 1.5.8 and libtool version to 16:0:14 configure.in | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit ca10920cc9f3a673e2199112541d5a1472423c47 Author: Carl Worth Date: Wed Jan 30 05:07:20 2008 -0800 Add a1-image-sample and a1-traps-sample reference images to the dist list test/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2fee01e2d40715defe9143456101533c1f1aafcf Author: Carl Worth Date: Wed Jan 30 04:54:39 2008 -0800 check-doc-syntax.sh: Fix for non-srcdir builds (such as make distcheck) src/check-doc-syntax.sh | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit 78022f3aa16cf8a629aec4595c5a542ca68a78cc Author: Carl Worth Date: Wed Jan 30 04:54:05 2008 -0800 Add doc/public test scripts to EXTRA_DIST This prevents failures of make distcheck doc/public/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit d49b1220b2feeca82050de05c9c01012e8420acb Author: Carl Worth Date: Wed Jan 30 04:52:23 2008 -0800 Remove extend-pad-similar test case This seems redundant with the recent testing of all test cases against similar surfaces. Plus, it hasn't had a reference image anyway which was causing problems with the recent extra checks for missing reference images. test/Makefile.am | 3 - test/extend-pad-similar.c | 105 --------------------------------------------- 2 files changed, 0 insertions(+), 108 deletions(-) commit 7d2fda54f9bf6ae48cf8048b4836dea7f20cccee Author: Carl Worth Date: Wed Jan 30 04:23:19 2008 -0800 NEWS: Add notes for the 1.5.8 snapshot NEWS | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 103 insertions(+), 0 deletions(-) commit 3b0adf4f5ac78e3f19b4e19267da2aa1b3c7d57b Author: Jeff Muizelaar Date: Tue Jan 29 09:07:54 2008 -0800 Use ADD instead of IN for clipping. ADD is already special-cased by pixman, so using it instead avoids hitting the slower general path. src/cairo-clip.c | 34 ++++++++++++++++++++++++++++++++-- 1 files changed, 32 insertions(+), 2 deletions(-) commit fa6aedf2d68941bf8532bf487d5412cfc508e0a9 Author: Carl Worth Date: Tue Jan 29 09:01:47 2008 -0800 Fix typo in printf arguments in error message test/font-matrix-translation.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e2bb36fe08546e6461fcbd40f5f3f81e5efc7686 Author: Carl Worth Date: Tue Jan 29 08:41:21 2008 -0800 wAdd proper error propagation to _cairo_matrix_compute_scale_factors Before there was just an assert statement here that the determinant of the matrix was not infinite. That was bogus since a user-provided can end up here. So instead, do the correct error propagation of any CAIRO_STATUS_INVALID_MATRIX error as necessary. This eliminates the current failure of the invalid-matrix test case. src/cairo-atsui-font.c | 56 ++++++++++++++++++++++++++++++++++------------ src/cairo-ft-font.c | 20 +++++++++++----- src/cairo-matrix.c | 7 ++++- src/cairo-scaled-font.c | 13 +++++++--- src/cairo-win32-font.c | 20 ++++++++++------ src/cairoint.h | 4 +- 6 files changed, 83 insertions(+), 37 deletions(-) commit 849322235764f570a4a3a1217960d096d16165cf Author: Carl Worth Date: Tue Jan 29 05:40:39 2008 -0800 Initialize return values for cairo_*_extents in case of error Previously we left the return values alone, which set the user up for a nasty trap, (using potentially uninitialized values with no indication that there was an error). So now we initialize these values to 0.0 if the cairo_t is in error. The fixed functions include: cairo_path_extents cairo_stroke_extents cairo_fill_extents cairo_clip_extents cairo_font_extents src/cairo.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 50 insertions(+), 4 deletions(-) commit 6bdba4b4be5e66ffa61e164f8098b76d848e8f32 Author: Carl Worth Date: Tue Jan 29 05:27:10 2008 -0800 Add missing libcairo_font_subset_sources to fix the build src/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 3d82056cee0ba960ebb61877fec8aa646e60e990 Author: Nis Martensen Date: Tue Jan 29 05:32:24 2008 -0500 Fix typos src/cairo.h | 4 ++-- src/check-doc-syntax.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit b28f4f57f21ac4091c9457873abe1465ec3f7fed Author: Behdad Esfahbod Date: Tue Jan 29 04:32:39 2008 -0500 [src/Makefile.am] Reorganize Main goal was to be able to pass list of all cairo sources, enabled or not, to check-doc-syntax.sh such that it doesn't check *.h, *.c, *.cpp because that can be annoying when bisecting. src/Makefile.am | 352 +++++++++++++++++++++++++--------------------- src/check-doc-syntax.sh | 5 +- 2 files changed, 195 insertions(+), 162 deletions(-) commit 41a57007939a3e206647fda1b6e5a554ca125c5f Author: Adrian Johnson Date: Tue Jan 29 20:27:06 2008 +1100 Fix undefined macro that was preventing the tests from compiling test/pattern-getters.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) commit cfce362375963502c4d29089b369d8e5ce2b7dcb Author: Behdad Esfahbod Date: Tue Jan 29 01:27:47 2008 -0500 [cairo_operator_t] Mark DestAtop unbounded and document boundedness src/cairo.h | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit f9b90e475ed6009e58e5f11ac713f9ea639a6900 Author: Behdad Esfahbod Date: Tue Jan 29 01:20:03 2008 -0500 [doc] Fix cairo_operator_t docs to make Carl (and Keith) happy src/cairo.h | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-) commit 9ee7a48b33f11a42b0ffd12a9192a328e35233f3 Author: Behdad Esfahbod Date: Tue Jan 29 00:50:48 2008 -0500 [Makefile.am] Minor wording change Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 013781137ff4940d0b9e04b656c20af37bbd5333 Author: Behdad Esfahbod Date: Tue Jan 29 00:42:51 2008 -0500 [cairo-image-surface.c] Cleanup stride checking and improve docs src/cairo-image-surface.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit 8e3250b8564a346c61e926a6aa61f18ae3f60c93 Author: Behdad Esfahbod Date: Tue Jan 29 00:36:38 2008 -0500 [Makefile.am] Remove ROADMAP and TODO from dist files Makefile.am | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) commit 81e4cc3bd7d1fec659a19f8b37253aaebe12c99b Author: Behdad Esfahbod Date: Tue Jan 29 00:36:16 2008 -0500 [cairo_image_surface_create_for_data] Document stride error status src/cairo-image-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 6153a3b620641b1fb7b64a050a168482d2a42f2c Author: Behdad Esfahbod Date: Tue Jan 29 00:34:00 2008 -0500 [doc] Run check-doc-syntax.sh for SGML docs too doc/public/Makefile.am | 4 ++-- doc/public/check-doc-syntax.sh | 11 +++++++++++ src/check-doc-syntax.sh | 33 ++++++++++++++++++++++++--------- 3 files changed, 37 insertions(+), 11 deletions(-) commit 3f7d301786ce345cc4221f434bda6751e9b97ad1 Author: Behdad Esfahbod Date: Mon Jan 28 23:56:23 2008 -0500 [src/check-doc-syntax.sh] Skip test if GNU grep is not available src/check-doc-syntax.sh | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 247e1011995b0241526262cc36eb34c7e5edd47c Author: Carl Worth Date: Mon Jan 28 21:24:56 2008 -0800 Fix bitmap-font test by using near-equality for double comparison test/bitmap-font.c | 11 ++++++----- test/cairo-test.h | 2 ++ test/pattern-getters.c | 4 +--- 3 files changed, 9 insertions(+), 8 deletions(-) commit 468caac068d3d25507d901f069e3e55731a27ae9 Author: Behdad Esfahbod Date: Mon Jan 28 23:30:09 2008 -0500 [configure.in] Minor change to cairo-features.h comments to make tests pass configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b4c7a0dc6e996e47390ae544f82024afbb7859ed Author: Behdad Esfahbod Date: Mon Jan 28 23:27:10 2008 -0500 [doc] Document CAIRO_HAS_* macros. We now finally have real 100% coverage. doc/public/Makefile.am | 2 ++ doc/public/cairo-sections.txt | 9 +++++++++ doc/public/tmpl/cairo-ft.sgml | 8 ++++++++ doc/public/tmpl/cairo-pdf.sgml | 8 ++++++++ doc/public/tmpl/cairo-png.sgml | 9 +++++++++ doc/public/tmpl/cairo-ps.sgml | 8 ++++++++ doc/public/tmpl/cairo-svg.sgml | 8 ++++++++ doc/public/tmpl/cairo-win32-fonts.sgml | 8 ++++++++ doc/public/tmpl/cairo-win32.sgml | 8 ++++++++ doc/public/tmpl/cairo-xlib-xrender.sgml | 8 ++++++++ doc/public/tmpl/cairo-xlib.sgml | 8 ++++++++ 11 files changed, 84 insertions(+), 0 deletions(-) commit 47e0ecbea51cae73a85db277972b80eff0c4b9f6 Author: Behdad Esfahbod Date: Mon Jan 28 23:26:35 2008 -0500 [configure.in] Generate a cairo-no-features.h with macros for disabled supported backends to trick gtk-doc with it. configure.in | 33 ++++++++++++++++++++++++++++++++- src/Makefile.am | 6 +++--- src/check-headers.sh | 2 +- 3 files changed, 36 insertions(+), 5 deletions(-) commit 9d8990b6bdec8e574e37346c363b3a850a246452 Author: Behdad Esfahbod Date: Mon Jan 28 23:23:00 2008 -0500 [doc] Remove excess paranthesis src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6e495e94886dfa80f11f675a4b7fa3a767671cc0 Author: Behdad Esfahbod Date: Mon Jan 28 23:10:28 2008 -0500 [doc] More syntax fixes doc/public/tmpl/cairo-version.sgml | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit a00d71968285fc8c49903c1c84835a8be32cfbd3 Author: Behdad Esfahbod Date: Mon Jan 28 23:05:00 2008 -0500 [configure.in] Add commented-out #undef's for disable stable backends in cairo-features.h configure.in | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 6a089247a180cbc85e222520d2d93914434027be Author: Behdad Esfahbod Date: Mon Jan 28 22:45:06 2008 -0500 [doc] Rename cairo-font.sgml to cairo-font-face.sgml doc/public/cairo-docs.xml | 2 +- doc/public/cairo-sections.txt | 2 +- doc/public/tmpl/cairo-font-face.sgml | 112 ++++++++++++++++++++++++++++++++++ doc/public/tmpl/cairo-font.sgml | 112 ---------------------------------- 4 files changed, 114 insertions(+), 114 deletions(-) commit 1d17a7f7811b15c72a4091663e01a448f538bc68 Author: Behdad Esfahbod Date: Mon Jan 28 22:42:46 2008 -0500 [doc] Document the surface type of win32-printing surface being different doc/public/tmpl/cairo-win32.sgml | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) commit a55f65b5d29060a7f8033ceea211252431d20b77 Author: Behdad Esfahbod Date: Mon Jan 28 22:25:37 2008 -0500 [doc] Fix typo src/cairo-pattern.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 52cc603db1a805a0b3a8d7eba3171cd2785f10a7 Author: Behdad Esfahbod Date: Mon Jan 28 22:10:20 2008 -0500 [doc] Stricter syntax check for type names, update test src/cairo-array.c | 2 +- src/cairo-cache-private.h | 2 +- src/cairo-font-face.c | 4 ++-- src/cairo-ft-font.c | 4 ++-- src/cairo-image-surface.c | 2 +- src/cairo-paginated-private.h | 8 ++++---- src/cairo-ps-surface.c | 2 +- src/cairo-ps.h | 2 +- src/cairo-region-private.h | 2 +- src/cairo-scaled-font-subsets-private.h | 16 ++++++++-------- src/cairo-scaled-font.c | 2 +- src/cairo-svg.h | 2 +- src/cairo-types-private.h | 2 +- src/cairo-win32-font.c | 2 +- src/cairo.c | 2 +- src/cairo.h | 24 ++++++++++++------------ src/cairoint.h | 2 +- src/check-doc-syntax.sh | 9 +++++---- 18 files changed, 45 insertions(+), 44 deletions(-) commit b790c5a6bcdd890c16d21753407188ed200ce445 Author: Behdad Esfahbod Date: Mon Jan 28 21:53:44 2008 -0500 [doc] Replace 'NOTE' by 'Note' and add it to test src/cairo-bentley-ottmann.c | 2 +- src/cairo-cache.c | 4 ++-- src/cairo-ft-font.c | 4 ++-- src/cairo-lzw.c | 4 ++-- src/cairo-output-stream-private.h | 2 +- src/cairo-paginated-private.h | 4 ++-- src/cairo-path.c | 2 +- src/cairo-pen.c | 4 ++-- src/cairo-scaled-font.c | 4 ++-- src/cairo-slope.c | 2 +- src/cairo-surface.c | 4 ++-- src/cairo-win32-surface.c | 4 ++-- src/cairo-xcb-surface.c | 4 ++-- src/cairo-xlib-surface.c | 4 ++-- src/cairo.c | 4 ++-- src/check-doc-syntax.sh | 7 +++++++ 16 files changed, 33 insertions(+), 26 deletions(-) commit f0633f4449c39a8f78c582790fb5dc85899b5d82 Author: Behdad Esfahbod Date: Mon Jan 28 21:49:57 2008 -0500 [doc] Make sure all function names in docs are followed by () src/cairo-array.c | 2 +- src/cairo-base85-stream.c | 3 +-- src/cairo-beos-surface.cpp | 2 +- src/cairo-cache-private.h | 4 ++-- src/cairo-debug.c | 4 ++-- src/cairo-deflate-stream.c | 3 +-- src/cairo-ft-font.c | 4 ++-- src/cairo-image-surface.c | 4 ++-- src/cairo-output-stream-private.h | 3 +-- src/cairo-output-stream.c | 3 +-- src/cairo-paginated-private.h | 2 +- src/cairo-path-fixed-private.h | 2 +- src/cairo-path.c | 6 +++--- src/cairo-pdf-surface.c | 4 ++-- src/cairo-ps-surface.c | 6 +++--- src/cairo-quartz-surface.c | 2 +- src/cairo-scaled-font-subsets-private.h | 2 +- src/cairo-scaled-font.c | 8 ++++---- src/cairo-surface.c | 6 +++--- src/cairo-svg-surface.c | 4 ++-- src/cairo-traps.c | 2 +- src/cairo-types-private.h | 4 ++-- src/cairo-unicode.c | 3 +-- src/cairo.c | 30 ++++++++++++++---------------- src/cairo.h | 22 +++++++++++----------- src/cairoint.h | 8 ++++---- 26 files changed, 68 insertions(+), 75 deletions(-) commit 9ba8f6b1b0a4fbf2407e0dbd767f043c6920344c Author: Behdad Esfahbod Date: Mon Jan 28 21:49:26 2008 -0500 [src/check-doc-syntax.sh] Check for various doc syntax consistency rules src/Makefile.am | 2 +- src/check-doc-syntax.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletions(-) commit e15fcdd74734e922183afd4732ec4ba090f313c9 Author: Behdad Esfahbod Date: Mon Jan 28 21:48:23 2008 -0500 [doc] Improve syntax doc/public/tmpl/cairo-font.sgml | 7 +++++-- doc/public/tmpl/cairo-matrix.sgml | 2 +- doc/public/tmpl/cairo-pattern.sgml | 12 +++++++++--- doc/public/tmpl/cairo-status.sgml | 5 +++-- doc/public/tmpl/cairo-surface.sgml | 8 +++++++- doc/public/tmpl/cairo-xcb-xrender.sgml | 3 ++- doc/public/tmpl/cairo-xcb.sgml | 3 ++- doc/public/tmpl/cairo-xlib-xrender.sgml | 3 ++- doc/public/tmpl/cairo-xlib.sgml | 3 ++- 9 files changed, 33 insertions(+), 13 deletions(-) commit 587508528c4a318649ecb347b96fbc89a40175ea Author: Behdad Esfahbod Date: Mon Jan 28 21:12:16 2008 -0500 [doc] Minor improvement doc/public/tmpl/cairo-beos.sgml | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit fd5dfedbb75593539eeda92013042ce5423a65c4 Author: Behdad Esfahbod Date: Mon Jan 28 21:02:44 2008 -0500 [doc/public/check-doc-coverage.sh] Test that doc coverage is 100% Yay! doc/public/Makefile.am | 2 + doc/public/check-doc-coverage.sh | 43 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 0 deletions(-) commit c133ee5acc7c97fcd43d61f5aad160ca96c47941 Author: Behdad Esfahbod Date: Mon Jan 28 21:00:21 2008 -0500 [doc] Improve docs for new API src/cairo-image-surface.c | 8 ++++---- src/cairo-xlib-surface.c | 20 +++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) commit 0d898f2badf41d3b0ae5ee88943c44cf49690f5d Author: Behdad Esfahbod Date: Mon Jan 28 20:49:44 2008 -0500 [doc] Make sure all type names in docs are prefixed by # src/cairo-array.c | 2 +- src/cairo-bentley-ottmann.c | 4 ++-- src/cairo-cache-private.h | 4 ++-- src/cairo-cache.c | 2 +- src/cairo-fixed-type-private.h | 2 +- src/cairo-font-face.c | 12 ++++++------ src/cairo-font-options.c | 2 +- src/cairo-ft-font.c | 12 ++++++------ src/cairo-gstate.c | 8 ++++---- src/cairo-hash.c | 2 +- src/cairo-image-surface.c | 4 ++-- src/cairo-matrix.c | 10 +++++----- src/cairo-mutex-type-private.h | 6 +++--- src/cairo-pattern.c | 10 +++++----- src/cairo-pdf-surface.c | 2 +- src/cairo-png.c | 2 +- src/cairo-ps-surface.c | 12 ++++++------ src/cairo-quartz-surface.c | 2 +- src/cairo-rectangle.c | 8 ++++---- src/cairo-region.c | 2 +- src/cairo-scaled-font-subsets-private.h | 8 ++++---- src/cairo-scaled-font.c | 8 ++++---- src/cairo-traps.c | 2 +- src/cairo-types-private.h | 2 +- src/cairo-win32-surface.c | 2 +- src/cairo-xlib-surface.c | 4 ++-- src/cairo.c | 4 ++-- src/cairo.h | 16 ++++++++-------- src/cairoint.h | 4 ++-- 29 files changed, 79 insertions(+), 79 deletions(-) commit 9ecde82d35ead4975ce110bb2012264e3ca9d2e1 Author: Behdad Esfahbod Date: Mon Jan 28 20:48:48 2008 -0500 [doc] Make sure all macro names in docs are prefixed by % src/cairo-array.c | 6 ++-- src/cairo-bentley-ottmann.c | 8 +++--- src/cairo-cache.c | 6 ++-- src/cairo-deprecated.h | 2 +- src/cairo-directfb.h | 4 +- src/cairo-fixed-type-private.h | 2 +- src/cairo-freelist-private.h | 4 +- src/cairo-ft-font.c | 6 ++-- src/cairo-gstate.c | 14 +++++----- src/cairo-hash.c | 36 +++++++++++++------------- src/cairo-image-surface.c | 4 +- src/cairo-lzw.c | 14 +++++----- src/cairo-meta-surface.c | 6 ++-- src/cairo-mutex-private.h | 4 +- src/cairo-mutex-type-private.h | 24 +++++++++--------- src/cairo-os2.h | 6 ++-- src/cairo-output-stream-private.h | 6 ++-- src/cairo-paginated-private.h | 4 +- src/cairo-path-fill.c | 2 +- src/cairo-path.c | 12 ++++---- src/cairo-pattern.c | 2 +- src/cairo-pdf-surface.c | 2 +- src/cairo-png.c | 10 +++--- src/cairo-ps-surface.c | 12 ++++---- src/cairo-scaled-font-subsets-private.h | 42 +++++++++++++++--------------- src/cairo-scaled-font.c | 4 +- src/cairo-surface-fallback.c | 6 ++-- src/cairo-surface.c | 10 +++--- src/cairo-svg-surface.c | 4 +- src/cairo-types-private.h | 4 +- src/cairo-win32-font.c | 4 +- src/cairo-win32-surface.c | 10 +++--- src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 4 +- src/cairo.c | 26 +++++++++--------- src/cairo.h | 10 +++--- src/cairoint.h | 6 ++-- src/test-fallback-surface.c | 4 +- 38 files changed, 166 insertions(+), 166 deletions(-) commit 099c3c2602b59fbf9424044caa1fec7eb92f71df Author: Behdad Esfahbod Date: Mon Jan 28 20:32:35 2008 -0500 [doc] Another enum nick expansion src/cairo-scaled-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 72feed5b54e1aa725c3c5238b21946b6250503fe Author: Behdad Esfahbod Date: Mon Jan 28 20:16:01 2008 -0500 [doc] Update templates for recently added APIs doc/public/cairo-sections.txt | 2 ++ doc/public/tmpl/cairo-image.sgml | 10 ++++++++++ doc/public/tmpl/cairo-paths.sgml | 2 +- doc/public/tmpl/cairo-status.sgml | 1 + doc/public/tmpl/cairo-xlib-xrender.sgml | 9 +++++++++ 5 files changed, 23 insertions(+), 1 deletions(-) commit b7d43d235c01480b5a5a34db6fea8a3d86161d91 Author: Behdad Esfahbod Date: Mon Jan 28 20:14:52 2008 -0500 [src/check-*] Shut make up src/check-def.sh | 4 ++-- src/check-plt.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit dd7ce762946ec03fc115310c7e295b3327d7e805 Author: Behdad Esfahbod Date: Mon Jan 28 19:54:27 2008 -0500 [doc] Expand a couple nicks to full enum names src/cairo.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit c624ff46541b311c226ad7a026db3495b59dee41 Author: Behdad Esfahbod Date: Mon Jan 28 19:45:10 2008 -0500 [cairo_operator_t] Improve docs src/cairo.h | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit f1271babcd4df1140019b258ca0af0d7da0d1328 Author: Behdad Esfahbod Date: Mon Jan 28 19:37:46 2008 -0500 [doc] Add Long_Description and some See_Also for all chapters doc/public/tmpl/cairo-atsui.sgml | 6 +++- doc/public/tmpl/cairo-beos.sgml | 7 ++++- doc/public/tmpl/cairo-font-options.sgml | 11 +++++++-- doc/public/tmpl/cairo-font.sgml | 12 +++++++++- doc/public/tmpl/cairo-ft.sgml | 7 ++++- doc/public/tmpl/cairo-glitz.sgml | 7 ++++- doc/public/tmpl/cairo-image.sgml | 15 +++++++------ doc/public/tmpl/cairo-matrix.sgml | 5 ++- doc/public/tmpl/cairo-paths.sgml | 4 ++- doc/public/tmpl/cairo-pattern.sgml | 13 ++++++++--- doc/public/tmpl/cairo-pdf.sgml | 7 ++++- doc/public/tmpl/cairo-png.sgml | 7 ++++- doc/public/tmpl/cairo-ps.sgml | 7 ++++- doc/public/tmpl/cairo-quartz.sgml | 7 ++++- doc/public/tmpl/cairo-scaled-font.sgml | 13 ++++++++--- doc/public/tmpl/cairo-status.sgml | 17 ++++++++++++++- doc/public/tmpl/cairo-surface.sgml | 8 +++++- doc/public/tmpl/cairo-svg.sgml | 7 ++++- doc/public/tmpl/cairo-text.sgml | 34 ++++++++++++++++++++++++++++-- doc/public/tmpl/cairo-transforms.sgml | 10 +++++++- doc/public/tmpl/cairo-types.sgml | 4 +- doc/public/tmpl/cairo-win32-fonts.sgml | 7 ++++- doc/public/tmpl/cairo-win32.sgml | 7 ++++- doc/public/tmpl/cairo-xcb-xrender.sgml | 10 +++++++- doc/public/tmpl/cairo-xcb.sgml | 8 ++++++- doc/public/tmpl/cairo-xlib-xrender.sgml | 12 ++++++++-- doc/public/tmpl/cairo-xlib.sgml | 8 ++++++- doc/public/tmpl/cairo.sgml | 4 ++- 28 files changed, 201 insertions(+), 63 deletions(-) commit 73b184fb9c41f26365c99dbb5f81aa5166632722 Author: Behdad Esfahbod Date: Mon Jan 28 19:19:27 2008 -0500 [src] Fix gtk-doc warnings src/cairo-scaled-font.c | 2 +- src/cairo-surface.c | 2 +- src/cairo.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) commit 8709b943c6f0025c65081b23ea24ce606150cf49 Author: Carl Worth Date: Mon Jan 28 16:15:28 2008 -0800 Fix some documentation typos src/cairo.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit e48d7ca802acba300aee99def0eb01727fe2f58a Author: Carl Worth Date: Mon Jan 28 16:11:39 2008 -0800 Add example to documentation of cairo_pattern_set_filter It's helpful to let the reade know about cairo_get_source here. src/cairo-pattern.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit cd26fa266b51ffd91aa9f2c60dd353c53729291e Author: Carl Worth Date: Mon Jan 28 16:10:10 2008 -0800 Add documentation for cairo_filter_t src/cairo.h | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 7c00269e00332974c3a2843272f84960a90b9fb7 Author: Carl Worth Date: Sun Jan 27 12:36:19 2008 -0800 Add pdf-specific reference images for meta-surface-pattern This test has been "failing" ever since we had native replay of metasurfaces to pdf. But looking at the results, they are actually superior to the image-backend reference images. test/meta-surface-pattern-pdf-ref.png | Bin 0 -> 4111 bytes test/meta-surface-pattern-pdf-rgb24-ref.png | Bin 0 -> 4009 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 9cd198d200e4470d3451581b9e672a87d5d91719 Author: Carl Worth Date: Mon Jan 28 15:37:22 2008 -0800 Test the no-Render-extension-available case in get-xrender-format test/get-xrender-format.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) commit d7fd3bd536465881446686305622d31fdc6fd48f Author: Carl Worth Date: Sun Jan 27 12:14:51 2008 -0800 Add get-xrender-format test to test cairo_xlib_surface_get_xrender_format test/.gitignore | 1 + test/Makefile.am | 5 ++ test/get-xrender-format.c | 104 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+), 0 deletions(-) commit cc94dce25085fef936b7cb36cf9fc41569668eba Author: Carl Worth Date: Mon Jan 28 15:26:15 2008 -0800 Return NULL from cairo_xlib_surface_get_xrender_format without an error The NULL return value will only happen if the X Render extension is not available. We've already got that NULL return value documented, so it's not an error if the user asks for it. In particular, it's definitely not a surface-type mismatch. src/cairo-xlib-surface.c | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) commit 3c018a6e5abe099fa916f45ecf0c8e9dd5771fae Author: Carl Worth Date: Sun Jan 27 12:13:13 2008 -0800 Add new API cairo_xlib_surface_get_render_format src/cairo-xlib-surface.c | 27 +++++++++++++++++++++++++++ src/cairo-xlib-xrender.h | 3 +++ 2 files changed, 30 insertions(+), 0 deletions(-) commit 88811540722d891b987efa6fa8edcbab7e10feeb Author: Carl Worth Date: Sun Jan 27 11:12:14 2008 -0800 Add missing cairo_private (for _pixman_format_to_masks) src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3841cc0932ac77540c306c1c70a6171d7d00cf3e Author: Carl Worth Date: Mon Jan 28 15:12:38 2008 -0800 Clarify the documentation of stride within cairo_image_surface_create_for_data src/cairo-image-surface.c | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) commit 13a5624277adf7e87f66d674ce8073013b53bece Author: Carl Worth Date: Mon Jan 28 14:29:36 2008 -0800 Rename cairo_image_surface_stride_for_width to cairo_format_stride_for_width Thanks for Behdad for the suggested name improvement. Also, make it more clear that the stride passed to cairo_image_surface_create_for_data should come from calling cairo_format_stride_for_width with the same width. src/cairo-image-surface.c | 21 +++++++++++---------- src/cairo.h | 4 ++-- test/a8-mask.c | 11 ++++++----- 3 files changed, 19 insertions(+), 17 deletions(-) commit dc67de3d8b6154b74a243cd7b63e45f343520256 Author: Carl Worth Date: Sat Jan 26 23:12:14 2008 -0800 Add cairo_image_surface_stride_for_width Document this function as a required call to get the correct stride value before calling cairo_image_surface_create_for_data. This means that previously-failing calls with non-multiple-of-4 stride values are now documented as errors. Also, we now have the possibility of moving to more stringent alignment constraints, (one can imagine doing 64-bit or 128-bit boundaries for example). src/cairo-image-surface.c | 60 +++++++++++++++++---- src/cairo-surface.c | 3 + src/cairo.c | 4 +- src/cairo.h | 8 +++- test/Makefile.am | 4 -- test/a8-mask.c | 132 +++++++++++++++++++++++++++++++++++++++------ 6 files changed, 179 insertions(+), 32 deletions(-) commit b151cb0709364bed03e4918b79f26ef3243948ca Author: Carl Worth Date: Sat Jan 26 16:42:26 2008 -0800 Rename cairo_format_width to cairo_format_bits_per_pixel and correct its logic src/cairo-image-surface.c | 6 +++--- src/cairo-scaled-font.c | 3 ++- src/cairoint.h | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) commit 538ace5b51c968a81ea1d4c8d7538f0a227661c6 Author: Nis Martensen Date: Sat Jan 26 19:11:26 2008 +0100 re-indent xml after removal of structuring level doc/public/cairo-docs.xml | 76 ++++++++++++++++++++++---------------------- 1 files changed, 38 insertions(+), 38 deletions(-) commit 642e1af892353d55edd6ebe71720fb541c9deb22 Author: Nis Martensen Date: Sat Jan 26 19:05:16 2008 +0100 remove empty tutorial stub and one level of structuring doc/public/cairo-docs.xml | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) commit be93e61d70f4e32069448b79cca7eacab6035c6c Author: Nis Martensen Date: Sat Jan 26 18:44:32 2008 +0100 Add index of new symbols in 1.6 doc/public/cairo-docs.xml | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 0874834ec4606c5ff960588077d5310927d560ba Author: Nis Martensen Date: Sat Jan 26 16:59:21 2008 +0100 Describe cairo_operator_t, add link to operators/ wiki page src/cairo.h | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) commit b18bc660c6d5d5018b4cfaf0eaf0278669cac1ac Author: Behdad Esfahbod Date: Mon Jan 28 02:33:58 2008 -0500 [test/font-matrix-translation] Fix function signature test/font-matrix-translation.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) commit 936edecb35b94213997fdb172f0256c658f416aa Author: Vladimir Vukicevic Date: Sun Jan 27 16:52:39 2008 -0800 [quartz] only use DrawTiledImage if transformed image is integer aligned This Quartz API seems to only tile at integer coordinates; if the source image is scaled to anything less than integer-aligned, seams appear between tiles. Detect this and fall back to slower but more general CGPattern path. src/cairo-quartz-surface.c | 144 +++++++++++++++++++++++-------------------- 1 files changed, 77 insertions(+), 67 deletions(-) commit 182b02240192c03b1fae5367573962d527f8aad4 Author: Vladimir Vukicevic Date: Sat Jan 26 10:57:20 2008 -0800 [win32] Fix initial clip region test I misread the docs; GetClipBox's return value doesn't necessarily correspond to GetClipRgn's region type. src/cairo-win32-surface.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 0e737632905e61f4d76b6b2c4e5908d75a5cddda Author: Behdad Esfahbod Date: Sun Jan 27 02:19:47 2008 -0500 [src] Fix make check src/cairo-quartz-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit b3eea75d1f7b56c2046b5387a5eb186d8f154184 Author: Behdad Esfahbod Date: Sat Jan 26 13:56:08 2008 -0500 Change cairo_get_current_point() to return cairo_status_t instead of void So we can return CAIRO_STATUS_NO_CURRENT_POINT. Previously it wasn't easy to fetch that information. src/cairo.c | 22 ++++++++++++++++++---- src/cairo.h | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) commit 79383841520af3a7de3018befca37be6a037f9ba Author: Behdad Esfahbod Date: Fri Jan 25 19:48:36 2008 -0500 [doc] Update list of private header files doc/public/Headers.mk | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit 58f6aed93d137b77a2550bcace16f8d5573d45ef Author: Behdad Esfahbod Date: Fri Jan 25 19:47:07 2008 -0500 [doc] Update for recent API changes doc/public/tmpl/cairo-paths.sgml | 2 ++ doc/public/tmpl/cairo-status.sgml | 1 + doc/public/tmpl/cairo-surface.sgml | 2 -- 3 files changed, 3 insertions(+), 2 deletions(-) commit 45e7ba356d308f67f674a20484a55d41fe922d13 Author: Behdad Esfahbod Date: Fri Jan 25 19:46:43 2008 -0500 [cairo-pdf-operators] Reformat typedef to not confuse gtk-doc src/cairo-pdf-operators-private.h | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit 756420a780e870bed6f174ca7f3f14421d1ff7d2 Author: Behdad Esfahbod Date: Fri Jan 25 19:38:27 2008 -0500 [cairo_surface_show/copy_page()] Make them return void, like cairo_show/copy_page() do src/cairo-gstate.c | 6 ++++-- src/cairo-paginated-surface.c | 12 ++++++++---- src/cairo-surface.c | 33 ++++++++++++++++++--------------- src/cairo-svg-surface.c | 5 +++-- src/cairo.h | 4 ++-- 5 files changed, 35 insertions(+), 25 deletions(-) commit c4ec5539ca7380dccf1a2f797e536c7273b5c2b5 Author: Nis Martensen Date: Fri Jan 25 19:13:13 2008 -0500 [cairo-surface] Fix doc typo src/cairo-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ab188f2e90b49fc4e07f04dc512f9fb9864efa0b Author: Behdad Esfahbod Date: Fri Jan 25 17:44:26 2008 -0500 [cairo-ft] Disable embedded bitmaps if hinting style NONE is requested src/cairo-ft-font.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) commit 2df9944a8ac48cb43845e56c5483bf77dafda584 Author: Behdad Esfahbod Date: Fri Jan 25 17:12:34 2008 -0500 [.gitignore] Add check-has-hidden-symbols.i src/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 3d2144b6af07ca44b6fbf1c96080b7e2b7c0285c Author: Behdad Esfahbod Date: Fri Jan 25 17:06:11 2008 -0500 [cairo-ft] Fix font metrics computation for bitmap fonts and no metrics-hinting Preivously we were returning NAN font metrics. Fixed now. Makes bitmap-font test pass again. src/cairo-ft-font.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit c621d8d7191bfa8c1bca533bf9d53d514d01f529 Author: Vladimir Vukicevic Date: Fri Jan 25 15:01:44 2008 -0800 [ps] Pad image mask lines out to full lines The PostScript backend was generating image masks with packed mask bits, when PS seems to expect each line of the mask to be padded out to 8 bytes. Ref: https://bugzilla.mozilla.org/show_bug.cgi?id=407360 src/cairo-ps-surface.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit bae496df11247a1e4aff8b0df3356701f8a11792 Author: Behdad Esfahbod Date: Fri Jan 25 08:03:32 2008 -0500 [test/bitmap-font] Test under all combinations of hinting, test font metrics too This is now failing as we compute NAN font metrics for bitmap-only fonts under disabled metrics hinting. A very infamous bug excercised with PangoCairo's PDF output. test/bitmap-font.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 94 insertions(+), 8 deletions(-) commit 20c8531243c2f2ee220bd1f234cdba6fc3d6d4c7 Author: Behdad Esfahbod Date: Fri Jan 25 07:14:07 2008 -0500 [test/text-zero-len] Test text and font extents for font size 0 test/text-zero-len.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 50 insertions(+), 2 deletions(-) commit 83bd590760629b61898ed403e273046545f26767 Author: Behdad Esfahbod Date: Fri Jan 25 07:02:25 2008 -0500 [test] Test that cairo_text_extents() and cairo_scaled_font_text_extents() match in results. test/font-matrix-translation.c | 31 ++++++++++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-) commit 4c432b09557f52fa35be981743272b33baca6232 Author: Behdad Esfahbod Date: Fri Jan 25 04:16:44 2008 -0500 [cairo-scaled-font] Fix bug in glyphs bounding box computation In 02970ac8cf27bc9d42cf27848a97019d9dd13b6d Vlad introduced the following innocent-looking change: - short min_x = INT16_MAX, max_x = INT16_MIN; - short min_y = INT16_MAX, max_y = INT16_MIN; + cairo_point_int_t min = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; + cairo_point_int_t max = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; Well, read it carefully... yeah. That caused each show glyph operation upload a mask the size of the surface. With evince/poppler and certain PDF files that each glyph is rendered in its own cairo_show_glyphs() call, that meant a 20x slowdown in rendering a page of PDF. If still wondering what's wrong with that change, here is the answer: - cairo_point_int_t min = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; - cairo_point_int_t max = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; + cairo_point_int_t min = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; + cairo_point_int_t max = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; Yay for git-bisect. src/cairo-scaled-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8983208f456c6f570698df46174faa0208d6de5f Author: Behdad Esfahbod Date: Fri Jan 25 01:00:21 2008 -0500 [configure.in] Require pixman >= 0.9.6 I was experiencing very weird rendering problems and crashes in evince with pixman 0.9.4. Upgrading to pixman 0.9.6 fixed the all. Lets just require it. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5dfe47a3f14ee8597395dc53ff57fd429e9804cd Author: Behdad Esfahbod Date: Fri Jan 25 00:35:11 2008 -0500 [cairo-scaled-font] Unbreak it after my recent commit Sigh. src/cairo-scaled-font.c | 41 +++++++++++++++++++---------------------- 1 files changed, 19 insertions(+), 22 deletions(-) commit efd3a965244305a069ec231b7ec28cff8d6c67c8 Author: Behdad Esfahbod Date: Thu Jan 24 23:35:06 2008 -0500 [cairo-scaled-font] Don't err on font size 0, really First, seems like we were rejecting degenerate font matrix right away at the constructor. Don't do that. Next, PS/PDF were inverting the font scale matrix, assuming that it's invertible. We now keep the inverse too, so they can use it. For the case of a size 0 font, both the scale matrix and its invert are set to 0,0,0,0. That's safe, even if slightly inconsistent. src/cairo-pdf-surface.c | 5 +---- src/cairo-ps-surface.c | 5 +---- src/cairo-scaled-font-private.h | 1 + src/cairo-scaled-font.c | 19 ++++++++----------- 4 files changed, 11 insertions(+), 19 deletions(-) commit 45f269e33020d8d7cf247926712b9c64c1fb8959 Author: Behdad Esfahbod Date: Thu Jan 24 22:39:28 2008 -0500 [cairo-scaled-font] Oops, return err if not handling it src/cairo-scaled-font.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 6d0dc3e0760e6bc6b0eceab48674410b4e865287 Author: Behdad Esfahbod Date: Thu Jan 24 22:24:23 2008 -0500 [cairo-scaled-font] Don't err on font size 0 src/cairo-scaled-font.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-) commit ea9afecc9aaa87c2df14dc9126c75ac0e3e5b13f Author: Vladimir Vukicevic Date: Thu Jan 24 11:48:02 2008 -0800 [quartz] Do dynamic symbol lookups for 10.4/10.5 optimization symbols The gcc-__attribute-__ based weak linking was causing all sorts of problems; do dlsym lookups at runtime instead. src/cairo-quartz-surface.c | 39 ++++++++++++++++++++++++++++----------- 1 files changed, 28 insertions(+), 11 deletions(-) commit 287de2ce5883daa4238c534e0d4890cb640d7fb7 Author: Vladimir Vukicevic Date: Wed Jan 23 21:30:42 2008 -0800 [quartz] Clean up unused APIs a bit The data parameter from get_image was never really used; get rid of it and clean up callers. Also get rid of a chunk of dead code in release_dest_image. src/cairo-quartz-surface.c | 76 +++++++------------------------------------ 1 files changed, 13 insertions(+), 63 deletions(-) commit b96c6c26c2d6b0b5f79ee569ece602338c4146b2 Author: Vladimir Vukicevic Date: Thu Jan 24 11:04:26 2008 -0800 [win32] Print non-black/white text correctly in show_glyphs src/cairo-win32-printing-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 8e7c0db8018b258fc367da1e5502e9e13bad098c Author: Vladimir Vukicevic Date: Thu Jan 24 11:01:55 2008 -0800 [win32] Better tracking of initial clip There were a few corner cases that the win32 surface was failing at when there was an initial clip set; the win32-printing surface had more serious problems when painting meta surface patterns. This cleans up the initial DC clip tracking for both surfaces. src/cairo-win32-printing-surface.c | 69 +++++------- src/cairo-win32-private.h | 23 +++- src/cairo-win32-surface.c | 221 +++++++++++++++++++++++++----------- 3 files changed, 197 insertions(+), 116 deletions(-) commit c05e3b08b4cfa820a18e33b5012a6138b931788f Author: Carl Worth Date: Thu Jan 24 09:51:58 2008 -0800 Remove ROADMAP and TODO, mentioning their URLs in README We're maintaining these as part of cairo's website now, rather than as part of the source code. README | 18 +++---- ROADMAP | 149 --------------------------------------------------------------- TODO | 111 ----------------------------------------------- 3 files changed, 8 insertions(+), 270 deletions(-) commit 21823842775988c0b58e3868dce053544ed246e2 Author: Behdad Esfahbod Date: Wed Jan 23 15:06:52 2008 -0500 [test] Minor fix for check-ref-dups rule test/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit e7c0a69dcb627abb677f84473a9e3857b2d89a69 Author: Behdad Esfahbod Date: Wed Jan 23 14:57:42 2008 -0500 [test] Also check for reference images listed in Makefile.am but missing in git, and if this is not a git checkout, in source directory. test/Makefile.am | 36 +++++++++++++++++++++++++++--------- 1 files changed, 27 insertions(+), 9 deletions(-) commit 188765c8e857c88a66656a454a3dbd27c32170f7 Author: Bertram Felgenhauer Date: Wed Jan 23 19:22:18 2008 +0100 improve comments for the pixman transformation anchoring math. src/cairo-matrix.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) commit b6c723644302c43b7aae098338092e578fe2f007 Author: Bertram Felgenhauer Date: Wed Jan 23 18:09:20 2008 +0100 update reference images for some non-aa testcases test/rectangle-rounding-error-ref.png | Bin 298 -> 231 bytes test/rotate-image-surface-paint-ref.png | Bin 232 -> 209 bytes test/unantialiased-shapes-ref.png | Bin 4449 -> 3968 bytes 3 files changed, 0 insertions(+), 0 deletions(-) commit 5a0b15d2c9b5e9ef3aed1f01e8ea28a3f2c36216 Author: Bertram Felgenhauer Date: Wed Jan 23 18:02:02 2008 +0100 anchor pattern transformations at the pattern origin This keeps the rounding errors due to the conversion to 16.16 fixed point numbers small and improves cairo's translation invariance. src/cairo-matrix.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) commit 431e846c03b39495ac57834a8b65b7499472ef1b Author: Vladimir Vukicevic Date: Tue Jan 22 16:30:37 2008 -0800 cairo_point_int32_t is really int32_t, not int16_t Oops. src/cairo-types-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 02970ac8cf27bc9d42cf27848a97019d9dd13b6d Author: Vladimir Vukicevic Date: Tue Jan 22 15:32:11 2008 -0800 Fix usage of cairo_rectangle_int16_t leading to memory corruption cairo_rectangle_int16_t was being used in a number of places instead of cairo_rectangle_int_t, which led to memory corruption when cairo was using a fixed point format with a bigger space than 16.16 (such as 24.8). src/cairo-analysis-surface.c | 3 +++ src/cairo-pdf-surface.c | 6 +++--- src/cairo-scaled-font.c | 24 ++++++++++++------------ src/cairo-surface-fallback.c | 9 ++------- src/cairo-win32-private.h | 2 +- src/cairo-xcb-surface.c | 4 ++-- src/cairo-xlib-surface.c | 4 ++-- src/cairoint.h | 2 +- 8 files changed, 26 insertions(+), 28 deletions(-) commit 1109ccfb4e5b078581a3b4a7e2d152681fa863ec Author: Behdad Esfahbod Date: Tue Jan 22 17:44:47 2008 -0500 [ROADMAP] Add item: Make cairo-ft respect FC_FT_FACE pattern element ROADMAP | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 5024650d4d8d4fa890a531d9e54fed7beef8e2c1 Author: Behdad Esfahbod Date: Tue Jan 22 12:45:50 2008 -0500 [test] Only summarize check results for the tests tested! test/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 18181f12ae6c412fea984484355ff8bc1dfccb54 Author: Carl Worth Date: Tue Jan 22 06:25:19 2008 -0800 Make Carl return from his time-traveling expedition test/rectilinear-miter-limit.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 95f3b425e6fb31b364b08e53e072fac4f5ed0733 Author: Behdad Esfahbod Date: Tue Jan 22 01:03:02 2008 -0500 [cairo-path-stroke] Use M_SQRT2 for constant value src/cairo-path-stroke.c | 8 ++++---- src/cairoint.h | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) commit 1931ce1b3d491afe4f23670c82e428f95eb25e6d Author: Behdad Esfahbod Date: Tue Jan 22 00:36:25 2008 -0500 [cairo-operator] Remove unused cairo-operator.c src/Makefile.am | 1 - src/cairo-operator.c | 119 -------------------------------------------------- src/cairoint.h | 7 --- 3 files changed, 0 insertions(+), 127 deletions(-) commit 47cf7ed769891b00abf96d14de6e79c0fa893cf9 Author: Carl Worth Date: Mon Jan 21 16:45:41 2008 -0800 Test and document that fill rule has no effect on cairo_path_extents src/cairo.c | 4 +- test/get-path-extents.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) commit 1ca186f51134e7d5969937760b068caba0070d31 Author: Carl Worth Date: Mon Jan 21 16:34:24 2008 -0800 Disable rectilinear stroke optimization for small miter limit values This fixes the bug that was causing the recently added rectilinear-miter-limit test case to fail. It passes quite happily now. src/cairo-path-stroke.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 32efcc94627e8890969c4b36a78c831ced6f8d62 Author: Carl Worth Date: Mon Jan 21 16:32:48 2008 -0800 Add new rectilinear-miter-limit test to demonstrate bug We're failing to respect the miter limit in the rectilinear stroke optimization code. test/.gitignore | 1 + test/Makefile.am | 2 + test/rectilinear-miter-limit-ref.png | Bin 0 -> 177 bytes test/rectilinear-miter-limit.c | 80 ++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 0 deletions(-) commit 326342962daa694d876c03194e8a6c1b13f9a8d2 Author: Carl Worth Date: Mon Jan 21 15:20:07 2008 -0800 Rename trailing_move_to_point to move_to_point And prefer TRUE and FALSE literals over 1 and 0. src/cairo-path-bounds.c | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-) commit c480eedbb58dd03dd4b9b87b3985758ffbce7113 Author: Carl Worth Date: Mon Jan 21 14:56:21 2008 -0800 Test and document extents of degenerate "dots" It's a common idiom to stroke degenerate sub-paths made with cairo_move_to(x,y);cairo_rel_line_to(0,0) to draw dots. Test that we get the desired extents from cairo_fill_extents, cairo_stroke_extents, and cairo_path_extents for these cases. Also document that the cairo_path_extents result is equivalent to the limit of stroking with CAIRO_LINE_CAP_ROUND, (so that these "dot" points are included), as the line width approaches 0.0 . src/cairo.c | 6 +++--- test/get-path-extents.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) commit 55e0dddf0408046ea0ded419ebe45099a4eb563e Author: Carl Worth Date: Mon Jan 21 14:45:06 2008 -0800 Add cairo_path_extents testing to several cases missing it With these degenerate shapes, cairo_path_extents still returns a zero-area rectangle, but with a non-zero offset. test/get-path-extents.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) commit 63df3a82a3a4a035edf89152995a324449616059 Author: Carl Worth Date: Mon Jan 21 13:47:05 2008 -0800 Fix cairo_path_extents to ignore lone cairo_move_to points. Update the documentation as well. src/cairo-path-bounds.c | 11 ++++++++++- src/cairo.c | 40 +++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 16 deletions(-) commit c15cab8b6855540436e457465c4766812c6def55 Author: Carl Worth Date: Mon Jan 21 13:34:53 2008 -0800 Correct near-pangram to be an actual pangram This wasn't affecting the test quality at all, but it did annoy me to see this mistake. test/get-path-extents.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ed695bdb9b1e4500f796c7f07a7cc2f3832b2a39 Author: Carl Worth Date: Mon Jan 21 13:33:46 2008 -0800 Define repeated string literal once test/get-path-extents.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 80df194b77a4caac1d58132341f034596e500bda Author: Carl Worth Date: Mon Jan 21 12:14:49 2008 -0800 Clarify documentation of cairo_{fill,stroke,path}_extents Mostly just adding more cross-references between the documentation of these three similar functions. src/cairo.c | 36 +++++++++++++++++++++++++----------- 1 files changed, 25 insertions(+), 11 deletions(-) commit eba04b7fbcc7fdbf075ad1372208908634459178 Author: Brian Ewins Date: Sun Jan 20 03:22:12 2008 +0000 [path] use new interpret_flat infrastructure for path_populate refactor to reduce duplication of flattening code. src/cairo-path.c | 50 +++++++++++++------------------------------------- 1 files changed, 13 insertions(+), 37 deletions(-) commit 3270ae6a65105787942da8309fa874ee65bc79fe Author: Brian Ewins Date: Sun Jan 20 03:21:41 2008 +0000 [path] Use new interpret_flat infrastructure for path_count. Refactor to reduce duplication of path flattening code. src/cairo-path-bounds.c | 6 ---- src/cairo-path.c | 62 +++++++++++++--------------------------------- 2 files changed, 18 insertions(+), 50 deletions(-) commit 4177208be63caa3128eaf07428f3d4617fcd18e0 Author: Brian Ewins Date: Fri Nov 16 22:43:43 2007 +0000 [cairo] Add cairo_path_extents() This new function gets the extents of the current path, whether or not they would be inked by a 'fill'. It differs from cairo_fill_extents() when the area enclosed by the path is 0. Includes documentation and updated test. doc/public/cairo-sections.txt | 1 + doc/public/tmpl/cairo-paths.sgml | 10 ++++++++++ src/cairo-gstate.c | 11 +++++++++++ src/cairo.c | 30 ++++++++++++++++++++++++++++++ src/cairo.h | 5 +++++ src/cairoint.h | 7 +++++++ test/get-path-extents.c | 33 +++++++++++++++++++++++---------- 7 files changed, 87 insertions(+), 10 deletions(-) commit d923457c0f40c9b34ee75d4d47b9bd0c3edfe669 Author: Brian Ewins Date: Sat Jan 19 22:31:49 2008 +0000 [path-fixed] make _cairo_path_fixed_bounds use _cairo_path_fixed_interpret_flat _cairo_path_fixed_bounds can use the new _interpret_flat mechanism; this results in tighter bounds; previously the bounds followed the control points of the beziers, whereas now they are the bounds of the curve. src/cairo-analysis-surface.c | 2 +- src/cairo-path-bounds.c | 39 ++++++++++++++------------------------- src/cairoint.h | 3 ++- 3 files changed, 17 insertions(+), 27 deletions(-) commit 1471b3f00acddecdfc2617a62ab0e584f319dc1c Author: Brian Ewins Date: Sat Jan 19 22:31:10 2008 +0000 [path-fixed] add _cairo_path_fixed_interpret_flat _cairo_path_fixed_interpret_flat flattens the path as it interprets it, meaning that a curve_to callback is not required. src/cairo-path-fixed.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 9 ++++ 2 files changed, 108 insertions(+), 0 deletions(-) commit 3339c32b0aa44c4bae6e534f90d26aa342e3d717 Author: Behdad Esfahbod Date: Sun Jan 20 02:56:26 2008 -0500 [cairoint.h] Move MSC inline macros into cairo-compiler-private.h where they belong src/cairo-compiler-private.h | 10 ++++++++++ src/cairoint.h | 11 ----------- 2 files changed, 10 insertions(+), 11 deletions(-) commit ac17ce0f89b494a404756c8d24b21a7fb354218e Author: Behdad Esfahbod Date: Sun Jan 20 02:54:16 2008 -0500 [cairo-fixed/wideint-private.h] Split out typedefs from prototypes such that the type definitions can be used from boilerplate without exposing the prototypes. src/Makefile.am | 2 + src/cairo-fixed-private.h | 34 +--------- src/cairo-fixed-type-private.h | 70 ++++++++++++++++++++ src/cairo-types-private.h | 2 +- src/cairo-wideint-private.h | 71 +-------------------- src/cairo-wideint-type-private.h | 130 ++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 1 + 7 files changed, 208 insertions(+), 102 deletions(-) commit f072d815d40e6fd44369424b68d54cea22da3a26 Author: Peter Weilbacher Date: Sat Jan 19 20:48:39 2008 -0500 [cairo-ft] Fix typo in comment src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0fb800ff2258d4642a2188a7f219db9620450bc2 Author: Peter Weilbacher Date: Sat Jan 19 20:47:59 2008 -0500 [cairo-ft] Add FC_PIXEL_SIZE as double, not int src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8887fb35936bb48acadc19a0c71d1b81ec8b481d Author: Adrian Johnson Date: Sun Jan 20 01:14:19 2008 +1030 Fix PS/PDF Type 1 font embedding when glyph 0 is used cairo-scaled-fonts-subsets.c reserves position 0 in each subset for glyph 0 (.notdef) as the font embedding of each font type requires .notdef as the first glyph. For some reason this was done by reserving the position then inserting glyph 0 in the collect function instead of just adding the glyph to the hash table when the subset is created. The problem this caused was that when an application called show_glyphs() with glyph 0, the glyph was added to the hash table (because it was not already there) resulting in two .notdef glyphs in the subset. This resulted in breakage in the Type 1 subsetting where the second .notdef was not emitted and all subsequent glyphs were moved up one place resulting in incorrect font encoding in the PS/PDF output. Fix this by adding .notdef to the subset hash table when the subset is created. This fixes #13841. src/cairo-scaled-font-subsets.c | 36 +++++++++++++++++++----------------- 1 files changed, 19 insertions(+), 17 deletions(-) commit 574bdd01fd5df8f378c901de5cd9b24bd720ad37 Author: Adrian Johnson Date: Sun Jan 20 00:26:09 2008 +1030 Type1-subset: Add newline to the end of the font as some fonts do not have a newline at the end of the last line src/cairo-type1-subset.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit ec272fbd0980e8124d87ff5c17a5b751876fc9e2 Author: Adrian Johnson Date: Sat Jan 19 12:46:24 2008 +1030 Fix PDF extend-reflect test failure Previously, when emitting image patterns the PDF backend used _cairo_pattern_acquire_surface to get the image. For reflected images this would return an image containing four images in a reflect pattern. When drawn in a PDF pattern (which only does repeating patterns) this would create the reflected pattern in PDF. For some reason _cairo_pattern_acquire_surface is no longer returning a reflected image pattern. This is fixed by only using _cairo_surface_acquire_source_image to get the image and using the same code as is used for reflected meta-surface patterns to created a reflected pattern by drawing four transformed copies of the image inside the PDF patten. This is the better way to implement reflected images as we are no longer embedding an image four times larger than the original. src/cairo-pdf-surface.c | 67 ++++++++++++++++++++++------------------------ 1 files changed, 32 insertions(+), 35 deletions(-) commit 50d0767c8bf4c738b86e10be09d5c4fd7e14a05f Author: Carl Worth Date: Fri Jan 18 12:41:57 2008 -0800 Add a1-image-sample and a1-traps-sample tests Both of these currently fail due to bugs in the way pixman does its sampling. test/.gitignore | 2 + test/Makefile.am | 2 + test/a1-image-sample-ref.png | Bin 0 -> 148 bytes test/a1-image-sample.c | 83 ++++++++++++++++++++++++++++++++++++++++++ test/a1-traps-sample-ref.png | Bin 0 -> 148 bytes test/a1-traps-sample.c | 72 ++++++++++++++++++++++++++++++++++++ test/cairo-test.c | 2 + 7 files changed, 161 insertions(+), 0 deletions(-) commit c11790fded69ed476e7740ed86e4a66bf878d2d3 Author: Carl Worth Date: Wed Jan 16 16:32:36 2008 -0800 Quiet a warning about switch without some cairo_surface_type_t enum values src/cairo-paginated-surface.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit 1d6c2d578fa717906ba8fd0a897c52033179e938 Author: Carl Worth Date: Wed Jan 16 16:19:40 2008 -0800 Remove some gratuitous assert statements Calling assert immediately after assigning a literal value is very bad form. src/cairo-image-surface.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit eabd28a655f8ddc73ff71583bb658db796e932cd Author: Adrian Johnson Date: Fri Jan 18 21:53:04 2008 +1030 win32-printing: define GRADIENT_FILL_RECT_H bug #14107 Older versions of mingw do not define this. src/cairo-win32-printing-surface.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 0086db893cba90dc73824d77c661d2965ad48112 Author: Chris Wilson Date: Thu Jan 17 22:31:05 2008 +0000 [cairo-font-options] Treat NULL as a default cairo_font_options_t Interpret a NULL cairo_font_options_t as the default values - i.e as if it were a fresh pointer returned by cairo_font_options_create(). src/cairo-font-face.c | 8 +++-- src/cairo-font-options.c | 51 +++++++++++++++++++++----- src/cairo-ft-font.c | 16 +++++--- src/cairo-gstate.c | 2 +- src/cairo-scaled-font.c | 18 ++++++--- src/cairo-win32-font.c | 4 +- src/cairo.c | 10 +++-- test/.gitignore | 1 + test/Makefile.am | 12 ++++--- test/font-options.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 177 insertions(+), 36 deletions(-) commit 02d0e070638f668bf50a8ce2174c21e5614dd6c4 Author: Chris Wilson Date: Thu Jan 17 21:39:31 2008 +0000 [cairo-font-options] Use cairo_font_options_status() rather open-coding. By switching to cairo_font_options_status() instead of checking against the _cairo_font_options_nil error object, the API is protected from NULL dereferences. src/cairo-font-options.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit b15e91d2b6c229dfe3da4a354306915cc42f75bd Author: Chris Wilson Date: Thu Jan 17 21:11:00 2008 +0000 [cairo-font-options] Check for a NULL cairo_font_options_t On IRC Drakou reported a user error whereby cairo_scaled_font_create() was called with a NULL cairo_font_options_t. However, instead of reporting the error back to the user, cairo instead segfaulted trying to dereference the NULL pointer! Add a guard to check that the options is not NULL. src/cairo-font-options.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 630536f17681b083db658414d68db2c0eb167af3 Author: Chris Wilson Date: Thu Jan 17 17:44:57 2008 +0000 [test/extend-*] Add various cairo_pattern_set_extend() test cases. Add various test cases to exercise _cairo_pattern_acquire_surface_for_surface(), most notably using similar source surfaces to provide coverage of the non-image surface branch. test/.gitignore | 4 + test/Makefile.am | 11 +++- test/cairo-test.c | 2 - test/extend-pad-similar.c | 105 +++++++++++++++++++++++++++++++++++ test/extend-reflect-similar-ref.png | Bin 0 -> 153571 bytes test/extend-reflect-similar.c | 56 ++++++++++++++++++ test/extend-reflect.c | 2 + test/extend-repeat-ref.png | Bin 0 -> 108622 bytes test/extend-repeat-similar-ref.png | Bin 0 -> 108622 bytes test/extend-repeat-similar.c | 56 ++++++++++++++++++ test/extend-repeat.c | 34 +++++++++++ 11 files changed, 267 insertions(+), 3 deletions(-) commit dec2daeaf396be9dc6e8952417cc615d3a607926 Author: Chris Wilson Date: Thu Jan 17 15:34:51 2008 +0000 [cairo-{ps,pdf}-surface] Assert the font is supported during emission. Add an ASSERT_NOT_REACHED to the tail of the font subset emission functions - as they should always, at least, be supported by the fallbacks. src/cairo-pdf-surface.c | 2 ++ src/cairo-ps-surface.c | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-) commit bde68fd4d6271daf8ca374e472deab95a9a7acff Author: Chris Wilson Date: Thu Jan 17 15:06:13 2008 +0000 [cairo-scaled-font] Propagate the error to the font. If we encounter an error whilst using the font backend to convert the text to the glyphs, flag the scaled font with that error. src/cairo-scaled-font.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit d664e3253e3c310c34264eb0070c2c3c309e071b Author: Chris Wilson Date: Thu Jan 17 15:05:10 2008 +0000 [cairo-scaled-font] Typo. s/ZERO_EXENTS/ZERO_EXTENTS/ src/cairo-scaled-font.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit fcdc525dde52c3bf7124d00a98b6be64ca522cb9 Author: Chris Wilson Date: Thu Jan 17 14:47:43 2008 +0000 [cairo-xlib] Remove the NULL safeguards. No need to guarding against the pointer being NULL on internal functions as no path can call the function will a NULL pointer and no path should ever try, which in any case it would be better to crash immediately. src/cairo-xlib-display.c | 7 +------ src/cairo-xlib-screen.c | 6 ------ 2 files changed, 1 insertions(+), 12 deletions(-) commit 7b1a0eddacb290ae0d67fa974da1697b2c9ce38c Author: Chris Wilson Date: Thu Jan 17 13:51:21 2008 +0000 [test/get-path-extents] Exercise cairo_scaled_font_text_extents() Compare cairo_scaled_font_text_extents() to cairo_text_extents() in order to provide test coverage of cairo_scaled_font_text_extents(). test/get-path-extents.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) commit dbc97c2576320126e0cddd833ac88320af995d77 Author: Chris Wilson Date: Thu Jan 17 13:41:19 2008 +0000 [text] Set the extents on the error paths. Ensure the text extents are initialized (zeroed) if we encounter an error along for any of the text extents functions. src/cairo-scaled-font.c | 19 ++++++++++++++++--- src/cairo.c | 35 +++++++++++++++++++---------------- 2 files changed, 35 insertions(+), 19 deletions(-) commit aec7ae67aa72f3105232fa7a66c1ea013c840da1 Author: Chris Wilson Date: Thu Jan 17 13:28:55 2008 +0000 [test/text-zero-len] Test the public cairo_scaled_font_* with NULLs. Pass NULL to cairo_scaled_font_(text|glyph)_extents() to test the consistency of the extents API. test/text-zero-len.c | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+), 0 deletions(-) commit 390e22894b093184e489ea762ffc29eeb1c81d2b Author: Chris Wilson Date: Thu Jan 17 13:13:40 2008 +0000 [test/in-fill-trapezoid] Add a few holes. Complete the coverage of _cairo_trap_contains() by cutting holes out of the simple shapes. test/in-fill-trapezoid.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) commit da9c43329ad09ccf48f8a71d28848f111af7ecb5 Author: Chris Wilson Date: Thu Jan 17 11:22:19 2008 +0000 [test/in-fill-trapezoid] Add test to exercise _cairo_trap_contains(). A simple test to provide coverage of _cairo_trap_contains(), though not yet seeking boundary conditions. test/.gitignore | 1 + test/Makefile.am | 1 + test/in-fill-trapezoid.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 0 deletions(-) commit f638e5ea355cf0268a4b099ce7b8b98c69df6b67 Author: Chris Wilson Date: Thu Jan 17 11:03:50 2008 +0000 [cairo-region] Review status propagation. Check that the error status is propagated from _cairo_region_*. src/cairo-clip.c | 2 +- src/cairo-glitz-surface.c | 50 ++++++++++++++++++++++++-------------------- src/cairo-surface.c | 7 +---- 3 files changed, 30 insertions(+), 29 deletions(-) commit 248f0060e5317f53a688ea0e0aea2997824fa996 Author: Chris Wilson Date: Thu Jan 17 10:10:55 2008 +0000 [cairo-analysis-surface] Return the nil surface rather than NULL. On error return a nil surface that represents the error rather than making the assumption of a NO_MEMORY error in the caller. src/cairo-analysis-surface.c | 5 +---- src/cairo-paginated-surface.c | 5 ++--- 2 files changed, 3 insertions(+), 7 deletions(-) commit dd13a00541ebd85bb7687add8b76fa3fb1d82b95 Author: Chris Wilson Date: Thu Jan 17 10:09:22 2008 +0000 [test/get-path-extents] Check extents of degenerate paths. Ensure that degenerate paths have zero extents. test/get-path-extents.c | 35 +++++++++++++++++++++++++++++++++++ 1 files changed, 35 insertions(+), 0 deletions(-) commit 3f202c081d211d5ac6c28ce96cd0f57f8bb26aac Author: Chris Wilson Date: Wed Jan 16 23:42:24 2008 +0000 [Makefile.am] Another path massage for lcov. Beware the inline functions in the headers that are now being pulled into the boilerplate code. Makefile.am | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 9ebfa8b5fb82596341b9ca0f19c362f24a7ff782 Author: Chris Wilson Date: Wed Jan 16 20:35:41 2008 +0000 [Makefile.am] Couple check-ref-missing into release-check Verify that all the reference images checked into git will be included within the distribution tarball as early as possible in the release process. Makefile.am | 6 +++++- test/Makefile.am | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) commit f9a80c06b40634ffef00770731d3b433e465a1b9 Author: Chris Wilson Date: Wed Jan 16 23:28:27 2008 +0000 [cairo-path-stroke] Convert degenerate splines into lines. This fixes a discrepancy in the stoker between splines and lines, whereby the stroker failed to add a dash for a zero length spline. src/cairo-path-stroke.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 2621a323a0ccfe33ff42ed17536db0dc89473a9f Author: Chris Wilson Date: Wed Jan 16 23:24:41 2008 +0000 [test/dash-curve] Add a new test case for dashes along splines. Modify the dash-state test case and use curves instead of lines - exercises _cairo_stroker_curve_to_dashed() and degenerate splines. test/.gitignore | 1 + test/Makefile.am | 2 + test/dash-curve-ref.png | Bin 0 -> 39642 bytes test/dash-curve.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 77 insertions(+), 0 deletions(-) commit bb41fa22e3d3b1fe4b3e802ecf7d8041eacda3fd Author: Chris Wilson Date: Wed Jan 16 23:21:53 2008 +0000 [Makefile.am] Further massage lcov paths for srcdir != builddir. The lcov scripts generate incorrect absolute paths to the builddir for source files - so convert them to srcdir using sed. Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0a4ced5a2659b168fe8d1a6e3917f79fd5c66ae5 Author: Carl Worth Date: Wed Jan 16 10:47:46 2008 -0800 Increment version to 1.5.7 after the 1.5.6 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d2a02d4f5ccb1c6dc7f8cca0c322b72f1638d25b Author: Carl Worth Date: Wed Jan 16 10:34:17 2008 -0800 Remove check-has-hidden-symbols.i on 'make distclean' Without this, 'make distcheck' fails so releases don't happen. src/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 5c3a0b5c0044bff1262d583e38f84d48d407f0d9 Author: Carl Worth Date: Wed Jan 16 10:22:44 2008 -0800 Add miter-precision-ref.png tothe distribution. test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit cb1ddc4e475ff783960925139e85f6fada56213a Author: Carl Worth Date: Wed Jan 16 10:10:39 2008 -0800 Replace -I($builddir) with -I. to avoid breaking non-srcdir builds. This variable was expanding to an empty string, so the next -I flag was getting completely swallowed. Let's avoid being clever and just use . which is what we want in the expansion anyway. src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ad8d03967a2b68ab88a428df6b9d68e76002a88f Author: Carl Worth Date: Tue Jan 15 15:50:54 2008 -0800 Increment version to 1.5.6 and to 15:0:13 configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit fe27f4b9a34946b121b4259f057fdf3c52d1371b Author: Carl Worth Date: Tue Jan 15 15:47:48 2008 -0800 NEWS: Add notes for cairo 1.5.6 NEWS | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 95 insertions(+), 5 deletions(-) commit 1bccbd88c38c4438e94cf8936228c75e47be0af4 Author: Chris Wilson Date: Wed Jan 16 16:33:22 2008 +0000 [cairo-pdf-surface] Review error propagation from output stream. Ensure that errors encountered whilst processing the output stream are propagated back to the surface (and the user). src/cairo-pdf-surface.c | 291 ++++++++++++++++++++++++----------------------- 1 files changed, 147 insertions(+), 144 deletions(-) commit 20151fc53401dcc53ef3ab6a78c91a0a02afe497 Author: Chris Wilson Date: Wed Jan 16 16:33:22 2008 +0000 [cairo-ps-surface] Review error propagation during surface creation. Track the error during surface creation so that it can be returned to the user via _cairo_surface_create_in_error(). src/cairo-ps-surface.c | 36 +++++++++++++++++------------------- 1 files changed, 17 insertions(+), 19 deletions(-) commit 3daa63693c2f8f9cc3c7fa41ef1e4d69bd67b3cc Author: Chris Wilson Date: Wed Jan 16 16:33:22 2008 +0000 [cairo-svg-surface] Review error propagation during surface creation. Track the error during surface creation so that it can be returned to the user via _cairo_surface_create_in_error(). src/cairo-svg-surface.c | 124 +++++++++++++++++++++++++---------------------- 1 files changed, 66 insertions(+), 58 deletions(-) commit 7111b18c27d7ee0439339a6aa72f0e4244f883f9 Author: Chris Wilson Date: Wed Jan 16 16:23:23 2008 +0000 [cairo-surface] Introduce _cairo_surface_create_in_error(). Unexport all the static error surfaces and use a function to select the appropriate error surface for the status. src/cairo-array.c | 3 +- src/cairo-glitz-surface.c | 20 ++---- src/cairo-image-surface.c | 136 ++++-------------------------------- src/cairo-meta-surface.c | 12 +-- src/cairo-os2-surface.c | 22 +++---- src/cairo-paginated-surface.c | 8 ++- src/cairo-pdf-surface.c | 11 +-- src/cairo-png.c | 38 ++++++---- src/cairo-ps-surface.c | 9 +-- src/cairo-quartz-surface.c | 32 +++----- src/cairo-surface-fallback.c | 6 +- src/cairo-surface.c | 62 +++++++++++----- src/cairo-svg-surface.c | 20 ++---- src/cairo-win32-printing-surface.c | 10 +-- src/cairo-win32-surface.c | 37 ++++------ src/cairo-xcb-surface.c | 18 ++--- src/cairo-xlib-surface.c | 26 +++----- src/cairo.c | 4 +- src/cairoint.h | 6 +- src/test-fallback-surface.c | 5 +- src/test-meta-surface.c | 18 +++-- src/test-paginated-surface.c | 5 +- 22 files changed, 185 insertions(+), 323 deletions(-) commit 5cbc45488e276cb6e6ecfa7bc7dd4fae342de85e Author: Chris Wilson Date: Wed Jan 16 16:29:19 2008 +0000 [cairo-output-stream] Introduce _cairo_output_stream_create_in_error() Use a utility function to wrap an incoming error status into a new error stream. As a side-effect, all error streams must be destroyed as in the general case the caller can not distinguish between a static error object and one allocated to hold an unusual error status. src/cairo-base85-stream.c | 3 +++ src/cairo-deflate-stream.c | 7 ++----- src/cairo-output-stream-private.h | 3 +++ src/cairo-output-stream.c | 26 ++++++++++++++++++++++++-- src/cairo-ps-surface.c | 10 +++++++--- src/cairo-type1-fallback.c | 8 ++++---- src/cairo-type1-subset.c | 5 +++-- 7 files changed, 46 insertions(+), 16 deletions(-) commit 2c10c7559db11ccf511e119f4d4fb2da97508786 Author: Chris Wilson Date: Wed Jan 16 13:37:48 2008 +0000 [Makefile.am] Add -I$(builddir) for .c.i target Updated the CPP command so that it can find in the local build directory. src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e49db8ed3ea5727e00e2734a8877af860371be69 Author: Carl Worth Date: Wed Jan 16 08:11:51 2008 -0800 Fix create-for-stream test to log its failure properly Without this, a failure of this test won't be nicely reported in the post-make-check summary. (Also fix a silly little typo in the svg-clip test.) test/Makefile.am | 1 - test/create-for-stream.c | 13 +++++++++++-- test/svg-clip.c | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-) commit 57c2b75c229ac7811c573548ae50e6b0e4ecf862 Author: Vladimir Vukicevic Date: Tue Jan 15 14:27:14 2008 -0800 [quartz] Store the CGFontRef and reuse it for rendering Previously the CGFontRef was recreated each time in show_glyphs; this caused the font to get re-embedded in any PDF files that were being generated through Quartz. src/cairo-atsui-font.c | 18 ++++++++++++++++++ src/cairo-quartz-private.h | 3 +++ src/cairo-quartz-surface.c | 10 ++-------- 3 files changed, 23 insertions(+), 8 deletions(-) commit 968eaf3c44f37ada9c1d7005fc84ead797e11b58 Author: Chris Wilson Date: Mon Jan 14 18:09:32 2008 +0000 [cairo-xlib] Fixup --disable-xlib-xrender Fixup the headers and boilerplate to compile and run correctly when configured with --disable-xlib-xrender. boilerplate/Makefile.am | 2 +- boilerplate/cairo-boilerplate-xlib-private.h | 2 + boilerplate/cairo-boilerplate-xlib.c | 29 +++++++++++++++---------- boilerplate/cairo-boilerplate.c | 2 +- src/Makefile.am | 2 +- src/cairo-freelist-private.h | 3 +- src/cairo-xlib-display.c | 1 + src/cairo-xlib-private.h | 6 +---- src/cairo-xlib-screen.c | 1 + src/cairo-xlib-surface-private.h | 2 + src/cairo-xlib-surface.c | 6 +++++ src/cairo-xlib-xrender-private.h | 3 -- src/cairo-xlib-xrender.h | 8 +++--- test/xlib-surface.c | 1 - 14 files changed, 38 insertions(+), 30 deletions(-) commit 22d7f311f7733a57ece5d91708b2b5da9b71de86 Author: Behdad Esfahbod Date: Mon Jan 14 16:14:02 2008 -0500 [scaled-font] Upgrade glyph mask as needed in case of mixed-format glyphs In ecb895803b9d2a3fd142f4a2c694ca08c5581f0e Carl made fallback show_glyphs always use a A8 mask in case of mixed-format glyphs. That's suboptimal if there are ARGB32 glyphs. Using masks smartly we can implement the desired behavior. Done now. src/cairo-image-surface.c | 18 +++++++++++++++ src/cairo-scaled-font.c | 54 +++++++++++++++++++++++++-------------------- src/cairoint.h | 3 ++ 3 files changed, 51 insertions(+), 24 deletions(-) commit a5e5c1b5b04dd1d1138e96b7f4c097f14a1cd2cd Author: Chris Wilson Date: Sun Jan 13 15:00:58 2008 +0000 [test] Add a custom hook to summarise the failures. Add a check-local hook that scans the log fails and displays a list of failed tests (and the failing targets). test/Makefile.am | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 8d6249b2c1200dfaf3e98c40e82ab2796e9ef28c Author: Chris Wilson Date: Sun Jan 13 11:40:53 2008 +0000 [cairo-scaled-font] Add missing matrix guard to cairo_scaled_font_create(). cairo_scaled_font_create() did not check the user supplied ctm was valid, triggering an assertion later when computing the scale factors. src/cairo-scaled-font.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 3f59ef95482db478230bb7634209bb826b6a06d0 Author: Chris Wilson Date: Sun Jan 13 11:21:39 2008 +0000 [cairo-matrix] Tidy usage of HAVE_ISFINITE. Use a macro to switch between isfinite() and its fallback in order to avoid using an #ifdef from within a function. src/cairo-gstate.c | 25 ++++++------------------- src/cairo-matrix.c | 25 ++++++------------------- 2 files changed, 12 insertions(+), 38 deletions(-) commit 5e32dcf863cc8f40e2679c8c8c42e3ac927ab3c9 Author: Chris Wilson Date: Sun Jan 13 11:10:28 2008 +0000 [cairo-gstate] Check that the matrix remains invertible. Ensure that the ctm remains invertible after multiplying the user supplied matrices. Although the arguments are checked so that they are valid per se, we double check that the result after multiplication is still a valid invertible matrix. This should catch pathological cases where the user concatenates a long series of matrix operations, which either exceed our numerical limits or become degenerate through rounding errors. src/cairo-gstate.c | 16 ++++++++++++++++ 1 files changed, 16 insertions(+), 0 deletions(-) commit 2f600affaa9ac3537013c69643878731a2f4389e Author: Chris Wilson Date: Sun Jan 13 11:02:55 2008 +0000 [cairo-gstate] Add isfinite guards to the transformation ops. If we have isfinite() available use it to check that the user supplied arguments are valid. src/cairo-gstate.c | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) commit 3fed79d1c24f07618243bb197b44a9fd106aebbc Author: Chris Wilson Date: Sun Jan 13 10:28:11 2008 +0000 [cairo-paginated-surface] Set error on surface for operations done its behalf. Ensure that the error is propagated to the target surface if we fail whilst performing an operation on its behalf, for example set the size of the paginated surface. src/cairo-paginated-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 481b88dd6b19c267feaf05652974225e86aa8007 Author: Chris Wilson Date: Sat Jan 12 20:35:56 2008 +0000 [cairo-pattern] Add an ASSERT_NOT_REACHED On the default case for an unknown pattern type, add an assert that the code is never reached, and just in case upgrade the error to a fatal PATTERN_TYPE_MISMATCH. src/cairo-pattern.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 973d5fa8a50fbb0fb760f2e32a227a6238d074da Author: Chris Wilson Date: Sat Jan 12 11:04:03 2008 +0000 [test] Sort TESTS A couple of tests were out of order, causing a bit of confusion in the user. test/.gitignore | 2 +- test/Makefile.am | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) commit ac98c9e572135f5f46303ce49e6a04f86efe2676 Author: Chris Wilson Date: Sat Jan 12 10:49:48 2008 +0000 [test/rel-path] Check that invalid relative paths raise an error. Check that NO_CURRENT_PATH is raised if a relative path op is used on a new path. test/rel-path.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 66 insertions(+), 0 deletions(-) commit 6cc75cfe5b962566938189b5a7dd63135e981300 Author: Chris Wilson Date: Sat Jan 12 10:30:15 2008 +0000 [cairo] Harden the text API against NULL strings. Handle NULL strings in cairo_show_(text|glyph), cairo_(text|glyph)_(extents|path) without crashing. src/cairo.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 864dab828b4c860668adb48ff9361e9969b5259f Author: Chris Wilson Date: Sat Jan 12 10:01:36 2008 +0000 [test/text-zero-len] Test passing NULLs to the API. Check that the public API handles NULL - at the moment the code is a little inconsistent and crashes! test/text-zero-len.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 44 insertions(+), 1 deletions(-) commit ae1e044e328deec7a430de3724a7ae0ad958d22d Author: Chris Wilson Date: Sat Jan 12 00:31:42 2008 +0000 [cairo-matrix] Use isfinite() to check matrix determinant. The current NaN check is insufficient as it classifies inf as a valid determinant. We can improve the test by using isfinite() - but only when it is available. We use the feature test macros as being the simplest way of determining the presence of isfinite() as it may be implemented as a macro, making checking for its usability troublesome during configure. src/cairo-matrix.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) commit 3610841910714f0bca07caeb606be9c69fd9d4c8 Author: Kouhei Sutou Date: Fri Jan 11 14:36:05 2008 -0800 Fix typo in comment. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0b9124069271593be390d9835fcd1527b20770e3 Author: Chris Wilson Date: Fri Jan 11 21:55:52 2008 +0000 [check-plt.sh] Ensure that $MAKE is defined. Copy the check from check-def.sh now that $MAKE is also used in check-plt.sh src/check-plt.sh | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 92c744978f0c08456cf0ec8dca87abebf6a6d150 Author: Chris Wilson Date: Fri Jan 11 21:54:58 2008 +0000 [Makefile.am] Tweak the flags passed to CPP. Adjust the flags passed to $(CPP) to match those used in the surrounding targets (splint and sparse), which should improve their reliability. src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 36f5d69a1165f81e97b50c64dde33fa19db36326 Author: Behdad Esfahbod Date: Fri Jan 11 16:48:55 2008 -0500 [src/Makefile.am] Tweak includes a bit src/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ed113ef4229e23d137b2673f233a23064f51ff24 Author: Chris Wilson Date: Fri Jan 11 21:13:05 2008 +0000 [check] Move the hidden symbol check into check-{def,plt}.sh Behdad, once again the arbiter of good taste, objected to the use of the dotfile within the Makefile, and suggested that one calls $MAKE to pre-process the source file from within the check scripts. Doing so removes the ugly wart added to Makefile.am... src/Makefile.am | 14 +++++--------- src/check-def.sh | 4 ++-- src/check-has-hidden-symbols.c | 11 +---------- src/check-plt.sh | 4 ++-- 4 files changed, 10 insertions(+), 23 deletions(-) commit bcf0c442b91b553b226c78d254906f7127013391 Merge: ecb8958... 8a6a0b4... Author: Carl Worth Date: Fri Jan 11 12:30:15 2008 -0800 Merge branch 'master' of git.cairographics.org:/git/cairo into cairo commit ecb895803b9d2a3fd142f4a2c694ca08c5581f0e Author: Carl Worth Date: Fri Jan 11 12:28:49 2008 -0800 Migrate glyph mask to A8 in case of mixed-format glyphs. This fixes the remaining image-backend problems with bug 13479: Ugly Courier New font with cairo 1.4.12 https://bugs.freedesktop.org/show_bug.cgi?id=13479 although the xlib-backend had been fixed previously. Specifically, if an A1 glyph is first encountered, then subsequent glyphs will still be rendered with antialiasing, (previously they would be rendered very poorly without antialiasing). Similarly, if the first glyph encountered has component-alpha sub-pixel antialiasing and then an A1 or A8 glyph is encountered then all glyphs will rendered in A8 (grayscale antialiasing). Previously, the non-subpixel-antialiased glyphs would not appear at all. src/cairo-scaled-font.c | 50 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 47 insertions(+), 3 deletions(-) commit 8a6a0b43dc249acb0ad8cb9c6f16360294bcfdc3 Author: Chris Wilson Date: Fri Jan 11 18:47:19 2008 +0000 [check] Replace compiled symbol visibility checker with shell script. Behdad Esfahbod objected to the execution of a compiled program to check symbol visibility as it makes cross-compilation more difficult. Instead of executing the program, this method conditionally exports a variable if cairo uses symbol hiding and scans the executable for that symbol in a similar manner to check-def.sh. This has the slight advantage of using the Makefile for performing the compilation, rather than attempting to invoke $(CPP) from a shell script within the test environment. src/Makefile.am | 12 ++++++++---- src/cairo-compiler-private.h | 5 ++--- src/check-def.sh | 11 ++++++----- src/check-has-hidden-symbols.c | 12 ++++++++++++ src/check-plt.sh | 14 ++++++++------ src/compiler-supports-visibility.c | 6 ------ 6 files changed, 36 insertions(+), 24 deletions(-) commit 982f65081f987e2c44f05942411c031bd32fd968 Author: Chris Wilson Date: Fri Jan 11 17:25:33 2008 +0000 [cairoint.h] Compile time check for a font backend. Add a paranoid check that at least one font backend is available - this should have been already caught by configure, but it should help if a new font backend is ever added. src/cairoint.h | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 6d3ed950ea075ff2a5a569365b46c3cfc4152787 Author: Chris Wilson Date: Fri Jan 11 16:16:20 2008 +0000 [check] Skip def/plt tests if the compiler doesn't support symbol hiding. Compile a trivial program such that it reports whether cairo is hiding its internal symbols and skip the tests that depend upon it. This prevents false errors, such as bug 12726, where the user is presented with a scary make check failure. src/Makefile.am | 5 +++++ src/cairo-compiler-private.h | 3 +++ src/check-def.sh | 5 +++++ src/check-plt.sh | 5 +++++ src/compiler-supports-visibility.c | 6 ++++++ 5 files changed, 24 insertions(+), 0 deletions(-) commit be146f02e0e220aa70217bf348beef301a56f898 Author: Chris Wilson Date: Fri Jan 11 15:28:52 2008 +0000 [Makefile.am] Update cairo.def after the set of enabled features is modified. Bug 13342 corresponds with a rebuild of cairo after removing --enable-glitz from the configure line. Under these circumstances, the remaining installable headers are not modified and therefore cairo.def is not rebuilt and still expects to find a reference to cairo_glitz_surface_create. The solution is to rebuild cairo.def after any modification to the 'public' headers (installable or otherwise). src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c26784dbb6d3c90f9e3fa722efa0f9f4fd59bd4c Author: Chris Wilson Date: Fri Jan 11 14:04:56 2008 +0000 [configure] Version bump for $(EXEEXT) Adrian Johnson found that adding $(EXEEXT) to TESTS broke the build under mingw. After a bit of investigation, the issue was tracked down to being caused by automake-1.7. Bump the autotools version requirements to avoid the breakage. configure.in | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 2574cc35b3478e7333bd4953e90a3edc5f7c4f16 Author: Adrian Johnson Date: Fri Jan 11 22:07:26 2008 +1030 win32-printing: Do not clip and paint with an empty path For non solid patterns _fill and _show_glyphs sets a clip path then paints the pattern. Previously if the path is empty SelectClipPath did not set clip. This was probably the cause of bug 13657 where the entire page was black. Fix this by not painting anything if the path is empty. src/cairo-win32-printing-surface.c | 8 ++++++-- src/cairo-win32-private.h | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) commit 7ef4caaf11379cb50a08520f729552553de60660 Author: Adrian Johnson Date: Fri Jan 11 22:06:51 2008 +1030 win32-printing: use fill instead of clip for non win32 fonts Non Windows fonts are drawn by getting the outline path, setting this is the clip path, and painting the source pattern. For solid colors this can avoid the clip and just do a fill. src/cairo-win32-printing-surface.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) commit ef56a6fd93d6192ee1f1948d11c75878aea40f4e Author: Adrian Johnson Date: Fri Jan 11 22:05:54 2008 +1030 PS: Don't use language level check in EPS As 'showpage' and 'quit' can not be used in EPS. src/cairo-ps-surface.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit b703199525ca02274ef5a8474cdae0cb70705964 Author: Adrian Johnson Date: Fri Jan 11 22:05:13 2008 +1030 Type1-subset: Font name may be NULL If the FreeType face->family_name is NULL use a CairoFont-x-y name. src/cairo-type1-subset.c | 37 ++++++++++++++++++++++++------------- 1 files changed, 24 insertions(+), 13 deletions(-) commit 6418a8be8719c9a969d9ec1f8624c841db9d2b90 Author: Chris Wilson Date: Thu Jan 10 21:35:05 2008 +0000 [test/.valgrind-suppressions] Update for amd64/sid Update the valgrind suppressions for the libz and Xrm spam. test/.valgrind-suppressions | 20 +++++++++++++++++--- 1 files changed, 17 insertions(+), 3 deletions(-) commit 2e5f278da11369073eefeeedff7211bacb31ace1 Author: Chris Wilson Date: Thu Jan 10 22:11:42 2008 +0000 [cairo-pattern] Free the copied pattern on error. Free the locally allocated pattern if the copy fails. src/cairo-pattern.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit db246f2fa22920a996a32f11233228e9af1d1abb Author: Chris Wilson Date: Thu Jan 10 21:32:47 2008 +0000 [cairo-traps] Typo caught by valgrind. ==3429== Conditional jump or move depends on uninitialised value(s) ==3429== at 0x4E3FB0F: _cairo_box_round_to_rectangle (cairo-fixed-private.h:196) ==3429== by 0x4E34B29: _cairo_clip_intersect_to_rectangle (cairo-clip.c:162) ==3429== by 0x4E31943: cairo_push_group_with_content (cairo.c:495) ==3429== by 0x403044: draw (clip-zero.c:48) ==3429== by 0x404221: cairo_test_expecting (cairo-test.c:377) ==3429== by 0x64701C3: (below main) (libc-start.c:222) Caused by setting extents->p2.y to zero twice. src/cairo-traps.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 10f6ef98f645d9f9f54d88fcf18683771258d36f Author: Chris Wilson Date: Thu Jan 10 17:50:45 2008 +0000 [gitignore] Add mkinstalldirs. Ignore another autoconf utility script. .gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit da769b53e89b1f1ff91886a12a388e5fadec47bb Author: Chris Wilson Date: Thu Jan 10 17:23:56 2008 +0000 [configure.in] Fixup usage of _CHECK_FUNCS_WITH_FLAGS within PKG_CHECK_MODULE. An unwanted side-effect of the recent fix for the paranoid extra check for a usable library was that it broke the logic for the absence of the module. configure.in | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit 409e91b576ad992b41c66c952931c4a3e652dbf9 Author: Chris Wilson Date: Thu Jan 10 15:53:54 2008 +0000 [cairo-pdf-surface] Review error handling. Ensure all errors are propagated back to the caller with locally allocated resources destroy as required. src/cairo-pdf-surface.c | 261 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 177 insertions(+), 84 deletions(-) commit 6134600988a6b5fcbc72f7897bfc83b37949b677 Author: Chris Wilson Date: Tue Jan 8 14:14:33 2008 +0000 [cairo-pdf-surface] Skip emitting the font subset if not among resources. Do not emit the font_subset if we did not successfully add it to the list of font resources - can only happen after an error src/cairo-pdf-surface.c | 35 +++++++++++++++++++++++------------ 1 files changed, 23 insertions(+), 12 deletions(-) commit 755a4bb51b458fbc059b6306e371d9dc1c906b04 Author: Chris Wilson Date: Thu Jan 10 15:30:42 2008 +0000 [test] Win32 printing backend testing depends upon ghostscript Using the Win32 printing backend requires ghostscript, so only enable those tests if we detect 'gs' during configure. boilerplate/cairo-boilerplate.c | 2 ++ configure.in | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-) commit 02b0743458655f44ffc4d429b4ac355df42071f1 Author: Chris Wilson Date: Thu Jan 10 15:22:16 2008 +0000 [cairo-pattern] Rearrange CAIRO_MUTEX_INITIALIZE. test/pattern-get-type exposes a bug whereby we try to acquire the _cairo_pattern_solid_pattern_cache_lock before initializing the mutexes. To fix this move the CAIRO_MUTEX_INITIALIZE() from the depths of _cairo_pattern_init() and perform it at the public entry points. src/cairo-pattern.c | 14 ++++++++++++-- 1 files changed, 12 insertions(+), 2 deletions(-) commit cbe8d3855efd1254089c1c855c337df326ea52d7 Author: Chris Wilson Date: Thu Jan 10 15:14:15 2008 +0000 [test] Fixup make check for mingw Add EXEEXT to TESTS so that mingw builds the correct target. perf/Makefile.am | 8 +- test/Makefile.am | 313 +++++++++++++++++++++++++++--------------------------- 2 files changed, 161 insertions(+), 160 deletions(-) commit 9ae4b219e1c5b7a8c139b004a97d86a1ce1d408c Author: Chris Wilson Date: Thu Jan 10 14:47:16 2008 +0000 [test/solid-pattern-cache-stress] Check for drand48(). Apply an alternative rand() function if drand48() is not available for the platform. configure.in | 2 +- test/solid-pattern-cache-stress.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) commit 648289c639618cc31394f889f6e329ddcaca41ee Author: Chris Wilson Date: Thu Jan 10 14:36:57 2008 +0000 [configure.in] Add paranoid double checking for (svg|pdf)2png Due to my incomplete cross-build environment, configure detects the presence of rsvg and poppler, but they cannot be used. To make my life easier, add a check similar to that used for fontconfig to ensure the libraries are usable before compiling the optional test utilites. configure.in | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 909c57ce158e41bf2761f82b2678dc1f390051d2 Author: Chris Wilson Date: Thu Jan 10 12:45:58 2008 +0000 [cairo-pdf-operators] Be consistent in error checks. Consistently check the output status at the end of each function - helps with early error detection and even improves test code coverage! src/cairo-pdf-operators.c | 39 ++++++++++++++++++++------------------- 1 files changed, 20 insertions(+), 19 deletions(-) commit 4ffb0a80b3aa9e54804082a24c58db0d2527073d Author: Chris Wilson Date: Thu Jan 10 12:51:07 2008 +0000 [cairo-paginated-surface] Call the abstract cairo_surface_show_page (). Use the generic surface layer cairo_surface_show_page() instead of directly calling cairo_paginated_surface_show_page(), as the higher level performs more error checking. src/cairo-paginated-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9d49c4b10e636c0868d15c50cb1d2a724000fc07 Author: Chris Wilson Date: Thu Jan 10 14:18:25 2008 +0000 [configure] Print version info in summary. Add the cairo version to the configure summary. configure.in | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit ea4dec08f7c62ad3c3e81aa06ce0dd5a08936c45 Author: Chris Wilson Date: Thu Jan 10 13:50:42 2008 +0000 [configure.in] Fixup fontconfig check. Correct the check for FcFini() so that the result is actually used. configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f4e7e7d6b4bb8e96dc8aef1ac673b8d64f65634c Author: Chris Wilson Date: Thu Jan 10 13:08:23 2008 +0000 [cairo-path-bounds] _cairo_path_fixed_bounds() should never fail. _cairo_path_fixed_bounds() should never fail so change return type to void and update caller. src/cairo-analysis-surface.c | 12 ++++-------- src/cairo-path-bounds.c | 8 ++++---- 2 files changed, 8 insertions(+), 12 deletions(-) commit 5fad969317186520ebbe09f3767907fb3bfd6164 Author: Chris Wilson Date: Mon Jan 7 10:03:51 2008 +0000 [cairo-ft-font] Destroy unscaled font ref on error. Destroy the local reference taken to the unscaled font if we encounter an error whilst creating the derived scaled font. src/cairo-ft-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 3b1411167c7d9fd94536c69de54dacfaf820e916 Author: Chris Wilson Date: Thu Jan 10 12:55:08 2008 +0000 [headers] Brute force fixup of including cairoint.h from boilerplate. More the majority of the typedefs from cairoint.h to cairo-types-private.h and fixup cairo-pdf-operators-private.h to avoid including cairoint.h. A better approach would seem to be to rationalise cairoint.h so that it only provides the symbol aliasing, moving the types and functions to more appropriate private headers. However, this fixes the immediate problem of running make check! src/cairo-pdf-operators-private.h | 3 +- src/cairo-types-private.h | 169 ++++++++++++++++++++++++++++++++++++ src/cairoint.h | 170 +------------------------------------ 3 files changed, 172 insertions(+), 170 deletions(-) commit 40142d4bf4184dcae21c85d909d33ddaa4822636 Author: Adrian Johnson Date: Thu Jan 10 02:57:30 2008 +1030 Set the PS level to to minimum required A problem with the previous commit for checking the PS level is that with the default PS level of 3 it prevents PS files from printing on Level 2 printers even if no Level 3 operators are used. As the PS header is created after the page content has been generated, it is easy to check the PS Level actually required and set this in the header and PS level check code. src/cairo-ps-surface-private.h | 1 + src/cairo-ps-surface.c | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) commit 9bccc968466e6b83ceccb76680d5f54912424e8e Author: Adrian Johnson Date: Thu Jan 10 02:34:02 2008 +1030 Add PS Level check to PS output http://bugzilla.mozilla.org/show_bug.cgi?id=406376 reported problems with cairo PostScipt output printing black boxes instead of images. This was found to caused by printing Level 3 PostScript to a Level 2 printer. Add some PostScript code to to the cairo PS prolog to check the language level of the printer. If the printer can not print the job, a message stating the required language level is printed and the job is aborted. src/cairo-ps-surface.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit f20a1a40c3f6d95b4dc89ae4198ad81b7092450c Author: Adrian Johnson Date: Wed Jan 9 01:20:34 2008 +1030 Fix MSVC 2008 compiler warnings - bug 13698 src/cairo-win32-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 47bebc8f1d0b6524f8d1eff1fa3f981f1e4c4c33 Author: Adrian Johnson Date: Wed Jan 9 01:18:44 2008 +1030 Fix win32-font problems with Type 1 fonts This should fix the problems reported in http://lists.cairographics.org/archives/cairo/2007-November/012172.html The problem is that GetCharacterPlacement() used in _win32_scaled_font_text_to_glyphs returns utf16 instead of glyph indices when Type 1 fonts are used. This has been fixed by using GetGlyphIndices instead of GetCharacterPlacement if the font is a Type 1. _win32_scaled_font_map_glyphs_to_unicode has been fixed work with Type 1 glyph indices. It now uses GetFontUnicodeRanges and GetGlyphIndices to do the reverse lookup. src/cairo-win32-font.c | 261 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 218 insertions(+), 43 deletions(-) commit 25f24e79f84e0c04a8c6944cc6e018e9eb2df997 Author: Adrian Johnson Date: Mon Jan 7 21:19:35 2008 +1030 PDF: Update the PDF page structure comment src/cairo-pdf-surface.c | 68 +++++----------------------------------------- 1 files changed, 8 insertions(+), 60 deletions(-) commit 21f842f0dfd5dd3cc1fd3b56db034fc4e209adaa Author: Adrian Johnson Date: Mon Jan 7 21:17:26 2008 +1030 PDF: Remove copy_page Now that the content stream is no longer split into multiple streams it is not possible to implement a copy_page function that shares the common content between pages. Remove this function so the paginated surface will rewrite the content from the meta surface. src/cairo-pdf-surface.c | 15 +-------------- 1 files changed, 1 insertions(+), 14 deletions(-) commit e2adb921f8b7619410db971d1524cbeab2dd6102 Author: Adrian Johnson Date: Mon Jan 7 21:15:18 2008 +1030 PDF: Put each fallback image in a separate group Each fallback image needs to be in a separate group in the knockout group. Otherwise transparent edges of adjacent fallback images will composite with each other creating visible seams between the images. src/cairo-pdf-surface-private.h | 2 +- src/cairo-pdf-surface.c | 26 ++++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) commit d6a84302a07d2b7e67584029fdb7a882ad246a09 Author: Adrian Johnson Date: Mon Jan 7 21:11:46 2008 +1030 Fix analysis of transformed meta surfaces src/cairo-analysis-surface.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) commit 3c725d50db43b848b4ad8f35bcabd5b1d0395924 Author: Adrian Johnson Date: Mon Jan 7 21:09:04 2008 +1030 PDF: Make _SOURCE operator work inside meta surface patterns src/cairo-pdf-surface.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit 6d6b74ac4ce3a9bcab45c338fc31e5a83823cde6 Author: Adrian Johnson Date: Mon Jan 7 21:08:09 2008 +1030 PDF: Support _OPERATOR_SOURCE when nothing under the operation CAIRO_OPERATOR_SOURCE operations on the PDF backend are now natively supported when there is nothing already underneath the operation. src/cairo-pdf-surface.c | 64 +++++++++++++++++++++------------------------- 1 files changed, 29 insertions(+), 35 deletions(-) commit e195cb551caa40f309127ac7a39e4a17653966c8 Author: Adrian Johnson Date: Mon Jan 7 21:05:36 2008 +1030 Add FALLBACK mode to paginated surface The PDF surface needs to know when the fallback images start so it can close off the content stream and create a knockout transparency group for the fallback images. Currently it does this by looking for operations with CAIRO_OPERATOR_SOURCE. PDF returns unsupported for _SOURCE during the analysis phase so _SOURCE will never appear during native operations. However this prevents the PDF surface from supporting _SOURCE operations that can be natively supported. For example a _SOURCE operation with nothing painting under it can be converted to _OVER and natively supported. A third mode, CAIRO_PAGINATED_MODE_FALLBACK, has been added. The paginated surface will set this mode before it paints finer-grained fallback images. src/cairo-paginated-private.h | 22 +++++++++++++--------- src/cairo-paginated-surface.c | 4 +++- src/cairo-pdf-surface.c | 2 +- src/cairo-types-private.h | 3 ++- 4 files changed, 19 insertions(+), 12 deletions(-) commit d2a5d1ace64cb9efabcb065e7fc28667dd8f779d Author: Adrian Johnson Date: Mon Jan 7 21:04:06 2008 +1030 PDF: Remove the remaining code for splitting the content across multiple streams. This fixes the problem reported here http://lists.cairographics.org/archives/cairo/2007-December/012197.html src/cairo-pdf-surface-private.h | 20 +-- src/cairo-pdf-surface.c | 429 +++++++++++---------------------------- 2 files changed, 123 insertions(+), 326 deletions(-) commit 099810b6c39cc6b5529f740282b64185cf56c8d7 Author: Adrian Johnson Date: Mon Jan 7 20:59:22 2008 +1030 PDF: Perform all clipping in the content stream Previously this was done in a separate group. Now that the PDF backend has been re-organized to not interrupt the content stream the clipping can be done in the same stream. src/cairo-pdf-surface.c | 104 +++++----------------------------------------- 1 files changed, 12 insertions(+), 92 deletions(-) commit 83630b1c70b24035b333ccfbbda8b67bd5fdd32e Author: Adrian Johnson Date: Mon Jan 7 20:55:56 2008 +1030 PDF: Emit all patterns after content stream To fix this performance issue http://lists.cairographics.org/archives/cairo/2007-December/012197.html the PDF surface needs to avoid starting and stopping the content stream every time it emits a pattern. This patch makes the PDF surface store a list of all patterns used while the content stream is written out then write out all the patterns after the content stream is closed. src/cairo-pdf-surface-private.h | 48 ++- src/cairo-pdf-surface.c | 1128 ++++++++++++++++++++++----------------- 2 files changed, 687 insertions(+), 489 deletions(-) commit b4e0864b960887fd71de85d514cb3e855c276080 Author: Adrian Johnson Date: Mon Jan 7 20:42:15 2008 +1030 Use _cairo_pattern_create_copy() in cairo-surface.c Use _cairo_pattern_create_copy()/cairo_pattern_destroy() instead of _cairo_pattern_init_copy()/_cairo_pattern_fini() so the PDF backend can reference the patterns and destroy them later. src/cairo-surface.c | 84 +++++++++++++++++++++++++------------------------- 1 files changed, 42 insertions(+), 42 deletions(-) commit 6ead8feaf3f87e12e686092386dddcc2faa62b7f Author: Adrian Johnson Date: Mon Jan 7 20:41:43 2008 +1030 Add _cairo_pattern_create_copy() src/cairo-pattern.c | 28 ++++++++++++++++++++++++++++ src/cairoint.h | 4 ++++ 2 files changed, 32 insertions(+), 0 deletions(-) commit 26c6159b1e2f5481fb18f5f06f01063002dd6c98 Author: Adrian Johnson Date: Mon Jan 7 20:36:32 2008 +1030 Move the PDF drawing operators into cairo-pdf-operators.c By defining PostScript functions the same as the PDF drawing operators, this code can be shared by both the PDF and PS backends. src/Makefile.am | 1 + src/cairo-pdf-operators-private.h | 106 ++++++++ src/cairo-pdf-operators.c | 531 +++++++++++++++++++++++++++++++++++++ src/cairo-pdf-surface-private.h | 3 +- src/cairo-pdf-surface.c | 442 ++++--------------------------- 5 files changed, 687 insertions(+), 396 deletions(-) commit a0e0aae32dfe44cca088736d10d208f328d50a34 Author: Adrian Johnson Date: Mon Jan 7 20:34:55 2008 +1030 PDF: Remove the Type 3 outline glyph code This code is never used because outline glyphs that go through the fallback path are always embedded with Type 1 fallback. The only fonts that are embedded as Type 3 are bitmap fonts. src/cairo-pdf-surface.c | 90 +++------------------------------------------- 1 files changed, 6 insertions(+), 84 deletions(-) commit 5b3f6405d8045d73d31d7e2e30db08e81e9e2360 Author: Adrian Johnson Date: Sun Jan 6 16:15:32 2008 +1030 PDF: Fix gradient-zero-stops test failure src/cairo-pdf-surface.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) commit fb7407c9c4548fc033164790759c4e480b9d8fa0 Author: Adrian Johnson Date: Sun Jan 6 15:58:46 2008 +1030 PS: Fix gradient-zero-stops test failure src/cairo-ps-surface.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit f440d894e668994721248dc6c95a936a839870db Author: Chris Wilson Date: Sat Jan 5 21:20:45 2008 +0000 Check errno for appropriate error return. After using fopen() and friends check the global errno to determine the most appropriate error return - especially important when running memfault, where correct reporting of NO_MEMORY errors is required. src/cairo-output-stream.c | 12 ++++++++++-- src/cairo-png.c | 10 ++++++++-- src/cairo-ps-surface.c | 11 ++++++++++- 3 files changed, 28 insertions(+), 5 deletions(-) commit 68a441e582c6c887e65800302906ddd35cb0291e Author: Chris Wilson Date: Sat Jan 5 19:34:42 2008 +0000 [cairo-analysis-surface] Return early if the traps is empty. If the mask is empty, there is nothing to do, so return an early SUCCESS. src/cairo-analysis-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 481fd3b4c8d3972ce21399f81b2021a57ed58f00 Author: Chris Wilson Date: Sat Jan 5 19:33:21 2008 +0000 [cairo-traps] Return zero extents if it contains no traps. Previously, _cairo_traps_extents () returned the extents p1={INT_MAX, INT_MAX} p2={INT_MIN, INT_MIN} for an empty traps leading to integer overflow when computing the width using p2-p1 and causing further overflows within libpixman. [For example this caused the allocation of massive regions with test/mask and the PS backend.] src/cairo-gstate.c | 6 +++--- src/cairo-traps.c | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) commit be126b6842e979dbcb306b2f9f41a2114a149b9a Author: Chris Wilson Date: Sat Jan 5 19:22:57 2008 +0000 [cairo-analysis-surface] Check for an empty transformed bbox. After transforming the bbox, check that it has not been projected into an empty box. src/cairo-analysis-surface.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit d9461733af36f2960525a9b33accf500447f5c64 Author: Chris Wilson Date: Fri Jan 4 16:43:54 2008 +0000 [cairo-ps-surface] Use ctime_r when available. Use the thread-safe (and non-allocating) ctime_r() instead of ctime() if supported by the platform. configure.in | 2 +- src/cairo-ps-surface.c | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) commit 7cf9a6e4e39b18f4967afdb7c3c71eca5f4ba8c7 Author: Keith Packard Date: Thu Jan 3 18:37:53 2008 -0800 Directly check the miter corner to detect wild miters. The original test for wild miters would only work with a square transform (and, in fact, the original code required an identity transform). Instead of fixing that, I replaced it with a more obvious test which makes sure the miter corner lies between the two faces and not out in space somewhere. src/cairo-path-stroke.c | 139 +++++++++++++++++++---------------------------- 1 files changed, 57 insertions(+), 82 deletions(-) commit 552cf1dbd32eb5933bc93bb3c1ef0fca9d4066aa Author: Vladimir Vukicevic Date: Fri Jan 4 16:19:14 2008 -0800 Fix cairo_surface_fallback_snapshot's use of release_source_image &image_extra was being passed instead of image_extra to release; the bug only manifested itself when the particular backend did something with image_extra. src/cairo-surface-fallback.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 81e029edda8c0404c6f0bd1b618e77fb55777c64 Author: Keith Packard Date: Thu Jan 3 18:17:24 2008 -0800 Add new miter-precision test. Checks miter joins at many scales. This demonstrates an error in cairo where miter joins are replaced with bevels at high scale factors due to a test added to eliminate wild miters drawn when the line faces are nearly parallel. test/.gitignore | 1 + test/Makefile.am | 1 + test/miter-precision-ref.png | Bin 0 -> 931 bytes test/miter-precision.c | 80 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 0 deletions(-) commit b796a2f69d043f6884f42befdc156cb1c527d217 Author: Chris Wilson Date: Thu Jan 3 23:00:27 2008 +0000 [cairo] Update CAIRO_STATUS_LAST_STATUS A couple of new errors have been added without updating the LAST_STATUS value... src/cairo.c | 2 +- src/cairo.h | 1 + 2 files changed, 2 insertions(+), 1 deletions(-) commit c67d99787cb75cd4d773871675b4201b3bf3d5bf Author: Chris Wilson Date: Thu Jan 3 17:33:33 2008 +0000 [test/surface-pattern-big-scaled-down] Kill the surface leaks. Destroy the surface and pattern after use. test/Makefile.am | 1 + test/surface-pattern-big-scale-down-ref.png | Bin 0 -> 226 bytes test/surface-pattern-big-scale-down.c | 11 ++++++++--- 3 files changed, 9 insertions(+), 3 deletions(-) commit 6a7a07adf98729fc054ea9e7727c5b3c099ae7ee Author: Chris Wilson Date: Thu Jan 3 16:37:17 2008 +0000 [test] Update distribution list of ref images. Add missing *-ps-rgb24-ref.png images, and a couple of tests to .gitignore. test/.gitignore | 3 +++ test/Makefile.am | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 0 deletions(-) commit 399f7c24e31a802e623cf9d63311f3ed7f3a3659 Author: Chris Wilson Date: Tue Oct 9 23:24:35 2007 +0100 [cairo-pdf-surface] Continue to close streams even after error. Do not return after encountering the first error whilst closing streams, but continue to close any auxiliary streams before finally reporting the error. Also during finalize check that we have closed any streams that may have been left open after encountering an error. src/cairo-pdf-surface.c | 54 ++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 44 insertions(+), 10 deletions(-) commit 42e77c1077f389357faab214d7ad8bc18709cb31 Author: Chris Wilson Date: Tue Oct 9 16:59:45 2007 +0100 [cairo-pdf-surface] Destroy closed streams. Destroy the streams when closing groups in order to free the associated resources. src/cairo-pdf-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 42bfe370f8df800419c1c7acbec1a7e51077d462 Author: Chris Wilson Date: Thu Jan 3 14:46:40 2008 +0000 [cairo-pdf-surface] Propagate error from emit_glyph(). Propagate the error and return early rather than setting the error on the surface and continuing. src/cairo-pdf-surface.c | 31 ++++++++++++++++++++----------- 1 files changed, 20 insertions(+), 11 deletions(-) commit 2a8e80f59ef61cff30d643bdd6ad2306d6068c5c Author: Chris Wilson Date: Thu Jan 3 10:34:37 2008 +0000 [cairo-gstate] Rearrange invalid-matrix guards. Test for an invalid matrix before use. Whilst this has no effect on the result, an INVALID_MATRIX error will be raised on the context, placing the guards first makes the code obviously safe and avoids manipulation of invalid matrices. src/cairo-gstate.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) commit e89cc8fa15ac418175e58ee41359a923bbc26f73 Author: Chris Wilson Date: Tue Dec 18 09:23:29 2007 +0000 [cairo-scaled-fonts-subsets] Memleak and error reporting. Fix leaks of strings and hash table from _cairo_scaled_font_subset_create_glyph_names(). Whilst we are in the vicinity, review the error handling. src/cairo-ft-font.c | 8 ++- src/cairo-pdf-surface.c | 12 ++++- src/cairo-scaled-font-subsets.c | 94 ++++++++++++++++++++------------------- src/cairo-win32-font.c | 6 ++- src/cairoint.h | 2 +- 5 files changed, 68 insertions(+), 54 deletions(-) commit 51f37995c9cb5efa22a36a0199e24a684fa61279 Author: Chris Wilson Date: Wed Jan 2 11:06:03 2008 +0000 Remove cairo_private from *.c files. The cairo_private markup is only required in the headers, so cleanup the couple of remaining occurrences in the source files. src/cairo-clip.c | 2 +- src/cairo-scaled-font-subsets.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 48fd65cdb50cd1fa0a6ada5edf7ef307586eb5fd Author: Chris Wilson Date: Wed Jan 2 10:59:44 2008 +0000 [cairo-svg-surface] Propagate the original error status. Return the error status from the paginated surface instead of hard-coding a bare CAIRO_STATUS_NO_MEMORY. src/cairo-svg-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ba392488cb926c2697b8ccfa7337da1e66d78baa Author: Chris Wilson Date: Wed Jan 2 10:58:13 2008 +0000 [cairo-ps-surface] Wrap error site with _cairo_error(). Wrap the original allocation error site with _cairo_error(). src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4442acc96601db21a788e088040cb1f2fccdf400 Author: Chris Wilson Date: Wed Jan 2 10:54:30 2008 +0000 [cairo-atsui-font] Minor _cairo_error() tidy. Inline the use of _cairo_error() for slightly improved readability. src/cairo-atsui-font.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 2a0267639a39cacada89c59451faa8051041e436 Author: Chris Wilson Date: Wed Jan 2 10:52:28 2008 +0000 [cairo-ps-surface] Wrap error site with _cairo_error(). Markup the original error site for CAIRO_STATUS_TEMP_FILE_ERROR with _cairo_error(). src/cairo-ps-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit cc5bd4725564d0add79c764b35acff78e43d0c00 Author: Chris Wilson Date: Wed Jan 2 10:50:55 2008 +0000 [cairo-svg-surface] Wrap a couple of error sites with _cairo_error(). Wrap a couple of bare CAIRO_STATUS_NO_MEMORY with a call to _cairo_error(). src/cairo-svg-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit daf77ed3cb0d24f35ebb43760d6ba6de639d4636 Author: Chris Wilson Date: Wed Jan 2 10:41:06 2008 +0000 [cairo-type1-subset] Remove the unused return value. Nobody actually used the index returned by cairo_type1_font_subset_use_glyph(), so remove it. src/cairo-type1-subset.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) commit fd8bf678536877d9b016264d40a101a1fd2d9e25 Author: Chris Wilson Date: Wed Jan 2 10:37:58 2008 +0000 [cairo-truetype-subset] Propagate error from failing to allocate padding. Before filling the padding, check that we have successfully allocated the buffer - otherwise propagate the failure. src/cairo-truetype-subset.c | 51 +++++++++++++++++++++++++++---------------- 1 files changed, 32 insertions(+), 19 deletions(-) commit ad0a2524ffdc9cc949d11de3aa51c429f13e12b7 Author: Claudio Ciccani Date: Wed Jan 2 15:09:58 2008 +0100 [cairo-directfb] Optimize blend functions in fill_rectangles(), too. src/cairo-directfb-surface.c | 25 ++++++++++++++++++++++++- 1 files changed, 24 insertions(+), 1 deletions(-) commit 060f384310e887f7f431a98e847b8a36fc303a0c Author: Adrian Johnson Date: Sat Dec 29 00:26:11 2007 +1030 Fix PS/PDF meta surface patterns This was failing with more than one level of push/pop group. The problem was that the meta surface replay in PS/PDF emit_meta_surface was replaying all the meta surface commands insteads of only the natively supported commands. The analysis surface has also been changed to replay meta surface patterns back to the one analysis surface instead of creating a separate analysis surface for each pattern. The analysis surface now transforms bounding boxes with the meta surface pattern matrix so that fallback regions are correctly tracked. src/cairo-analysis-surface.c | 44 +++++++++++++++++++++++++++++++--------- src/cairo-meta-surface.c | 18 +--------------- src/cairo-paginated-surface.c | 1 + src/cairo-pdf-surface.c | 4 ++- src/cairo-ps-surface.c | 20 ++++++++++++------ 5 files changed, 52 insertions(+), 35 deletions(-) commit 4fa46e3caaffb54f4419887418d8d0ea39816092 Author: Adrian Johnson Date: Sat Dec 29 00:15:03 2007 +1030 Implement a win32 tmpfile() function Bug report and proposed patch at: http://lists.cairographics.org/archives/cairo/2007-December/012529.html On Windows the tmpfile() function creates the file in the root directory. This will fail if the user does not have write access to the root directory. Implement _cairo_win32_tmpfile() that is #defined as tmpfile() on Windows. This function uses GetTempPath() and GetTempFileName() to create the temporary file. CreateFile() is used to open the file so the DELETE_ON_CLOSE flag can be set. src/Makefile.am | 3 +- src/cairo-win32.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 6 +++ 3 files changed, 106 insertions(+), 1 deletions(-) commit dcacad932334bbcc3cf6b1df3b37412db5017116 Author: Adrian Johnson Date: Sat Dec 29 00:13:24 2007 +1030 PS: Use _TEMP_FILE_ERROR for temp file errors src/cairo-ps-surface.c | 18 +++++++++++++++--- 1 files changed, 15 insertions(+), 3 deletions(-) commit bd44d114a6d4271a4a15cf7d70a996e73a86751c Author: Adrian Johnson Date: Sat Dec 29 00:12:44 2007 +1030 Add CAIRO_STATUS_TEMP_FILE_ERROR src/cairo.c | 2 ++ src/cairo.h | 4 +++- 2 files changed, 5 insertions(+), 1 deletions(-) commit e82b0f46b2ea6ebcee5ea5cc09e9ab5c6cc383fb Author: Chris Wilson Date: Wed Nov 14 00:45:24 2007 +0000 [cairo-path-fixed] Consolidate cairo_path_buf_t when copying. When copying the cairo_path_fixed_t, consolidate the list of dynamically allocated cairo_path_buf_t into a single buffer. src/cairo-path-fixed.c | 33 +++++++++++++++++++++++++-------- 1 files changed, 25 insertions(+), 8 deletions(-) commit e0187ad49b754c4024f1999155ed248616028582 Author: Chris Wilson Date: Thu Dec 27 12:46:13 2007 +0000 [cairo-path-fixed] Ensure the points array is naturally aligned, take 2. By enlarging buf_size to ensure the correct alignment of the points array with the cairo_path_buf_t block, we can efficiently use the padding bytes to store more ops. src/cairo-path-fixed.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit d8169b8cef041b4dbcea44e050df28659f4846aa Author: Chris Wilson Date: Thu Dec 27 10:45:25 2007 +0000 [cairo-path-fixed] Ensure the array of points is correctly aligned. In http://bugs.gentoo.org/show_bug.cgi?id=203282, it was identified that the cairo_path_buf was causing unaligned accesses (thus generating SIGBUS on architectures like the SPARC) to its array of points. As we manually allocate a single block of memory for the cairo_path_buf_t and its arrays, we must also manually ensure correct alignment - as opposed to cairo_path_buf_fixed_t for which the compiler automatically aligns the embedded arrays. src/cairo-path-fixed.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 7f69c2588b33d415f544c2ee24d85c83a8d7cd69 Author: Chris Wilson Date: Thu Dec 20 21:15:41 2007 +0000 [cairo-ps-surface] Missing status checks. Check and propagate the error status. src/cairo-ps-surface.c | 53 +++++++++++++++++++++++++++++------------------ 1 files changed, 33 insertions(+), 20 deletions(-) commit 51523aec8177224d3f64f55ca2e61c64fe801a56 Author: Chris Wilson Date: Thu Dec 20 21:15:08 2007 +0000 [cairo-meta-surface] Remove redundant _cairo_error(). Remove the _cairo_error() from the return, as it has already been called immediately after the error was first detected. src/cairo-meta-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 146484e3122958212d4a69fff97d392451dcbeaa Author: Chris Wilson Date: Thu Dec 20 21:13:31 2007 +0000 [valgrind] Update zlib suppressions. Match the zlib library as found on hardy+dbgsym. test/.valgrind-suppressions | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) commit d4d3873bccea82bb3ae20bfcbab3158fa5df41b3 Author: Chris Wilson Date: Thu Dec 20 18:21:46 2007 +0000 [cairo] Correct the documentation for cairo_get_group_target(). cairo_get_group_target() can never return NULL, but will always return the current destination surface. src/cairo.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) commit 3bf06c336629d9a485fdb150058897e5a6a30b45 Author: Chris Wilson Date: Thu Dec 20 18:15:48 2007 +0000 [test/*] Create new surfaces using the group target. cairo_get_target() returns the original surface passed to cairo_create(), and not the current destination as required when testing drawing to the same surface using multiple contexts. For completeness we also use the group target when creating similar surfaces within the tests (to check that similar surfaces of similar surfaces also work). perf/cairo-perf-cover.c | 4 ++-- test/cairo-test.c | 2 +- test/clip-nesting.c | 2 +- test/clip-operator.c | 2 +- test/clip-zero.c | 2 +- test/device-offset-positive.c | 2 +- test/device-offset.c | 2 +- test/get-clip.c | 2 +- test/get-path-extents.c | 2 +- test/invalid-matrix.c | 2 +- test/mask.c | 4 ++-- test/meta-surface-pattern.c | 2 +- test/operator-clear.c | 2 +- test/operator-source.c | 4 ++-- test/pixman-rotate.c | 2 +- test/self-copy.c | 2 +- test/source-clip-scale.c | 2 +- test/source-clip.c | 2 +- test/svg-clip.c | 2 +- test/unbounded-operator.c | 2 +- 20 files changed, 23 insertions(+), 23 deletions(-) commit 643834e7aa3e90678276453439017359ef942c9e Author: Chris Wilson Date: Thu Dec 20 17:51:48 2007 +0000 [cairo-surface] Return UNSUPPORTED for acquire_(dest|source)_image. If the backend does not support fallbacks ie backend->acquire_dest_image or backend->acquire_source_image is NULL, then return CAIRO_INT_STATUS_UNSUPPORTED rather than attempt to jump to the NULL hooks. src/cairo-surface.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 14454e12d8df606ed4b79c6e7cda4071b00ee581 Author: Chris Wilson Date: Thu Dec 20 17:49:06 2007 +0000 [cairo-test] Wrap test function with cairo_save/restore(). Restore the context to the original state before blitting the group surface in order to remove any residual state such as a clip path. test/cairo-test.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit d0119a5aa24a8b426ec64bb2eaa205b7f08ae58a Author: Behdad Esfahbod Date: Thu Dec 20 12:30:35 2007 -0500 [cairo-unicode] Don't compile _cairo_utf8_to_utf16 on Linux The _cairo_utf8_to_utf16() is only used in win32 and atsui font backends. Don't build it if none of those two are available. src/cairo-unicode.c | 2 ++ src/cairoint.h | 5 +++++ 2 files changed, 7 insertions(+), 0 deletions(-) commit 281b11aef14f04b12639028e2a76bbdc7a1a32bf Author: Chris Wilson Date: Thu Dec 20 17:11:03 2007 +0000 [cairo-test] Use CAIRO_OPERATOR_SOURCE when painting the group surface. To correctly copy a surface onto the destination irrespective of its content requires the SOURCE operator. Forgetting to do so here causes uninitialized pixels to be mixed into the result and the failure of many tests for the similar surface. Oops... test/cairo-test.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit ed3fccec01257a7c52694150cda9ea1059c33585 Author: Chris Wilson Date: Mon Dec 17 22:37:31 2007 +0000 [pdiff] Avoid the memleak for small surfaces. Allocate the arrays after the guard against small surfaces to avoid leaking them. test/pdiff/pdiff.c | 40 +++++++++++++++++++++++++++------------- 1 files changed, 27 insertions(+), 13 deletions(-) commit df938a515bd59138421b6ab4419966805d027b52 Author: Chris Wilson Date: Mon Dec 17 21:39:25 2007 +0000 [cairo-path-bounds] Check for the empty path. Avoid returning uninitialized variables if we're asked to find the bounds of an empty path - in which case we just return a rectangle of zero width and height similar to the empty clip region. src/cairo-path-bounds.c | 18 ++++++++---------- 1 files changed, 8 insertions(+), 10 deletions(-) commit c2adfb4052f72e1e6e6d283de3428b5453dac537 Author: Jim Meyering Date: Sat Dec 15 16:42:25 2007 +0100 Don't leak memory upon failed realloc. * cairo-glitz-surface.c (_cairo_glitz_surface_composite_trapezoids): Signed-off-by: Jim Meyering src/cairo-glitz-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 45951345983f100e935af2fe2f5397d64c195f98 Author: Behdad Esfahbod Date: Tue Dec 18 16:00:21 2007 -0500 [directfb] Fix header include order to include cairoint.h first src/cairo-directfb-surface.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) commit 18f4f02f723cd005c159c8a0044dd385d551f022 Author: Nis Martensen Date: Tue Dec 18 15:59:19 2007 -0500 [src/check-cairoint.sh] Fix typo in shell script src/check-cairoint.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8343d6cc2a5e9198e1205e431de018f74107d9d8 Author: Chris Wilson Date: Mon Dec 17 13:42:07 2007 +0000 Replace various uses of CAIRO_STACK_BUF_SIZE with a single macro. In http://bugs.freedesktop.org/show_bug.cgi?id=13699, Pavel Vozenilek reports a duplicate define for computing the appropriate length for an on-stack array. The macro in question, and a few other places, was performing CAIRO_STACK_BUF_SIZE/sizeof(stack[0]) so we can simplify them slightly by using a common macro. src/cairo-bentley-ottmann.c | 2 +- src/cairo-gstate.c | 10 ++++------ src/cairo-image-surface.c | 12 ++---------- src/cairo-region.c | 4 +--- src/cairo-surface.c | 2 +- src/cairo-traps.c | 4 +--- src/cairo-xlib-surface.c | 7 ++----- src/cairoint.h | 2 ++ 8 files changed, 14 insertions(+), 29 deletions(-) commit 627a8b4a2f2824f156893382561f563d0aa9e90d Author: Benjamin Otte Date: Mon Dec 17 12:42:14 2007 +0100 [directfb] replace u32 with uint32_t This fix makes it compile for me again src/cairo-directfb-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 9637ffc62fab1b42ceb764d1b42e70654e0cbe2b Author: Behdad Esfahbod Date: Mon Dec 17 01:55:15 2007 -0500 [cairo-xlib] Minor cleanup and add comment src/cairo-xlib-surface.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit 83963d2a9ec445e23cfbe692b877177a9d9d135e Author: Behdad Esfahbod Date: Mon Dec 17 01:19:53 2007 -0500 [cairo-ft] Revert "Force non-AA text when using a bitmap strike with only scaling transform." (#13479) The reasoning for that commit was that fonts with bitmap strikes should be rendered with antialiasing off for those (hopefully) few glyphs that don't have a bitmap. However, it turns out, there are fonts that have some, but very few, bitmaps, and this changed forces non-AA rendering on them. We now support multiple glyph formats per font in the Xlib backend, so backing this out to let every glyph render as is. Fontconfig rules can be used to force AA off on a per-font basis. This reverts commit 06af5c2891b89da28581c30afcde06c5442884db. src/cairo-ft-font.c | 24 ------------------------ 1 files changed, 0 insertions(+), 24 deletions(-) commit 805b668260c47e6d3d854361fcc53f12bd2a57e1 Author: Behdad Esfahbod Date: Mon Dec 17 01:14:27 2007 -0500 [cairo-xlib] Support scale fonts with glyphs of multiple formats (#13479) We maintain three Xrender glyphsets per scaled font, one for each of A1, A8, and ARGB32. This is required to correctly support fonts with bitmaps for some glyphs but not all. src/cairo-xlib-surface.c | 179 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 136 insertions(+), 43 deletions(-) commit f6dd037cf3231c2dd0550b0f2e6f3179202c299f Author: Carl Worth Date: Fri Dec 14 14:02:43 2007 -0800 Remove rasterization when a paginated surace is used as a source This was an old workaround for a bug that seems to no longer exist. Thanks to Donn Ingle for pointing out the problem. src/cairo-paginated-surface.c | 34 ---------------------------------- 1 files changed, 0 insertions(+), 34 deletions(-) commit 9b3ce8b17ab8179131ae45a227d76241916f42e8 Author: Adrian Johnson Date: Wed Dec 12 23:41:53 2007 +1030 PS: Use the correct bounding box in Type 3 fonts Previously this was a fixed size. src/cairo-ps-surface.c | 44 +++++++++++++++++++++++++++++++++++++------- 1 files changed, 37 insertions(+), 7 deletions(-) commit afdd53d35f53cfe3440c38531c112a586d3d7486 Author: Adrian Johnson Date: Wed Dec 12 23:35:56 2007 +1030 PS: Return the status for emit_image and gradients src/cairo-ps-surface.c | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-) commit 55f5c4ffda5df9064bd0a5a6a2cf1a09b058afbb Author: Boying Lu Date: Wed Dec 12 21:05:57 2007 +1030 Remove cairo_private from static declaration src/cairo-paginated-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 942e3d53088a4d2b05c86d3f82b76cfbe707b3b5 Author: Claudio Ciccani Date: Tue Dec 11 15:50:05 2007 +0100 [cairo-directfb] Support some environment variables Added a couple of (boolean) env. vars affecting the backend: CAIRO_DIRECTFB_NO_ACCEL, disables acceleration CAIRO_DIRECTFB_ARGB_FONT, enables using ARGB fonts instead of A8 src/cairo-directfb-surface.c | 99 ++++++++++++++++++++++++++++++++--------- src/cairo-directfb.h | 12 +++++- 2 files changed, 88 insertions(+), 23 deletions(-) commit f3cec9d1c2a4d43cd734aae4bc7f8e7410a5e89a Merge: 08516d9... c26084a... Author: Claudio Ciccani Date: Mon Dec 10 22:58:06 2007 +0100 Merge branch 'master' of git+ssh://klan@git.freedesktop.org/git/cairo commit c26084a45fcb6ac467cad8bdcedfb2f524b857fc Author: Behdad Esfahbod Date: Mon Dec 10 14:38:09 2007 -0500 Pass $(MAKE) to test shell scripts (#13591) src/Makefile.am | 2 +- src/check-def.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) commit 78dac47399038cc9a05b82b01c4e4b35132f0784 Author: Behdad Esfahbod Date: Mon Dec 3 02:31:40 2007 -0500 [util/malloc-stats.c] Add a public function malloc_stats() Apparently glibc already provides the function: void malloc_stats (void); So, like we do for backtrace_symbols(), override the public symbol. It still is defined as __destructor__ and runs at program finalization. util/malloc-stats.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) commit 08516d97a1b34cbb119d6d842ae31e4cb4e08740 Author: Claudio Ciccani Date: Mon Dec 10 18:54:01 2007 +0100 [cairo-directfb] Merging from directfb.org - Improved performance in case of surface conversion: allocate a shadow buffer that can only grow - Fixed support for small surfaces (less than 8x8) - Optimize the blending function according to the surface format - Added _directfb_categorize_operation(): selects the blitting function according to the transform matrix - Avoid inverting the matrix when doing a simple StretchBlit() - Use TextureTriangles() instead of StretchBlit() when scale factors are negative - Added support for ARGB32 fonts (converted to A8 internally) - Removed unused functions (flush() and mark_dirty_rectangle()) - Code cosmetics src/cairo-directfb-surface.c | 847 +++++++++++++++++++++++------------------- 1 files changed, 466 insertions(+), 381 deletions(-) commit dd71ac910c3c176687fe4da582876bf46becf6d5 Author: Benjamin Otte Date: Mon Dec 10 13:17:09 2007 +0100 typo configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1f1f96d6459014a236611edf811a60225a652044 Author: Emmanuel Pacaud Date: Sat Dec 8 22:32:16 2007 +0100 [SVG] Fix a minor issue when emitting a radial gradient with r1 == r2. Minor because I don't know how the output is supposed to look in this case. src/cairo-svg-surface.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) commit 19680f545a1620d944322775c1b85b0e5f93fa0f Author: Brian Ewins Date: Thu Dec 6 21:31:15 2007 +0000 [quartz] fix gradient-zero-stops crash (moz#407104) Fixes failure in gradient-zero-stops test, reported by Boris Zbarsky (thanks!) as Mozill a bug#407104. src/cairo-quartz-surface.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) commit e6c34bb6912d2801ee6c0d56ec0e98739c786e9f Author: Brian Ewins Date: Thu Dec 6 21:31:14 2007 +0000 [quartz] refactor gradient handling Avoid checking the gradient type twice. This refactor also makes it easier to check when the gradient has no stops, and will make it easier to separate out the different implementations of EXTEND_REPEAT, REFLECT for linear and radial gradients. src/cairo-quartz-surface.c | 206 +++++++++++++++++++++++--------------------- 1 files changed, 107 insertions(+), 99 deletions(-) commit b81c8473bd0b8b829dc7eba9a105890f0c2f1158 Author: Brian Ewins Date: Thu Dec 6 21:31:10 2007 +0000 [test] add test for gradient with no stops Boris Zbarsky reported a bug where having zero stops in a gradient pattern would crash in the quartz surface. This test checks for that case. Mozilla bug#407104. This also crashes testing pdf; and the ps, svg surfaces look suspicious (they reference stops[0]) but I havent been able to test them yet. test/Makefile.am | 3 + test/gradient-zero-stops-ref.png | Bin 0 -> 105 bytes test/gradient-zero-stops-rgb24-ref.png | Bin 0 -> 105 bytes test/gradient-zero-stops.c | 66 ++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 0 deletions(-) commit a7ae9c45d924effdd61390267eb216302a270d8e Author: Peter Weilbacher Date: Thu Dec 6 16:46:28 2007 +0100 [os2] add memory allocation wrappers for pixel buffers Add ability to use OS/2 APIs instead of C library functions to manage pixel buffer allocations. This is to work around heap fragmentation. This implements two wrapper functions which replace _cairo_alloc_abc and free and when compiled with OS2_USE_PLATFORM_ALLOC the OS/2 functions DosAllocMem and DosFreeMem will be used for allocation/deallocation. Also try to minimize the heap when shutting down the cairo library. src/cairo-os2-surface.c | 108 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 81 insertions(+), 27 deletions(-) commit be79779331ee29c0bfb74b728227719bb5dead6e Author: Carl Worth Date: Wed Dec 5 09:24:17 2007 -0800 Restrict initial buggy version to X.Org 6.7 rather than 6.0 Also add some comments describing the test. src/cairo-xlib-display.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit d4138d1161c6b683fd0ef62a8d49ccf4ec4674bc Author: Bernardo Innocenti Date: Wed Dec 5 07:04:09 2007 -0500 Fix version check for buggy_repeat on modular Xserver 1.x The versioning of the X server has restarted from 1.0 in the modular build. So we adjust the text to avoid considering the new servers buggy. src/cairo-xlib-display.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 946b8fedb57fc0c70e4f82b2151433768479a11c Author: Carl Worth Date: Wed Dec 5 02:30:58 2007 -0800 Fix misspellings NEWS | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 94a35c7b71b2219d68e81272ce6328e46ae0e91e Author: Carl Worth Date: Wed Dec 5 02:28:20 2007 -0800 Fix version number typo NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6f2ec12b882e49b425b22145592243b8ce75b6a4 Author: Carl Worth Date: Wed Dec 5 02:26:05 2007 -0800 Increment version to 1.5.5 after the 1.5.4 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e0c0275e1764502cfd1d0e93e374b4ed396f0073 Author: Carl Worth Date: Wed Dec 5 02:06:33 2007 -0800 Increment version to 1.5.4 and to 14:1:12 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 11aaf992fb5d3d86f261ba48306adfaace9f96ea Author: Carl Worth Date: Wed Dec 5 01:52:03 2007 -0800 NEWS: Add notes for 1.5.4 NEWS | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) commit 150564c7f8792fa2217fc2574e9e1925c9cd500f Author: Vladimir Vukicevic Date: Tue Dec 4 14:05:47 2007 -0800 [quartz] use rectangle_int_t, not rectangle_int16_t src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e8574022f949559c069da30f11dee8680fc59586 Author: Vladimir Vukicevic Date: Tue Dec 4 13:54:32 2007 -0800 [quartz] cleanup: remove trailing whitespace src/cairo-quartz-surface.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) commit ee01a94726b3c0782fa182c9e874b2ed57e71aca Author: Vladimir Vukicevic Date: Tue Dec 4 13:53:03 2007 -0800 [quartz] Use CGContextDrawTiledImage if available Use this 10.5-only method if available, as it greatly speeds up tiled image rendering (EXTEND_REPEAT). src/cairo-quartz-surface.c | 96 +++++++++++++++++++++++++++++--------------- 1 files changed, 64 insertions(+), 32 deletions(-) commit 2c25033e14d7d9f705c27683dfb093318d67910b Author: Vladimir Vukicevic Date: Tue Dec 4 13:49:59 2007 -0800 [quartz] Handle creating 0x0 surfaces Make all 0x0 surfaces be no-ops when used in a rendering operation. src/cairo-quartz-surface.c | 109 ++++++++++++++++++++++++++++++++++--------- test/.gitignore | 1 + test/Makefile.am | 1 + test/clip-zero.c | 80 ++++++++++++++++++++++++++++++++ 4 files changed, 168 insertions(+), 23 deletions(-) commit 407ed0a6e7183c4fc6da1e988fada19c82ccef8a Author: Chris Wilson Date: Mon Dec 3 09:59:52 2007 +0000 [Makefile.am] Add lcov-clean to distclean. Clean the gcov temporary files when doing a full clean - spotted in a patch by Patrick Hulin to adapt cairo's lcov targets to glib. Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 9c732594039b164a1e08125c35ec9d04278f0cbf Author: Chris Wilson Date: Sun Dec 2 17:55:35 2007 +0000 [Makefile.am] Wrap lcov make targets within an AM_CONDITIONAL. Hide 'make lcov' and friends unless the user has actually enabled lcov supported during configure. Makefile.am | 17 ++++++++++++----- configure.in | 4 ++++ 2 files changed, 16 insertions(+), 5 deletions(-) commit 5f38e215ed4ec930492ee373db37a767d85a6ee8 Author: Behdad Esfahbod Date: Sat Dec 1 22:44:54 2007 -0500 [README] Remove the Dependencies section as it falls out of date easily README | 89 ---------------------------------------------------------------- 1 files changed, 0 insertions(+), 89 deletions(-) commit b46bb58e11f9d7b7fa68a64ca887c9b996b8f6f2 Author: Behdad Esfahbod Date: Sat Dec 1 20:41:55 2007 -0500 [configure.in] Bump freetype required version to 2.1.9 (#13482) configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit b701b4263048c3641f77796b9ea7bdc60b9815f7 Author: Adrian Johnson Date: Sun Dec 2 01:36:43 2007 +1030 win32: Implement _cairo_win32_scaled_font_init_glyph_surface() This is required when using win32 bitmap fonts with PS/PDF surfaces. src/cairo-win32-font.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 61 insertions(+), 2 deletions(-) commit 1441e165f2338bc6a8e2945baca77611ff417b2f Author: Adrian Johnson Date: Sun Dec 2 00:50:28 2007 +1030 Fix regression in Type1 Fallback As a result of the changes to improve the status checking, _cairo_type2_charstrings_init() was failing due to the failure status returned when the font->output stream is destroyed. This is because _cairo_type2_charstrings_init() does not create an output stream. Fix this by initializing font->output to NULL and only destroy it if not NULL. src/cairo-type1-fallback.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit e6166f7b442ae55128b417559e48250c287e49b6 Author: Behdad Esfahbod Date: Sat Dec 1 04:19:39 2007 -0500 Convert bash scripts to regular sh ones for greater portability perf/cairo-perf-diff | 31 ++++++++++++++++--------------- src/check-def.sh | 12 ++++++------ src/check-plt.sh | 6 +++--- 3 files changed, 25 insertions(+), 24 deletions(-) commit 0d932f43fe17b2b65d9e52ff8f9c16122b525223 Author: Carl Worth Date: Fri Nov 30 16:19:45 2007 -0800 Explicitly call bash for bash-specific scripts Thanks to Solaris-using Brian Cameron for pointing out that our shell scripts are bash-specific. We'd be glad if someone cared to rewrite them to not require bash, but for now let's have truth in advertising at least. perf/cairo-perf-diff | 2 +- src/check-def.sh | 2 +- src/check-plt.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) commit f4b93cceb7fb83de558ed058915f92d4f75c1a6a Author: Adrian Johnson Date: Thu Nov 29 23:18:45 2007 +1030 PS: Use correct glyphs widths for Type 3 fonts Previously the widths were set to 0. src/cairo-ps-surface.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 2729af6c123983c1599fae9f7a0fac88ad320d7c Author: Adrian Johnson Date: Thu Nov 29 23:07:47 2007 +1030 PS: Fix the Type 3 FontBBox This was previously a fixed size. Make it [0 0 0 0] the same as the other fonts. src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 77aab8fdbb62e4e0ec0260651db7255d168cb25e Author: Adrian Johnson Date: Thu Nov 29 23:03:40 2007 +1030 PS: Don't emit an image for Type 3 .notdef glyph Make the .notdef procedure an empty procedure instead of creating an empty image mask. This reduced the size of the PS file. src/cairo-ps-surface.c | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) commit 78e8d3d9bd2d4652f636a668a3fa53ef9edfd9ae Author: Adrian Johnson Date: Thu Nov 29 22:54:54 2007 +1030 PS: Fix the bounding boxes of Type 3 glyphs When viewing with ghostscript the glyphs were clipped src/cairo-ps-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 97b0d8b3c376f7848514debbe0697a2159a26eb9 Author: Adrian Johnson Date: Thu Nov 29 22:36:07 2007 +1030 PS: Make Type 3 fonts text selectable Put the glyph names in the Encoding array the same as is done for Type 1 and Type42 fonts. Acroread and Evince are still unable to correctly extract the text after conversion with ps2pdf. However examining the pdf file shows the glyph names are correct so this is probably a limitation of Acroread and Evince. src/cairo-ps-surface.c | 46 ++++++++++++++++++++++++++++++---------------- 1 files changed, 30 insertions(+), 16 deletions(-) commit 5e8f60531a09f357db38c4b646b1bbd29b97a891 Author: Adrian Johnson Date: Thu Nov 29 09:20:01 2007 +1030 PS: Ensure that xyshow operator has a pair of offsets for each glyph The last entry should have been "0 0" instead of "0". src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ba239a474a5cab36098b8f4a98f36aa6281f7da9 Author: Brian Ewins Date: Sun Nov 18 20:30:49 2007 +0000 [quartz] zero memory on bitmap creation 7 quartz/argb32/similar tests were showing failures due to random bits being set. The problem turned out to be that the initial test surface was not cleared before the similar surface was created by push_group. The problem behaviour is more obvious if you run the tests with MallocScribble=1. Fix this by calling memset after bitmap allocation; the multiplication here cannot overflow since we already checked that in malloc_ab. src/cairo-quartz-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 58e828a9a31b91c80336fc4ce323b061226dde2b Author: Brian Ewins Date: Sun Jul 1 16:11:07 2007 +0100 [quartz] fill with alpha for EXTEND_NONE The implementation of EXTEND_NONE was not filling areas outside the image with rgba(0,0,0,0). This showed up on the operator-source test, the fix makes the quartz and image renderings identical. src/cairo-quartz-surface.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) commit 39b8ddf07994747c039ee74c64a0cc97a4c7776a Author: Vladimir Vukicevic Date: Thu Nov 15 11:57:40 2007 -0800 [win32] Remove double-free in win32 font code in init_glyph_path Fixes bug #13243. src/cairo-win32-font.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 50d5f5a4e6d7424694b0b27fc0c3a00c9eb203bb Author: Vladimir Vukicevic Date: Thu Nov 15 11:56:56 2007 -0800 [quartz] Fix gradients; the wrong color field was being used The wrong color field was being used, effectively making gradients always have transparent black as their color stops. src/cairo-quartz-surface.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) commit bcb0f57e5eca58480e24251777f0b967e1aadefe Author: Brian Ewins Date: Wed Nov 14 01:50:34 2007 +0000 [quartz] remove double malloc in dashing code. fdash is reallocated without being released, and is allocated at the wrong size too. src/cairo-quartz-surface.c | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) commit e6bc049465730a9640a1038104210d14aad4b3cb Author: Brian Ewins Date: Tue Nov 13 00:43:59 2007 +0000 [quartz] typo checking for malloc failure The check after the malloc of cg_advances looked at the wrong variable. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bb2674207cf01386c6338511d2462694187fff36 Author: Brian Ewins Date: Mon Nov 12 23:56:01 2007 +0000 [quartz] fix leak in show_glyphs In cairo_quartz_show_glyphs we may leak the source if there is a failure to malloc the glyph arrays. Fix this. src/cairo-quartz-surface.c | 30 ++++++++++++++++++------------ 1 files changed, 18 insertions(+), 12 deletions(-) commit 7ad34c1bdc6417ca0e2e1075b67ca09c5318db75 Author: Brian Ewins Date: Mon Nov 12 23:52:52 2007 +0000 [quartz] fix for cairo_reset_clip() src/cairo-quartz-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 717ccbcf0c12fcfa840396378812919c9e151d57 Author: Brian Ewins Date: Mon Nov 12 23:51:39 2007 +0000 Revert "[quartz] handle 0x0 surfaces." This reverts commit 2fd50a7897efaed4dabaf75a6ed8828f16c14d36. Spoke too soon, quartz doesn't like creating those 0x0 images; while the tests pass, its putting warnings in the logs. Reverting to make a better fix. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2fd50a7897efaed4dabaf75a6ed8828f16c14d36 Author: Brian Ewins Date: Sun Nov 11 01:29:00 2007 +0000 [quartz] handle 0x0 surfaces. Some tests, like invalid-matrix, generate a 0x0 bitmap; in the quartz backend this caused a nil surface to be returned, whereas the tests expect a quartz surface. Other surfaces return a backend-specific surface with a zero-sized bitmap, quartz should do the same. Fixes the tests ft-font-create-for-ft-face, get-and-set, get-clip, invalid-matrix, line-width-zero, select-font-no-show-text, solid-pattern-cache-stress, surface-finish-twice, and text-cache-crash. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0359ad6c8da56a44697498bd8b74fbc029cbe930 Author: Emmanuel Pacaud Date: Sun Nov 11 00:18:19 2007 +0100 Compilation warning suppression (char as array subscript). cairo_path_op_t is a char, and can't be directly used as array subscript. src/cairo-path-fixed.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 1b71af7e61bd6c55b78e1a9a4c56b93d0b1134ed Author: Emmanuel Pacaud Date: Sun Nov 11 00:14:34 2007 +0100 Fix _cairo_path_fixed_init_copy. All the copied data buffers except the first one weren't completely initialized (num_ops and num_points). That was the cause of the failure of some vector surface tests, like random-intersections. src/cairo-path-fixed.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 3554c31e3d28ad5aad35c8fe4c6bb8ce7d297dde Author: Emmanuel Pacaud Date: Sat Nov 10 10:43:43 2007 +0100 [SVG] Add missing image to REFERENCE_IMAGES list. test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 916d82586ec196bfb3124850e68ef66a63464e72 Author: Emmanuel Pacaud Date: Sat Nov 10 10:24:21 2007 +0100 [SVG] Indentation fixes. src/cairo-svg-surface.c | 130 +++++++++++++++++++++++----------------------- 1 files changed, 65 insertions(+), 65 deletions(-) commit 8edc3ed4857795387007e7c4997f30d7ceec57ac Merge: 3bc8a8d... 77e9b05... Author: Emmanuel Pacaud Date: Sat Nov 10 10:10:50 2007 +0100 Merge branch 'master' of git+ssh://emmanuel@git.cairographics.org/git/cairo commit 3bc8a8d1d0e07e857b203a7872862437b8333b25 Author: Emmanuel Pacaud Date: Sat Nov 10 10:10:03 2007 +0100 [SVG] Remove spurious semicolon when emitting mask url. src/cairo-svg-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b68968ffd1864d591e4fc08fed55c12ece95ec55 Author: Emmanuel Pacaud Date: Sat Nov 10 10:07:12 2007 +0100 [SVG] Fix opacity of combined stroke and fill. When emitting combined stroke and fill, cairo SVG backend was using the opacity two times, instead of using fill-opacity and stroke-opacity, leading to incorrect output. I've updated the mask test reference images for the SVG output, since it seems there's a bug in librsvg when fill-opacity is used in the mask image. I've checked the SVG output with batik, and it looks fine. src/cairo-svg-surface.c | 25 +++++++++++++------------ test/mask-svg-argb32-ref.png | Bin 8405 -> 8389 bytes test/mask-svg-rgb24-ref.png | Bin 0 -> 7935 bytes 3 files changed, 13 insertions(+), 12 deletions(-) commit 77e9b05b2b011ce964287ff493c2b421977107ee Author: Brian Ewins Date: Sat Nov 10 01:34:03 2007 +0000 [test] support using a previous build as a reference Allow using a previous test output directory as a source of reference images. To make use of this, set the environment variable 'CAIRO_REF_DIR' to point at an old test directory, relative to the current test directory. This is useful for testing backends when reference images haven't been created yet, or which the current reference image structure can't accomodate, like multiple font backends. test/README | 8 ++++++++ test/cairo-test.c | 17 ++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletions(-) commit f8ee0cdf186bfb30bdeb487b63d42f274c1073ce Author: Brian Ewins Date: Sat Nov 10 01:34:01 2007 +0000 [test] Link to the correct reference image. The generated test html guesses the names of the reference images used in the tests. This is quite often wrong, and makes it harder to change policy in cairo-test. Teach make-html.pl to parse the log for the path to the reference image. test/make-html.pl | 102 +++++++++++++++++++++++----------------------------- 1 files changed, 45 insertions(+), 57 deletions(-) commit 15fc1bbefb49fefedca53c47ccfc7edace0acbfe Author: Brian Ewins Date: Sat Nov 10 01:33:47 2007 +0000 [test] log tested paths so that they can be parsed. The test logs currently do not record the paths of image output, the reference images tested against, and the diffs created. This means that make-html.pl has to duplicate the policy in cairo-test.c. Fix this by teaching cairo-test.c to log the paths. test/cairo-test.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 28412f780ebf52914aa374bb2bdd3d539bd29241 Author: Vladimir Vukicevic Date: Tue Nov 6 16:11:06 2007 -0800 [win32-printing] bail out early if we don't have anything to do in paint_surf src/cairo-win32-printing-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit d72bb8c12efcffe7c576afe63212b2fe47e8154c Author: Vladimir Vukicevic Date: Tue Nov 6 16:08:59 2007 -0800 [win32] Fix FIXED_to_fixed when cairo's fixed format isn't 16.16 src/cairo-win32-font.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) commit 0901b83ca56e197d5c96d71ab8cfe53f21b4c8bb Author: Vladimir Vukicevic Date: Tue Nov 6 15:49:57 2007 -0800 [win32] Don't use GetGlyphOutline on non-TrueType fonts win32-glyph-metrics.patch: GetGlyphOutline only works on Truetype fonts, so for non-Truetype fonts, assume no left or right bearing and use the font ascent and descent for the glyph extents. src/cairo-win32-font.c | 44 +++++++++++++++++++++++++++++++------------- 1 files changed, 31 insertions(+), 13 deletions(-) commit f11f7524b62df29aa377382f5ceeda8c3beb2d54 Author: Vladimir Vukicevic Date: Tue Nov 6 15:40:30 2007 -0800 [quartz] work around Quartz bugs with images bigger than a certain size Quartz has a bug with images greater than (signed) 16 bits in height; avoid creating or working with those. Also fixes some memory leaks. Patch from John Daggett. src/cairo-quartz-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 59 insertions(+), 2 deletions(-) commit 95ede9ea59eb1e2d7fe10fbc698f3f9fff192e79 Author: Vladimir Vukicevic Date: Tue Nov 6 15:06:06 2007 -0800 Use correct surface resolution when creating paginated fallback image If a surface resolution is set via _cairo_surface_set_resolution, it needs to be used when the fallback image is created. The user sets the fallback resolution on the paginated surface, so we need to divide that by the resolution of the actual (target) surface, not the paginated surface. src/cairo-paginated-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 9b8d9f2859ce66b742c887eb673407a84095f488 Author: Vladimir Vukicevic Date: Tue Nov 6 14:54:59 2007 -0800 [win32] Skip doing some work if we can't call StretchDIBits src/cairo-win32-printing-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit fa7e36669ae24fdbb5bd89a9fc1b6906408a5823 Author: Vladimir Vukicevic Date: Tue Nov 6 14:53:09 2007 -0800 [quartz] Fix for 10.5 SDK; the FloatToFixed macro started doing strange things src/cairo-quartz-surface.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 236c52b095661be395021d511d2dca0b532f83e9 Author: Vladimir Vukicevic Date: Tue Nov 6 14:52:24 2007 -0800 Handle overflow/underflow gracefully when converting to 16.16 fixed src/cairo-fixed-private.h | 22 +++++++++++++++++++--- 1 files changed, 19 insertions(+), 3 deletions(-) commit 5b0a0fe7a230f99a43916a16bfd2d26882bad46b Author: Carl Worth Date: Wed Nov 7 11:17:59 2007 -0800 Mention cairo_new_sub_path in documentation of cairo_arc src/cairo.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 62d64e12aa9264a17c9bb7d6ae154a1778f0c7e1 Author: Chris Wilson Date: Tue Nov 6 14:24:52 2007 +0000 [cairo-pdf-surface] Create a new path for an empty clip. If the clip path is empty, then we need to start a new path otherwise the clip is ineffective. src/cairo-pdf-surface.c | 36 ++++++++++++++++++++++-------------- 1 files changed, 22 insertions(+), 14 deletions(-) commit b4057b8643cf02439b6033d7443d0d4c42220a62 Author: Chris Wilson Date: Tue Nov 6 09:45:54 2007 +0000 [cairo-clip] Special case using an empty clip path. Detect when the user calls cairo_clip() with an empty clip path and mark the clip as all_clipped. src/cairo-clip.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 2f0867b43fbc9a385a32a2a39895f4c3559f6ddf Author: Chris Wilson Date: Tue Nov 6 09:44:03 2007 +0000 [cairo-surface] Handle the all clipped out case. Explicitly handle a clip which represents that the entire surface is clipped out. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=13084. src/cairo-surface.c | 61 +++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 52 insertions(+), 9 deletions(-) commit 641215b2b018e98b298db5042360e2e22ab5a0aa Author: Chris Wilson Date: Mon Nov 5 22:22:42 2007 +0000 [test/clip-all] Combine text and everything clipped out. https://bugs.freedesktop.org/show_bug.cgi?id=13084 demonstrates a regression where the clip is ignored by the xlib backend whilst rendering text. Therefore we extend the current test cases to combine a clip that represents everything clipped out with the rendering of text. For completeness, we add a new test case that exactly mimics the sequence of cairo operations that lead to the discovery of this bug - namely the rendering of text with an empty clip path. test/Makefile.am | 2 + test/clip-all.c | 10 ++++++ test/clip-empty-ref.png | Bin 0 -> 118 bytes test/clip-empty.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 0 deletions(-) commit 55b530ffef2bce96d57919563c6c9b58f02f8fb8 Author: Behdad Esfahbod Date: Mon Nov 5 14:47:27 2007 -0500 [PS] Fix compiler warnings src/cairo-ps-surface.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 570714b2b4e0b7aea58142bcba37a9eb7945cf09 Author: Behdad Esfahbod Date: Mon Aug 14 21:34:40 2006 -0400 [test/fallback-resolution] set tolerance to a large value to see how it performs in different fallback resolutions. test/fallback-resolution.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 5acbef20213ad354cc835f6d15811e333ee38e74 Author: Behdad Esfahbod Date: Mon Aug 14 21:34:03 2006 -0400 [test] fallback-resolution: center text test/fallback-resolution.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 7f21bfb0a8265095d68bb5ff6afae7553683a776 Author: Behdad Esfahbod Date: Mon Aug 14 21:33:13 2006 -0400 [meta-surface] Adjust tolerance when replaying to surfaces with device scale such that we get a consistent look with different fallback resolutions. src/cairo-meta-surface.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit 4270cd3358fabf0d3e6ac4e866099b172082b592 Author: Richard Hult Date: Mon Nov 5 10:05:07 2007 +0000 [atsui] Use ascent+descent+leading to get the distance between baselines The height is currently mapped to the atsui metrics property capHeight, which is documented as "The height of a capital letter in the font from the baseline to the top of the letter". That doesn't match what height is in cairo, it should be the disctance between baselines. This patch that fixes that (and makes webkit on GTK+ OS X layout nicely). src/cairo-atsui-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3141b21c0c581dabc09a6ec9cdf0a071701b0e42 Author: Brian Ewins Date: Mon Nov 5 10:05:04 2007 +0000 [configure.in] fix atsui experimental warning The 'experimental' warning for atsui was appearing for --enable-quartz not --enable-atsui as it should. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b3ef306f84944a45b389c1f4bfeae910baf5bcb0 Author: Chris Wilson Date: Mon Nov 5 09:09:14 2007 +0000 [cairo-atomic] Add a few more cpus that are known to have atomic access. Add x86_64 and arm to the list of cpus which do not require memory barriers for reading and writing integers/pointers atomically. configure.in | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit bd5ed9a3988910a41748b7d78a265a2968a48f23 Author: Chris Wilson Date: Mon Nov 5 09:05:25 2007 +0000 [cairo-atomic] Declare the mutex for NEEDS_MEMORY_BARRIER. Whilst NEED_MEMORY_BARRIER should be a subset of ! HAS_ATOMIC_OPS, until we have accurate configure tests NEED_MEMORY_BARRIER may be invoked independently. src/cairo-mutex-list-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 901b0c97523a2da00ccf91cf4cee3bf55ce989b5 Author: Chris Wilson Date: Sun Nov 4 11:55:25 2007 +0000 [cairo-path-fixed] Exponentially enlarge cairo_path_buf_t. Allocate subsequent path bufs twice as large as the previous buf, whilst still embedding a small initial buf into cairo_path_fixed_t that handles the most frequent usage. src/cairo-path-fill.c | 2 +- src/cairo-path-fixed-private.h | 20 ++++++--- src/cairo-path-fixed.c | 89 ++++++++++++++++++++++++---------------- 3 files changed, 68 insertions(+), 43 deletions(-) commit 92a18464bae40b19a26402eb2aa4950cac04c3a0 Author: Chris Wilson Date: Sat Nov 3 10:41:55 2007 +0000 [cairo-surface] Avoid allocation for common case of 1 box. _cairo_surface_fill_region(): avoid allocating the array of boxes if we know that the region only contains one box and is therefore defined by its extents. src/cairo-surface.c | 48 ++++++++++++++++++++++++++++-------------------- 1 files changed, 28 insertions(+), 20 deletions(-) commit e60a7c39cdcdfd474c4f6cc3b4612870726f55dc Author: Chris Wilson Date: Thu Oct 25 10:24:01 2007 +0100 [cairo-atomic] Check whether we can access int/pointers atomically. Add a configure check to determine whether the host cpu can read/write cairo_atomic_t without an explicit memory barrier, and update the macros within cairo-atomic-private.h to reflect this knowledge. configure.in | 15 +++++++++++++++ src/cairo-atomic-private.h | 20 +++++++++++++++----- 2 files changed, 30 insertions(+), 5 deletions(-) commit 76667b4c2a4243a52ab0dbe372151a9ca7dfe931 Author: Adrian Johnson Date: Sat Nov 3 16:53:54 2007 +1030 ROADMAP: Mark set PS level complete ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6d2615d449a9df6a8a7e3b5e5370b06dc14912f5 Author: Chris Wilson Date: Fri Nov 2 09:17:59 2007 +0000 [test/degenerate-pen] Add missing return value. Carl - he likes to test us occasionally to make sure we're paying attention. Well, that's the excuse I use... test/degenerate-pen.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit eb0b16837b7cbf63e4b49fb5c22cd392658033d8 Author: Chris Wilson Date: Thu Nov 1 22:11:01 2007 +0000 [cairo-spline] Eliminate redundant _cairo_fixed_to_double(). Inline and unroll PointDistanceSquaredToSegment() and eliminate the multiple conversions between fixed point and doubles. This simple transformation both shrinks the code and wins a few percent in path intensive benchmarks such as fuckhergently.swf src/cairo-spline.c | 107 +++++++++++++++++++++++++-------------------------- 1 files changed, 52 insertions(+), 55 deletions(-) commit 2a25e226588404da2970f473bdeb0d2ce106ce58 Author: Chris Wilson Date: Thu Nov 1 19:49:19 2007 +0000 [cairo-spline] Reduce stack requirements during recursive refinement. By splitting out the knot vectors into a smaller, separate structure, we can dramatically reduce the stack allocation for each level of recursion. Secondly we can have the storage requirements by modifying the first set of knots in-place, thus we need only allocate stack space for the knots covering the deferred half of the spline. src/cairo-spline.c | 94 ++++++++++++++++++++++++++-------------------------- src/cairoint.h | 13 ++++--- 2 files changed, 55 insertions(+), 52 deletions(-) commit b311c414a27b7374540671b3ef7153b30def0451 Author: Chris Wilson Date: Thu Nov 1 19:40:25 2007 +0000 [cairo] Use NULL instead of a bare 0. Silence a sparse warning. src/cairo.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit fd5c5178189d2035f3e25919c7453fa4e1c5a76a Author: Chris Wilson Date: Thu Nov 1 19:39:02 2007 +0000 [cairo-scaled-font] Zero extents on early error. Ensure that the output extents of cairo_scaled_font_glyph_extents(), are zeroed if we return early due to being passed by the user a cairo_scaled_font_t with an error set. src/cairo-scaled-font.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit cee6aa016b9d96d3430187d44397df2b311de8bc Author: Chris Wilson Date: Thu Nov 1 19:30:19 2007 +0000 [cairo-paginated-surface] Mark the backend static. Only used within the file, so do not expose outside the library. src/cairo-paginated-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6e0151df469b67ea56c36f7b0050b5d5c959c67d Author: Chris Wilson Date: Thu Nov 1 19:29:00 2007 +0000 [cairo-atomic] Rearrange code under the correct ifdefs. The atomic get/set depend upon NEED_MEMORY_BARRIER which is separate from HAVE_ATOMIC_OPS. src/cairo-atomic.c | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-) commit a26118cf5bf4063a4bdac2bece1bba0be776c801 Author: Chris Wilson Date: Wed Oct 31 16:37:09 2007 +0000 [cairo-png] Check for feof whilst reading. We need to check for both ferror() and feof() when handling short reads. src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 61143e5b21ea4c2687c1cef012eb0758a7cb378a Author: Chris Wilson Date: Wed Oct 31 16:34:51 2007 +0000 [cairo-png] Handle missing PNG_SETJMP_SUPPORTED If libpng has not been compiled with jmpbuf support, then we cannot atempt to use it - in which case we fall back to png's default error handler and abort. src/cairo-png.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit c37a8ace818770ce3f07c2a7147088231d559e44 Author: Adrian Johnson Date: Thu Nov 1 00:01:16 2007 +1030 Round floats in output-stream to 6 significant digits after decimal The previous commit increased the precision of floats from 6 digits after the decimal point to 18 digits to correct rounding errors with very small numbers. However most of the time this extra precision is not required and results in increased PS/PDF output. This commit makes the precision after the decimal point 6 significant digits. For example: 1.234567 0.123456 0.00123456 0.00000000123456 src/cairo-output-stream.c | 41 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 39 insertions(+), 2 deletions(-) commit 8297daff896ca9d803959edb3c1955977594fab9 Author: Behdad Esfahbod Date: Wed Oct 31 02:41:33 2007 -0400 [cairo-output-stream] Write out floats to 18 digits after decimal point We write floats using %f as the scientific format used by smarter %g is invalid in PS/PDF. %f however by default rounds to five digits after decimal point. This was causing precision loss and making the newly added degenerate-pen test fail for PDF. We now print up to 18 digits which is as many bits doubles can accomodate. We can be smarter, but that's for another commit. src/cairo-output-stream.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 04793175ace1312ac88570407ee28db4dde9a93c Author: Carl Worth Date: Tue Oct 30 22:49:10 2007 -0700 Increment cairo version to 1.5.3 after the 1.5.2 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ee5dc04aaf81d6ce9c496c7966ceebfbd6ab12fb Author: Carl Worth Date: Tue Oct 30 22:33:24 2007 -0700 Add missing images to REFERENCE_IMAGES list Otherwise, these don't get included in the generated tar file and the test suite doesn't pass when run from that tar file, (like 'make distcheck' tests). test/Makefile.am | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 194029b63afa24eff8264f10a1c5a79d90e7fdd9 Author: Carl Worth Date: Tue Oct 30 22:15:55 2007 -0700 Increment cairo version to 1.5.2 and libtool versioning to 14:0:12 configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 06af5c2891b89da28581c30afcde06c5442884db Author: Keith Packard Date: Tue Oct 30 22:00:59 2007 -0700 Force non-AA text when using a bitmap strike with only scaling transform. When the current font size matches one of the available fixed sizes, and the overall transform has only scaling components, FreeType will use the fixed size bitmaps by default. For glyphs which do not have bitmaps, force them to be rendered in monochrome instead of anti-aliased so that they all match nicely. src/cairo-ft-font.c | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) commit f09f02a6e82df0efb66696fca857a412e7d12672 Author: Carl Worth Date: Tue Oct 30 21:57:47 2007 -0700 Add notes for 1.5.2 snapshot NEWS | 252 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 252 insertions(+), 0 deletions(-) commit 448c9314252bba779194d2b01950b8738b26fd13 Author: Carl Worth Date: Tue Oct 30 17:09:56 2007 -0700 Fix degenerate-pen test case by removing the triggering assertion Instead we choose either the first or last pen vertex as appropriate. This makes the degenerate-pen pass stop failing on an assertion, and passes for most backends. It's still failing for the PDF backend, but that looks like a new, PDF-specific bug. src/cairo-pen.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) commit 5e76f652842d36086f500735f67cfd1d2f3e3edf Author: Carl Worth Date: Tue Oct 30 17:00:33 2007 -0700 Add degenerate-pen test case. This demonstrates the assertion failure pointed out by Benjamin Otte here: [cairo] Assertion 'i < pen->num_vertices' failed in 1.4.10 http://lists.cairographics.org/archives/cairo/2007-August/011282.html test/.gitignore | 1 + test/Makefile.am | 1 + test/degenerate-pen-ps-argb32-ref.png | Bin 0 -> 390 bytes test/degenerate-pen-ref.png | Bin 0 -> 278 bytes test/degenerate-pen.c | 104 +++++++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 0 deletions(-) commit 53378301d42eabc1ebedca983092f522299bd18e Author: Carl Worth Date: Tue Oct 30 13:13:29 2007 -0700 Update URLs for pixman to point to cairographics.org README | 7 ++++--- configure.in | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) commit 6957aa27e8df55ed3ef1e0cfc62c714ad9b644ee Merge: 00d701f... 8d8724e... Author: Carl Worth Date: Tue Oct 30 09:45:59 2007 -0700 Merge in fix for get-path-extents test case. With independent fixes on both branches, the test case now passes completely. Hurrah! commit 8d8724e80462593f6fee434cf972a67cb4ded282 Author: Carl Worth Date: Tue Oct 30 09:45:45 2007 -0700 Improve brace readability for multi-line conditional src/cairo.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit f43f0c104045a88de87c5ebf28309a5ba728203e Author: Carl Worth Date: Tue Oct 30 09:44:42 2007 -0700 Fix remaining two calls to _cairo_path_fixed_get_current_point The previous commit failed to fix up two callers to the _cairo_path_fixed_get_current_point function, (and since C doesn't distinguish between an enum and our integer-as- Boolean, the compiler didn't complain). Fortunately, though, the test suite did complain, as the bug introduced a new failure into the get-path-extents test, and git-bisect helpfully pointed to the previous commit. With this fix, the new failure of get-path-extents is eliminated, (though, in this branch the arc-based failure of that test still exists). src/cairo-ft-font.c | 3 +-- src/cairo-win32-font.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) commit 00d701ff7de68609aa8cec7871d93b27a108fd14 Author: Carl Worth Date: Mon Oct 29 17:55:28 2007 -0700 Limit miters for small angles This fixes the current failure get-path-extents, which is a demonstration of the following bug: cairo_stroke_extents() gives wrong result for arcs in some cases https://bugs.freedesktop.org/show_bug.cgi?id=7245 Many thanks to Michael Urman whose review of early versions of this work found a fatal mistake in my algebra. src/cairo-path-stroke.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 75 insertions(+), 1 deletions(-) commit 9bf0a640d203a880cae5c6a8bf3602344d03cb68 Author: Carl Worth Date: Mon Oct 29 16:24:13 2007 -0700 Add figure illustrating derivation of miter limit And use sin in the first place rather than the more awkward secant. src/cairo-path-stroke.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 files changed, 36 insertions(+), 7 deletions(-) commit abeba1e69be3d4500107f10e50e1f0e7cae8c78f Author: Carl Worth Date: Mon Oct 29 16:22:15 2007 -0700 Annoying churn of sgml templates doc/public/tmpl/cairo-ps.sgml | 53 ++++++++++++++++++++++++++++++++ doc/public/tmpl/cairo-surface.sgml | 19 +++++++++++ doc/public/tmpl/cairo-win32-fonts.sgml | 10 ++++++ doc/public/tmpl/cairo-win32.sgml | 9 +++++ 4 files changed, 91 insertions(+), 0 deletions(-) commit 0d42af2427d1de27845cb8a6b3d290a562c28fc6 Author: Chris Wilson Date: Tue Oct 30 11:13:44 2007 +0000 [cairo-surface] Fix typo in doc. s/INVALUE_FORMAT/INVALID_FORMAT/ src/cairo-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 39664b7cac7244ac901cb361442ca2967d74a542 Author: Chris Wilson Date: Tue Oct 30 11:01:40 2007 +0000 [cairo-path] Return CAIRO_STATUS_SUCCESS. If we have already returned the error status, then it is cleaner (and the common idiom) to use 'return CAIRO_STATUS_SUCCESS' rather than 'return status'. src/cairo-path.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e57df319633f8ebd0249096d76c9058f31f9835b Author: Chris Wilson Date: Tue Oct 30 10:58:16 2007 +0000 [cairo-path] Make _cairo_path_nil static. _cairo_path_nil is only used within cairo-path.c, so there is no reason to expose it to the rest of the libary. src/cairo-path-private.h | 2 -- src/cairo-path.c | 2 +- 2 files changed, 1 insertions(+), 3 deletions(-) commit 6fdb7f129c8154e288ee40765fa63ffaeebaf8fd Author: Chris Wilson Date: Tue Oct 30 10:42:22 2007 +0000 Simplify return value from cairo_path_fixed_get_current_point(). The only caller of cairo_path_fixed_get_current_point(), used the status return to determine whether or not the path had a current point (and did not propagate the error) - for which we had already removed the _cairo_error() markup. Now we reduce the boolean status return to a cairo_bool_t, with a net reduction in code. src/cairo-path-fixed.c | 11 ++++------- src/cairo.c | 13 +++++-------- src/cairoint.h | 2 +- 3 files changed, 10 insertions(+), 16 deletions(-) commit 4a2ab87e1a19921e2ae496f375c1144d2710d0c4 Author: Chris Wilson Date: Mon Oct 29 12:04:33 2007 +0000 [cairo-surface] Add the usual guards to _cairo_surface_set_font_options(). Adrian Johnson hit a SEGV after _cairo_paginaged_surface_create_image_surface() tried to set the font options on an error surface after running out of memory. So add the usual checks that the surface is not a snapshot, or in an error state or finished before modifying its font options. src/cairo-surface.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) commit bb6d36561c5f50d869236b2bb4d10afd627f9a1d Author: Chris Wilson Date: Sat Oct 27 17:29:54 2007 +0100 [test/get-path-extents] Add link to bug report. Add a link to the original bug report for the broken extents with arcs. [http://bugs.freedesktop.org/show_bug.cgi?id=7245] test/get-path-extents.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit a69d4731300b430b802222d317698c313c75a31a Author: Carl Worth Date: Fri Oct 26 22:58:57 2007 -0700 Fix typo in _cairo_gstate_fini Obrigado a Luiz Americo Pereira Camara src/cairo-gstate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0c02b998f9e8589a90b2e744392995903b94414f Author: Chris Wilson Date: Fri Oct 26 18:06:36 2007 +0100 [cairo-gstate] Allow angle==0 whilst rotating. Cut'n'paste error whilst copying the NaN check from _cairo_gstate_scale() flagged the no rotation case as an error. src/cairo-gstate.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit ce44cd65238d38dd6958bf1f7b8ffb9d0e8723c3 Author: Chris Wilson Date: Thu Oct 25 00:01:21 2007 +0100 [cairo-gstate] Add a missing _cairo_error() markup. Missed calling _cairo_error() for the CAIRO_STATUS_NULL_POINTER returned by _cairo_gstate_init(). Rearrange the code to avoid the overly complicated return statement. We note that _cairo_gstate_init() is special as _cairo_gstate_fini() will always be called, even if an error is thrown, and so do not do the usual cleanup in the case of an aborted initialization. src/cairo-gstate.c | 28 +++++++++++++++++++--------- 1 files changed, 19 insertions(+), 9 deletions(-) commit 4ce785e6a9433e7c862efaa6ef9c113412bf51a5 Author: Chris Wilson Date: Wed Oct 24 21:58:08 2007 +0100 [cairo-gstate] Add NaN check to rotate. Check the user input to _cairo_gstate_rotate() for invalid numbers. src/cairo-gstate.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 6295a296b0064f0959ca7f39e1d8d00fa51b6251 Author: Chris Wilson Date: Wed Oct 24 21:29:54 2007 +0100 [cairo-gstate] Check scale sx * sy != 0. Bill Spitzak said "If you really want to match when the determinant is non-zero in the resulting matrix, use sx*sy != 0. This appears the same as sx&&sy but may also catch when underflow makes the determinant zero." Return CAIRO_STATUS_INVALID_MATRIX if we know the user input will generate a degenerate matrix. For additional paranoia we could recompute and validate the inverse each time as well. src/cairo-gstate.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 483ebe866df539460861a05f5d5e8e56ab2f5430 Author: Chris Wilson Date: Wed Oct 24 19:32:00 2007 +0100 [cairo-test] Remove executable flag from source files. chmod a-x test/cairo-test.[ch] 0 files changed, 0 insertions(+), 0 deletions(-) commit 1651359ffbda4c14eaf4e79b6deced4f2c247686 Author: Chris Wilson Date: Wed Oct 24 18:35:41 2007 +0100 [cairo-perf-diff-files] Only use a valid initializer for min_test. Do not assume that the tests[0] is a valid test, but instead scan for the first test that has a name (i.e. is not a terminator). perf/cairo-perf-diff-files.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit 38c779e7d672151d25cd596149485fcc9f21c298 Author: Chris Wilson Date: Tue Oct 23 12:57:26 2007 +0100 [cairo-perf-diff-files] Check for terminator before comparing tests. Only the name of the terminating test is set so check that the current test is not the terminator before comparing. perf/cairo-perf-diff-files.c | 23 ++++++++++++++++------- 1 files changed, 16 insertions(+), 7 deletions(-) commit e3248a21841cfcbc285d76e2299485f9822857f1 Author: Chris Wilson Date: Mon Oct 22 09:34:55 2007 +0100 [cairo-matrix] Check user input for invalid numbers. Supplement the guards for scale==0 with checks that the user does not attempt to translate or scale by invalid numbers. src/cairo-gstate.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 8888afe9a4269e2d740d309186159fe946e57eaf Author: Adrian Johnson Date: Mon Oct 22 23:05:25 2007 +0930 PDF: Fix meta surface patterns with EXTEND_REFLECT src/cairo-pdf-surface.c | 34 +++++++++++++++++++++++++++++----- 1 files changed, 29 insertions(+), 5 deletions(-) commit f073a83251e56f641a522764c5cab1d71a786a60 Author: Adrian Johnson Date: Mon Oct 22 00:02:23 2007 +0930 win32-printing: fix error in comment boilerplate/cairo-boilerplate-win32-printing.c | 21 +++++++++++---------- 1 files changed, 11 insertions(+), 10 deletions(-) commit fb2bf3e250b39078476d3df4bdbb81201ef00a96 Author: Adrian Johnson Date: Sun Oct 21 23:50:57 2007 +0930 win32-printing: remove unused code src/cairo-win32-printing-surface.c | 17 ----------------- 1 files changed, 0 insertions(+), 17 deletions(-) commit b854d1e1b57680f244939b90b03911a5300f34d6 Author: Adrian Johnson Date: Sun Oct 21 23:50:28 2007 +0930 win32-printing: fix typo in comment src/cairo-win32-printing-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2d68c46b779909b5cc493a62db1228ea504ff52a Author: Adrian Johnson Date: Sun Oct 21 23:49:58 2007 +0930 win32-printing: fix dash-caps-joins test failure src/cairo-win32-printing-surface.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit 5fa62250456745907dd97fdb9030481bdc91a8dd Author: Adrian Johnson Date: Sun Oct 21 23:49:33 2007 +0930 win32-printing: Add test boilerplate Testing win32-printing requires setting the default printer to a PostScript level 3 color printer. The PostScript output is saved to a file and converted to png using ghostscript. boilerplate/Makefile.am | 2 + boilerplate/cairo-boilerplate-win32-printing.c | 308 ++++++++++++++++++++++++ boilerplate/cairo-boilerplate-win32-private.h | 15 ++ boilerplate/cairo-boilerplate.c | 11 + 4 files changed, 336 insertions(+), 0 deletions(-) commit e63b5e5201a79a8af4bd1d5acb524f067b5f2794 Author: Adrian Johnson Date: Sun Oct 21 23:47:35 2007 +0930 win32-printing: Use the surface ctm in show_glyphs show_glyphs needs to scale the font by the current CTM. src/cairo-win32-printing-surface.c | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit ac9831ea55bd62f0ed427230ad80348768415852 Author: Adrian Johnson Date: Sun Oct 21 23:46:52 2007 +0930 win32-printing: fix stroke rounding problems The win32 CTM is changed to user space to set the stroke parameters. As win32 uses integers for stroke parameters this will cause rounding problems depending on the CTM used. This is fixed by factoring out a scale from the user space CTM so that xx, xy, yx, and yy in the CTM are all < 1. This preserves the shape of the transformation while ensuring that the CTM does not cause rounding problems. The stroke parameters are multiplied by the scale value. src/cairo-win32-printing-surface.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-) commit 89fe7b2ff09d19d3bdc84a8ee871e15716ff3539 Author: Adrian Johnson Date: Sun Oct 21 23:45:40 2007 +0930 win32-printing: fix rounding problems when using pattern matrix When using meta surface patterns, the win32 CTM is changed to the inverted pattern matrix then the meta surface is replayed to the surface. The problem with this is that win32 uses integer coordinates for GDI functions. A pattern matrix that scale the CTM up will cause rounding errors in the position of each path in the pattern. This is fixed by always keeping the win32 CTM set to the identity matrix. The CTM is stored in the surface and all coordinates are transformed by the CTM before calling GDI functions. src/cairo-win32-printing-surface.c | 167 +++++++++++++++++++++++++++++------- src/cairo-win32-private.h | 2 + 2 files changed, 138 insertions(+), 31 deletions(-) commit af01d9b8fabc2422eb7db144171d52fab95c4387 Author: Adrian Johnson Date: Sun Oct 21 23:43:27 2007 +0930 win32-printing: add meta surface pattern support src/cairo-win32-printing-surface.c | 251 ++++++++++++++++++++++++++++-------- src/cairo-win32-private.h | 1 + 2 files changed, 200 insertions(+), 52 deletions(-) commit dae1b352c60e6a63ec2131f788fec230fd583d3d Author: Adrian Johnson Date: Sun Oct 21 23:42:54 2007 +0930 update cairo-sections.txt doc/public/cairo-sections.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c8da2a7dedb8352bb623954c3ac40244b86eeb24 Author: Adrian Johnson Date: Sun Oct 21 23:42:22 2007 +0930 win32-printing: check if images are opaque Don't use fallback for argb32 images with all alpha == 255. src/cairo-win32-printing-surface.c | 57 ++++++++++++++++++++++++++++++++++++ 1 files changed, 57 insertions(+), 0 deletions(-) commit 9eb5747755f8c57bd6ba04925e193503fe194462 Author: Adrian Johnson Date: Sun Oct 21 23:41:31 2007 +0930 win32-printing: Add missing struct initializers src/cairo-win32-printing-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 8f6abdbc26ee15451b5a386610f7d5a7a9114d63 Author: Brian Ewins Date: Sat Oct 20 23:41:46 2007 +0100 [quartz] return status instead of CGPatternRef Returning status improves error handling, since returning NULL doesn't let us distinguish different types of error. src/cairo-quartz-surface.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) commit cfb26fdf0f490b4902106b50d02628cffd53a0eb Author: Brian Ewins Date: Sat Oct 20 23:41:32 2007 +0100 [quartz] return status instead of cairo_quartz_surface_t Returning status improves error handling, since returning NULL doesn't let us distinguish different types of error. src/cairo-quartz-surface.c | 32 ++++++++++++++++++-------------- 1 files changed, 18 insertions(+), 14 deletions(-) commit dec3099585eeb184ed51b5c720eb891314d7ea51 Author: Brian Ewins Date: Sat Oct 20 22:45:30 2007 +0100 [quartz] return status instead of CGShadingRef Returning status improves error handling, since returning NULL doesn't let us distinguish different types of error. Suggested by Chris Wilson. src/cairo-quartz-surface.c | 30 ++++++++++++++++-------------- 1 files changed, 16 insertions(+), 14 deletions(-) commit 481ce2b8cb2dc376419e7d6cbdd73bd4ebcd5b5b Author: Brian Ewins Date: Sun Jul 1 14:37:57 2007 +0100 implement clipping with surface masks. This implements clipping using CGContextClipToMask, which means that it will only have an effect on OS X 10.4+. No additional tests pass with this fix - mainly due to text effects and problems with the IN, OUT, DEST_IN, DEST_ATOP operators. src/cairo-quartz-surface.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 43 insertions(+), 0 deletions(-) commit b9c065df74027b06e15e105fee5e4a4d350e0abf Author: Brian Ewins Date: Sun Jun 24 23:53:47 2007 +0100 fix dash-zero-length test Quartz was failing the dash-zero-length test for odd numbers of dashes; it seems cairo wants 3 dashes to be on-off-on, off-on-off, wheras quartz uses on-off-on, on-off-on. Fixed by doubling the number of dashes used. src/cairo-quartz-surface.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) commit f334ee0397963e12c9efcb2690792aac83734661 Author: Brian Ewins Date: Sun Jun 24 01:17:58 2007 +0100 Implement EXTEND_NONE for gradients. Fixes linear and radial gradients, which were displaying with extend_pad when extend_none was requested. Makes the radial-gradient test pass. src/cairo-quartz-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 0eeec372c0e7849d81bde8c8c5bf491919f51a6e Author: Brian Ewins Date: Sat Jun 23 23:36:32 2007 +0100 call _cairo_error on failure Call _cairo_error to enable setting a breakpoint on quartz errors. src/cairo-quartz-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8c8ec63903f8ad67a88394eff1359607bb93cf88 Author: Brian Ewins Date: Sat Jun 23 12:34:24 2007 +0100 do not return a cairo_status_t of UNSUPPORTED We had a bug which converted cairo_int_status_t to cairo_status_t, causing an assertion; reported at http://developer.imendio.com/node/128. Return the generic out of memory error instead. src/cairo-quartz-surface.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit 6fec51990e90901ebafbb872a9e618cb70d17911 Author: Brian Ewins Date: Mon Jun 18 00:07:33 2007 +0100 do not ignore errors, return NULL instead (moz#874315) In the quartz backend there are occasional errors where returning NULL can be used to signal that an error has occured. Mozilla bug #874315. src/cairo-quartz-surface.c | 37 ++++++++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 9 deletions(-) commit 07fd091e3e6b925c588b9a16f6f10efcd46615c2 Author: Brian Ewins Date: Mon Jun 18 00:07:33 2007 +0100 do not ignore errors in setup_source In setup_source we were ignoring a return value, but we can't relay it to the caller. This patch treats the error as an unsupported operation. src/cairo-quartz-surface.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit b6b9cef7136453f97543173bcb2ade46b1c46b77 Author: Brian Ewins Date: Tue Jun 19 21:13:39 2007 +0100 do not ignore errors when creating styles. This fixes statuses being ignored when calling CreateSizedCopyOfStyle. As a side effect, it cleans up two other bugs - the font object was sometimes not freed, and a the scaled font mutex was aquired recursively, causing a hang in the invalid-matrix test. src/cairo-atsui-font.c | 37 ++++++++++++++++++++++++++----------- 1 files changed, 26 insertions(+), 11 deletions(-) commit 4885a12c6863321a566e7103bf6dccdd5d13a986 Author: Brian Ewins Date: Mon Jun 18 00:07:33 2007 +0100 do not ignore ATSUI errors. This fixes multiple instances where the return value of an ATSUI call was ignored and converts them into CAIRO_STATUS_NO_MEMORY. As a side effect it fixes a utf8 array not being freed. src/cairo-atsui-font.c | 74 ++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 65 insertions(+), 9 deletions(-) commit b498c928be73635614596243d17a922e9d5ff008 Author: Brian Ewins Date: Mon Jun 18 00:07:33 2007 +0100 do not ignore errors in glyph paths When interpreting glyph paths in ATSUI callbacks we were ignoring the cairo status. We need to return this to the caller. In order to do this we introduce a custom OSStatus code in the range that Apple reccommend. src/cairo-atsui-font.c | 30 ++++++++++++++++++++++++------ 1 files changed, 24 insertions(+), 6 deletions(-) commit 95c708c717a367205845cefc81ae0afd9bd3d18f Author: Brian Ewins Date: Mon Jun 18 00:07:33 2007 +0100 propagate cairo_status_t return values There are several places in the quartz surface where we ignored the returned status. This fixes the simple cases where the error can just be returned to the caller. src/cairo-quartz-surface.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit 7072959e3da0e8814cfd5193f8915aeb1341cc37 Author: Brian Ewins Date: Sat Oct 20 11:46:54 2007 +0100 Fix to support new similar tests. The patch to repeat tests for similar surfaces changed the format of the test log files, which were parsed to produce index.html. This fixes the parser to understand those changes. test/make-html.pl | 136 +++++++++++++++++++++++++++++------------------------ 1 files changed, 75 insertions(+), 61 deletions(-) commit ae2535e4cb7c09eda1be13079d7a23b262aaef7b Author: Chris Wilson Date: Fri Oct 19 23:25:57 2007 +0100 [cairo-perf] Run performance tests over similar surfaces as well. Immediately repeat the performance test against a similar surface to ensure that they introduce no regressions. Primarily introduced to sanity check the change to use XShmPixmaps instead of XPixmaps in the xlib backend, but it should be generally useful. perf/cairo-perf.c | 121 +++++++++++++++++++++++++++++++++-------------------- 1 files changed, 75 insertions(+), 46 deletions(-) commit 081507a09e61e1e4a048e40f8ba67a76aa76bbef Author: Chris Wilson Date: Fri Oct 19 22:26:28 2007 +0100 [cairo-test] Repeat tests for similar surfaces. Having noticed strange discrepancies creeping into similar surfaces whilst working on the xlib backend, I thought it wise to also run the test harness against similar targets. For consistency, only targets whose similar surface use the same backend are included. This can be disabled by exporting CAIRO_TEST_IGNORE_SIMILAR=1. test/cairo-test.c | 173 ++++++++++++++++++++++++++++++++++------------------ 1 files changed, 113 insertions(+), 60 deletions(-) commit 3211d810d31a6607c8d78a50f577a8ca8eb705e6 Author: Chris Wilson Date: Fri Oct 19 22:45:15 2007 +0100 [cairo-xlib] Check source for XRender support. Do not rely on the assumption that if the destination has render support then the source has it as well - breaks when the boilerplate disables render support for a surface. Similarly do not set the XRender attributes on the source surface unless it actually has a xrender_format. src/cairo-xlib-surface.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) commit 5c08226a0f7bc373a96fe75d15ad854910eb3265 Author: Chris Wilson Date: Fri Oct 19 16:04:33 2007 +0100 [cairo-clip] Avoid work when all clipped out. When the clip mask is empty we perform actions like composite 0x0 surfaces, which results in a lot of unnecessary work and allocations. Avoid doing work when we know everything is clip out and take the liberty of freeing any memory associated with the clop state. src/cairo-clip-private.h | 2 + src/cairo-clip.c | 86 +++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 79 insertions(+), 9 deletions(-) commit c70c2cf6d6a71df54515175af0cb1651b67bdb86 Author: Chris Wilson Date: Fri Oct 19 23:31:36 2007 +0100 [Makefile.am] Fix ${top_srcdir}/libtool libtool exists in the top level build directory, but in a couple of places we refer to the top level source directory. perf/Makefile.am | 4 ++-- test/Makefile.am | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) commit 76e3b3cdc3dda986d420637cfc2445aca481a863 Author: Behdad Esfahbod Date: Fri Oct 19 15:02:03 2007 -0400 [cairo-xlib] Release glyph surfaces if we made them to be generated The reasoning is that right now, applications render glyphs to images, upload it to the X server, and keep a local copy in the cache. The X server works hard to reuse glyph renderings, by hashing glyph images and reusing them. So we are wasting memory in cairo apps that don't use the glyph surface after uploading to the server, which is the case if you don't use the glyph in an image surface. The patch does not release the glyph surface if it already existed in the cache, so, worst case scenario is that we render the glyph twice, if you first use it with xlib, then with image surface. That effect should be negligible. src/cairo-xlib-surface.c | 83 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 63 insertions(+), 20 deletions(-) commit 8ae778273799ee9f6d3c13e9c41730daeda2c743 Author: Chris Wilson Date: Thu Oct 18 20:07:12 2007 +0100 [cairo-xlib-surface] Match content to xrender_format using the channel masks. _xrender_format_to_content() was using the channel offset to determine whether the format supported a content type. For example, the XRenderPictFormat for the A8 format looks like: direct.alpha = 0; direct.alphaMask = 0xff; direct.red = 0; direct.redMask = 0x00; direct.green = 0; direct.greenMask = 0x00; direct.blue = 0; direct.blueMask = 0x00; which _xrender_format_to_content() matched as CAIRO_CONTENT_COLOR. Switch to using the channel masks for deducing content type. src/cairo-xlib-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit b7d8763c58165817f3238def4d1771ce8575139e Author: Chris Wilson Date: Thu Oct 18 19:42:21 2007 +0100 [check-plt] Use -W flag to readelf. Pass -W to readelf so that the output (in particular the function name) is not clipped to fit within 80 characters. src/check-plt.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 01eb16977359c7953dbabb52e1f6a132d93839f3 Author: Chris Wilson Date: Thu Oct 18 19:28:00 2007 +0100 [test/.gitignore] Add *.exe.so Ignore these winegcc output files. test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c64335a9a846ba18411a720f6e69e511b15e2c6b Author: Chris Wilson Date: Wed Oct 17 23:12:49 2007 +0100 [cairo-scaled-font-subsets] Simplify boolean return code. _cairo_sub_font_lookup_glyph() was returning either a NULL_POINTER error or success whereas its only caller was using it as a simple predicate and handled the 'error' rather than propagate it upwards. src/cairo-scaled-font-subsets.c | 20 +++++++++----------- 1 files changed, 9 insertions(+), 11 deletions(-) commit 379b9b79fa77be1bf9b5e0581b2363e80b0a8c88 Author: Chris Wilson Date: Wed Oct 17 20:41:57 2007 +0100 [cairo-xlib] Move the buggy_repeat discovery to the display_t. The VendorString parsing (to detect broken Xserver versions) was being performed for each surface creation, but as it is a display invariant we can save a small amount of work by storing the result on the cairo_xlib_display_t. src/cairo-xlib-display.c | 9 +++++++++ src/cairo-xlib-private.h | 1 + src/cairo-xlib-surface.c | 9 +-------- 3 files changed, 11 insertions(+), 8 deletions(-) commit 5e09653e5dca60902423938737195e38ccde1b95 Author: Chris Wilson Date: Tue Oct 16 15:30:50 2007 +0100 [test/rgb24-ignore-alpha] Destroy the surface after use. Destroy the surface so that valgrind doesn't complain about the memory leak. test/rgb24-ignore-alpha.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit bd3dd72262772f1b2dfd8335630163f2e3bfacac Author: Chris Wilson Date: Tue Oct 16 15:29:59 2007 +0100 [pdiff] Reorganise the inner loops of the convolution. Reorder the indices and introduce a couple of temporary accumulators to improve cache access. test/pdiff/lpyramid.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) commit fa9201b9c98b18ea18fbee1e5608f20335a02131 Author: Chris Wilson Date: Tue Oct 16 15:27:33 2007 +0100 [pdiff] Check for too small images. The Laplacian pyramid can only work on images larger than 3x3 due to the size of its convolution kernel. So if the image is too small return an error (-1) before attempting to construction the pyramid. test/pdiff/pdiff.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 3b1cc128dc4223ac88f7824dca223ed0f84df5d9 Author: Chris Wilson Date: Tue Oct 16 10:55:04 2007 +0100 [cairo-ft-font] Add paranoid error checking to Fc* operations. Check the return status when using Fc*() functions to modify the pattern and propagate the failure (if necessary). src/cairo-ft-font.c | 178 +++++++++++++++++++++++++++++------------------- src/cairo-ft-private.h | 1 - 2 files changed, 108 insertions(+), 71 deletions(-) commit a55f1abf7cdc0276fe1eb85db969f33d0df4fe75 Author: Chris Wilson Date: Tue Oct 16 10:29:45 2007 +0100 [cairo-clip] Pass the local pattern to create_similar_solid(). Avoid the short-lived pattern allocation within _cairo_surface_create_similar_solid() by providing the local solid pattern to use as the source. src/cairo-clip.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit 7ff80234e3823547395819f96d7f7673df9ce9df Author: Chris Wilson Date: Tue Oct 16 10:37:45 2007 +0100 [cairo-path-fixed] Drop the _cairo_error() markup. Do not use _cairo_error(CAIRO_STATUS_NO_CURRENT_POINT) within _cairo_path_fixed_get_current_point() as the only caller, cairo_get_current_point(), expects and handles that status. src/cairo-path-fixed.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit 189feaf352f59b0a049202552024578715ef8cc7 Author: Chris Heath Date: Mon Oct 15 17:31:50 2007 -0400 [autogen.sh] Tolerate tput failure (#12757) autogen.sh | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 4660561cb548ab8d1eca724fda4d3658c95d4c04 Author: Adrian Johnson Date: Sun Oct 14 19:05:06 2007 +0930 PDF: Add support for CAIRO_FORMAT_A1 images src/cairo-pdf-surface.c | 43 ++++++++++++++++++++++++++++++++++++------- 1 files changed, 36 insertions(+), 7 deletions(-) commit 39044157da03d598b816a459979f3d0e6285e023 Author: Adrian Johnson Date: Sun Oct 14 19:04:33 2007 +0930 PDF: Add support for linear gradients with REPEAT and REFLECT src/cairo-pdf-surface.c | 226 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 188 insertions(+), 38 deletions(-) commit 5af1b2280b2cf952624d587496158a98df0ee504 Author: Adrian Johnson Date: Sun Oct 14 00:04:21 2007 +0930 Make PostScript output text selectable The glyph names used in the Type42 and Type1 fallback fonts are now of the form "/uniXXXX" where XXXX is the unicode character for each glyph. When converted to pdf (eg using ps2pdf), pdf viewers are now able to correctly extract the text. src/cairo-ps-surface.c | 36 ++++++-- src/cairo-scaled-font-subsets-private.h | 15 +++ src/cairo-scaled-font-subsets.c | 159 +++++++++++++++++++++++++++++++ src/cairo-type1-fallback.c | 18 +++- src/cairoint.h | 1 + 5 files changed, 219 insertions(+), 10 deletions(-) commit e347a7a7c394fc2638faa2ff52e4b96545ac1ee3 Author: Adrian Johnson Date: Sat Oct 13 22:59:20 2007 +0930 PS: Add support for images with bilevel alpha This patch eliminates two sources of fallback images. The alpha value of each pixel in argb32 images are checked. If all alpha values are 255 the image is treated the same as rgb24 images. If all alpha values are either 0 or 255 and the PS level is 3, a Type 3 image (image + mask) is emitted. src/cairo-ps-surface.c | 519 ++++++++++++++++++++++++++++++++++++------------ 1 files changed, 388 insertions(+), 131 deletions(-) commit af5cdde34d003b7d5943b169c160b91b8f7d10f3 Author: Adrian Johnson Date: Sat Oct 13 22:15:48 2007 +0930 PS/Win32-printing: remove redundant checks from _analyze_operation The check for supported operators is performed earlier in this functions so these two checks in not required. src/cairo-ps-surface.c | 6 ------ src/cairo-win32-printing-surface.c | 6 ------ 2 files changed, 0 insertions(+), 12 deletions(-) commit ff35ffd2a7baa775e2ef73b844e783434c149057 Author: Adrian Johnson Date: Sat Oct 13 22:09:04 2007 +0930 Add meta-surface-pattern test test/.gitignore | 1 + test/Makefile.am | 1 + test/meta-surface-pattern-ref.png | Bin 0 -> 3072 bytes test/meta-surface-pattern-rgb24-ref.png | Bin 0 -> 3162 bytes test/meta-surface-pattern.c | 131 +++++++++++++++++++++++++++++++ 5 files changed, 133 insertions(+), 0 deletions(-) commit 0b3f530973049737f942219452d991d76b65b724 Author: Adrian Johnson Date: Sat Oct 13 21:49:50 2007 +0930 Add PS reference images for tests using gradients test/clip-operator-ps-argb32-ref.png | Bin 0 -> 8594 bytes test/gradient-alpha-ps-argb32-ref.png | Bin 0 -> 187 bytes test/gradient-alpha-ps-rgb24-ref.png | Bin 0 -> 184 bytes test/linear-gradient-ps-argb32-ref.png | Bin 0 -> 613 bytes test/linear-gradient-ps-rgb24-ref.png | Bin 0 -> 613 bytes test/operator-source-ps-argb32-ref.png | Bin 0 -> 3885 bytes test/operator-source-ps-rgb24-ref.png | Bin 0 -> 3548 bytes test/text-pattern-ps-argb32-ref.png | Bin 0 -> 997 bytes test/text-pattern-ps-rgb24-ref.png | Bin 0 -> 969 bytes test/trap-clip-ps-argb32-ref.png | Bin 5810 -> 5700 bytes test/trap-clip-ps-rgb24-ref.png | Bin 0 -> 5616 bytes 11 files changed, 0 insertions(+), 0 deletions(-) commit e66ce8cbc6e53b4b07a9af6bb7d2294ada0782c0 Author: Adrian Johnson Date: Sat Oct 13 21:28:19 2007 +0930 PS: Add linear and radial gradient support src/cairo-ps-surface.c | 321 +++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 291 insertions(+), 30 deletions(-) commit 583059e4a3e86c937de13c07a50486f7ca77b335 Author: Adrian Johnson Date: Sat Oct 13 21:16:49 2007 +0930 Fix bug in _gradient_is_opaque() src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b5c36010edc92ca129a0498cf04592f8f692f800 Author: Adrian Johnson Date: Sat Oct 13 21:14:28 2007 +0930 Add cairo_ps_surface_restrict_to_level() API doc/public/cairo-sections.txt | 4 ++ src/cairo-ps-surface-private.h | 2 + src/cairo-ps-surface.c | 99 +++++++++++++++++++++++++++++++++++++++- src/cairo-ps.h | 25 ++++++++++ 4 files changed, 129 insertions(+), 1 deletions(-) commit b5fa273c9a4f730882c6edade785236e72b2b4db Author: Adrian Johnson Date: Sat Oct 13 21:04:51 2007 +0930 Add PS reference images for tests using create_similar before the PS meta surface pattern patch these tests had image fallacks in the PS output and did not require a PS reference image. test/clip-fill-rule-ps-rgb24-ref.png | Bin 0 -> 309 bytes test/clip-nesting-ps-rgb24-ref.png | Bin 0 -> 636 bytes test/clip-push-group-ps-argb32-ref.png | Bin 0 -> 179 bytes test/clip-push-group-ps-rgb24-ref.png | Bin 0 -> 179 bytes test/clip-twice-ps-rgb24-ref.png | Bin 0 -> 541 bytes test/copy-path-ps-rgb24-ref.png | Bin 0 -> 440 bytes test/dash-caps-joins-ps-rgb24-ref.png | Bin 0 -> 3852 bytes test/dash-scale-ps-rgb24-ref.png | Bin 0 -> 6316 bytes test/dash-state-ps-rgb24-ref.png | Bin 0 -> 8650 bytes test/degenerate-path-ps-rgb24-ref.png | Bin 0 -> 358 bytes test/fill-and-stroke-ps-rgb24-ref.png | Bin 0 -> 319 bytes test/fill-missed-stop-ps-rgb24-ref.png | Bin 0 -> 531 bytes test/fill-rule-ps-rgb24-ref.png | Bin 0 -> 2031 bytes test/font-matrix-translation-ps-rgb24-ref.png | Bin 0 -> 783 bytes test/leaky-dash-ps-rgb24-ref.png | Bin 0 -> 284 bytes test/line-width-scale-ps-rgb24-ref.png | Bin 0 -> 3901 bytes test/new-sub-path-ps-rgb24-ref.png | Bin 0 -> 423 bytes test/pixman-rotate-ps-argb32-ref.png | Bin 0 -> 411 bytes test/pixman-rotate-ps-rgb24-ref.png | Bin 0 -> 392 bytes test/random-intersections-ps-rgb24-ref.png | Bin 0 -> 89414 bytes test/rel-path-ps-rgb24-ref.png | Bin 0 -> 243 bytes test/rotate-image-surface-paint-ps-rgb24-ref.png | Bin 0 -> 274 bytes test/source-clip-scale-ps-argb32-ref.png | Bin 0 -> 183 bytes test/source-clip-scale-ps-rgb24-ref.png | Bin 0 -> 183 bytes test/text-rotate-ps-rgb24-ref.png | Bin 0 -> 7196 bytes 25 files changed, 0 insertions(+), 0 deletions(-) commit 8520ce31be13bc939357cd45bd1b4c1967d7ff53 Author: Adrian Johnson Date: Sat Oct 13 20:17:43 2007 +0930 PS: Add meta surface pattern support boilerplate/cairo-boilerplate.c | 11 +-- src/cairo-ps-surface-private.h | 2 +- src/cairo-ps-surface.c | 257 ++++++++++++++++++++++++++------------- 3 files changed, 177 insertions(+), 93 deletions(-) commit e5b01e67975578797b4f7875a9ba02121ff935b5 Author: Chris Wilson Date: Thu Oct 11 17:54:55 2007 +0100 [Makefile.am] Add missing headers and reference images. Andrew Jorgensen spotted that make dist was missing a few headers needed for compilation and running make distcheck had spurious failures. Add the missing files to the distribution and a silly one-liner to check for missing reference images. src/Makefile.am | 2 ++ test/Makefile.am | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletions(-) commit b7adcf67f8c640c146bada1fbeaa1cda1cfa825a Author: Chris Wilson Date: Thu Oct 11 14:11:06 2007 +0100 [cairo-path-stroke] Jump to cleanup after error. Incorrect early return in _cairo_stroker_curve_to() after _cairo_stroker_join() resulted in leaking the local spline and pen. src/cairo-path-stroke.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0222c02d9525dc8ff1ad5a2bea46e623d9db1e43 Author: Chris Wilson Date: Thu Oct 11 14:01:20 2007 +0100 [cairo-pdf-surface] Return UNSUPPORTED from _to_unicode_stream(). Distinguish the UNSUPPORTED case where the font backend does not support conversion to unicode from other fatal errors by returning a status value rather than using stream.id == 0 to indicate any error. src/cairo-pdf-surface.c | 71 +++++++++++++++++++++++++--------------------- 1 files changed, 39 insertions(+), 32 deletions(-) commit 981bc12e5b9b91ce1c5abe343ace837561059658 Author: Chris Wilson Date: Wed Oct 10 23:58:43 2007 +0100 [cairo-ps-surface] Close a couple of memory leaks. Adjust error paths to free local resources. src/cairo-ps-surface.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-) commit c1db44b26501cd905fb9ca858f41632c148b6b07 Author: Chris Wilson Date: Wed Oct 10 15:15:55 2007 +0100 [cairo-png] Clean up volatile warning. gcc warns that 'rows' is missing a volatile qualifier - so add it. src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 05702b8b6ea73fecd04dc5cc4b26ad1d46fa8850 Author: Chris Wilson Date: Tue Oct 9 23:37:34 2007 +0100 [cairo-pdf-surface] Free the clip path on error. If we fail to add the clip path to the current group, destroy it. src/cairo-pdf-surface.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) commit 8fa5f638a5f8eee4f9efe267ede20344fc7bd4e2 Author: Chris Wilson Date: Tue Oct 9 23:36:52 2007 +0100 [cairo-pdf-surface] Restore old_group for failed emit_meta_surface(). Ensure we restore the surface->current_group if we encounter an error during _cairo_pdf_surface_emit_meta_surface() lest we leak the current_group array. src/cairo-pdf-surface.c | 27 ++++++++++++++++----------- 1 files changed, 16 insertions(+), 11 deletions(-) commit 8eb9fcf67336a8e4f95366956ae6f1880af4a93e Author: Vladimir Vukicevic Date: Wed Oct 10 14:05:22 2007 -0700 [win32] mask win32 printing vertex colors with 0xff00 per docs The range for the vertex color structures is 0x0000 .. 0xff00; I think that this is an error in the docs, but strip out the low bits just in case. src/cairo-win32-printing-surface.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit 3545ebc1357969616e2f4fa6b36565f211ea36b3 Author: Vladimir Vukicevic Date: Wed Oct 10 14:01:30 2007 -0700 Fix win32 printing surface copyright notice Bad copy-and-paste of license. src/cairo-win32-printing-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0b65c301a72836f46cdcda8b8fa1e995100c7727 Author: Chris Wilson Date: Tue Oct 9 23:17:42 2007 +0100 [Makefile.am] Change lcov-clean to use more portable constructs. Replace xargs and rm with the binaries found by configure and drop the passing of NUL-terminated strings as that is a GNU extension. Makefile.am | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit b8d7d62b08576364c8c402490b6f5e4a1472d5d8 Author: Chris Wilson Date: Tue Oct 9 23:12:52 2007 +0100 Fix some trivial syntax warnings for -ansi. gcc -ansi -pedantic gives a few syntax warnings, principally for use of '//' comments and a comma at the end of enumerators. Apply these corrections as they are trivial. configure.in | 2 +- src/cairo-directfb-surface.c | 16 ++++++++-------- src/cairo-meta-surface-private.h | 2 +- src/cairo-type1-fallback.c | 2 +- src/cairo-types-private.h | 7 +++---- src/cairoint.h | 5 +++++ 6 files changed, 19 insertions(+), 15 deletions(-) commit 7e6ac74de17cf82f224d9f5fad3ad60e92d7690b Author: Chris Wilson Date: Wed Oct 10 14:00:56 2007 +0100 [win32] Clean up compiler warnings. Fix up a few instances of unused status returns. src/cairo-win32-font.c | 89 ++++++++++++++++++++---------------- src/cairo-win32-printing-surface.c | 26 +++++++---- src/cairo-win32-surface.c | 24 ++++------ 3 files changed, 76 insertions(+), 63 deletions(-) commit bee05467a5f398eaaaa8d79b3ff0a8b119856143 Author: Chris Wilson Date: Wed Oct 10 12:32:16 2007 +0100 [configure.in] Initialise test_svg. Set test_svg to no prior for checking for SVG availability so that the printed summary is correct if the user explicitly disables the SVG surface on the configure command line. configure.in | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 785cb5b7e11a2786b60a995c43e9ee411ec5ec2d Author: Chris Wilson Date: Tue Oct 9 16:58:46 2007 +0100 [cairo-image-surface] Dead code elimination. Remove an unreachable return and unused variable - tidy up after a bad merge. src/cairo-image-surface.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) commit 2268c5907ce80fe40d54ccfac8435ee5e22d36de Author: Chris Wilson Date: Tue Oct 9 13:23:34 2007 +0100 [cairo-glitz-surface] Propagate errors from set_image(). Propagate errors from _cairo_glitz_surface_set_image(). src/cairo-glitz-surface.c | 28 ++++++++++++++++++++-------- 1 files changed, 20 insertions(+), 8 deletions(-) commit 4958789b9e8bf531259b3d1ea27887a8319f7696 Author: Chris Wilson Date: Tue Oct 9 12:49:08 2007 +0100 [cairo-xlib-surface] Propagate error from _draw_image_surface() to surface. Instead of simply ignoring the error that may occur when we upload the destination image to the xlib surface (via XPutImage) record the error on the xlib surface. src/cairo-xlib-surface.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 9c65efeeb108c39e6f55c9247e7d11bfea35cb66 Author: Chris Wilson Date: Tue Oct 9 11:51:48 2007 +0100 [boilerplate-test-surfaces] Check show page for errors. Check that cairo_surface_show_page() did not generate any errors before reading back the image buffer and saving it as a png. boilerplate/cairo-boilerplate-test-surfaces.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit caf04b1bb89c1a7668e36d5f334765a2323bd564 Author: Chris Wilson Date: Tue Oct 9 11:22:46 2007 +0100 [cairo-cff-subset] Propagate error status from failed append_copy(). Add a couple of missing status checks for the result of cff_index_append_copy(). src/cairo-cff-subset.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) commit ef275cd65a9f20a8a3b1fb3883aff0cc8a3bf401 Author: Chris Wilson Date: Tue Oct 9 11:19:45 2007 +0100 [test-meta-surface] Propagate error from show_page(). Add a missing error propagation for _test_meta_surface_show_page(). src/test-meta-surface.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 7758e56d0c96fd113a12b2adc92c783e962feebf Author: Chris Wilson Date: Tue Oct 9 11:16:40 2007 +0100 [cairo-hull] Remove a couple of redundant status returns. Those two functions unconditionally returned success, so change the return to void. src/cairo-hull.c | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-) commit 1dabfc2b271a57b4eaa13922a031ccd38a586dd1 Author: Chris Wilson Date: Tue Oct 9 11:15:27 2007 +0100 [cairo-clip] Propagate error status from clip_intersect_path(). Propagate the error status (filtering out UNSUPPORTED) from intersect_path() when reapplying the clip path during a deep copy. src/cairo-clip.c | 51 +++++++++++++++++++++++++++++++-------------------- 1 files changed, 31 insertions(+), 20 deletions(-) commit 32b78fffc3b8441029ee6b48762a7d0c06bb44a8 Author: Chris Wilson Date: Tue Oct 9 11:08:58 2007 +0100 [cairo-traps] Simplify the status interaction of traps_grow(). Simply return the error status from the traps_grow() function rather than having an assignment in the return function and then immediately another assignment of the error to the status member at its callsite. src/cairo-traps.c | 11 +++-------- 1 files changed, 3 insertions(+), 8 deletions(-) commit 66563eddd8ba2610fa59341b9337a30533e70d56 Author: Chris Wilson Date: Tue Oct 9 09:28:35 2007 +0100 [cairo-pdf-surface] Check status return after emit_meta_pattern(). Add the missing status propagation. src/cairo-pdf-surface.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit be7d1f0f8f84ddac9e8c7dda4aa39f88806a5e39 Author: Vladimir Vukicevic Date: Tue Oct 9 14:27:53 2007 -0700 Simplify CAIRO_REFERENCE_COUNT_INVALID macro MSVC doesn't like the previous anonymous structure/cast, so simplify to just a bare {} structure for use as an initializer. src/cairo-reference-count-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 712c3cda44d7023316b93a1241e66aabde15d668 Author: Vladimir Vukicevic Date: Tue Oct 9 13:56:51 2007 -0700 [win32] reduce GDI object usage Only create region objects if they're necessary; this significantly reduces the number of GDI objects in use by cairo surfaces. src/cairo-win32-surface.c | 159 +++++++++++++++++++++++++-------------------- 1 files changed, 89 insertions(+), 70 deletions(-) commit c99d33b10e84883ade1402c3c1d1efdb4b46f66e Author: Vladimir Vukicevic Date: Tue Oct 2 10:54:44 2007 -0700 [win32] return a nil surface, not NULL Missed an error return src/cairo-win32-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4dbf495515d6de933de7f567b935c5fdceed5f6f Author: Vladimir Vukicevic Date: Tue Oct 2 10:48:59 2007 -0700 [win32] report error correctly if CreateCompatibleBitmap fails These errors were being dropped on the floor, leading to rendering errors in out of video memory conditions. src/cairo-win32-surface.c | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) commit 61ba63f3a0947bc89310f04e9bc1694fb6451c11 Author: Vladimir Vukicevic Date: Fri Sep 21 11:18:17 2007 -0700 [win32] remove ignore_operators flag from win32 printing surface Remove the ignore_operators fallback-avoiding workaround; if apps want that same behaviour, they'll have to implement it themselves by taking care when calling cairo_set_operator(). src/cairo-win32-printing-surface.c | 16 ++++------------ src/cairo-win32-private.h | 5 ----- src/cairo-win32.h | 3 ++- 3 files changed, 6 insertions(+), 18 deletions(-) commit b12ed375cf7ad02a30324616e121a1e9ab8998cb Author: Behdad Esfahbod Date: Tue Oct 9 15:54:58 2007 -0400 [ChangeLog.mk] Fix changelog generation rules Previously it was trying to get logs of 1.2.0..1.4 while I really meant was 1.2.0..1.4.0. It was a simple typo. ChangeLog.mk | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cbc4087a40aa7c6039ddadfca2a9876cb14e1bc6 Author: Adrian Johnson Date: Sat Oct 6 19:18:31 2007 +0930 Type1 subset: Add check for CFF fonts src/cairo-type1-subset.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit a1633df6eebd9b1252d832c7a70cea6150c818d3 Author: Chris Wilson Date: Fri Oct 5 17:21:00 2007 +0100 [cairo-scaled-font-subsets] Increment the sub_font counter after insertion. Do not modify the parent subsets->num_sub_font until after we have successfully created the sub_font and inserted it into the hash table. src/cairo-scaled-font-subsets.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) commit cf2f994a319da1230c5d53f3dd81e7715e44a162 Author: Chris Wilson Date: Fri Oct 5 17:15:29 2007 +0100 [cairo-paginated-surface] Propagate backend errors to the surface. If we call a srface backend function directly, then it our responsibility to propagate any fatal errors to the surface. src/cairo-paginated-surface.c | 57 ++++++++++++++++++++++++---------------- 1 files changed, 34 insertions(+), 23 deletions(-) commit 3da62fdd2848bd9d06b83534adfee2afa17828ba Author: Chris Wilson Date: Fri Oct 5 13:41:39 2007 +0100 [cairo-xlib-display] Rescan the displays list during shutdown. As we drop the list mutex whilst calling the hooks during the XCloseDisplay callback, we must rescan the list when we reacquire the mutex in order to remove the display from the list. src/cairo-xlib-display.c | 48 +++++++++++++++++++++++++-------------------- 1 files changed, 27 insertions(+), 21 deletions(-) commit 737cbd25a6cb0bec87563926ad644da019fc9800 Author: Chris Wilson Date: Fri Oct 5 13:03:47 2007 +0100 [cairo-ps-surface] Cleanup ps surface after creation failure. If we fail to create the paginated wrapper for the ps surface, cleanup the resources allocated for the surface. src/cairo-ps-surface.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) commit 31b52779bad4122d101cdffdb03153baf6cd011e Author: Chris Wilson Date: Fri Oct 5 12:55:13 2007 +0100 [cairo-boilerplate-xlib] Cleanup fallback after creation failure. Cleanup the local resource if we fail to create the X window and surface for the xlib fallback test target. boilerplate/cairo-boilerplate-xlib.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit b210bea6c1867ef9d5c344747d17ca216f6071bd Author: Chris Wilson Date: Fri Oct 5 12:45:36 2007 +0100 [cairo-pdf-surface] Check for pdf_resource_t allocation failure. Check that the resources are actually allocated or propagate the error. src/cairo-pdf-surface.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) commit 5ac7ba9821cba076d7f53f6b8836a8619661018c Author: Chris Wilson Date: Fri Oct 5 12:16:23 2007 +0100 [cairo-pdf-surface] Destroy local resources on failed surface creation. During _cairo_pdf_surface_create_for_stream_internal() destroy all locally allocated resources and the output stream if we fail to create the pdf surface or its paginated wrapper. src/cairo-pdf-surface.c | 29 ++++++++++++++++++++--------- 1 files changed, 20 insertions(+), 9 deletions(-) commit 63ddfa077c498780d46f752ec7f255b143c9f692 Author: Chris Wilson Date: Fri Oct 5 12:08:40 2007 +0100 [cairo-pdf-surface] Propagate error status. Add a few missing propagations of error status. src/cairo-pdf-surface.c | 45 ++++++++++++++++++++++++++++++++++----------- 1 files changed, 34 insertions(+), 11 deletions(-) commit f1b6e2735c48d5a54190068c038047942f40f1d1 Author: Chris Wilson Date: Fri Oct 5 11:59:13 2007 +0100 [cairo-ps-surface] Propagate errors from emit_pattern(). Do not discard the error status from _cairo_ps_surface_emit_pattern(), but propagate it back to the caller. src/cairo-ps-surface.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) commit 709f3160368417d9a9a78974b16d93ec3e5e3c14 Author: Chris Wilson Date: Fri Oct 5 17:37:05 2007 +0100 Cleanup a couple of warnings for use of uninitialized statuses. The compiler spotted a couple of potential uses of an uninitialized status variable - apply the obvious fixes. src/cairo-svg-surface.c | 2 +- src/cairo-type1-subset.c | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) commit 2f22510e22237283869fb2e23585504077566adf Author: Chris Wilson Date: Fri Oct 5 16:23:12 2007 +0100 [cairo-xlib] Initialize the global mutexes. The xlib surface creation routines will eventually attempt to lock the global _cairo_xlib_display_mutex. Under the default environment this is a non-issue as the CAIRO_MUTEX_INITIALIZE/FINALIZE become no-ops under pthreads. However, for the sake of correctness (i.e. to silence the lockdep debugger!) insert a call to initialize the global mutexes at the start of the public entry points. src/cairo-xlib-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit d2557cd5eec7e51496d6b1b57899b2a028898a7c Author: Chris Wilson Date: Fri Oct 5 00:57:38 2007 +0100 [test-paginated] Free resources if fail to create the test surface. Ensure that all the locally allocated resources are freed if we fail to allocate the paginated test surface. src/test-paginated-surface.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) commit 60ffeecd4888fdf824b4095c945e1b27e05c0e1d Author: Chris Wilson Date: Fri Oct 5 00:56:11 2007 +0100 [test-surfaces] Mark the test backend as static. There is no need to export the test surface backends, so mark them static. src/test-fallback-surface.c | 4 ++-- src/test-meta-surface.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 6598973661490ce90b9f42155d8397af491b90c9 Author: Chris Wilson Date: Fri Oct 5 10:23:13 2007 +0100 [cairo-scaled-font-subset] Propagate errors during collection. Propagate the errors encountered whilst iterating over the scaled font subsets ie _cairo_scaled_font_subsets_foreach_scaled() and co. src/cairo-pdf-surface.c | 20 ++++++++++++-------- src/cairo-ps-surface.c | 27 +++++++++++++++++++-------- src/cairo-scaled-font-subsets-private.h | 2 +- src/cairo-scaled-font-subsets.c | 20 ++++++++++++++++---- src/cairo-svg-surface.c | 4 +++- 5 files changed, 51 insertions(+), 22 deletions(-) commit 3a2dd9d33686d6a6d1549965cacf48a7f401c086 Author: Chris Wilson Date: Fri Oct 5 10:10:16 2007 +0100 [cairo-png] Markup a couple of original error sites with _cairo_error(). Add the _cairo_error() markup to the original error sites within the png read/write functions. src/cairo-png.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 81243ee7ef1c3fdf3d571778c414adb64e05fa9d Author: Chris Wilson Date: Fri Oct 5 09:57:56 2007 +0100 [cairo-scaled-font] Mask cannot be NULL so remove redundant check. We either generate a mask for the glyphs or throw an error and bypass the check, so at that point mask can never be NULL and we do not need the test. src/cairo-scaled-font.c | 21 +++++++++------------ 1 files changed, 9 insertions(+), 12 deletions(-) commit f3d921baca02af4db5f8f1743f32e800d2f492bc Author: Chris Wilson Date: Fri Oct 5 09:53:36 2007 +0100 [cairo-scaled-font] Destroy the zombie font. If we do not transfer the font to the holdovers array (because it has been removed from the cache and left in a zombie state), destroy it. src/cairo-scaled-font.c | 48 ++++++++++++++++++++++++---------------------- 1 files changed, 25 insertions(+), 23 deletions(-) commit 41aab58f3ae044f1baf668363376532381270ff4 Author: Chris Wilson Date: Fri Oct 5 09:44:29 2007 +0100 [cairo-surface] Add the usual guards to the API entry point. Add the checks for unmodifiable surfaces (snapshots, finished and error) to cairo_surface_set_fallback_resolution. src/cairo-surface.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) commit f3ae783c9c81106bdb3aa2d15b848d131c39cd93 Author: Chris Wilson Date: Fri Oct 5 09:42:23 2007 +0100 [cairo-surface-fallback] Release the acquired image on error. Add _cairo_surface_release_source_image() to the error paths. src/cairo-surface-fallback.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit 29a5aae958fd9c6a8ec71326c7dad679c0bf5938 Author: Chris Wilson Date: Fri Oct 5 09:39:20 2007 +0100 [cairo-type1-fallback] Propagate error from closing the stream. Propagate the error from destroying the font and closing the output stream. src/cairo-type1-fallback.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit dd0f2d851cd4c4b2bab05668800e5379712f8ac6 Author: Chris Wilson Date: Fri Oct 5 15:22:13 2007 +0100 [cairo-atomic] Hide compiler warnings for _cairo_status_set_error(). gcc treats cairo_status_t as an unsigned integer and so generates a warning when passing it address as signed integer pointer to _cairo_atomic_int_cmpxchg(). Use an ugly cast to hide the warning and similarly to hide the warning about the unused result. src/cairo-atomic-private.h | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 91d18eefe7be6ad3d1fa951c7424d5843e4718f9 Author: Chris Wilson Date: Fri Oct 5 15:16:28 2007 +0100 [cairo-type1-subset] Propagate error status (correctly!) Adrian Johnson pointed out a couple of mistakes in my previous attempt, 535e7c161b907292eac098b6b4305373558948df, to ensure propagation of errors throughout the generation of the type1 subset. This time the status member of the cairo_type1_font_subset_t is removed in favour of simply return the error status from each function. This completely avoids the issue of whether we overwrite a pre-existing error status and confustion of status returns and the status member. The removal of the status from the structure is possible due to its short-lived nature - it is not exposed outside of the _cairo_type1_subset_init() function, and is not shared by any other piece of code. src/cairo-type1-subset.c | 293 +++++++++++++++++++++++----------------------- 1 files changed, 146 insertions(+), 147 deletions(-) commit bd2245f8b87d85f5ea61200838c10de70e776cf5 Author: Chris Wilson Date: Fri Oct 5 00:45:00 2007 +0100 [cairo-svg-surface] Review error propagation. Ensure that the error status is propagated and all local resources are freed on the error path. src/cairo-svg-surface.c | 374 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 271 insertions(+), 103 deletions(-) commit 853b29c56fdb50c627b27fc3a767300c7551dba0 Author: Chris Wilson Date: Thu Oct 4 23:30:21 2007 +0100 [cairo-pdf-surface] Add some missing error propagation. Add a couple of returns where the status was being assigned but not checked. src/cairo-pdf-surface.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) commit 323511088d0c9057c1b0fa5e7aacda5e44e2e139 Author: Chris Wilson Date: Thu Oct 4 23:22:49 2007 +0100 [cairo-pdf-surface] Propagate errors from close_stream. Propagate the status return from _cairo_pdf_surface_close_stream(). src/cairo-pdf-surface.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit 0e3f5caf9f0bbdb5acf34ae1b92eab32bf08acbf Author: Chris Wilson Date: Thu Oct 4 23:18:33 2007 +0100 [cairo-pdf-surface] Propagate errors during pattern selection. Propagate error from _cairo_pdf_surface_select_pattern (). src/cairo-pdf-surface.c | 34 ++++++++++++++++++++++++++-------- 1 files changed, 26 insertions(+), 8 deletions(-) commit 7940e39c1820b87c5b96dec6bc59eab97be4a793 Author: Chris Wilson Date: Thu Oct 4 23:15:21 2007 +0100 [cairo-pdf-surface] Propagate errors from opening/closing groups. Propagate the any error encountered during _cairo_pdf_surface_open_group and friends. src/cairo-pdf-surface.c | 193 +++++++++++++++++++++++++++++++++++++---------- 1 files changed, 152 insertions(+), 41 deletions(-) commit 7601939a6524ad97a333fef910f3b5e69c46776c Author: Chris Wilson Date: Thu Oct 4 23:07:36 2007 +0100 [cairo-deflate-stream] Return the nil stream if creating from an error stream. If _cairo_deflate_stream_create() is passed a stream in the error state, return a stream also in the error state, namely the _cairo_output_stream_nil. src/cairo-deflate-stream.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit dbbcb5c26fba77d2a828b253c97e4770b81cf90b Author: Chris Wilson Date: Thu Oct 4 21:18:47 2007 +0100 [Makefile] Correct parameters to lcov reset. lcov uses -z to zero its counters, not --reset. Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 717dcd1a2c109f48f0a419a5178fc58d5d4f9a2d Author: Chris Wilson Date: Thu Oct 4 21:17:31 2007 +0100 [cairo-pdf-surface] Propagate resource allocation failure. Propagate failure of _cairo_pdf_surface_new_object(). src/cairo-pdf-surface.c | 163 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 159 insertions(+), 4 deletions(-) commit 8fb40aee97fdb3ae2cbbfa5c6a350c7b8b030005 Author: Chris Wilson Date: Thu Oct 4 19:20:35 2007 +0100 [cairo-image-surface] Check for errors whilst cloning. After attempting to clone an image, check the context status and return the nil surface if there was an error. src/cairo-image-surface.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit b61931640d384707a6fc48f9ba4a4f2ddf675c32 Author: Chris Wilson Date: Thu Oct 4 19:12:10 2007 +0100 [cairo-ps-surface] Check the creation of output streams. Check for allocation errors during the creation of the output streams. src/cairo-ps-surface.c | 18 ++++++++++++++++-- 1 files changed, 16 insertions(+), 2 deletions(-) commit 353c2ab5c0e10f267a1adf3957b5d6af4e6a2e29 Author: Chris Wilson Date: Thu Oct 4 19:10:42 2007 +0100 [cairo-output-stream] Guard against destroying the nil streams. Add a guard to return early if we attempt to call _cairo_output_stream_destroy() on the nil cairo_output_stream_t streams. src/cairo-output-stream.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 7cc7bf09c1a61f407fdb054640ebf24039f985db Author: Chris Wilson Date: Thu Oct 4 18:52:50 2007 +0100 [cairo-meta-surface] Propagate errors during replay to the surface. Store any fatal errors raised during the replay on the surface object. src/cairo-meta-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 042821b566daf4aa17d662e7422d1b98858954d7 Author: Chris Wilson Date: Thu Oct 4 20:05:58 2007 +0100 [cairo-surface] Propagate fatal errors to the surface. Store errors raised by the backend on the surface. src/cairo-surface.c | 131 ++++++++++++++++++++++++++++----------------------- 1 files changed, 72 insertions(+), 59 deletions(-) commit 535e7c161b907292eac098b6b4305373558948df Author: Chris Wilson Date: Thu Oct 4 18:45:17 2007 +0100 [cairo-type1-subset] Do not mask error returns. When propagating errors, check that we do not overwrite a pre-existing error. src/cairo-type1-subset.c | 123 ++++++++++++++++++++++++++++++---------------- 1 files changed, 81 insertions(+), 42 deletions(-) commit bb8d4c0b14ec175637f57a3b51c4997c0be12a0f Author: Chris Wilson Date: Thu Oct 4 18:33:24 2007 +0100 [cairo-truetype-subset] Do mask error status returns. Be careful not to overwrite existing the error status when propagating errors and to not blindly return INT_STATUS_UNSUPPORTED from load_truetype_table() as this will mask fatal errors. src/cairo-truetype-subset.c | 363 ++++++++++++++++++++++++++----------------- 1 files changed, 219 insertions(+), 144 deletions(-) commit 37fd0d8967df21695d6536af1d7aedbeef2d2449 Author: Chris Wilson Date: Thu Oct 4 17:12:26 2007 +0100 [cairo-cff-subset] Propagate errors and review error paths. Ensure that errors get duly propagated back to the caller and all locally allocated resources are freed along error paths. src/cairo-cff-subset.c | 291 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 209 insertions(+), 82 deletions(-) commit add0959328117e2023db0ba2432ed29ecb93275e Author: Chris Wilson Date: Thu Oct 4 17:00:26 2007 +0100 [cairo-debug] Finalize mutexes along with other static data. Initialize (so repeated calls of cairo_debug_reset_static_data() is safe) and finalize the mutexes with the reset of the static data. src/cairo-debug.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit a4f20610afd18d58a964dbe84cc90c5723b2996d Author: Chris Wilson Date: Thu Oct 4 16:37:44 2007 +0100 [cairo] Protect the getters when operating on the nil object. Put a guard that checks the context's status at the start of each getter that prevents the function from trying to dereference NULL state. Use the status, as opposed to the invalid reference count, for consistency with the existing guards on some of the getters. src/cairo.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 49 insertions(+), 2 deletions(-) commit 80c06f4539962231df771b38e64834a238f410dd Author: Chris Wilson Date: Thu Oct 4 16:16:41 2007 +0100 [cairo-scaled-font] Don't hold onto to a dropped font. Mark fonts that have been removed from the cache due to an error on a shared object and do not put them into the holdovers array. src/cairo-scaled-font.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 6e93941a7605a3958269de195dc16f255dda7bfd Author: Chris Wilson Date: Thu Oct 4 16:04:49 2007 +0100 [cairo-scaled-font] Acquire mutex around _cairo_scaled_font_glyph_path(). All calls that manipulate the scaled_font->cache must hold its mutex. src/cairo-gstate.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 261971a3fb9c10c267cced53a440161f1acb4b5d Author: Chris Wilson Date: Thu Oct 4 16:03:12 2007 +0100 [cairo-gstate] Fix resource leaks on error paths. Ensure that all locally allocated (or referenced) resources are freed if we later encounter an error. src/cairo-gstate.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) commit 4e44d54f3e99b65f5e80485b22d31890ea3d6561 Author: Chris Wilson Date: Thu Oct 4 15:58:21 2007 +0100 [cairo-matrix] Check whether a matrix is invertible before use. Provide an early check as to whether the font matrix is invertible. src/cairo-gstate.c | 3 +++ src/cairo-matrix.c | 10 ++++++++++ src/cairo-scaled-font.c | 3 +++ src/cairoint.h | 3 +++ 4 files changed, 19 insertions(+), 0 deletions(-) commit 528da4e5e131fe385a60431eb6656a542b27c70f Author: Chris Wilson Date: Thu Oct 4 15:50:40 2007 +0100 [cairo-scaled-font] Freeze the font cache whilst iterating over glyphs. Prevent glyph cache removal whilst iterating over a glyph string. src/cairo-scaled-font.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 4b81eeb20ebe070692ef8099c00de3829da8bf69 Author: Chris Wilson Date: Thu Oct 4 15:46:13 2007 +0100 [cairo-scaled-font] Destroy the mask on the error path. Do not leak the mask if we encounter an error whilst tracing. src/cairo-scaled-font.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) commit d0b1308cd73a6b3602e5414abf03a3bdf8d2d001 Author: Chris Wilson Date: Thu Oct 4 15:43:09 2007 +0100 [cairo-scaled-font] Store fatal errors on the cairo_scaled_font_t. Ensure that all fatal errors raised whilst using the font are stored on the font. src/cairo-scaled-font.c | 35 +++++++++++++++++++++++------------ 1 files changed, 23 insertions(+), 12 deletions(-) commit 4c32e6bfde5d613e0eeef407b9b50c557b1878e3 Author: Chris Wilson Date: Thu Oct 4 15:31:25 2007 +0100 [cairo-scaled-font] Return the error status from _cairo_scaled_font_set_error() Similar to the other _cairo_*_set_error() return the error status. src/cairo-ft-font.c | 4 ++-- src/cairo-scaled-font.c | 18 +++++++++--------- src/cairoint.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) commit 06ae5f1ba3bb679c145d2f7e9ed8c244abf7ff17 Author: Chris Wilson Date: Thu Oct 4 15:26:09 2007 +0100 [cairo-font-face] Set the error on the font. Similar to the other shared objects, store fatal errors on the shared font_face. And do not return a cached reference to an object in an error state. src/cairo-font-face.c | 46 +++++++++++++++++++++++++++++++++++++--------- src/cairo-scaled-font.c | 1 + src/cairoint.h | 4 ++++ 3 files changed, 42 insertions(+), 9 deletions(-) commit 4cffdf2681ba254587bd774ea49718e71535b067 Author: Chris Wilson Date: Thu Oct 4 14:59:55 2007 +0100 [cairo-ft-font] Always call _cairo_ft_unscaled_font_fini (). The _cairo_ft_unscaled_font_fini() was skipped during the destroy for fonts generated by cairo_ft_font_face_create_for_ft_face(). However this causes a mutex to be 'leaked' for each font. src/cairo-ft-font.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit de1f92ae14bfc4d74d8df88ae81d7b90dd6739f0 Author: Chris Wilson Date: Thu Oct 4 14:51:16 2007 +0100 [cairo-output-stream] Propagate error status when copying streams. During _cairo_memory_stream_copy(), if set, copy the incoming error over to the destination stream and return early. src/cairo-output-stream.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) commit 2c256f292fc4a9fd8414e29c4df32d347e360900 Author: Chris Wilson Date: Thu Oct 4 14:35:08 2007 +0100 [cairo-error] Another _cairo_error (CAIRO_STATUS_SUCCESS)! Despite double checking, I still ended up converting one too many status values. src/cairo-truetype-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bed8239f03773ad1584c8ba48ceb0b34bbe69453 Author: Chris Wilson Date: Thu Oct 4 13:15:46 2007 +0100 [cairo-error] Clean up all the warnings and missing _cairo_error() calls. Every time we assign or return a hard-coded error status wrap that value with a call to _cairo_error(). So the idiom becomes: status = _cairo_error (CAIRO_STATUS_NO_MEMORY); or return _cairo_error (CAIRO_STATUS_INVALID_DASH); This ensures that a breakpoint placed on _cairo_error() will trigger immediately cairo detects the error. src/cairo-analysis-surface.c | 4 +- src/cairo-array.c | 9 +-- src/cairo-atsui-font.c | 18 +++--- src/cairo-base85-stream.c | 2 +- src/cairo-bentley-ottmann.c | 22 +++----- src/cairo-cache.c | 4 +- src/cairo-cff-subset.c | 122 +++++++++++++++------------------------ src/cairo-clip.c | 18 +++--- src/cairo-deflate-stream.c | 2 +- src/cairo-directfb-surface.c | 49 +++++++--------- src/cairo-font-face.c | 6 +- src/cairo-font-options.c | 4 +- src/cairo-ft-font.c | 111 ++++++++++++++--------------------- src/cairo-glitz-surface.c | 89 ++++++++++++---------------- src/cairo-gstate.c | 37 +++++------- src/cairo-hash.c | 10 +-- src/cairo-hull.c | 2 +- src/cairo-image-surface.c | 47 ++++++--------- src/cairo-lzw.c | 6 +- src/cairo-matrix.c | 4 +- src/cairo-meta-surface.c | 48 ++++++---------- src/cairo-os2-surface.c | 24 ++++---- src/cairo-output-stream.c | 18 +++--- src/cairo-paginated-surface.c | 8 +-- src/cairo-path-fixed.c | 14 ++-- src/cairo-path-stroke.c | 6 +- src/cairo-path.c | 16 +++--- src/cairo-pattern.c | 65 +++++++++----------- src/cairo-pdf-surface.c | 62 ++++++++----------- src/cairo-pen.c | 19 ++---- src/cairo-png.c | 24 ++++---- src/cairo-polygon.c | 6 +- src/cairo-ps-surface.c | 63 +++++++++----------- src/cairo-quartz-surface.c | 15 ++--- src/cairo-region.c | 22 +++---- src/cairo-scaled-font-subsets.c | 20 +++---- src/cairo-scaled-font.c | 16 ++--- src/cairo-skiplist.c | 2 +- src/cairo-spline.c | 6 +- src/cairo-stroke-style.c | 6 +- src/cairo-surface-fallback.c | 10 +-- src/cairo-surface.c | 82 ++++++++++++++------------ src/cairo-svg-surface.c | 24 +++----- src/cairo-traps.c | 9 +-- src/cairo-truetype-subset.c | 43 ++++++-------- src/cairo-type1-fallback.c | 27 ++++----- src/cairo-type1-subset.c | 30 +++++----- src/cairo-unicode.c | 20 +++---- src/cairo-win32-font.c | 40 ++++++------ src/cairo-win32-surface.c | 23 ++++---- src/cairo-xcb-surface.c | 50 +++++++--------- src/cairo-xlib-display.c | 2 +- src/cairo-xlib-surface.c | 88 +++++++++++++--------------- src/cairo.c | 8 +- src/cairoint.h | 8 ++- src/test-fallback-surface.c | 2 +- src/test-meta-surface.c | 6 +- src/test-paginated-surface.c | 6 +- 58 files changed, 648 insertions(+), 856 deletions(-) commit d90d4bb6b99e0a912650234e28d097ea76c1cecc Author: Chris Wilson Date: Thu Oct 4 11:30:13 2007 +0100 [cairo-error] Make _cairo_error() return the error status. As pointed out by Jeff Muizelaar, this allows for more concise code, as _cairo_error(CAIRO_STATUS_NO_MEMORY) return CAIRO_STATUS_NO_MEMORY can become return _cairo_error(CAIRO_STATUS_NO_MEMORY); src/cairo.c | 6 +++++- src/cairoint.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) commit 71120727e190dfaf3ccbe63b3d91d90e36cff6f6 Author: Chris Wilson Date: Thu Oct 4 11:13:33 2007 +0100 [cairo-atomic] Use an atomic operation to set the status on a shared resource. Since the objects can be shared and may be in use simultaneously across multiple threads, setting the status needs to be atomic. We use a locked compare and exchange in order to avoid overwriting an existing error - that is we use an atomic operation that only sets the new status value if the current value is CAIRO_STATUS_SUCCESS. src/cairo-atomic-private.h | 8 ++++++++ src/cairo-atomic.c | 15 +++++++++++++++ src/cairo-pattern.c | 17 ++++++++--------- src/cairo-scaled-font.c | 13 ++++++------- src/cairo-surface.c | 13 ++++++------- src/cairo.c | 12 +++++------- 6 files changed, 48 insertions(+), 30 deletions(-) commit f4356efb64a043e7a459fe77616f3b7c92b25c49 Author: Chris Wilson Date: Thu Oct 4 09:30:32 2007 +0100 [malloc/error] Fixup _cairo_error (CAIRO_STATUS_SUCCESS)! At some point during the blitz, I accidentally wrote _cairo_error (CAIRO_STATUS_SUCCESS) and then proceeded to paste it into the next 30 error sites! s/CAIRO_STATUS_SUCCESS/CAIRO_STATUS_NO_MEMORY/ src/cairo-glitz-surface.c | 24 ++++++++++++------------ src/cairo-gstate.c | 8 ++++---- src/cairo-hash.c | 6 +++--- src/cairo-hull.c | 2 +- src/cairo-image-surface.c | 12 +++++++----- src/cairo-lzw.c | 4 ++-- src/cairo-meta-surface.c | 10 +++++----- 7 files changed, 34 insertions(+), 32 deletions(-) commit ef5f460eb1f86a73e016c1150723ae1e70b3b037 Author: Chris Wilson Date: Thu Oct 4 09:08:46 2007 +0100 [cairo-path] Check for an empty path in cairo_append_path(). As we now generate empty paths, we must be able to handle empty paths in the user facing API. cairo_append_path() has an explicit check, and raises an error, for a NULL path->data, so we need to check the path->num_data first for empty paths. src/cairo.c | 3 +++ test/copy-path.c | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) commit 8ad56b308ae8bbecfe9873c21551a6d4b2302420 Author: Chris Wilson Date: Thu Oct 4 00:38:12 2007 +0100 [malloc/error] Add call to _cairo_error() after a failed malloc. Blitz all allocations to ensure that they raise a _cairo_error(CAIRO_STATUS_NO_MEMORY) on failure. src/cairo-array.c | 6 +++- src/cairo-atsui-font.c | 1 + src/cairo-base85-stream.c | 4 ++- src/cairo-bentley-ottmann.c | 12 +++++-- src/cairo-cache.c | 4 ++- src/cairo-cff-subset.c | 72 +++++++++++++++++++++++++++++--------- src/cairo-clip.c | 4 ++- src/cairo-deflate-stream.c | 4 ++- src/cairo-directfb-surface.c | 32 ++++++++++++----- src/cairo-font-face.c | 4 ++- src/cairo-font-options.c | 11 ++++-- src/cairo-ft-font.c | 13 +++++-- src/cairo-glitz-surface.c | 33 ++++++++++++++---- src/cairo-gstate.c | 13 +++++-- src/cairo-hash.c | 9 ++++- src/cairo-hull.c | 4 ++- src/cairo-image-surface.c | 10 ++++- src/cairo-lzw.c | 2 + src/cairo-meta-surface.c | 26 +++++++++++--- src/cairo-output-stream.c | 21 +++++++++--- src/cairo-paginated-surface.c | 4 ++- src/cairo-path-fixed.c | 8 +++- src/cairo-path-stroke.c | 5 ++- src/cairo-pattern.c | 5 ++- src/cairo-pdf-surface.c | 10 ++++- src/cairo-ps-surface.c | 19 +++++++--- src/cairo-quartz-surface.c | 14 +++++++ src/cairo-region.c | 4 ++- src/cairo-scaled-font-subsets.c | 18 +++++++--- src/cairo-scaled-font.c | 3 ++ src/cairo-skiplist.c | 5 ++- src/cairo-spline.c | 1 + src/cairo-stroke-style.c | 4 ++- src/cairo-surface-fallback.c | 2 + src/cairo-surface.c | 1 + src/cairo-traps.c | 5 ++- src/cairo-truetype-subset.c | 13 ++++++- src/cairo-type1-fallback.c | 7 +++- src/cairo-type1-subset.c | 26 +++++++++++--- src/cairo-unicode.c | 8 +++- src/cairo-win32-font.c | 9 ++++- src/cairo-win32-surface.c | 5 ++- src/cairo-xcb-surface.c | 23 ++++++++++--- src/cairo-xlib-display.c | 4 ++- src/cairo-xlib-surface.c | 19 ++++++++-- src/cairo.c | 9 ++++- src/test-meta-surface.c | 4 ++- 47 files changed, 404 insertions(+), 116 deletions(-) commit 66664596559c55913fb0b9c8784fe8ab862c217b Author: Chris Wilson Date: Wed Oct 3 23:25:10 2007 +0100 [malloc] Take advantage of calloc() argument checking. calloc() will check its arguments for integer overflows so it is safer not to pre-multiply them. src/cairo-ft-font.c | 4 ++-- src/cairo-glitz-surface.c | 2 +- src/cairo-image-surface.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) commit e49bcde27f88e21d5b8037a0089a226096f6514b Author: Chris Wilson Date: Wed Oct 3 23:19:10 2007 +0100 [malloc] Check for integer overflow when realloc'ing. Perform similar sanity checks to Vlad's _cairo_malloc_ab() but on the arguments to realloc instead. src/cairo-array.c | 4 ++-- src/cairo-lzw.c | 6 +++++- src/cairo-malloc-private.h | 30 ++++++++++++++++++++++++++---- src/cairo-path-stroke.c | 3 ++- src/cairo-pattern.c | 4 +++- src/cairo-pen.c | 3 ++- src/cairo-polygon.c | 3 ++- src/cairo-spline.c | 3 ++- src/cairo-traps.c | 3 ++- 9 files changed, 46 insertions(+), 13 deletions(-) commit 8cba73a36c4ec42601388bb9374f3182651bfe60 Author: Chris Wilson Date: Wed Oct 3 22:27:09 2007 +0100 [cairo-polygon] Add a _cairo_error(). Add a _cairo_error() to an originating error site. src/cairo-polygon.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e767c8b50af578209f1dac3b8f2ae22835e1fee7 Author: Chris Wilson Date: Wed Oct 3 22:26:03 2007 +0100 [cairo-pen] Add _cairo_error(). Markup a couple of originating error sites with _cairo_error(). src/cairo-pen.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 7047a091748577754845a6ed7f35837e41e7d5fb Author: Adrian Johnson Date: Wed Oct 3 23:10:15 2007 +0930 TODO: Remove PDF encoding issues All PDF font encoding issues are fixed now that TrueType fonts are embedded in PDF as CIDFontType2. TODO | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 3e70b0a388c04c61816078de058c323774edeb96 Author: Adrian Johnson Date: Wed Oct 3 23:01:59 2007 +0930 ROADMAP: Mark EPS support done ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a4627177663beacd3d15699fee072f7ad2eff4a9 Author: Adrian Johnson Date: Wed Oct 3 19:55:05 2007 +0930 PDF: Fix bug in font resources src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c9a9f1299c2bd5b6a8e53fdb264c233a43e0c44a Author: Chris Wilson Date: Mon Oct 1 17:00:38 2007 +0100 [cairo-image-surface] Avoid trying to create surfaces with invalid strides. pixman does not (yet?) support arbitrary strides and will fail to generate an image for the data. We misinterpret that failure as a CAIRO_STATUS_NO_MEMORY, so instead return CAIRO_STATUS_INVALID_FORMAT before attempting to create the pixman image. src/cairo-image-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit e241205f0c6d823150cf018c0deb6652dd8b8d02 Author: Chris Wilson Date: Mon Oct 1 16:54:16 2007 +0100 [cairo-image-surface] Return correct error surfaces. Avoid returning the "generic" _cairo_surface_nil (which corresponds to CAIRO_STATUS_NO_MEMORY) when the user asks us to create a surface with an invalid format or content. src/cairo-image-surface.c | 65 ++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 59 insertions(+), 6 deletions(-) commit b4f86638cc4b87bfaf10568ae9beb89626e26613 Author: Chris Wilson Date: Mon Oct 1 17:59:57 2007 +0100 [cairo-path] Don't raise an error when attempting to create an empty path. Generate a real empty path structure instead of returning _cairo_path_nil, if we have been asked to create an empty path. (Also add a couple of missing _cairo_error()s and an appropriate test case.) Spotted by Fred Kiefer. src/cairo-path.c | 36 ++++++++++++++++++++++++------------ test/copy-path.c | 17 +++++++++++++++++ 2 files changed, 41 insertions(+), 12 deletions(-) commit 042c382c094d1ea6f9a5a162d4d1d9ac83413233 Author: Adrian Johnson Date: Sat Sep 29 07:55:48 2007 +0930 CFF Subetting: Fix for #10849 This fixes the problem Apple Preview has with viewing PDFs with CFF font subsets. src/cairo-cff-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d837a458b95c0e1866eecaf3688dfa36e7dafe8e Author: Chris Wilson Date: Thu Sep 27 17:45:51 2007 +0100 [configure] Work-around bad interaction of libtool and lcov libtool causes the .gcda files to be generated in the .libs/ directory, separate from the .c source file. lcov expects them to be in the same directory - so massage the lcov.info file to remove the reference to the .libs/. Also separate the target for generating the lcov output, so that it can be run independently from triggering the tests. And improve convenience of using the other lcov targets. Makefile.am | 29 ++++++++++++++++++++--------- 1 files changed, 20 insertions(+), 9 deletions(-) commit abe1b89da4a2aa255a218103c7a05711d0f73b1c Author: Chris Wilson Date: Thu Sep 27 14:49:30 2007 +0100 [test/get-path-extents] Test extents of cairo_text_path(). Check that the text path extents match the computed metrics. test/get-path-extents.c | 38 ++++++++++++++++++++++++++++---------- 1 files changed, 28 insertions(+), 10 deletions(-) commit 0618818f7a4a323d2c2d0dd122e08aeaa025b3f3 Author: Chris Wilson Date: Wed Sep 26 14:40:36 2007 +0100 [test/get-path-extents] Test extents of an arc. Add the test case from bug 7245, https://bugs.freedesktop.org/show_bug.cgi?id=7245. test/get-path-extents.c | 24 +++++++++++++++++++----- 1 files changed, 19 insertions(+), 5 deletions(-) commit 54d5dccffa402835db57231f7a6cd98d71688359 Author: Adrian Johnson Date: Wed Sep 26 22:21:26 2007 +0930 PDF: Compress pattern and group streams src/cairo-pdf-surface.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) commit a0a51977f48cc14c442357f472ed20e43c42829c Author: Adrian Johnson Date: Wed Sep 26 22:21:07 2007 +0930 PDF: Fix bug in font resources when same font is in multiple groups src/cairo-pdf-surface.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-) commit 76b9b1819251c8f3df0a5ada92a501ad83baa5a1 Author: Chris Wilson Date: Wed Sep 26 00:41:31 2007 +0100 [test/create-for-stream] Add the missing cairo_surface_finish(). Moments after pushing the new test case did I realise the issue... We do not attempt to write out the surface to the user stream until we perform the cairo_surface_destroy() by which point we have lost the ability to interrogate the error status. We can avoid this by explicitly calling cairo_surface_finish() and then checking the error status - and we see that the error is indeed reported correctly. No bug. Nothing to see here. Please move along. (Apart from the request for the status to be return from cairo_surface_destroy!) test/create-for-stream.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 1e7f0bd4d5148940fe963eb20782bffe5ee735bd Author: Chris Wilson Date: Wed Sep 26 00:28:47 2007 +0100 [test/create-for-stream] Add test case for user error propagation. From bug https://bugs.freedesktop.org/show_bug.cgi?id=7049, we find that the error status from the user supplied write function to cairo_*_surface_create_for_stream is ignored and not propagated back to the surface/context - leading to silent data loss. Incorporate the suggested test case, a write function that simply returns CAIRO_STATUS_WRITE_ERROR, into create-for-stream.c. test/create-for-stream.c | 57 +++++++++++++++++++++++++++++++++++---------- 1 files changed, 44 insertions(+), 13 deletions(-) commit 1469de5211e84e40490fa612538986768748bd55 Author: Chris Wilson Date: Tue Sep 25 23:35:25 2007 +0100 [cairo-png] Propagate error from read and write funcs. Use the png_struct->error_ptr to propagate the error status from the user/stdio read and write functions through the png_error() to the cairo_surface_write_to_png*() and cairo_surface_read_from_png*() functions. From there the error is returned back to the user either directly or as the most appropriate error surface. (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=6909) src/cairo-png.c | 57 +++++++++++++++++++++----------- test/create-from-png.c | 84 ++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 113 insertions(+), 28 deletions(-) commit f1d84271d363cc80cdef92ec9cac2cf29783bfe0 Author: Chris Wilson Date: Tue Sep 25 21:58:24 2007 +0100 [cairo-atomic] Do not use Intel atomic primitives on i386. When limiting the target instruction set for compatibility with older processors, e.g. -march=i386, the Intel atomic primitives generate a call to a non-existent function, __sync_fetch_and_add_4(). To detect this scenario change the configure test from AC_TRY_COMPILE to AC_TRY_LINK which will then cause Cairo to fall back to using mutexes for its atomic operations. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 03be41151d06d48d55bc1e172535829ec45a10cf Author: Chris Wilson Date: Sun Sep 23 21:08:09 2007 +0100 [cairo-atomic] Rewrite reference counting using atomic ops. Introduce an opaque cairo_reference_count_t and define operations on it in terms of atomic ops. Update all users of reference counters to use the new opaque type. src/Makefile.am | 1 + src/cairo-clip-private.h | 12 +++--- src/cairo-clip.c | 11 +++-- src/cairo-font-face.c | 49 ++++++++++----------- src/cairo-ft-font.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-pattern.c | 50 +++++++++++---------- src/cairo-private.h | 3 +- src/cairo-reference-count-private.h | 66 ++++++++++++++++++++++++++++ src/cairo-scaled-font-private.h | 3 +- src/cairo-scaled-font.c | 81 +++++++++++++++++------------------ src/cairo-surface-private.h | 3 +- src/cairo-surface.c | 33 ++++++++------ src/cairo-xlib-display.c | 42 ++++++++---------- src/cairo-xlib-private.h | 5 +- src/cairo-xlib-screen.c | 12 +++-- src/cairo.c | 23 +++++----- src/cairoint.h | 27 ++++++------ 18 files changed, 246 insertions(+), 179 deletions(-) commit 8b6c871c9084739460f1320cd36560a09477a83e Author: Chris Wilson Date: Fri Sep 21 10:45:55 2007 +0100 [cairo-atomic] Introduce atomic ops. Test for the availability of the Intel __sync_* atomic primitives and use them to define a few operations useful for reference counting - providing a generic interface that may be targeted at more architectures in the future. If no atomic primitives are available, use a mutex based variant. If the contention on that mutex is too high, we can consider using an array of mutexes using the address of the atomic variable as the hash. configure.in | 16 ++++++++ src/Makefile.am | 2 + src/cairo-atomic-private.h | 81 ++++++++++++++++++++++++++++++++++++++++ src/cairo-atomic.c | 79 +++++++++++++++++++++++++++++++++++++++ src/cairo-mutex-list-private.h | 3 + 5 files changed, 181 insertions(+), 0 deletions(-) commit 42de1a0a7f5cc10c2bad98ef69da302ed2a1ca84 Author: Chris Wilson Date: Sun Sep 23 21:00:23 2007 +0100 Move GCC attributes wrapping into a separate header. The wrapping of GCC attributes (such as cairo_private) needs to be visible to any header file, including those that avoid cairoint.h such as cairo-boilerplate. To achieve this we move the pre-processor magic to its own header file and include it as required. src/Makefile.am | 1 + src/cairo-cache-private.h | 1 + src/cairo-clip-private.h | 1 + src/cairo-compiler-private.h | 115 +++++++++++++++++++++++++++++++++++++ src/cairo-hash-private.h | 1 + src/cairo-mutex-private.h | 1 + src/cairo-output-stream-private.h | 1 + src/cairo-region-private.h | 2 + src/cairo-wideint-private.h | 2 + src/cairo-xlib-private.h | 5 +- src/cairoint.h | 71 +---------------------- 11 files changed, 131 insertions(+), 70 deletions(-) commit be327a7b49a62c684e133aad5d5d6adec30b60e6 Author: Adrian Johnson Date: Tue Sep 25 23:04:03 2007 +0930 PDF: Compress the content stream The content stream compression that was previously implemented was inadvertently bypassed when the new stream handling for meta surface patterns was implemented. src/cairo-pdf-surface-private.h | 4 ++ src/cairo-pdf-surface.c | 65 ++++++++++++++++++++++++++++++++------ 2 files changed, 58 insertions(+), 11 deletions(-) commit 99fd9449c24055fd7b3623157397fe61282e2de0 Author: Adrian Johnson Date: Tue Sep 25 21:57:46 2007 +0930 PDF: Remove duplication from the resource dictionary The same font identifer was being added the resources every time it was referenced. src/cairo-pdf-surface.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) commit dc23ecb6198f1e28b6096cbef931e15407cc20a8 Author: Chris Wilson Date: Sun Sep 23 21:02:31 2007 +0100 [cairo-boilerplate] Do not throw an error if an exclude target is not found. If we fail to exclude a target because it was not in the list of targets - job done and no need to throw a tantrum. boilerplate/cairo-boilerplate.c | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) commit 4f7c5a5033f41de94a7ea284a64f4afa0900fff1 Author: Chris Wilson Date: Sun Sep 23 21:04:36 2007 +0100 [cairo-region] Call _cairo_error() at original error site. Before returning a fresh CAIRO_STATUS_NO_MEMORY, remember to call cairo_error(). src/cairo-region.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 45feb13c2689a8f5813e60fb0c2d17e9e02fd4b5 Author: Chris Wilson Date: Sun Sep 23 21:34:50 2007 +0100 [cairo-clip] Avoid a malloc(0). Avoid a potential allocation of 0 bytes, and a potential NULL leading to an incorrect CAIRO_STATUS_NO_MEMORY, when copying an empty clip region. src/cairo-clip.c | 36 +++++++++++++++++++++--------------- 1 files changed, 21 insertions(+), 15 deletions(-) commit 77f1aa78872aa108199afd41247cf21827f7e33a Author: Adrian Johnson Date: Sun Sep 23 17:43:44 2007 +0930 Add Encapsulated PostScript support The analysis surface will calculated the tight bounding box for each page. A new paginated-surface backend function set_bounding_box() has been added for passing the page bounding box to the target surface at the end of the analysis phase. The changes to the PS file when EPS is enabled are: - Add EPS header - Use tight bounding box instead of page size - Use save/restore to ensure PS interpreter is left in the same state src/cairo-analysis-surface-private.h | 10 ++- src/cairo-analysis-surface.c | 32 +++++++ src/cairo-paginated-private.h | 19 ++++- src/cairo-paginated-surface.c | 15 +++- src/cairo-ps-surface-private.h | 3 +- src/cairo-ps-surface.c | 151 +++++++++++++++++++++++----------- 6 files changed, 171 insertions(+), 59 deletions(-) commit beefbdd63864d10924360f41b244de7edf7b5f5b Author: Adrian Johnson Date: Sun Sep 23 14:23:33 2007 +0930 Add Encapsulated PostScript API doc/public/cairo-sections.txt | 2 + src/cairo-ps-surface-private.h | 2 + src/cairo-ps-surface.c | 57 ++++++++++++++++++++++++++++++++++++++++ src/cairo-ps.h | 7 +++++ 4 files changed, 68 insertions(+), 0 deletions(-) commit b20e08999e2f6e7a72ee75a7c3fd865bf0368794 Author: Adrian Johnson Date: Sun Sep 23 11:37:02 2007 +0930 Truetype Subsetting: Avoid failing when fonts are missing optional tables Previously, the TrueType subsetting would fail if any of the "cvt", "fpgm", or "prep" tables were missing from the source font. However these tables are optional and not required in the subsetted font if they do not appear in the source font. The "name" table has been removed from the subsetted font as the Type42 specification does not require this table. src/cairo-truetype-subset.c | 153 +++++++++++++++++++++++++++++++------------ 1 files changed, 110 insertions(+), 43 deletions(-) commit 8132b8b417c75388ce4c4671fffddaa44a5d1be0 Author: Brian Ewins Date: Sun Sep 23 02:52:01 2007 +0100 [type1-subset] only subset ft fonts If atsui and ft were both enabled, the code crashed trying to subset type-1 fonts; fixed by checking if fonts really are ft before using them as ft fonts. This is a temporary fix until we support subsetting across all font backends. src/cairo-type1-subset.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6020f67f1a49cfe3844c4938d4af24c63c8424cc Author: Vladimir Vukicevic Date: Fri Sep 21 11:02:42 2007 -0700 Avoid divide-by-zero when trying to allocate a 0-sized array Fix up the _cairo_malloc_* wrappers to avoid blindly dividing by zero; any attempt to allocate a zero-sized chunk of memory will result in NULL. src/cairo-malloc-private.h | 35 +++++++++++++++++++++++++---------- 1 files changed, 25 insertions(+), 10 deletions(-) commit c79fc9af334fd6f2d1078071d64178125561b187 Author: Carl Worth Date: Thu Sep 20 16:01:43 2007 -0700 Add rgb24-specific reference imag for mask-alpha test test/mask-alpha-rgb24-ref.png | Bin 0 -> 599 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 59dd59ce8d4c2a35788f3f0baf3409d3a8555744 Author: Adrian Johnson Date: Sun Sep 9 22:32:36 2007 +0930 Add mask-alpha test test/.gitignore | 1 + test/Makefile.am | 1 + test/mask-alpha-ref.png | Bin 0 -> 640 bytes test/mask-alpha.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 0 deletions(-) commit 12b2ab630c2343c7bd7d885cc0e773023e3d8fa8 Author: Adrian Johnson Date: Thu Sep 20 22:51:39 2007 +0930 PDF: Add support for CAIRO_FORMAT_A8 images src/cairo-pdf-surface.c | 44 ++++++++++++++++++++++++++++++++------------ 1 files changed, 32 insertions(+), 12 deletions(-) commit 8a4adcf5f3c893505a53882a0532a220f79f4409 Author: Adrian Johnson Date: Thu Sep 20 08:57:19 2007 +0930 ROADMAP: Add metadata API ROADMAP | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 6e78c6589d4af6291158b7cd9d94e3a80139e279 Author: Behdad Esfahbod Date: Tue Sep 18 19:50:16 2007 -0400 [ROADMAP] Mark xlib IncludeInferior support done ROADMAP | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) commit d8b0de01d67cdf73d8266a73f54ba1ac42fee3c9 Author: Vladimir Vukicevic Date: Tue Sep 18 09:26:05 2007 -0700 fix trailing whitespace src/cairo-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 4fd9acc1b321d75623a66d37c0ff299ae06fb98b Author: Vladimir Vukicevic Date: Tue Sep 4 10:30:08 2007 -0700 [win32] add new win32 printing surface src/Makefile.win32 | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit e3c16e15e39d98f96e2ce20e397d88214f5a821e Author: Vladimir Vukicevic Date: Wed Aug 29 16:30:49 2007 -0700 Make NO_MUTEX really mean no mutexes src/cairo-mutex-type-private.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit ffc16c4be2fb5a0d214cb186dee52e74dbd584cf Author: Vladimir Vukicevic Date: Wed Aug 29 16:25:58 2007 -0700 [win32] Add win32 printing surface Add win32 surface intended for use with printer DCs; GDI will be used as much as possible, and the surface will be a paginated surface that supports fine-grained fallback. (Original work from Adrian Johnson; additional fixes by me.) src/Makefile.am | 2 +- src/cairo-paginated-surface.c | 37 +- src/cairo-win32-font.c | 7 +- src/cairo-win32-printing-surface.c | 1220 ++++++++++++++++++++++++++++++++++++ src/cairo-win32-private.h | 66 ++- src/cairo-win32-surface.c | 78 ++- src/cairo-win32.h | 3 + src/cairo.h | 4 +- 8 files changed, 1376 insertions(+), 41 deletions(-) commit 284ed91ee4418baf6dd1a437a904980a2156fa48 Author: Vladimir Vukicevic Date: Wed Aug 29 15:34:04 2007 -0700 Let surfaces specify their native resolution, for fallback purposes src/cairo-image-surface.c | 2 ++ src/cairo-paginated-surface.c | 4 ++-- src/cairo-surface-private.h | 8 ++++++++ src/cairo-surface.c | 24 ++++++++++++++++++++++++ src/cairoint.h | 6 ++++++ 5 files changed, 42 insertions(+), 2 deletions(-) commit 79d975f84bcc32e91db517d71a7312e2e1d653d4 Author: Behdad Esfahbod Date: Wed Sep 12 17:45:11 2007 -0400 [cairo-ft-font] Ignore FT_Load_Glyph errors other than out-of-memory Same for FT_Render_Glyph. When the user asks us to render a glyph that is not available in the font, it's mostly an unavoidable kind of error for them, as in, they can't avoid such a call. So it's not nice to put cairo_t in an error state and refuse any further drawying. Many PDF files are created using buggy software and cause such glpyh-not-found errors for CID 0 for example. Eventually we should propagate these kind of errors up and return it from the function call causing it, but that needs API change to add return value to all text functions, so for now we just ignore these errors. src/cairo-ft-font.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) commit 21ab44f11d3d20eead5d988c7a6cf48eebff08c7 Author: Behdad Esfahbod Date: Mon Sep 17 16:41:52 2007 -0400 [ChangeLog.mk] Make make rule depend on .git/HEAD, not .git That is exactly what we want. Kristian Høgsberg suggested it. ChangeLog.mk | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3f4875dbe20e1d093d70f49c32f7ddf6a6e6ef61 Author: Adrian Johnson Date: Sun Sep 16 20:26:33 2007 +0930 Analysis-surface: Use pattern extents to limit show_glyphs extents src/cairo-analysis-surface.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) commit 14786385b40aa0ae83e3b077a82e3f34aba63f22 Author: Adrian Johnson Date: Sun Sep 16 19:43:28 2007 +0930 Change paginated surface size when PS/PDF _set_size() called The finer-grained fallbacks would not work correctly if the page was set to a larger size. Add _cairo_paginated_surface_set_size() function that is called from cairo_ps_surface_set_size() and cairo_pdf_surface_set_size(). src/cairo-paginated-private.h | 5 +++++ src/cairo-paginated-surface.c | 23 +++++++++++++++++++++++ src/cairo-pdf-surface-private.h | 2 ++ src/cairo-pdf-surface.c | 14 ++++++++++---- src/cairo-ps-surface-private.h | 2 ++ src/cairo-ps-surface.c | 14 ++++++++++---- 6 files changed, 52 insertions(+), 8 deletions(-) commit 46cb7e69526e8b5663077e7409dc232a0f56800b Author: Adrian Johnson Date: Sun Sep 16 16:32:54 2007 +0930 PS: Remove initclip operator The DSC and EPS specifications do not allow the use of initclip. Instead each page is wrapped in a gsave/restore pair and a "grestore gsave" is emitted when the clip path is reset. src/cairo-ps-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit e9d85235f9cceed92af428e0ab43503fe0850636 Author: Adrian Johnson Date: Sun Sep 16 16:21:10 2007 +0930 PDF: Fix copy_page() bug src/cairo-pdf-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit a5cb48fcf269c16dd138c0ee31b138b1f13e623d Author: Adrian Johnson Date: Sun Sep 16 16:15:10 2007 +0930 PS: Remove copy_page() The DSC specification recommends not using the copypage operator as it breaks page independence. src/cairo-paginated-surface.c | 3 +-- src/cairo-ps-surface.c | 14 +------------- 2 files changed, 2 insertions(+), 15 deletions(-) commit 03f7a51f47717af45afbc439ce2178789449ab32 Author: Ken Herron Date: Sun Sep 16 15:56:16 2007 +0930 PS output optimizations (#11442) This patches cairo-ps-surface.c to use the aliases for moveto, lineto, curveto, and closepath. It also uses selectfont to select fonts. src/cairo-ps-surface.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-) commit 1274147ce3ec855488fe4e437838b1134c494413 Author: Behdad Esfahbod Date: Sat Sep 15 04:03:08 2007 -0400 [cairo-gstate] Fix comment about font_matrix having zero translation src/cairo-gstate.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) commit 6fbe2432c6072522b9003a1e46180392010a7aad Author: Behdad Esfahbod Date: Sat Sep 15 04:02:39 2007 -0400 [PDF] Fix typo in comments src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit dca93eb76d64194f1325d7b941fa523da7801634 Author: Jeff Muizelaar Date: Wed Sep 12 23:12:59 2007 -0400 Fix theoretical NULL return from cairo_pop_group() This also makes the code more consistent as group_pattern always holds a valid pattern. src/cairo.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 5eae45c55b3cd240945cd225631c9c782f69b50f Author: Jonathan Gramain Date: Wed Sep 12 17:43:55 2007 -0400 [cairo-gstate] Fix order of matrices in _cairo_gstate_backend_to_user_rectangle() The cairo_matrix_multiply(out,a,b) docs say that it is equivalent to applying matrix a first, followed by b. Looking at _cairo_gstate_backend_to_user() we should apply device_transform_inverse followed by ctm_inverse. That's what we do now. src/cairo-gstate.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit f2910ad3e9bfd279af7f9f43013489a32b5c1747 Author: Vladimir Vukicevic Date: Tue Sep 11 13:32:26 2007 -0700 Update cairo-sections.txt doc/public/cairo-sections.txt | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 9e975757a2820303d67e8497ab6cef9368237eb5 Author: Vladimir Vukicevic Date: Tue Sep 11 13:30:35 2007 -0700 Export cairo_surface_{copy,show}_page This patch adds cairo_surface_copy_page and cairo_surface_show_page as public methods, leaving the previous cairo_show_page variants as shorthands. copy_page/show_page are specific to the surface, not to the context, so they need to be surface methods. TODO | 5 ---- boilerplate/Makefile.win32 | 4 +++ boilerplate/cairo-boilerplate-test-surfaces.c | 5 +--- src/cairo-gstate.c | 4 +- src/cairo-paginated-surface.c | 6 ++-- src/cairo-surface.c | 27 +++++++++++++++++++++++- src/cairo-svg-surface.c | 2 +- src/cairo.c | 6 +++++ src/cairo.h | 6 +++++ src/cairoint.h | 8 +----- 10 files changed, 50 insertions(+), 23 deletions(-) commit 7dd05b7f86da6a465bb979c2ba955655ddcf66ed Author: Vladimir Vukicevic Date: Tue Sep 11 11:27:35 2007 -0700 [mlk] Free boxes in copy_rectangle_list on success Fix memory leak when copy_rectangle_list is used. src/cairo-clip.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 897350c6c5cba29b8bd7890a33ecc4d7fa9b7795 Author: Adrian Johnson Date: Sun Sep 9 19:11:12 2007 +0930 PDF: Remove BC entry from Smask dictionary The BC (background color) in the smask of the recently added cairo_mask() support was causing Ghostscript to crash due to the wrong number of BC values. The BC entry has been removed as BC default color is already what we want. src/cairo-pdf-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 909e0be2416aa6833639439279583d1ae61777fc Author: Adrian Johnson Date: Sun Sep 9 11:20:02 2007 +0930 Add PDF support for cairo_mask() src/cairo-pdf-surface.c | 129 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 125 insertions(+), 4 deletions(-) commit d62f8861689d8b9a9a837043fb78813f0407abd4 Author: Chris Wilson Date: Wed Sep 5 08:07:41 2007 +0100 [cairo-ft-font] Early detection of a zero sized bitmap. Under rare circumstances we may need to extract a surface that represents a bitmap with width==0 and rows==0. Detect this case at the start and simply return a zero-sized surface. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=12284. src/cairo-ft-font.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit d635e0103346f22e578d17c59153d292820e00d2 Author: Vladimir Vukicevic Date: Thu Sep 6 12:56:59 2007 -0700 Add b8g8r8 formats to cairo-image-surface Add recognition code for x8b8g8r8 and a8b8g8r8 to cairo-image-surface. (Used as the default for 24bpp by some older VNC servers.) src/cairo-image-surface.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) commit 3c01efb0ee0c8911fba7627d056ec3b53dfab6e3 Merge: 0682b9a... 1e21220... Author: Carl Worth Date: Wed Sep 5 14:38:40 2007 -0700 Merge branch adrianj/pdf-meta-surface-pattern into cairo This does introduce some reported failures from the cairo-pdf backend into the test suite. However, in all cases the output PDF files look fine when viewed with acroread. It looks like all of the problems could be fixed by using cairo_rectangle;cairo_fill along with CAIRO_EXTEND_PAD when drawing images with cairo inside poppler. However, I'm not yet filing a bug against poppler and disabling these tests because we need to _implement_ CAIRO_EXTEND_PAD before we can tell poppler to start using it. commit 0682b9a9c18640c284c7cc8ba8792a329414998e Author: Carl Worth Date: Tue Sep 4 16:47:49 2007 -0700 Add rgb24-ignore-alpha test This test demonstrates a bug when compositing an rgb24 image over an argb32 image, (the implementation appears to be examining the alpha channel rather than ignoring it). test/.gitignore | 1 + test/Makefile.am | 1 + test/rgb24-ignore-alpha-ref.png | Bin 0 -> 116 bytes test/rgb24-ignore-alpha.c | 65 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 0 deletions(-) commit 84a2c8968a57ed7593db1515718115218072bc0d Author: Behdad Esfahbod Date: Wed Sep 5 12:38:27 2007 -0400 [test,perf] Support TARGETS_EXCLUDE make variable perf/Makefile.am | 6 ++++-- test/Makefile.am | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) commit 1e21220f0e2540e3befa66e4764f75589d0eef82 Author: Adrian Johnson Date: Wed Sep 5 22:53:43 2007 +0930 Create meta-surface source image with same content type as the meta-surface src/cairo-meta-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 875e32178e5d990a09f3c41262d890888035f04f Author: Adrian Johnson Date: Wed Sep 5 22:51:13 2007 +0930 Eliminate unclipped CLEAR from meta-surface playback The optimization that avoids replaying commands prior to an unclipped CLEAR operation now starts playback from the first command after the CLEAR. This avoids the need to handle the unclipped CLEAR in the PDF surface. src/cairo-meta-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit d24f019101dd014983aeb0bf186fe2011694e2ed Author: Adrian Johnson Date: Wed Sep 5 22:26:16 2007 +0930 Add support for PDF meta-surface patterns boilerplate/cairo-boilerplate.c | 11 +-- src/cairo-analysis-surface.c | 66 +++++++++ src/cairo-meta-surface-private.h | 4 + src/cairo-meta-surface.c | 43 +++++- src/cairo-pdf-surface.c | 282 ++++++++++++++++++++++++++++---------- src/cairo-types-private.h | 3 +- 6 files changed, 317 insertions(+), 92 deletions(-) commit b85032584b32af968dc8d8a0fcfc9f3e1d2770a0 Author: Behdad Esfahbod Date: Wed Sep 5 00:26:56 2007 -0400 [configure.in] Fix non-pkgconfig Xrender detection path (#4724) configure.in | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 1d788da5175dac34ed0298204753bf1b40dfc2b0 Merge: 49ae376... e1819a2... Author: Behdad Esfahbod Date: Tue Sep 4 19:12:48 2007 -0400 Merge branch 'no-xrender.h' into cairo commit e1819a24fb0196218c4045616c2ba458819b7d31 Author: Behdad Esfahbod Date: Tue Sep 4 19:12:14 2007 -0400 [cairo-xlib-xrender-private] Remove some protocol-specific macros src/cairo-xlib-xrender-private.h | 48 -------------------------------------- 1 files changed, 0 insertions(+), 48 deletions(-) commit 5e09126ce13c72222719b73ed3a8f504cf352583 Author: Behdad Esfahbod Date: Tue Sep 4 18:40:54 2007 -0400 [cairo-xlib-xrender-private] Add copyright/license info for copied files src/cairo-xlib-xrender-private.h | 163 ++++++++++++++++++++++---------------- 1 files changed, 95 insertions(+), 68 deletions(-) commit 49ae376840a5851bf4cc281a0562acdfe03337df Author: Carl Worth Date: Tue Sep 4 11:35:40 2007 -0700 Fix error in description of cairo version numbers And eliminate a bit of redundant text. configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit b60c0a672f1711c20f898ac76c15b6b65a63d46e Author: Chris Wilson Date: Mon Sep 3 14:33:11 2007 +0100 [cairo-boilerplate] Introduce CAIRO_TEST_TARGET_EXCLUDE. As opposed to the CAIRO_TEST_TARGET env var which lists the exact targets to test, CAIRO_TEST_TARGET_EXCLUDE instead supplies a list of targets to filter from the testing set. This is useful under circumstances where the build environment prevents testing of a target, for example no DirectFB support or the glitz library is broken, but where you still want to perform the minimal check that the code compiles. boilerplate/cairo-boilerplate.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-) commit 740fed62d236224fdfbfccf8c49a199851189107 Author: Behdad Esfahbod Date: Fri Aug 31 20:52:43 2007 -0400 [xlib] Make it compile without Xrender available at compile time (#12210) src/Makefile.am | 3 +- src/cairo-xlib-display.c | 1 - src/cairo-xlib-private.h | 10 +- src/cairo-xlib-screen.c | 2 - src/cairo-xlib-surface.c | 7 +- src/cairo-xlib-xrender-private.h | 1102 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 1110 insertions(+), 15 deletions(-) commit c8ed3e1827dd1e6e85f2a40de67c4013432ba3bf Author: Jody Goldberg Date: Fri Aug 31 17:00:36 2007 -0400 [PDF] The symbol 'GROUP' is already used on some win32 systems; add a prefix src/cairo-pdf-surface.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit c14cf02f61105b755b380bd0a5d5b9e83a97d2c9 Author: Chris Wilson Date: Fri Aug 31 17:20:54 2007 +0100 [cairo-surface] Add a comment about why the glyph array is not const. As penance for attempting to make the glyph array constant, add a comment block to explain that the backends rely on being able to modify the array. src/cairo-surface.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit e8e3bfc1308aa30ea08ec530b6a5ddf532fd3088 Author: Chris Wilson Date: Fri Aug 31 16:53:21 2007 +0100 Revert "[cairo-gstate] Avoid copying untransformed glyphs." This reverts commit 919bea6dbb32746f11781cd3a94eb44f5c4a32e6. Sadly as Behdad points out some backends do modify the glyph array and, for example cairo-xlib-surface, hide this from the compiler with some evil casts. src/cairo-analysis-surface.c | 2 +- src/cairo-directfb-surface.c | 2 +- src/cairo-glitz-surface.c | 2 +- src/cairo-gstate.c | 41 ++++++++------------------------- src/cairo-meta-surface.c | 2 +- src/cairo-paginated-surface.c | 2 +- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-quartz-surface.c | 2 +- src/cairo-scaled-font.c | 2 +- src/cairo-surface-fallback-private.h | 2 +- src/cairo-surface-fallback.c | 4 +- src/cairo-surface.c | 4 +- src/cairo-svg-surface.c | 2 +- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 2 +- src/cairo-xcb-surface.c | 20 ++++++++-------- src/cairo-xlib-surface.c | 4 +- src/cairoint.h | 12 +++++----- src/test-meta-surface.c | 2 +- src/test-paginated-surface.c | 2 +- 21 files changed, 47 insertions(+), 68 deletions(-) commit 919bea6dbb32746f11781cd3a94eb44f5c4a32e6 Author: Chris Wilson Date: Fri Aug 31 11:24:06 2007 +0100 [cairo-gstate] Avoid copying untransformed glyphs. Skip the memory duplication of the incoming glyphs if we do not need to transform them into the backend coordinate system. As a consequence we need to constify the glyphs passed to the backend functions. src/cairo-analysis-surface.c | 2 +- src/cairo-directfb-surface.c | 2 +- src/cairo-glitz-surface.c | 2 +- src/cairo-gstate.c | 41 +++++++++++++++++++++++++-------- src/cairo-meta-surface.c | 2 +- src/cairo-paginated-surface.c | 2 +- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-quartz-surface.c | 2 +- src/cairo-scaled-font.c | 2 +- src/cairo-surface-fallback-private.h | 2 +- src/cairo-surface-fallback.c | 4 +- src/cairo-surface.c | 4 +- src/cairo-svg-surface.c | 2 +- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 2 +- src/cairo-xcb-surface.c | 20 ++++++++-------- src/cairo-xlib-surface.c | 4 +- src/cairoint.h | 12 +++++----- src/test-meta-surface.c | 2 +- src/test-paginated-surface.c | 2 +- 21 files changed, 68 insertions(+), 47 deletions(-) commit 62377cbac17779fd51ec108e9704be8d3eed4935 Author: Behdad Esfahbod Date: Thu Aug 30 19:45:44 2007 -0400 [cairo-path-fixed] Remove leftover typedef keyword Oops! src/cairo-path-fixed-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit dd406b1ffa411b100950c0156d842e3022e4029d Author: Behdad Esfahbod Date: Thu Aug 30 18:45:26 2007 -0400 [cairo-path-fixed] typedef char cairo_path_fixed_op_t So it consumes one byte only, instead of the previous enum with the __attribute__((packed)) that didn't do anything on non-gcc systems. src/cairo-path-fixed-private.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit e7324454a06e1f090d4e654c9cdcb774f9fb39ab Author: Carl Worth Date: Wed Aug 29 15:26:41 2007 -0700 Disable radial-gradient and unbounded-operator tests for pdf These are failing due to (already reported) poppler bugs. There were also problems with the gradients in the PDF files previously, but these have recently been fixed. boilerplate/cairo-boilerplate-pdf.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit f72078fb7660b3c8a369e7bca19628416176a55e Author: Adrian Johnson Date: Wed Aug 29 20:18:09 2007 +0930 Fix unbounded operator bug in analysis surface src/cairo-analysis-surface.c | 117 +++++++++++++++++++++++------------------- 1 files changed, 65 insertions(+), 52 deletions(-) commit 3216275fd9a9cd8d51b1c3a8671393912d50d899 Author: Adrian Johnson Date: Tue Aug 28 23:40:18 2007 +0930 Fix PDF gradients bug The PDF surface was adding extra stops at the 0.0 and 1.0 offset when there was not already stops at these offsets. This has been replaced with code to move the coordinates of the linear gradient line in to the position of the first and last offset. src/cairo-pdf-surface.c | 63 ++++++++++++++++++++++++++++++---------------- 1 files changed, 41 insertions(+), 22 deletions(-) commit bdc70d1fc2a31aa829571244c54f98210e97a2cf Author: Vladimir Vukicevic Date: Wed Aug 29 12:52:00 2007 -0700 [win32] call scaled_font_fini in create before returning NULL src/cairo-win32-font.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit 114b07881e8b09f97394dd4fe8f2900ee9f4c348 Author: Behdad Esfahbod Date: Wed Aug 29 12:18:16 2007 -0400 [configure.in] Make PS backend require zlib too (#12210) The PS backend uses zlib these days. Make it depend on zlib being available like PDF has been doing. configure.in | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 7f726e57546dba4cdd96086515a372d18c1ee2a9 Author: Behdad Esfahbod Date: Wed Aug 29 12:15:36 2007 -0400 [configure.in] Document version scheme configure.in | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 93aee43690c329f43be9e7b840851267ceb17956 Author: Vladimir Vukicevic Date: Tue Aug 28 16:47:24 2007 -0700 Fix previous create_similar fallback patch We can't use composite, as some backends don't implement it. Use paint() instead. src/cairo-pattern.c | 32 ----------------------- src/cairo-surface-fallback.c | 28 +++++++++++--------- src/cairo-surface.c | 57 ++++++++++++++++++++++-------------------- 3 files changed, 46 insertions(+), 71 deletions(-) commit 6525d4debb6df67126b04609bb04d23d9c9bd7a6 Author: Vladimir Vukicevic Date: Tue Aug 28 10:47:52 2007 -0700 [win32] call free() and not scaled_font_destroy() if scaled init fails If scaled_font_destroy() is called, a deadlock can result; there's no reason to call destroy since the initialization failed (and, indeed, it might not be valid to do so anyway). src/cairo-win32-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ae19b1c9911f95f64657f6ddaa0c924ca7a34b88 Author: Vladimir Vukicevic Date: Tue Aug 28 10:40:33 2007 -0700 [win32] Add cairo_win32_font_face_create_for_logfontw_hfont Patch from: Robert O'Callahan Add cairo_win32_font_face_create_for_logfontw_hfont, allow win32 scaled_fonts to rescale themselves properly to the required CTM and only use the font_face's hfont if we're sure it's appropriate. src/cairo-win32-font.c | 107 ++++++++++++++++++++++++++++++++++++++---------- src/cairo-win32.h | 3 + 2 files changed, 88 insertions(+), 22 deletions(-) commit 69dae7ee4ace8a92226140ce5ccb690e7f62e35c Author: Vladimir Vukicevic Date: Mon Aug 27 16:30:52 2007 -0700 Implement fallback for clone_similar src/cairo-surface-fallback-private.h | 10 ++++++++ src/cairo-surface-fallback.c | 41 ++++++++++++++++++++++++++++++++++ src/cairo-surface.c | 6 ++++- 3 files changed, 56 insertions(+), 1 deletions(-) commit 19fa097f515e72c195d10ddd64920ec71fa903ec Author: Vladimir Vukicevic Date: Mon Aug 27 15:29:24 2007 -0700 [win32] Update win32 Makefiles Happy building with msys, one location for CFLAGS/etc changes (toplevel), new pdiff makefile. Makefile.win32 | 45 ++++++++++++++++++++++++++++++++++++++----- boilerplate/Makefile.win32 | 13 ++++++----- src/Makefile.win32 | 18 +++++----------- test/Makefile.win32 | 18 ++++++++++++---- test/pdiff/Makefile.win32 | 18 +++++++++++++++++ 5 files changed, 83 insertions(+), 29 deletions(-) commit f4a8633fce5262c09b323eef212fd6efe57d8f10 Author: Vladimir Vukicevic Date: Mon Aug 27 14:26:19 2007 -0700 [win32] check correct surface for BitBlt support in get_subimage src/cairo-win32-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 9aad6efd2b2ee14b0a8960a8e4de91b330ad0c4c Author: Vladimir Vukicevic Date: Mon Aug 27 14:17:50 2007 -0700 Fix image_extra arg in call to _cairo_release_source_image src/cairo-surface-fallback.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7ccae2de6d859fcac93cedbd3ecd1121e0d0a72b Author: Behdad Esfahbod Date: Tue Aug 28 13:45:02 2007 -0400 [perf] Make cairo-perf-diff build cairo-perf-diff-files perf/cairo-perf-diff | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit 766346aa5cffb699206cc17114221ba7a0323565 Author: Adrian Johnson Date: Tue Aug 28 20:35:49 2007 +0930 PDF: Remove unused code src/cairo-pdf-surface-private.h | 1 - src/cairo-pdf-surface.c | 18 ------------------ 2 files changed, 0 insertions(+), 19 deletions(-) commit ad43b7fe6bba3ba597b28b6f6668ee98cdc04a88 Author: Adrian Johnson Date: Tue Aug 28 20:35:23 2007 +0930 PDF: Clean up comments src/cairo-pdf-surface.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit a60beb2eef46b03bcb81f5204dcde49cbc090928 Author: Adrian Johnson Date: Tue Aug 28 20:34:55 2007 +0930 Fix PDF regression with multipage documents src/cairo-pdf-surface.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 1a6b62e5995aac27527c37fd5cb6ec5e36a3f890 Author: Carl Worth Date: Mon Aug 27 14:45:51 2007 -0700 Disable 7 cairo-pdf tests due to poppler knockout-group bug The following 7 tests currently fail with poppler due to: Poppler does not correctly handle knockout groups https://bugs.freedesktop.org/show_bug.cgi?id=12185 and we've verified with acroread that the cairo-pdf output does render as intended there. The disabled tests are clip-operator, operator-clear, operator-source, over-above-source, over-around-source, over-below-source, and over-between-source. boilerplate/cairo-boilerplate-pdf.c | 25 ++++++++++++++++++------- 1 files changed, 18 insertions(+), 7 deletions(-) commit 1cdd11873b18ec55521ffd744ad12c619cf9b227 Author: Adrian Johnson Date: Sat Aug 25 06:44:08 2007 +0930 Add finer-grained fallback support to the PDF surface The stream handling has been changed to support writing the content to one or more group objects. Each page has a top level knockout group. The first operation in the knockout group paints another group containing the content. Fallback images are painted from the knockout group. This ensures that fallback images do not composite with any content under the image. src/cairo-paginated-surface.c | 6 +- src/cairo-pdf-surface-private.h | 55 ++- src/cairo-pdf-surface.c | 1406 ++++++++++++++++++++++++++------------- 3 files changed, 982 insertions(+), 485 deletions(-) commit 1e8446609b01a3a60c3cc5b69d95d26cc9df460b Author: Carl Worth Date: Mon Aug 27 14:02:55 2007 -0700 Add explanation of pdf_ignored_tests with links to upstream poppler bug reports boilerplate/cairo-boilerplate-pdf.c | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) commit 463493af73a644c7031df0e396c722cf2cb227b1 Author: Carl Worth Date: Mon Aug 27 10:39:14 2007 -0700 Remove svg2pdf and pdf2svg programs from test directory These are useful programs, but they don't belong in test/. They are never used in the test suite at all. Instead, these should exist in some demo package, or as applications in their own right. (The motivation for the removal is that someone just encountered a build error with one of these. And I'm not interested in debugging build errors for unused components.) test/.gitignore | 1 - test/Makefile.am | 12 ------ test/pdf2svg.c | 101 ------------------------------------------------------ test/svg2pdf.c | 85 --------------------------------------------- 4 files changed, 0 insertions(+), 199 deletions(-) commit 495c9d19bf27150783b563ed8a7a9b2e6e8c2115 Author: Carl Worth Date: Sat Aug 25 23:39:28 2007 -0700 One more PS-specific reference image (for over-between-source) A pixman bug had kept this from being correct earlier. It works now as long as pixman includes the following fix: 8ff7213f39edc1b2b8b60d6b0cc5d5f14ca1928d rasterize traps that extend outside of the image bounds correctly test/over-between-source-ps-argb32-ref.png | Bin 0 -> 678 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit a3c3fe2296a7e8f1fdffc9f922fb647237504818 Author: Carl Worth Date: Sat Aug 25 19:23:13 2007 -0700 Modify ps-specific reference images for ft-text-vertical tests I've been seeing failures with the PS backend for these tests for a while. This is in spite of the face that we've had a PS- specific reference image for each of these tests. I'm not sure what the difference is between my current system and the system used to generate the original ps-specific reference images. One thing we definitely need to do is to bundle fonts with the test suite to avoid problems like this. Another is to start documenting the systems used to generate reference images. I get very confused with ghostscript versioning, but I can at least say that "gs --version" reports 8.15.3 here, (though the package appears to have an 8.56 version). ...ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 1877 -> 1879 bytes ...ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 1879 -> 1882 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 71cc245d5a99eb6593e104b5e6727a7db13a4503 Author: Carl Worth Date: Sat Aug 25 19:18:44 2007 -0700 Add PS-specific reference images for 4 tests The following 4 tests recently started drawing with native operations in the place of image fallbacks, so we need ps-specific reference images to account for minor rasterization differences: over-above-source, over-around-source, over-below-source, and trap-clip. test/over-above-source-ps-argb32-ref.png | Bin 0 -> 636 bytes test/over-around-source-ps-argb32-ref.png | Bin 0 -> 637 bytes test/over-below-source-ps-argb32-ref.png | Bin 0 -> 503 bytes test/trap-clip-ps-argb32-ref.png | Bin 0 -> 5810 bytes 4 files changed, 0 insertions(+), 0 deletions(-) commit ae185f803a95248bcb6a8232cabedbc992b66502 Author: Carl Worth Date: Sat Aug 25 18:57:46 2007 -0700 Add four new test to exercise interactions of native and fallback objects The new tests are: over-above-source, over-around-source, over-below-source, and over-between-source test/.gitignore | 4 ++ test/Makefile.am | 4 ++ test/over-above-source-ref.png | Bin 0 -> 538 bytes test/over-above-source-rgb24-ref.png | Bin 0 -> 461 bytes test/over-above-source.c | 80 ++++++++++++++++++++++++++++ test/over-around-source-ref.png | Bin 0 -> 614 bytes test/over-around-source-rgb24-ref.png | Bin 0 -> 503 bytes test/over-around-source.c | 91 ++++++++++++++++++++++++++++++++ test/over-below-source-ref.png | Bin 0 -> 434 bytes test/over-below-source-rgb24-ref.png | Bin 0 -> 392 bytes test/over-below-source.c | 80 ++++++++++++++++++++++++++++ test/over-between-source-ref.png | Bin 0 -> 575 bytes test/over-between-source-rgb24-ref.png | Bin 0 -> 473 bytes test/over-between-source.c | 91 ++++++++++++++++++++++++++++++++ 14 files changed, 350 insertions(+), 0 deletions(-) commit 5929a1defbc9816a6faa6dca94ae6dc3a2dbf3df Author: Emmanuel Pacaud Date: Sat Aug 25 21:28:33 2007 +0200 [SVG] Suppress code duplication by using _cairo_svg_surface_emit_stroke_style from _cairo_svg_surface_stroke. src/cairo-svg-surface.c | 65 ++-------------------------------------------- 1 files changed, 3 insertions(+), 62 deletions(-) commit 726ed304018915815d232822cd9efb83ee1339bc Author: Emmanuel Pacaud Date: Sun Jul 29 16:46:21 2007 +0200 [SVG] Don't emit transform property when matrix is identity. src/cairo-svg-surface.c | 44 +++++++++++++++++++++++++------------------- 1 files changed, 25 insertions(+), 19 deletions(-) commit 89881187f22b40b4afd15eed0b2c19edcba2ca09 Author: Emmanuel Pacaud Date: Sun Jul 29 13:33:50 2007 +0200 [SVG] Implement fill_stroke method. src/cairo-svg-surface.c | 132 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 124 insertions(+), 8 deletions(-) commit ac51fff0db73c5917a38af3f610d4751b8fec626 Author: Emmanuel Pacaud Date: Sat Aug 25 20:49:50 2007 +0200 Add a new fill_stroke surface backend method. This method is for use in vector backends, where fill immediatly followed by stroke command with the same path can be emited in the same backend command. This commit also factorize the detection of such cases in the meta surface backend and automatically call the fill_stroke method on replay. src/cairo-meta-surface.c | 54 ++++++++++++++++++++++++++++++++++++----- src/cairo-path-fixed.c | 27 +++++++++++++++++++++ src/cairo-surface.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairoint.h | 36 ++++++++++++++++++++++++++++ 4 files changed, 169 insertions(+), 7 deletions(-) commit 43d35e01106659ac689846a8d5875d235b0d3c9f Author: Emmanuel Pacaud Date: Sat Jul 28 17:37:24 2007 +0200 [SVG] fix modeline for vim. src/cairo-svg-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3ceaa6e74e4bd3f5935016c3639411b26d7f576f Merge: e3b5a65... 24075f1... Author: Carl Worth Date: Fri Aug 24 08:03:44 2007 -0700 Merge branch 'cairo-origin' into cairo commit e3b5a650213b98c3514a850cdb86f1178fe06833 Author: Carl Worth Date: Fri Aug 24 08:03:03 2007 -0700 Remove build-breaking debugging helper. Sorry! Totally my fault on this one. src/cairoint.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 24075f1bddbda1d90dfd6f041b8d6bdaf9c786dc Author: Chris Wilson Date: Fri Aug 24 14:16:43 2007 +0100 [cairo-perf] Blacklist xlib-fallback. Do not try and create non-Render xlib surfaces as they explicitly do not support performance testing. perf/cairo-perf.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 8894894d9d34d169efa39d6d86ebefcb2ba69fe1 Author: Chris Wilson Date: Fri Aug 24 13:40:26 2007 +0100 [cairo-boilerplate-xlib] Check that the surface will fit in the screen. Whilst testing the fallback surface, the resultant image was being clipped to the screen size. Be conservative and refuse to create windows (for CAIRO_CONTENT_COLOR surfaces) that are larger than the screen. boilerplate/cairo-boilerplate-xlib.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) commit a29544a0b6f150384fd652aad950d1cae9809c42 Author: Chris Wilson Date: Fri Aug 24 12:24:20 2007 +0100 [cairo-boilerplate-xlib] Clear Render data for the non-Render fallback. As well as marking the XRender extension unavailable in _cairo_boiler_player_xlib_disable_render(), we need to clear any XRender derived information stored during the surface creation. boilerplate/cairo-boilerplate-xlib.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 177a3b8a32f13ce92d45899367fb7758600f7b93 Author: Carl Worth Date: Thu Aug 23 16:13:04 2007 -0700 Remove include of cairoint.h from *-private.h header files. These were recently added, (as part of sparse integration?), but they break boilerplate which reaches into at least cairo-types-private.h and cairo-scaled-font-private.h. But boilerplate cannot see cairoint.h or else it gets the internal sybol renaming, (with the INT_ prefix), and then all the test suite tests refuse to link. If this change reverts some recently-added functionality, (or cleanliness), then we'll just need to find some other way to add that back again without the breakage. src/cairo-cache-private.h | 1 - src/cairo-clip-private.h | 1 - src/cairo-fixed-private.h | 1 - src/cairo-ft-private.h | 1 - src/cairo-gstate-private.h | 1 - src/cairo-hash-private.h | 1 - src/cairo-malloc-private.h | 1 - src/cairo-mutex-private.h | 4 +++- src/cairo-mutex-type-private.h | 4 +++- src/cairo-os2-private.h | 3 +-- src/cairo-output-stream-private.h | 1 - src/cairo-paginated-surface-private.h | 2 +- src/cairo-path-fixed-private.h | 2 -- src/cairo-pdf-surface-private.h | 2 -- src/cairo-private.h | 1 - src/cairo-ps-surface-private.h | 2 -- src/cairo-region-private.h | 2 -- src/cairo-scaled-font-private.h | 2 +- src/cairo-surface-private.h | 2 +- src/cairo-svg-surface-private.h | 2 -- src/cairo-type1-private.h | 2 -- src/cairo-wideint-private.h | 2 -- src/cairo-xlib-surface-private.h | 2 -- src/cairoint.h | 2 ++ 24 files changed, 12 insertions(+), 32 deletions(-) commit fa41ebfb7c074a6ffa6a8fe7c43207e594c6534c Author: Behdad Esfahbod Date: Thu Aug 23 13:55:19 2007 -0400 Fix header inclusion order Enough for now, until I figure out the right way to break cairoint.h. src/cairo-types-private.h | 105 +++++++++++++++++++++++++++------------------ src/cairoint.h | 23 +--------- 2 files changed, 64 insertions(+), 64 deletions(-) commit d66f1ee82a10de325ee4e7579bbbaa1d301292e4 Author: Behdad Esfahbod Date: Thu Aug 23 13:54:37 2007 -0400 [boilerplate] Build libcairoboilerplate.la in make check and make test boilerplate/Makefile.am | 2 ++ boilerplate/cairo-boilerplate.c | 15 --------------- 2 files changed, 2 insertions(+), 15 deletions(-) commit 5594f8b0356fc209749d01e2043559fccd3966d0 Author: Behdad Esfahbod Date: Thu Aug 23 00:38:00 2007 -0400 [Makefile.am] Run sparse and splint once per source file Also skip .h files for splint as it causes lots of unused-function warnings. src/Makefile.am | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) commit 503ab85e44bfa02ef8391f7849826cbe07ff15d2 Author: Chris Wilson Date: Thu Aug 23 15:01:02 2007 +0100 Fix inadvertent executable mode flip. Clear the executable bit for cairo-scaled-font.c 0 files changed, 0 insertions(+), 0 deletions(-) commit 735757a17a7c72f8598c8958b600daad941a0431 Author: Behdad Esfahbod Date: Wed Aug 22 02:58:37 2007 -0400 [Makefile.am] Add target sparse to run sparse static source code analyzer There are still some bits not quite working. src/Makefile.am | 23 ++++++++++++++++++----- src/cairo-cache-private.h | 1 + src/cairo-clip-private.h | 1 + src/cairo-fixed-private.h | 1 + src/cairo-ft-private.h | 1 + src/cairo-gstate-private.h | 1 + src/cairo-hash-private.h | 1 + src/cairo-malloc-private.h | 1 + src/cairo-mutex-private.h | 4 +--- src/cairo-mutex-type-private.h | 4 +--- src/cairo-os2-private.h | 3 ++- src/cairo-output-stream-private.h | 1 + src/cairo-paginated-surface-private.h | 2 +- src/cairo-path-fixed-private.h | 2 ++ src/cairo-pdf-surface-private.h | 2 ++ src/cairo-private.h | 1 + src/cairo-ps-surface-private.h | 2 ++ src/cairo-quartz-private.h | 2 +- src/cairo-region-private.h | 2 ++ src/cairo-scaled-font-private.h | 2 +- src/cairo-surface-private.h | 2 +- src/cairo-svg-surface-private.h | 2 ++ src/cairo-type1-private.h | 2 ++ src/cairo-types-private.h | 2 ++ src/cairo-wideint-private.h | 2 ++ src/cairo-xlib-surface-private.h | 2 ++ src/cairoint.h | 12 ++++++------ 27 files changed, 59 insertions(+), 22 deletions(-) commit bfdc3b6642a36a7728f82ae87de83244d86ba29e Author: Behdad Esfahbod Date: Wed Aug 22 01:16:50 2007 -0400 [Makefile.am] Move -DHAVE_CONFIG_H to the right place src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit af6a123e95b359234d70f7a766457ff3a427c3cc Author: Behdad Esfahbod Date: Wed Aug 22 01:09:21 2007 -0400 [Makefile.am] Inhibit unrecognized options to splint src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e9d709b5caf4bc3c48259d6b40e6b95f730aa348 Author: Behdad Esfahbod Date: Wed Aug 22 01:07:59 2007 -0400 [cairo-image-surface] Fix comment syntax Found by splint. src/cairo-image-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit ef878345c87c57a79eda079fa5e765aba5ddf163 Author: Behdad Esfahbod Date: Wed Aug 22 01:07:38 2007 -0400 [Makefile.am] Add target splint to run splint static source code analyzer src/Makefile.am | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit f015091bb5361552eebfafc007bcf9e77ba5bfbf Author: Behdad Esfahbod Date: Wed Aug 22 01:03:50 2007 -0400 [Makefile.am] Use libcairo_la_CFLAGS instead of INCLUDES for clarity. src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3e5859c58f8749eaae16149577d52399a2fcf952 Author: Behdad Esfahbod Date: Tue Aug 21 23:02:03 2007 -0400 [ROADMAP] Mark fine-grained fallbacks done ROADMAP | 7 +++++++ TODO | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) commit 333b96f0e0a7d775b96014b91c6887cdcda3e93a Author: Carl Worth Date: Fri Aug 17 10:41:03 2007 -0700 Add support for image fallbacks for X servers with 555 visuals This fixes bugzilla #9993: Cairo fails with 555 X server visual https://bugs.freedesktop.org/show_bug.cgi?id=9993 ROADMAP | 2 +- src/cairo-image-surface.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletions(-) commit f00fb10f87d1341b91f025bb068d935355c68c70 Author: Carl Worth Date: Fri Aug 17 10:36:14 2007 -0700 Add support for image fallbacks for X servers with 565 visuals This fixes bugzilla #10461: Cairo doesn't support 565 xlib visual https://bugs.freedesktop.org/show_bug.cgi?id=1046 ROADMAP | 2 +- src/cairo-image-surface.c | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletions(-) commit ddb78df4c92fc8e51ca18202b59bcef7d1e1d66d Author: Carl Worth Date: Fri Aug 17 10:33:25 2007 -0700 Restore the error message for unsupported X server visuals Apparently, our much-beloved error message, (just look at how many people love to quote it in bugzilla entries), was removed during the switch to the new pixman. It was replaced with an obscure failure of a nil surface being returned, (leading to obscure failures or false "out of memory" errors). So we're putting this back now, (even though we _really_ want to ensure that this message never gets printed in practice). src/cairo-image-surface.c | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) commit 72fab3675c46a773dac315fffff72cd7f887f79f Author: Carl Worth Date: Fri Aug 17 10:29:37 2007 -0700 Use a pixman_format_code to describe the image surface used for xlib fallbacks Previously, the code was just using cairo_format_t which is much more limited than the formats supported by pixman, (so many "odd" X server visuals would just fall over). src/cairo-image-surface.c | 87 ++++++++++++++++++++++----------- src/cairo-xlib-surface.c | 117 ++++---------------------------------------- src/cairoint.h | 19 +++++++- 3 files changed, 87 insertions(+), 136 deletions(-) commit a9662d0aaed8685292ffe13c458182046a644fa7 Author: Carl Worth Date: Fri Aug 17 08:15:50 2007 -0700 Eliminate fragile cairo_internal_format_t Instead we take advantage of the pixman_format_code_t that now exists in the public interface of the new, external pixman library. src/cairo-image-surface.c | 152 ++++++++++++++++++++++++++++++++------------- src/cairo-pattern.c | 2 +- src/cairoint.h | 44 +------------ 3 files changed, 113 insertions(+), 85 deletions(-) commit 9f4e6436496fe561aa124bb2b89e1c6711684d98 Author: Carl Worth Date: Tue Aug 21 10:03:00 2007 -0700 Ensure the Render extension is initialized before calling XESetCloseDisplay This avoids a potential crash from the Render extension being cleaned up during XCloseDisplay before the cairo CloseDisplay hook goes on to call into XRenderFreePicture. src/cairo-xlib-display.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit d05593a5fb9fef586171cb9973a9942a105d50d7 Author: Carl Worth Date: Mon Aug 20 14:50:02 2007 -0700 Add a new xlib-fallback target to test xlib using image fallbacks instead of the Render extension boilerplate/cairo-boilerplate-xlib-private.h | 8 +++ boilerplate/cairo-boilerplate-xlib.c | 72 ++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 9 +++ test/fill-rule.c | 2 +- 4 files changed, 90 insertions(+), 1 deletions(-) commit 590717f03b4a396600734c4dac1dd0a9f140283c Author: Adrian Johnson Date: Wed Aug 22 07:58:14 2007 +0930 PS: Remove debug info from PS output The debug code is now conditionally compiled. src/cairo-ps-surface.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) commit e66b2b68ab456d779524d9b4ab34acf5d38362b5 Author: Carl Worth Date: Tue Aug 21 14:52:54 2007 -0700 Use 8-bit math to flatten color when emitting a solid pattern to PostScript This isn't necessarily more correct than the old code using the doubles, but it does result in bit-for-bit color equivalence when comparing the results against the image backend. So that's both good consistency, and more ease is using the test suite to verify things. src/cairo-ps-surface.c | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) commit bf92255edd20595a6eb220c6ee9d6aa40b244eef Author: Adrian Johnson Date: Tue Aug 21 22:27:57 2007 +0930 PS: Add finer-grained image fallback support The analysis surface now keeps track of two regions: supported operations, and unsupported operations. If the target surface returns CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY, the analysis surface will check if any previous operation intersects with this operation. If there is nothing previously drawn under the operation, the status is changed to supported. The meta surface has two new functions: _cairo_meta_surface_replay_region() _cairo_meta_surface_replay_and_create_regions() During the analysis stage, the paginated surface replays the meta surface using _cairo_meta_surface_replay_and_create_regions(). The return status from each analyzed operation is saved in the meta surface. The _cairo_meta_surface_replay_region() function allows only operations from either the supported or unsupported region to be replayed. This allows the paginated surface to replay only the supported operations before emitting a fallback image for each rectangle in the unsupported region. src/cairo-analysis-surface-private.h | 3 + src/cairo-analysis-surface.c | 358 +++++++++++++++++++++++++++++----- src/cairo-meta-surface-private.h | 34 +++- src/cairo-meta-surface.c | 78 ++++++-- src/cairo-paginated-surface.c | 131 ++++++++++--- src/cairo-ps-surface.c | 93 ++++++---- src/cairo-region-private.h | 4 + src/cairo-region.c | 13 ++ src/cairoint.h | 4 +- 9 files changed, 585 insertions(+), 133 deletions(-) commit bf4bdbb6076dbe3b74534bc4308dbc9213bf628d Author: Behdad Esfahbod Date: Mon Aug 20 20:29:51 2007 -0400 [cairo-scaled-font] Document how glyph surfaces use device offsets src/cairo-scaled-font.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 106 insertions(+), 0 deletions(-) commit 31f5aafa36015ee6ea8ff769c2e1d5841f62642f Author: Behdad Esfahbod Date: Mon Feb 5 20:46:48 2007 -0500 Fix device_offset misuse in all glyph surface uses Seems like all over the code, we have been using negated device_offset values for glyph surfaces. Here is all the math(!): A device_transform converts from device space (a conceptual space) to surface space. For simple cases of translation only, it's called a device_offset and is public API (cairo_surface_[gs]et_device_offset). A possibly better name for those functions could have been cairo_surface_[gs]et_origing. So, that's what they do: they set where the device-space origin (0,0) is in the surface. If the origin is inside the surface, device_offset values are positive. It may look like this: Device space: (-x,-y) <-- negative numbers +----------------+ | . | | . | |......(0,0) <---|-- device-space origin | | | | +----------------+ (width-x,height-y) Surface space: (0,0) <-- surface-space origin +---------------+ | . | | . | |......(x,y) <--|-- device_offset | | | | +---------------+ (width,height) In other words: device_offset is the coordinates of the device-space origin relative to the top-left of the surface. We use device offsets in a couple of places: - Public API: To let toolkits like Gtk+ give user a surface that only represents part of the final destination (say, the expose area), but has the same device space as the destination. In these cases device_offset is typically negative. Example: application window +---------------+ | . | | (x,y). | |......+---+ | | | | <--|-- expose area | +---+ | +---------------+ In this case, the user of cairo API can set the device_space on the expose area to (-x,-y) to move the device space origin to that of the application window, such that drawing in the expose area surface and painting it in the application window has the same effect as drawing in the application window directly. Gtk+ has been using this feature. - Glyph surfaces: In most font rendering systems, glyph surfaces have an origin at (0,0) and a bounding box that is typically represented as (x_bearing,y_bearing,width,height). Depending on which way y progresses in the system, y_bearing may typically be negative (for systems similar to cairo, with origin at top left), or be positive (in systems like PDF with origin at bottom left). No matter which is the case, it is important to note that (x_bearing,y_bearing) is the coordinates of top-left of the glyph relative to the glyph origin. That is, for example: Scaled-glyph space: (x_bearing,y_bearing) <-- negative numbers +----------------+ | . | | . | |......(0,0) <---|-- glyph origin | | | | +----------------+ (width+x_bearing,height+y_bearing) Note the similarity of the origin to the device space. That is exactly how we use the device_offset to represent scaled glyphs: to use the device-space origin as the glyph origin. Now compare the scaled-glyph space to device-space and surface-space and convince yourself that: (x_bearing,y_bearing) = (-x,-y) = - device_offset That's right. If you are not convinced yet, contrast the definition of the two: "(x_bearing,y_bearing) is the coordinates of top-left of the glyph relative to the glyph origin." "In other words: device_offset is the coordinates of the device-space origin relative to the top-left of the surface." and note that glyph origin = device-space origin. So, that was the bug. Fixing it removed lots of wonders and magic negation signs. The way I discovered the bug was that in the user-font API, to make rendering the glyph from meta-surface to an image-surface work I had to do: cairo_surface_set_device_offset (surface, -x_bearing, -y_bearing); _cairo_meta_surface_replay (meta_surface, surface); cairo_surface_set_device_offset (surface, x_bearing, y_bearing); This suggested that the use of device_offset for glyph origin is different from its use for rendering with meta-surface. This reminded me of the large comment in the xlib backend blaming XRender for having weird glyph space, and of a similar problem I had in the PS backend for bitmap glyph positioning (see d47388ad759b0a1a0869655a87d9b5eb6ae2445d) ...those are all fixed now. src/cairo-atsui-font.c | 4 +- src/cairo-directfb-surface.c | 4 +- src/cairo-ft-font.c | 46 +++++++++++++++++++++-------------------- src/cairo-glitz-surface.c | 8 +++--- src/cairo-ps-surface.c | 12 +++++----- src/cairo-scaled-font.c | 8 ++---- src/cairo-svg-surface.c | 2 +- src/cairo-xcb-surface.c | 40 +---------------------------------- src/cairo-xlib-surface.c | 40 +---------------------------------- 9 files changed, 46 insertions(+), 118 deletions(-) commit d55da1aa621d76b1411300932be5d37883b25dfa Author: Behdad Esfahbod Date: Wed Feb 7 00:20:29 2007 -0800 [scaled-font] Really ignore ctm translation Previously we were ignoring ctm translation in scaled fonts when hashing, but still storing it into the scaled font. Now we zero the translation components when storing. src/cairo-scaled-font.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit a394e5870e2c5ccedfd9d116b4a42c58b459334d Author: Behdad Esfahbod Date: Mon Feb 5 16:53:18 2007 -0500 [cairo-image-surface] Simplify device-offset usage src/cairo-image-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 61f736d0d1166b050ee948ce2738feab0327ece9 Author: Behdad Esfahbod Date: Mon Feb 5 15:51:30 2007 -0500 [cairo-paginated-surface] Add XXX mark to integer width,height arguments src/cairo-paginated-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit f97bb5613a7fb3d92f2d730460f9c721ee13a41a Author: Vladimir Vukicevic Date: Mon Aug 20 17:32:05 2007 -0700 Fix path_fixed_offset_and_scale to apply scale and offset in right order src/cairo-path-fixed.c | 24 +++++++++--------------- 1 files changed, 9 insertions(+), 15 deletions(-) commit 51b6cca8de3181d7b42b612ff491451c765d5811 Author: Chris Wilson Date: Sat Aug 18 00:54:30 2007 +0100 [cairo-perf-diff] Remove reference to pixman. Remove the use of pixman as part of the perf id as pixman is no longer an integral component of cairo. perf/cairo-perf-diff | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 39367b26120b6e1ad0f556911a49f28ef370115b Author: Martin Ejdestig Date: Fri Aug 17 02:28:35 2007 +0200 Plug possible leak of pixman_traps in _cairo_image_surface_composite_trapezoids. If width and height are 0 and pixman_traps is allocated on the heap, it would leak. Fix by simply checking width and height prior to allocating pixman_traps. src/cairo-image-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 507d7ee09951a35df8b80f0e1507ba17dbd9bfa9 Author: Chris Wilson Date: Wed Jun 27 12:34:35 2007 +0100 [cairo-xlib-surface] Avoid a malloc(0). Avoid a zero byte allocation (potentially returning NULL) for an array of 0 trapezoids. src/cairo-xlib-surface.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit 85d911d86c9f1dd55d79b7c429ad2b617ec345d1 Author: Chris Wilson Date: Wed Jun 27 08:05:35 2007 +0100 [cairo-image-surface] Avoid malloc(0) Special case width==0, height==0 to avoid allocating a 0 byte image. src/cairo-image-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 7332a5e9949ca19869b003fe5a0a777adac41307 Author: Chris Wilson Date: Wed Jun 27 11:32:50 2007 +0100 [boilerplate/xmalloc] Special case malloc(0) and friends. malloc(0) can return NULL so double check the requested size before exiting with an out-of-memory error. boilerplate/xmalloc.c | 6 +++--- src/cairo-image-surface.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) commit 56e505298c0f5de360380ca7e968baa0e60ac828 Author: Chris Wilson Date: Wed Jun 27 23:01:44 2007 +0100 [cairo-truetype-subset] Avoid malloc(0). Avoid attempting to allocate a zero length subset as malloc(0) may return NULL. src/cairo-truetype-subset.c | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) commit 7bd1d5ba3d081ae188fe7f8bc346071d0b8d2278 Author: Chris Wilson Date: Tue Jul 3 14:14:56 2007 +0100 [cairo-png] Protect against malloc(0). Avoid calling malloc(0) for an empty image. src/cairo-png.c | 21 ++++++++++++--------- 1 files changed, 12 insertions(+), 9 deletions(-) commit 06134df0d0670a7d00d58ebd7a20ba7174f56d16 Author: Chris Wilson Date: Wed Jul 4 19:11:29 2007 +0100 [cairo-pdf-surface] Check for errors during compression. Check status return from zlib's compress(). src/cairo-pdf-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 76b871d710cd81bee5fe7c2f6175f8d678ebeea5 Author: Chris Wilson Date: Thu Aug 16 15:29:11 2007 +0100 [cairo-image-surface] Remove status return for hard-coded CAIRO_STATUS_SUCCESS. Remove the status return if the function can only return CAIRO_STATUS_SUCCESS, and remove the then surplus conditionals. src/cairo-image-surface.c | 13 +++++-------- 1 files changed, 5 insertions(+), 8 deletions(-) commit 4e39e30d83fc1866a44f0b746c406ee2efb3bf6a Author: Chris Wilson Date: Mon Jul 16 09:25:38 2007 +0100 [cairo-pen] Remove status from _cairo_pen_find_active_vertex_*() This pair of functions unconditionally return SUCCESS, so remove the status return and supporting tests from their callers. src/cairo-path-stroke.c | 24 ++++++------------------ src/cairo-pen.c | 16 +++++----------- src/cairoint.h | 4 ++-- 3 files changed, 13 insertions(+), 31 deletions(-) commit b72b06cc222d88015ce78a5cddf061e903d032b5 Author: Chris Wilson Date: Mon Jul 16 09:40:47 2007 +0100 [cairo-pen] Remove hard-coded CAIRO_STATUS_SUCCESS from _stroke_spline_half() Remove the status return and update callers as _cairo_pen_stroke_spline_half() unconditionally returned SUCCESS. src/cairo-pen.c | 15 ++++----------- 1 files changed, 4 insertions(+), 11 deletions(-) commit e24969a94ac5670a13c2737db435ac7b5bebb19c Author: Chris Wilson Date: Mon Jul 16 09:36:54 2007 +0100 [cairo-pdf-surface] cairo_pattern_set_matrix guarantees invertibility. Be consistent in asserting that the pattern matrix is inverted successfully and remove a couple of redundant checks. src/cairo-pdf-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 50ebdda3a97334e5411749cd0c309843ba8cdf44 Author: Chris Wilson Date: Thu Jul 19 10:26:37 2007 +0100 [cairo-pattern] Assert that the pattern->matrix is invertible. We guarantee when setting the pattern->matrix that it is invertible, so merely assert that it is so when we attempt to use its inverse. src/cairo-pattern.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 7d853bcabcc1c55b79a05280a0eb35828b93163d Author: Chris Wilson Date: Thu Aug 16 14:34:07 2007 +0100 [cairo-boilerplate-xlib] Check for NULL xrender_format before use. Testing for XRender support (xrender_format != NULL) after dereferencing said format doesn't work as intended. boilerplate/cairo-boilerplate-xlib.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit bc635da45a32eb9b7aff6fa5f7f560ebf99092a8 Author: Chris Wilson Date: Thu Aug 16 12:21:49 2007 +0100 [cairo-ft-font] Decrement lock count on error. As noted in http://bugs.freedesktop.org/show_bug.cgi?id=12026 the error path of _cairo_ft_unscaled_font_lock_face() failed to reset the unscaled->lock_count before releasing the mutex and returning NULL. src/cairo-ft-font.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8881265cca73790a49068b3bab5362cb73f8deb6 Author: Adrian Johnson Date: Fri Aug 10 20:10:29 2007 +0930 PDF: Fix regression in pdf_surface_set_size() src/cairo-pdf-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 4ca0ca153a847337452bbb237d42f6d7b0a163d0 Author: Søren Sandmann Pedersen Date: Mon Aug 6 19:24:31 2007 -0400 Bump pixman dependency to 0.9.4 Also print the download location if the library wasn't found. configure.in | 11 +++++++---- src/cairo-region-private.h | 2 +- src/cairoint.h | 2 +- test/buffer-diff.c | 2 +- 4 files changed, 10 insertions(+), 7 deletions(-) commit 13cae8b5e6d3fc93c4eb1853b91ba356b572b551 Author: Carl Worth Date: Mon Aug 6 11:06:47 2007 -0700 Ensure that a copied pattern gets its own user_data array This fixes the bug reported here: Segfault with cairo_pattern_set_user_data https://bugs.freedesktop.org/show_bug.cgi?id=11855 src/cairo-pattern.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 027915717df6e203826d10da7bfdf8e26af13ee1 Author: Nis Martensen Date: Wed Jul 4 07:09:00 2007 -0700 Typo fixes in README files README | 4 ++-- perf/README | 6 +++--- test/README | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) commit 72c1f5d802c32f97ae5c0cbf899dc3a12fc28222 Author: Adrian Johnson Date: Sun Aug 5 00:50:23 2007 +0930 PDF: Fix gradients regression src/cairo-pdf-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 9bcedd3d6f0de8c380e7ab4981d32377e3c5a778 Author: Vladimir Vukicevic Date: Fri Aug 3 14:18:40 2007 -0700 [win32] compilation fix for win32 src/cairo-win32-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit f52aa4c13e91339e575ca2c52c9e3a1f4d95b106 Author: Adrian Johnson Date: Thu Aug 2 21:25:46 2007 +0930 CFF Subsetting: fix integer encoding bug Bug report at https://bugzilla.mozilla.org/show_bug.cgi?id=368668 src/cairo-cff-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ef93f1897c0703c3284c85206cb1c70e23ff3fe5 Author: Behdad Esfahbod Date: Tue Jul 31 17:52:13 2007 -0400 [configure.in] Cleanup after pixman removal and correctly check for pixman configure.in | 24 ++++-------------------- 1 files changed, 4 insertions(+), 20 deletions(-) commit 4cce3135e0e50d5edb3a7cc54cf413fc2242a521 Author: Behdad Esfahbod Date: Thu Jul 26 18:04:39 2007 -0400 Clear executable flag off .c file 0 files changed, 0 insertions(+), 0 deletions(-) commit 5b0e2e3e2b6823580bbc40dd1be415b7461bcbf0 Author: Chris Wilson Date: Mon Jul 23 13:05:13 2007 +0100 [cairo-glitz-surface] Compile fix. Minor corrections to reflect updated structures. src/cairo-glitz-surface.c | 19 +++++++++---------- 1 files changed, 9 insertions(+), 10 deletions(-) commit c0a7d33ac6c81dd74ee2a9daaa3749a346ef4897 Author: Vladimir Vukicevic Date: Wed Jul 4 13:54:03 2007 +0200 [fixpt] Fixup malloc usage to use _cairo_malloc_* Fix some introduced mallocs as a result of the fixed point patches. src/cairo-clip.c | 2 +- src/cairo-glitz-surface.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-xcb-surface.c | 4 ++-- src/cairo-xlib-surface.c | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) commit b719592428907d2010645303fb65d38dcb8b30c0 Author: Vladimir Vukicevic Date: Wed Jul 4 12:16:27 2007 +0200 [fixpt] Fix up compilation post pixman merge src/cairo-pattern.c | 1 - src/cairo-region-private.h | 2 +- src/cairo-region.c | 9 +++++---- src/cairo-svg-surface.c | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) commit 866b485314bfd5d8bbf865d19f6a589d08292e2a Author: Vladimir Vukicevic Date: Mon Jun 18 18:38:54 2007 -0700 [fixpt] Let the compiler calculate the magic double-to-fixed value src/cairo-fixed-private.h | 14 ++------------ 1 files changed, 2 insertions(+), 12 deletions(-) commit 0abe5324a5b03149630a5b6496c980f83be4fd75 Author: Vladimir Vukicevic Date: Mon Jun 18 18:33:29 2007 -0700 [fixpt] Create cairo_region wrapper around pixman_region16_t Insulate region-using code from implementation details; at some point we'll want to switch to using 32-bit regions. src/cairo-analysis-surface-private.h | 4 +- src/cairo-analysis-surface.c | 4 +- src/cairo-clip-private.h | 4 +- src/cairo-clip.c | 182 +++++++++++++++++---------------- src/cairo-directfb-surface.c | 25 +++-- src/cairo-glitz-surface.c | 65 ++++++++++-- src/cairo-image-surface.c | 4 +- src/cairo-pattern.c | 16 ++-- src/cairo-region-private.h | 105 +++++++++++++++++++ src/cairo-region.c | 173 ++++++++++++++++++++++++++++++-- src/cairo-surface-fallback.c | 29 +++--- src/cairo-surface.c | 63 +++++++------ src/cairo-traps.c | 50 +++++----- src/cairo-win32-surface.c | 28 ++++-- src/cairo-xcb-surface.c | 26 +++-- src/cairo-xlib-surface.c | 28 +++--- src/cairoint.h | 38 ++++++-- src/test-paginated-surface.c | 2 +- 18 files changed, 598 insertions(+), 248 deletions(-) commit dc035fecda0070e18a68e06f567f268fc39483f1 Author: Vladimir Vukicevic Date: Mon Jun 18 17:34:36 2007 -0700 [fixpt] Fix xcb surface to handle conversion to 16.16 src/cairo-xcb-surface.c | 87 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 66 insertions(+), 21 deletions(-) commit 58d9664702308639ead888c7167e71ca605a8fe3 Author: Vladimir Vukicevic Date: Mon Jun 18 17:33:44 2007 -0700 [fixpt] Fix xlib surface to handle conversion to 16.16 src/cairo-xlib-surface.c | 87 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 66 insertions(+), 21 deletions(-) commit aaf94ef6c4656d7e836e52c2a71db214a1c01b57 Author: Vladimir Vukicevic Date: Mon Jun 18 17:29:04 2007 -0700 [fixpt] remove dependency on some pixman types Introduce cairo_gradient_stop_t, and remove pixman dependency for core pattern types. Perform conversion from cairo types to pixman types as necessary in fallback code. src/cairo-matrix.c | 12 +++--- src/cairo-pattern.c | 97 ++++++++++++++++++++++++++++++----------- src/cairo-pdf-surface.c | 8 ++-- src/cairo-scaled-font.c | 6 +- src/cairo-surface-fallback.c | 10 +++- src/cairo-svg-surface.c | 87 +++++++++++++++++++------------------ src/cairoint.h | 27 ++++++------ 7 files changed, 150 insertions(+), 97 deletions(-) commit e5fdacae1c5b7005b95db8f9065cce51ef19bf20 Author: Vladimir Vukicevic Date: Mon Jun 18 17:05:34 2007 -0700 [fixpt] fix up image surface to translate to 16.16 for pixman src/cairo-image-surface.c | 76 ++++++++++++++++++++++++++++++++++++++------ 1 files changed, 65 insertions(+), 11 deletions(-) commit be3516335cda8587d9baf5bd0097d3ce1cb64ab1 Author: Vladimir Vukicevic Date: Mon Jun 18 16:56:24 2007 -0700 [fixpt] Replace cairo_rectangle_int16_t with cairo_rectangle_int_t Mostly s/cairo_rectangle_int16_t/cairo_rectangle_int_t/, as well as definitions to pick cairo_rectangle_int_t. src/cairo-analysis-surface.c | 2 +- src/cairo-clip-private.h | 6 ++-- src/cairo-clip.c | 12 ++++---- src/cairo-directfb-surface.c | 16 +++++----- src/cairo-glitz-surface.c | 20 ++++++------ src/cairo-gstate.c | 2 +- src/cairo-image-surface.c | 12 ++++---- src/cairo-meta-surface.c | 2 +- src/cairo-os2-surface.c | 10 +++--- src/cairo-paginated-surface.c | 6 ++-- src/cairo-pattern.c | 12 ++++---- src/cairo-pdf-surface.c | 4 +- src/cairo-ps-surface.c | 4 +- src/cairo-quartz-private.h | 2 +- src/cairo-quartz-surface.c | 24 ++++++++-------- src/cairo-rectangle.c | 10 +++--- src/cairo-region.c | 2 +- src/cairo-scaled-font.c | 2 +- src/cairo-surface-fallback-private.h | 2 +- src/cairo-surface-fallback.c | 52 +++++++++++++++++----------------- src/cairo-surface.c | 40 +++++++++++++------------- src/cairo-svg-surface.c | 4 +- src/cairo-win32-private.h | 4 +- src/cairo-win32-surface.c | 16 +++++----- src/cairo-xcb-surface.c | 18 ++++++------ src/cairo-xlib-surface.c | 18 ++++++------ src/cairo.c | 2 +- src/cairoint.h | 48 +++++++++++++++++++------------ src/test-fallback-surface.c | 12 ++++---- src/test-meta-surface.c | 4 +- src/test-paginated-surface.c | 2 +- 31 files changed, 191 insertions(+), 179 deletions(-) commit 9c38aa3b96a1e926ef422837fc3102e902a796fc Author: Vladimir Vukicevic Date: Mon Jun 18 16:30:09 2007 -0700 [fixpt] Use _cairo_fixed_mul insted of manual multiplication src/cairo-fixed-private.h | 1 - src/cairo-path-fixed.c | 11 +++-------- src/cairo-traps.c | 26 +++++++++++--------------- 3 files changed, 14 insertions(+), 24 deletions(-) commit 0048a26a4477d3acb5dd0231756cfaae92d240a9 Author: Vladimir Vukicevic Date: Mon Jun 18 16:26:14 2007 -0700 [fixpt] Make fixed point methods static inline and generic Move the fixed point methods to static inline versions in cairo-fixed-private.h, and don't hardcode fixed to be 16.16. src/cairo-fixed-private.h | 256 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-fixed.c | 100 +----------------- src/cairo-quartz-surface.c | 2 +- src/cairoint.h | 37 +------ 4 files changed, 259 insertions(+), 136 deletions(-) commit 76c32f899af63649bf911533a2ed6b42e617da41 Author: Vladimir Vukicevic Date: Mon Jul 2 15:09:21 2007 +0200 [fixpt] Update quartz surface for new types src/cairo-quartz-surface.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit 290daee4ce26a931a15425f380ed4f495a4bd3c1 Author: Søren Sandmann Date: Tue Jul 10 10:31:23 2007 -0400 Add note about pixman dependency in README README | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1fac791537d2333b084e3fbabc1a6a890433e9ed Author: Jinghua Luo Date: Tue Jul 10 15:09:04 2007 +0800 [Glitz] fix compilation. Separating pixman broke the compilation if glitz backend is enabled, fix it and all compiler warning as well. src/cairo-glitz-surface.c | 104 +++++++++++++++++++++++++++----------------- 1 files changed, 64 insertions(+), 40 deletions(-) commit 5819be398c4eada9a6cfc8e37a532991751b4a51 Author: Chris Wilson Date: Thu Jul 5 18:59:31 2007 +0100 [check-plt] Ignore entries for pixman. pixman is now an external library, so we now expect PLT entries. src/check-plt.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 35ef8419a981929b65157407485ec001b69b3391 Author: Chris Wilson Date: Thu Jul 5 18:52:21 2007 +0100 [cairo-matrix] Check determinant for invalid numbers. By checking matrices for invalid determinants, we can prevent the setting and application of invalid matrices. The trick used here is that NaNs, as specified by IEE754, always return FALSE in comparisons. Since we know that the square of the determinant must be positive definite, then if the comparison is FALSE the computation must have resulted in a NaN. src/cairo-matrix.c | 4 ++ test/invalid-matrix.c | 94 ++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 86 insertions(+), 12 deletions(-) commit 7eaba5d5fbf83f66b39db42a89db3e7a892c2ea0 Author: Chris Wilson Date: Thu Jul 5 15:24:11 2007 +0100 [configure] Only run PostScript tests if we have ghostscript. During configure check for the ghostscript command line tool (gs) before enabling the PostScript surface tests for make check. boilerplate/cairo-boilerplate.c | 2 +- configure.in | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 1 deletions(-) commit ef967be630dd8d0bf81ad5889d6264bebe7631d4 Merge: 0c42dbb... 5c7d2d1... Author: Søren Sandmann Pedersen Date: Mon Jul 2 08:33:29 2007 -0700 Merge branch 'master' of git+ssh://sandmann@git.freedesktop.org/git/cairo Conflicts: pixman/src/fbcompose.c pixman/src/icimage.c pixman/src/pixmanint.h pixman/src/pixregionint.h src/cairo-clip.c commit 5c7d2d14d78e4dfb1ef6d2c40f0910f177e07360 Author: Vladimir Vukicevic Date: Tue Jun 19 13:15:21 2007 -0700 [fix] Avoid int overflow when allocating large buffers This patch introduces three macros: _cairo_malloc_ab, _cairo_malloc_abc, _cairo_malloc_ab_plus_c and replaces various calls to malloc(a*b), malloc(a*b*c), and malloc(a*b+c) with them. The macros return NULL if int overflow would occur during the allocation. See CODING_STYLE for more information. CODING_STYLE | 25 +++++++++ pixman/src/fbcompose.c | 4 +- pixman/src/icimage.c | 8 ++-- pixman/src/pixman.h | 7 +++ pixman/src/pixmanint.h | 17 ++++++ pixman/src/pixregion.c | 59 ++++++++++++++++++---- pixman/src/pixregionint.h | 1 - src/cairo-atsui-font.c | 2 +- src/cairo-bentley-ottmann.c | 6 +- src/cairo-beos-surface.cpp | 4 +- src/cairo-clip.c | 10 +++- src/cairo-directfb-surface.c | 2 +- src/cairo-ft-font.c | 4 +- src/cairo-glitz-surface.c | 34 +++++++++++-- src/cairo-gstate.c | 6 +- src/cairo-hull.c | 2 +- src/cairo-malloc-private.h | 104 +++++++++++++++++++++++++++++++++++++++ src/cairo-meta-surface.c | 4 +- src/cairo-os2-surface.c | 9 ++-- src/cairo-path.c | 2 +- src/cairo-pattern.c | 6 +- src/cairo-pdf-surface.c | 6 +- src/cairo-pen.c | 4 +- src/cairo-png.c | 6 +- src/cairo-polygon.c | 2 +- src/cairo-ps-surface.c | 4 +- src/cairo-quartz-surface.c | 8 ++-- src/cairo-scaled-font-subsets.c | 4 +- src/cairo-scaled-font.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-stroke-style.c | 2 +- src/cairo-surface-fallback.c | 4 +- src/cairo-surface.c | 2 +- src/cairo-svg-surface.c | 2 +- src/cairo-traps.c | 2 +- src/cairo-unicode.c | 4 +- src/cairo-win32-font.c | 6 +- src/cairo-win32-surface.c | 6 +- src/cairo-xcb-surface.c | 8 ++-- src/cairo-xlib-surface.c | 6 +- src/cairoint.h | 1 + 41 files changed, 308 insertions(+), 89 deletions(-) commit fc34073464c487405b6e2e0a5fa269a1ae15a02a Author: Carl Worth Date: Wed Jun 27 14:38:41 2007 -0700 Increment version to 1.5.1 after the 1.4.10 release configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 107a74885a25e585b467c7841c6929a12aa62565 Author: Carl Worth Date: Wed Jun 27 14:05:56 2007 -0700 Increment cairo version to 1.4.10 (and libtool versioning to 13:5:11) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f595ad2348dbd97b57d22471fdec7664f8ca7bf6 Author: Carl Worth Date: Wed Jun 27 14:04:27 2007 -0700 Add notes to NEWS for 1.4.10 NEWS | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+), 0 deletions(-) commit 2bf3e31da99f34328973a0866346af40748097f6 Author: Carl Worth Date: Wed Jun 27 11:11:36 2007 -0700 Prefer local dpy variable instead of display->display This was a tiny piece of cleanup that had been erroneously included with some earlier functional changes, (so it went through a cycle of being applied and reverted). It's back now in its own commit. src/cairo-xlib-display.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit eebb0df512da50f883a417bb5e8e368dc81e35a9 Author: Carl Worth Date: Wed Jun 27 11:08:53 2007 -0700 Revert "[cairo-xlib-display] Hide XErrors during processing of the work queue." This reverts commit 285b702ef6f73e7eb4ca0da235a287ad1e1f412f. The recent commit of 0791f342b93225849d9171aac8b738014b18bdf5 fixes the same bug that 285b702e was fixing, but without introducing any performance-killing calls to XSync. So we can drop those now. src/cairo-xlib-display.c | 17 +++-------------- 1 files changed, 3 insertions(+), 14 deletions(-) commit b019cb8a7a910879c7af304edbd06fd105c9d89e Author: Carl Worth Date: Wed Jun 27 11:07:07 2007 -0700 Revert "[cairo-xlib-surface] Check for errors before installing a NOOP error handler." This reverts commit 7016614dd90798247524f0c118f462aa2e7ef673. We want to avoid any negative performance impacts due to extra calls to XSync. The fact that X errors can be missed with this appraoch is undesirable of course---a proper fix will likely involve moving to XCB which will hopefully allow us to do the error-checking the way we want without any performance penalty. src/cairo-xlib-surface.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 6d021eb4b6e319dd2bb3e5e126de07c6844d5c07 Merge: 9109946... 0791f34... Author: Carl Worth Date: Wed Jun 27 11:01:00 2007 -0700 Merge branch 'ooo-fix' into cairo commit 0791f342b93225849d9171aac8b738014b18bdf5 Author: Chris Wilson Date: Wed Jun 27 10:53:29 2007 -0700 Avoid deferring resource cleanup for application drawables This eliminates X errors propagated from cairo due to cleaning up Render Pictures after the application had already destroyed the Drawable they reference. (It would be nice if the X server wouldn't complain that some cleanup work is already done, but there you have it.) This fix has been verified to fix the bug causing OpenOffice.org to crash as described here: XError on right click menus in OOo. https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 And unlike other proposed fixes for this bug, this fix does not introduce any new calls to XSync, (and thereby avoids performance concerns from those). src/cairo-xlib-surface.c | 47 +++++++++++++++++++++++++-------------------- 1 files changed, 26 insertions(+), 21 deletions(-) commit 0c42dbb1925efb8228fb5246e0715bee0a5ded28 Author: Søren Sandmann Date: Fri Jun 15 00:39:27 2007 -0400 pixman_image_set_transform() returns FALSE on failure src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e0cff78b34558f0eed29aff5d818d1591c7bf966 Author: Søren Sandmann Date: Thu Jun 14 13:42:08 2007 -0400 Fix bug where _cairo_image_surface_composite_trapezoids() computed the wrong stride for aliased masks src/cairo-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ca5760a289f287a7fafe36e69c6bdf47710c17e7 Author: Søren Sandmann Date: Thu Jun 14 13:12:01 2007 -0400 Fix initialization of radial patterns src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 12cc32b674d3f1b705ef1a66bbce1ef8c4488daf Author: Søren Sandmann Date: Wed Jun 13 00:15:34 2007 -0400 [pixman] Initial port to standalone pixman library. Makefile.am | 4 +- configure.in | 14 +- pixman/.gitignore | 20 - pixman/AUTHORS | 19 - pixman/COPYING | 92 - pixman/ChangeLog | 1534 ------------- pixman/ChangeLog.libic | 300 --- pixman/ChangeLog.libpixregion | 47 - pixman/ChangeLog.slim | 39 - pixman/INSTALL | 9 - pixman/Makefile.am | 7 - pixman/NEWS | 135 -- pixman/README | 47 - pixman/RELEASING | 81 - pixman/TODO | 10 - pixman/autogen.sh | 53 - pixman/configure.in | 92 - pixman/libpixman.pc.in | 10 - pixman/src/.gitignore | 13 - pixman/src/Makefile.am | 46 - pixman/src/Makefile.win32 | 37 - pixman/src/check-config.sh | 17 - pixman/src/check-pixmanint.sh | 17 - pixman/src/fbcompose.c | 4354 ------------------------------------ pixman/src/fbedge.c | 303 --- pixman/src/fbedgeimp.h | 136 -- pixman/src/fbmmx.c | 2821 ----------------------- pixman/src/fbmmx.h | 298 --- pixman/src/fbpict.c | 2181 ------------------ pixman/src/fbpict.h | 355 --- pixman/src/fbtrap.c | 236 -- pixman/src/icblt.c | 951 -------- pixman/src/icbltone.c | 743 ------ pixman/src/iccolor.c | 83 - pixman/src/icformat.c | 220 -- pixman/src/icimage.c | 744 ------ pixman/src/icimage.h | 384 ---- pixman/src/icint.h | 1070 --------- pixman/src/icpixels.c | 116 - pixman/src/icrect.c | 404 ---- pixman/src/icrop.h | 137 -- pixman/src/icstipple.c | 81 - pixman/src/ictransform.c | 63 - pixman/src/ictrap.c | 200 -- pixman/src/ictri.c | 293 --- pixman/src/icutil.c | 287 --- pixman/src/pixman-xserver-compat.h | 125 - pixman/src/pixmanint.h | 1076 --------- pixman/src/pixregionint.h | 75 - pixman/src/renderedge.c | 196 -- pixman/src/renderedge.h | 157 -- pixman/update.pl | 159 -- src/Makefile.am | 6 +- src/cairo-clip.c | 36 +- src/cairo-glitz-surface.c | 126 +- src/cairo-image-surface.c | 314 ++-- src/cairo-pattern.c | 82 +- src/cairo-pdf-surface.c | 40 +- src/cairo-ps-surface.c | 2 +- src/cairo-surface-fallback.c | 5 +- src/cairo-surface.c | 9 +- src/cairo-svg-surface.c | 31 +- src/cairo-traps.c | 4 +- src/cairo-xlib-surface.c | 43 +- src/cairoint.h | 14 +- test/buffer-diff.c | 16 +- 66 files changed, 398 insertions(+), 21221 deletions(-) commit 9109946a1a7f9341e60da7358da6535c5fac52db Author: Chris Wilson Date: Thu Jun 21 15:40:23 2007 +0100 [cairo-directfb] Correct minor typo. Correct the reference to _cairo_directfb_surface_is_similar. src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1e76aa66b23aa7b3fd7b9f7de2b563b4db814517 Author: Nis Martensen Date: Tue Jun 19 17:04:48 2007 +0200 Update INSTALL about status of backends INSTALL | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 02f753c23ad0db7d677ae41f8d69dc566c8aaa0b Author: Carl Worth Date: Mon Jun 18 18:23:06 2007 -0700 Fix cairo-perf-diff to compile cairo-perf explicitly perf/cairo-perf-diff | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2477e57de532fb3ebd1f6113cf51619b84b303d9 Author: Vladimir Vukicevic Date: Mon Jun 18 13:58:15 2007 -0700 [perf] Add pixman_region_init_rects and use in extract_region Avoid O(N*N) loop in traps_extract_region by letting us hand pixman an array of rects all at once. perf/Makefile.am | 3 +- perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/long-dashed-lines.c | 67 +++++++++++++++++++++++++++++++++++++++++++++ pixman/src/pixman-remap.h | 1 + pixman/src/pixman.h | 2 + pixman/src/pixregion.c | 29 +++++++++++++++++++ src/cairo-traps.c | 58 +++++++++++++++++++++++++++----------- 8 files changed, 144 insertions(+), 18 deletions(-) commit 285b702ef6f73e7eb4ca0da235a287ad1e1f412f Author: Chris Wilson Date: Fri Jun 15 20:38:01 2007 +0100 [cairo-xlib-display] Hide XErrors during processing of the work queue. It is possible for the resources that we defer freeing to be already destroyed and trigger an XError whilst processing the work queue. For example, the application renders to a Window and then destroys the Drawable before proceeding with more rendering. This will trigger an invalid Picture from RenderFreePicture whilst attempting to free the resources. By ignoring the possibility that the application could allocate a fresh resource with the same ID, we can simply hide the XErrors... Fixes: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 src/cairo-xlib-display.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-) commit 7016614dd90798247524f0c118f462aa2e7ef673 Author: Chris Wilson Date: Fri Jun 15 20:45:53 2007 +0100 [cairo-xlib-surface] Check for errors before installing a NOOP error handler. Call XSync before ignoring errors from XGetImage to avoid hiding unassociated errors. Similarly, call XSync before reinstalling the old error handler to ensure no errors creep out of the ignored section. src/cairo-xlib-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 0c5d28a4e5ce5e4dd72c0f416ce5e960e92b808b Author: Ryan Lortie Date: Wed Jun 13 18:59:22 2007 -0400 [xlib] Create source xrender Picture with IncludeInferiors When an xlib surface is used as the source of a draw operation this will cause the contents of child windows to be included in the source data. The semantics of drawing to xlib surfaces are unchanged (ie: draws are still clipped by child windows overlapping the destination window). src/cairo-xlib-surface.c | 15 ++++++++++++++- 1 files changed, 14 insertions(+), 1 deletions(-) commit 817d4b0c9a354526389290c6d5a7662713d67cd8 Author: Brian Ewins Date: Sat Jun 9 19:14:05 2007 +0100 [atsui] Document ATSUI Add cairo_atsui_font_face_create_for_atsu_font_id and ATSUI to the documentation. Don't enable it yet, since this is still unsupported. doc/public/tmpl/cairo-atsui.sgml | 2 +- src/cairo-atsui-font.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletions(-) commit fd1edaa5d386f15edacfd5596b550593ed45d627 Author: Brian Ewins Date: Wed Jun 13 01:27:36 2007 +0100 [quartz] remove unused code clean up warnings about unused code: removing _cairo_quartz_cairo_path_to_quartz_path and the functions it calls. src/cairo-quartz-surface.c | 47 -------------------------------------------- 1 files changed, 0 insertions(+), 47 deletions(-) commit d7a0816ec3d750939dd935f34b217980ee27af3f Author: Brian Ewins Date: Wed Jun 13 01:27:36 2007 +0100 [quartz] move glyph array declarations Move declarations causing a warning. A separate patch from the other warning cleanups because it moves where the allocation happens. src/cairo-quartz-surface.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit bf39b28b77a83160e5aa037031d82f8c0843f387 Author: Brian Ewins Date: Wed Jun 13 01:04:54 2007 +0100 commit 75be87b4093aaa7f477d587d5a68308cade1b29c [quartz] move glyph array declarations Move declarations causing a warning. A separate patch from the other warning cleanups because it moves where the allocation happens. src/cairo-quartz-surface.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) commit 2034d1dbd5888c393c57f0feeb707b0411fa4480 Author: Brian Ewins Date: Wed Jun 13 01:27:36 2007 +0100 [quartz] pass quartz_stroke_t not CGContextRef Fix a typo where an incompatible pointer was being passed. src/cairo-quartz-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 54bbe44b08b37041c8982634837dbc79b19e6c18 Author: Behdad Esfahbod Date: Mon Jun 11 17:51:37 2007 -0400 [TODO] Add link to Adrian's finer-grain fallback thread TODO | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit ef3c64fd13d66648f4e00affb304e8b404249f92 Author: Vladimir Vukicevic Date: Mon Jun 11 09:27:11 2007 -0700 [misc] Blow away last remaining $Id$ directives in sources pixman/src/fbtrap.c | 2 -- src/cairo-analysis-surface-private.h | 3 +-- test/rel-path.c | 2 -- 3 files changed, 1 insertions(+), 6 deletions(-) commit 853f23e18c28548bce4647d4e54a5cfb317ac3dc Author: Behdad Esfahbod Date: Mon Jun 11 02:42:04 2007 -0400 [test] Use check_PROGRAMS instead of custom made SUPPORT_PROGS It better handles $(EXEEXT) and is exactly made for this purpose. test/Makefile.am | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) commit 1d86c7fa888918c32eb13adb084de78883e17c84 Author: Behdad Esfahbod Date: Sat Jun 9 13:48:13 2007 -0400 [perf] Link to librt if available This is needed on Solaris, but also works on Linux. configure.in | 4 ++++ perf/Makefile.am | 3 ++- 2 files changed, 6 insertions(+), 1 deletions(-) commit 85d045f2675cf191ea1d1af66ad4cd9e57d58e67 Author: Carl Worth Date: Fri Jun 8 16:08:44 2007 -0700 Update version to 1.4.9 after the 1.4.8 release. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit fea4f344c46cf5f85c6af3102333008768c55063 Author: Carl Worth Date: Fri Jun 8 15:49:12 2007 -0700 Update version to 1.4.8 (and libtool info to 13:4:11) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0b19ff1d3f493067fa5484151e71dfcedcd14fd1 Author: Carl Worth Date: Fri Jun 8 15:34:35 2007 -0700 Add include of X11/Xlib.h to cairo-xlib-xrender.h This makes this header file self-sufficient. Thanks to Sam Sirlin for pointing this out. src/cairo-xlib-xrender.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8223c976d54319b58906de03fcb8fb1967105e53 Author: Brian Ewins Date: Fri Jun 8 01:56:10 2007 +0100 [NEWS] add note about quartz fixes We've got 11 less failures in the quartz tests this time around, worth a mention. NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 00063a65f758265f3ad5c0caa374d9c7d5e89932 Author: Vladimir Vukicevic Date: Fri Jun 8 01:17:09 2007 +0100 [quartz] fix DO_IMAGE The implementation of DO_IMAGE leaks memory via a referenced surface, and wasn't applied for strokes and glyphs. This patch corrects those issues. src/cairo-quartz-private.h | 5 ++- src/cairo-quartz-surface.c | 83 +++++++++++++++++++++++++++----------------- 2 files changed, 55 insertions(+), 33 deletions(-) commit 39e6a0090faa4e73a658c1ca0ead3040309b84a2 Author: Brian Ewins Date: Fri Jun 8 01:12:24 2007 +0100 [quartz] fall back on extended gradients A temporary fix for mozilla bug 379321, use an image fallback for gradients that use EXTEND_REPEAT or EXTEND_REFLECT. src/cairo-quartz-surface.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 7c1afdcd597331c14f256f406a3e95743f7fdad6 Author: Brian Ewins Date: Mon Mar 26 00:06:23 2007 +0100 [quartz] fixes the offsets in the font-matrix test Apply the font matrix offset to text on the quartz surface, if necessary. src/cairo-quartz-surface.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 55f1dbd0fbcbc587823ef8fa291a0af08441c775 Author: Brian Ewins Date: Sun Apr 1 00:04:24 2007 +0100 [quartz] ensure that line widths are scaled. cairo-gstate applies the ctm to the coordinates used in paths, but not to the line width. In quartz this ends up drawing unscaled lines. This is a minimal fix - it undoes the scaling applied to the points and then draws the path scaled correctly. src/cairo-quartz-surface.c | 72 ++++++++++++++++++++++++++++++++++--------- 1 files changed, 57 insertions(+), 15 deletions(-) commit 5a9de1b5c9f6cc445f9f6230937c2254ee49e7cb Author: Brian Ewins Date: Thu Jun 7 23:22:30 2007 +0100 [atsui] remove unused code Remove CGAffineTransformMakeWithCairoFontScale. src/cairo-atsui-font.c | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) commit 807c5ab613e7df60be452d6683c4f9f045ef62a0 Author: Brian Ewins Date: Thu Jun 7 23:22:29 2007 +0100 [atsui] clean up warnings Refactor code to get rid of compiler warnings. src/cairo-atsui-font.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit b210b09e2de2f048debad6e8881f0226b6b17060 Author: Brian Ewins Date: Thu Jun 7 23:22:27 2007 +0100 [quartz] implement CAIRO_EXTEND_REFLECT Implement extend-reflect by tiling a larger 2x2 grid of reflected images. src/cairo-quartz-surface.c | 64 ++++++++++++++++++++----------------------- 1 files changed, 30 insertions(+), 34 deletions(-) commit fa5dd548b0dd2dfe523501bd40cafe7916240be1 Author: Brian Ewins Date: Tue May 29 23:11:49 2007 +0100 [quartz] implement CAIRO_EXTEND_NONE Implement extend-none for surface patterns, by using a single DrawImage where possible. There is some code duplication in this patch, to make it easier to edit this patch series without conflicts. A patch to remove duplicate code will be required later.. src/cairo-quartz-surface.c | 61 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 59 insertions(+), 2 deletions(-) commit 147288864c8c512f3ae17c8117d3c36dbbc6d5f8 Author: Brian Ewins Date: Thu Jun 7 23:22:05 2007 +0100 [quartz] Refactor code to create a CGImageRef from a pattern In order to implement CAIRO_EXTEND_NONE we will need to create a CGImageRef without also creating a CGPattern. Separate the two pieces of code. src/cairo-quartz-surface.c | 40 +++++++++++++++++++++------------------- 1 files changed, 21 insertions(+), 19 deletions(-) commit a5ee983e1cb97aff63b0c9c3a57125b37d0e3f74 Author: Carl Worth Date: Thu Jun 7 15:03:43 2007 -0700 Update release notes for 1.4.8 NEWS | 75 ++++++++++++++++++++++++++++++++++++++++++----------------------- 1 files changed, 48 insertions(+), 27 deletions(-) commit e19c49269d0b236de91a5a9b5230bed7d76282ed Author: Carl Worth Date: Thu Jun 7 12:19:46 2007 -0700 Remove stale reference to cairo-xlib-test.h src/Makefile.am | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 5ded4479d6ddbbe16c631144ef987c4c02e706a6 Author: Carl Worth Date: Thu May 31 15:35:14 2007 -0700 Fix return value of cairo_surface_write_to_png for unsupported formats For some reason this was returning CAIRO_STATUS_NULL_POINTER. Now fixed to return CAIRO_STATUS_INVALID_FORMAT. src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ec63a7839457e2d14c7b1a5b64d1a79daf044222 Author: Carl Worth Date: Thu May 31 14:28:50 2007 -0700 Add CAIRO_INTERNAL_FORMAT_RGB16_565 and prefer it over deprecated CAIRO_FORMAT_RGB16_565 Also clarify the documentation for cairo_internal_format_t src/cairo-image-surface.c | 6 ++-- src/cairoint.h | 52 ++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 24 deletions(-) commit b6ee6c531c41adb57512fe0eaf21558e5d03f04b Author: Behdad Esfahbod Date: Thu Jun 7 12:22:20 2007 -0400 [NEWS] Add par about Chris 'ickle' Wilson's error-handling improvements work NEWS | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit 2399f923d504fba6b3dcbd0a185cd3d4b29b4dcf Author: Chris Wilson Date: Mon Jun 4 19:55:23 2007 +0100 [cairo-bentley-ottmann] Malloc reduction. Attempt to allocate the edges during tessellate_polygon() from the stack, if the polygon size is sufficiently small and amalgamate the separate allocations for the list of events and their sorted index into a single block. src/cairo-bentley-ottmann.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) commit ecf6f7f5147195276b3b479879cbd3db402df688 Author: Chris Wilson Date: Mon Jun 4 16:35:15 2007 +0100 [cairo-scaled-font] Skip the mask composition onto the surface on error. If we fail to composite the glyph onto the mask, skip compositing the mask onto the surface. src/cairo-scaled-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2e60029392bca904f7035a8f403de0593193b6b9 Author: Chris Wilson Date: Tue Jun 5 09:08:51 2007 +0100 [cairo-ft-font] Markup error paths with _cairo_error(). Behdad Esfahbod noted that in ff5af0f540ec4 I had introduce new error paths without the appropriate _cairo_error(). So review cairo-ft-font to ensure that _cairo_error() is called at the start of every error path, as close to the originating error as possible. src/cairo-ft-font.c | 58 ++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 41 insertions(+), 17 deletions(-) commit a5e12cd9f212b12a32230263188be38c175dc0a1 Author: Behdad Esfahbod Date: Thu May 31 19:21:30 2007 -0400 [ROADMAP] Add link for a8mask patch ROADMAP | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit ff5af0f540ec407beb3d2a105b22f041cd770ce4 Author: Chris Wilson Date: Wed May 30 15:44:59 2007 +0100 [cairo-ft-font] Propagate error rather than asserting. FT_Set_Char_Size can fail due to an out-of-memory condition, so propagate the error status instead of asserting that it never fails. src/cairo-ft-font.c | 41 ++++++++++++++++++++++++++++++----------- 1 files changed, 30 insertions(+), 11 deletions(-) commit de4dd4263cb5183b128a8fc80576ed7ddb239319 Author: Chris Wilson Date: Fri May 11 15:15:11 2007 +0100 [cairo] Propagate surface->status on cairo_t creation. Set the cairo_t status to be the surface->status when the context is created, and special case the NO_MEMORY status in order to avoid a redundant allocation. src/cairo-gstate.c | 2 +- src/cairo.c | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) commit 9f4efa8a3ae6cbc194d89012286990582a6c8f5d Author: Chris Wilson Date: Fri May 11 09:48:47 2007 +0100 [cairo-ps-surface] Check status of glyph_lookup. Check for failure of _cairo_scaled_glyph_lookup() before preceeding to access the glyph and propagate the failure up the callstack as far as possible. src/cairo-ps-surface.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) commit 8010d46de4056e6c15b6891a06ef3d784c641b82 Author: Chris Wilson Date: Sun May 27 11:40:47 2007 +0100 [cairo-gstate] Check scaled font status. After using the public API to access the scaled font, which only sets the status field in the font, check the scaled font status. This will then correctly propagate errors during glyph loading to the context. src/cairo-gstate.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit faf986bb25eab34eee16415f4dab6f7d5d3460d3 Author: Chris Wilson Date: Tue May 29 12:39:16 2007 +0100 [cairo-gstate] Check status on existing fonts. Add an initial guard in _cairo_gstate_ensure_scaled_font() and _cairo_gstate_ensure_font_face() to check that there is no prior error status on the objects. src/cairo-gstate.c | 41 +++++++++++++++++++++++------------------ 1 files changed, 23 insertions(+), 18 deletions(-) commit ac4b20082dd6b2e2b280d3615eebf5387da87e2f Author: Vladimir Vukicevic Date: Tue May 29 20:50:02 2007 -0700 [misc] make _cairo_image_surface_nil_invalid static const src/cairo-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0b34e958f18f0bcfb8bc9b054fb3bbb2343d2c32 Author: Vladimir Vukicevic Date: Tue May 29 17:14:41 2007 -0700 [test] add XFAIL test surface-pattern-big-scale down Add test for image downscaling with large images severely limiting the destination coordinate space. See the test for more information. test/Makefile.am | 2 + test/surface-pattern-big-scale-down.c | 121 +++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 0 deletions(-) commit 0898411d0abdfa6a02c2fb959b3a668e728fd87c Author: Kouhei Sutou Date: Mon May 28 17:05:40 2007 -0400 [doc] Minor documentation fixes src/cairo-matrix.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-scaled-font.c | 2 +- src/cairo.c | 22 +++++++++++++++------- src/cairo.h | 2 +- 5 files changed, 19 insertions(+), 11 deletions(-) commit 4da50dfa02d7c03c32ee20c15f8304eafa0844e0 Author: Luo jinghua Date: Sun May 27 17:09:49 2007 +0800 [cairo-xlib-surface]: flush work queue before sending glyphs to X server. After introducing a work queue for deferred destruction of X resource my firefox crashes over and over again because XRenderFreeGlyphs is trying to free a non-exist glyph (already freed). The problematic call sequence is something like below: XRenderAddGlyphs (20990204, 20069) XRenderAddGlyphs (20990204, 20069) XRenderFreeGlyphs (20990204, 20069) XRenderFreeGlyphs (20990204, 20069) You can see the two add/free glyphs is interlaced. And obviously, we'll crash at the last one. To fix this bug, we must be ensure here's no pending work to free the glyph that we want to sent. src/cairo-xlib-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 69bf823db1b256f19487d2f002e7b0811859e58e Author: Brian Ewins Date: Fri May 25 01:35:37 2007 +0100 [atsui] use ATSGlyphGetScreenMetrics to measure glyphs. I don't know how I managed to get glyph measurement so badly wrong before, but tracing paths was not necessary, and 6x slower. The fix switches to using ATSGlyphGetScreenMetrics for all metrics, and remove the old measuring code. src/cairo-atsui-font.c | 88 +++-------------------------------------------- 1 files changed, 6 insertions(+), 82 deletions(-) commit 5b2b008048d2bcbb0b558a6c02aee1093311db39 Author: Chris Wilson Date: Fri May 11 10:14:57 2007 +0100 [cairo-scaled-font-subsets] Shortcut empty subset. If the font_subset if empty, avoid allocating zero bytes and iterating over the empty hash table. src/cairo-scaled-font-subsets.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit c175cf7b833b03c38c8ddea183333ce84c6fdfec Author: Chris Wilson Date: Thu May 17 17:04:14 2007 +0100 [cairo-ft-font] Remove erroneous cached font faces. Only return a font face from the cache if it is not in an error condition. Otherwise unlink the bad font face from the cache and construct a new one. src/cairo-ft-font.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) commit f382c3e110f8078e83cbb9d73cfbb43b1506a11b Author: Chris Wilson Date: Fri May 11 15:31:33 2007 +0100 [cairo-pattern] Fully initialise the error pattern. _cairo_pattern_fini depends on the pattern being correctly initialised, for example when calling _cairo_user_data_array_fini(), so we need to initialize the whole pattern and not just set the type to SOLID when creating a pattern for a surface in error. src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit fcdfda83655faf0eecbb2b5af09a05340fe422e6 Author: Boris Zbarsky Date: Mon May 14 23:46:14 2007 -0500 [quartz] implementing release_source_image (#11059) The image surface that _cairo_quartz_surface_acquire_source_image creates never seems to be released, probably because there is no release_source_image callback in the quartz code. The attached patch fixes that problem, at least insofar as the image surface itself is no longer leaking. I'm not sure whether any other cleanup needs to happen here. -Boris src/cairo-quartz-surface.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) commit 2c8598aafb4a8779ce94940ce91033a8c5a62ea4 Author: Carl Worth Date: Fri May 18 13:23:04 2007 -0700 Fix typo in comment. src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3cb67435f805a8ea39f38194379f216ea4a69ed6 Author: Carl Worth Date: Fri May 18 13:22:36 2007 -0700 Document behavior of color stops added with identical offsets. src/cairo-pattern.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) commit 1cf4ed989473e2468ea2d64bb7759084c9f6a1e4 Author: Carl Worth Date: Fri May 18 13:16:23 2007 -0700 ROADMAP: Add bugs for 565 and 655 Visuals to the list ROADMAP | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 7260ee23ecb08e72a938a194e70dfb5e7a48c599 Author: Behdad Esfahbod Date: Fri May 18 11:55:37 2007 -0400 [Type1] #include (#10989) src/cairo-type1-subset.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6a42ddf0f9e9e4b8dc5fa6a98ef4448f1c149789 Author: Adrian Johnson Date: Thu May 17 12:45:22 2007 +0930 TrueType Subsetting: Remove post table The post table is not used now that TrueType fonts are embedded in PDF as CID fonts. src/cairo-truetype-subset.c | 34 +--------------------------------- 1 files changed, 1 insertions(+), 33 deletions(-) commit 67e752f75fdc561aca419f798a1650feb22e59a4 Author: Adrian Johnson Date: Thu May 17 11:48:25 2007 +0930 CFF Subsetting: Filter out Unique ID from subset The subsetted font is not the same as the original font so it should not have the same XUID and UniqueID. src/cairo-cff-subset.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 99a6983017e1cd27f8a598487f8a72cfa6d411f1 Author: Adrian Johnson Date: Thu May 17 10:17:09 2007 +0930 Ensure surface backend finish() is never called more than once. Previously if the backend finish() function returned an error status, surface->finished was not set true. This would result in the backend finish() function being called twice which in the case of the PostScript backend caused a seg fault. src/cairo-surface.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) commit c5ae0f1232e8cef860bc1fc0b449ddf9d9063d22 Author: Chris Wilson Date: Fri May 11 16:11:02 2007 +0100 [cairo-truetype-subset] Avoid a potential 0 byte allocation. During _cairo_truetype_subset_init skip copying the string_offsets if the vector is empty. src/cairo-truetype-subset.c | 21 +++++++++++++-------- 1 files changed, 13 insertions(+), 8 deletions(-) commit e37bee3f52282a042251f2dfc8e051943fd8f1d7 Author: Chris Wilson Date: Wed May 16 14:47:33 2007 +0100 [cairo-pdf-surface] emit_pattern_stops() array overrun. _cairo_pdf_surface_emit_pattern_stops() tried to set the last element to have an offset of exactly 1.0, but missed and set the next element after the end of the array. src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 27de1869f5a837b79812cd4b04e17621ec0f848c Author: Chris Wilson Date: Wed May 16 13:10:58 2007 +0100 [cairo-pdf-surface] Free allstops on error. Ensure the locally allocated resources are freed on the error paths. src/cairo-pdf-surface.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) commit 79e6c0207cb65b6bc1f38537f42632d623a1bc9a Author: Chris Wilson Date: Sat May 12 18:27:58 2007 +0100 [cairo-pattern] Check for the nil surface. cairo_surface_create_similar() does not return NULL as was being checked for, but the nil surface on error. Also ensure that the returned surface is destroyed if we encounter an error whilst compositing. src/cairo-pattern.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-) commit 32c0ef9f145cec8b997c011b13208362eaf03004 Author: Chris Wilson Date: Sat May 12 16:20:00 2007 +0100 [cairo-gstate] Remove a redundant conditional. Simplify _cairo_gstate_text_to_glyphs() with a tail call. src/cairo-gstate.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-) commit 37d8c18b3fc489d6336131bae6ec219cafc35718 Author: Chris Wilson Date: Sat May 12 15:42:59 2007 +0100 [cairo-scaled-font-subsets] Destroy the glyph if we fail to cache it. If we fail to insert the glyph into the sub_font glyph cache then we must destroy it before propagating the error. src/cairo-scaled-font-subsets.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 76e758df5b99fd4dee64481b9039b0d44dd01587 Author: Chris Wilson Date: Sat May 12 15:40:39 2007 +0100 [cairo-truetype-subset] Destroy the arrays on error. Growing the arrays may successfully allocate the indirect pointer, but fail whilst allocating the actual array - so always call _cairo_array_fini after _cairo_array_grow_by(). src/cairo-truetype-subset.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) commit b63b32958e690409448ddc14e19b1856b9ef555a Author: Chris Wilson Date: Sat May 12 15:32:34 2007 +0100 [cairo-scaled-font-subsets] Destroy the parent and subfont on error. If we fail to create the sub font destroy the local reference to the parent font and if we fail to insert the sub font into the hash table, destroy the newly create sub font. src/cairo-scaled-font-subsets.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit fcd1076bcffa20b7770a1b447a46232760972e2f Author: Chris Wilson Date: Sat May 12 14:36:11 2007 +0100 [cairo-ft-font] Destroy the path on error. During _decompose_glyph_outline() destroy the fixed path if we encounter an error. src/cairo-ft-font.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) commit abb19e61cf076c62c7626094c70de0530bd9fd00 Author: Chris Wilson Date: Sat May 12 14:32:52 2007 +0100 [cairo-ft-font] Destroy the unscaled reference on error. Release the reference to the unscaled font if we encounter an error whilst initialising the cairo_ft_scaled_font_t. src/cairo-ft-font.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e4055f02a1f5a3d7942c7c2bb4f460ce0a8b5481 Author: Chris Wilson Date: Sat May 12 14:29:28 2007 +0100 [cairo-ft-font] Race between unscaled removal from hash table and creation Small window of opportunity for the unscaled font to be destroyed and removed from the hash table before _cairo_ft_unscaled_font_create_for_pattern() takes a reference on behalf of its cairo. Close the window by taking the reference with the font map lock held. src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f239308ef1014174d554ccaeab1fe7c2d84e26dc Author: Chris Wilson Date: Sat May 12 13:27:09 2007 +0100 [cairo-deflate-stream] Free the stream on error. Before returning the nil output stream, free the locally allocated stream when encountering an error during _cairo_deflate_stream_Create(). src/cairo-deflate-stream.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 35a2ed03352a1abc42e441ce5f52f2704de9be85 Author: Chris Wilson Date: Sat May 12 12:36:47 2007 +0100 [cairo-ft-font] Destroy surface if glyph transformation fails. As we allocated the surface we need to destroy it if we encounter an error. src/cairo-ft-font.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 6a43c027238d2302f9e01ee7a780370d330def6c Author: Chris Wilson Date: Sat May 12 09:43:30 2007 +0100 [cairo-xlib-screen] Increase number of GC depths. Add support for depths 12 and 30, and a separate unknown. src/cairo-xlib-private.h | 2 +- src/cairo-xlib-screen.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) commit 70611846ded98ffa0f085f5a704979384b37e84c Author: Chris Wilson Date: Sat May 12 09:40:13 2007 +0100 [cairo-xlib-surface] Always nullify GC after pushing to screen. The status return from _cairo_xlib_screen_put_gc() indicates the failure to queue a job to free an old GC - the current GC is always transferred away from the caller, so always nullify it in the surface. src/cairo-xlib-surface.c | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) commit 58c35e6d7b2e153dc9cd6ff89fa91497c507afaf Author: Chris Wilson Date: Sat May 12 00:10:26 2007 +0100 [cairo-paginated-surface] Check surface status during finish. Propagate children status during finish. src/cairo-paginated-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 9ffd8154e2ec2ccbeeefd3e4a34b2aa16844c1ce Author: Chris Wilson Date: Fri May 11 23:43:53 2007 +0100 [cairo-scaled-font-subsets] Correctly destroy the hash table. After an allocation failure in _cairo_scaled_font_subsets_create_internal() call _cairo_hash_table_destroy() instead of a mere free(). src/cairo-scaled-font-subsets.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bcfc5f0bdbd4c1eedc22bde5eed464a8bd18211e Author: Chris Wilson Date: Fri May 11 20:57:12 2007 +0100 [pixman] Propagate allocation failure. pixman_op() failed to propagate the failure from pixman_region_appendNonO() and the generic op. pixman/src/pixregion.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-) commit 9e99f0611c834f80903e3554663f71682ef59ef3 Author: Chris Wilson Date: Fri May 11 20:38:24 2007 +0100 [cairo-traps] Initialize traps to use embedded buffer. Set the traps to use the embedded buffer during initialization which will save one redundant _cairo_traps_grow() src/cairo-traps.c | 26 ++++++-------------------- 1 files changed, 6 insertions(+), 20 deletions(-) commit 35eb65b7772459266e2f954fb370bfdca12b5b64 Author: Chris Wilson Date: Fri May 11 18:25:13 2007 +0100 [cairo-path] Check for errors during the count. Return the nil object if we encounter any error whilst trying to generate the path. Also special case the NO_MEMORY error object to return the nil object. src/cairo-path.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit a60afb0e78ab42498158ef852fcea35c8f71e8ec Author: Chris Wilson Date: Fri May 11 16:01:26 2007 +0100 [cairo-scaled-font] Return status of _cairo_scaled_font_glyph_path() The status return of _cairo_path_fixed_interpret() was being ignored, propagate it. src/cairo-scaled-font.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit d46f6872a5fe601862e2f63455c97a15c4667cf2 Author: Behdad Esfahbod Date: Sun May 13 21:52:52 2007 -0400 [docs] Update to latest source changes and kill warnings doc/public/Headers.mk | 1 + doc/public/Makefile.am | 2 -- doc/public/cairo-docs.xml | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) commit 40558cb15e5f7276a29847b00c9dae08b9d9380e Author: Chris Wilson Date: Sat May 12 10:10:49 2007 +0100 [cairo-xlib-screen] Clear the gc_needs_clip_reset after use. After consuming the GC we need to unset the clip reset flag, so that if we try and get a new GC without first putting a fresh one we do not try to call XSetClipMask on a NULL GC. (Fixes http://bugs.freedesktop.org/show_bug.cgi?id=10921) src/cairo-xlib-screen.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit abba3f2375c58401b7722837b3be37c3de9beca4 Author: Chris Wilson Date: Thu May 10 23:05:46 2007 +0100 [valgrind-suppressions] Update to cover XrmGetStringDatabase By dropping the top frame from suppression, the XrmGetFileDatabase suppressions will also match XrmGetStringDatabase leaks which are starting to occur. test/.valgrind-suppressions | 42 ++++++++++++++---------------------------- 1 files changed, 14 insertions(+), 28 deletions(-) commit c4abc3a0e3ebb27bc0aa178651e496c514eb1fae Author: Chris Wilson Date: Thu May 10 21:28:48 2007 +0100 [cairo-truetype-subset] Set CAIRO_STATUS_NO_MEMORY on malloc failure. _cairo_truetype_font_create() failed to update the status before returning after detecting an allocation failure, leaving its callers none the wishing - and eventually triggering a segmentation fault when the font was used in anger. src/cairo-truetype-subset.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit ebababc0cf83f828d48200b8e316f57912fb0128 Author: Chris Wilson Date: Thu May 10 19:24:54 2007 +0100 [cairo-pattern] Return the nil cairo_pattern_t for CAIRO_STATUS_NO_MEMORY. If we asked to create a pattern after encountering an allocation failure, we can avoid another allocation by returning the nil pattern object. src/cairo-pattern.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit e8e5f93ffec8321c029c0b95abcb3cd8cadcff31 Author: Chris Wilson Date: Thu May 10 20:50:58 2007 +0100 [cairo-meta-surface] Add a surface->status guard to meta_surface_replay() Before attempting to access the cairo_meta_surface_t specific members, we need to ensure that _cairo_meta_surface_replay() has received a true meta surface rather than an error surface (e.g. _cairo_surface_nil). src/cairo-meta-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 195112697fac77e70ef36e00a2d557eda1e0e145 Author: elaine Date: Thu May 10 13:58:44 2007 -0400 [xlib] The buggy_repeat path should be removed for Xsun now Sun never released a version of Solaris with Xorg with the buggy repeat problem. This patch was only needed for development versions of Solaris Nevada (roughly builds 25-30). The latest S10U release and Nevada releases have a fixed Xorg. So no users should ever encounter this bug. We need to remove this test because Xsun has the same VendorString and a lower VendorRelease number so it falsely triggers buggy_repeat to be turned on. They just added Xrender support recently to Xsun, so this wasn't an issue before recently. src/cairo-xlib-surface.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) commit ab6a767cf476c98b466c62dd410d0f61f8dd6bbb Author: Chris Wilson Date: Thu May 10 17:17:30 2007 +0100 [cairo-scaled-font] Check for allocation failure. cairo_scaled_font_create() returns a nil object on failure whereas a few callers were checking for NULL. Secondly review the public entry points for cairo_scaled_font_*() to ensure that all check that they will not attempt to overwrite the read-only nil object. src/cairo-gstate.c | 7 +++---- src/cairo-scaled-font-subsets.c | 2 ++ src/cairo-scaled-font.c | 10 ++++++++-- src/cairo-type1-fallback.c | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) commit aec92188f1cf4ca34e890b0a4266425532f669d4 Author: Chris Wilson Date: Thu May 10 09:29:24 2007 +0100 [cairo-clip] Correctly report allocation failure Distinguish between the unrepresentable clip and the failure to allocate the clip extents. src/cairo-clip.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit 1a719d1189243a76120b98371f84e074c8cd611e Author: Chris Wilson Date: Thu May 10 09:28:20 2007 +0100 [cairo] Use _cairo_clip_nil for CAIRO_STATUS_NO_MEMORY When creating a error clip list for CAIRO_STATUS_NO_MEMORY, simply reuse the nil object rather than allocate a fresh list. src/cairo.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 3fbc4bb5ae27809f417ec2627fa515375e63a0e7 Author: Chris Wilson Date: Wed May 9 21:41:17 2007 +0100 [cairo-clip] Add missing error status for _cairo__clip_intersect_region() An out-of-memory error path missed setting CAIRO_STATUS_NO_MEMORY. src/cairo-clip.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b5d25068796d572b4b0c6e33eecc5f0736fb8f78 Author: Chris Wilson Date: Wed May 9 16:27:42 2007 +0100 [cairo] cairo_pop_group() returns a NULL pattern cairo_pop_group() checks for a NULL return from cairo_pattern_create_for_surface() instead of the nil cairo_pattern_t, and then returns a NULL pattern instead of the nil object. src/cairo.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 6f09e93ad7ac4c941ba6c72b21ea4536d248f8d5 Author: Chris Wilson Date: Wed May 9 13:39:08 2007 +0100 [ciro-surface-fallback] Propagate status for _clip_and_composite_trapezoids The result of _clip_and_composite_trapezoids() was ignored by 2/3 of its callers - simply propagate the status. src/cairo-surface-fallback.c | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) commit ae5d4a1c17a46c0a6ea2e4c825ecce7a5cbbe28b Author: Chris Wilson Date: Wed May 9 13:19:54 2007 +0100 [cairo] Return after detecting the invalid font-options. Do not continue to copy the contents of the nil cairo_font_options_t, but set the error on the context and return. src/cairo.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit dfd4d41ac99dbe5d8ea16aa4ce4809b66308c803 Author: Chris Wilson Date: Wed May 9 12:30:40 2007 +0100 [cairo-xlib-surface] Free the allocation if we fail to queue the work. Avoid the leak of the allocated argument if we fail to queue the work to free the glyph. src/cairo-xlib-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 8ddfc1b2e4aeefb704e05e64661b5c9985788e99 Author: Chris Wilson Date: Tue May 8 16:13:08 2007 +0100 [cairo-pattern] Return status from _cairo_pattern_init_copy() During the copy, allocation of the gradient may fail and so the callers need to check for a pattern that returned in an error state. No callers did so and in order to force all callers to check the error status, the status return was added to _cairo_pattern_init_copy(). The early error checking may appear redundant for an object with an embedded structure, however it does fix an error where an uninitialised pattern was being used: ==1922== Process terminating with default action of signal 11 (SIGSEGV) ==1922== Access not within mapped region at address 0x55555555 ==1922== at 0x402CF6F: _cairo_array_index (cairo-array.c:208) ==1922== by 0x402D4F3: _cairo_user_data_array_fini (cairo-array.c:370) ==1922== by 0x4046464: _cairo_pattern_fini (cairo-pattern.c:188) ==1922== by 0x404992A: _cairo_meta_surface_paint (cairo-meta-surface.c:266) ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) ==1922== by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195) ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) ==1922== by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822) ==1922== by 0x402B2D1: cairo_paint (cairo.c:1879) ==1922== by 0x804A4F7: draw (radial-gradient.c:73) ==1922== by 0x804AFA4: cairo_test_expecting (cairo-test.c:326) ==1922== by 0x804A57C: main (radial-gradient.c:109) ==1922== Injected fault at: ==1922== at 0x4020EA5: malloc (vg_replace_malloc.c:207) ==1922== by 0x404475C: _cairo_pattern_init_copy (cairo-pattern.c:136) ==1922== by 0x403F779: _cairo_surface_copy_pattern_for_destination (cairo-surface.c:2153) ==1922== by 0x403FCC1: _cairo_surface_paint (cairo-surface.c:1328) ==1922== by 0x405CB5E: _test_meta_surface_paint (test-meta-surface.c:195) ==1922== by 0x403FCE0: _cairo_surface_paint (cairo-surface.c:1331) ==1922== by 0x4032A60: _cairo_gstate_paint (cairo-gstate.c:822) ==1922== by 0x402B2D1: cairo_paint (cairo.c:1879) ==1922== by 0x804A4F7: draw (radial-gradient.c:73) ==1922== by 0x804AFA4: cairo_test_expecting (cairo-test.c:326) ==1922== by 0x804A57C: main (radial-gradient.c:109) src/cairo-glitz-surface.c | 12 +++++++-- src/cairo-gstate.c | 55 ++++++++++++++++++++++++++++++------------- src/cairo-meta-surface.c | 6 ++++- src/cairo-pattern.c | 30 +++++++++++++++++------ src/cairo-quartz-surface.c | 6 ++++- src/cairo-surface.c | 47 ++++++++++++++++++++++++++----------- src/cairoint.h | 2 +- 7 files changed, 113 insertions(+), 45 deletions(-) commit dbdaf0690e1121d0f810dfb035e7a9f0dae17248 Author: Chris Wilson Date: Wed May 9 09:22:31 2007 +0100 [cairo-scaled-font] Check _cairo_scaled_glyph_loop() status In _cairo_scaled_font_glyph_path() we forgot to check the status return of _cairo_scaled_glyph_loop() - propagate any failures. src/cairo-scaled-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b744c2705184c24845423d661258b39bbb17749b Author: James Cloos Date: Wed May 9 02:50:59 2007 -0400 [cairo-directfb-surface] Fix typo from commit a8c8e17d Fix typo in name of _cairo_directfb_surface_is_similar(). src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cbc9218cd3f664682bcb5095c602adf9615535d0 Author: Chris Wilson Date: Wed May 9 09:03:04 2007 +0100 [cairo-xcb-surface] Fix compilation As spotted by James Cloos , I broke the compilation... This is a minimal fix with no claims of completeness. src/cairo-xcb-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 069514a10ff2ca9ac86cc3dc1703aa19caa538e2 Author: Chris Wilson Date: Tue May 8 18:19:56 2007 +0100 [test/in-fill-empty-trapezoid] Cleanup after test failure. Ensure that the failure path also calls cairo_test_fini(). test/in-fill-empty-trapezoid.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 43645eb486da1af91b3264af6c84ac18a1eddcaa Author: Chris Wilson Date: Tue May 8 20:25:21 2007 +0100 [test/fallback-resolution] Cleanup after test failure Be valgrind clean even for test failures. test/fallback-resolution.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 21c6643b09c771454f913b444b6b040aaaacd3a8 Author: Chris Wilson Date: Tue May 8 21:28:48 2007 +0100 [cairo-surface] Check for errors when generating the scaled font. cairo_surface_show_glyphs() attempts to generate a device specific scaled font and so needs to check for failure before attempting to use it. src/cairo-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit ede76a97ea5b68c3bd042dc6a93ecb1aa7c9761c Author: Chris Wilson Date: Tue May 8 17:26:22 2007 +0100 [cairo-font-options] Check for the nil-object. The design is for the user to create a cairo_font_options_t object with cairo_font_options_create() and then is free to use it with any Cairo operation. This requires us to check when we may be about to overwrite the read-only nil object. src/cairo-font-face.c | 5 +++++ src/cairo-font-options.c | 7 ++++++- src/cairo-gstate.c | 4 +--- src/cairo-scaled-font.c | 10 ++++++++++ src/cairo-surface.c | 3 +++ src/cairo.c | 12 ++++++++---- src/cairoint.h | 3 ++- 7 files changed, 35 insertions(+), 9 deletions(-) commit c441938569ed78123a57662a70ef5a74dcf73851 Author: Chris Wilson Date: Tue May 8 21:40:26 2007 +0100 [cairo-pattern] Cleanly handle an invalid pattern in cairo_pattern_transform() Simply return without writing to potentially read-only members of an invalid pattern rather than assert. This is cleaner than tracking down all the error paths that may call into cairo_pattern_transform()... src/cairo-pattern.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 409f9734297be250de5e462e2d52e653bd893125 Author: Behdad Esfahbod Date: Tue May 8 14:18:42 2007 -0400 [test] If a test target fails, end the test otherwise cairo is left in a dirty state and further tests are unreliable. test/cairo-test.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit aad66d05fd0f310564e80c9ff59526028871751c Author: Chris Wilson Date: Tue May 8 16:40:24 2007 +0100 [test/nil-surface] Destroy the auxiliary context on failure paths. Just to be tidy, and aim to be valgrind-clean. test/nil-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit e3acacc096d7db947e7c8f2167a6d97f04c403b1 Author: Chris Wilson Date: Tue May 8 16:35:14 2007 +0100 [cairo-boilerplate-ps] Destroy the target on creation failure Remember to destroy the ptc->target as well as the ordinary surface, if we need to. boilerplate/cairo-boilerplate-ps.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit efd212bfa25cb44b9499b89f93aa7167a9544ccb Author: Chris Wilson Date: Tue May 8 16:23:07 2007 +0100 [cairo-boilerplate] Protect against the nil cairo_scaled_font_t Beware the NULL pointer deference when trying to adjust the max glyph cache size... boilerplate/cairo-boilerplate.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit b85920684f8feaba8d2d5b0262c60b4960c223b8 Author: Chris Wilson Date: Tue May 8 14:01:00 2007 +0100 [cairo-test] Destroy the check image on failure If drawing the checker pattern should fail, we need to free the resources allocated locally. test/cairo-test.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 0bf3ffacda5dbfc4fd8a5a0d5fd37d9630f5bcdb Author: Chris Wilson Date: Tue May 8 13:55:04 2007 +0100 [test-fallback-surface] Destroy the backing image on malloc failure. Ensure we free all local resource should we encounter an allocation failure during _cairo_test_fallback_surface_create(). src/test-fallback-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit eac18d44c7559fe393abf6706b52e5a8edbfd5e9 Author: Chris Wilson Date: Tue May 8 12:46:42 2007 +0100 [cairo-paginated-surface] Propagate malloc failure Check for an allocation failure during _cairo_analysis_surface_create() and propagate to caller - where we discover that the callers themselves missed the status checks... src/cairo-paginated-surface.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit 0d8a1540ec53ecc309a10e77ea7788fcd16d8345 Author: Emmanuel Pacaud Date: Tue May 8 09:11:57 2007 +0200 SVG: Don't clip SVG element, as clipping region is implicit. That makes editing of produced SVG easier. src/cairo-svg-surface-private.h | 1 + src/cairo-svg-surface.c | 53 +++++++++++++++++++-------------------- 2 files changed, 27 insertions(+), 27 deletions(-) commit 936c965777c867bd4de7fd2278335837cc24eb22 Author: Jinghua Luo Date: Tue May 8 13:24:40 2007 +0800 glitz: kill some compiler warnings. src/cairo-glitz-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 413705872e321288bff1368c62eacad11805c2fc Author: Jinghua Luo Date: Tue May 8 13:19:35 2007 +0800 glitz: fix a typo preventing build glitz backend from succeeding. src/cairo-glitz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d81907734e18fb9302e78eccb1e25a838223b726 Author: Chris Wilson Date: Sat May 5 12:33:29 2007 +0100 [cairo-color] Only compare the shorts for equality. By only checking the premultiplied shorts inside the cairo_color_t we only have to compare at most 8 bytes instead of the full 24 bytes. src/cairo-color.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 966a39396eb75d9d4ecc9997bb21d62fba176f78 Author: Chris Wilson Date: Fri May 4 15:25:18 2007 +0100 [NEWS] Surface cache for solid patterns Add an entry describing the surface cache to NEWS. NEWS | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) commit 056d149212ce4999f8984db62b880ff2eb998ab3 Author: Chris Wilson Date: Wed May 2 12:54:49 2007 +0100 [cairo-pattern] Don't cache fallback surfaces _cairo_surface_create_similar_solid() may return an image surface, should the backend not support the required content or should it encounter an error whilst creating the surface. In those circumstances we choose not to cache the fallback surface. src/cairo-pattern.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit a8c8e17d845c7060286dac58b553fb717b270788 Author: Chris Wilson Date: Wed May 2 10:00:22 2007 +0100 [cairo-pattern] Cache surface for solid patterns Original work by Jorn Baayen , 2715f2098127d04d2f9e304580a26cd0842c0e64 We use a small cache of size 16 for surfaces created for solid patterns. This mainly helps with the X backends where we don't have to create a pattern for every operation, so we save a lot on X traffic. Xft uses a similar cache, so cairo's text rendering traffic with the xlib backend now completely matches that of Xft. The cache uses an static index variable, which itself acts like a cache of size 1, remembering the most recently used solid pattern. So repeated lookups for the same pattern hit immediately. If that fails, the cache is searched linearly, and if that fails too, a new surface is created and a random member of the cache is evicted. A cached surface can only be reused if it is similar to the destination. In order to check for similar surfaces a new test is introduced for the backends to determine that the cached surface is as would be returned by a _create_similar() call for the destination and content. As surfaces are in general complex encapsulation of graphics state we only return unshared cached surfaces and reset them (to clear any error conditions and graphics state). In practice this makes little difference to the efficacy of the cache during various benchmarks. However, in order to transparently share solid surfaces it would be possible to implement a COW scheme. Cache hit rates: (hit same index + hit in cache) / lookups cairo-perf: (42346 + 28480) / 159600 = 44.38% gtk-theme-torturer: (3023 + 3502) / 6528 = 99.95% gtk-perf: (8270 + 3190) / 21504 = 53.29% This translates into a reduction of about 25% of the XRENDER traffic during cairo-perf. src/cairo-directfb-surface.c | 15 ++++- src/cairo-glitz-surface.c | 40 ++++++++++++- src/cairo-image-surface.c | 29 ++++++++- src/cairo-mutex-list-private.h | 3 +- src/cairo-pattern.c | 135 +++++++++++++++++++++++++++++++++++----- src/cairo-pdf-surface.c | 3 + src/cairo-surface.c | 57 +++++++++++++++++ src/cairo-win32-surface.c | 29 ++++++++- src/cairo-xcb-surface.c | 39 +++++++++++- src/cairo-xlib-surface.c | 45 +++++++++++++- src/cairoint.h | 16 +++++ 11 files changed, 388 insertions(+), 23 deletions(-) commit 52472b740e821dee444ede1fff041a99d344daab Author: Chris Wilson Date: Tue May 1 18:34:47 2007 +0100 [cairo-xlib-surface] Defer application of clip mask until required. By deferring the issuing of the X requests to set the clip mask we can theoretically avoid some redundant requests, but primarily we remove another path where X requests are emitted. src/cairo-xlib-surface-private.h | 7 ++++ src/cairo-xlib-surface.c | 72 ++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 38 deletions(-) commit a81823cdf9a147d02bb2365558ba667ab52fb3c9 Author: Chris Wilson Date: Fri Apr 20 17:32:25 2007 +0100 [cairo-xlib-display] Allocate the close_display hooks from a freelist. Similar to job allocation, but only useful for toolkits like GTK+ which recreate a new xlib surface for each expose. src/cairo-xlib-display.c | 105 ++++++++++++++++++++++++--------------------- src/cairo-xlib-private.h | 1 + 2 files changed, 57 insertions(+), 49 deletions(-) commit c29ffc64ca341623d21a7861f1b5f131b420d20f Author: Chris Wilson Date: Fri Apr 20 16:33:56 2007 +0100 [cairo-xlib-display] Cache the screen_info for the lifetime of the display. Hold an extra reference to the screen_info and explicitly destroy the list of screens on CloseDisplay. src/cairo-xlib-display.c | 19 +++++++++++++++++++ src/cairo-xlib-screen.c | 3 +-- 2 files changed, 20 insertions(+), 2 deletions(-) commit 1d6f7b7a0282d1b24bec82d9ad113b0d0a0cde98 Author: Chris Wilson Date: Thu Apr 19 13:01:52 2007 +0100 [cairo-xlib] Cache freed GCs Maintain a cache of freed GCs, one for each used depth. src/cairo-xlib-display.c | 6 +++- src/cairo-xlib-private.h | 10 ++++++ src/cairo-xlib-screen.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-xlib-surface.c | 22 ++++++++------ 4 files changed, 98 insertions(+), 10 deletions(-) commit 88c6d25d4e53ddad6f3d465b2f5249c76a421b82 Author: Chris Wilson Date: Tue Apr 17 12:03:07 2007 +0100 [cairo-xlib-surface] Defer xlib resource cleanup. Due to caching, destruction of X11 resources may occur outside of a usable X11 context. To avoid this, we defer the destruction onto a work queue which will be run the next time we try to use the X11 connection on behalf of the user (at which point we must have a usable X11 context!) or we are closing the Display. src/cairo-xlib-surface.c | 180 +++++++++++++++++++++++++++++++++++++++------ 1 files changed, 156 insertions(+), 24 deletions(-) commit 8ad30ccdb0a00701b15003edb2fe0cd4a8a9dfb7 Author: Chris Wilson Date: Thu Apr 19 12:15:04 2007 +0100 [cairo-xlib] Introduce a workqueue for deferred destruction of X resources. Due to the nature of the reference counting, an X resource may be destroyed later than anticipated and possibly from a different thread than the original context. This becomes an issue for applications that carefully manage their single X connection from a single thread and do not use locking and are then suprised when cairo triggers X traffic when performing work for a different part of the application in another thread. src/cairo-xlib-display.c | 171 +++++++++++++++++++++++++++++++++++++++++++++- src/cairo-xlib-private.h | 18 +++++ src/cairo-xlib-screen.c | 1 - src/cairo-xlib-surface.c | 21 +++++- 4 files changed, 205 insertions(+), 6 deletions(-) commit dd8681b76b088bab45c99510258920f027490f70 Author: Chris Wilson Date: Mon Apr 16 15:04:08 2007 +0100 [cairo-xlib] Split per-display attributes from per-screen. Previously, we stored the per-display attributes inside a special screen=NULL _cairo_xlib_screen_info_t. Now we keep track of known X displays and store the screen information beneath the display structure alongside the per-display hooks. src/Makefile.am | 8 +- src/cairo-debug.c | 4 - src/cairo-mutex-list-private.h | 2 +- src/cairo-xlib-display.c | 258 +++++++++++++++++++++++++++++++++ src/cairo-xlib-private.h | 37 ++++- src/cairo-xlib-screen.c | 309 ++++++++------------------------------- src/cairo-xlib-surface.c | 2 +- src/cairoint.h | 6 - 8 files changed, 359 insertions(+), 267 deletions(-) commit 9919f1ed9ccbec637252e06dd1de5f4665c873b4 Author: Behdad Esfahbod Date: Thu May 3 19:54:31 2007 -0400 [TODO] Add link to cairo_copy_clip() proposal TODO | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit e5d9d51e55eb45704de6d98ac9265743af56711f Author: Behdad Esfahbod Date: Thu May 3 19:04:21 2007 -0400 [cairo-mutex] Fix typo. src/cairo-mutex.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 5ec27eef9566faa22fb1cbaf1a103a57ba5296c8 Author: Chris Wilson Date: Thu May 3 13:46:25 2007 +0100 [pixman] Free the old rects if we fail to allocate new. During the pixman_op, a complicated dance is performed to handle enlarging the rectangle array to accommodate the op. One consequence of this is to, under certain circumstances, replace the current rectangle array with emptyData and track the old array with oldData. Hence if we fail to realloc the enlarged array we need to free oldData. pixman/src/pixregion.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit ef3070821713c33fab78abb191e27a62e165f6c6 Author: Behdad Esfahbod Date: Wed May 2 16:22:13 2007 -0400 [boilerplate] Fix typo boilerplate/xmalloc.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c412e42c72c0ff53c678119638357ed95897ed78 Author: Chris Wilson Date: Wed May 2 21:17:39 2007 +0100 [cairo-xlib-surface] Check that the acquire surfaces are xlib surfaces _cairo_pattern_acquire_surfaces() may substitute an image surface for either the source or the mask should the backend not support creation of similar scratch surfaces or an error occurs during creation. For composition we require xlib surfaces and so we must trigger the fallback path if this happens. src/cairo-xlib-surface.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit f3153091b742daffa853f2c31b76aa9689c5165a Author: Behdad Esfahbod Date: Tue May 1 20:10:39 2007 -0400 [cairo-mutex] Document the API for adding cairo_mutex_t implementations src/cairo-mutex-type-private.h | 83 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 83 insertions(+), 0 deletions(-) commit 5bfd6553fd028f1429d72c60d04788de4a3c0d58 Author: Behdad Esfahbod Date: Tue May 1 19:48:33 2007 -0400 [cairo-mutex] Define a NOOP CAIRO_MUTEX_FINALIZE() for pthread as now the mutex layer will define a generic CAIRO_MUTEX_FINALIZE() whenever the implementation defines CAIRO_MUTEX_FINI(). In the case of pthread however we don't need finalization as we don't have any place to call it, and pthread_mutex_destroy() doesn't do much anyway. src/cairo-mutex-type-private.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c4e0a059feb9c2e0c32966dcb168861e75a244b7 Author: Behdad Esfahbod Date: Tue May 1 19:46:51 2007 -0400 [cairo-mutex] Remove NOOP definition of CAIRO_MUTEX_INITIALIZE as now the mutex layer will use a NOOP CAIRO_MUTEX_INITIALIZE by default if the implementation does not define CAIRO_MUTEX_INIT. src/cairo-mutex-type-private.h | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 06cc74d974a99526829df558606174b41b0ee6e1 Author: Behdad Esfahbod Date: Tue May 1 19:45:29 2007 -0400 [cairo-mutex] Rewrite defaults for CAIRO_MUTEX macros not defined by the implementation to make them better match the design I have in mind, that I will document in a minute. They are a lot more readable and understandable now. src/cairo-mutex-private.h | 93 ++++++++++++++++++++++++++++++++------------ src/cairo-mutex.c | 18 +++++++- 2 files changed, 82 insertions(+), 29 deletions(-) commit e87a25dc7c73a44b0cdfc4ef368736e7f77fb522 Author: Behdad Esfahbod Date: Tue May 1 19:24:26 2007 -0400 [cairo-mutex] Fix usage of CAIRO_MUTEX_DECLARE() Previously cairo-mutex.c was abusing cairo-mutex-private.h by defining CAIRO_MUTEX_DECLARE before including it, and cairo-mutex-private.h was simply not overriding any available CAIRO_MUTEX_DECLARE. This is not the way it should be. cairo-mutex.c should instead define CAIRO_MUTEX_DECLARE and include cairo-mutex-list-private.h for itself. src/cairo-mutex-private.h | 4 +--- src/cairo-mutex.c | 9 +++++---- 2 files changed, 6 insertions(+), 7 deletions(-) commit 1a33e44aa5d73f568c4164c41f9595964e9f1bbb Author: Behdad Esfahbod Date: Tue May 1 18:13:19 2007 -0400 [RELEASING] Update GNOME URL to point to 2.19 planning page RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4764e6222bf4d5223fc2fbb139bb31a24819b2b5 Author: Behdad Esfahbod Date: Tue May 1 00:50:03 2007 -0400 [cairo-mutex] Improve error message if no thread implementation found to put back Carl's "acknowledge and accept" clause (!) before suggesting use of CAIRO_NO_MUTEX. src/cairo-mutex-type-private.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit b5f015f21f3c800919a85f03a081a3ec1648a794 Author: Behdad Esfahbod Date: Tue May 1 00:48:33 2007 -0400 [cairo-mutex] Make sure mutex implementation declares enough macros We have defaults for the rest. src/cairo-mutex-private.h | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit b0a0a1779dc5cc16423473b6d80ee5099793a47f Author: Behdad Esfahbod Date: Tue May 1 00:47:02 2007 -0400 [cairo-mutex] Make CAIRO_MUTEX_INIT/FINI take mutex object, not pointer to it This is more consistent with CAIRO_MUTEX_LOCK/UNLOCK. src/cairo-ft-font.c | 4 ++-- src/cairo-mutex-private.h | 2 +- src/cairo-mutex-type-private.h | 19 +++++++------------ src/cairo-mutex.c | 4 ++-- src/cairo-scaled-font.c | 4 ++-- 5 files changed, 14 insertions(+), 19 deletions(-) commit f9154f7eda4272ff99cc8a894082cc5aa1b008ef Author: Behdad Esfahbod Date: Tue May 1 00:44:42 2007 -0400 [cairo-mutex] Make sure CAIRO_MUTEX_FINI() evaluates its argument once src/cairo-mutex-private.h | 2 +- src/cairo-mutex-type-private.h | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) commit a8d47d0c001a36ddd6c9f09247e6eada408edb24 Author: Behdad Esfahbod Date: Tue May 1 00:43:15 2007 -0400 [cairo-mutex] Rename macro arguments from "name" to "mutex" src/cairo-mutex-private.h | 6 +++--- src/cairo-mutex-type-private.h | 20 ++++++++++---------- src/cairo-mutex.c | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) commit f57a536fceec73435bb13c44275717792b9b3a8c Author: Carl Worth Date: Tue May 1 13:45:58 2007 -0700 Increment version to 1.4.7 after the 1.4.6 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ddca8fec07ff95caeda6e4ce9efc3239b146bd2d Author: Carl Worth Date: Tue May 1 13:37:16 2007 -0700 perf: Add $(EXTRA_PROGRAMS) to CLEANFILES Otherwise these programs stick around and break distclean, distcheck, and hence release-publish targets. perf/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 0390ed4f189365d595b40a45b0cf9eef5aa0c6ba Author: Carl Worth Date: Tue May 1 13:24:43 2007 -0700 Increment version to 1.4.6 (and library versioning to 13:3:11) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit c9e0bb5c79abfc50ae6a24f603c5493c3ac68e40 Author: Carl Worth Date: Tue May 1 13:20:56 2007 -0700 NEWS: Add notes for cairo 1.4.6 NEWS | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 116 insertions(+), 0 deletions(-) commit 7f7f4d4f35cd640733b990fcff924a090b43d360 Author: Chris Wilson Date: Tue May 1 12:37:38 2007 +0100 [cairo-xlib-surface.c] Free the Pixmap on surface construction failure. If we create the Pixmap whilst constructing a similar xlib surface, then it our responsibility to free the Pixmap should we fail to allocate the surface. src/cairo-xlib-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 3e3bd4df7e810a9acd14cd6f3717633f71691b9e Author: Chris Wilson Date: Tue May 1 11:28:45 2007 +0100 Minor typo in cairo_surface_destroy() documentation. The type of @surface is #cairo_surface_t, not #cairo_t. src/cairo-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f7cdbd385a02d023e35357cd27dcc165ada667f2 Author: Behdad Esfahbod Date: Tue May 1 00:41:07 2007 -0400 [cairo-mutex-private.h] Move implementation-specific parts to cairo-mutex-type-private.h This fixes the problem reported by Dave Yeo that boilerplate wasn't building: In file included from ../src/cairo-scaled-font-private.h:44, from cairo-boilerplate.c:65: ../src/cairo-mutex-private.h:183: error: syntax error before "extern" ../src/cairo-mutex-private.h:184: error: syntax error before "void" ../src/cairo-mutex-private.h:185: error: syntax error before "void" make[3]: *** [cairo-boilerplate.lo] Error 1 src/Makefile.am | 1 + src/cairo-mutex-private.h | 81 +----------------------- src/cairo-mutex-type-private.h | 131 +++++++++++++++++++++++++++++++++++++++ src/cairo-scaled-font-private.h | 2 +- 4 files changed, 135 insertions(+), 80 deletions(-) commit 6de0f2d15775a451ead2cc3e80530b7dc6b321a3 Author: Behdad Esfahbod Date: Mon Apr 30 22:38:00 2007 -0400 [cairo-mutex] Fix CAIRO_MUTEX_FINALIZE definition to take parantheses This was breaking build on some systems as reported by Adrian Johnson on the list. src/cairo-mutex-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3f297a0fccb01f4e10a093ddc44a25a937364447 Author: Behdad Esfahbod Date: Mon Apr 30 22:00:31 2007 -0400 [TODO] Add various items discussed recently TODO | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) commit 51440ad9027bd9ccf7d987c234995470f7699043 Author: Behdad Esfahbod Date: Mon Apr 30 21:57:29 2007 -0400 [ROADMAP] Mark clipping trapezoids done ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8ea48710dc933cd5dd52fb7d0c29eb8994a5d160 Author: Behdad Esfahbod Date: Mon Apr 30 19:20:56 2007 -0400 [perf] Check availability before including nonstandard headers configure.in | 4 ++++ perf/cairo-perf-diff-files.c | 2 ++ perf/cairo-perf.c | 6 +++++- 3 files changed, 11 insertions(+), 1 deletions(-) commit fbc8bf05033a652d26c1defa56d12183e4009870 Author: Behdad Esfahbod Date: Mon Apr 30 19:11:31 2007 -0400 [perf] Don't build cairo-perf in "make all" perf/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4be608399f0d196a792f84fe4ddfce9acd2ea943 Author: Adrian Johnson Date: Sun Apr 29 19:29:24 2007 +0930 Fix cygwin compile error The WINVER macros need to be defined before including . As a result of some recent include file rearranging, was included indirectly before WINVER was defined. src/cairo-mutex-private.h | 12 ------------ src/cairo-win32-surface.c | 11 ++++++----- 2 files changed, 6 insertions(+), 17 deletions(-) commit a5d1fc923fdef354ceed8478c93e8b7cb734158a Author: Chris Wilson Date: Mon Apr 30 16:05:36 2007 +0100 Free all memory when cairo-perf exits. Similar to cairo-test, we free any global memory used by cairo for its caches through the debug interfaces. We do this so that valgrind does not unnecessary warn about memory leaks for the cached data and any true leak is then not lost in the noise. perf/cairo-perf.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) commit 7e6ab5461c2eb75c948bcb4725613ebe826c697a Author: Carl Worth Date: Sat Apr 28 07:46:56 2007 -0700 Add missing prototypes for getline and strndup This is needed to prevent breaking the build for non-GNU systems. perf/cairo-perf-diff-files.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-) commit 422798db1d73c1a8ecc5877133b0325023f38e61 Author: Carl Worth Date: Sat Apr 28 07:46:15 2007 -0700 cairo-perf-diff-files: Add missing include of libgen.h for basename perf/cairo-perf-diff-files.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit d89d8e6b45b7c13b77aa7c2f1c480f58429b08af Author: Carl Worth Date: Sat Apr 28 07:45:26 2007 -0700 pixman.h: Add missing definition of WARN_UNUSED_RESULT This was breaking the build on systems without support for the __warn_unused_result__ attribute. pixman/src/pixman.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit cb6fcdae92503964448144413e48ac388861d95f Author: Carl Worth Date: Sat Apr 28 07:38:56 2007 -0700 Fix typo in Makefile preventing builds from succeeding The cairo-ps-surface-private.h file was not getting included in the distribution. src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a392cc85081dd1e0fa3342c313af94a1e0c289b1 Author: Carl Worth Date: Fri Apr 27 22:46:47 2007 -0700 Clarify documentation of cairo_in_stroke and cairo_in_fill Like cairo_stroke_extents and cairo_fill_extents, these functions work without regard to the surface dimensions or the current clip region. src/cairo.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 8286b8741675ae163fc40187cd04e84395954c6e Author: Carl Worth Date: Fri Apr 27 17:23:08 2007 -0700 Clip trapezoids that are partially (or wholly) outside the clip region. It's quite simple to add a new _cairo_traps_limit call which installs a box into the cairo_traps_t structure. Then at the time of _cairo_traps_add we can discard any trapezoid that is wholly outside the box and also clip any trapezoid that is partially outside the box. We take advantage of this for both cairo_stroke and cairo_fill, (when cairo is computing the trapezoids in cairo-surface-fallback.c). Note that we explicitly do not do any clipping for cairo_stroke_extents, cairo_fill_extents, cairo_in_stroke, or cairo_in_fill which are defined to ignore clipping. As seen by the long-lines perf case, this fix successfully works around the bug in the X server where it creates overly large masks for partially-outside-the-destination-surface trapezoids: xlib-rgba long-lines-uncropped-100 545.84 -> 5.83: 93.09x speedup ██████████████████████████████████████████████ xlib-rgb long-lines-uncropped-100 554.74 -> 8.10: 69.04x speedup ██████████████████████████████████ src/cairo-surface-fallback.c | 52 ++++++++++++++++++++++++++++++++ src/cairo-traps.c | 68 +++++++++++++++++++++++++++++++++++++++++- src/cairoint.h | 7 ++++ 3 files changed, 126 insertions(+), 1 deletions(-) commit 2dcfb944b044172640a3784246d6b3129b686b60 Author: Carl Worth Date: Fri Apr 27 16:41:17 2007 -0700 Don't test PDF tests known to fail due to poppler limitations The following four tests are disabled: gradient-alpha, linear-gradient, text-pattern, trap-clip We don't use XFAIL as that would disable all backends, (but we can still usefully use these tests on backends other than PDF). boilerplate/cairo-boilerplate-pdf.c | 15 +++++++++++++++ test/gradient-alpha.c | 3 ++- test/linear-gradient.c | 3 ++- test/text-pattern.c | 3 ++- test/trap-clip.c | 3 ++- 5 files changed, 23 insertions(+), 4 deletions(-) commit 179e3399101b5a0daa907dcfe1f9f11ae8fe691e Author: Adrian Johnson Date: Fri Apr 27 16:01:56 2007 -0700 PDF: Change CTM to identity Some PDF viewers forget the CTM when drawing gradient patterns with SMasks. This patch works around these bugs by using the default identity matrix for the CTM. All paths are transformed from cairo to pdf coordinates before writing to the pdf file. src/cairo-pdf-surface-private.h | 1 + src/cairo-pdf-surface.c | 135 +++++++++++++++++++-------------------- 2 files changed, 67 insertions(+), 69 deletions(-) commit 1816d7c590ae4d423f9314a8a7794e2cae854da3 Author: Adrian Johnson Date: Fri Apr 27 09:49:45 2007 -0700 Add support for transparent gradients This is based on the gradient patch written by Miklós Erdélyi at http://lists.freedesktop.org/archives/cairo/2006-August/007648.html Currently only EXTEND_NONE and EXTEND_PAD are supported. Other extend types will go through the image fallback path. src/cairo-pdf-surface-private.h | 13 + src/cairo-pdf-surface.c | 950 ++++++++++++++++++++++++++++++--------- 2 files changed, 752 insertions(+), 211 deletions(-) commit 050dad71734739f1eaf8976ca5bb88e47c76409c Author: Carl Worth Date: Thu Apr 26 11:30:27 2007 -0700 cairo-perf-diff-files: Always print old and new configuration names Previously, if the change in the first test case was small enough to be considered insignificant, then the header lines showing the names of the old and new configurations would be omitted. This commit fixes that bug. perf/cairo-perf-diff-files.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 6035d3b47e635f53b361dc7924e161a214e038b3 Author: Carl Worth Date: Wed Apr 25 16:28:14 2007 -0700 cairo-perf-diff: Repair command-line option parsing. Apparently --force and --html have been broken since the attempt to address --help in ef5611df6c6bc8d9c6877af3a59c66fa6fc5c13a . perf/cairo-perf-diff | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) commit 0a1d2070e252921e097fec89537537675f8b7161 Author: Jeff Muizelaar Date: Wed Apr 25 16:01:29 2007 -0700 Fix bugs in fbCompositeSrc_8888x8x8888mmx and fbCompositeSrc_x888x8x8888mmx And re-enable fbCompositeSrc_8888x8x8888mmx now that it should work. This gives another little boost to the paint-with-alpha perf test: image-rgba paint-with-alpha_image_rgba_over-512 11.76 -> 5.20: 1.85x speedup ▉ image-rgb paint-with-alpha_image_rgba_over-512 11.76 -> 5.26: 1.84x speedup ▉ pixman/src/fbmmx.c | 20 +++++++++----------- pixman/src/fbpict.c | 8 +++----- 2 files changed, 12 insertions(+), 16 deletions(-) commit 342de46eb4033e1cccfec8b905c0002cc880c9fb Author: Carl Worth Date: Wed Apr 25 10:25:57 2007 -0700 Make the traditional speedup vs. slowdown report style available again Now, if you pass exactly two performance reports on the command line you'll get the traditional report style again, (so the tool remains backwards compatible). If you really want the new style with two reports you can get it by adding /dev/null as a third argument. perf/cairo-perf-diff-files.c | 112 ++++++++++++++++++++++++++++++++++++++--- 1 files changed, 103 insertions(+), 9 deletions(-) commit db2a761ae7055a61d3705a76526cbd0b71fcc95d Author: Carl Worth Date: Wed Apr 25 08:53:46 2007 -0700 Implement support for generating a report from more than two files This support is intended to compare the identical backends across multiple reports from several different configurations, (of one sort or another). The configuration names used in the report are taken from the filenames of the report files, (which will format most nicely if 8 characters or less). The traditional two-input report mode, (showing one line perdiff with all speedups before all slowdowns), is removed with this commit, but is intended to return again shortly. perf/cairo-perf-diff-files.c | 270 ++++++++++++++++++++++++------------------ 1 files changed, 157 insertions(+), 113 deletions(-) commit 5030cfce5df507a0338e1070a5dab3851ed9df7c Author: Carl Worth Date: Thu Apr 19 16:32:57 2007 -0700 cairo-perf-diff-files: Use pointers instead of indexing to iterate over reports We terminate the iteration by adding a final report with a NULL name. This will simplify future code that iterates over more than two reports simultaneously. perf/cairo-perf-diff-files.c | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-) commit 6121f4fccfe8d98fb09c096402da05d29d10b9e8 Author: Carl Worth Date: Thu Apr 19 16:21:39 2007 -0700 cairo-perf-diff-files: Simplify code to grow report->tests perf/cairo-perf-diff-files.c | 14 +++++--------- 1 files changed, 5 insertions(+), 9 deletions(-) commit cc03f0499e7b133a2e5c14e55207259ea000b8c2 Author: Carl Worth Date: Thu Apr 19 16:09:06 2007 -0700 cairo-perf-diff-files: Sort and compute stats at the time of loading a report perf/cairo-perf-diff-files.c | 150 +++++++++++++++++++++--------------------- 1 files changed, 75 insertions(+), 75 deletions(-) commit 228c83c9d2d1fdb6fa3af8a650640a47c8e21e36 Author: Carl Worth Date: Thu Apr 19 14:35:51 2007 -0700 cairo-perf-diff: Separate command-line options within the args structure A function like cairo_perf_report_diff wants the options, but really doesn't want/need to see the filenames for example, perf/cairo-perf-diff-files.c | 44 +++++++++++++++++++++++------------------ 1 files changed, 25 insertions(+), 19 deletions(-) commit 876786b3f7316b99a51ba8225e34581be13a883d Author: Carl Worth Date: Thu Apr 19 13:54:50 2007 -0700 Move implementation of getline and strndup These kept getting in my way as I looked for structure declarations at the top of the file. perf/cairo-perf-diff-files.c | 108 ++++++++++++++++++++--------------------- 1 files changed, 53 insertions(+), 55 deletions(-) commit 90d532e08f25644c4e621b0b7e592f4531a39d88 Author: Carl Worth Date: Thu Apr 19 13:52:03 2007 -0700 Replace old and new reports with reports array Another baby step toward allowing comparison of more than two reports. perf/cairo-perf-diff-files.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit c6c17633e40f549ede5761095a0652c08adeee08 Author: Carl Worth Date: Thu Apr 19 13:31:37 2007 -0700 Replace old_filename and new_filename with a filenames array More preparation for comparing more than two perf reports. perf/cairo-perf-diff-files.c | 30 +++++++++++++----------------- 1 files changed, 13 insertions(+), 17 deletions(-) commit 1849a7a8bededb281fbb07ec0939f8d1f4954771 Author: Carl Worth Date: Thu Apr 19 12:55:04 2007 -0700 cairo-perf-diff-files: Add new --min-change option, (replacing third positional argument) An upcoming change will allow cairo-perf-diff-files to generate a report based on more than two files. This prepares for that by moving the minimum-change support from the 3rd positional argument to a new --min-change option. perf/cairo-perf-diff-files.c | 39 +++++++++++++++++++++++---------------- 1 files changed, 23 insertions(+), 16 deletions(-) commit ef5611df6c6bc8d9c6877af3a59c66fa6fc5c13a Author: Carl Worth Date: Thu Apr 19 11:26:47 2007 -0700 cairo-perf-diff: Fix implementation of --help Previously only "--" would givethe usage, and not "--help" as intended. The new approach has been tested with ash, bash, and dash, (hopefully that's good enough). perf/cairo-perf-diff | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a8d4fed67a32c6040c27615e063466d654b55a3a Author: Carl Worth Date: Thu Apr 19 10:02:22 2007 -0700 cairo-perf-diff-files: Remove some overzealous option parsing. The code was complicated and confusing, and only existed to implement undocumented and unneeded command-line options. perf/cairo-perf-diff-files.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-) commit fe9dd719561048af1f2c3c8c43e46f7d97575053 Author: Carl Worth Date: Wed Apr 18 17:01:36 2007 -0700 Correct misattribution of Mathias' work to Chris NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 29670d37665d184d78d568070cb409acf98ee797 Author: Carl Worth Date: Mon Apr 23 10:24:03 2007 -0700 Add a content value to solid patterns This allows for the surface acquired from the pattern to have the same content. In particular, in a case such as cairo_paint_with_alpha we can now acquire an A8 mask surface instead of an ARGB32 mask surface which can be rendered much more efficiently. This results in a 4x speedup when using the OVER operator with the recently added paint-with-alpha test: Speedups ======== image-rgb paint-with-alpha_image_rgb_over-256 2.25 -> 0.60: 4.45x speedup ███▌ It does slowdown the same test when using the SOURCE operator, but I don't think we care. Performing SOURCE with a mask is already a very slow operation, (hitting compositeGeneral), so the slowdown here is likely from having to convert from A8 back to ARGB32 before the generalized compositing. So if someone cares about this slowdown, (though SOURCE with cairo_paint_with_alpha doesn't seem extremely useful), they will probably be motivated enough to contribute a customized compositing function to replace compositeGeneral in which case this slowdown should go away: image-rgba paint-with-alpha_image_rgb_source-256 3.84 -> 8.86%: 1.94x slowdown █ src/cairo-clip.c | 3 ++- src/cairo-glitz-surface.c | 5 ++++- src/cairo-gstate.c | 3 ++- src/cairo-pattern.c | 41 ++++++++++++++++++++++++++--------------- src/cairo-surface-fallback.c | 12 ++++++++---- src/cairo-surface.c | 2 +- src/cairo-xcb-surface.c | 3 ++- src/cairo-xlib-surface.c | 3 ++- src/cairo.c | 2 +- src/cairoint.h | 9 ++++++--- 10 files changed, 54 insertions(+), 29 deletions(-) commit fea5336e2db201be69256ef1bafd418fee98a21e Author: Carl Worth Date: Wed Apr 25 10:36:12 2007 -0700 Allow fbCompositeSrc_x888x8x8888mmx when destination has alpha Previously the check for this optimized function would only allow the function to be called if the source and destination had identical formats. But the function doesn't read the destination alpha (if any) so can be used when it exists as well. (Thanks to Jeff Muizelaar for pointing out this problem.) pixman/src/fbpict.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 72b812be8c69108c46334841823a2e9103b69516 Author: Carl Worth Date: Mon Apr 23 09:35:35 2007 -0700 perf: Add new paint-with-alpha test MacSlow noticed that cairo_paint_with_alpha is much slower than it should be, (and jrmuizel has a nice plan for fixing the performance bug). perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/paint-with-alpha.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 0 deletions(-) commit 302f1146da5b179e5016e2d523e891437c1a256b Author: Carl Worth Date: Mon Apr 23 09:26:32 2007 -0700 Fix two bugs in documentation code sample of cairo_arc The sample code for drawing an ellipse had width and height reversed in the call to cairo_scale, and also had both incorrectly inverted. src/cairo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e37c9edac02ccd9fbcbc4622a2f421f4be0d597e Author: Behdad Esfahbod Date: Tue Apr 24 17:33:37 2007 -0400 [ROADMAP] Add cairo_xlib_surface_get_xrender_format() ROADMAP | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit ac0ef0302e68ba17ec5a59c689579f1854c7386c Merge: d3cf214... 260dcb3... Author: Peter Weilbacher Date: Mon Apr 23 23:18:05 2007 +0200 Merge branch 'master' of git+ssh://pmw@git.freedesktop.org/git/cairo commit 260dcb316e14945e7600406954e4876e8827a777 Author: Chris Wilson Date: Mon Apr 23 13:54:37 2007 +0100 Add a _cairo_error() to png_simple_error_callback() With the introduction of the error callbacks for PNG, we have the opportunity for the user to set a breakpoint (via _cairo_error) at the point the error is first rasied. src/cairo-png.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 0fce7e85a1c853216866ddf6a40725e7ce57fe93 Author: Chris Wilson Date: Mon Apr 23 13:00:40 2007 +0100 Do not print out libpng error messages to stderr. We wish to avoid writing to file descriptors (and streams) that are outside cairo's control. In this case, the messages are superfluous as the errors are propagated via the cairo_status_t returns. src/cairo-png.c | 31 +++++++++++++++++++++++++------ 1 files changed, 25 insertions(+), 6 deletions(-) commit 59670dd5d3854af1f7cbdef984df7802c338330b Author: Behdad Esfahbod Date: Mon Apr 23 05:19:56 2007 -0400 [ROADMAP] Add URL to David Turner's patchset ROADMAP | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit ce91a176489f4cb8f40c5ec29f23881d1e013a9f Author: Behdad Esfahbod Date: Sun Apr 22 16:13:22 2007 -0400 [cairo-mutex] Add a poor man's mutex implementation in case of CAIRO_NO_MUTEX just for fun. src/cairo-mutex-private.h | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) commit 97b50e99bfa785d77b4900d3070f22a22827db22 Author: Behdad Esfahbod Date: Sun Apr 22 16:05:25 2007 -0400 [BeOS] Remove old-style mutex initialization cruft src/cairo-beos-surface.cpp | 34 ---------------------------------- 1 files changed, 0 insertions(+), 34 deletions(-) commit 0fd13a3db00e7e11915b5a7bbe81bf8f43f1941f Author: Behdad Esfahbod Date: Sun Apr 22 16:04:49 2007 -0400 [BeOS] Add mutex implementation src/cairo-mutex-private.h | 17 ++++++----------- 1 files changed, 6 insertions(+), 11 deletions(-) commit fc83784525d3f2bb3e09d931cc9c83261c0b73ae Author: Behdad Esfahbod Date: Sun Apr 22 15:56:18 2007 -0400 [cairo-mutex] Properly paranthesize macro arguments src/cairo-mutex-private.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 406fc63b68203e86c9236d06448e2ffa2c259669 Author: Behdad Esfahbod Date: Sun Apr 22 07:11:47 2007 -0400 [util] Change make target from "tools" to "util" to match targets like "test", "perf", and "doc", that match their directory names. util/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5bc1f3365d0002f2864bc30638df85c392a495f5 Author: Peter Weilbacher Date: Sun Apr 22 07:11:00 2007 -0400 [perf] Add OS/2 implementation for timer routines perf/Makefile.am | 4 ++ perf/cairo-perf-os2.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 0 deletions(-) commit 3b46e105bd781d7a4081068a14668334a7c82986 Author: Behdad Esfahbod Date: Sat Apr 21 08:21:01 2007 -0400 [util] Import my malloc wrapper that prints simple statistics To build, do: make malloc-stats.so inside util/, and to use, run: LD_PRELOAD=malloc-stats.so some-program For binaries managed by libtool, eg, cairo-perf, do: ../libtool --mode=execute /bin/true ./cairo-perf LD_PRELOAD="../util/malloc-stats.so" .libs/lt-cairo-perf The code also includes Jeff Muizelaar's libbacktracesymbols that is a much better implementation of backtrace_symbols() than what is provided by glibc. That can be built by: make backtrace-symbols.so util/.gitignore | 17 +++ util/Makefile.am | 22 +++ util/backtrace-symbols.c | 361 ++++++++++++++++++++++++++++++++++++++++++++++ util/malloc-stats.c | 301 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 701 insertions(+), 0 deletions(-) commit d3cf2144dbd42737d5e2c45908fbca082dd54022 Merge: 6c12961... abdcbf8... Author: Peter Weilbacher Date: Sat Apr 21 13:50:30 2007 +0200 Merge branch 'master' of git+ssh://pmw@git.freedesktop.org/git/cairo commit 6c129611408ddb5cf0a9a821b30bbb8148af08d9 Author: Peter Weilbacher Date: Sat Apr 21 13:49:04 2007 +0200 Use deprecated png symbol only when compiling against old version png_set_gray_1_2_4_to_8 is deprecated in libpng >= 1.2.9, the identical substitute for it is png_set_expand_gray_1_2_4_to_8 src/cairo-png.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 515491334cc32d8be856f25b7d2e36e63cb72246 Author: Behdad Esfahbod Date: Sat Apr 21 07:48:10 2007 -0400 Add util/ to distribution We already reference an script in util/ in PORTING_GUIDE, but was not shipping it! Makefile.am | 2 +- configure.in | 1 + util/Makefile.am | 4 ++++ 3 files changed, 6 insertions(+), 1 deletions(-) commit abdcbf896af69677058490d1d08ba58672c429ec Author: Behdad Esfahbod Date: Sat Apr 21 07:23:30 2007 -0400 [boilerplate] Add missing headers. Oops! I blame git for it... boilerplate/cairo-boilerplate-pdf.h | 33 +++++++++++++++++++++++++++++++++ boilerplate/cairo-boilerplate-xlib.h | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 0 deletions(-) commit 781f2533a32d84ca43a1bdf646bb69b7adab7a77 Author: Behdad Esfahbod Date: Sat Apr 21 07:21:38 2007 -0400 [.gitignore] Add cairo-*.*.* .gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit febcd689e7a4b277bbebffd8ebdc0970a04f68eb Author: Behdad Esfahbod Date: Sat Apr 21 07:19:47 2007 -0400 Update .gitignore to ignore .perf .gitignore | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit de425ada871c71277a53687dcd8a93a607d4faab Author: Behdad Esfahbod Date: Sat Apr 21 03:46:18 2007 -0400 [doc/public/Headers.mk] Update. doc/public/Headers.mk | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) commit 519b722747d606170741ccc520d6ec7332b2481f Author: Behdad Esfahbod Date: Sat Apr 21 03:45:51 2007 -0400 [RELEASING] Remove *-test.h from instructions as they are all removed now. RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0108f9c69f2f5391ff6b1066ae6b58fe3f71255a Author: Behdad Esfahbod Date: Sat Apr 21 03:44:53 2007 -0400 [check-def.sh] Do not allow _cairo_.*_test_ symbols anymore as all are removed now. src/check-def.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 79098c037043f45df0a18265417e96d6214d68e1 Author: Behdad Esfahbod Date: Sat Apr 21 03:43:04 2007 -0400 [scaled-font] Get rid of _cairo_scaled_font_test_set_max_glyphs_cached_per_font in favor of cairo_boilerplate_scaled_font_set_max_glyphs_cached. boilerplate/Makefile.am | 1 + boilerplate/cairo-boilerplate-scaled-font.h | 34 ++++++++++++++++++ boilerplate/cairo-boilerplate.c | 11 ++++++ src/Makefile.am | 1 - src/cairo-scaled-font-private.h | 1 + src/cairo-scaled-font-test.h | 49 --------------------------- src/cairo-scaled-font.c | 14 ++------ test/glyph-cache-pressure.c | 6 ++-- 8 files changed, 53 insertions(+), 64 deletions(-) commit 44563161de82a5ee7bbf8f100213ea1a3af6d5db Author: Behdad Esfahbod Date: Sat Apr 21 03:38:24 2007 -0400 Move a couple typedefs to cairo-types-private.h src/cairo-types-private.h | 2 ++ src/cairoint.h | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) commit 737d20a5702a18a1480c3b45f876e886b82b065c Author: Behdad Esfahbod Date: Sat Apr 21 03:35:07 2007 -0400 Move cairo_hash_entry_t to cairo-types-private.h src/cairo-hash-private.h | 38 -------------------------------------- src/cairo-scaled-font-private.h | 2 ++ src/cairo-types-private.h | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 38 deletions(-) commit 51ce92c3db093c8d26c8002ddbc105b11e7607bf Author: Behdad Esfahbod Date: Sat Apr 21 03:24:31 2007 -0400 [scaled-font] Move cairo_scaled_font_t to cairo-scaled-font-private.h src/Makefile.am | 1 + src/cairo-scaled-font-private.h | 109 +++++++++++++++++++++++++++++++++++++++ src/cairo-scaled-font.c | 1 + src/cairoint.h | 66 +----------------------- 4 files changed, 112 insertions(+), 65 deletions(-) commit 91f1056caf46d71c99eb044afbc943b92fb5550c Author: Behdad Esfahbod Date: Sat Apr 21 03:18:30 2007 -0400 Move cairo_cache_t to cairo-types-private.h src/cairo-cache-private.h | 2 +- src/cairo-cache.c | 11 ----------- src/cairo-hash-private.h | 4 ++-- src/cairo-types-private.h | 14 ++++++++++++++ 4 files changed, 17 insertions(+), 14 deletions(-) commit d2bb5f30079badf1029fa71faab9d6781092a271 Author: Behdad Esfahbod Date: Sat Apr 21 03:08:26 2007 -0400 [svg] Get rid of _cairo_svg_test_force_fallbacks in favor of cairo_boilerplate_svg_surface_force_fallbacks. boilerplate/Makefile.am | 1 + boilerplate/cairo-boilerplate-svg.c | 19 ++++++++++++ boilerplate/cairo-boilerplate-svg.h | 33 +++++++++++++++++++++ src/Makefile.am | 4 +- src/cairo-svg-surface-private.h | 2 + src/cairo-svg-surface.c | 20 +------------ src/cairo-svg-test.h | 54 ----------------------------------- test/fallback-resolution.c | 4 +- 8 files changed, 60 insertions(+), 77 deletions(-) commit ea1b7c2d8a55d694d575c0bb711e60f70a33ff77 Author: Behdad Esfahbod Date: Sat Apr 21 03:04:03 2007 -0400 [paginated] Include cairo-surface-private.h src/cairo-paginated-surface-private.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 7e0ae8bd43dfd8b052d021601912b46956b2921e Author: Behdad Esfahbod Date: Sat Apr 21 02:57:55 2007 -0400 [svg] Move cairo_svg_surface_t to cairo-svg-surface-private.h boilerplate/cairo-boilerplate-ps.c | 6 +++- src/Makefile.am | 2 +- src/cairo-svg-surface-private.h | 71 ++++++++++++++++++++++++++++++++++++ src/cairo-svg-surface.c | 24 +------------ 4 files changed, 78 insertions(+), 25 deletions(-) commit 3885fff3e6215023e801dd2c72fc39560a4e22fd Author: Behdad Esfahbod Date: Fri Apr 20 03:33:58 2007 -0400 [ps] Get rid of _cairo_ps_test_force_fallbacks in favor of cairo_boilerplate_ps_surface_force_fallbacks. boilerplate/Makefile.am | 1 + boilerplate/cairo-boilerplate-ps.c | 15 ++++++++++ boilerplate/cairo-boilerplate-ps.h | 33 ++++++++++++++++++++++ src/Makefile.am | 2 +- src/cairo-ps-surface-private.h | 3 +- src/cairo-ps-surface.c | 24 +-------------- src/cairo-ps-test.h | 54 ------------------------------------ test/fallback-resolution.c | 4 +- 8 files changed, 56 insertions(+), 80 deletions(-) commit 57dc972d6e5fe715a83cbcaad9c6cc3d38bf8129 Author: Behdad Esfahbod Date: Fri Apr 20 03:02:48 2007 -0400 [ps] Move cairo_ps_surface_t to cairo-ps-surface-private.h src/Makefile.am | 2 +- src/cairo-ps-surface-private.h | 79 ++++++++++++++++++++++++++++++++++++++++ src/cairo-ps-surface.c | 33 +---------------- 3 files changed, 81 insertions(+), 33 deletions(-) commit 3e69fbca6233e9f568935dbb69bf14bc34812d77 Author: Behdad Esfahbod Date: Fri Apr 20 03:00:21 2007 -0400 [pdf] Fix header file header! src/cairo-pdf-surface-private.h | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 29247e5010632f0453367b64a38c865076605681 Author: Behdad Esfahbod Date: Fri Apr 20 02:57:12 2007 -0400 [ps/pdf/svg] Fix minor coding style issue src/cairo-pdf-surface.c | 12 ++++++------ src/cairo-ps-surface.c | 2 +- src/cairo-svg-surface.c | 14 +++++++------- 3 files changed, 14 insertions(+), 14 deletions(-) commit 20ce190e71f838dea598cbd5267f047b75945cee Author: Behdad Esfahbod Date: Sat Apr 21 02:50:53 2007 -0400 [pdf] Get rid of _cairo_pdf_test_force_fallbacks in favor of cairo_boilerplate_pdf_surface_force_fallbacks. boilerplate/Makefile.am | 1 + boilerplate/cairo-boilerplate-pdf.c | 19 ++++++++++++ src/cairo-pdf-surface-private.h | 2 + src/cairo-pdf-surface.c | 25 ++-------------- src/cairo-pdf-test.h | 54 ----------------------------------- test/fallback-resolution.c | 4 +- 6 files changed, 27 insertions(+), 78 deletions(-) commit 03477064fa639ab1c735467d1889bde7c99313c4 Author: Behdad Esfahbod Date: Sat Apr 21 02:25:51 2007 -0400 [paginated] Move cairo_paginated_surface_t to cairo-paginated-surface-private.h The old cairo-paginated-surface-private.h is cairo-paginated-private.h now. src/Makefile.am | 1 + src/cairo-analysis-surface.c | 2 +- src/cairo-paginated-private.h | 136 +++++++++++++++++++++++++++++++++ src/cairo-paginated-surface-private.h | 116 ++++++---------------------- src/cairo-paginated-surface.c | 32 +------- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-svg-surface.c | 2 +- src/cairo-types-private.h | 1 + src/test-paginated-surface.c | 2 +- 10 files changed, 170 insertions(+), 126 deletions(-) commit 21a7de61c26faaaa1ce96cddab6d777dbb37d0bb Author: Behdad Esfahbod Date: Fri Apr 20 02:52:53 2007 -0400 [boilerplate] Add cairo-boilerplate-xlib.h to Makefile.am boilerplate/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 68e2158aaeacefcff8e6df11c25bb61ab0e89606 Author: Behdad Esfahbod Date: Fri Apr 20 02:37:15 2007 -0400 [pdf] Move cairo_pdf_surface_t to cairo-pdf-surface-private.h src/Makefile.am | 3 +- src/cairo-output-stream-private.h | 2 +- src/cairo-pdf-surface-private.h | 83 +++++++++++++++++++++++++++++++ src/cairo-pdf-surface.c | 42 +--------------- src/cairo-scaled-font-subsets-private.h | 2 - src/cairo-types-private.h | 3 + 6 files changed, 90 insertions(+), 45 deletions(-) commit 183c6af4f1730861a604a912a0609e315da65ecc Author: Behdad Esfahbod Date: Fri Apr 20 02:30:46 2007 -0400 [paginated] Move cairo_paginated_mode_t to cairo-types-private.h as it is used in surface structs for PS/PDF/SVG and we will need it. src/cairo-paginated-surface-private.h | 5 ----- src/cairo-types-private.h | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) commit cd72167ede50b44aa3559ee63b95e12e4b51d80f Author: Behdad Esfahbod Date: Fri Apr 20 02:27:19 2007 -0400 [xlib] Get rid of _cairo_xlib_test_disable_render in favor of cairo_boilerplate_xlib_surface_disable_render. boilerplate/cairo-boilerplate-xlib.c | 15 +++++++++ src/Makefile.am | 2 +- src/cairo-xlib-surface.c | 23 +-------------- src/cairo-xlib-test.h | 54 ---------------------------------- test/xlib-surface.c | 8 +++-- 5 files changed, 22 insertions(+), 80 deletions(-) commit 908418cb4d43e387d06698a43626ac9a663d6c2a Author: Behdad Esfahbod Date: Fri Apr 20 02:25:55 2007 -0400 [cairo-surface] Move cairo_surface_t struct in cairo-surface-private.h src/Makefile.am | 2 + src/cairo-surface-private.h | 96 ++++++++++++++++++++++++++++++++++++++ src/cairo-types-private.h | 65 +++++++++++++++++++++++++ src/cairo-xlib-private.h | 1 - src/cairo-xlib-surface-private.h | 2 + src/cairoint.h | 74 +---------------------------- 6 files changed, 167 insertions(+), 73 deletions(-) commit 8ae02fa470eace1b449c09b6cd0f86cc09b81ec2 Author: Behdad Esfahbod Date: Fri Apr 20 01:54:35 2007 -0400 [boilerplate] Minor indentation fix boilerplate/cairo-boilerplate-xlib-private.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 1345552ac24099900acdb968f905d6e75cc20593 Author: Behdad Esfahbod Date: Fri Apr 20 01:46:23 2007 -0400 [xlib] Move cairo_xlib_surface_t definition into cairo-xlib-surface-private.h src/Makefile.am | 3 +- src/cairo-xlib-surface-private.h | 91 ++++++++++++++++++++++++++++++++++++++ src/cairo-xlib-surface.c | 54 +---------------------- 3 files changed, 94 insertions(+), 54 deletions(-) commit 735be3f09d1d150909305ff3232fda42efcb87bd Author: Peter Weilbacher Date: Fri Apr 20 20:46:55 2007 +0200 Fix build break related to mutexes on OS/2 cairo_mutex_t is HTMX which is ULONG on OS/2, so we have to set the mutex itself to 0 and not the address... src/cairo-mutex-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5135bcf414abc91e7777e2c024c9b6e10bf6115c Author: Chris Wilson Date: Fri Apr 20 19:08:07 2007 +0100 cairo-boilerplate - use xmalloc and friends Prefer to abort gracefully if we run out of memory (or simply to protect them from memfault). boilerplate/cairo-boilerplate.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit b6be361d0ef3b81ef5cbc28852f323a671e3d030 Author: Chris Wilson Date: Fri Apr 20 17:49:10 2007 +0100 Clean up compiler warnings from cairo-png I introduced some compiler warnings into read_png() with the superfluous introduction of a couple of volatile qualifiers. I'm sure at the time, the reason was that gcc suggested adding them - however, ATM gcc issues no warnings without them. src/cairo-png.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit fc455c53ecb0aa496915b1eae68dc0275af78e09 Author: Adrian Johnson Date: Sat Apr 21 00:26:25 2007 +0930 Ensure _cairo_scaled_font_subsets_map_glyph() returns correct values The CID font subsetting exposed a bug where the subset_glyph->is_scaled return argument of _cairo_scaled_font_subsets_map_glyph() is sometimes not assigned a value. src/cairo-scaled-font-subsets.c | 55 +++++++++++++++------------------------ 1 files changed, 21 insertions(+), 34 deletions(-) commit 9d8eb42c013d197b3365af88e372d1c2c1617173 Author: Adrian Johnson Date: Fri Apr 20 22:45:12 2007 +0930 Exclude Type1 fonts from CID subsets Make cairo-scaled-font-subsets.c limit Type1 font subsets to 256 glyphs. This allows Type1 subsetting to be enabled again with type1-fallback as the fallback option for Type1 fonts. src/cairo-pdf-surface.c | 42 ++++++++++++++---------------- src/cairo-scaled-font-subsets-private.h | 11 +++++++- src/cairo-scaled-font-subsets.c | 36 +++++++++++++++++--------- src/cairo-type1-subset.c | 27 ++++++++++++++++++++ src/cairoint.h | 1 + 5 files changed, 82 insertions(+), 35 deletions(-) commit 56ad56263b86a9678387fe8dd994e77c183c6328 Author: Adrian Johnson Date: Fri Apr 20 22:44:04 2007 +0930 Enable embedding of CID fonts in PDF Update cairo-pdf-surface.c to embed CFF and TrueType fonts as CID fonts. Update the ToUnicode CMap to handle CID fonts. src/cairo-pdf-surface.c | 285 +++++++++++++++++++++++++++++------------------ 1 files changed, 177 insertions(+), 108 deletions(-) commit ca3662d6fc630e5390b3a8f8dbaa1d65aebc3fe8 Author: Adrian Johnson Date: Fri Apr 20 22:43:37 2007 +0930 Make cairo-output-stream.c accept variable width printf fields src/cairo-output-stream.c | 27 +++++++++++++++++++++++---- 1 files changed, 23 insertions(+), 4 deletions(-) commit 0c2a653033e0b631a1cb6591263cbd6125ccc00c Author: Adrian Johnson Date: Fri Apr 20 22:30:55 2007 +0930 Add CFF CID Fallback Switching to CID font embedding requires a fallback font for the case where CFF CID or TrueType CID subsetting fails. The new function _cairo_type2_charstrings_init() added to cairo-type1-fallback.c creates Type2 charstrings from glyph paths. _cairo_cff_fallback_init() in cairo-cff-subset.c wraps these charstrings in a CFF CID font. src/cairo-cff-subset.c | 212 +++++++++++++++++++++++++++++++ src/cairo-scaled-font-subsets-private.h | 68 ++++++++++ src/cairo-type1-fallback.c | 211 ++++++++++++++++++++++--------- 3 files changed, 432 insertions(+), 59 deletions(-) commit c68a2389f51880b0fa9df6750abdd840258666fc Author: Adrian Johnson Date: Fri Apr 20 22:30:05 2007 +0930 Make CFF Subsetting create CID subsets OpenType/CFF fonts come in two types: CID and non CID. CFF CID font subsetting was previously disabled in cairo due 1) to the need to embed CFF CID fonts in PDF as a CID fonts and 2) there is no easy way to convert CFF CID to CFF non CID. With the switch to CID fonts cairo-cff-subset.c has been updated to subset CID fonts and to covert non CID fonts to CID. A further advantage of converting non CID CFF fonts to CID is the reduction in size due to not embedding the name of each glyph in the font subset. src/cairo-cff-subset.c | 858 ++++++++++++++++++++++++++++++---------------- src/cairo-pdf-surface.c | 2 + 2 files changed, 561 insertions(+), 299 deletions(-) commit 073fce5a85ab90b1bc6915e41d6a420a47e540e6 Author: Adrian Johnson Date: Fri Apr 20 22:29:41 2007 +0930 Add support for creating CID/composite font subsets cairo-scaled-font-subsets.c now provides three functions for creating subsets: _cairo_scaled_font_subsets_create_scaled() Create a subset for each scaled font with maximum size INT_MAX. _cairo_scaled_font_subsets_create_simple() Create subsets suitable for embedding as simple fonts in PS/PDF. _cairo_scaled_font_subsets_create_composite() Create subsets suitable for embedding as composite fonts in PS/PDF. The _create_simple() and _create_composite() functions both merge scaled fonts with the same face and an outline path available into the same subset. _create_composite() has a maximum subset size of 65536 for outline fonts. Bitmap fonts have a separate subset for each scale with a maximum subset size of 256. The _create_simple() and _create_composite() functions both reserve the first glyph in the subset for the .notdef glyph. CID fonts require CID 0 to be .notdef. Update Type1, TrueType and CFF subsetting to expect glyph 0 of each subset to be the .notdef. src/cairo-cff-subset.c | 9 +-- src/cairo-pdf-surface.c | 5 +- src/cairo-ps-surface.c | 13 +-- src/cairo-scaled-font-subsets-private.h | 61 +++++++++++---- src/cairo-scaled-font-subsets.c | 127 ++++++++++++++++++++++--------- src/cairo-svg-surface.c | 2 +- src/cairo-truetype-subset.c | 21 ++--- src/cairo-type1-fallback.c | 2 +- src/cairo-type1-subset.c | 3 - 9 files changed, 156 insertions(+), 87 deletions(-) commit bf957ee0f29ff49970b4791718eccdb92f3d6886 Author: Chris Wilson Date: Fri Mar 23 12:59:38 2007 +0000 cairo-png - handle short reads During MT cairo testing we get the error "libpng: Read Error" which is emitted should the fread return fewer bytes than asked. However, this is not necessarily an error, so double-check the ferror() status before raising a png_error(). src/cairo-png.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-) commit d00aa44206f474e11c66c585d09bfd55e747cc5b Author: Behdad Esfahbod Date: Fri Apr 20 01:28:56 2007 -0400 [Makefile.am] Add a "make snapshot" target that creates a tarball named with version, date, and git hash of the tree. Like cairo-1.4.5-20070420-2a0389.tar.gz. Makefile.am | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletions(-) commit 2a038956635e27f61fb2147527d2262eebf9bb26 Author: Behdad Esfahbod Date: Fri Apr 20 00:55:03 2007 -0400 [pixman] Fix typo in Makefile.am pixman/src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit abcd929c57459f95e93504e0ef07b012b497a363 Author: Behdad Esfahbod Date: Fri Apr 20 00:50:48 2007 -0400 [boilerplate] Add cairo_boilerplate_format_from_content boilerplate/cairo-boilerplate-quartz.c | 9 +-------- boilerplate/cairo-boilerplate-test-surfaces.c | 13 +------------ boilerplate/cairo-boilerplate-win32.c | 8 ++------ boilerplate/cairo-boilerplate.c | 18 ++++++++++++++++++ boilerplate/cairo-boilerplate.h | 3 +++ 5 files changed, 25 insertions(+), 26 deletions(-) commit 97624dc488b41eb83d70b2c44a595daa5d833e7f Author: Behdad Esfahbod Date: Fri Apr 20 00:45:42 2007 -0400 [boilerplate] Strip test-surfaces boilerplate into cairo-boilerplate-test-surfaces* boilerplate/Makefile.am | 5 + .../cairo-boilerplate-test-surfaces-private.h | 63 +++++++ boilerplate/cairo-boilerplate-test-surfaces.c | 170 ++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 146 +---------------- 4 files changed, 241 insertions(+), 143 deletions(-) commit 2e709321d858a048731eeaaca4a13a96de739e3f Author: Behdad Esfahbod Date: Fri Apr 20 00:34:51 2007 -0400 [boilerplate] Move xasprintf to xmalloc.c boilerplate/cairo-boilerplate.c | 45 ----------------------------------- boilerplate/cairo-boilerplate.h | 32 +++++++++++------------- boilerplate/xmalloc.c | 50 ++++++++++++++++++++++++++++++++++++-- boilerplate/xmalloc.h | 9 ++++++- test/cairo-test.h | 2 +- 5 files changed, 71 insertions(+), 67 deletions(-) commit 5331445c12756293a915420a26ab5553fc7db3fc Author: Behdad Esfahbod Date: Fri Apr 20 00:26:17 2007 -0400 [boilerplate] Cleanup includes in cairo-boilerplate-beos.cpp boilerplate/cairo-boilerplate-beos.cpp | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit 56e916d40cf2a5f061347254657592f7bfc90d02 Author: Behdad Esfahbod Date: Fri Apr 20 00:25:44 2007 -0400 [boilerplate] Fix typos in cairo-boilerplate-glitz.c boilerplate/cairo-boilerplate-glitz.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 06718b0da642d39b7b4dbfc009f08acb24e5e802 Author: Behdad Esfahbod Date: Fri Apr 20 00:15:19 2007 -0400 [boilerplate] Remove leftover call to cairo_test_log boilerplate/cairo-boilerplate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 99737a60cb8cae1643b84782768e8c6d50ac7d0a Author: Behdad Esfahbod Date: Fri Apr 20 00:13:25 2007 -0400 [boilerplate] Clean up includes and remove unnecessary ones boilerplate/cairo-boilerplate-directfb.c | 9 +++++---- boilerplate/cairo-boilerplate-pdf.c | 2 +- boilerplate/cairo-boilerplate-svg.c | 2 +- boilerplate/cairo-boilerplate-xcb.c | 2 +- boilerplate/cairo-boilerplate.c | 30 +++++++++--------------------- 5 files changed, 17 insertions(+), 28 deletions(-) commit 4b569f13d758015f33ad258a70ad4f472da771ed Author: Behdad Esfahbod Date: Fri Apr 20 00:08:44 2007 -0400 [boilerplate] Strip win32 boilerplate into cairo-boilerplate-win32* boilerplate/Makefile.am | 5 ++ boilerplate/cairo-boilerplate-win32-private.h | 38 ++++++++++++++++++ boilerplate/cairo-boilerplate-win32.c | 51 +++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 31 ++------------- 4 files changed, 99 insertions(+), 26 deletions(-) commit 0a03d66fffe7388d8fb4ffdb7bb5501a214c6342 Author: Behdad Esfahbod Date: Thu Apr 19 23:58:51 2007 -0400 [boilerplate] Rename create_win32_surface to _cairo_boilerplate_win32_create_surface boilerplate/cairo-boilerplate.c | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) commit 5ee882d3941a9df61d539e056933564a758a6bbc Author: Behdad Esfahbod Date: Thu Apr 19 23:53:34 2007 -0400 [boilerplate] Remove empty cleanup_win32 boilerplate/cairo-boilerplate.c | 11 ++--------- 1 files changed, 2 insertions(+), 9 deletions(-) commit a684fd80e750bea5661262e29a59c4f8c4d9cee3 Author: Behdad Esfahbod Date: Thu Apr 19 23:36:00 2007 -0400 [directfb] Silence compiler warning src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 23e6abc3fc01e3d722adfc48cd1df9c8db73adc1 Author: Behdad Esfahbod Date: Thu Apr 19 22:40:52 2007 -0400 [boilerplate] Strip glitz boilerplate into cairo-boilerplate-glitz* boilerplate/Makefile.am | 30 +- boilerplate/cairo-boilerplate-glitz-private.h | 73 ++++ boilerplate/cairo-boilerplate-glitz.c | 477 ++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 480 +------------------------ 4 files changed, 582 insertions(+), 478 deletions(-) commit 7d576a376706aad427915b4872429f5605104886 Author: Behdad Esfahbod Date: Thu Apr 19 22:25:28 2007 -0400 [boilerplate] Minor indentation fix boilerplate/cairo-boilerplate.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 06b657ccf129f6f154c0db7886e5cca6191f93ca Author: Behdad Esfahbod Date: Thu Apr 19 22:20:38 2007 -0400 [boilerplate] Strip xcb boilerplate into cairo-boilerplate-xcb* boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-xcb-private.h | 44 ++++++++++ boilerplate/cairo-boilerplate-xcb.c | 115 +++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 90 +-------------------- 4 files changed, 167 insertions(+), 87 deletions(-) commit 65f636649d54348722354b2400c3a191309da0e1 Author: Behdad Esfahbod Date: Thu Apr 19 22:13:08 2007 -0400 [boilerplate] Strip svg boilerplate into cairo-boilerplate-svg* boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-svg-private.h | 44 +++++++++ boilerplate/cairo-boilerplate-svg.c | 129 +++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 106 +--------------------- 4 files changed, 181 insertions(+), 103 deletions(-) commit 8c9960675b82978acbd5a85ef358c674c3407ee3 Author: Behdad Esfahbod Date: Thu Apr 19 22:10:09 2007 -0400 [boilerplate] Strip pdf boilerplate into cairo-boilerplate-pdf* boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-pdf-private.h | 44 +++++++++ boilerplate/cairo-boilerplate-pdf.c | 134 +++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 111 +--------------------- 4 files changed, 186 insertions(+), 108 deletions(-) commit d9ce7de57514710f425bdee613edc4ea79ac0f0a Author: Behdad Esfahbod Date: Thu Apr 19 22:08:24 2007 -0400 [boilerplate] Rename xcairo_surface_set_user_data to cairo_boilerplate_surface_set_user_data and make it public. boilerplate/cairo-boilerplate.c | 48 +++++++++++++++++++++----------------- boilerplate/cairo-boilerplate.h | 6 +++++ 2 files changed, 32 insertions(+), 22 deletions(-) commit df6b8ecc8963518c897648d82aab1aa090b4721a Author: Behdad Esfahbod Date: Thu Apr 19 21:46:51 2007 -0400 [boilerplate] Strip ps boilerplate into cairo-boilerplate-ps* boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-ps-private.h | 44 +++++++++ boilerplate/cairo-boilerplate-ps.c | 138 ++++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 115 +---------------------- 4 files changed, 190 insertions(+), 112 deletions(-) commit 6461f0d120bf5fabd08b7621233229b223b3de89 Author: Behdad Esfahbod Date: Thu Apr 19 20:45:10 2007 -0400 [boilerplate] Remove unused variables boilerplate/cairo-boilerplate.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) commit f2d6275352142df631e00e27456d7e6ceb83804c Author: Behdad Esfahbod Date: Thu Apr 19 20:41:34 2007 -0400 [boilerplate] Fix renaming typo boilerplate/cairo-boilerplate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d5535c993b5cde5df29a7a29339aa500992128bf Author: Behdad Esfahbod Date: Thu Apr 19 20:36:14 2007 -0400 [boilerplate/test] Move vector_ignored_tests from boilerplate/ to test/ boilerplate/cairo-boilerplate.c | 28 ----------------- test/cairo-test.c | 62 ++++++++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) commit d6dc4f978364d287367d239e5594c7ffe50a2571 Author: Behdad Esfahbod Date: Thu Apr 19 20:28:22 2007 -0400 [boilerplate] Add a boolean is_vector to boilerplate target type This is used to move the skip-these-tests-for-vector code into cairo-test which it belongs. boilerplate/cairo-boilerplate.c | 18 ++++++++++++------ boilerplate/cairo-boilerplate.h | 1 + 2 files changed, 13 insertions(+), 6 deletions(-) commit 0b5e2dbaa84225452a0935f61d2348bce88a3e69 Author: Behdad Esfahbod Date: Thu Apr 19 20:23:55 2007 -0400 [boilerplate] Sort backend entries in Makefile.am alphabetically boilerplate/Makefile.am | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit be0320c4f8082a9274899959dc82297a04aa7800 Author: Behdad Esfahbod Date: Thu Apr 19 20:17:26 2007 -0400 [boilerplate] Properly namespace boilerplate methods in preparation for ripping them into per-backend files. boilerplate/cairo-boilerplate-beos.cpp | 24 +- boilerplate/cairo-boilerplate-directfb.c | 33 ++-- boilerplate/cairo-boilerplate-quartz.c | 12 +- boilerplate/cairo-boilerplate-xlib.c | 24 +- boilerplate/cairo-boilerplate.c | 328 +++++++++++++++++------------- 5 files changed, 236 insertions(+), 185 deletions(-) commit 9b660a3d54940c68eb48f2afeca7e87e1d2bffa6 Author: Behdad Esfahbod Date: Thu Apr 19 19:56:05 2007 -0400 [boilerplate] Strip xlib boilerplate into cairo-boilerplate-xlib* boilerplate/Makefile.am | 5 + boilerplate/cairo-boilerplate-xlib-private.h | 44 ++++++ boilerplate/cairo-boilerplate-xlib.c | 196 ++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 183 ++----------------------- 4 files changed, 254 insertions(+), 174 deletions(-) commit d945f6434643ac35f0e86352cfe3ccf021f568de Author: Behdad Esfahbod Date: Thu Apr 19 19:44:57 2007 -0400 [boilerplate] Move includes around boilerplate/cairo-boilerplate.c | 23 ++++++++++------------- 1 files changed, 10 insertions(+), 13 deletions(-) commit 0130cca6924f5c0969ca285585c68a458301a882 Author: Behdad Esfahbod Date: Thu Apr 19 19:39:58 2007 -0400 [boilerplate] Rename test-directfb to boilerplate-directfb boilerplate/Makefile.am | 3 +- boilerplate/cairo-boilerplate-directfb-private.h | 23 ++++ boilerplate/cairo-boilerplate-directfb.c | 143 ++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 6 +- boilerplate/cairo-test-directfb.c | 143 ---------------------- boilerplate/cairo-test-directfb.h | 23 ---- 6 files changed, 171 insertions(+), 170 deletions(-) commit fb2c0daa09af083278024c3da6f7e9e3f851984f Author: Behdad Esfahbod Date: Thu Apr 19 19:38:20 2007 -0400 [boilerplate] Rename test-beos to boilerplate-beos boilerplate/Makefile.am | 3 +- boilerplate/cairo-boilerplate-beos-private.h | 34 ++++ boilerplate/cairo-boilerplate-beos.cpp | 258 ++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 8 +- boilerplate/cairo-test-beos.cpp | 258 -------------------------- boilerplate/cairo-test-beos.h | 34 ---- 6 files changed, 298 insertions(+), 297 deletions(-) commit 01760286b388870e5bebf3851b4bef1350d89852 Author: Behdad Esfahbod Date: Thu Apr 19 19:32:52 2007 -0400 [boilerplate] Rename quartz-boilerplate to boilerplate-quartz boilerplate/Makefile.am | 4 +- boilerplate/cairo-boilerplate-quartz-private.h | 41 ++++++++++++++++ boilerplate/cairo-boilerplate-quartz.c | 60 ++++++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 10 ++-- boilerplate/cairo-quartz-boilerplate-private.h | 41 ---------------- boilerplate/cairo-quartz-boilerplate.c | 60 ------------------------ 6 files changed, 108 insertions(+), 108 deletions(-) commit d64ef355217db7a555da0029187d19c80ec12609 Author: Chris Wilson Date: Thu Apr 19 23:12:09 2007 +0100 Include cairo-perf in make check Although cairo-perf is not written to perform explicit failure testing of cairo, it does generate long sequences of cairo operations which often trigger unexpected errors. By including it with make check, it becomes even easier for the programmer to check that one has not broken cairo in terms of expected behaviour or performance. Makefile.am | 3 ++- perf/Makefile.am | 30 +++++++++++++++++++----------- 2 files changed, 21 insertions(+), 12 deletions(-) commit 0ffb021e9b0cc2ec9afc3eaa360b4518327afa6c Author: Behdad Esfahbod Date: Thu Apr 19 16:52:51 2007 -0400 [cairo-mutex] If no mutex implementation is found, should #error instead of #warning otherwise we will cause compile errors before the sanity check macros get a chance to err. src/cairo-mutex-private.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 813cdd71503ca2d77da011c91368e55cf20ad657 Author: Behdad Esfahbod Date: Thu Apr 19 16:49:35 2007 -0400 [configure.in] Support --disable-pthread Also allows for --enable-pthread=yes which will make configure abort if pthread is not found (as opposed to silently disabling it). configure.in | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) commit 6d01e89988ea89ae21f3461825583d89b6eef55e Author: Chris Wilson Date: Thu Apr 19 21:46:00 2007 +0100 Add callgrind output files to CLEANFILES and .gitignore. perf/.gitignore | 2 ++ perf/Makefile.am | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) commit 2c79f8b75bd5bb0bb3bf054fb2b3cae6de382a7c Author: Chris Wilson Date: Thu Apr 19 21:41:43 2007 +0100 Fix command line for running cairo-perf under valgrind. The CAIRO_PERF_ENVIRONMENT slipped into the middle of the command line instead of at the start. perf/Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 3631c11eb4ab49f2bb3b9ef0478e5516793f221f Author: Behdad Esfahbod Date: Thu Apr 19 16:38:23 2007 -0400 [cairo-mutex] Switch to HAVE_WINDOWS_H to use Win32 mutexes src/cairo-mutex-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d2a824a191e6b0d10a1f495d970b0406e37e0a39 Author: Behdad Esfahbod Date: Thu Apr 19 16:37:36 2007 -0400 [cairo-commit] Update attribution headers in cairo-mutex-private.h src/cairo-mutex-private.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 12dfd8bb4bf72483c835e169003fa00b114beb13 Author: Behdad Esfahbod Date: Thu Apr 19 16:36:43 2007 -0400 [cairo-mutex] Warn if no mutex definition found and let sanity macros err about undefined CAIRO_MUTEX macros. src/cairo-mutex-private.h | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 6aa823841d6c1d59d4d972f0236f0e6a43199970 Author: Behdad Esfahbod Date: Thu Apr 19 16:36:10 2007 -0400 [cairo-mutex] Support non-reentrant compilation if CAIRO_NO_MUTEX defined to 1. src/cairo-mutex-private.h | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit e5980f69ad2d59ee305fe9aae62070a74d2df58b Author: Behdad Esfahbod Date: Thu Apr 19 16:31:47 2007 -0400 [cairo-commit] Just warn for BeOS and let the sanity check macros err about undefined CAIRO_MUTEX macros. src/cairo-mutex-private.h | 10 +++------- 1 files changed, 3 insertions(+), 7 deletions(-) commit 8ebb054ff9d2fe12faa7b1807aef24b2bf916e64 Author: Behdad Esfahbod Date: Thu Apr 19 16:28:44 2007 -0400 [cairo-mutex] Prefer "#if CAIRO_SOMETHING" over "#if defined CAIRO_SOMETHING" src/cairo-mutex-private.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 97c197478023ceb5477a203d058eaec2cb18f987 Author: Behdad Esfahbod Date: Thu Apr 19 16:26:21 2007 -0400 [cairo-mutex] Add default implementation for CAIRO_MUTEX_INIT that uses CAIRO_MUTEX_NIL_INITIALIZER. This used to be the implementation for pthread because pthread_mutex_init() is broken. See d48bb4fbe876a93199ba48fcf5f32734fbe18ba9. src/cairo-mutex-private.h | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit 6d2a2dd6d9190c62b209e47c083b7df72e7134fb Author: Behdad Esfahbod Date: Thu Apr 19 16:24:16 2007 -0400 [cairo-mutex] Add default no-op implementation for CAIRO_MUTEX_FINI src/cairo-mutex-private.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 2067d6fa90dae80aa666fb7328d51e2f92bec5bd Author: Behdad Esfahbod Date: Thu Apr 19 16:23:14 2007 -0400 [cairo-mutex] Use CAIRO_MUTEX_NOOP when applicable src/cairo-mutex-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5dda76c90f8886b6017ca8bbdf81be2b97201962 Author: Behdad Esfahbod Date: Thu Apr 19 16:22:02 2007 -0400 [cairo-mutex] Err if at least one of mutex macros are not defined src/cairo-mutex-private.h | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) commit f771b9157c26430949f4dd1412c7a7b35367f81a Author: Behdad Esfahbod Date: Thu Apr 19 16:21:13 2007 -0400 [cairo-mutex] Define and use CAIRO_MUTEX_USE_GENERIC_INITIALIZATION We use the generic initialization if CAIRO_MUTEX_INITIALIZE is not defined. src/cairo-mutex-private.h | 9 +++++++++ src/cairo-mutex.c | 2 +- 2 files changed, 10 insertions(+), 1 deletions(-) commit 4fc52e2d49c1299f8f175e22472ebe08baa41fa4 Author: Behdad Esfahbod Date: Thu Apr 19 16:19:48 2007 -0400 [cairo-mutex] Define CAIRO_MUTEX_NOOP src/cairo-mutex-private.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit f9dd8fd0ef0ad95921723155b951cd113ccb2d0b Author: Behdad Esfahbod Date: Thu Apr 19 16:19:25 2007 -0400 [cairo-mutex] Inlucde cairo-features.h and config.h Previously we were lucky enough to have them included before us src/cairo-mutex-private.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 4e754cf3df9855c1d442578e555b7fb17c3dd4a1 Author: Behdad Esfahbod Date: Thu Apr 19 15:31:24 2007 -0400 [cairo-truetype-subset] Shut gcc warning up src/cairo-truetype-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4141e752e2eb0f40f2eb298bad398e6390e00ef8 Author: Behdad Esfahbod Date: Thu Apr 19 15:04:11 2007 -0400 [cairo-freelist] Remove redundant struct declarations src/cairo-freelist-private.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit ea817c560c429f445e4c450b60d499dae27f6024 Author: Behdad Esfahbod Date: Thu Apr 19 14:50:38 2007 -0400 [cairo-mutex] Remove unneeded #undef CAIRO_MUTEX_EXTERNAL src/cairo-mutex-private.h | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) commit 0b281085b55aae70876c6ef022266b73461800ab Author: Behdad Esfahbod Date: Thu Apr 19 14:45:41 2007 -0400 [cairo-mutex] Err on unintended inclusion of cairo-mutex-list-private.h src/cairo-mutex-list-private.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 47be7280bfe751c9f635f1e17c158f04b2927ae3 Author: Behdad Esfahbod Date: Thu Apr 19 14:42:55 2007 -0400 [cairo-mutex] Remove multiple-inclusion guards from cairo-mutex-list-private.h This is a list header file. We should not prevent it from multiple inclusions. src/cairo-mutex-list-private.h | 3 --- src/cairo-mutex.c | 2 -- 2 files changed, 0 insertions(+), 5 deletions(-) commit 55ea0466e25de2c60171a9d6c96536bc2e7fb9e3 Author: Chris Wilson Date: Thu Apr 19 20:24:27 2007 +0100 Embed simple clip XRectangles in cairo_xlib_surface_t Toolkits like GTK+ almost always set a simple rectangular clip mask before any cairo operation, so avoid the allocation for this simple case by embedding a small number of XRectangles into the surface structure. src/cairo-xlib-surface.c | 18 +++++++++++------- 1 files changed, 11 insertions(+), 7 deletions(-) commit 7906a993403e75aa34b32d2d9338ec179896d765 Author: Mathias Hasselmann Date: Thu Apr 19 14:54:30 2007 +0200 Define INT32 limits on MSVC as noticed by Hans-Jürgen Schäler src/cairo-wideint-private.h | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit cc8841645cd7aa06ae48cbad804b31b3c0c2146b Author: Mathias Hasselmann Date: Thu Apr 19 13:47:45 2007 +0200 Properly use CAIRO_MUTEX_{INIT,FINI} and remove CAIRO_MUTEX_LIST_PRIVATE_H sentinal before explicitly including the mutex list. src/cairo-mutex.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 39a633a8f3618f3b1adb3eefdf36e2fc6d896054 Author: Mathias Hasselmann Date: Thu Apr 19 13:15:08 2007 +0200 Reintroduce DllMain as deterministic mutex initialization path src/cairo-win32-surface.c | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+), 0 deletions(-) commit 9b348929b51fb45f5985914350a10955d6df17ae Author: Mathias Hasselmann Date: Thu Apr 19 13:13:42 2007 +0200 Introduce CAIRO_MUTEX_FINALIZE as counter-part for CAIRO_MUTEX_INITIALIZE src/cairo-mutex-private.h | 8 +++++++- src/cairo-mutex.c | 12 ++++++++++++ src/cairo-os2-surface.c | 6 +++--- 3 files changed, 22 insertions(+), 4 deletions(-) commit 67767afa09e3622988b9ac67b754114ea9f84105 Author: Mathias Hasselmann Date: Thu Apr 19 12:35:10 2007 +0200 Update _cairo_mutex_initialized during initialization. src/cairo-mutex.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 41c6eebcd1fab94fd3a91d09f1ef6ee0d8c7a044 Author: Chris Wilson Date: Thu Apr 19 11:56:15 2007 +0100 Optionally provide a pattern to use for creating a similar solid surface. _cairo_surface_create_similar_solid() creates a fresh pattern to wrap color, however sometimes the caller already has that pattern available. In those circumstances we can pass the pattern as well as the color and avoid the extra allocation. src/cairo-clip.c | 3 ++- src/cairo-glitz-surface.c | 3 ++- src/cairo-pattern.c | 3 ++- src/cairo-surface.c | 24 +++++++++++++++--------- src/cairoint.h | 6 +++++- 5 files changed, 26 insertions(+), 13 deletions(-) commit ef60e7c65144edd1aa14757b269f2c196df732a2 Author: Chris Wilson Date: Wed Apr 18 18:08:45 2007 +0100 cairo-xlib-surface - track picture properties. By tracking picture properties we can dramatically reduce the amount of X11 traffic by avoiding redundant changes. src/cairo-xlib-surface.c | 35 ++++++++++++++++++++++++----------- 1 files changed, 24 insertions(+), 11 deletions(-) commit 9cf09556339e64bdf1273e95938b657112df07b6 Author: Chris Wilson Date: Thu Apr 19 09:27:51 2007 +0100 Create opaque similar solid surfaces when possible. For opaque surfaces the backends may use simpler code paths - for example, the xlib backend may be able to use the Core protocol rather than Render. So we only generate a surface with an alpha component if the color is not opaque. src/cairo-pattern.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit f7b6fc474651311356f116b7d8d7a5ef1cbab570 Author: Chris Wilson Date: Thu Apr 19 09:22:08 2007 +0100 Define a CAIRO_ALPHA_IS_OPAQUE variant that operates on uint16. Introducing this variant also fixed a bug in _gradient_is_opaque() which was using the fractional test on a uint16. src/cairo-pattern.c | 6 +++--- src/cairoint.h | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) commit 157074c794903f1dbe68c1ba5b129b4176dc7975 Author: Behdad Esfahbod Date: Wed Apr 18 19:46:30 2007 -0400 [boilerplate] Add cairo_boilerplate_get/free_targets This means, test and perf suites now share the same target handling code, including parsing CAIRO_TEST_TARGET. boilerplate/cairo-boilerplate.c | 73 +++++++++++++++++++++++++++++++++++++-- boilerplate/cairo-boilerplate.h | 6 +++- perf/cairo-perf.c | 20 +++++----- test/cairo-test.c | 54 ++++------------------------- 4 files changed, 92 insertions(+), 61 deletions(-) commit 47c02a6bd67e8b7e50977cc87d5e35358d5c4c2e Author: Behdad Esfahbod Date: Wed Apr 18 19:15:16 2007 -0400 [boilerplate] s/_cairo_test_content_name/cairo_boilerplate_content_name/g boilerplate/cairo-boilerplate.c | 8 ++++---- boilerplate/cairo-boilerplate.h | 2 +- test/cairo-test.c | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) commit b9026d0b137520247b4a93287bd518fc79774e93 Author: Behdad Esfahbod Date: Wed Apr 18 19:09:53 2007 -0400 [perf] Make targets more consistent with the test suite That is: 1) no VALGRING vs VG abbreviations 2) setting TARGETS and ITERS on the make command line works now perf/Makefile.am | 26 +++++++++++++++++--------- perf/cairo-perf.c | 8 ++++++-- 2 files changed, 23 insertions(+), 11 deletions(-) commit 9f3e0694e644d2279c7f4835f8035d4ecccb5711 Author: Behdad Esfahbod Date: Wed Apr 18 19:08:54 2007 -0400 [test] Allow bypassing all test targets by setting CAIRO_TEST_TARGET=" " test/cairo-test.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 52d4e0f3191440e8ebe366b593c2e9c955328258 Author: Behdad Esfahbod Date: Wed Apr 18 18:27:28 2007 -0400 [doc] Make section title capitalization more consistent doc/public/cairo-sections.txt | 2 +- doc/public/language-bindings.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit beadcdf9bd7c1dde48c8c751ba8af75c60b93a5f Author: Behdad Esfahbod Date: Wed Apr 18 18:24:09 2007 -0400 Rename cairo-font.c to cairo-font-face.c src/Makefile.am | 2 +- src/Makefile.win32 | 2 +- src/cairo-font-face.c | 514 +++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-font.c | 514 ------------------------------------------------- src/cairoint.h | 2 +- 5 files changed, 517 insertions(+), 517 deletions(-) commit f56582ef06bbf56edcc6ecc26698abaeba1306b0 Author: Behdad Esfahbod Date: Wed Apr 18 17:50:36 2007 -0400 Put back __inline definition for MSC compilers, in both cairo and pixman Apparently it's too much to expect people compiling on windows to fill in sensible values for config.h... /sigh pixman/src/pixmanint.h | 10 ++++++++-- src/cairoint.h | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) commit a54b6ed0784dd00375424e581bc7349dd8a2a2d9 Author: Behdad Esfahbod Date: Wed Apr 18 17:45:31 2007 -0400 [pixman] Rename icint.h to pixmanint.h pixman/src/Makefile.am | 4 +- pixman/src/check-pixmanint.sh | 17 + pixman/src/fbcompose.c | 4 +- pixman/src/fbedge.c | 4 +- pixman/src/fbmmx.c | 4 +- pixman/src/fbpict.c | 4 +- pixman/src/fbtrap.c | 4 +- pixman/src/icblt.c | 4 +- pixman/src/icbltone.c | 4 +- pixman/src/iccolor.c | 6 +- pixman/src/icformat.c | 6 +- pixman/src/icimage.c | 4 +- pixman/src/icpixels.c | 4 +- pixman/src/icrect.c | 6 +- pixman/src/icstipple.c | 4 +- pixman/src/ictransform.c | 6 +- pixman/src/ictrap.c | 5 +- pixman/src/ictri.c | 5 +- pixman/src/icutil.c | 4 +- pixman/src/pixman-xserver-compat.h | 4 +- pixman/src/pixman.h | 4 - pixman/src/pixmanint.h | 1070 ++++++++++++++++++++++++++++++++++++ pixman/src/pixregion.c | 4 +- pixman/src/renderedge.c | 4 +- 24 files changed, 1110 insertions(+), 75 deletions(-) commit 48121e97ac4f0114a0d5bc35aec76d2aba23a783 Author: Behdad Esfahbod Date: Wed Apr 18 17:04:07 2007 -0400 [cairoint.h] Define WARN_UNUSED_RESULT if undefined src/cairoint.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit a396e0b05731db3acbf1e8d82ab77592b697e417 Author: Chris Wilson Date: Wed Apr 18 14:24:10 2007 +0100 cairo-perf - add the missing newline. Oops, missed out the newline for the fprintf in the previous commit. perf/cairo-perf.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 383e9d5368706168498a87d1b7f023f2b59c2f92 Author: Chris Wilson Date: Wed Apr 18 14:12:20 2007 +0100 cairo-perf - Check that the surface is created. Exit(1) if we fail to create the target surface. perf/cairo-perf.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 7131f4e6aea11d94e38375a6be71887825008e48 Author: Dave Yeo Date: Tue Apr 17 15:30:20 2007 -0400 [OS2] Fix #include "cairo-mutex-list-private.h" src/cairo-os2-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f7a2787685d640dd35ef7ef1314c4e754771c512 Merge: 2efaf3a... cab4d41... Author: Mathias Hasselmann Date: Mon Apr 16 23:05:10 2007 +0200 Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo commit cab4d41cae4463841bca297a7e16c970633c8c21 Author: Chris Wilson Date: Mon Apr 16 16:57:24 2007 +0100 create-for-stream - free resources after test failure. create-for-stream often fails whilst running under valgrind due to the postscript output containing a CreationDate with seconds resolution, hence the visibility of the resource leaks during failure. test/create-for-stream.c | 37 ++++++++++++++++++++----------------- 1 files changed, 20 insertions(+), 17 deletions(-) commit 9d435d5fbfae0f64053f6596f73410bc352cd2de Author: Chris Wilson Date: Mon Apr 16 15:42:07 2007 +0100 Add suppression for leak from XauFileName. The string is statically allocated by XauFileName() and so ignore the fact that is not freed upon termination. test/.valgrind-suppressions | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 3a3fb0031decec26260cd94e60f1b0bf06541a6d Author: Chris Wilson Date: Mon Apr 16 15:08:54 2007 +0100 Update .gitignore Add .*.sw? (vim swapfiles). Add *~ (backup files). Add *.gcno and *.gcda (gcov intermediates). .gitignore | 1 + boilerplate/.gitignore | 4 ++++ perf/.gitignore | 4 ++++ src/.gitignore | 1 + test/.gitignore | 3 +++ 5 files changed, 13 insertions(+), 0 deletions(-) commit 7ff95c7230471be3ffa231ebc71e1d63ba4621b0 Author: Kouhei Sutou Date: Mon Apr 16 02:48:14 2007 -0400 Support MinGW DLL compilation configure.in | 1 + src/cairo-win32-surface.c | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-) commit ca9df759b4eda8f19a92b2e0b1092fa7b618d25b Author: Chris Wilson Date: Sat Apr 14 15:28:29 2007 +0100 Change of email address. Update to my new email address and drop my old work one. AUTHORS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 96ee8d5ebe6c6494a140c5424137f26de5fd5d85 Author: Carl Worth Date: Fri Apr 13 17:47:25 2007 -0700 Update version to 1.4.5 after the 1.4.4 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ebba4a6d1467a8e5db5cc43eb08e8fc98c39b30a Author: Carl Worth Date: Fri Apr 13 17:37:14 2007 -0700 Increment version to 1.4.4 (and library versioning to 13:2:11) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit e21a58ce4c2f550198de9ed35f7a37df764e7cdf Author: Carl Worth Date: Fri Apr 13 17:36:31 2007 -0700 NEWS: Add notes for cairo 1.4.4 NEWS | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 91 insertions(+), 0 deletions(-) commit e1a1f6ff251582b2293098a55953f81a13bb9cc0 Author: Carl Worth Date: Fri Apr 13 16:37:52 2007 -0700 AUTHORS: Update descriptions for Mathias Hasselmann and Chris Wilson Both have contributed a tremendous amount of effort to cairo 1.4.4. Well done! AUTHORS | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ef3e13337e513cf470801cff5cd2b8fdcff1b6eb Author: Carl Worth Date: Fri Apr 13 13:34:20 2007 -0700 cairo-perf-diff: Use median not minimum to report differences Ideally, the minimum value would indicate the best possible performance, but I've encountered situations where a bogus minimum value gets lodged into the cached results for some reason, (and yet doesn't also get discarded as an outlier). The downside of that situation is that running more iterations never changes the result, so it's hard to fix the problem, (resulting in cairo-perf-diff feeling just plain broken as more runs change nothing). So let's try using the median time instead. perf/cairo-perf-diff-files.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 7ead3e64f17fe302398ec60c61eaeaae4e9b18cf Author: Behdad Esfahbod Date: Fri Apr 13 16:34:31 2007 -0400 [ROADMAP] Put back bug 10508 into 1.4.4 roadmap and mark it fixed Yay! ROADMAP | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 84c10a79ffd233a953434bd787dcfe57787552f8 Author: Behdad Esfahbod Date: Fri Apr 13 16:33:07 2007 -0400 [cairo-pattern] Slightly hackish fix for bug #10508 The so-attributed-to-X-server bug was that cairo maps the drawing region to the pattern space, rounds the box, and uploads only that part of the source surface to the X server. Well, this only works for NEAREST filter as any more sophisticated filter needs to sneak a peek at the neighboring pixels around the edges too. The right fix involves taking into account the filter used, and the pattern matrix, but for most cases, a single pixel should be enough. Not sure about scaling down... Anyway, this is just a workaround to get 1.4.4 out of the door. I'll commit a proper fix soon. src/cairo-pattern.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) commit fcf49a56130ede8c6aa9f84a8c59ecef54714b7b Author: Carl Worth Date: Fri Apr 13 12:02:11 2007 -0700 boilerplate: Cleanup conditional compilation ofcairo-quartz-boilerplate.c It's much nicer to use automake to conditionally compile a file, instead of always compiling it and conditionally having the compiler see an empty file. boilerplate/Makefile.am | 6 +++- boilerplate/cairo-boilerplate-private.h | 45 ------------------------ boilerplate/cairo-boilerplate.c | 5 ++- boilerplate/cairo-quartz-boilerplate-private.h | 41 +++++++++++++++++++++ boilerplate/cairo-quartz-boilerplate.c | 6 +--- 5 files changed, 51 insertions(+), 52 deletions(-) commit cea107c9800a4414f57a874dd52924efdff725ec Author: Carl Worth Date: Fri Apr 13 11:28:21 2007 -0700 Punt bug #10508 off of 1.4.4 It looks like this is an X server bug, and we don't have an imminent fix. Meanwhile, the bug is avoidable by preferring to use xlib surface sources for transformed rendering to xlib instead of using image surface sources. ROADMAP | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 4e3be548615f8ce8a45f0e887f19eb39ba21f8a4 Author: Behdad Esfahbod Date: Thu Apr 12 21:34:49 2007 -0400 [cairo-pattern] Add a TODO item to code src/cairo-pattern.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit ec639449de9b630cdb4e7bca4ba8487b3a263184 Author: Carl Worth Date: Thu Apr 12 18:16:52 2007 -0700 Fix typo in loop control for computation of std. deviation Thanks to Chris Wilson for pointing out this problem. perf/cairo-stats.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 537a795b3b5698d4aa02f2f14e479e9bfd27fe0d Author: Carl Worth Date: Thu Apr 12 17:01:41 2007 -0700 Remove ft-text-vertical-layout-type1 This test can fail if the wrong font is loaded, but that's no different than many other text tests---so it doesn't really deserve special XFAIL treatment because of that. test/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 04164c996cad242a25c2af596ffcd3b07ba19289 Author: Behdad Esfahbod Date: Thu Apr 12 20:14:23 2007 -0400 [cairo-surface] Make sure cairo_surface_get_font_options() fully initializes the font_options passed in. src/cairo-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 7224e1a6e6eb474a3809d07f9540c959b3da10b2 Author: Behdad Esfahbod Date: Thu Apr 12 17:54:32 2007 -0400 [image] Set hint-metrics on in default font options src/cairo-image-surface.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) commit 57434e249aba93f3b478a3c701e260093711d13f Author: Behdad Esfahbod Date: Thu Apr 12 17:45:33 2007 -0400 [xlib] Turn metrics-hinting on by default src/cairo-xlib-screen.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8a4c108a4be6c4650cefe80e68d4c9974ccc27ba Author: Chris Wilson Date: Thu Apr 12 22:19:03 2007 +0100 Add a reference count to cairo_xlib_screen_info_t Due to the interaction between multiple threads showing glyphs and asynchronous CloseDisplays, it is possible for a font to maintain a cairo_xlib_screen_info_t beyond the CloseDisplay. The simple solution is to add a reference count in order to track the lifetime of the cairo_xlib_screen_info_t correctly. src/cairo-xlib-private.h | 6 +++ src/cairo-xlib-screen.c | 77 +++++++++++++++++++++++++++++++++++---------- src/cairo-xlib-surface.c | 4 ++ 3 files changed, 70 insertions(+), 17 deletions(-) commit 50ef5bcf7b5e6cc903f9247256fbd4439887ab5e Author: Carl Worth Date: Thu Apr 12 13:44:32 2007 -0700 Revert cairo_public_warn addition to cairo.h This new feature isn't appropriate for a minor cairo release, (we're between 1.4.2 and 1.4.4 right now), but will make a lot of sense during 1.5. The code being reverted here was originally added with the following commit: 46eab95698e101e41407778eda22089b508a8984 but this change reverts only the public-facing parts of it. configure.in | 11 ----------- src/cairo.h | 40 ++++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 31 deletions(-) commit 35bb2152c06ef2621b14a8b2153cc327be8b43a1 Author: Chris Wilson Date: Thu Apr 12 21:30:39 2007 +0100 Hold the scaled_font->mutex whilst operating on the shared members. Obey the locking rules whilst resetting the scaled_font after a CloseDisplay. src/cairo-xlib-surface.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 97d897a7475f540ad901cb2a2cd6885e885ee02a Author: Chris Wilson Date: Thu Apr 12 21:17:42 2007 +0100 cairo_xlib_close_display - drop the mutex whilst calling the hooks In order to avoid recursive dead-locks where whilst one thread holds the scaled font lock and is waiting on the XLockDisplay() another thread catches the CloseDisplay and then tries to acquire the scaled font lock, we drop the list mutex whilst processing the callbacks. src/cairo-xlib-screen.c | 33 ++++++++++++++++++++++++--------- 1 files changed, 24 insertions(+), 9 deletions(-) commit 13b0aa669fd9ce6abc930730a941782e2baba215 Author: Carl Worth Date: Thu Apr 12 13:29:56 2007 -0700 Rebuild doc/public/Headers.mk Add a sort so that future update changes will be more legible. doc/public/Headers.mk | 47 ++++++++++++++++++++++++----------------------- doc/public/Makefile.am | 3 ++- 2 files changed, 26 insertions(+), 24 deletions(-) commit ae80d375f829b076a8d1450c54b00b3750428366 Author: Carl Worth Date: Thu Apr 12 13:02:26 2007 -0700 Rename cairo-mutex-list.h to cairo-mutex-list-private.h Also add it (and cairo-mutex-private.h) to Makefile.am where they should have been. src/Makefile.am | 2 + src/cairo-mutex-list-private.h | 50 ++++++++++++++++++++++++++++++++++++++++ src/cairo-mutex-list.h | 50 ---------------------------------------- src/cairo-mutex-private.h | 2 +- src/cairo-mutex.c | 2 +- 5 files changed, 54 insertions(+), 52 deletions(-) commit 29adf591b7026092a809e9a27878b5b4e35051fb Author: Carl Worth Date: Thu Apr 12 12:47:27 2007 -0700 move show-glyphs-many to the DISABLED_TESTS list And add a detailed comment explaining the reasons for disabling each test in the list. test/Makefile.am | 62 +++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 43 insertions(+), 19 deletions(-) commit c5b2f9d5c22c2259a11f0cbfbca8128cd3ac5794 Author: Chris Wilson Date: Thu Apr 12 01:22:49 2007 +0100 cairo_xlib_screen_info_t - always perform an exact match This ensures that only one cairo_xlib_screen_info_t holds the close_display_hooks, an assumption used later. src/cairo-xlib-screen.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8c9f0f607b992c47b555b5eaff3c599a8c1eac57 Author: Chris Wilson Date: Thu Apr 12 01:21:03 2007 +0100 cairo-xlib-screen - avoid dereferencing a NULL screen. Do not initialize font options when setting up the cairo_xlib_screen_info_t corresponding to the display itself and not associated with any screen. This avoids a potential NULL dereferences. (Fixes https://bugs.freedesktop.org/show_bug.cgi?id=10517) src/cairo-xlib-screen.c | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit dc1de86680b59def00ce1e9f11997cf554cdfec1 Author: Behdad Esfahbod Date: Thu Apr 12 15:06:37 2007 -0400 [ROADMAP] Add cairo_object_t ROADMAP | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 12b962d648d307d7a6b94035b6c4ffdeaadd68e2 Author: Behdad Esfahbod Date: Thu Apr 12 14:56:36 2007 -0400 [ROADMAP] Mark bug #5777 as fixed ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e391d3eaee65d65f267f86d1ef1e1fd8898e6556 Author: Behdad Esfahbod Date: Thu Apr 12 14:42:41 2007 -0400 [test] Disable text-glyph-range that was crashing Disabled tests are defined in DISABLED_TESTS. This has the benefit that they will still be buildable and be shipped. Just not run by default. test/Makefile.am | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit d3c7942fb271fe8d1df7ca3205b41601abdcb5c8 Author: Behdad Esfahbod Date: Thu Apr 12 14:22:02 2007 -0400 [pixman] Mark some small functions that are called per-pixel inline These uses were introduced in the previous commit. pixman/src/fbcompose.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit e3b3d22999a130f7017e8e20a432a0d8a7f48f3b Author: David Reveman Date: Thu Apr 12 14:14:12 2007 -0400 [pixman] Fix fbcompose.c that was broken for some composite operations (#5777) pixman/src/fbcompose.c | 244 ++++++++++++++++++++++++++++++------------------ 1 files changed, 151 insertions(+), 93 deletions(-) commit c8d2d1e8764c7ba754e46a3af68af2b4460d2e04 Author: Vladimir Vukicevic Date: Thu Apr 12 10:51:17 2007 -0700 add licenses to test files test/composite-integer-translate-over-repeat.c | 26 ++++++++++++++++++++++++ test/composite-integer-translate-source.c | 26 ++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 0 deletions(-) commit e240048a14333d5c61a0d4ae5c30acd12bcb5805 Merge: 29a1fe1... 977a898... Author: Michael Emmel Date: Wed Apr 11 21:43:15 2007 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit 29a1fe12cf33a68713a4ddf7f59217fd40f6e967 Author: Michael Emmel Date: Wed Apr 11 21:42:57 2007 -0700 Fixed compile error from missing directfb.h include src/cairo-directfb.h | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 977a8982ab17760af0d69cb2e018ed50f4c7b992 Author: Kristian Høgsberg Date: Wed Apr 11 23:49:01 2007 -0400 Add missing copyright notice. test/pixman-rotate.c | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+), 0 deletions(-) commit 9193b29645ef1625a599471e3b0cb5279d2c05cb Author: Behdad Esfahbod Date: Wed Apr 11 23:30:31 2007 -0400 [ROADMAP] Mark done items ROADMAP | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 284edb86484de8ccf3adf35d5cb9ff6ba64759ec Author: Chris Wilson Date: Thu Apr 12 03:01:31 2007 +0100 Do not raise an error if we fail to locate 'find' or 'xargs' Whilst not being able to delete all of the test output is messy it is however not fatal, so do not abort configuration simply because we cannot find either program. configure.in | 6 ++---- test/Makefile.am | 15 +++++++++------ 2 files changed, 11 insertions(+), 10 deletions(-) commit a8974223dc6376a11588c6ecf1e54da5329b9c72 Author: Chris Wilson Date: Thu Apr 12 02:29:33 2007 +0100 Check for find and xargs during configure Replace hard-coded find, xargs and rm with the paths determined during configure. This also gives us an opportunity to detect missing programs and inform the developer. configure.in | 9 +++++++++ test/Makefile.am | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) commit 632ec8088cef5e9d4c2ff2886cfd550d706433e4 Author: Behdad Esfahbod Date: Wed Apr 11 20:18:11 2007 -0400 [test] Add copyright headers for my tests test/extend-pad.c | 26 ++++++++++++++++++++++++++ test/surface-pattern-scale-down.c | 26 ++++++++++++++++++++++++++ test/surface-pattern-scale-up.c | 26 ++++++++++++++++++++++++++ test/surface-pattern.c | 26 ++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 0 deletions(-) commit 82397a631410af343f14cafdb31f48de9373f4a7 Author: Chris Wilson Date: Thu Apr 12 00:55:04 2007 +0100 Avoid using GNU find extensions. Replace the complex single find with a series of simple but POSIX correct equivalents. test/Makefile.am | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) commit 06382092e5e911ad2648f26e8ba5a6f8f7953e1b Author: Behdad Esfahbod Date: Wed Apr 11 19:42:34 2007 -0400 [pdiff] Ship gpl.txt test/pdiff/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c8645c85de94b83fe2fd60a4d881cb639eb79b46 Merge: be98123... 52435e9... Author: Carl Worth Date: Wed Apr 11 16:38:46 2007 -0700 Merge branch 'master' of git.cairographics.org:/git/cairo into cairo commit 52435e99f31f06c18273a5a7351a2c21f7c0ecf6 Author: Chris Wilson Date: Wed Apr 11 23:34:24 2007 +0100 Move pixman_format_t from heap to stack allocations. pixman_format_t is a simple structure used in short-term allocations and suitable for on-stack allocation. Killing the pixman_format_create()/pixman_format_destroy() pairs avoid around 6% of the allocations during cairo-perf (e.g. 426,158 allocs out of a total of 7,063,469). pixman/src/icformat.c | 118 +++++++++++++++------------ pixman/src/icint.h | 12 +--- pixman/src/icrect.c | 2 +- pixman/src/ictrap.c | 36 +++----- pixman/src/ictri.c | 199 +++++++++++++++------------------------------ pixman/src/pixman.h | 27 ++++--- src/cairo-image-surface.c | 103 ++++++++++-------------- 7 files changed, 202 insertions(+), 295 deletions(-) commit be98123b2c30a3102629afff74b9233c18e0535d Merge: efedf57... a6506c6... Author: Carl Worth Date: Wed Apr 11 16:02:08 2007 -0700 Merge cached-scaled-font-in-error into cairo Conflicts: src/cairo-scaled-font.c commit a6506c67f24331c703dd56502a1bc4504b7b2311 Author: Chris Wilson Date: Sun Apr 8 23:27:52 2007 +0100 Don't return scaled fonts in the error state from the cache. It is possible for a scaled_font to be flagged as in error, though only through a "true error" e.g. a malloc failure. However, when returning a font from the cache it should not be in error. So if we find a error font in the cache we remove it and return a new font. src/cairo-scaled-font.c | 55 +++++++++++++++++++++++++++------------------- 1 files changed, 32 insertions(+), 23 deletions(-) commit efedf57f43540ad79eddcc5ee79dc0d86846891e Author: Carl Worth Date: Wed Apr 11 15:25:18 2007 -0700 cairo-truetype-subset.c: Add missing error checks and propagation These are all to satisfy new warnings caused by the preceding commit, (which added cairo_warn to various function tables). While fixing the propoagation, fix functions to declare a return type of cairo_status_t instead of int. src/cairo-truetype-subset.c | 178 +++++++++++++++++++++++++++++-------------- 1 files changed, 120 insertions(+), 58 deletions(-) commit e6ca34e718859b40dc8eb75a6c68b056751a6deb Author: Chris Wilson Date: Sun Apr 8 22:59:10 2007 +0100 Mark function tables with attribute(warn_unused_result) src/cairo-paginated-surface-private.h | 2 +- src/cairoint.h | 52 ++++++++++++++++---------------- 2 files changed, 27 insertions(+), 27 deletions(-) commit 3bc413343a0b846c9501ee870db0424412aea701 Author: Chris Wilson Date: Wed Apr 11 01:08:17 2007 +0100 Define cairo_public_warn in terms of cairo_public. By defining cairo_public_warn as an extension of cairo_public, the programmer need only to override cairo_public in order to export the complete API for different architectures i.e. existing configurations will continue to work with no alterations. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 54134dd901d6dc94aa56d45486223e7d4f6ba569 Author: Chris Wilson Date: Tue Apr 10 23:09:13 2007 +0100 Only enable warn-unused-result for recent gcc The attribute was introduced with gcc-3.4, but the ability to suppress warnings from misapplied attributes (-Wno-attributes) was only introduced later. Without the supression, gcc will emit tens of warnings for each compilation completely drowning the real errors that the programmer must see. configure.in | 19 +++++++++++++++++-- pixman/src/pixman.h | 10 +++++++--- src/cairoint.h | 13 ++++++------- 3 files changed, 30 insertions(+), 12 deletions(-) commit f53c2b418cb4a36fbc1c30cdb1bf0ba9dba77bd0 Author: Chris Wilson Date: Mon Apr 9 16:24:11 2007 +0100 _pixman_create_source_image() - check for malloc failure Fix an unchecked malloc by propagating the NULL pointer up to its callers, which were already checking for failures. pixman/src/icimage.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit d0745c08b782d79fc7ccfd59cab0ae841a56c428 Author: Adrian Johnson Date: Thu Apr 12 06:32:29 2007 +0930 PDF: Fix glyph positioning bug when glyphs are not horizontal Bug reported in http://lists.freedesktop.org/archives/cairo/2007-April/010337.html src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e36794ad34282a4d671d7cc5527e9c650c2736fe Merge: b692472... b745126... Author: Carl Worth Date: Wed Apr 11 13:15:57 2007 -0700 Merge branch 'warn-unused-result' into cairo commit b745126a04c126acc695e8abb6372c1890b03f07 Author: Chris Wilson Date: Wed Apr 11 12:26:21 2007 +0100 Use find | xargs to overcome shell command line limit. Once again we have hit the command line limit with the sheer volume of generated test output. So replace the glob with a find which has the additional advantage of only needing to walk the tree once to generate the file lists - this begins to be noticeable with such large directories. test/Makefile.am | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) commit 61b8e346135f8b61b22257541c97b9f262c17826 Author: Chris Wilson Date: Wed Apr 11 11:59:27 2007 +0100 Unexport fbSolidFillmmx and fbCopyAreammx. By unexporting these function we have exact control over their call sites and so can convert the initial guards into asserts which transforms the two functions to return unconditional success and hence conversion to void. pixman/src/fbmmx.c | 215 +++++++++++++++++++++------------------------ pixman/src/fbmmx.h | 19 ---- pixman/src/pixman-remap.h | 1 - 3 files changed, 101 insertions(+), 134 deletions(-) commit efee2087387ba49e36d8d6104c4e2dd3ffeba081 Author: Chris Wilson Date: Wed Apr 11 11:26:27 2007 +0100 Propagate errors up through pixman_composite_trapezoids() Change the return type to indicate errors detected during pixman_composite_trapezoids() and add checking for failures during region ops. pixman/src/ictrap.c | 37 +++++++++++++++++++++---------------- pixman/src/pixman.h | 2 +- 2 files changed, 22 insertions(+), 17 deletions(-) commit bec097b5e281fcf2453de53946e89c13b37ecd1a Author: Chris Wilson Date: Wed Apr 11 11:13:30 2007 +0100 Propagate region errors from pixman_color_rects(). Region operations within pixman_color_rects can fail, so cleanup and propagate. pixman/src/icrect.c | 74 +++++++++++++++++++++++++++++++++----------- pixman/src/pixman.h | 4 +- src/cairo-image-surface.c | 6 ++- 3 files changed, 61 insertions(+), 23 deletions(-) commit 909334ee00701e18b2f2033b1c3a27714ce988fb Author: Chris Wilson Date: Wed Apr 11 10:45:55 2007 +0100 FbClipImage* should check for errors during region operations. Propagate the error from pixman_region_intersect(). pixman/src/icimage.c | 18 ++++++++++++++---- 1 files changed, 14 insertions(+), 4 deletions(-) commit 5b67efcbd8acad60080129e0a8a307671b18b4fc Author: Chris Wilson Date: Wed Apr 11 10:38:09 2007 +0100 Propagate region failures during pixman_image_set_clip_region(). Operating on regions can fail so check the status and return an error, after any necessary cleanup. pixman/src/icimage.c | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) commit e1abc3c26dd797ba9a888362713c5e5c1257867b Author: Chris Wilson Date: Wed Apr 11 09:51:58 2007 +0100 Provide a private entry point for cairo_scaled_font_status(). Add slim_hidden* markup for cairo_scaled_font_status() as we now use it internally. src/cairo-scaled-font.c | 1 + src/cairoint.h | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit 054c28a09de2c8ec2dc7111d786bca41a94f5a83 Author: Carl Worth Date: Wed Apr 11 02:26:08 2007 -0700 boilerplate: Add error checking for cairo_surface_write_to_png boilerplate/cairo-boilerplate.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit 0a54ca2d2340c55896ee6951efe6917322813431 Author: Carl Worth Date: Wed Apr 11 02:22:22 2007 -0700 boilerplate: Add error checking for cairo_surface_set_user_data boilerplate/cairo-boilerplate.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-) commit 5661de9e1c93bd548b400de2619b6de6133d6483 Author: Carl Worth Date: Wed Apr 11 02:08:36 2007 -0700 SVG: Add missing error checking for calls to _cairo_output_stream_destroy src/cairo-svg-surface.c | 28 +++++++++++++++++++++------- 1 files changed, 21 insertions(+), 7 deletions(-) commit 8d5aa0fb8d3ac6302dd5e832425f3285ad84280a Author: Carl Worth Date: Wed Apr 11 02:03:10 2007 -0700 SVG: Add missing error checks and propagation The function calls that get the new treatment here are: _cairo_meta_surface_replay _cairo_surface_show_page _cairo_array_append all within _cairo_svg_surface_emit_meta_surface src/cairo-svg-surface.c | 39 +++++++++++++++++++++++++++++---------- 1 files changed, 29 insertions(+), 10 deletions(-) commit 9c810625e796704e32e76caae18d2129219f46db Author: Carl Worth Date: Wed Apr 11 01:55:59 2007 -0700 PDF: Added error checking and propagation for _cairo_array_append src/cairo-pdf-surface.c | 89 +++++++++++++++++++++++++++++----------------- 1 files changed, 56 insertions(+), 33 deletions(-) commit 5ae82deb6942fae1515740551c71e9eb24750a7c Author: Carl Worth Date: Wed Apr 11 01:47:21 2007 -0700 PS: Add missing check for return value of _cairo_meta_surface_replay Here we have to change the return type of a couple of functions in order to propagate the error condition. src/cairo-ps-surface.c | 25 ++++++++++++++++++++----- 1 files changed, 20 insertions(+), 5 deletions(-) commit 8c31cca2af11c544a6028bf42c2187625b978f56 Author: Carl Worth Date: Wed Apr 11 01:42:02 2007 -0700 PS: Add missing checks for return value of _cairo_pattern_get_extents Propagation is extremely straightforward in this case. src/cairo-ps-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 01ac5f1aea298434b617d935512e2e72033989fd Author: Carl Worth Date: Wed Apr 11 01:35:11 2007 -0700 Assert that cairo_matrix_invert succeeds rather than ignoring tis return value This assertion is safe as an internal consistency check thanks to the recent checks added to cairo_pattern_set_matrix. src/cairo-pdf-surface.c | 4 +++- src/cairo-ps-surface.c | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) commit bd0b328f7e07b3a292190aef6f82622800230f6f Author: Carl Worth Date: Tue Apr 10 22:55:00 2007 -0700 test/invalid-matrix: Add new test to exercise CAIRO_STATUS_INVALID_MATRIX paths This new test exercises every path where the user might possibly pass in an invalid matrix. Currently the test fails if no error is reported. Also, if an incorrect error is reported, (such as CAIRO_STATUS_NO_MEMORY instead of CAIRO_STATUS_INVALID_MATRIX), this is logged as a warning in invalid-matrix.log, but the test still passes. It would still be worthwhile to follow up quickly and fix those cases to propagate the correct error value. test/.gitignore | 1 + test/Makefile.am | 1 + test/invalid-matrix.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+), 0 deletions(-) commit a6186604f794f2746089abc9c1716384c23aafc4 Author: Carl Worth Date: Tue Apr 10 22:52:37 2007 -0700 cairo_pattern_set_matrix: Validate that matrix is invertible If not, set an error in the pattern. src/cairo-pattern.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 8e72852f0b9f2cd8558eb6c11acb326e73fceb12 Author: Carl Worth Date: Tue Apr 10 22:51:44 2007 -0700 _cairo_gstate_ensure_scaled_font: Add missing propagation for error hiding inside the scaled_font src/cairo-gstate.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 2f1221e0f225f305c3f9c8e7311fe8f3fecab34b Author: Carl Worth Date: Tue Apr 10 22:50:46 2007 -0700 _cairo_gstate_ensure_scaled_font: Prefer to treat a pointer as a pointer, not a Boolean value src/cairo-gstate.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit dca69f73e3a11d397a701f82331d5aaa7194bd7f Author: Carl Worth Date: Tue Apr 10 17:16:39 2007 -0700 Check (and assert) return values of cairo_matrix_invert Now that we have matrix validation at the time of _cairo_scaled_font_init we know that it is safe to invert this matrix. src/cairo-pdf-surface.c | 5 ++++- src/cairo-ps-surface.c | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) commit 4ce2b62bcea49eccc0a4ee3781a115e4a34d3ad4 Author: Carl Worth Date: Tue Apr 10 17:12:51 2007 -0700 _cairo_scaled_font_init: Detect an invalid matrix and return an error. Also fix all callers to notice and propagate the error, (though some paths will still lose the CAIRO_STATUS_INVALID_MATRIX value due to a return value of NULL at one point). src/cairo-atsui-font.c | 9 +++++++-- src/cairo-scaled-font.c | 24 +++++++++++++++++------- src/cairo-win32-font.c | 10 ++++++---- 3 files changed, 30 insertions(+), 13 deletions(-) commit fd8c1e4dc851dd4ce8f84a3e47abdc4906c83b0f Author: Carl Worth Date: Tue Apr 10 16:43:50 2007 -0700 Fix cairo_scaled_font_create to return a nil scaled font, not NULL src/cairo-scaled-font.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 0f0ed88ee26f22c1b0e0ec7c95b8a258d137dde4 Author: Carl Worth Date: Tue Apr 10 23:01:55 2007 -0700 paginated: Add missing error check for _cairo_surface_show_page Fixing this uncovered a leak of a CAIRO_INT_STATUS_UNSUPPORTED value up to cairo_show_page, (and similarly to cairo_copy_page). There was really no good reason for _cairo_surface_show_page and _cairo_surface_copy_page to be returning cairo_int_status_t. Fix this by simply handling the UNSUPPORTED return at the surface layer instead of the gstate layer. src/cairo-gstate.c | 20 ++------------------ src/cairo-paginated-surface.c | 4 +++- src/cairo-surface.c | 16 ++++++---------- src/cairoint.h | 4 ++-- 4 files changed, 13 insertions(+), 31 deletions(-) commit 381f0bcafc86cefa665368cbbe2026adda1d98c9 Author: Carl Worth Date: Tue Apr 10 16:33:34 2007 -0700 paginated: Add missing error check for _cairo_surface_get_extents src/cairo-paginated-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 41911002d754f187618ab310ab93c85c4b038943 Author: Carl Worth Date: Tue Apr 10 16:32:09 2007 -0700 test-meta-surface.c: Fix memory leak on error recovery path. src/test-meta-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit d954e4c1488c6478852dcc02641e66df1d4e9317 Author: Carl Worth Date: Tue Apr 10 16:31:21 2007 -0700 Fix indentation of CLEANUP_IMAGE label. src/cairo-paginated-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c011c37ba086f0c8d0dac6437318822927543955 Author: Carl Worth Date: Tue Apr 10 16:30:43 2007 -0700 paginated: Fix missing errors checks for _cairo_meta_surface_replay src/cairo-paginated-surface.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) commit e73a55ad3cc30b0ea69379b12283515523015751 Author: Carl Worth Date: Tue Apr 10 14:17:42 2007 -0700 cairo-truetype-subset: Fix missing error propagation src/cairo-truetype-subset.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 97b8fd8117160cfea9864c81cbb8a06b321618f1 Author: Carl Worth Date: Tue Apr 10 14:16:01 2007 -0700 cairo-truetype-subset: Check resturn value from _cairo_array_append and propagate src/cairo-truetype-subset.c | 28 ++++++++++++++++++++++++---- 1 files changed, 24 insertions(+), 4 deletions(-) commit 84639e563ddfbd70ca48dcde4d3631418fd1cd82 Author: Carl Worth Date: Tue Apr 10 14:11:43 2007 -0700 test-meta-surface: Add missing check for error from _cairo_surface_get_extents src/test-meta-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 866b2296b4a8b347011f1c8ae2e0f3a987a29d0c Author: Carl Worth Date: Tue Apr 10 14:09:56 2007 -0700 test-meta-surface: Add missing checks for errors from _cairo_meta_surface_replay src/test-meta-surface.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit ec1fc931257ff90fe190c52ed0a3bed9f218c350 Author: Carl Worth Date: Tue Apr 10 13:59:42 2007 -0700 Add missing error check of return value of _cairo_path_fixed_close_path src/cairo-ft-font.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 3d21037a8fb69bde0765871f53fe461ac397367e Author: Carl Worth Date: Tue Apr 10 13:57:41 2007 -0700 Add assertion check to quiet warn_unused_result warning. This is a somewhat useful internal consistency check. src/cairo-xlib-surface.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 2f468677160080e9dd1db52a2ad7ca4adbf48149 Author: Carl Worth Date: Tue Apr 10 13:53:58 2007 -0700 Rename _cairo_pdf_surface_emit_toUnicode_stream to eliminate StudlyCaps Obviously, the new name is _cairo_pdf_surface_emit_to_unicode_stream which is consistent with the to_unicode_stream identifiers already existing in the implementation. src/cairo-pdf-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit cc6c115e3c5b931be4ab0210ce7f8cecaccf6241 Author: Carl Worth Date: Tue Apr 10 13:51:46 2007 -0700 PDF: Check return value of _cairo_output_stream_destroy and propagate src/cairo-pdf-surface.c | 56 +++++++++++++++++++++++++++++----------------- 1 files changed, 35 insertions(+), 21 deletions(-) commit 8873928f09a78d3e6e8e57d5d4e0b94cf1f78ab7 Author: Carl Worth Date: Tue Apr 10 13:40:04 2007 -0700 PS: Add missing error checks for _cairo_output_stream_destroy src/cairo-ps-surface.c | 14 ++++++++++---- 1 files changed, 10 insertions(+), 4 deletions(-) commit ab5eccbbf6cc361e864e0d75c0299cf7b5d6122d Author: Carl Worth Date: Tue Apr 10 13:28:48 2007 -0700 Make _cairo_clip_reset void Yet another unconditionally successful function---so it's easier to return nothing. src/cairo-clip-private.h | 2 +- src/cairo-clip.c | 4 +--- src/cairo-gstate.c | 4 +++- src/cairo-meta-surface.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) commit 7a0ae5b7057798106b5e1a82431178f6c5f148e7 Author: Chris Wilson Date: Tue Apr 10 21:09:36 2007 +0100 Disable warnings for cairo_*_reference functions. This class of functions modify their argument and return it as a *convenience* for the caller. For example, within cairo a common idiom is: cairo_object_reference (new); cairo_object_unreference (this->obj); this->obj = new; which updates the member to the new object irrespective of whether the new object is the same as the one being replaced. Other issues arise with subtypes, as the return type is the parent's and so require more complicated handling to compile cleanly. Disabling the warning is therefore preferred over adding code which decreases readibility and reduces maintainability. We need to make the compiler work for us, not against us... src/cairoint.h | 26 +++++++++++++++----------- 1 files changed, 15 insertions(+), 11 deletions(-) commit b82e595449e6eebbe6024454aaaaee31e6c43c73 Author: Chris Wilson Date: Mon Apr 9 15:31:28 2007 +0100 pixman region operations can fail, propagate the error. Copying the clip region could fail, add error returns and propagate up the call stack. src/cairo-clip-private.h | 4 +- src/cairo-clip.c | 53 +++++++++++++++++++++++++++++++++------------- src/cairo-gstate.c | 14 +++++++++-- src/cairo.c | 2 +- src/cairoint.h | 2 +- 5 files changed, 53 insertions(+), 22 deletions(-) commit b0a256aaf3f0fd4491a28fca797aef1ef4b1251d Author: Carl Worth Date: Tue Apr 10 13:07:09 2007 -0700 Change _cairo_dtostr to have a void return type As previously implemented, there's no essential information in the return value from _cairo_dotostr, (the caller can simply use strlen to recompute the same value, which is what the only caller is already doing). There would be real information in a return value which would return the result from the call to snprintf for the case where the buffer is not large enough for the number being printed. src/cairo-output-stream-private.h | 2 +- src/cairo-output-stream.c | 5 +---- src/cairoint.h | 3 --- 3 files changed, 2 insertions(+), 8 deletions(-) commit 5303980f82431a9d084177998a68527b60610241 Author: Carl Worth Date: Tue Apr 10 12:56:56 2007 -0700 _cairo_output_stream_vprintf: Add assertion to detect internal inconsitency This will catch any inconsistency between the length of a single format specifier and the fixed size of the single_fmt buffer. src/cairo-output-stream.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) commit 97a69bc82e023d139d997ef69c7eba50d2708686 Author: Carl Worth Date: Tue Apr 10 12:13:27 2007 -0700 Fix mis-indented _cairo_dtostr src/cairo-output-stream.c | 64 ++++++++++++++++++++++---------------------- 1 files changed, 32 insertions(+), 32 deletions(-) commit 5c95800cded4e906baf8ddd10bfb4abc59151b13 Author: Carl Worth Date: Tue Apr 10 12:13:10 2007 -0700 Fix mis-indented _cairo_traps_init_box src/cairo-traps.c | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) commit 57188b4dcbcc2625dfc1817f8fe3b8ffeade5dc5 Author: Carl Worth Date: Tue Apr 10 12:06:09 2007 -0700 Fix cairo_traps_t status handling Add a _cairo_traps_status function and use it instead of adding error checks to callers of _cairo_traps_add_trap and _cairo_traps_add_trap_from_points, (both of which are now given a void return type). src/cairo-bentley-ottmann.c | 14 +++++++------- src/cairo-traps.c | 24 ++++++++++++++---------- src/cairoint.h | 5 ++++- 3 files changed, 25 insertions(+), 18 deletions(-) commit 67bc608603b9baf8de8bcd2fedcf8ec315432a37 Author: Carl Worth Date: Tue Apr 10 11:11:32 2007 -0700 Add missing error checking to _trace_mask_to_path Note: It looks like it would be convenient to shove a status value into cairo_path_fixed_t to reduce this sequence of error checks. But I tried that first, and it actually makes things worse overall due to many things like _cairo_path_fixed_move_to called by cairo_move_to where the result must be immediately checked anyway. So I've already rejected that approach. src/cairo-scaled-font.c | 54 +++++++++++++++++++++++++++++++++++----------- 1 files changed, 41 insertions(+), 13 deletions(-) commit b1086caf3b108b0df19f70a2b6df161ad51bb280 Author: Carl Worth Date: Tue Apr 10 10:45:15 2007 -0700 Add a status field to cairo_polygon_t Now, the functions to add new data to a polygon all become void, and there's a new _cairo_polygon_status call to query the status at the end of a sequence of operations. With this change, we fix many callerswhich were previously not checking the return values of _cairo_polygon functions by adding only a single call to _cairo_polygon_status rathern than several new checks. src/cairo-path-fill.c | 36 ++++++++------------------- src/cairo-path-stroke.c | 8 +++++- src/cairo-pen.c | 9 ++++--- src/cairo-polygon.c | 60 +++++++++++++++++++++++++--------------------- src/cairoint.h | 11 ++++++-- 5 files changed, 64 insertions(+), 60 deletions(-) commit bff45ec9f90b5949a8ffa19cb03c140a08119e4d Author: Carl Worth Date: Mon Apr 9 17:44:12 2007 -0700 Invert condition to more intuitive form. The idiom for checking the return value of malloc is: if (pointer == NULL) { ... } rather than: if (pointer != NULL) { ... } src/cairo-pattern.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit 01955a6e82ee28dd1377a3f2242aa2ddeebadac9 Author: Carl Worth Date: Mon Apr 9 17:42:04 2007 -0700 Rename ARRAY_LEN to ARRAY_LENGTH Yet another victim in my hunt against abbreviations within cairo's implementation. src/cairo-arc.c | 2 +- src/cairo-atsui-font.c | 4 ++-- src/cairo-bentley-ottmann.c | 2 +- src/cairo-cff-subset.c | 6 +++--- src/cairo-hash.c | 2 +- src/cairo-pattern.c | 8 ++++---- src/cairo-polygon.c | 2 +- src/cairo-spline.c | 4 ++-- src/cairo-surface.c | 2 +- src/cairo-svg-surface.c | 2 +- src/cairo-traps.c | 2 +- src/cairo-truetype-subset.c | 6 +++--- src/cairoint.h | 4 ++-- 13 files changed, 23 insertions(+), 23 deletions(-) commit d317e8175de04c73c4a1f84db4a7e5354411ca06 Author: Carl Worth Date: Mon Apr 9 17:38:17 2007 -0700 Prefer FALSE over 0 for initializing a cairo_bool_t value src/cairo.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 9a33dab96988b94940a917921accc1bf19960a53 Author: Carl Worth Date: Mon Apr 9 17:37:30 2007 -0700 Fix an incorrectly indented condition src/cairo-xlib-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 4bfc8c98ccf29fc11d11ee35996be9aab5a63f36 Author: Carl Worth Date: Mon Apr 9 17:36:41 2007 -0700 ATSUI: Fix broken error checks for NULL surface The cairo_image_surface_create function never returns NULL so the previous error checks would never have triggered. The correct approach is to check the result of cairo_surface_status(). src/cairo-atsui-font.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) commit bd98295100ce84a9dfffd16bc6e50ef0ced4d4bc Author: Carl Worth Date: Mon Apr 9 17:30:06 2007 -0700 Add a couple of missing newline characters A return statement that's not at the end of a function really needs a line of whitespace after it. src/cairo-bentley-ottmann.c | 1 + src/cairo-type1-fallback.c | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit a7d8e52cc4be2376429f567abc2be853da7d5fbc Author: Carl Worth Date: Mon Apr 9 17:24:18 2007 -0700 Cleanup multi-line if condition The standard idiom of assigning to a local status variable looks much, much nicer here. src/cairo-path.c | 20 +++++++++++--------- 1 files changed, 11 insertions(+), 9 deletions(-) commit 7c97696af98a6dab9e0c5cdc72ff08c19892c95f Author: Carl Worth Date: Mon Apr 9 17:16:30 2007 -0700 Make _cairo_path_bounder_add_point void Yet another function that cannot fail under any circumstances. src/cairo-path-bounds.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) commit 93776772edbadeab90ea199a115750310be91e4e Author: Carl Worth Date: Mon Apr 9 17:15:33 2007 -0700 Make _cairo_matrix_compute_scale_factors void Yet another function that cannot fail under any circumstances. src/cairo-matrix.c | 4 +--- src/cairoint.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) commit d5b35d7d7666634f1f98d6c0141a2a29976e7e2f Author: Carl Worth Date: Mon Apr 9 17:12:11 2007 -0700 Make _cairo_pen_init_empty void Yet another function that cannot fail under any circumstances. src/cairo-pen.c | 4 +--- src/cairoint.h | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) commit 9077da99abd163ebd0c52e8375e6f40ce60cf7d2 Author: Carl Worth Date: Mon Apr 9 17:09:51 2007 -0700 Make _cairo_gstate_user_to_device (and friends) void. This is just multiplication after all, so there's nothing that can fail. And we can get rid of a lot of useless error-checking code this way. The corrected functions are: _cairo_gstate_user_to_device _cairo_gstate_user_to_device_distance _cairo_gstate_device_to_user _cairo_gstate_device_to_user_distance src/cairo-gstate.c | 16 +++---------- src/cairo.c | 62 +++++++++++++++------------------------------------ src/cairoint.h | 8 +++--- 3 files changed, 26 insertions(+), 60 deletions(-) commit 628ec8eb91fb246b8a44be3451163a5d8592a860 Author: Carl Worth Date: Mon Apr 9 17:03:29 2007 -0700 Make _cairo_gstate_identity_matrix void Now that we have the warn_unused_result attribute enabled, (thanks Chris!), it's actually harmful to have a function return an uncoditional value of CAIRO_STATUS_SUCCESS. The harm is that it would force lots of unnecessary error-checking paths that just add clutter. It is much better to simply give a function that cannot fail a return type of void. src/cairo-gstate.c | 9 ++------- src/cairo.c | 6 +----- src/cairoint.h | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) commit 90803eca0fa8d49c54c465580707009aae382d28 Author: Chris Wilson Date: Wed Apr 4 11:17:23 2007 +0100 Implement clone_surface for test-fallback-surface. A few tests were failing due to clip_init_deep_copy() not being able to clone the target surface. Before propagating the failure, this was being silently ignored. Copy the simple implementation from cairo-image-surface. src/test-fallback-surface.c | 22 +++++++++++++++++++++- 1 files changed, 21 insertions(+), 1 deletions(-) commit 4456ecbf2694f0b71a431353e0dea0515b72926b Author: Chris Wilson Date: Sun Apr 8 23:40:31 2007 +0100 Fix detection of FcFini(). It is customary to check for a FontConfig function in the FontConfig library rather than the FreeType library. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cd2394c076e2f6b14a9a3281461026b811692f2e Author: Chris Wilson Date: Tue Apr 3 21:50:15 2007 +0100 Free the bitmap->buffer on failure Currently if the ownership of the bitmap->buffer is passed to _get_bitmap_surface() then the status of the buffer is inconsistent should the function detect an error (i.e. CAIRO_STATUS_NO_MEMORY). Fix it up that should we encounter an error and we own the buffer then we always free it on behalf of the caller. src/cairo-ft-font.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit ac33953a81114dddc25ceb57f6df57e01d4d937b Author: Chris Wilson Date: Sun Apr 8 23:37:29 2007 +0100 Correct handling of a malloc failure during pattern_create_in_error() Confusion had been introduced as to who provided the fixup after the malloc failed which resulted in a NULL deference whilst checking for an erroneous pattern in _cairo_pattern_create_in_error. src/cairo-pattern.c | 24 ++++++------------------ 1 files changed, 6 insertions(+), 18 deletions(-) commit b6924722b8c8e5f4356d3c8ba438a702ffb8a5ed Author: Behdad Esfahbod Date: Sun Apr 8 23:35:01 2007 -0400 [cairo-skiplist] Use one random number per insertion, instead of two src/cairo-skiplist-private.h | 3 +++ src/cairo-skiplist.c | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit ce1651f1ea57b53ad91f5115524d33f6424d5797 Author: Chris Wilson Date: Tue Apr 3 16:53:17 2007 +0100 Free the pixman_image if we fail to wrap it with a surface. src/cairo-image-surface.c | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) commit bd99507f15dd8a2d162f13e691cc5f8d71795577 Author: Chris Wilson Date: Fri Mar 30 14:00:50 2007 +0100 Initialise cairo_spline_t to use its embedded buffer. Currently the code defaults to setting its points to NULL and fixing it up on the first add_point() to use the embedded buffer. Skip this extra step by initialising points to the embedded buffer. src/cairo-spline.c | 24 +++++++----------------- 1 files changed, 7 insertions(+), 17 deletions(-) commit 6daaf8a89d24fb3022687fe8d52c8001dc270265 Author: Behdad Esfahbod Date: Sun Apr 8 23:32:27 2007 -0400 [cairo-skiplist] Reduce MAX_LEVEL from 31 to 15 The probability that a node of level L is generated is 0.25^(L-1) * 0.75. It means, a node of level 15 or more will be used with a probability of about 3 * 10^-9. That's really rare... Actually that's not still true, because the level of a new node is capped by current max-level plus one. So to really get a node with a level of 15 one should first get a node of level 2, then 3, then 4, ..., finally 15. Now that's REALLY rare. And guess what, the skiplist only start behaving bad with a max level cap of MAX_LEVEL when having on the order of 4**MAX_LEVEL items in it. I really hope we don't get there. src/cairo-skiplist-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a7de9501f6d0f3a574c5246b81d78aa749b64e67 Author: Behdad Esfahbod Date: Sun Apr 8 23:24:50 2007 -0400 [cairo-skiplist] Group levels two-by-two in freelists Most memory allocators allocate in multiples of twice the size of a pointer. So there is no point in keeping freelists for both even and odd levels. We now round odd levels up to the next even level for freelist computations. This reduces the number of node mallocations. src/cairo-skiplist-private.h | 10 +++++++++- src/cairo-skiplist.c | 21 ++++++++++++++------- 2 files changed, 23 insertions(+), 8 deletions(-) commit b2280c5ac25e752c4462acdc8d2ded916fce7c34 Author: Chris Wilson Date: Fri Mar 30 11:24:18 2007 +0100 Do not overwrite cr->status The idiom for cairo.c is to do cr->status = _cairo_op (); if (cr->status) _cairo_set_error (cr, cr->status); Unfortunately a trivial mistake for a _cairo_op () is to call a cairo_op () and forget to check cr->status but return CAIRO_STATUS_SUCCESS which will mask the earlier error. Obviously this is a bug in the lower level but the impact can be reduced by chaning cairo.c to use a local status variable for its return: cairo_status_t status = _cairo_op (); if (status) _cairo_set_error (cr, cr->status); src/cairo.c | 537 +++++++++++++++++++++++++++++++++++------------------------ 1 files changed, 319 insertions(+), 218 deletions(-) commit 14ac5dd78b38aaaa118e8ac39fa50f485bff516d Author: Chris Wilson Date: Sun Apr 8 23:11:57 2007 +0100 Return the correct status from _cairo_pen_stroke_spline(). The return value is shared before the normal cleanup and error paths, so do not simply return a hard-coded CAIRO_STATUS_SUCCESS. src/cairo-pen.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b823e2f68ff613b2c4f537aba6bbbcf413412eb2 Author: Chris Wilson Date: Sun Apr 8 23:09:31 2007 +0100 cairo-xlib-surface - propagate status returns. These were found during a cairo_static pass on an alternative branch... A critical one in particular was setting the have added glyph flag to TRUE even if _cairo_xlib_surface_add_glyph() fails. This can cause an application crash due to a RenderBadGlyph error later when the scaled font is cleaned and we attempt to remove the glyph. src/cairo-xlib-surface.c | 44 +++++++++++++++++++++++++++++++------------- 1 files changed, 31 insertions(+), 13 deletions(-) commit 4a624b8e8b0a14dd03e551b28257d8a54b9ee6f6 Author: Chris Wilson Date: Thu Mar 29 13:36:07 2007 +0100 Remove the entry if we return an error code during _cair_hash_table_insert. Previously if we detected an error during resize we would report a failure to insert the entry into the hash table having already done so. src/cairo-hash.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 1cdb54f8835446b23769b7771445201a9b5d165e Author: Chris Wilson Date: Thu Mar 29 09:11:21 2007 +0100 Reorder cleanup cairo_xlib_surface_show_glyphs() _cairo_pattern_release_surface() asserts that it is passed a pattern surface. This itself is bad as breaks the symmetry with _cairo_pattern_acquire_surface under() error conditions, however reorder the cleanup to avoid this assertion. src/cairo-xlib-surface.c | 22 ++++++++++++---------- 1 files changed, 12 insertions(+), 10 deletions(-) commit a1331fb043051ac10f8555b2ad2fe85183db96df Author: Chris Wilson Date: Wed Mar 28 19:32:25 2007 +0100 Detect failure to allocate glyphs during _cairo_scaled_font_init() If _cairo_cache_create fails, return CAIRO_STATUS_NO_MEMORY. src/cairo-scaled-font.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 1237eedff3d557b94db9c940fd8de48be9ba41ba Author: Chris Wilson Date: Sun Apr 8 22:56:43 2007 +0100 Check for error whilst trying to advance along a text string. The text perf-case tries to fill the region with a single text string, but fails to detect when the current point does not advance due to an error. This causes the perf-case to enter an infinite loop, so we break out when the cairo_status() has been set. perf/text.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ea4945850ae3ce3614bcadc0fa413eb836344430 Author: Chris Wilson Date: Fri Mar 16 20:04:26 2007 +0000 Avoid using substituted surfaces for xlib operations. Detect when a substitute image surface is returned for a solid pattern, and avoid mixed image/xlib composite operations. This can happen for example if there is a resource allocation failure during creating a similar surface. src/cairo-xlib-surface.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 751976970bb0ec9b810c1f58a05d53b7bfb7d90f Author: Chris Wilson Date: Fri Mar 16 19:35:02 2007 +0000 Handle failure to allocate a GC. src/cairo-xlib-surface.c | 51 ++++++++++++++++++++++++++++++--------------- 1 files changed, 34 insertions(+), 17 deletions(-) commit c6055dc349c3f96e8d6f0e4166540871a59cb0e2 Author: Chris Wilson Date: Sun Apr 8 22:50:44 2007 +0100 Reset cairo_scaled_font_map after freeing. Along the error path the global font map was freed but not reset, causing segfaults on any subsequent use of a cairo_scaled_font_t. src/cairo-scaled-font.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 65de47d8bc7865c6bf6318fd7bd861acf4e4af05 Author: Chris Wilson Date: Sun Apr 8 22:47:19 2007 +0100 cairo-bentley-ottmann - check init for failure This was found during a cairo_static pass on an alternative branch... Add the trivial error propagation for _cairo_bo_event_queue_init() src/cairo-bentley-ottmann.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit b4cb0306b4415f2ddf0acd84043b72c8b8485726 Author: Chris Wilson Date: Wed Mar 28 15:55:06 2007 +0100 cairo-type1-fallback - propagate error returns Add status returns in order to propagate a matrix inversion failure up through the call stack. src/cairo-type1-fallback.c | 25 ++++++++++++++++++------- 1 files changed, 18 insertions(+), 7 deletions(-) commit b29d78dda169ee58b82cdbd04e3af2eedcc58edd Author: Chris Wilson Date: Wed Mar 28 15:43:37 2007 +0100 cairo-svg-surface - propagate some error returns Add status returns to functions in order to propagate an error up the call stack. For the emit_*_pattern we add a new status return even when when the functon return CAIRO_STATUS_SUCCESS unconditionally in order for the caller to handle all cases in a consistent manner. src/cairo-svg-surface.c | 56 +++++++++++++++++++++++++++++++---------------- 1 files changed, 37 insertions(+), 19 deletions(-) commit 3f7ca6ef5b09263607ff2f9862950393815c5d2c Author: Chris Wilson Date: Wed Mar 28 14:57:44 2007 +0100 cairo-pen - cairo_pen_init() can fail propagate its error. Add status returns in order to propagate an intialisation failure back up the call chain. src/cairo-path-stroke.c | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) commit 67f13b3518c5fc98d1e3fb184bc6c2f5ea96f4c9 Author: Chris Wilson Date: Sun Apr 8 21:54:41 2007 +0100 cairo-bentley-ottmann/skip-list - catch and propagate out-of-memory errors The skip list inserts could return NULL indicating an out-of-memory error. In order to handle this, propagate the error up the call stack. src/cairo-bentley-ottmann.c | 50 ++++++++++++++++++++++++++++++------------- src/cairo-skiplist.c | 2 + 2 files changed, 37 insertions(+), 15 deletions(-) commit 293122279fd87098a00386bb4c9310f3fc1bb373 Author: Chris Wilson Date: Sun Apr 8 21:50:48 2007 +0100 cairo-path-stroke - add trivial missing status checks Propagate the error status. src/cairo-path-stroke.c | 33 +++++++++++++++++++++++++-------- 1 files changed, 25 insertions(+), 8 deletions(-) commit 2f2bff038cb0e59865a0405b19da4805213d718e Author: Chris Wilson Date: Sun Apr 8 21:47:01 2007 +0100 buffer-diff - check for any errors whilst writing the png Propagate any errors from writing out the png. test/buffer-diff.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 79424fc64640db4b518eaf4a23477f1bbc26db5a Author: Chris Wilson Date: Sun Apr 8 21:45:58 2007 +0100 cairo - add missing status checks Add a few missing status checks and set the error on the context when applicable. src/cairo.c | 74 ++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 48 insertions(+), 26 deletions(-) commit a34a32fd99145733df9290f7c72bf7d9759e212b Author: Chris Wilson Date: Sun Apr 8 21:36:42 2007 +0100 cairo-type1-fallback - check for an error during cleanup The cleanup path is shared between the error path and the true path, and so any error along it can not be ignored. src/cairo-type1-fallback.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit d2efadc84d0716498cec0510916f5375fbb7acf0 Author: Chris Wilson Date: Sun Apr 8 21:35:28 2007 +0100 cairo-svg-surface - propagate error returns Add a couple of missing checks for error statues. src/cairo-svg-surface.c | 34 ++++++++++++++++++++++++---------- 1 files changed, 24 insertions(+), 10 deletions(-) commit 02264b40f5ab4831e52c0ad156471045c62c9e85 Author: Chris Wilson Date: Sun Apr 8 21:34:25 2007 +0100 cairo-surface-fallback - propagate error returns _cairo_surface_composite() can fail so check for and error return and propagate. src/cairo-surface-fallback.c | 44 ++++++++++++++++++++++++----------------- 1 files changed, 26 insertions(+), 18 deletions(-) commit 76b27fb0e81cc557c7348f6ba98b72552d781aed Author: Chris Wilson Date: Sun Apr 8 21:33:00 2007 +0100 cairo-ps-surface - add a couple of status checks Handle a couple more error returns. src/cairo-ps-surface.c | 54 +++++++++++++++++++++++++++-------------------- 1 files changed, 31 insertions(+), 23 deletions(-) commit 619425a8b3bff79fb453f4b84e3a8e75db369b40 Author: Chris Wilson Date: Sun Apr 8 21:29:19 2007 +0100 cairo-polygon - trivial propagation of error status _cairo_polygon_move_to() returns an error status so use it. src/cairo-polygon.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) commit 4b195779a465f69b035e9fd6695ef5c137a6b342 Author: Chris Wilson Date: Sun Apr 8 21:28:25 2007 +0100 cairo-pen - trivial propagation of error status Add a couple of missing checks for error statuses and correct the error path cleanup for _cairo_pen_stroke_spline(). src/cairo-pen.c | 24 +++++++++++++++++------- 1 files changed, 17 insertions(+), 7 deletions(-) commit 66d3e252025cf7f8a624fad83bffa1488a98910d Author: Chris Wilson Date: Sun Apr 8 21:26:33 2007 +0100 cairo-pdf-surface - propagate error status Catch and propagate any error status. src/cairo-pdf-surface.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) commit b32a5b1dc6d66a4477fb8df1461821a27192600f Author: Chris Wilson Date: Sun Apr 8 21:25:46 2007 +0100 cairo-pattern - propagate status Catch, cleanup and propagate after an error return. src/cairo-pattern.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit fd49bbb4b21b73247b4d391c2cb1b028a596f6eb Author: Chris Wilson Date: Sun Apr 8 21:24:59 2007 +0100 cairo-path - check for failure during _cairo_path_fixed_interpret Catch an error return from _cairo_path_fixed_interpret() and return it. Similary check for an error code in cairo_status() before returning success. src/cairo-path.c | 55 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 32 insertions(+), 23 deletions(-) commit 814830f63b72f69198e92564c53f2683e5bda269 Author: Chris Wilson Date: Sun Apr 8 21:22:56 2007 +0100 cairo-path-fill - trivial missing unused result Actually assign the result that is tested on the next line... src/cairo-path-fill.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7ab1f62c60141d5c0e989d55f4a49537a6b52c4d Author: Chris Wilson Date: Sun Apr 8 21:21:49 2007 +0100 cairo-paginated-surface - fix up the trivial unused result Check for status returns and propagate, cleaning up as necessary. src/cairo-paginated-surface.c | 22 ++++++++++++++++------ 1 files changed, 16 insertions(+), 6 deletions(-) commit 78c0d62ba7c650a6dc8137e6d1375e21f9477c2b Author: Chris Wilson Date: Sun Apr 8 21:20:42 2007 +0100 cairo-meta-surface - propagate trivial status return _cairo_path_fixed_init_copy() could fail so propagate it's status. src/cairo-meta-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 75cc5e04d5b854a1eefe116c2be4a3c2bb21d6ac Author: Chris Wilson Date: Sun Apr 8 21:19:49 2007 +0100 cairo-image-surface - propagate error returns from pixman. pixman does occasionally return an error - in such circumstances we should propagate it. src/cairo-image-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit dee9a53029bd3e42c60a855edfb54591bf1782b5 Author: Chris Wilson Date: Sun Apr 8 21:18:30 2007 +0100 cairo-gstate - fix the trivial unchecked returns Check for an error return and propagate. src/cairo-gstate.c | 17 +++++++++++++---- 1 files changed, 13 insertions(+), 4 deletions(-) commit de264af2c659b32c8bc71060da85037ac7e1d44f Author: Chris Wilson Date: Sun Apr 8 21:17:26 2007 +0100 cairo-ft-font - handle trivial failures Catch the status return, cleanup and propagate the error. src/cairo-ft-font.c | 82 +++++++++++++++++++++++++++++++++----------------- 1 files changed, 54 insertions(+), 28 deletions(-) commit 14c8dfb0b9bcc26a02057e5636d8bf35c3b4ef29 Author: Chris Wilson Date: Mon Apr 9 15:03:34 2007 +0100 cairo-clip - handle trivial pixman failures Detect the simple cases when pixman returns an error, ie an OOM condition, and propagate the error status. src/cairo-clip.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) commit 274c20c27a094c05afa62579cacb5749013abd60 Author: Chris Wilson Date: Sun Apr 8 21:14:09 2007 +0100 cairo-boilerplate - handle failure to set user data After failing to set the user data on a surface, clean up and return NULL. boilerplate/cairo-boilerplate.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit 46eab95698e101e41407778eda22089b508a8984 Author: Chris Wilson Date: Sun Apr 8 20:50:08 2007 +0100 Add attribute(warn_unused_result) This adds a compiler check that the function result is used by the caller and enables it by default for all cairo_private functions and for public API that returns a cairo_status_t. It has been discussed that to extend the warnings to all functions, a new function type could been introduced to cover static functions: cairo_static. This has not been done at the present time in order to minimise the churn and focus on the more common errors. In order to reduce the warning spew generated by gcc for invalid use of this attribute, -Wno-attributes is added to CFLAGS. This has the unfortunate side-effect of masking future warnings for all attributes - be warned! configure.in | 13 ++++++++++++- pixman/configure.in | 3 ++- pixman/src/pixman.h | 2 +- src/cairo.h | 40 ++++++++++++++++++++-------------------- src/cairoint.h | 8 +++++--- src/check-headers.sh | 2 +- 6 files changed, 41 insertions(+), 27 deletions(-) commit 9da86e4a386505288c3a933f30583abf7706c950 Author: Behdad Esfahbod Date: Sun Apr 8 22:56:30 2007 -0400 Add references to the skiplist paper BIBLIOGRAPHY | 8 ++++++++ src/cairo-skiplist-private.h | 6 ++++++ 2 files changed, 14 insertions(+), 0 deletions(-) commit ad0e13805c036941a03e49215b1bb525b4666033 Author: Behdad Esfahbod Date: Sun Apr 8 22:50:51 2007 -0400 [cairo-skiplist] Clarify MAX_LEVEL in comment, and adjust accordingly Reading the code, MAX_LEVEL is in fact what could have been named MAX_NUM_LEVELS. That is, it is maximum possible level plus one. All code is correct: it uses MAX_LEVEL as array size and never produces a level of MAX_LEVEL. The comment is fixed. src/cairo-skiplist.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e8072e6e0ac86b2b0baefb54dcc551ee548164af Author: Behdad Esfahbod Date: Sun Apr 8 22:03:46 2007 -0400 [test,perf] Make them rebuild boilerplate when src is changed perf/Makefile.am | 2 +- test/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 6f9309221704a799ca36917c65abfc0941119b13 Author: Behdad Esfahbod Date: Sun Apr 8 21:58:54 2007 -0400 Rename pixman_region_uninit to pixman_region_fini pixman/src/fbcompose.c | 2 +- pixman/src/fbpict.c | 2 +- pixman/src/icimage.c | 8 ++++---- pixman/src/icrect.c | 4 ++-- pixman/src/ictrap.c | 4 ++-- pixman/src/pixman-remap.h | 2 +- pixman/src/pixman.h | 2 +- pixman/src/pixregion.c | 2 +- src/cairo-clip.c | 12 ++++++------ src/cairo-glitz-surface.c | 4 ++-- src/cairo-surface-fallback.c | 6 +++--- src/cairo-surface.c | 4 ++-- src/cairo-traps.c | 2 +- 13 files changed, 27 insertions(+), 27 deletions(-) commit 4f8a04b1c93630c2556db5e3a0657076167e1ea3 Author: Behdad Esfahbod Date: Sun Apr 8 21:55:45 2007 -0400 [pixman-image] Simply initialization given that there is no clip pixman/src/icimage.c | 32 +++++++++----------------------- 1 files changed, 9 insertions(+), 23 deletions(-) commit df9ea31df5857ee7aacd6ba002881233e9c4a9b4 Author: Mathias Hasselmann Date: Thu Mar 15 14:42:13 2007 +0100 [pixman-region] Separate pixman_region_init Most of the time pixman_region_init is called without any extents, and followed by a pixman_region_union_rect, used to used to initialize rectangular regions. pixman_region_union_rect is not that cheap, but the sequence is called quite often. So it should be worth introducing a specialized and fast function for this sequence. This introduces pixman_region_init_rect. This new function makes _cairo_region_init_from_rectangle obsolete. Also removes the extent argument from pixman_region_init as it was called with NULL most of the time. A pixman_region_init_with_extents is added for the general case. pixman/src/fbcompose.c | 3 +-- pixman/src/fbpict.c | 3 +-- pixman/src/icimage.c | 25 +++++++++++-------------- pixman/src/icrect.c | 10 +++++----- pixman/src/ictrap.c | 6 ++---- pixman/src/pixman-remap.h | 2 ++ pixman/src/pixman.h | 7 ++++++- pixman/src/pixregion.c | 37 +++++++++++++++++++++---------------- src/cairo-clip.c | 18 ++++++++++-------- src/cairo-glitz-surface.c | 2 +- src/cairo-region.c | 25 ------------------------- src/cairo-surface-fallback.c | 7 +++---- src/cairo-surface.c | 16 ++++++---------- src/cairo-traps.c | 2 +- src/cairoint.h | 4 ---- 15 files changed, 70 insertions(+), 97 deletions(-) commit 9436959a838412b5336279c7d5c35bf4e586f984 Author: Mathias Hasselmann Date: Wed Mar 14 01:37:28 2007 +0100 Update function map pixman/src/pixman-remap.h | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) commit 99f4bfada807aa7062051bb81fd29d4d3a87fbd1 Author: Mathias Hasselmann Date: Wed Mar 14 01:35:40 2007 +0100 Remove abdoned pixman_region_{create,destroy} pixman/src/pixman.h | 6 ------ pixman/src/pixregion.c | 25 ------------------------- 2 files changed, 0 insertions(+), 31 deletions(-) commit 4532c023e0810c2e8d0d5928074bcae8865c5e14 Author: Mathias Hasselmann Date: Wed Mar 14 01:31:53 2007 +0100 Make clientClip region static, remove abdoned CT_PIXMAP code paths pixman/src/icimage.c | 208 ++------------------------------------------------ pixman/src/icimage.h | 2 +- pixman/src/icint.h | 2 +- 3 files changed, 9 insertions(+), 203 deletions(-) commit 65f269f3a4148a6cf3b2158ea893bb8452c3ad5e Author: Mathias Hasselmann Date: Wed Mar 14 01:24:11 2007 +0100 Avoid pixman_region_create in pixman_composite{,General} pixman/src/fbcompose.c | 32 ++++++++-------------- pixman/src/fbpict.c | 32 ++++++++-------------- pixman/src/icimage.c | 68 +++++++++++++++++------------------------------- 3 files changed, 48 insertions(+), 84 deletions(-) commit 82cc451148eec1703d001f2b814d5b3712d31727 Author: Mathias Hasselmann Date: Wed Mar 14 01:21:18 2007 +0100 Make clip regions of pixman_image_t static pixman/src/fbcompose.c | 38 ++++++++-------- pixman/src/icimage.c | 121 +++++++++++++++++++++++++++--------------------- pixman/src/icimage.h | 8 ++-- pixman/src/icrect.c | 7 ++- 4 files changed, 96 insertions(+), 78 deletions(-) commit 041371533746d4aae3245a74459c0b0d1a4628fb Author: Mathias Hasselmann Date: Wed Mar 14 00:59:36 2007 +0100 Avoid pixman_region_create in pixman_color_rects pixman/src/icrect.c | 32 ++++++++++++++++---------------- 1 files changed, 16 insertions(+), 16 deletions(-) commit 5a6ca4794bfd96026937cd8736a8bcb723b2b2ff Author: Mathias Hasselmann Date: Wed Mar 14 00:55:46 2007 +0100 Replace pixman_region_create_simple by pixman_region_init pixman/src/ictrap.c | 14 +++++++------- pixman/src/pixman.h | 3 --- pixman/src/pixregion.c | 13 +------------ 3 files changed, 8 insertions(+), 22 deletions(-) commit f9057f27520842159f73dbfd6de49cb8feee1c39 Author: Mathias Hasselmann Date: Wed Mar 14 00:48:43 2007 +0100 Avoid pixman_create_region in glitz-surface src/cairo-glitz-surface.c | 49 ++++++++++++++++++++++----------------------- 1 files changed, 24 insertions(+), 25 deletions(-) commit 82cbb6886cf621fd6b10be5e04ce11ff05127fc6 Author: Mathias Hasselmann Date: Wed Mar 14 00:46:34 2007 +0100 Remove redundant _cairo_clip_fini function src/cairo-clip-private.h | 3 --- src/cairo-clip.c | 17 ----------------- src/cairo-gstate.c | 4 ++-- src/cairo-meta-surface.c | 2 +- 4 files changed, 3 insertions(+), 23 deletions(-) commit 5ae309c4561418fb057a8049f047ffcb03f3b698 Author: Mathias Hasselmann Date: Wed Mar 14 00:40:44 2007 +0100 Avoid pixman_region_create in _cairo_traps_extract_region src/cairo-traps.c | 18 +++++++++--------- src/cairoint.h | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) commit 241482b5505427d221f4aaa970e7500a78fb2da1 Author: Mathias Hasselmann Date: Wed Mar 14 00:28:49 2007 +0100 Avoid malloc in _cairo_region_create_from_rectangle src/cairo-clip.c | 42 +++---- src/cairo-region.c | 34 +++--- src/cairo-surface-fallback.c | 250 ++++++++++++++++++++++-------------------- src/cairo-surface.c | 52 +++++---- src/cairoint.h | 5 +- 5 files changed, 199 insertions(+), 184 deletions(-) commit efc9775149c4c87645c58235c7626cc4f72e69c3 Author: Mathias Hasselmann Date: Tue Mar 13 23:58:14 2007 +0100 Make sure clip->region is always initialized src/cairo-clip.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 0e7df34e07d7816b29c1ac1f67608b87c5e0efc2 Author: Mathias Hasselmann Date: Tue Mar 13 23:38:20 2007 +0100 Make region of cairo_clip_t static src/cairo-clip-private.h | 3 +- src/cairo-clip.c | 87 ++++++++++++++++++++++++---------------------- src/cairo-surface.c | 4 +- 3 files changed, 49 insertions(+), 45 deletions(-) commit ced7b4a4ab4b5a8d639bfca0dd5db38f1ae4825d Author: Mathias Hasselmann Date: Tue Mar 13 22:34:23 2007 +0100 Make pixman_region_{init,uninit} public pixman/src/pixman.h | 5 +++++ pixman/src/pixregion.c | 18 ++++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) commit 4d9065fcebbaf857d8d5fe49bcbb33f270c0bf26 Author: Mathias Hasselmann Date: Tue Mar 13 21:51:46 2007 +0100 Move struct pixman_region16 to pixman.h pixman/src/pixman.h | 7 ++++++- pixman/src/pixregionint.h | 7 +------ 2 files changed, 7 insertions(+), 7 deletions(-) commit dce3e5e6b556b817bf95182122adbf6f816b71e9 Author: Behdad Esfahbod Date: Fri Apr 6 17:20:49 2007 -0400 [TODO] Add 4945 Cairo doesn't support 8-bit pseudocolor visuals ROADMAP | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 8bb0e5939c0694e88ea9ede4137d7306a067bd17 Author: Chris Wilson Date: Wed Mar 28 20:27:29 2007 +0100 _get_bitmap_surface - check for calloc failure src/cairo-ft-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b95577a931645b3013d5acaa5b1bd2d892c3932f Author: Chris Wilson Date: Wed Mar 28 17:58:31 2007 +0100 Protect boilerplate_xlib_synchronize from alloc failure. Don't call XDestroyImage on a NULL image. boilerplate/cairo-boilerplate.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 2a74fd5c7ff21f27013f709dc626be8087cb6a10 Author: Chris Wilson Date: Wed Mar 28 15:50:12 2007 +0100 Propagate one error return through pdf. src/cairo-pdf-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit a2a8f2ce7a0a9bcef7a4a29624725a77c2abe95a Author: Behdad Esfahbod Date: Thu Apr 5 20:03:51 2007 -0400 [ROADMAP] Move David Turner's cairo-ft rewrite to 1.6. ROADMAP | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 94460a9790ece7a436d6681ab41d7b2365f0775f Author: Carl Worth Date: Thu Apr 5 16:35:03 2007 -0700 ROADMAP/TODO: Update with 1.4.4 and 1.6 items from recent meeting ROADMAP | 164 ++++++++++++++++++++++++++----------------- TODO | 236 ++++++++++++++++++++++---------------------------------------- 2 files changed, 183 insertions(+), 217 deletions(-) commit d801aa59f84d95568e36d02a0ecf3544b9914187 Author: Robert O'Callahan Date: Fri Apr 6 00:00:33 2007 +0100 [quartz] fix floating point precision issue (#10531) This ensures that error due to double-to-float conversion does not accumulate; the position of any glyph will be off by at most one double-to-float conversion error. src/cairo-quartz-surface.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) commit 106f8590457a7ebb5335d67f16277e8d5a6b04a8 Author: Carl Worth Date: Wed Apr 4 15:59:50 2007 -0700 Move misplaced CLEANUP_FONT label to avoid crash. Previously, a failure in _cairo_win32_scaled_font_init_glyph_path leading to the CLEANUP_FONT label would set the path into the glyph, then destroy the path, and return an error status, (which in turn would cause a double free when the glyph was destroyed). The double-free apparently leads to a crash in some cases, as described here: SVG/Cairo related crash when opening specific webpage https://bugzilla.mozilla.org/show_bug.cgi?id=376498 This should eliminate the double-free, but does not address the original error case, (attempting to get a path from a bitmap font?). src/cairo-win32-font.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) commit 5c24711ee65cdb8ac0fdb7419e6466e2b7cb7d9e Author: Chris Wilson Date: Wed Apr 4 10:13:13 2007 +0100 Restore gcov functionality Add -lgcov to the shared library else the test programs fail to link. Add a couple of lcov convenience targets to generate the coverage reports. Makefile.am | 13 ++++++++++++- boilerplate/Makefile.am | 2 +- configure.in | 14 ++++++++++++-- pixman/src/Makefile.am | 5 ++++- src/Makefile.am | 2 +- test/Makefile.am | 5 +++-- 6 files changed, 33 insertions(+), 8 deletions(-) commit 59e5189818321c8a62ad107548facbcfce9e517a Author: Behdad Esfahbod Date: Tue Apr 3 20:46:14 2007 -0400 [Makefile.am] Distribute BIBLIOGRAPHY Also include all automatically distributed CAPITAL files in there, to remove any doubts. Makefile.am | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit a1287e483ce8efcf3f1eca97bdaaccac2393a1bf Author: Behdad Esfahbod Date: Tue Apr 3 20:30:30 2007 -0400 [pixman/src/check-config.sh] Test that all source files #include as their first include. pixman/src/Makefile.am | 3 +++ pixman/src/check-config.sh | 17 +++++++++++++++++ src/check-cairoint.sh | 2 +- 3 files changed, 21 insertions(+), 1 deletions(-) commit 8fbf50d31da9e13f1e55c7ee19586b7c394684ba Author: Behdad Esfahbod Date: Tue Apr 3 20:25:30 2007 -0400 [src] Make sure all source files #include "cairoint.h" as their first include This is necessary to avoid many portability problems as cairoint.h includes config.h. Without a test, we will regress again, hence add it. The inclusion idiom for cairo now is: #include "cairoint.h" #include "cairo-something.h" #include "cairo-anotherthing-private.h" #include #include Moreover, some standard headers files are included from cairoint.h and need not be included again. src/cairo-arc.c | 2 ++ src/cairo-atsui-font.c | 5 ++--- src/cairo-beos-surface.cpp | 7 ++++--- src/cairo-directfb-surface.c | 10 +++------- src/cairo-freelist.c | 5 +++-- src/cairo-ft-font.c | 4 +++- src/cairo-gstate.c | 2 -- src/cairo-matrix.c | 1 - src/cairo-os2-surface.c | 11 ++++++----- src/cairo-output-stream.c | 7 ++++--- src/cairo-path-fixed.c | 1 - src/cairo-path.c | 2 ++ src/cairo-png.c | 3 ++- src/cairo-polygon.c | 1 - src/cairo-quartz-surface.c | 4 ++-- src/cairo-region.c | 2 +- src/cairo-skiplist.c | 6 +----- src/cairo-surface-fallback.c | 2 ++ src/cairo-surface.c | 3 +-- src/cairo-truetype-subset.c | 2 +- src/cairo-unicode.c | 4 +--- src/cairo-win32-font.c | 3 +-- src/cairo-win32-surface.c | 10 +++++----- src/cairo-xlib-screen.c | 4 ++-- src/cairoint.h | 1 + src/check-cairoint.sh | 2 +- src/test-fallback-surface.c | 4 ++-- src/test-meta-surface.c | 4 ++-- src/test-paginated-surface.c | 4 ++-- 29 files changed, 56 insertions(+), 60 deletions(-) commit ffc7d06da0f97390025a510b9532e4a64e9230f4 Author: Behdad Esfahbod Date: Tue Apr 3 20:22:44 2007 -0400 [src/check-cairoint.h] Test to check that all source files #include "cairoint.h" as their first include. src/Makefile.am | 2 +- src/check-cairoint.sh | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletions(-) commit 3646839060de7ab51c805bf5614fc3d1ea8b7fc3 Author: Brian Ewins Date: Wed Apr 4 01:16:30 2007 +0100 [boilerplate] split quartz out to avoid symbol clash. Quartz and Xlib both define Picture and Cursor, and clashed in cairo-boilerplate.c. Splitting quartz out allows a single mac build with --enable-quartz --enable-atsui. boilerplate/Makefile.am | 1 + boilerplate/cairo-boilerplate-private.h | 45 +++++++++++++++++++++ boilerplate/cairo-boilerplate.c | 44 ++------------------- boilerplate/cairo-quartz-boilerplate.c | 64 +++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 39 deletions(-) commit 174ebc43fe84854876d642e67fc3a442d280b59e Author: Behdad Esfahbod Date: Tue Apr 3 20:01:32 2007 -0400 [pixman] Make sure all source files include config.h as their first include. pixman/src/fbcompose.c | 2 ++ pixman/src/fbpict.c | 1 + pixman/src/fbtrap.c | 4 ++++ pixman/src/icblt.c | 4 ++++ pixman/src/icbltone.c | 4 ++++ pixman/src/iccolor.c | 4 ++++ pixman/src/icformat.c | 4 ++++ pixman/src/icpixels.c | 4 ++++ pixman/src/icrect.c | 4 ++++ pixman/src/icstipple.c | 4 ++++ pixman/src/ictransform.c | 4 ++++ pixman/src/ictrap.c | 4 ++++ pixman/src/ictri.c | 4 ++++ pixman/src/icutil.c | 4 ++++ pixman/src/renderedge.c | 4 ++++ 15 files changed, 55 insertions(+), 0 deletions(-) commit 208c32b245d7f50e1e9d71695269128b28a675fc Author: Behdad Esfahbod Date: Tue Apr 3 19:56:29 2007 -0400 [cairoint.h] Remove inline definition for MS compilers Such things should go to config.h. For one thing, cairoint.h is not included in pixman. src/cairoint.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 313a6f732112ca88fa4d590a604ce8219065655c Author: Behdad Esfahbod Date: Tue Apr 3 19:53:28 2007 -0400 [pixman] Cleanup inline mess (#10150) Simply use "inline" instead of "INLINE" or "__inline__" and let configure figure out what to use. pixman/src/fbcompose.c | 8 ++++---- pixman/src/fbedge.c | 8 ++++++-- pixman/src/fbmmx.c | 45 +++++++++++++++++++++++---------------------- pixman/src/fbpict.h | 6 ------ pixman/src/icimage.c | 8 ++++++-- pixman/src/icint.h | 12 +----------- pixman/src/pixregion.c | 14 ++++++-------- 7 files changed, 46 insertions(+), 55 deletions(-) commit 88dc0c5f19475888c19db437661b290f3a8902f8 Author: Behdad Esfahbod Date: Tue Apr 3 19:26:18 2007 -0400 Make sure all nil objects start with _cairo_ Previously, the convention was that static ones started with cairo_, but renamed to start with _cairo_ when they were needed from other files and became cairo_private instead of static... This is error prune indeed, and two symbols were already violating. Now all nil objects start with _cairo_. src/cairo-base85-stream.c | 2 +- src/cairo-clip-private.h | 2 +- src/cairo-deflate-stream.c | 4 ++-- src/cairo-font-options.c | 22 +++++++++++----------- src/cairo-output-stream-private.h | 2 +- src/cairo-output-stream.c | 20 ++++++++++---------- src/cairo-pattern.c | 14 +++++++------- src/cairo-ps-surface.c | 4 ++-- src/cairo.c | 8 ++++---- src/cairoint.h | 2 +- 10 files changed, 40 insertions(+), 40 deletions(-) commit 114be945db6c02aeb60cf1123b43680bd12cccdb Author: Behdad Esfahbod Date: Tue Apr 3 16:47:39 2007 -0400 [test] Add svg2pdf test/Makefile.am | 6 ++++ test/svg2pdf.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 0 deletions(-) commit b121468f14a6a05a823e06cf7c51caaa1e342556 Author: Behdad Esfahbod Date: Tue Apr 3 16:27:50 2007 -0400 [configure.in] Bump version up to 1.4.3, oops! Supposed to be done after 1.4.2 was out, but apparently didn't happen. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9710c48df31c66d8931a75b6578c7c861d497baa Author: Behdad Esfahbod Date: Tue Apr 3 16:26:48 2007 -0400 [doc] Update Headers.mk doc/public/Headers.mk | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 040c68cb2ca6c893d9ba11291c21b1cf84fec980 Author: Behdad Esfahbod Date: Tue Apr 3 16:23:35 2007 -0400 [test] Make pdf2svg build (and distributed) test/Makefile.am | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit 17f5706d1730662bce0cd49f60cb150773fac051 Author: Behdad Esfahbod Date: Tue Apr 3 16:04:04 2007 -0400 [pdiff] Make stdint.h inclusion portable (#10441) by copying magic bits from cairo-wideint-private.h. test/pdiff/pdiff.c | 37 ++++++++++++++++++++++++++++++++++++- 1 files changed, 36 insertions(+), 1 deletions(-) commit c2b1908f9b0d8c59abf79c3462471d1c3960b153 Author: Benjamin Berg Date: Tue Apr 3 15:46:51 2007 -0400 Fix typo in cairo_arc_negative() docs (#10497) src/cairo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 814295f5fad43ec1d8b18fac045e3c0d27ec7c29 Author: Behdad Esfahbod Date: Tue Apr 3 15:37:40 2007 -0400 [autogen.sh] Add --enable-test-surfaces to configure flags Also remove --enable-maintainer-mode since we removed AM_MAINTAINER_MODE from configure.in in b0d05f7421c457120b9d86a83c4935c67b217fab. autogen.sh | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 38c9909e2948f089bbec89e2d43b0e6f930c1ab1 Author: Chris Wilson Date: Tue Apr 3 15:34:30 2007 -0400 [autogen.sh] Borrow version comparison from GNOME autogen.sh (#9566) Our previous version check code was thinking that 1.10 is older than 1.7 autogen.sh | 186 +++++++++++++++++++++++++++++++----------------------------- 1 files changed, 97 insertions(+), 89 deletions(-) commit 00cc44373705665824d53c8ebde5df397b834e41 Author: Brian Ewins Date: Mon Mar 26 21:44:33 2007 +0100 [test/degenerate-path] remove quartz reference image The reference image is no longer the correct size, so isn't providing a comparison at all. In the absence of a better replacement, removing it at least gives us diffs. test/Makefile.am | 1 - test/degenerate-path-quartz-rgb24-ref.png | Bin 188 -> 0 bytes 2 files changed, 0 insertions(+), 1 deletions(-) commit 256f3e09a8a0d152a33df00604bf2245604b72bc Author: Chris Wilson Date: Mon Mar 26 10:33:32 2007 +0100 Destroy the current pattern before replacing with cairo_set_source(). Frequently cairo_set_source_rgb[a]() is used to replace the current solid-pattern source with a new one of a different colour. The current pattern is very likely to be unshared and unmodified and so it is likely just to be immediately freed [or rather simply moved to recently freed cache]. However as the last active pattern it is likely to cache-warm and suitable to satisfy the forthcoming allocation. So by setting the current pattern to 'none' we can move the pattern to the freed list before we create the new pattern and hopefully immediately reuse it. src/cairo-pattern.c | 10 ++++++++++ src/cairo.c | 9 +++++++++ src/cairoint.h | 1 + 3 files changed, 20 insertions(+), 0 deletions(-) commit 38442d4948e0a93f06cd86e6841729bc3f25ed3b Author: Chris Wilson Date: Mon Mar 26 10:12:46 2007 +0100 Back out the solid-pattern-cache from 9b53bc7c6585db7ae647bb992fb9817d7bd75b38. Unfortunately one cannot cache live patterns and return a fresh reference instead of creating new ones as patterns can be modified by the user and so cannot be transparently shared between different users. However, solid colour allocation is still a frequent operation, so we maintain a small cache of recently freed patterns to reduce the malloc pressure. src/cairo-pattern.c | 100 ++++++++++++++++++++++++-------------------------- 1 files changed, 48 insertions(+), 52 deletions(-) commit c8e37af4b06fffe1aa1a1c3d2cd6481cc2cf8938 Author: Brian Ewins Date: Sun Mar 25 23:31:40 2007 +0100 [quartz] fix order of fields in matrix conversion There was a typo flipping the xy and yx fields when a cairo matrix was converted to a quartz matrix. src/cairo-quartz-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit d2cdd5eba801fc5f696d1095f237ae53c54b4e2a Author: Brian Ewins Date: Sat Mar 24 13:25:03 2007 +0000 [atsui] fix scaling of glyph surfaces (#9568) Atsui glyph surface were clipped incorrectly when the text is scaled, visible in the text-pattern test. src/cairo-atsui-font.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit 2efaf3a7a47a281ca02009d371cd7a06a8a4f282 Merge: abac4d2... 25ddc08... Author: Mathias Hasselmann Date: Sat Mar 24 00:29:04 2007 +0100 Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo commit abac4d251dd02151dced296afa9d6e1b383868ee Author: Mathias Hasselmann Date: Fri Mar 23 23:36:15 2007 +0100 [cairo-perf] Use full 64 bit of the clock cycle counters to avoid overflows perf/cairo-perf-posix.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) commit 25ddc0800490ca0222668e389412f92ccfdab91c Author: Adrian Johnson Date: Fri Mar 23 23:19:30 2007 +1030 PS: Remove unused variable src/cairo-ps-surface.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit e9a26966484171f94df41bd3abc83aae22682caa Author: Adrian Johnson Date: Fri Mar 23 23:08:46 2007 +1030 PDF: Use the TJ operator to show glyphs src/cairo-pdf-surface.c | 125 ++++++++++++++++++++++++++----- src/cairo-ps-surface.c | 11 ++- src/cairo-scaled-font-subsets-private.h | 25 ++++++- src/cairo-scaled-font-subsets.c | 83 ++++++++++++++++----- src/cairo-svg-surface.c | 7 +- 5 files changed, 201 insertions(+), 50 deletions(-) commit 820341b4c503fbd5ca3b8f6c3e5ff6eca5562b98 Author: Behdad Esfahbod Date: Wed Mar 21 15:44:18 2007 -0400 [test/nil-surface] Test that cairo_get_target() returns non-NULL test/nil-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit ef8515b4a6b468e589639e794a959cb37d592359 Author: Behdad Esfahbod Date: Wed Mar 21 15:29:18 2007 -0400 cairo_push/pop_group(), bail out if cairo_t is in error status Fixes the new test added to test/nil-surface to not crash src/cairo.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 52341f7e855c93fc8e58895c3a318c43c3d58474 Author: Behdad Esfahbod Date: Wed Mar 21 15:21:05 2007 -0400 [test/nil-surface] Test cairo_create(NULL). Crashing in cairo_push_group! test/nil-surface.c | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) commit 9cea8a4bb26f7de2ac56e318c72e7d048b8b6c0f Author: Behdad Esfahbod Date: Wed Mar 21 15:03:02 2007 -0400 [cairo.c] Don't access gstate members directly src/cairo-gstate.c | 18 ++++++++++++++++++ src/cairo.c | 23 +++++++++++------------ src/cairoint.h | 3 +++ 3 files changed, 32 insertions(+), 12 deletions(-) commit 39ae64ff0391c40077b63d214727ca0c25e03e37 Author: Behdad Esfahbod Date: Wed Mar 21 14:56:34 2007 -0400 [cairo-path] Don't access gstate members directly src/cairo-path.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit bd275c19782700f2cfc6905f348e4d4b3f15d311 Author: Behdad Esfahbod Date: Wed Mar 21 12:34:37 2007 -0400 [cairo-pattern] Make sure cached solid patterns are not put in error status src/cairo-pattern.c | 19 +++++++++++++++---- 1 files changed, 15 insertions(+), 4 deletions(-) commit e76d3cfa4f06ba813528a018fa77ba4d210a44e3 Author: Behdad Esfahbod Date: Wed Mar 21 12:33:31 2007 -0400 [cairo-gstate] Make sure gstate->next is initialized src/cairo-gstate.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 1469ea22ba659ba7afa6892e9b6b2a3f26d0dddb Author: Behdad Esfahbod Date: Wed Mar 21 11:22:33 2007 -0400 [cairo-gstate] Move save/restore logic into gstate instead of cairo_t by adding _cairo_gstate_save/restore(). This is in preparation for adding copy-on-write behavior to gstate. src/cairo-gstate.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++- src/cairo.c | 32 +++++++++--------------------- src/cairoint.h | 8 +++--- 3 files changed, 65 insertions(+), 28 deletions(-) commit 5f83a1b542a1932a59299a45f36dff22268dca14 Author: Jeff Smith Date: Wed Mar 21 10:41:03 2007 -0400 [cairo-output-stream] Remove use of strtol src/cairo-output-stream.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) commit bba7169805cec96b442d15241b0fdf8c38d0cd0e Author: Behdad Esfahbod Date: Tue Mar 20 22:55:02 2007 -0400 Fix file permissions again Where do these a+x attributes coming from every once in a while? 0 files changed, 0 insertions(+), 0 deletions(-) commit ad51ee5aa0d1fc03c4ebe7f0454949995420a710 Author: Behdad Esfahbod Date: Tue Mar 20 18:59:19 2007 -0400 Define and use ARRAY_LEN src/cairo-arc.c | 2 +- src/cairo-atsui-font.c | 6 ++---- src/cairo-bentley-ottmann.c | 2 +- src/cairo-cff-subset.c | 8 +++----- src/cairo-hash.c | 2 +- src/cairo-pattern.c | 2 +- src/cairo-polygon.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-surface.c | 2 +- src/cairo-svg-surface.c | 2 +- src/cairo-traps.c | 2 +- src/cairo-truetype-subset.c | 8 +++----- src/cairoint.h | 3 +++ 13 files changed, 20 insertions(+), 23 deletions(-) commit 1de12714a9623e66309279eb9edaf6053fd92c56 Author: Chris Wilson Date: Wed Mar 14 01:31:58 2007 +0000 [cairo-surface] Use a stack buffer for small numbers of rectangles src/cairo-surface.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit 9b53bc7c6585db7ae647bb992fb9817d7bd75b38 Author: Chris Wilson Date: Tue Mar 13 22:51:12 2007 +0000 Cache solid patterns We use a small cache of size 16 for patterns created from solid colors, e.g. cairo_set_source_rgb(). This helps with toolkits that draw many widgets using the same colour scheme. The cache uses a static index variable, which itself acts like a cache of size 1, remembering the most recently used colour. So repeated lookups for the same colour hit immediately. If that fails, the cache is searched linearly, and if that fails too, a new pattern is created and a random member of the cache is evicted. src/cairo-color.c | 7 +++ src/cairo-debug.c | 2 + src/cairo-mutex-list.h | 2 + src/cairo-pattern.c | 63 +++++++++++++++++++++++++++- src/cairoint.h | 7 +++ test/Makefile.am | 1 + test/solid-pattern-cache-stress.c | 83 +++++++++++++++++++++++++++++++++++++ 7 files changed, 163 insertions(+), 2 deletions(-) commit 39679b1b21b07b0fbc05ee21745f384a123ba8da Author: Behdad Esfahbod Date: Tue Mar 20 18:01:41 2007 -0400 [cairo-path-fixed] Fix "comparison between signed and unsigned" warnings src/cairo-path-fixed.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit c939421e16fcf098f8d6196e86705173be8e40fd Author: Behdad Esfahbod Date: Tue Mar 20 08:54:01 2007 -0400 Oops. Remove cairo-mutex-private.h include from test surfaces as that file is included from cairoint.h now. src/test-fallback-surface.c | 1 - src/test-meta-surface.c | 1 - src/test-paginated-surface.c | 1 - 3 files changed, 0 insertions(+), 3 deletions(-) commit 0d3e886b182b55b147f2ba1a298c2f5ec8a53d87 Author: Behdad Esfahbod Date: Tue Mar 20 08:49:28 2007 -0400 Include cairo-mutex-private.h in test backends src/test-fallback-surface.c | 1 + src/test-meta-surface.c | 2 ++ src/test-paginated-surface.c | 1 + 3 files changed, 4 insertions(+), 0 deletions(-) commit 0263f18f843175e478bd3a14e24445e31e7b0952 Author: Behdad Esfahbod Date: Tue Mar 20 08:47:45 2007 -0400 [configure.in] Define PIXMAN_CFLAGS, to pass -fno-strict-aliasing to pixman configure.in | 10 +++++++--- pixman/src/Makefile.am | 4 +--- 2 files changed, 8 insertions(+), 6 deletions(-) commit 94c367f7d7637fc74ed6d1fbe13d73662c08246b Merge: c4bd7cf... d3177a6... Author: Mathias Hasselmann Date: Tue Mar 20 13:33:50 2007 +0100 Merge branch 'master' of git+ssh://hasselmm@git.freedesktop.org/git/cairo commit c4bd7cf6f85770552c0b0284db219f27ffa702f2 Author: Mathias Hasselmann Date: Tue Mar 20 13:32:33 2007 +0100 Move declaration of cairo_mutex_t to cairo-mutex-private.h src/cairo-font.c | 1 - src/cairo-ft-font.c | 1 - src/cairo-mutex-private.h | 53 ++++++++++++++++++++++++++++++++++------- src/cairo-mutex.c | 6 +++- src/cairo-paginated-surface.c | 1 - src/cairo-pattern.c | 1 - src/cairo-scaled-font.c | 1 - src/cairo-surface.c | 1 - src/cairo-xlib-screen.c | 1 - src/cairoint.h | 37 +--------------------------- 10 files changed, 49 insertions(+), 54 deletions(-) commit 9c52a9e7d8a70d21ecdd4fa241fa2594361dd5df Author: Mathias Hasselmann Date: Tue Mar 20 13:05:48 2007 +0100 Remove _global_image_glyph_cache_mutex which is not used anymore. src/cairo-mutex-list.h | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) commit d3177a68752ac2c8d20b1a8a3616298f04f31078 Author: Behdad Esfahbod Date: Tue Mar 20 07:59:47 2007 -0400 [cairo-mutex] Rename _xlib_screen_mutex to _cairo_xlib_screen_mutex src/cairo-mutex-list.h | 2 +- src/cairo-xlib-screen.c | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) commit be52178443ffd19fc7848dfc78c477883ccb943b Author: Mathias Hasselmann Date: Tue Mar 20 10:11:14 2007 +0100 Initialize mutexes at central location. All mutex declarations have been moved to cairo-mutex-list.h. This should avoid breaking of less frequently tested backends, when mutexes are introduced or when existing mutexes are renamed. Instead of initializing mutexes on library startup, mutexes are lazily initialized within the few entry points of now by calling CAIRO_MUTEX_INITIALIZE(). Currently only the OS/2 backend takes care about releasing global mutexes. Therefore there is no counter part of that macro for finalizing all global mutexes yet - but as cairo-backend-os2.c shows such a function would be quite easy to implement. src/Makefile.am | 1 + src/cairo-font.c | 7 +- src/cairo-ft-font.c | 3 +- src/cairo-mutex-list.h | 52 +++++++++++++++++ src/cairo-mutex-private.h | 123 +++++++++++++++++++++++++++++++++++++++++ src/cairo-mutex.c | 51 +++++++++++++++++ src/cairo-os2-surface.c | 45 +-------------- src/cairo-paginated-surface.c | 1 + src/cairo-pattern.c | 3 + src/cairo-scaled-font.c | 3 +- src/cairo-surface.c | 5 +- src/cairo-win32-font.c | 10 --- src/cairo-win32-private.h | 3 - src/cairo-win32-surface.c | 65 --------------------- src/cairo-xlib-screen.c | 3 +- src/cairoint.h | 71 +++++------------------- 16 files changed, 257 insertions(+), 189 deletions(-) commit aba2b299db163d8a5b9d0a0214cd8a485fb87162 Author: Carl Worth Date: Mon Mar 19 23:50:13 2007 -0700 boilerplate: Add EXTRA_LTLIBRARIES to CLEANFILES to allow make distcleancheck to pass. boilerplate/Makefile.am | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 2483542b74ac71851cc766de3468d0df833cdec2 Author: Carl Worth Date: Mon Mar 19 23:37:28 2007 -0700 Add skew-extreme-ref.png to the tar file for the release. test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit b91ff39214675faea5d3627ecf86a24aeb8b178f Author: Carl Worth Date: Mon Mar 19 23:24:26 2007 -0700 Increment cairo version to 1.4.2 (and libtool versioning to 13:1:11) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 04b3de48f5269cae483b4af425402679a35e7d33 Author: Carl Worth Date: Mon Mar 19 23:22:39 2007 -0700 NEWS: Add notes for cairo 1.4.2 NEWS | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 130 insertions(+), 0 deletions(-) commit 1401f20eb91f34d992612162db0c9e04bd666114 Author: Carl Worth Date: Mon Mar 19 22:39:40 2007 -0700 Temporarily remove extend-reflect from the list of tests. This test is known to sometimes cause an X server to enter a near- infinite loop. That's a reall unkind thing to inflict upon our users who are being nice enough to test cairo. Let's disable this test for the 1.4.2 release. test/Makefile.am | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 725a4de42dfaf0d9d98447c9fbefed99fbf99ac1 Author: Carl Worth Date: Mon Mar 19 16:50:55 2007 -0700 Propagate a nil surface out of _cairo_surface_create_similar_scratch We detect an error in the surface before calling into private surface-modifying functions, (such as _cairo_surface_set_font_options), that don't have the nil-surface protection of public functions. This should fix the problem reported (again) in this bug report: cairo crashes in cairo_create_simular if nil surface returned by other->backend->create_similar https://bugs.freedesktop.org/show_bug.cgi?id=9844 Though I haven't succeeded in replicating the bug yet, (perhaps a system difference in allowing writes to read-only memory or not, or something like that). src/cairo-surface.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit eb472a9d9cbaea754907a261b459693b9c27ac79 Author: Carl Worth Date: Mon Mar 19 13:13:41 2007 -0700 xlib: Prefer surface->format over surface->visual for identifying masks The original test for 'if (surface->visual)' dates back to a very old assumption that if the xlib surface was created with an XRenderFormat that the surface->visual field would be set to NULL. This assumption was broken years ago with the following commit: 0c05b23b3165ec6908c28f56b3446cf43dff44a2 This fixes the crash reported here: BadMatch when running gnome-terminal with the murrine-0.51 gtk engine https://bugs.freedesktop.org/show_bug.cgi?id=10250 src/cairo-xlib-surface.c | 27 +++++++++++++++------------ 1 files changed, 15 insertions(+), 12 deletions(-) commit d27c42cc3fcd4376fc69aa68d997e6077c3eca90 Author: Behdad Esfahbod Date: Mon Mar 19 17:42:06 2007 -0400 [boilerplate] Don't build in make all boilerplate/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 12feb1f98627637bf83ba70f739bb5b2699085aa Author: Brian Ewins Date: Mon Mar 19 18:22:44 2007 +0000 [quartz] apply ctm to text (#9568) Applies the ctm to text output on the quartz surface. This corrects the text-pattern test, and also corrects the size of text when the ctm includes a scale. src/cairo-quartz-surface.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit 986b0ff83813b68a19490fe8629bfdaeed68cbe2 Author: Brian Ewins Date: Mon Mar 19 18:21:27 2007 +0000 [atsui] make text_to_glyphs return positions in user units. (#9568) text_to_glyphs was returning positions in device units; correct this to use user units. src/cairo-atsui-font.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) commit 06a44839270354c7f74aa66352fb4234095dee4e Author: Brian Ewins Date: Sun Mar 18 20:20:11 2007 +0000 [atsui] store sizes in the atsui font The ATSUStyle that we store in the font contains references to the size and font matrix; we need to store them in the font so that they are not released before the style. src/cairo-atsui-font.c | 16 +++++++++------- 1 files changed, 9 insertions(+), 7 deletions(-) commit 240479d10d3263719b0c8a4426fda088899551a2 Author: Brian Ewins Date: Sun Mar 18 20:20:10 2007 +0000 [atsui] refactor CreateSizedCopyOfStyle This is just to make it easier to use with passed-in matrices, which I'll make use of in a subsequent patch. src/cairo-atsui-font.c | 36 ++++++++++++++++++++---------------- 1 files changed, 20 insertions(+), 16 deletions(-) commit 43577e26b4c2285499ebfddba6cfa62cbbb15feb Author: Brian Ewins Date: Sun Mar 18 20:20:10 2007 +0000 [atsui] remove the unused old_show_glyphs function. _cairo_atsui_old_show_glyphs was a relic of the old quartz surface and is no longer required. src/cairo-atsui-font.c | 180 ++++-------------------------------------------- 1 files changed, 15 insertions(+), 165 deletions(-) commit 5aaf584bf44d762af5e486f21a037eb0cc6e1197 Author: Carl Worth Date: Fri Mar 16 17:45:31 2007 -0700 XCB: Fix parameter-order confusion with xcb_create_pixmap This fixes mask-based clipping with the XCB backend, (which also makes the xcb backend pass all tests that the xlib backend passes). src/cairo-xcb-surface.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit 6f96a5dd9954418b252ec45752dcf2c3b289fed4 Author: Behdad Esfahbod Date: Fri Mar 16 18:21:36 2007 -0400 [win32] Really return unhinted font metrics if metrics hinting is off src/cairo-win32-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 47e71eef5f903fa1a96d82a79a75d89c52032913 Author: Behdad Esfahbod Date: Fri Mar 16 17:56:53 2007 -0400 [win32] Fix font descent computation src/cairo-win32-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit dd4601b0d03bba021b11dcf96e09584f40d1621f Author: Mathias Hasselmann Date: Fri Mar 16 20:43:29 2007 +0100 [cairo-perf] Emit warning, if cairo-perf is not CPU bound cairo-perf and the X server should be bound to CPUs (either the same or separate) on SMP systems. Not doing so causes random results when the X server is moved to or from cairo-perf's CPU during the benchmarks. configure.in | 11 +++++++++++ perf/cairo-perf.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 0 deletions(-) commit d02aa5b23eb6243b21697de203db0a5f1b49def9 Author: Gilles Dauphin Date: Fri Mar 16 10:35:23 2007 -0700 Don't use unsupported visibily attribute hidden on Solaris Thanks to Thomas Klausner for passing the report along. This fixes the following bug report: hidden attribute does not work with Solaris ld https://bugs.freedesktop.org/show_bug.cgi?id=10227 And as Behdad points out, an even better fix would be to move checks for supported visibility attribute to configure. pixman/src/pixman.h | 2 +- src/cairoint.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit 8236282c5d58320173b17659e488384e710d0ea7 Author: Thomas Klausner Date: Fri Mar 16 10:04:56 2007 -0700 Use "find !" rather than "find -not" for better portability The man page for GNU find says: -not expr Same as ! expr, but not POSIX compliant. And actually, on e.g. NetBSD, "-not" is not supported. This resolved the following bug: https://bugs.freedesktop.org/show_bug.cgi?id=10226 RELEASING | 2 +- src/check-headers.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 332c38b6c34bde4829607e534f39522f8001acf7 Author: Carl Worth Date: Thu Mar 15 23:25:06 2007 -0700 Avoid pulling in -lz for the ps backend. Quite some time ago we switched from using deflate-based compression to LZW for the ps backend, (which allows it to target PostScript Level 2 instead of PostScript Level 3). Now, we finally drop the fact that the ps backend was still requiring zlib in order to build. configure.in | 6 +----- 1 files changed, 1 insertions(+), 5 deletions(-) commit 2242550b489472d4d9b6505fd3db89541e101425 Author: Carl Worth Date: Thu Mar 15 23:17:19 2007 -0700 Make compilation of cairo-deflate-stream.c conditional on compilation of PDF backend. Otherwise we risk pulling in an otherwise-unneeded dependency on zlib. This fixes the bug reported here: Without PDF surface backend we don't need cairo-deflate-stream https://bugs.freedesktop.org/show_bug.cgi?id=10202 src/Makefile.am | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 1234064fa4aa20d0875473709d2fa74600af485b Author: Carl Worth Date: Thu Mar 15 22:38:42 2007 -0700 Allow NULL pointers for functions that accept pointers for multiple return values. When a single function accepts pointers for multiple return values, the convention is that it's legal for the user to pass NULL for those pointers in case the user is only interested in some subset of the values. This was already properly implemented for functions such as cairo_pattern_get_rgba, etc. Here we fix four functions to follow the same convention: cairo_stroke_extents cairo_fill_extents cairo_clip_extents cairo_surface_get_device_offset src/cairo-gstate.c | 44 +++++++++++++++++++++++++++++++++----------- src/cairo-surface.c | 6 ++++-- 2 files changed, 37 insertions(+), 13 deletions(-) commit 133183d858aa632da3cec2a789dcc1e1203d778b Author: Carl Worth Date: Thu Mar 15 22:08:55 2007 -0700 Fix cairo_stroke_extents and cairo_in_stroke to not crash with line width of 0.0 This fixes the line-width-zero test case and the bug reported here: Crash in cairo_stroke_extents whe line width is 0 and line cap is ROUND (_cairo_pen_find_active_cw_vertex_index) https://bugs.freedesktop.org/show_bug.cgi?id=10231 src/cairo-gstate.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit 23caa0f43ba199371ab178cf3e827e449ee5935f Author: Carl Worth Date: Thu Mar 15 21:58:20 2007 -0700 Add line-width-zero test which currently crashes. The crash is described in this bug report: Crash in cairo_stroke_extents whe line width is 0 and line cap is ROUND (_cairo_pen_find_active_cw_vertex_index) https://bugs.freedesktop.org/show_bug.cgi?id=10231 test/.gitignore | 1 + test/Makefile.am | 1 + test/line-width-zero.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 0 deletions(-) commit 562bd551bc5ca3f3858a66b9884a8525531153c8 Author: Mathias Hasselmann Date: Thu Mar 15 12:47:41 2007 +0100 [cairo-perf-diff] Update usage screen to mention --html. perf/cairo-perf-diff | 73 ++++++++++++++++++++++++++++--------------------- 1 files changed, 42 insertions(+), 31 deletions(-) commit 6ff2439b33a9da9a517325bfd472e8cb1fdd4992 Author: Carl Worth Date: Wed Mar 14 16:33:01 2007 -0700 Implement _cairo_traps_tessellate_triangle with _cairo_traps_tessellate_convex_quad The newly rewritten convex_quad code is actually simpler than the triangle code being replaced here. This also allows us to throw away the problematic _compute_x function which can't handle horizontal lines, (divide by zero). So the cairo world becomes a better place. src/cairo-traps.c | 89 +++++----------------------------------------------- 1 files changed, 9 insertions(+), 80 deletions(-) commit 53ae6ea957bac141c033f41276d93bab3a25009f Author: Carl Worth Date: Wed Mar 14 16:30:48 2007 -0700 Fix _cairo_traps_tessellate_convex_quad to handle a == b This case was found in an attempt to use the convex_quad function for tessellating triangles as well. Fortunately the fix is very easy. src/cairo-traps.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) commit 96d8f58daf279238d3a1dfcd4ed3710014e2aeea Author: Chris Wilson Date: Tue Mar 13 20:17:22 2007 +0000 Clear the XRender data on display closure. Use the new hook functions to register a callback for xlib to clear the private glyph data when the display is closed. In order to do this we need to reset the glyph cache inside the generic scaled font as well. src/cairo-xlib-surface.c | 25 +++++++++++++++++++++++++ 1 files changed, 25 insertions(+), 0 deletions(-) commit 52405533b1b191ff98ef3cbc20eaf55e97c8049c Author: Chris Wilson Date: Tue Mar 13 20:42:09 2007 +0000 Privately export a function to reset the scaled font's glyph caches. src/cairo-scaled-font.c | 9 +++++++++ src/cairoint.h | 3 +++ 2 files changed, 12 insertions(+), 0 deletions(-) commit ad7698feb5f818ba2657b01bbc04f7fb537c1297 Author: Chris Wilson Date: Tue Mar 13 20:11:49 2007 +0000 Introduce hooks for _cairo_xlib_close_display() This patch adds a simple hook data type for a notifier style callback and introduces two functions to manipulate a list of callbacks for cleaning up on display closure. src/cairo-xlib-private.h | 15 +++++ src/cairo-xlib-screen.c | 153 ++++++++++++++++++++++++++++++++++++---------- 2 files changed, 136 insertions(+), 32 deletions(-) commit 3d3173d176bc959682a35674c31d3155e8642c41 Author: Carl Worth Date: Wed Mar 14 16:56:45 2007 -0700 Add svg-specific reference image for radial-gradient test. This isn't strictly needed, (pdiff allows the test to pass without the image), but it sure runs faster this way. test/radial-gradient-svg-ref.png | Bin 0 -> 91039 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 75201c12be74055d6209d48d1d698797665a70b4 Author: Carl Worth Date: Wed Mar 14 15:48:15 2007 -0700 check-def.sh: Adjust test to exempt _cairo_test_* functions as well as _cairo_*_test_* This test started failing with the recent renaming of the following three functions, (before they had no cairo in their names so they were not getting picked up at all): _cairo_test_fallback_surface_create _cairo_test_meta_surface_create _cairo_test_paginated_surface_create_for_data With this change, the failure now goes away again. src/check-def.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5d23d0c90c31b233d5916c12eaf2a1dafc441243 Author: Carl Worth Date: Wed Mar 14 15:23:01 2007 -0700 Remove dead-code remnants of old tessellator src/cairo-traps.c | 372 ----------------------------------------------------- 1 files changed, 0 insertions(+), 372 deletions(-) commit 1f3a5b4e1283cc0e55f7ea6baca6d0fe67fd14b1 Author: Carl Worth Date: Tue Mar 13 17:42:39 2007 -0700 Fix bugs in _cairo_traps_tessellate_convex_quad The previous code was not handling all cases correctly, (yes, even something as simple as a quadrilateral can exhibit a remarkably large number of different cases when tessellation is attempted). This fix now introduces slope comparison which handles several cases that were mis-handled with the previous implementation which only used independent sorting of the X and Y values of the coordinates. This fixes the skew-extreme test case and the bug reported here: Skew transforms were broken by the cairo update in December https://bugzilla.mozilla.org/show_bug.cgi?id=373632 src/cairo-traps.c | 101 +++++++++++++++++++++++++++++++---------------------- 1 files changed, 59 insertions(+), 42 deletions(-) commit 0a6ae06c35d99e5e8397c58ee94291e7ee45eb4e Author: Carl Worth Date: Tue Mar 13 17:39:48 2007 -0700 Add new skew-extreme test case. This test currently fails, demonstrating the bug reported here: Skew transforms were broken by the cairo update in December https://bugzilla.mozilla.org/show_bug.cgi?id=373632 test/.gitignore | 1 + test/Makefile.am | 1 + test/skew-extreme-ref.png | Bin 0 -> 1012 bytes test/skew-extreme.c | 126 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 0 deletions(-) commit 40b6d8842e1bcb5fbb3a7dffd0c05b7d3bf6cc6b Author: Carl Worth Date: Tue Mar 13 13:07:42 2007 -0700 Remove radial-gradient test from XFAIL list This test has not been failing since the fix in: 772edc9133d41dfd667ae5915dfa6ace0bcbfd0d So get rid of the '1 unexpected passes' complaint. test/Makefile.am | 1 - test/radial-gradient.c | 3 +-- 2 files changed, 1 insertions(+), 3 deletions(-) commit e803e2e69ba02a1db316c97eb9a8d386709380e2 Author: Behdad Esfahbod Date: Wed Mar 14 17:23:57 2007 -0400 [cairo-pattern] Add a cache of two color stops to cairo_gradient_pattern_t Most of gradients have only two color stops. This avoids calling malloc() for those cases. src/cairo-pattern.c | 25 +++++++++++++++++++++---- src/cairoint.h | 1 + 2 files changed, 22 insertions(+), 4 deletions(-) commit 4514fdca1ba0f3922c2797744f4b0d42d37f8b42 Author: Behdad Esfahbod Date: Tue Mar 13 20:49:52 2007 -0400 [cairo-pattern] Grow color-stops array exponentially src/cairo-pattern.c | 61 ++++++++++++++++++++++++++++++++++++--------------- src/cairoint.h | 3 +- 2 files changed, 45 insertions(+), 19 deletions(-) commit e878f2259b2512f0411d698bf078fe91b7373246 Author: Mathias Hasselmann Date: Wed Mar 14 11:42:41 2007 +0100 Include pixman/src in cairo-perf hash perf/cairo-perf-diff | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 1a3f5df5ff4a80bb199e296491e3a5c9887fd4f7 Author: Mathias Hasselmann Date: Wed Mar 14 21:42:50 2007 +0100 Add index.html to .gitignore perf/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c40be43aef735deba7605fde14300b7810701011 Author: Mathias Hasselmann Date: Wed Mar 14 21:41:40 2007 +0100 Transform the output of cairo-perf-diff into HTML perf/Makefile.am | 8 ++++- perf/cairo-perf-diff | 20 ++++++++--- perf/make-html.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 111 insertions(+), 6 deletions(-) commit f1dd48475a34a038ebdb6426b04fc3728a0f0782 Author: Mathias Hasselmann Date: Wed Mar 14 21:18:09 2007 +0100 Improve CPU utilization when building cairo-perf perf/cairo-perf-diff | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit a7595c1295ba1a58b452b1df31d02776e5c17c0f Author: Behdad Esfahbod Date: Tue Mar 13 17:21:19 2007 -0400 [Makefile.am] Do not distribute cairo-features.h, Ouch! We were accidentally doing that by not marking it noinst. Moreover, no need to mark it as BUILD_SOURCES, since it's created by configure, not make. src/Makefile.am | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit f3c8d82d6d6a759364c4228d9b0badf846debcea Author: Behdad Esfahbod Date: Tue Mar 13 16:51:34 2007 -0400 [test] If backends are limited and all untested, pass the test This is necessary to ensure that limiting backends using CAIRO_TEST_TARGET does not increase the number of tests failing, which is a desirable invariant. test/cairo-test.c | 44 +++++++++++++++++++++++++++++--------------- 1 files changed, 29 insertions(+), 15 deletions(-) commit 30b5f1baa8cbd01ac0a3ff376e294775b600b4e4 Author: Behdad Esfahbod Date: Tue Mar 13 16:50:10 2007 -0400 [test] In pattern-getters test, log what went wrong test/pattern-getters.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) commit 9267cb042418250614db83bd3b2dcb0e7615af79 Author: Behdad Esfahbod Date: Tue Mar 13 16:49:42 2007 -0400 [cairo-pattern] Use _cairo_color_double_to_short() to fix color conversion src/cairo-pattern.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 60502ba3481ea751df6f379e1c38850172826695 Author: Behdad Esfahbod Date: Tue Mar 13 16:13:35 2007 -0400 [cairo-color] Add cairo-private _cairo_color_double_to_short() src/cairo-color.c | 11 ++++++----- src/cairoint.h | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) commit 956fdfbb62ac82da1e6fbd467c50e449ec621937 Author: Behdad Esfahbod Date: Tue Mar 13 06:30:11 2007 -0400 [cairo-pattern] Fix color conversion from short to double We should divide by 65535.0, not 65536.0. src/cairo-pattern.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 20304908626f0af40aeda145b2967a40151728c5 Author: Behdad Esfahbod Date: Tue Mar 13 06:20:21 2007 -0400 [cairo-pattern] Add XXX note src/cairo-pattern.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit deed0f473400bc2e91dde8bad2537d499a5941ea Author: Behdad Esfahbod Date: Tue Mar 13 06:09:09 2007 -0400 [polygon,spline,traps] Avoid free(NULL) src/cairo-polygon.c | 2 +- src/cairo-spline.c | 2 +- src/cairo-traps.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) commit b706bd9b38d505d2b09e932a8f362fac76ef64de Author: Behdad Esfahbod Date: Tue Mar 13 06:07:03 2007 -0400 [cairo-polygon] Add a cache of eight edges to cairo_polygon_t Many, if not most, of polygons have very few edges. This avoids calling malloc() for those cases. src/cairo-polygon.c | 30 +++++++++++++++++++++++------- src/cairoint.h | 1 + 2 files changed, 24 insertions(+), 7 deletions(-) commit d8165d5424718404946c3a72d59396fc604d1bce Author: Behdad Esfahbod Date: Tue Mar 13 05:59:33 2007 -0400 [cairo-spline] Fix typo in comment src/cairo-spline.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit cca7e3fec3a3ec68f812690aa7efafa7dc237849 Author: Behdad Esfahbod Date: Tue Mar 13 05:56:38 2007 -0400 [cairo_polygon_t] Change has_current_point from int to cairo_bool_t src/cairo-polygon.c | 8 ++++---- src/cairoint.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) commit 81e15a454b188aa8dd03eb599d0fb4af834695f1 Author: Behdad Esfahbod Date: Tue Mar 13 05:55:45 2007 -0400 [cairo_polygon_t] Remove unused member 'closed' src/cairoint.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 2bf4ce389d05e07698e03374c3d05436f5d2b2e4 Author: Behdad Esfahbod Date: Tue Mar 13 05:53:13 2007 -0400 [cairo_polygon_t] Reorder struct members for clarity src/cairoint.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 3ce84390de8be69f369a4da80c3039b716ebb0e4 Author: Behdad Esfahbod Date: Tue Mar 13 05:51:39 2007 -0400 [cairo-polygon] Clean-up realloc algorithm for clarity src/cairo-polygon.c | 18 +++++++----------- 1 files changed, 7 insertions(+), 11 deletions(-) commit 6976ab1392e0fd07a081e6d6056510070e1d6df9 Author: Behdad Esfahbod Date: Fri Mar 9 16:23:35 2007 -0500 [cairo-slope] Make comparison stable if both vectors are zero src/cairo-slope.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 9eee167210b6cc562014652572872cf0a7ccb00e Author: Behdad Esfahbod Date: Thu Mar 8 22:34:44 2007 -0500 [cairo-spline] Add a cache of eight points to cairo_spline_t Most of the splines need not more than eight points. This avoids calling malloc() for those cases, and eight-points take only 64 bytes. src/cairo-spline.c | 28 +++++++++++++++++++++++----- src/cairoint.h | 1 + 2 files changed, 24 insertions(+), 5 deletions(-) commit 1e64ecf0758a208b469ae0a87a747b3a70c70ceb Author: Behdad Esfahbod Date: Thu Mar 8 22:17:30 2007 -0500 [cairo-spline] Clean-up realloc algorithm for clarity src/cairo-spline.c | 17 +++++++---------- 1 files changed, 7 insertions(+), 10 deletions(-) commit cee687a33fb46b68d39bbfa64c44f0b28e10a9ee Author: Behdad Esfahbod Date: Thu Mar 8 22:19:49 2007 -0500 [cairo_traps_t] Reorder struct members for clarity src/cairoint.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 24aec99ffb9abce659146ea6ecbfb92856355855 Author: Behdad Esfahbod Date: Thu Mar 8 20:32:36 2007 -0500 [cairo-traps] Add a cache of one trapezoid to cairo_traps_t Seems like half the time, we just need one trap. This avoids calling malloc() for those cases. src/cairo-traps.c | 30 +++++++++++++++++++++++------- src/cairoint.h | 2 ++ 2 files changed, 25 insertions(+), 7 deletions(-) commit 4737416c6e7829ec21230103a1b993d2bd08cc0e Author: Behdad Esfahbod Date: Thu Mar 8 20:05:13 2007 -0500 [cairo-traps] Clean-up realloc algorithm for clarity src/cairo-traps.c | 21 +++++++++------------ 1 files changed, 9 insertions(+), 12 deletions(-) commit a9d8cb3e8aceb5831dfb3920df1502bf3b9450a6 Author: Behdad Esfahbod Date: Thu Mar 8 19:34:43 2007 -0500 [cairo-traps] Use INT32_MIN/MAX instead of INT16_MIN/MAX << 16 src/cairo-traps.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 5d28bf605fee84520e82818dd35cae8899ecc2ba Author: Behdad Esfahbod Date: Thu Mar 8 19:22:57 2007 -0500 [test] Make pdiff if necessary test/Makefile.am | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit e765ac745e0438296d2c852fd8231bd8f1fff034 Author: Behdad Esfahbod Date: Thu Mar 8 18:13:55 2007 -0500 [skiplist] Prefix symbols with _cairo src/cairo-bentley-ottmann.c | 24 ++++++++++++------------ src/cairo-skiplist-private.h | 22 +++++++++++----------- src/cairo-skiplist.c | 20 ++++++++++---------- 3 files changed, 33 insertions(+), 33 deletions(-) commit cd78da36f663b99c67d50dcd692cd7b67677c82a Author: Behdad Esfahbod Date: Thu Mar 8 18:08:37 2007 -0500 [test-surfaces] Prefix public symbols with _cairo boilerplate/cairo-boilerplate.c | 6 +++--- src/test-fallback-surface.c | 8 ++++---- src/test-fallback-surface.h | 2 +- src/test-meta-surface.c | 2 +- src/test-meta-surface.h | 2 +- src/test-paginated-surface.c | 2 +- src/test-paginated-surface.h | 2 +- 7 files changed, 12 insertions(+), 12 deletions(-) commit 8997b3a023b0edb8877675ce520fbb883d6fa188 Author: Behdad Esfahbod Date: Thu Mar 8 17:54:00 2007 -0500 [skiplist] Move static variable out of function Part of my secrect plan to make cairo compilable with: #define static Useful for some weird debugging purposes. src/cairo-skiplist.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) commit d40126f5aba481e4f4d9582cb5c37478f8ef37e7 Author: Behdad Esfahbod Date: Thu Mar 8 17:47:33 2007 -0500 [cairo_t] Embed a gstate into cairo_t So we don't have to malloc the first gstate. src/cairo-gstate.c | 44 ++------------------------------------------ src/cairo-private.h | 1 + src/cairo.c | 32 ++++++++++++++------------------ src/cairoint.h | 10 +++++++--- 4 files changed, 24 insertions(+), 63 deletions(-) commit 01f9ee39feb6ca48b9e07fdec62d8ab1b94ab75d Author: Behdad Esfahbod Date: Thu Mar 8 17:42:23 2007 -0500 [cairo-clip] Make _cairo_clip_init tolerate NULL target (needed for upcoming patches.) src/cairo-clip.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit bc8987068d1849cf7c16c38132fcc3c8d3b4e12e Author: Behdad Esfahbod Date: Thu Mar 8 17:15:35 2007 -0500 [cairo_t] Make path an array of size one This is more natural since cr->path can be used as if it was a pointer. This means, for example, if we move on to making it a pointer, most of the code using it does not need any change. So we get some level of encapsulation of implementation details, if you prefer the terminology :). src/cairo-private.h | 2 +- src/cairo.c | 52 +++++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) commit 74e6a24e98baf70284b65d5f4ed41bdf7449d72d Author: Behdad Esfahbod Date: Thu Mar 8 17:04:43 2007 -0500 [Quartz] Don't include cairo-private.h src/cairo-quartz-surface.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 6bc543a0ebe4076da31bad4d3ccca4d713948587 Author: Behdad Esfahbod Date: Thu Mar 8 16:58:18 2007 -0500 [cairo_t] Move gstate pointer before cairo_path_fixed_t for better cache behavior src/cairo-private.h | 4 ++-- src/cairo.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) commit 85aff353ca38e607599282bc955e467df82fa01b Author: Behdad Esfahbod Date: Thu Mar 8 16:52:09 2007 -0500 [cairo-path-fixed] Fine-tune size of buffer such that cairo_path_fixed_t fits in 512 bytes. src/cairo-path-fixed-private.h | 10 ++++++---- src/cairo.c | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) commit 1bd073a1a2951bbb09fdab6637baae0172a223f0 Author: Behdad Esfahbod Date: Thu Mar 8 16:23:49 2007 -0500 [cairo-path-fixed] Merge op and arg bufs This means, we have to malloc only one buffer, not two. Worst case is that one always draws curves, which fills the arg (point) buffer six times faster than op buffer. But that's not a big deal since each op takes 1 byte, while each point takes 8 bytes. So op space is cheap to spare, so to speak (about 10% memory waste at worst). src/cairo-path-fill.c | 51 ++++---- src/cairo-path-fixed-private.h | 22 +-- src/cairo-path-fixed.c | 313 ++++++++++++++-------------------------- src/cairo.c | 3 +- 4 files changed, 141 insertions(+), 248 deletions(-) commit 5750d669af24fe1d2707326b9d74dfbb18adf636 Author: Behdad Esfahbod Date: Thu Mar 8 14:30:10 2007 -0500 [cairo-path-fixed] Avoid malloc for small paths We do this by including an initial op and arg buf in cairo_path_fixed_t, so for small paths we don't have to alloc those buffers. The way this is done is a bit unusual. Specifically, using an array of length one instead of a normal member: - cairo_path_op_buf_t *op_buf_head; + cairo_path_op_buf_t op_buf_head[1]; Has the advantage that read-only use of the buffers does not need any change as arrays act like pointers syntactically. All manipulation code however needs to be updates, which the patch supposed does. Still, there seems to be bugs remaining as cairo-perf quits with a Bad X Request error with this patch. src/cairo-path-fixed-private.h | 4 +- src/cairo-path-fixed.c | 68 +++++++++++++++++++++++----------------- src/cairo.c | 4 +- 3 files changed, 43 insertions(+), 33 deletions(-) commit 994dd1a134484d7a1ee246906f21f02d916014a8 Author: Behdad Esfahbod Date: Tue Mar 13 04:56:54 2007 -0400 [boilerplate] Prefer top_builddir to top_srcdir This may fix some build problems the Ubuntu guys are experiencing with out-of-tree builds. boilerplate/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2894ed19a3acd955a5d0e2f5a231a6f1eee8ac06 Author: Behdad Esfahbod Date: Tue Mar 13 04:55:18 2007 -0400 [directfb,os2] #error if the backend is not compiled in, like others do src/cairo-directfb.h | 3 +++ src/cairo-os2.h | 2 ++ 2 files changed, 5 insertions(+), 0 deletions(-) commit 073d06d4661feb16b15ece5282a5134e3f05d8e7 Author: Adrian Johnson Date: Tue Mar 13 18:45:38 2007 +1030 Fix incorrect file permission in previous commit 0 files changed, 0 insertions(+), 0 deletions(-) commit a944f42b3d58825e8def292001e3738651b7584a Author: Adrian Johnson Date: Tue Mar 13 18:35:59 2007 +1030 Fix buffer overflow warning src/cairo-truetype-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0f78eb8ccf60c60a4b66441958a7498dc9f7fa47 Author: Carl Worth Date: Mon Mar 12 16:24:58 2007 -0700 perf/README: Add notes on using cairo-perf-diff perf/README | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 93 insertions(+), 12 deletions(-) commit 14cab8b020f429d346561d8ab70b154b2e3f0668 Author: Chris Wilson Date: Sun Mar 11 21:55:19 2007 +0000 Correct an off-by-one in the reflection of the convolution index. Currently the convolution code uses the formula 2*(N-1)-n to reflect the index n when n is greater than or equal to N. This is wrong as n=N -> 2*(N-1)-N = N-2 instead of N-1. Furthermore when the image is small, e.g. at the highest levels of the pyramid, this causes the code to index before the start of the array and causes valgrind to issue a warning. test/pdiff/lpyramid.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 789aada06b52e068662f0ac0f7a424c51bcba510 Author: Chris Wilson Date: Sun Mar 11 20:55:26 2007 +0000 Avoid the struct copy when source and destination are the same. On some architectures, gcc will emit a memcpy for structure copies which will produce a valgrind warning when the source and destination pointers are the same. Workaround this issue by explicitly checking the source and destination for inequality before doing the structure assignment. src/cairo-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit ef284a2d6bbeae8711226f1f1f2cf4936f6937eb Author: Carl Worth Date: Fri Mar 9 13:36:03 2007 -0800 Fix a LOCK vs. UNLOCK typo, (yes, I'm that stupid). Thanks to M.Drochner@fz-juelich.de for noticing the bug. This fixes bug #10235: locking bug in cairo_ft_scaled_font_unlock_face() http://bugs.freedesktop.org/show_bug.cgi?id=10235 src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 772edc9133d41dfd667ae5915dfa6ace0bcbfd0d Author: Emmanuel Pacaud Date: Thu Mar 8 21:32:59 2007 +0100 SVG: fix a radial gradient failure when using CAIRO_EXTEND_REFLECT. Assume from the beginning we're using a circle with a radius equal to 2 * ( r1 - r0 ) when emulating CAIRO_EXTEND_REFLECT. src/cairo-svg-surface.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit c07867c545d7ab7c4a104944768f8a5b69ef9596 Author: Behdad Esfahbod Date: Wed Mar 7 15:55:02 2007 -0500 [glitz] Mark some constant static structures as const src/cairo-glitz-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 88632575bfae348a63e3e6228d5ceaa64715ae5f Author: Behdad Esfahbod Date: Wed Mar 7 15:54:20 2007 -0500 [PS/PDF/SVG] Rename internal symbols to have _cairo_*_surface prefix src/cairo-pdf-surface.c | 74 +++++++++++++------------- src/cairo-ps-surface.c | 52 +++++++++--------- src/cairo-svg-surface.c | 136 +++++++++++++++++++++++----------------------- 3 files changed, 131 insertions(+), 131 deletions(-) commit 2cc1c73705d70f834b43996f70080860ac66e57d Author: Behdad Esfahbod Date: Wed Mar 7 15:53:27 2007 -0500 [cairoint] Move endian-conversion routines into cairoint.h src/cairo-cff-subset.c | 28 ---------------------------- src/cairo-truetype-subset.c | 37 ------------------------------------- src/cairoint.h | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 65 deletions(-) commit 62e864e73cd1136b3c0e889dca43a1c0cc648b21 Author: Behdad Esfahbod Date: Wed Mar 7 15:51:35 2007 -0500 [Type1] Add cairo-type1-private.h that Type1 fallback and subset code share doc/public/Headers.mk | 1 + src/Makefile.am | 1 + src/cairo-type1-fallback.c | 14 ++++-------- src/cairo-type1-private.h | 45 ++++++++++++++++++++++++++++++++++++++++++++ src/cairo-type1-subset.c | 18 ++++++---------- 5 files changed, 59 insertions(+), 20 deletions(-) commit ef9799d596600aea334707d2ff00fcca82280d83 Author: Behdad Esfahbod Date: Wed Mar 7 15:49:51 2007 -0500 [cosmetic] Remove static var from testing code in bentley-ottman. src/cairo-bentley-ottmann.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 92d331a23407c79d83bf0b2a7d003ba3525641d4 Author: Chris Wilson Date: Wed Mar 7 13:31:54 2007 +0000 Fix up the trivial leaks found by valgrind. perf/cairo-perf.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 7d972086d6ea6a6bfa47b5fb47f7a21be61e10e8 Author: Chris Wilson Date: Wed Mar 7 12:19:44 2007 +0000 Add valgrind/callgrind targets to Makefile. perf/Makefile.am | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) commit 734d32ed7a50284fcc8984af67734bb306735691 Author: Emmanuel Pacaud Date: Tue Mar 6 15:49:53 2007 -0800 SVG: Fix CAIRO_EXTEND_REFLECT for radial gradients. This patch also handles cases where r0 > r1, (one circle must still be wholly contained within the other as that's all SVG supports). This patch should also prevent a crash when r0 == r1. src/cairo-svg-surface.c | 337 ++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 277 insertions(+), 60 deletions(-) commit 32536a7b794c38ff1944b8af5e56e8962e76c311 Author: Brian Ewins Date: Tue Mar 6 23:45:23 2007 +0000 [atsui] clean up warnings Just tidying up warnings left behind by previous fixes. src/cairo-atsui-font.c | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-) commit 9032bf4e2d3bffe84d11a771ba4072cdd8926b77 Author: Brian Ewins Date: Tue Mar 6 23:24:33 2007 +0000 [quartz] rename remaining nquartz symbols to quartz. Renaming any nquartz symbols and files left to quartz. doc/public/Makefile.am | 1 - src/Makefile.am | 2 - src/cairo-quartz-private.h | 6 +- src/cairo-quartz-surface.c | 238 ++++++++++++++++++++++---------------------- 4 files changed, 122 insertions(+), 125 deletions(-) commit b0d05f7421c457120b9d86a83c4935c67b217fab Author: Behdad Esfahbod Date: Tue Mar 6 14:26:51 2007 -0500 [configure.in] Remove AM_MAINTAINER_MODE Maintainer-mode is known broken behavior and discouraged. It has created headaches before when you run configure and all in a sudden editing Makefile.am's does not trigger a Makefile update... configure.in | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit f7beb220df74fef60c102fb5cc827fb2d3962296 Author: Behdad Esfahbod Date: Tue Mar 6 10:33:09 2007 -0500 Remove extra word in docs src/cairo.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 81b98c93b68839d20d3033170eeb5026257d52b8 Author: Adrian Johnson Date: Tue Mar 6 23:11:38 2007 +1030 PDF: Set page group color space to DeviceRGB See http://lists.freedesktop.org/archives/cairo/2006-November/008551.html src/cairo-pdf-surface.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 8f0ff52cf74fe4b18c46f9a62689b991645295d0 Author: Carl Worth Date: Tue Mar 6 01:39:37 2007 -0800 Increment version to 1.4.1 after making the 1.4.0 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) libgdiplus-2.11/cairo/config.h.in0000664000175000017500000001305612225470575013654 00000000000000/* config.h.in. Generated from configure.in by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* whether Cairo needs memory barriers around atomic ops */ #undef CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER /* define if glitz backend can be tested against agl */ #undef CAIRO_CAN_TEST_GLITZ_AGL_SURFACE /* define if glitz backend can be tested against egl */ #undef CAIRO_CAN_TEST_GLITZ_EGL_SURFACE /* define if glitz backend can be tested against glx */ #undef CAIRO_CAN_TEST_GLITZ_GLX_SURFACE /* define if glitz backend can be tested against wgl */ #undef CAIRO_CAN_TEST_GLITZ_WGL_SURFACE /* Define to 1 if the PDF backend can be tested (need poppler and other dependencies for pdf2png) */ #undef CAIRO_CAN_TEST_PDF_SURFACE /* Define to 1 if the PS backend can be tested (needs ghostscript) */ #undef CAIRO_CAN_TEST_PS_SURFACE /* Define to 1 if the SVG backend can be tested */ #undef CAIRO_CAN_TEST_SVG_SURFACE /* Define to 1 if the Win32 Printing backend can be tested (needs ghostscript) */ #undef CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE /* Enable if your compiler supports the Intel __sync_* atomic primitives */ #undef CAIRO_HAS_INTEL_ATOMIC_PRIMITIVES /* define in the extra test surface have been built into cairo for the test suite */ #undef CAIRO_HAS_TEST_SURFACES /* Define to 1 to disable certain code paths that rely heavily on double precision floating-point calculation */ #undef DISABLE_SOME_FLOATING_POINT /* Define to 1 if your system stores words within floats with the most significant word first */ #undef FLOAT_WORDS_BIGENDIAN /* Define to 1 if you have the `ctime_r' function. */ #undef HAVE_CTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the `drand48' function. */ #undef HAVE_DRAND48 /* FT_Bitmap_Size structure includes y_ppem field */ #undef HAVE_FT_BITMAP_SIZE_Y_PPEM /* Define to 1 if you have the `FT_GlyphSlot_Embolden' function. */ #undef HAVE_FT_GLYPHSLOT_EMBOLDEN /* Define to 1 if you have the `FT_Load_Sfnt_Table' function. */ #undef HAVE_FT_LOAD_SFNT_TABLE /* Whether you have gcov */ #undef HAVE_GCOV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_LIBGEN_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `poppler_page_render_to_pixbuf' function. */ #undef HAVE_POPPLER_PAGE_RENDER_TO_PIXBUF /* Define to 1 if you have the header file. */ #undef HAVE_PTHREAD_H /* Define to 1 if you have the `rsvg_pixbuf_from_file' function. */ #undef HAVE_RSVG_PIXBUF_FROM_FILE /* Define to 1 if you have Linux compatible sched_getaffinity */ #undef HAVE_SCHED_GETAFFINITY /* Define to 1 if you have the header file. */ #undef HAVE_SCHED_H /* Define to 1 if you have the header file. */ #undef HAVE_SIGNAL_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_INT_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if the system has the type `uint128_t'. */ #undef HAVE_UINT128_T /* Define to 1 if the system has the type `uint64_t'. */ #undef HAVE_UINT64_T /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vasnprintf' function. */ #undef HAVE_VASNPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_WINDOWS_H /* Define to the sub-directory in which libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Define to the value your compiler uses to support the warn-unused-result attribute */ #undef WARN_UNUSED_RESULT /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Deal with multiple architecture compiles on Mac OS X */ #ifdef __APPLE_CC__ #ifdef __BIG_ENDIAN__ #define WORDS_BIGENDIAN 1 #define FLOAT_WORDS_BIGENDIAN 1 #else #undef WORDS_BIGENDIAN #undef FLOAT_WORDS_BIGENDIAN #endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif libgdiplus-2.11/cairo/COPYING-MPL-1.10000664000175000017500000006223312225470167013605 00000000000000 MOZILLA PUBLIC LICENSE Version 1.1 --------------- 1. Definitions. 1.0.1. "Commercial Use" means distribution or otherwise making the Covered Code available to a third party. 1.1. "Contributor" means each entity that creates or contributes to the creation of Modifications. 1.2. "Contributor Version" means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor. 1.3. "Covered Code" means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof. 1.4. "Electronic Distribution Mechanism" means a mechanism generally accepted in the software development community for the electronic transfer of data. 1.5. "Executable" means Covered Code in any form other than Source Code. 1.6. "Initial Developer" means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A. 1.7. "Larger Work" means a work which combines Covered Code or portions thereof with code not governed by the terms of this License. 1.8. "License" means this document. 1.8.1. "Licensable" means having the right to grant, to the maximum extent possible, whether at the time of the initial grant or subsequently acquired, any and all of the rights conveyed herein. 1.9. "Modifications" means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is: A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications. B. Any new file that contains any part of the Original Code or previous Modifications. 1.10. "Original Code" means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License. 1.10.1. "Patent Claims" means any patent claim(s), now owned or hereafter acquired, including without limitation, method, process, and apparatus claims, in any patent Licensable by grantor. 1.11. "Source Code" means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge. 1.12. "You" (or "Your") means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, "You" includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, "control" means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity. 2. Source Code License. 2.1. The Initial Developer Grant. The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims: (a) under intellectual property rights (other than patent or trademark) Licensable by Initial Developer to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, and/or as part of a Larger Work; and (b) under Patents Claims infringed by the making, using or selling of Original Code, to make, have made, use, practice, sell, and offer for sale, and/or otherwise dispose of the Original Code (or portions thereof). (c) the licenses granted in this Section 2.1(a) and (b) are effective on the date Initial Developer first distributes Original Code under the terms of this License. (d) Notwithstanding Section 2.1(b) above, no patent license is granted: 1) for code that You delete from the Original Code; 2) separate from the Original Code; or 3) for infringements caused by: i) the modification of the Original Code or ii) the combination of the Original Code with other software or devices. 2.2. Contributor Grant. Subject to third party intellectual property claims, each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license (a) under intellectual property rights (other than patent or trademark) Licensable by Contributor, to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code and/or as part of a Larger Work; and (b) under Patent Claims infringed by the making, using, or selling of Modifications made by that Contributor either alone and/or in combination with its Contributor Version (or portions of such combination), to make, use, sell, offer for sale, have made, and/or otherwise dispose of: 1) Modifications made by that Contributor (or portions thereof); and 2) the combination of Modifications made by that Contributor with its Contributor Version (or portions of such combination). (c) the licenses granted in Sections 2.2(a) and 2.2(b) are effective on the date Contributor first makes Commercial Use of the Covered Code. (d) Notwithstanding Section 2.2(b) above, no patent license is granted: 1) for any code that Contributor has deleted from the Contributor Version; 2) separate from the Contributor Version; 3) for infringements caused by: i) third party modifications of Contributor Version or ii) the combination of Modifications made by that Contributor with other software (except as part of the Contributor Version) or other devices; or 4) under Patent Claims infringed by Covered Code in the absence of Modifications made by that Contributor. 3. Distribution Obligations. 3.1. Application of License. The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5. 3.2. Availability of Source Code. Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party. 3.3. Description of Modifications. You must cause all Covered Code to which You contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code. 3.4. Intellectual Property Matters (a) Third Party Claims. If Contributor has knowledge that a license under a third party's intellectual property rights is required to exercise the rights granted by such Contributor under Sections 2.1 or 2.2, Contributor must include a text file with the Source Code distribution titled "LEGAL" which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If Contributor obtains such knowledge after the Modification is made available as described in Section 3.2, Contributor shall promptly modify the LEGAL file in all copies Contributor makes available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained. (b) Contributor APIs. If Contributor's Modifications include an application programming interface and Contributor has knowledge of patent licenses which are reasonably necessary to implement that API, Contributor must also include this information in the LEGAL file. (c) Representations. Contributor represents that, except as disclosed pursuant to Section 3.4(a) above, Contributor believes that Contributor's Modifications are Contributor's original creation(s) and/or Contributor has sufficient rights to grant the rights conveyed by this License. 3.5. Required Notices. You must duplicate the notice in Exhibit A in each file of the Source Code. If it is not possible to put such notice in a particular Source Code file due to its structure, then You must include such notice in a location (such as a relevant directory) where a user would be likely to look for such a notice. If You created one or more Modification(s) You may add your name as a Contributor to the notice described in Exhibit A. You must also duplicate this License in any documentation for the Source Code where You describe recipients' rights or ownership rights relating to Covered Code. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer. 3.6. Distribution of Executable Versions. You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code or ownership rights under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer. 3.7. Larger Works. You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code. 4. Inability to Comply Due to Statute or Regulation. If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute, judicial order, or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it. 5. Application of this License. This License applies to code to which the Initial Developer has attached the notice in Exhibit A and to related Covered Code. 6. Versions of the License. 6.1. New Versions. Netscape Communications Corporation ("Netscape") may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number. 6.2. Effect of New Versions. Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License. 6.3. Derivative Works. If You create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), You must (a) rename Your license so that the phrases "Mozilla", "MOZILLAPL", "MOZPL", "Netscape", "MPL", "NPL" or any confusingly similar phrase do not appear in your license (except to note that your license differs from this License) and (b) otherwise make it clear that Your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.) 7. DISCLAIMER OF WARRANTY. COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. 8. TERMINATION. 8.1. This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive. 8.2. If You initiate litigation by asserting a patent infringement claim (excluding declatory judgment actions) against Initial Developer or a Contributor (the Initial Developer or Contributor against whom You file such action is referred to as "Participant") alleging that: (a) such Participant's Contributor Version directly or indirectly infringes any patent, then any and all rights granted by such Participant to You under Sections 2.1 and/or 2.2 of this License shall, upon 60 days notice from Participant terminate prospectively, unless if within 60 days after receipt of notice You either: (i) agree in writing to pay Participant a mutually agreeable reasonable royalty for Your past and future use of Modifications made by such Participant, or (ii) withdraw Your litigation claim with respect to the Contributor Version against such Participant. If within 60 days of notice, a reasonable royalty and payment arrangement are not mutually agreed upon in writing by the parties or the litigation claim is not withdrawn, the rights granted by Participant to You under Sections 2.1 and/or 2.2 automatically terminate at the expiration of the 60 day notice period specified above. (b) any software, hardware, or device, other than such Participant's Contributor Version, directly or indirectly infringes any patent, then any rights granted to You by such Participant under Sections 2.1(b) and 2.2(b) are revoked effective as of the date You first made, used, sold, distributed, or had made, Modifications made by that Participant. 8.3. If You assert a patent infringement claim against Participant alleging that such Participant's Contributor Version directly or indirectly infringes any patent where such claim is resolved (such as by license or settlement) prior to the initiation of patent infringement litigation, then the reasonable value of the licenses granted by such Participant under Sections 2.1 or 2.2 shall be taken into account in determining the amount or value of any payment or license. 8.4. In the event of termination under Sections 8.1 or 8.2 above, all end user license agreements (excluding distributors and resellers) which have been validly granted by You or any distributor hereunder prior to termination shall survive termination. 9. LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL YOU, THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU. 10. U.S. GOVERNMENT END USERS. The Covered Code is a "commercial item," as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of "commercial computer software" and "commercial computer software documentation," as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein. 11. MISCELLANEOUS. This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in the United States of America, any litigation relating to this License shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys' fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License. 12. RESPONSIBILITY FOR CLAIMS. As between Initial Developer and the Contributors, each party is responsible for claims and damages arising, directly or indirectly, out of its utilization of rights under this License and You agree to work with Initial Developer and Contributors to distribute such responsibility on an equitable basis. Nothing herein is intended or shall be deemed to constitute any admission of liability. 13. MULTIPLE-LICENSED CODE. Initial Developer may designate portions of the Covered Code as "Multiple-Licensed". "Multiple-Licensed" means that the Initial Developer permits you to utilize portions of the Covered Code under Your choice of the NPL or the alternative licenses, if any, specified by the Initial Developer in the file described in Exhibit A. EXHIBIT A -Mozilla Public License. ``The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. The Original Code is ______________________________________. The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved. Contributor(s): ______________________________________. Alternatively, the contents of this file may be used under the terms of the _____ license (the "[___] License"), in which case the provisions of [______] License are applicable instead of those above. If you wish to allow use of your version of this file only under the terms of the [____] License and not to allow others to use your version of this file under the MPL, indicate your decision by deleting the provisions above and replace them with the notice and other provisions required by the [___] License. If you do not delete the provisions above, a recipient may use your version of this file under either the MPL or the [___] License." [NOTE: The text of this Exhibit A may differ slightly from the text of the notices in the Source Code files of the Original Code. You should use the text of this Exhibit A rather than the text found in the Original Code Source Code for Your Modifications.] libgdiplus-2.11/cairo/COPYING0000664000175000017500000000300312225470167012650 00000000000000Cairo is free software. Every source file in the implementation[*] of cairo is available to be redistributed and/or modified under the terms of either the GNU Lesser General Public License (LGPL) version 2.1 or the Mozilla Public License (MPL) version 1.1. Some files are available under more liberal terms, but we believe that in all cases, each file may be used under either the LGPL or the MPL. See the following files in this directory for the precise terms and conditions of either license: COPYING-LGPL-2.1 COPYING-MPL-1.1 Please see each file in the implementation for copyright and licensing information, (in the opening comment of each file). [*] The implementation of cairo is contained entirely within the "src" and "pixman" directories of the cairo source distribution. There are other components of the cairo source distribution (such as the "test" and "perf") that are auxiliary to the library itself. None of the source code in these directories contributes to a build of the cairo library itself, (libcairo.so or cairo.dll or similar). These auxilary components are also free software, but may be under different license terms than cairo itself. For example, most of the test cases in the perf and test directories are made available under an MIT license to simplify any use of this code for reference purposes in using cairo itself. Other files might be available under the GNU General Public License (GPL), for example. Again, please see the opening comment of each file for copyright and licensing information. libgdiplus-2.11/cairo/Makefile.win320000664000175000017500000000371012225470167014223 00000000000000# # Win32 makefile # CC := cl LINK := link ifeq ($(CFG),debug) OPT := -Od -Zi else OPT := -O2 endif PIXMAN_CFLAGS := -I../../pixman/pixman PIXMAN_LIBS := ../../pixman/pixman/$(CFG)/pixman-1.lib EXE_LDFLAGS = libpng.lib zlib.lib gdi32.lib msimg32.lib user32.lib DEFAULT_CFLAGS = -MD -nologo $(OPT) DEFAULT_CFLAGS += -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE DEFAULT_CFLAGS += -DPACKAGE_VERSION="" -DPACKAGE_BUGREPORT="" -DCAIRO_BUILD DEFAULT_CFLAGS += -I. DEFAULT_CFLAGS += $(PIXMAN_CFLAGS) DEFAULT_CFLAGS += -DCAIRO_NO_MUTEX=1 -DLIBCAIRO_EXPORTS CFLAGS := $(DEFAULT_CFLAGS) CAIRO_VERSION_MAJOR = 1 CAIRO_VERSION_MINOR = 5 CAIRO_VERSION_MICRO = 1 CAIRO_VERSION = $(CAIRO_VERSION_MAJOR).$(CAIRO_VERSION_MINOR).$(CAIRO_VERSION_MICRO) # Only if this was called as the top-level makefile ifeq ($(SUBMAKEFILE),) SUBDIRS = src TEST_SUBDIRS = boilerplate test all: inform cairo cairo: src/cairo-features.h @list='$(SUBDIRS)'; for f in $$list ; do \ echo making all in $$f... ; \ (cd $$f ; $(MAKE) -f Makefile.win32 CC="$(CC)" LINK="$(LINK)" OPT="$(OPT)" CFLAGS="$(CFLAGS)" PIXMAN_LIBS="$(PIXMAN_LIBS)") || exit 1 ; \ done test: cairo @list='$(TEST_SUBDIRS)'; for f in $$list ; do \ echo making all in $$f... ; \ (cd $$f ; $(MAKE) -f Makefile.win32 CC="$(CC)" LINK="$(LINK)" OPT="$(OPT)" CFLAGS="$(CFLAGS)" PIXMAN_LIBS="$(PIXMAN_LIBS)") || exit 1 ; \ done @(cd test ; make -f Makefile.win32 test) html: @(cd test ; make -f Makefile.win32 html) inform: ifneq ($(CFG),release) ifneq ($(CFG),debug) @echo "Invalid configuration "$(CFG)" specified." @echo -n "You must specify a configuration when " @echo "running make, e.g. make CFG=debug" @echo @echo -n "Possible choices for configuration are " @echo "'release' and 'debug'" @exit 1 endif endif endif # Some generic rules $(CFG)/%.obj: %.c @mkdir -p $(CFG) @$(CC) $(CFLAGS) -c -Fo"$@" $< $(CFG)/%-static.obj: %.c @mkdir -p $(CFG) @$(CC) $(CFLAGS) -c -DCAIRO_WIN32_STATIC_BUILD=1 -Fo"$@" $< libgdiplus-2.11/cairo/acinclude.m40000664000175000017500000001011612225470167014011 00000000000000dnl -*- mode: autoconf -*- # serial 1 dnl Usage: dnl GTK_DOC_CHECK([minimum-gtk-doc-version]) AC_DEFUN([GTK_DOC_CHECK], [ AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first dnl for overriding the documentation installation directory AC_ARG_WITH(html-dir, AC_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),, [with_html_dir='${datadir}/gtk-doc/html']) HTML_DIR="$with_html_dir" AC_SUBST(HTML_DIR) dnl enable/disable documentation building AC_ARG_ENABLE(gtk-doc, AC_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [default=no]]),, enable_gtk_doc=no) have_gtk_doc=no if test x$enable_gtk_doc = xyes; then if test -z "$PKG_CONFIG"; then AC_PATH_PROG(PKG_CONFIG, pkg-config, no) fi if test "$PKG_CONFIG" != "no" && $PKG_CONFIG --exists gtk-doc; then have_gtk_doc=yes fi dnl do we want to do a version check? ifelse([$1],[],, [gtk_doc_min_version=$1 if test "$have_gtk_doc" = yes; then AC_MSG_CHECKING([gtk-doc version >= $gtk_doc_min_version]) if $PKG_CONFIG --atleast-version $gtk_doc_min_version gtk-doc; then AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) have_gtk_doc=no fi fi ]) if test "$have_gtk_doc" != yes; then enable_gtk_doc=no fi fi AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes) AM_CONDITIONAL(GTK_DOC_USE_LIBTOOL, test -n "$LIBTOOL") ]) # AX_C_FLOAT_WORDS_BIGENDIAN ([ACTION-IF-TRUE], [ACTION-IF-FALSE], # [ACTION-IF-UNKNOWN]) # # Checks the ordering of words within a multi-word float. This check # is necessary because on some systems (e.g. certain ARM systems), the # float word ordering can be different from the byte ordering. In a # multi-word float context, "big-endian" implies that the word containing # the sign bit is found in the memory location with the lowest address. # This implemenation was inspired by the AC_C_BIGENDIAN macro in autoconf. # ------------------------------------------------------------------------- AC_DEFUN([AX_C_FLOAT_WORDS_BIGENDIAN], [AC_CACHE_CHECK(whether float word ordering is bigendian, ax_cv_c_float_words_bigendian, [ # The endianess is detected by first compiling C code that contains a special # double float value, then grepping the resulting object file for certain # strings of ascii values. The double is specially crafted to have a # binary representation that corresponds with a simple string. In this # implementation, the string "noonsees" was selected because the individual # word values ("noon" and "sees") are palindromes, thus making this test # byte-order agnostic. If grep finds the string "noonsees" in the object # file, the target platform stores float words in big-endian order. If grep # finds "seesnoon", float words are in little-endian order. If neither value # is found, the user is instructed to specify the ordering. ax_cv_c_float_words_bigendian=unknown AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; ]])], [ if strings - conftest.$ac_objext | grep noonsees >/dev/null ; then ax_cv_c_float_words_bigendian=yes fi if strings - conftest.$ac_objext | grep seesnoon >/dev/null ; then if test "$ax_cv_c_float_words_bigendian" = unknown; then ax_cv_c_float_words_bigendian=no else ax_cv_c_float_words_bigendian=unknown fi fi ])]) case $ax_cv_c_float_words_bigendian in yes) m4_default([$1], [AC_DEFINE([FLOAT_WORDS_BIGENDIAN], 1, [Define to 1 if your system stores words within floats with the most significant word first])]) ;; no) $2 ;; *) m4_default([$3], [AC_MSG_ERROR([ Unknown float word ordering. You need to manually preset ax_cv_c_float_words_bigendian=no (or yes) according to your system. ])]) ;; esac ])# AX_C_FLOAT_WORDS_BIGENDIAN libgdiplus-2.11/cairo/NEWS0000664000175000017500000060456712225470167012342 00000000000000Release 1.6.4 (2008-04-11 Carl Worth ) ========================================================= The cairo community is wildly embarrassed to announce the 1.6.4 release of the cairo graphics library. This release reverts the xlib locking change introduced in 1.6.4, (and the application crashes that it caused). The community would be glad to sack its current release manager and is accepting applications for someone who could do the job with more discipline. Revert 'add missing locking in cairo-xlib' ------------------------------------------ This change was introduced in cairo 1.6.2, but also introduced a bug which causes many cairo-xlib applications to crash, (with a segmentation fault inside of XSetClipMask). Instead of attempting another fix for the broken fix, the change in 1.6.2 has been reverted. The original bug which the change was addressing has been present since at least cairo 1.4, so it is not expected that leaving this bug unfixed will cause any new problems for applications moving from cairo 1.4 to cairo 1.6. At this point, the code of cairo 1.6.4 differs from cairo 1.6.0 only in the fix for the PostScript-printer crashes. Tweak build to avoid linking with g++ ------------------------------------- Cairo 1.6.4 avoids a quirk in automake that was causing the cairo library to be linked with g++ and linked against libstdc++ even when only C source files were compiled for the library. Release 1.6.2 (2008-04-11 Carl Worth ) ========================================================= The cairo community is pleased (but somewhat sheepish) to announce the 1.6.2 release of the cairo graphics library. This is an update to yesterday's 1.6.0 release with an important fix to prevent cairo's PostScript output from crashing some printers. This release also includes a locking fix for cairo's xlib backend to improve thread safety. There are no changes beyond these two fixes. Fix for PostScript printer crash -------------------------------- Adrian Johnson discovered that cairo 1.6.0 was being a bit hard on PostScript printers, by changing the font matrix very frequently. This causes some PostScript interpreters to allocate new font objects every few glyphs, eventually exhausting available resources. The fix involves leaving translational components of the font matrix as zero, so that the PostScript interpreter sees an identical font matrix repeatedly, and can more easily share internal font object resources. This fix has been tested to resolve the bugs posted here, (for both Xerox and Dell printers): Printing some PDFs from evince is crashing our Xerox printer http://bugs.freedesktop.org/show_bug.cgi?id=15348 Cairo-generated postscript blocks Dell 5100cn http://bugs.freedesktop.org/show_bug.cgi?id=15445 Add missing locking in cairo-xlib --------------------------------- Chris Wilson noticed that cairo 1.6.0 was manipulating an internal cache of GC object within cairo's Xlib backend without proper locking. The missing locking could cause failures for multi-threaded applications. He fixed this in 1.6.2 by adding the missing locks. Release 1.6.0 (2008-04-10 Carl Worth ) ========================================================= The cairo community is quite pleased to announce the 1.6.0 release of the cairo graphics library. This is a major update to cairo, with new features and enhanced functionality which maintains compatibility for applications written using cairo 1.4, 1.2, or 1.0. We recommend that anybody using a previous version of cairo upgrade to cairo 1.6.0. The most significant new features in this release are dramatically improved PDF and PostScript[*] output, support for arbitrary X server visuals (including PseudoColor), a new Quartz backend, and and a new "win32 printing" backend. See below for more details on these and other new features. New dependency on external pixman library (Thanks, Søren!) ---------------------------------------------------------- As of cairo 1.6, cairo now depends on the pixman library, for which the latest release can be obtained alongside cairo: http://cairographics.org/releases/pixman-0.10.0.tar.gz This library provides all software rendering for cairo, (the implementation of the image backend as well as any image fallbacks required for other backends). This is the same code that was previously included as part of cairo itself, but is now an external library so that it can be shared by both cairo and by the X server, (which is where the code originated). Improved PDF, PostScript, and SVG output (Thanks, Adrian!) ---------------------------------------------------------- Users of the cairo-pdf, cairo-ps, and cairo-svg should see a dramatic improvement from cairo 1.2/1.4 to 1.6. With this release there are now almost no operations that will result in unnecessary rasterization in the PDF and PostScript. Rasterized "image fallbacks" are restricted only to minimal portions of the document where something is being drawn with cairo that is beyond the native capabilities of the document, (this is rare for PDF or SVG, but occurs when blending translucent objects for PostScript). This means that the final output will be of higher quality, and will also be much smaller, and therefore will print more quickly. The machinery for doing analysis and minimal fallbacks also benefits the win32-printing surface described below. In addition to doing less rasterization, the PostScript and PDF output also has several other improvements to make the output more efficient and more compatible with specifications. [*] Note: Just before this release, a bug has been reported that the PostScript output from cairo can crash some printers, (so far the following models have been reported as problematic Xerox Workcentre 7228 or 7328 and Dell 5100cn). We will implement a workaround as soon as we can learn exactly what in cairo's output these printers object to, (and we could use help from users that have access to misbehaving printers). This bug is being tracked here: Printing some PDFs from evince is crashing our Xerox printer http://bugs.freedesktop.org/show_bug.cgi?id=15348 New support for arbitrary X server visuals (Thanks, Keith and Behdad!) ---------------------------------------------------------------------- As of cairo 1.6, cairo should now work with an arbitrary TrueColor or 8-bit PseudoColor X server visual. Previous versions of cairo did not support these X servers and refused to draw anything. We're pleased to announce that this limitation has been lifted and people stuck with ancient display systems need no longer be stuck with ancient software just because of cairo. New, supported Quartz backend for Mac OS X (Thanks, Brian and Vladimir!) ------------------------------------------------------------------------ As of cairo 1.6, the cairo-quartz backend is now marked as "supported" rather than "experimental" as in previous cairo releases. Its API now has guarantees of API stability into future cairo releases, and its output quality is comparable to other backends. There have been significant improvements to cairo-quartz since 1.4. It now uses many fewer image fallbacks, (meaning better performance), and has greatly improved text rendering. New, "win32 printing" backend (Thanks, Adrian and Vladimir!) ------------------------------------------------------------ A new win32-printing surface has been added with an interface very similar to the original win32 surface, (both accept an HDC parameter). But this new surface should only be called with a printing DC, and will result in all drawing commands being stored into a meta-surface and emitted after each page is complete. This allows cairo to analyze the contents, (as it does with PDF, PostScript, and SVG backends), and to do minimal image-based fallbacks as necessary. The analysis keeps things as efficient as possible, while the presence of fallbacks, (when necessary), ensure the consistent, high-quality output expected from cairo. Robustness fixes (Thanks, Chris!) --------------------------------- There has been a tremendous number of improvements to cairo's robustness. Areas that have been improved include: * Proper reporting of errors * Responding correctly to invalid input * Avoiding integer overflows * Avoiding memory leaks on error-recovery paths * Making reference counting thread safe * Exhaustive testing of memory allocation points Other fixes (Thanks, everybody!) -------------------------------- Cairo's internal fixed-point representation has been changed from 16.16 to 24.8. This has a direct impact on applications as it allows much larger objects to be drawn before internal limits in cairo make the drawing not work. The CAIRO_EXTEND_PAD mode is now fully supported by surface patterns. This mode allows applications to use cairo_rectangle and cairo_fill to draw scaled images with high-quality bilinear filtering for the internal of the image, but without any objectionably blurry edges, (as would happen with the default EXTEND_NONE and cairo_paint). Rendering with CAIRO_ANTIALIAS_NONE has been fixed to be more predictable, (previously image rendering and geometry rendering would be slightly misaligned with respect to each other). The reference manual at http://cairographics.org/manual now documents 100% of the functions and types in cairo's public API. API additions ------------- Several small features have been added to cairo with new API functions: cairo_format_stride_for_width Must be called to compute a properly aligned stride value before calling cairo_image_surface_create_for_data. cairo_has_current_point Allows querying if there is a current point defined for the current path. cairo_path_extents Allows querying for path extents, (independent of any fill or stroke parameters). cairo_surface_copy_page cairo_surface_show_page Allow beginning a new document page without requiring a cairo_t object. cairo_ps_surface_restrict_to_level cairo_ps_get_levels cairo_ps_level_to_string cairo_ps_surface_set_eps Allow controlling the Post PostScript level, (2 or 3), to target, as well as to generate Encapsulated PostScript (EPS). cairo_quartz_font_face_create_for_cgfont Create a quartz-specific cairo_font_face_t from a CGFontRef. cairo_win32_font_face_create_for_logfontw_hfont Create a win32-specific cairo_font_face from a LOGFONTW and an HFONT together. Thanks, Everyone! ----------------- I've accounted for 32 distinct people with attributed code added to cairo between 1.4.14 and 1.6.0, (their names are below). That's an impressive number, but there are certainly dozens more that contributed with testing, suggestions, clarifying questions, and encouragement. I'm grateful for the friendships that have developed as we have worked on cairo together. Thanks to everyone for making this all so much fun! Adrian Johnson, Alp Toker, Antoine Azar, Behdad Esfahbod, Benjamin Otte, Bernardo Innocenti, Bertram Felgenhauer, Boying Lu, Brian Ewins, Carl Worth, Chris Heath, Chris Wilson, Claudio Ciccani, Emmanuel Pacaud, Jeff Muizelaar, Jeremy Huddleston, Jim Meyering, Jinghua Luo, Jody Goldberg, Jonathan Gramain, Keith Packard, Ken Herron, Kouhei Sutou, Kristian Høgsberg, Larry Ewing, Martin Ejdestig, Nis Martensen, Peter Weilbacher, Richard Hult, Shailendra Jain, Søren Sandmann Pedersen, Vladimir Vukicevic Snapshot 1.5.20 (2008-04-04 Carl Worth ) =========================================================== This is the tenth snapshot in cairo's unstable 1.5 series. It comes just two days (and only one working day) after the 1.5.18 snapshot. The quick snapshot is due to two embarrassing bugs (both affecting cairo-xlib) that had been introduced in the 1.5.18 snapshot. The fixes for these are described below along with a few other fixes, (which hopefully aren't introducing new bugs this time). cairo-xlib ---------- Revert fix from 1.5.18 to allow pattern expansion based on the filter mode. This fix seemed so boring, (the use case it addresses is almost never used in practice), that it didn't even get mentioned in the 1.5.18 release notes. However, the "fix" happened to break rendering that is always used resulting in corrupt image rendering in mozilla, evolution, and probably everything else that uses cairo. Fix to avoid BadMatch errors in cairo_surface_create_similar. These were introduced, (inadvertently, of course), as part of the fix in 1.5.18 for creating similar surfaces without the Render extension. Again, thanks to mozilla, (and Vladimir Vukicevic in particular), for noticing our mistake. general ------- Correctly handle an in-error surface in cairo_surface_write_to_png. Previously this function would cause an assertion failure if you gave it a finished surface. Now it cleanly returns a CAIRO_STATUS_SURFACE_FINISHED result instead. Avoid potentially infinite wandering through memory inside _cairo_hull_prev_valid. Thanks to Jonathan Watt for noticing this problem: https://bugzilla.mozilla.org/show_bug.cgi?id=306649#c21 cairo-pdf --------- Fix generation of "soft" masks made by drawing to a similar surface and then calling cairo_mask_surface() with it. cairo-svg --------- Fix for code that uses cairo_mask() on an intermediate surface which is later passed to cairo_mask_surface(). Snapshot 1.5.18 (2008-04-05 Carl Worth ) =========================================================== This is the ninth snapshot in cairo's unstable 1.5 series. It comes just 4 days after the 1.5.16 snapshot. We had hoped to not need another snapshot before the final 1.6.0 release, but several critical bugs were found and fixed in the last few days, so we thought it important to let people test the fixes with this snapshot. See below for details. documentation ------------- The README now lists necessary dependencies. Various graphics state defaults are now documented, (source pattern is opaque black, line width is 2.0, line join is miter, line cap is butt, miter limit is 10.0, etc.). general ------- Several cleanups have been made along many error-path returns, (carefully propagating up the original error status values, cleaning up memory leaks during error recovery, etc.). This is yet another in Chris "ickle" Wilson's long series of error-handling cleanups during the 1.5 series. Avoid undesired clipping when drawing scaled surface patterns with bilinear filtering. cairo-pdf --------- Fix emission of 1-bit alpha masks in PDF output. Fix a bug that would cause glyphs to be misplaced along the Y axis: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=%23474136 Originally, an issue about a crash, but later leading to the misplaced glyphs issue being discovered. cairo-ps -------- Fix misplaced glyphs in cairo's PostScript output. This issue occurs when consecutive glyphs are placed far apart. This case is exercised by the new ft-show-glyphs-table test case, which was originally inspired by the Debian bug #23474136 mentioned above. Fix more misplaced glyphs in cairo's PostScript output: The issue here showed up under very particular circumstance, (when converting a PDF file with a CFF font with CID Identity-H encoding and using glyph 0, (defined by the CFF specification as .notdef) as a space instead). More concretely, this problem appeared when converting the UbuntuDesktop.pdf file mentioned in this bug report: https://bugs.freedesktop.org/show_bug.cgi?id=15348#c3 As usual with arcane font-encoding-specific bugs like this, many thanks to Adrian Johnson for his magical ability to dive into specifications and emerge almost instantaneously with fixes. And thanks to Sebastien Bacher for bringing the bug to our attention. cairo-xlib ---------- Fix serious failure on X servers without the Render extension. Since the 1.5.14 snapshot (with support for PseudoColor visuals), any application attempting to create a "similar" xlib surface would fail on an X server without the Render extension. Thanks to Frederic Crozat for pointing out that cairo's test suite was entirely failing when run against Xvfb. Avoid crashing cairo-xlib applications for too-large glyphs Naively sending glyphs of any size to the X server will eventually violate the X limit on maximum request sizes. We now properly detect when a glyph would be too large and use existing fallbacks to render the glyph rather than trying to send it to the X server. Enable the buggy_repeat workaround for Xorg servers < 1.4 We have determined that Xorg 1.3.0 (as packaged in Fedora 8 at least) has a bug that can result in an X server crash when cairo uses certain X Render repeat operations, (as exercised by cairo's extend-reflect test). We avoid this crash by using fallbacks whenever a repeating surface is needed for any Xorg server with a version less than 1.4. This is slower, but should prevent the crash. (Meanwhile, there appears to be a separate bug where some X servers or specific X-server drivers will use random pixmap data when asked to draw a repeating surface. The buggy_repeat workaround would also avoid those problems, but we have not yet characterized whether the new "version < 1.4" is a good characterization of those problems or not.) cairo-quartz-font ----------------- Implement cairo_font_extents for this backend. The cairo-quartz-font implementation added in the 1.5.14 snapshot was entirely missing support for the cairo_font_extents function. Thanks to Richard Hult for pointing out this obvious shortcoming, (and obvious lack of coverage in our test suite): CGFont backend returns 0 font extents https://bugs.freedesktop.org/show_bug.cgi?id=15319 Snapshot 1.5.16 (2008-04-01 Carl Worth ) =========================================================== This is the eighth snapshot in cairo's unstable 1.5 series. It comes less than two weeks after the 1.5.14 snapshot and it really is a legitimate snapshot, (in spite of sharing this date with that of many bogus announcements). The major change in this snapshot is that the cairo-quartz backend is now officially "supported", including new API to construct a font face from a CGFontRef . Also several bug fixes have been fixed in many backends. See below for details. general ------- Cairo now depends on pixman 0.10.0 which was recently released. The latest pixman release can always be found alongside cairo releases at: http://cairographics.org/releases Increase the precision of color stops for gradients. This fixes a regression in gradient rendering that had been present since the 1.5.12 snapshot. paginated (all of ps, pdf, svg, and win32-printing) --------------------------------------------------- Fix assertion failure when some drawing elements are outside the page boundaries, (this bug was noticed when using Inkscape to print a drawing with landscape orientation to a portrait-oriented piece of paper). cairo-ps -------- Fix of bug causing incorrect glyph positioning. Fix handling of CAIRO_OPERATOR_SOURCE. cairo-pdf --------- More reduction of unnecessary digits of precision in PDF output. Fix handling of CAIRO_OPERATOR_SOURCE. cairo-svg --------- Fix bug in usage of libpng that was preventing cairo_mask from working with the svg backend. Fix transformation of source pattern for cairo_stroke(). cairo-win32-printing -------------------- Fix fallback resolution, (thanks again to inkscape users/developers for helping us find this one). cairo-quartz ------------ Mark the cairo-quartz backend as "supported" rather than "experimental". This means the following: * The backend will now be built by default (if possible). * We are committing that the backend-specific API (as published in cairo-quartz.h) are stable and will be supported in all future cairo 1.x releases. * We are committing that the output quality of this backend compares favorably with other cairo backends, (and that quality is ensured by good results from the cairo test suite). * We recommend that distributions build and distribute this backend when possible. Note that the cairo_quartz_image API (in cairo-quartz-image.h) is still experimental, will not build by default, (pass --enable-quartz-image to configure to build it), and may see API changes before it is marked as "supported" in a future release. Put the CAIRO_FONT_TYPE_ATSUI name back into cairo-deprecated.h. Without this, the cairo 1.5.14 snapshot broke all builds for applications using the C++ cairomm bindings (and perhaps others) which have the CAIRO_FONT_TYPE_ATSUI name in their header files. This breakage happened even for applications not using cairo-quartz at all. Note: Even though the CAIRO_FONT_TYPE_ATSUI name is provided to avoid this build breakage, we still recommend that bindings and applications move to the new, and more accurate, CAIRO_FONT_TYPE_QUARTZ name. Replace the implementation of cairo-quartz-font to use CFFont instead of ATSUI. The CGFont API is a better fit than ATSUI, and this new implementation is also more correct than the old one as well. This also adds the following new API call: cairo_public cairo_font_face_t * cairo_quartz_font_face_create_for_cgfont (CGFontRef font); The previous cairo_quartz_font_face_create_for_atsu_font_id function continues to exist and is part of the supported API going forward. (However, the old name of that same function, which was cairo_atsui_font_face_create_for_atsu_font_id is officially deprecated. Any source code using the old name should be updated to use the new name.) Fix transformation of source pattern for cairo_stroke(). cairo-win32 ----------- Avoid crash in create_similar is cairo_win32_surface_create fails. Snapshot 1.5.14 (2008-03-20 Carl Worth ) =========================================================== This is the seventh snapshot in cairo's unstable 1.5 series. It comes 3 weeks after the 1.5.12 snapshot. This snapshot includes support for arbitrary X server visuals, (including PseudoColor), which was the final remaining cairo-specific item on the cairo 1.6 roadmap. It also includes a huge number of improvements to the cairo-quartz backend. So this is effectively a cairo 1.6 release candidate. We expect very few changes from now until 1.6 and only for specific bug fixes. API Change ---------- Rename ATSUI font backend to Quartz font backend. This affects the following usage: --enable-atsui -> --enable-quartz-font CAIRO_HAS_ATSUI_FONT -> CAIRO_HAS_QUARTZ_FONT CAIRO_FONT_TYPE_ATSUI -> CAIRO_FONT_TYPE_QUARTZ cairo_atsui_font_face_create_for_atsu_font_id -> cairo_quartz_font_font_create_for_atsu_font_id This API change is justified by the cairo-quartz backend still be marked as "experimental" rather than "supported", (though this is one step toward making the change to "supported" before 1.6). Cairo will still provide ABI compatibility with the old symbol name, however. paginated (all of ps, pdf, svg, and win32-printing) --------------------------------------------------- Optimize by not analyzing an image surface for transparency more than once, (previously all images were analyzed twice). cairo-ps and cairo-pdf ---------------------- Avoiding emitting a matrix into the stroke output when unnecessary, (making output size more efficient). Reduce rounding error of path shapes by factoring large scale factors out of the path matrix, (ensuring that a fixed-number of printed digits for path coordinates contains as much information as possible). Reduce excess digits for text position coordinates. This makes the output file size much smaller without making the result any less correct. cairo-ps -------- Eliminate bug causing extraneous text repetition on Linux PostScript output in some cases. See: Mozilla Bug 419917 – Printed page contents are reflected inside bordered tables (Linux-only) https://bugzilla.mozilla.org/show_bug.cgi?id=419917 Optimize output when EXTEND_PAD is used. cairo-pdf --------- Fix to not use fill-stroke operator with transparent fill, (else PDF output doesn't match the cairo-defined correct result). See: https://bugs.launchpad.net/inkscape/+bug/202096 cairo-svg --------- Fix stroke of path with a non-solid-color source pattern: http://bugs.freedesktop.org/show_bug.cgi?id=14556 cairo-quartz ------------ Fix text rendering with gradient or image source pattern. Handling antialiasing correctly for cairo_stroke(), cairo_clip(), and cairo_show_text()/cairo_show_glyphs(). Correctly handle gradients with non-identity transformations: Fixes http://bugs.freedesktop.org/show_bug.cgi?id=14248 Add native implementation of REPEAT and REFLECT extend modes for gradients. Fix implementation for the "unbounded" operators, (CAIRO_OPERATOR_OUT, _IN, _DEST_IN, and _DEST_ATOP). Correctly handle endiannees in multi-architecture compiles on Mac OS X. Avoid behavior which would cause Core Graphics to print warnings to the console in some cases. cairo-win32 ----------- Fix handling of miter limit. cairo-win32-printing -------------------- Fix to not use a 1bpp temporary surface in some cases while printing, (so grayscale data is preserved rather than just becoming black and white). cairo-xlib ---------- Add support for rendering to arbitrary TrueColor X server visuals. This fixes at least the following bugs: cairo doesn't support 8-bit truecolor visuals https://bugs.freedesktop.org/show_bug.cgi?id=7735 cairo doesn't support 655 xlib format https://bugs.freedesktop.org/show_bug.cgi?id=9719 Add support for rendering to 8-bit PseudoColor X server visuals. This fixes the following bug: Cairo doesn't support 8-bit pseudocolor visuals https://bugs.freedesktop.org/show_bug.cgi?id=4945 Snapshot 1.5.12 (2008-02-28 Carl Worth ) =========================================================== This is the sixth snapshot in cairo's unstable 1.5 series. It comes 1 week after the 1.5.10 snapshot. This snapshot includes the long-awaited change from 16.16 to 24.8 fixed-point values, (see below for why you should care). It also includes several backend-specific bug fixes. 24.8 fixed-point format ----------------------- Cairo has always converted path coordinates to a fixed-point representation very early in its processing. Historically, this has been a 32-bit representation with 16 bits of integer for the device-pixel grid and 16 bits of sub-pixel positioning. The choice of 16 bits for the integer coordinate space was based on the 16-bit limit for X Window drawables. This 16-bit limit has proven problematic for many applications. It's an especially vexing problem when targeting non-X backends that don't have any 16-bit restriction. But even when targeting cairo-xlib, it's often desirable to draw a large shape, (say a background rectangle), that extends beyond the surface bounds and expect it to fill the surface completely, (rather than overflowing and triggering random behavior). Meanwhile, nobody has ever really needed 16 bits of sub-pixel precision. With this snapshot, the fixed-point system is still in place and is still using a 32-bit representation, (future versions of cairo might move entirely to floating-point when targeting PDF output for example). But the representation now provides 24 bits of pixel addressing and only 8 bits of sub-pixel positioning. This should give a much less stifling space to many applications. However, the underlying pixman library still has 16-bit limitations in many places, (it has its roots in the X server as well). Until those are also fixed, applications targeting cairo image surfaces, or hitting software fallbacks when targeting other surfaces will still encounter problems with device-space values needing more than 16 integer bits. generic fixes ------------- Add a few tests to the test suite to increase coverage. Cleanup a few error-handling paths, (propagate error correctly). cairo-ft -------- Fix handling of font sizes smaller than 1 device pixel. cairo-pdf --------- Fix to properly save/restore clip when analyzing meta-surface patterns, (fixing a couple of test-suite failures). Implement native support for CAIRO_OPERATOR_SOURCE when the source pattern is opaque. Emit rectangles as PDF rectangles ("re" operator) rather than as general paths. cairo-ps -------- Fix to work properly with the 16.16->24.8 change. cairo-svg --------- Fix CAIRO_EXTEND_REFLECT by using an image fallback, (there's no direct SVG support for reflected patterns). Fix the use of alpha-only masks, (such as CAIRO_FORMAT_A8). cairo-quartz ------------ Add new API for efficiently using image data as a source: cairo_surface_t * cairo_quartz_image_surface_create (cairo_surface_t *image_surface); cairo_surface_t * cairo_quartz_image_surface_get_image (cairo_surface_t *surface); For full documentation, see: http://cairographics.org/manual/cairo-Quartz-Surfaces.html#cairo-quartz-image-surface-create Several fixes for cairo_mask(). cairo-atsui ----------- Change default from from Monaco to Helvetica to be more consistent with other font backends. Snapshot 1.5.10 (2008-02-20 Carl Worth ) =========================================================== This is the fifth snapshot in cairo's unstable 1.5 series. It comes 3 weeks after the 1.5.8 snapshot. This snapshot adds one new API function, (cairo_has_current_point), and the usual mix of improvements, (more efficient PostScript/PDF output, optimized stroking), and fixes (more robust error-handling, etc.). See below for details. New API ------- Add a new function to query if there is a current point: cairo_bool_t cairo_has_current_point (cairo_t *cr); There is no current point immediately after cairo_create(), nor after cairo_new_path() or cairo_new_sub_path(). There is a current point after any of the path-creation functions, (cairo_move_to, cairo_line_to, cairo_curve_to, etc.). With this new function, we also revert the change of the return type of cairo_get_current_point from cairo 1.5.8, (it's now a void function again). Optimizations ------------- Optimize stroking code to avoid repeated calculation of redundant values, (particularly significant for very large, offscreen paths). General fixes ------------- Patch a few more potential buffer overruns, (due to integer overflow). Many fixes and improvements to cairo's error-handling, (ensure that correct error values are returned, clean up memory leaks on error-handling paths, etc.). Fix a potential infinite loop when stroking a spline with a pen that has been transformed to a line segment. Remove treating NULL as a synonym for a valid cairo_font_options_t* with default values, (a change that had been introduced as of cairo 1.5.8). Remove the altered handling of tolerance and fallback-resolution that had been introduced as of cairo 1.5.4. cairo-xlib ---------- Pass the original Drawable, (as opposed to the root window), to XCreatePixmap when creating a similar surface. This gives the X server more information so that it can be clever and efficient. cairo-pdf --------- Fix the rendering of repeating and reflecting patterns. Ensure miter limit is always >= 1, (smaller limits are not meaningful, but they can cause some PDF viewers to fail to display pages). Generate more efficient output when the same path is used for both fill and stroke. cairo-ps -------- Start sharing much of the cairo-pdf code rather than implementing very similar code in cairo-ps. Implement native support for repeating and reflecting linear gradients. Implement reflected surface patterns. Ensure miter limit is always >= 1, (smaller limits are not meaningful, but they can cause some PostScript viewers to crash). Generate PostScript that will perform more efficiently and use less memory on printers, (use currentfile instead of a giant string array for image data, and avoid using PostScript patterns for paint() and fill() when possible). cairo-svg --------- Avoid unnecessary rasterization when copying a "similar" surface to another svg surface, (allow the SOURCE operator to be implemented with all-vector operations if there are no underlying objects). cairo-atsui ----------- Eliminate infinite loop when attempting to render an empty string. Snapshot 1.5.8 (2008-01-30 Carl Worth ) ========================================================== This is the fourth snapshot in cairo's unstable 1.5 series. It comes 2 weeks after the 1.5.6 snapshot. It adds a few new API functions. Most notably all callers of cairo_image_surface_create_for_data should now be calling cairo_format_stride_for_width to compute a legal stride value. See below for more details. New API in cairo 1.5.8 ---------------------- We've added a new function that should be called to compute a legal stride value before allocating data to be used with cairo_image_surface_create_for_data: int cairo_format_stride_for_width (cairo_format_t format, int width); We've also added a new cairo_path_extents function that can be used to compute a bounding box for geometry such as a single line segment, (contrast with cairo_path_extents and cairo_stroke_extents): void cairo_path_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); And finally, we've added a function to allow for querying the XRenderPictFormat of a cairo-xlib surface: XRenderPictFormat * cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); API changes ----------- Fix return types of cairo_surface_show_page and cairo_surface_copy_page. This is an API change to functions that are new in the 1.5 series, so not an API break compared to any stable cairo release, (1.0.x, 1.2.x, 1.4.x). Change the return type of cairo_get_current_point() from void to cairo_status_t. This allows the caller to receive a CAIRO_STATUS_NO_CURRENT_POINT value to distinguish the a current point at the origin from no current point existing. Performance improvement ----------------------- Improve performance of clipping by using an optimized code path internally, (with the ADD operator instead of IN). General bug fixes ----------------- Fix various cairo_*_extents functions to initialize the return-value variables even in the case of a cairo_t in error. Treat NULL as a legitimate value for cairo_font_options_t*. [NOTE: On discussion afterwards, we decided against this change so it has been removed as of cairo 1.5.10.] Fix rendering with CAIRO_ANTIALIAS_NONE to be more predictable, (that is, to avoid seams appearing when geometry and imagery share an identical edge). Portions of this fix are in the pixman library and will appear in a future release of that library. Avoid triggering an error for a font size of 0. Miscellaneous changes --------------------- Require pixman >= 0.9.6. There has been a tremendous amount improvement to cairo's documentation. We're delighted that 100% of the public API has at least some documentation in the API reference manual. Many thanks to Behdad Esfahbod and Nis Martensen for leading this effort. cairo-pdf and cairo-ps ---------------------- Eliminate failure when a Type 1 font is embedded with an explicit glyph 0. cairo-pdf --------- Implement a more correct and more efficient approach for patterns with an extend mode of CAIRO_EXTEND_REFLECT. cairo-ps -------- Fix image masks to properly pack and pad mask bits. cairo-quartz ------------ Take care to only use DrawTiledImage for integer-aligned images, (and use slower paths to get the correct result in other cases). cairo-win32 ----------- Fix for older versions of mingw. Improve the handling of the clipping with the win32 and win32-printing surfaces. Fix rendering of non black/white text. Snapshot 1.5.6 (2008-01-15 Carl Worth ) ========================================================== This is the third snapshot in cairo's unstable 1.5 series. It comes about 6 weeks after the 1.5.4 snapshot. The only API addition compared to 1.5.4 is very minor, (a new value CAIRO_STATUS_TEMP_FILE_ERROR). The remainder of the changes are the usual accumulation of bug fixes and improvements. See below for details. General bug fixes ----------------- Fix handling of fonts that contain a mixture of outline and bitmapped glyphs. There was a change in this handling in 1.5.4 that improved some cases and also regressed other cases. Now, all cases should be handled quite well. Fix alignment issues that were causing SIGBUS failures on SPARC. Fix a regression (which first appeared in 1.5.2) where stroking under a large scale would sometimes incorrectly replace a miter join with a bevel join. (Thanks to Keith Packard.) Fix reporting of zero-sized extents to be {0,0} rather than {INT_MAX,INT_MIN}. This avoids several integer overflow and allocations of massive regions in some cases. Fix failures of gradients with no stops, (quartz, ps, and pdf). Fix handling of Type 1 fonts on Windows platforms. Fix handling of Type 1 fonts with no specific family name in the font itself, (generate a CairoFont-x-y name). Handle NULL string values in cairo_show_text, cairo_show_glyphs, and friends. Many robustness improvements along error-handling paths, (thanks as always, to Chris "ickle" Wilson). Various other minor fixes. Paginated backends (PDF/PostScript/win32-printing) -------------------------------------------------- Avoid unnecessary rasterization when using a paginated surface as a source, (such as drawing from one pdf surface to another). Fix replaying of paginated surface with more than one level of push/pop group. cairo-xlib ---------- Fix xlib backend to not consider recent X server release as having a buggy repeat implementation in the Render extension. cairo-pdf --------- Fix PDF output to avoid triggering very slow rendering in PDF viewers, (avoid starting and stopping the content stream for each pattern emission). Support CAIRO_OPERATOR_SOURCE in cases where there is nothing below the object being drawn. Fix to avoid seams appearing between multiple fallback regions. cairo-ps (PostScript) --------------------- Use correct bounding box in Type 3 fonts. Fix several bugs in cairo's PostScript output. These include making the PostScript output more compatible with recent versions of ghostscript that are more strict about Type 3 fonts, for example. Fix for win32 to not attempt to create temporary files in the root directory, (where the user may not have write permission). Avoid generating Level 3 PostScript if Level 2 is sufficient. Also, add code in output documents to alert the user if Level 3 PostScript is handed to a device that cannot handle PostScript beyond Level 2. cairo-directfb -------------- Various performance optimizations. Fixed support for small surfaces (less than 8x8). Provide support for environment variables CAIRO_DIRECTFB_NO_ACCEL to disable acceleration and CAIRO_DIRECTFB_ARGB_FONT to enable ARGB fonts instead of A8. cairo-os2 --------- Allow OS/2 APIs instead of C library allocation functions. Snapshot 1.5.4 (2007-12-05 Carl Worth ) ========================================================== This is the second snapshot in cairo's unstable 1.5 series. It comes just over 1 month after the 1.5.2 snapshot. There are no API changes or additions in 1.5.4 compared to 1.5.2, but there are several bug fixes, and some optimizations. Most of these apply to particular backends. See below for details. General improvements -------------------- Use less memory for spline approximation calculations. Change how the tolerance value is interpreted with regard to fallback-resolution. [Note: On further discussion, we decided against this change for now. It is removed as of cairo 1.5.10.] Fix precision of floating-point values in vector-output backends to avoid rounding errors with very small numbers. Xlib improvements ----------------- Fix bug in glyph rendering with xlib, (due to everything being clipped out). This was a regression in the 1.5.2 snapshot that was visible in the GIMP, for example. See: cairo 1.5.2 causes font problems in GIMP 2.4 status bar and evolution 2.12.1 https://bugs.freedesktop.org/show_bug.cgi?id=13084 PostScript improvements ----------------------- Fix bug leading to invalid PostScript files when rendering text, (need "0 0 xyshow" instead of "0 xyshow"). Fix many issues with Type 3 fonts, including making the resulting text extractable. Quartz improvements ------------------- Fix font metrics height value for ATSUI, (helps webkit on GTK+ OS X layout nicely). Fix gradients. Fix EXTEND_NONE mode for patterns. Fix cairo_quartz_surface_create to properly clear the new surface in cairo_quartz_surface_create. Fix to correctly handle 0x0 sized surfaces. Optimize drawing of EXTEND_REPEAT patterns for OS X 10.5. Snapshot 1.5.2 (2007-10-30 Carl Worth ) ========================================================== This is the first snapshot in cairo's unstable 1.5 series. It comes 4 months after the 1.4.10 release. This snapshot includes significant improvements to PDF and PostScript output, which is one of the things in which we're most interested in getting feedback. There are a couple of minor API additions, and several optimizations, (primarily in the "print/vector" backends). And there are dozens of bug fixes and robustness improvements. New dependency on external pixman library ----------------------------------------- A significant change in this snapshot compared to all previous cairo releases is that cairo now depends on an external "pixman" library for its software rendering. Previously this same code was compiled internally as part of cairo, but now the code is separate so that both cairo and the X server can now share common code, (thanks very much to Søren Sandmann for his work on separating pixman and maintaining it). So users will need to acquire and build pixman before being able to build cairo. The current release is 0.9.6 and can be obtained from here: http://cairographics.org/releases/pixman-0.9.6.tar.gz which can be verified with: http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1 66f01a682c64403a3d7a855ba5aa609ed93bcb9e pixman-0.9.6.tar.gz http://cairographics.org/releases/pixman-0.9.6.tar.gz.sha1.asc (signed by Carl Worth) Major PDF/PostScript improvements --------------------------------- Adrian Johnson has done some long-awaited work to make cairo's PDF and PostScript output more interesting than ever before. First, many operations that previously triggered image fallbacks will now be rendered as native vectors. These operations include: PDF: cairo_push_group, cairo_surface_create_similar, cairo_mask, A8/A1 surface sources, repeating/reflecting linear gradients. PostScript: cairo_push_group, cairo_surface_create_similar, gradients, bilevel alpha masks, (for example, all values either 0 or 255 for an A8 mask). Not only that, but when an image fallback is required, it will now be limited to only the necessary region. For example, a tiny translucent image overlaying a small portion of text would previously caused an entire PostScript page to be rendered as a giant image. Now, the majority of that page will be nice text, and there will only be a tiny image in the output. Additionally, the PostScript output now carefully encodes text so that if it is subsequently converted to PDF, the text will be selectable. This is very exciting progress, and we're hoping to hear from users during the 1.5 series about how things have improved, (for example, inkscape users doing cairo-based PDF export: please let us know how things look). And feel free to pass your thanks along to Adrian for his excellent work. NOTE: This much improved PDF output makes more sophisticated use of functionality in the PDF specification. This means that cairo's output will sometimes expose bugs in some free software PDF viewers, (evince, poppler, and xpdf, for example), that are not yet ready for such PDF files. We're working with the poppler maintainers to get these bugs fixed as quickly as possible. In the meantime, please double-check with other PDF viewers if cairo-generated PDF files are not being rendered correctly. It may be due to a bug in the viewer rather than in the PDF file that cairo has created. Robustness improvements ----------------------- Chris Wilson has made the largest contribution by far to cairo 1.5.2, (in number of commits). His more than 150 commits include a huge number of fixes to increase cairo's robustness. These fixes make cairo more robust against invalid and degenerate input, (NaN, empty path, etc.), against size-0 malloc calls, against memory leaks on error-recovery paths, and against other failures during error handling. He also implemented atomic operations to cairo, and used them to fix cairo's previously non-thread-safe reference counting, again improving robustness. Chris has put a tremendous amount of time and effort into writing analysis tools for this work, and in running those tools and fixing the problems they report. We're very grateful for this work, and hope that all cairo users appreciate the more robust implementation that results from it. This work is largely thankless, so it might make sense to notice sometime that cairo has been running quite smoothly for you, and when you do, send a quick "thank you" off to Chris Wilson, since it is all definitely running smoother thanks to his work. New API ------- There are no major additions to cairo's core API. The only new, generic functions are: void cairo_surface_copy_page (cairo_surface_t *surface); void cairo_surface_show_page (cairo_surface_t *surface); which can now be used much more conveniently than the existing cairo_copy_page and cairo_show_page functions in some situations. These functions act identically, but require only a cairo_surface_t* and not a cairo_t*. All other API additions are specific to particular backends. New cairo-win32 API (new font face function and "win32 printing" surface) ------------------------------------------------------------------------- There is a new function for creating a win32 font face for both a logfontw and an hfont together. This complements the existing functions for creating a font face from one or the other: cairo_font_face_t * cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font); There is also a new "win32 printing" surface: cairo_surface_t * cairo_win32_printing_surface_create (HDC hdc); This interface looks identical to the original cairo_win32_surface_create, (both accept and HDC), but the behavior of this new surface is very different. It should only be called with a printing DC, and will result in all drawing commands being stored into a meta-surface and emitted after each page is complete, with analysis to do as minimal image-based fallbacks as necessary. The behavior and implementation shares much with the PDF and PostScript backends. New cairo-ps API (EPS and PostScript level control) --------------------------------------------------- An often requested feature has been the ability to generate Encapsulated PostScript (EPS) with cairo. We have that now with the following very simple API. Just do cairo_ps_surface_create as usual then call this function with a true value: void cairo_ps_surface_set_eps (cairo_surface_t *surface, cairo_bool_t eps); [NOTE: As always with snapshots, it's possible---though not very likely---that the API could still be modified before a final release. For example, this is the first public cairo function that accepts a Boolean parameter. I'm generally opposed to Boolean parameters, but this is probably the one case where I'm willing to accept one, (namely a "set" function that accepts a single Boolean).] Also, it is now possible to control what PostScript level to target, (either level 2 or level 3), with the following new API: typedef enum _cairo_ps_level { CAIRO_PS_LEVEL_2, CAIRO_PS_LEVEL_3 } cairo_ps_level_t; void cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, cairo_ps_level_t level); void cairo_ps_get_levels (cairo_ps_level_t const **levels, int *num_levels); const char * cairo_ps_level_to_string (cairo_ps_level_t level); Improvement for cairo-quartz ---------------------------- Brian Ewins had contributed several improvements to cairo-quartz. These include an implementation of EXTEND_NONE for linear and radial gradients, (so this extend mode will no longer trigger image fallbacks for these gradients), as well as native surface-mask clipping, (only on OS X 10.4+ where the CGContextClipToMask function is available). He also fixed a semantic mismatch between cairo and quartz for dashing with an odd number of entries in the dash array. We're grateful for Brian since not many quartz-specific improvements to cairo would be happening without him. Optimizations ------------- Optimize SVG output for when the same path is both filled and stroked, and avoid unnecessary identity matrix in SVG output. (Emmanuel Pacaud). Optimize PS output to take less space (Ken Herron). Make PS output more compliant with DSC recommendations (avoid initclip and copy_page) (Adrian Johnson). Make PDF output more compact (Adrian Johnson). Release glyph surfaces after uploading them to the X server, (should save some memory for many xlib-using cairo application). (Behdad Esfahbod). Optimize cairo-win32 to use fewer GDI objects (Vladimir Vukicevic). win32-printing: Avoid falling back to images when alpha == 255 everywhere. (Adrian Johnson). win32-printing: Avoid falling back for cairo_push_group and cairo_surface_create_similar. (Adrian Johnson) Bug fixes --------- Avoid potential integer overflows when allocating large buffers (Vladimir Vukicevic). Preparations to allow the 16.16 fixed-point format to change to 24.8 (Vladimir Vukicevic). Fix bugs for unsupported X server visuals (rgb565, rgb555, bgr888, and abgr8888). (Carl Worth and Vladimir Vukicevic) Fix bugs in PDF gradients (Adrian Johnson). Fix cairo-xlib to build without requiring Xrender header files (Behdad Esfahbod). Make cairo more resilient in the case of glyphs not being available in the current font. (Behdad Esfahbod) Prevent crashes when both atsui and ft font backends are compiled in (Brian Ewins). Make font subsetting code more robust against fonts that don't include optional tables (Adrian Johnson). Fix CFF subsetting bug, (which manifested by generating PDF files that Apple's Preview viewer could not read) (Adrian Johnson). Fixed error handling for quartz and ATSUI backends (Brian Ewins). Avoid rounding problems by pre-transforming to avoid integer-only restrictions on transformation in GDI (Adrian Johnson). Fixed an obscure bug (#7245) computing extents for some stroked paths (Carl Worth). Fix crashes due to extreme transformation of the pen, (seems to show up in many .swf files for some reason) (Carl Worth). Release 1.4.10 (2007-06-27 Carl Worth ) ========================================================== This is the fifth update in cairo's stable 1.4 series. It comes roughly three weeks after the 1.4.8 release. The most significant change in this release is a fix to avoid an X error in certain cases, (that were causing OpenOffice.org to crash in Fedora). There is also a semantic change to include child window contents when using an xlib surface as a source, an optimization when drawing many rectangles, and several minor fixes. Eliminate X errors that were killing OO.o (Chris Wilson) -------------------------------------------------------- Cairo is fixed to avoid the X errors propagated when cleaning up Render Pictures after the application had already destroyed the Drawable they reference. (It would be nice if the X server wouldn't complain that some cleanup work is already done, but there you have it.) This fixes the bug causing OpenOffice.org to crash as described here: XError on right click menus in OOo. https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=243811 Use IncludeInferiors when using xlib surface as a source (Ryan Lortie) ---------------------------------------------------------------------- When an xlib surface is used as the source of a draw operation the contents of child windows are now included in the source data. The semantics of drawing to xlib surfaces are unchanged (ie: draws are still clipped by child windows overlapping the destination window). Optimize drawing of many rectangles (Vladimir Vukicevic) -------------------------------------------------------- Avoid O(N*N) loop when filling many axis-aligned rectangles, (either many rectangles as separate sub-paths or due to dashing). Miscellaneous fixes ------------------- Fix cairo-perf on Solaris by linking to librt. (Behdad Esfahbod) Fix make check for systems that require executable files to have a particular extension. (Behdad Esfahbod) Eliminate some warnings in cairo-quartz. (Brian Ewins) Fix build-breaking typo for cairo-directfb. (Chris Wilson) Release 1.4.8 (2007-06-07 Carl Worth ) ========================================================= This is the fourth update in cairo's stable 1.4 series. It comes just over five weeks after the 1.4.6 release. This release includes a thread-safe surface-cache for solid patterns which significantly improves text rendering with the xlib backend. Also, dozens of error paths in cairo have been fixed thanks to extensive fault-injection testing by Chris Wilson. Surface cache for solid patterns -------------------------------- Originally written by Jorn Baayen, the introduction of a small cache for surfaces created for solid patterns improves performance dramatically. For example, this reduces the volume of X requests during text rendering to the same level as Xft. This cache first made its appearance in a 1.3.x snapshot, but was removed before appearing in any previous major release due to complications with multi-threaded programs. For example, programs like evince that would carefully restrict usage of cairo-xlib to a single thread were unpleasantly surprised to find that using cairo-image in a separate thread could trigger X requests. Behdad Esfahbod designed a fix which was implemented by Chris Wilson. Now, the necessary X requests are queued up until the next time the application directly operates on an xlib surface. Improved error handling paths ------------------------------ Chris Wilson continued the excellent work he started in cairo 1.4.4 to make cairo much more robust against out-of-memory and other errors. He applied his memory allocation fault injection cairo's main test suite, (previously he had applied it to cairo's performance suite). Chris's testing found dozens of bugs which he fixed. Many of these bugs had perhaps never been hit by any users. But at least one was hit by the gnome-about program which resulted in dozens of duplicated bug reports against that program: http://bugzilla.gnome.org/show_bug.cgi?id=431990 We were very pleasantly surprised to see this bug get fixed as a side-effect of Chris's work. Well done, Chris! Other fixes ----------- Cleanup of mutex declarations (Behdad Esfahbod) Remove unnecessary clip region from SVG output (Emmanuel Pacaud) Remove Xsun from the buggy_repeat blacklist (Elaine Xiong) ATSUI: Fix glyph measurement: faster and more correct (Brian Ewins) Quartz: fixed 'extend' behaviour for patterns, improved pattern performance, and a few smaller correctness fixes. (Brian Ewins, Vladimir Vukicevic) Release 1.4.6 (2007-05-01 Carl Worth ) ========================================================= This is the third update in cairo's stable 1.4 series. It comes a little less than three weeks since the 1.4.4 release. This release fixes the broken mutex initialization that made cairo 1.4.4 unusable on win32, OS/2, and BeOS systems. This release also adds significant improvements to cairo's PDF backend, (native gradients!), and a couple of performance optimizations, (one of which is very significant for users of the xlib backend). See below for more details. Repaired mutex initialization ----------------------------- We apologize that cairo 1.4.4 did little more than crash on many platforms which are less-frequently used by the most regular cairo maintainers, (win32, OS/2, and BeOS). The mutex initialization problems that caused those crashes should be fixed now. And to avoid similar problems in the future, we've now started posting pre-release snapshots to get better testing, (subscribe to cairo@cairographics.org if you're interested in getting notified of those and testing them). PDF Improvements ---------------- Thanks to Adrian Johnson, (cairo PDF hacker extraordinaire), we have several improvements to cairo's PDF backend to announce: Native gradients: As of cairo 1.4.6, cairo will now generate native PDF gradients in many cases, (previously, the presence of a gradient on any page would force rasterized output for that page). Currently, only gradients with extend types of PAD (the default) or NONE will generate native PDF gradients---others will still trigger rasterization, (but look for support for other extend modes in a future release). Many thanks to Miklós Erdélyi as well, who did the initial work for this support. Better compatibility with PDF viewers: The PDF output from cairo should now be displayed correctly by a wider range of PDF viewers. Adrian tested cairo's PDF output against many PDF viewers, identified a common bug in many of those viewers (ignoring the CTM matrix in some cases), and modified cairo's output to avoid triggering that bugs (pre-transforming coordinates and using an identity matrix). Better OpenType/CFF subsetting: Cairo will now embed CFF and TrueType fonts as CID fonts. Performance optimizations ------------------------- Faster cairo_paint_with_alpha: The cairo_paint_with_alpha call is used to apply a uniform alpha mask to a pattern. For example, it can be used to gradually fade an image out or in. Jeff Muizelaar fixed some missing/broken optimizations within the implementation of this function resulting in cairo_paint_with_alpha being up to 4 times faster when using cairo's image backend. Optimize rendering of "off-screen" geometry: Something that applications often do is to ask cairo to render things that are either partially or wholly outside the current clip region. Since 1.4.0 the image backend has been fixed to not waste too much time in this case. But other backends have still been suffering. In particular, the xlib backend has often performed quite badly in this situation. This is due to a bug in the implementation of trapezoid rasterization in many X servers. Now, in cairo 1.4.6 there is a higher-level fix for this situation. Cairo now eliminates or clips trapezoids that are wholly or partially outside the clip region before handing the trapezoids to the backend. This means that the X server's performance bug is avoided in almost all cases. The net result is that doing an extreme zoom-in of vector-based objects drawn with cairo might have previously brought the X server to its knees as it allocated buffers large enough to fit all of the geometry, (whether visible or not). But now the memory usage should be bounded and performance should be dramatically better. Miscellaneous ------------- Behdad contributed an impressively long series of changes that organizes cairo's internals in several ways that will be very beneficial to cairo developers. Thanks, Behdad! Behdad has also provided a utility for generating malloc statistics, (which was used during the great malloc purges of 1.4.2 and 1.4.4). This utility isn't specific to cairo so may be of benefit to others. It is found in cairo/util/malloc-stats.c and here are Behdad's notes on using it: To build, do: make malloc-stats.so inside util/, and to use, run: LD_PRELOAD=malloc-stats.so some-program For binaries managed by libtool, eg, cairo-perf, do: ../libtool --mode=execute /bin/true ./cairo-perf LD_PRELOAD="../util/malloc-stats.so" .libs/lt-cairo-perf Finally, the cairo-perf-diff-files utility was enhanced to allow for generating performance reports from several runs of the same backend while some system variables were changed. For example, this is now being used to allow cairo-perf to measure the performance of various different acceleration architectures and configuration options of the X.org X server. Release 1.4.4 (2007-04-13 Carl Worth ) ========================================================= This is the second update release in cairo's stable 1.4 series. It comes just less than a month after 1.4.2. The changes since 1.4.2 consist primarily of bug fixes, but also include at least one optimization. See below for details. Of all the work that went into the 1.4.4 release There have been lots of individuals doing lots of great work on cairo, but two efforts during the 1.4.4 series deserve particular mention: Internal cleanup of error handling, (Chris Wilson) -------------------------------------------------- Chris contributed a tremendous series of patches (74 patches!) to improve cairo's handling of out-of-memory and other errors. He began by adding gcc's warn_unused_attribute to as many functions as possible, and then launched into the ambitious efforts of adding correct code to quiet the dozens of resulting warnings. Chris also wrote a custom valgrind skin to systematically inject malloc failures into cairo, and did all the work necessary to verify that cairo's performance test suite runs to completion without crashing. The end result is a much more robust implementation. Previously, many error conditions would have gone unnoticed and would have led to assertion failures, segmentation faults, or other harder-to-diagnose problems. Now, more than ever, cairo should cleanly let the user know of problems through cairo_status and other similar status functions. Well done, Chris! More malloc reduction, (Mathias Hasselmann) ------------------------------------------- After 1.4.0, Behdad launched an effort to chase down excessive calls to malloc within the implementation of cairo. He fixed a lot of malloc-happy objects for 1.4.2, but one of the worst offenders, (pixman regions), was left around. Mathias contributed an excellent series of 15 patches to finish off this effort. The end result is a cairo that calls malloc much less often than it did before. Compared to 1.4.2, 55% of the calls to malloc have been eliminate, (and 60% have been eliminated compared to 1.4.0). Well done, Mathias! Other improvements since 1.4.2 ------------------------------ • Centralize mutex declarations (will reduce future build breaks), (Mathias Hasselmann) • Reduce malloc by caching recently freed pattern objects (Chris Wilson) • Fix some broken composite operations (David Reveman) https://bugs.freedesktop.org/show_bug.cgi?id=5777 Backend-specific fixes ---------------------- PDF: • Use TJ operator for more compact representation of glyphs (Adrian Johnson) • Fix glyph positioning bug when glyphs are not horizontal http://lists.freedesktop.org/archives/cairo/2007-April/010337.html win32: • Fix crash when rendering with bitmap fonts (Carl Worth) https://bugzilla.mozilla.org/show_bug.cgi?id=376498 xlib: • Turn metrics-hinting on by default (Behdad Esfahbod) • Fix edge-effect problem with transformed images drawn to xlib (Behdad Esfahbod) https://bugs.freedesktop.org/show_bug.cgi?id=10508 • Avoid dereferencing a NULL screen. (Chris Wilson) https://bugs.freedesktop.org/show_bug.cgi?id=10517 Quartz/ATSUI: • Fix scaling of glyph surfaces (Brian Ewins) https://bugs.freedesktop.org/show_bug.cgi?id=9568 • Fix compilation failure when both xlib and quartz enabled (Brian Ewins) • Fix rounding bug leading to incorrectly positioned glyphs (Robert O'Callahan) https://bugs.freedesktop.org/show_bug.cgi?id=10531 Release 1.4.2 (2007-03-19 Carl Worth ) ========================================================= This is the first update release in cairo's stable 1.4 series. It comes just less than 2 weeks after 1.4.0. We hadn't anticipated an update this early, but we've managed to collect some important fixes that we wanted to get out to cairo users as soon as possible, (6 fixes for crashes, 1 case where graphical elements would not be drawn at all, a handful of backend-specific bugs, and several important build fixes). There's almost nothing but bug fixes in this release, (see below one optimization that Behdad did sneak in), so we recommend that everyone upgrade to this release when possible. Thanks to the many people that worked to fix these bugs, and those that did the work to report them and to test the fixes, (wherever possible both names are credited below). Critical fixes -------------- • Fix a crash due to a LOCK vs. UNLOCK typo (M. Drochner fixing Carl Worth's embarrassing typo). http://bugs.freedesktop.org/show_bug.cgi?id=10235 • Fix potential buffer overflow, which on some systems with a checking variant of snprintf would lead to a crash (Adrian Johnson, Stanislav Brabec, and sangu). https://bugs.freedesktop.org/show_bug.cgi?id=10267 https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=232576 • Fix a crash in cairo_stroke_extents or cairo_in_stroke when line width is 0.0. (Carl Worth and Sebastien Bacher) https://bugs.freedesktop.org/show_bug.cgi?id=10231 • Fix a crash on certain combinations of X server/video drivers (Carl Worth and Tomas Carnecky). https://bugs.freedesktop.org/show_bug.cgi?id=10250 • Fix a crash due to mishandling of invalid user input (Carl Worth and Alexander Darovsky). https://bugs.freedesktop.org/show_bug.cgi?id=9844 • xlib: Cleanup server-side glyph caches on XCloseDisplay. This eliminated a crash detected by the perf suite, (and that applications could have run into as well). (Chris Wilson) Other bug fixes --------------- • Fix for some geometry which simply disappeared under some transformations---a stroked line with an extreme skew in X, for example (Carl Worth and Jonathan Watt). https://bugzilla.mozilla.org/show_bug.cgi?id=373632 • SVG: Fix radial gradients for CAIRO_EXTEND_REFLECT and when r0 > r1 (Emmanuel Pacaud). • PDF: Set page group color space to DeviceRGB. This fixes incorrect (muddy) transparent colors when rendering cairo PDF output in some viewers. (Adrian Johnson, Adam Goode, and MenTaLguY). http://lists.freedesktop.org/archives/cairo/2006-November/008551.html • win32: Return correct metrics when hinting is off, and fix font descent computation (Behdad Esfahbod). • quartz: Fix glyph interfaces to correctly return user-space rather than device-space coordinates (Brian Ewins). https://bugs.freedesktop.org/show_bug.cgi?id=9568 • xcb: Fix parameter-order confusion with xcb_create_pixmap, which now makes all tests that pass with xlib now pass with xcb (Carl Worth, Jamey Sharp). • Fix some memory leaks in the perf suite (Chris Wilson). • Fix perf suite to consider changes in pixman/src (Mathias Hasselmann). Build fixes ----------- • Don't include pre-generated cairo-features.h file. This was causing build failures when building with the directfb backend enabled (Behdad Esfahbod). https://bugs.freedesktop.org/show_bug.cgi?id=10189 • Eliminate use of maintainer mode from cairo's automake/configure script. This means that updates to files such as Makefile.am will take effect, (by rerunning automake and friends as necessary) when invoking make rather than being silently ignored. (Behdad Esfahbod) • Don't compile cairo-deflate-stream.c, which depends on zlib, unless building the pdf backend which requires it. (Carl Worth, Tor Lillqvist) https://bugs.freedesktop.org/show_bug.cgi?id=10202 • Don't make the ps backend link against zlib anymore, since it doesn't require it (Carl Worth). • Use "find !" rather than "find -not" for better portability (Thomas Klausner). https://bugs.freedesktop.org/show_bug.cgi?id=10226 • Don't use unsupported visibility attribute "hidden" on Solaris (Gilles Dauphin, Thomas Klausner). https://bugs.freedesktop.org/show_bug.cgi?id=10227 Optimization ------------ • It was Behdad that suggested we focus strictly on bug fixes now that we shipped so many performance improvements in 1.4.0, but it was also Behdad that got distracted by the chance to remove a lot of mallocs from cairo. Paths, gstates, trapezoids, splines, polygons, and gradient color stops will now use small, stack-allocated buffers in the most common cases rather than calling malloc as often. (Behdad Esfahbod). And look for more from Mathias Hasselmann soon. Release 1.4.0 (2007-03-06 Carl Worth ) ========================================================= The many people[*] who have been working hard on cairo are very pleased to announce the long-awaited release of cairo 1.4. This release comes 4 months after the last stable update release (1.2.6) and 9 months since the initial release of 1.2.0. The release notes below are intended to capture the highlights of the changes that have occurred from the 1.2 series to the new 1.4.0 release. Performance improvements ------------------------ Within the cairo project, the last 6 months or so has seen an intense effort focusing on the performance of cairo itself. That effort has paid off considerably, as can be seen in the following highlights of some of the performance differences from cairo 1.2.6 to cairo 1.4.0. (Note: The performance results reported here were measured on an x86 laptop. Many of the improvements in 1.4---particular those involving text rendering---are even more dramatic on embedded platforms without hardware floating-point units. Such devices played an important part of many of the optimizations that found their way into cairo over the last few months.) • Dramatic improvement when drawing objects that are mostly off-screen with the image backend (with the xlib backend this case is still slow due to an X server bug): image-rgba long-lines-uncropped-100 479.64 -> 4.98: 96.24x speedup ███████████████████████████████████████████████▋ • Dramatic improvement when copying a small fraction of an image surface to an xlib surface: xlib-rgba subimage_copy-512 3.93 -> 0.07: 54.52x speedup ██████████████████████████▊ • Dramatic improvement to tessellation speed for complex objects: image-rgb tessellate-256-100 874.16 -> 34.79: 25.13x speedup ████████████■xlib-rgba zrusin_another_fill-415 148.40 -> 13.85: 10.72x speedup ████▉ xlib-rgb world_map-800 680.20 -> 345.54: 1.97x speedup â–Œ • Dramatic improvement to the speed of stroking rectilinear shapes, (such as the outline of a rectangle or "box"): image-rgb box-outline-stroke-100 0.18 -> 0.01: 24.22x speedup ███████████▋ xlib-rgb box-outline-stroke-100 0.46 -> 0.06: 8.05x speedup ███▌ • Dramatic improvements to text rendering speeds: xlib-rgba text_image_rgba_over-256 63.12 -> 9.61: 6.57x speedup ██▊ • 3x improvements to floating-point to fixed-point conversion speeds: image-rgba pattern_create_radial-16 9.29 -> 3.44: 2.70x speedup â–‰ • 2x improvements to linear gradient computation: image-rgb paint_linear_rgb_source-512 26.22 -> 11.61: 2.26x speedup â–‹ • 2x improvement to a case common in PDF rendering: image-rgb unaligned_clip-100 0.10 -> 0.06: 1.81x speedup ■• 1.3x improvement to rectangle filling speed (note: this improvement is new since 1.3.16---previously this test case was a 1.3x slowdown compared to 1.2.6): image-rgba rectangles-512 6.19 -> 4.37: 1.42x speedup â–Ž xlib-rgba rectangles-512 7.48 -> 5.58: 1.34x speedup â– NOTE: In spite of our best efforts, there are some measurable performance regressions in 1.4 compared to 1.2. It appears that the primary problem is the increased overhead of the new tessellator when drawing many, very simple shapes. The following test cases capture some of that slowdown: image-rgba mosaic_tessellate_lines-800 11.03 -> 14.29: 1.30x slowdown â– image-rgba box-outline-fill-100 0.01 -> 0.01: 1.26x slowdown â– image-rgba fill_solid_rgb_over-64 0.20 -> 0.22: 1.12x slowdown image-rgba fill_image_rgba_over-64 0.23 -> 0.25: 1.10x slowdown xlib-rgb paint_image_rgba_source-256 3.24 -> 3.47: 1.07x slowdown We did put some special effort into eliminating this slowdown for the very common case of drawing axis-aligned rectangles with an identity matrix (see the box-outline-stroke and rectangles speedup numbers above). Eliminating the rest of this slowdown will be a worthwhile project going forward. Also note that the "box-outline-fill" case is a slowdown while "box-outline-stroke" is a (huge) speedup. These two test cases resulted from the fact that some GTK+ theme authors were filling between two rectangles to avoid slow performance from the more natural means of achieving the same shape by stroking a single rectangle. With 1.4 that workaround should definitely be eliminated as it will now cause things to perform more slowly. Greatly improved PDF output --------------------------- We are very happy to be able to announce that cairo-generated PDF output will now have text that can be selected, cut-and-pasted, and searched with most capable PDF viewer applications. This is something that was not ever possible with cairo 1.2. Also, the PDF output now has much more compact encoding of text than before. Cairo is now much more careful to not embed multiple copies of the same font at different sizes. It also compresses text and font streams within the PDF output. API additions ------------- There are several new functions available in 1.4 that were not available in 1.2. Curiously, almost all of the new functions simply allow the user to query state that has been set in cairo (many new "get" functions) rather than providing any fundamentally new operations. The new functionality is: • Getting information about the current clip region cairo_clip_extents cairo_copy_clip_rectangle_list cairo_rectangle_list_destroy • Getting information about the current dash setting cairo_get_dash_count cairo_get_dash • Getting information from a pattern cairo_pattern_get_rgba cairo_pattern_get_surface cairo_pattern_get_color_stop_rgba cairo_pattern_get_color_stop_count cairo_pattern_get_linear_points cairo_pattern_get_radial_circles • Getting the current scaled font cairo_get_scaled_font • Getting reference counts cairo_get_reference_count cairo_surface_get_reference_count cairo_pattern_get_reference_count cairo_font_face_get_reference_count cairo_scaled_font_get_reference_count • Setting/getting user data on objects cairo_set_user_data cairo_get_user_data cairo_pattern_set_user_data cairo_pattern_get_user_data cairo_scaled_font_set_user_data cairo_scaled_font_get_user_data • New cairo-win32 functions: cairo_win32_surface_create_with_ddb cairo_win32_surface_get_image cairo_win32_scaled_font_get_logical_to_device cairo_win32_scaled_font_get_device_to_logical API deprecation --------------- The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never worked as a format value for cairo_image_surface_create, and it wasn't necessary for supporting 16-bit 565 X server visuals. A sampling of bug fixes in cairo 1.4 ------------------------------------ • Fixed radial gradients • Fixed dashing (degenerate and "leaky" cases) • Fixed transformed images in PDF/PS output (eliminate bogus repeating) • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD • cairo_show_page no longer needed for single-page output • SVG: Fix bug preventing text from appearing in many viewers • cairo-ft: Return correct metrics when hinting is off • Eliminate crash in cairo_create_similar if nil surface is returned • Eliminate crash after INVALID_RESTORE error • Fix many bugs related to multi-threaded use and locking • Fix for glyph spacing 32 times larger than desired (cairo-win32) • Fixed several problems in cairo-atsui (assertion failures) • Fix PDF output to avoid problems when printing from Acrobat Reader • Fix segfault on Mac OS X (measuring a zero-length string) • Fix text extents to not include the size of non-inked characters • Fix for glyph cache race condition in glitz backend (Jinghua Luo) • Fix make check to work on OPD platforms (IA64 or PPC64) • Fix compilation problems of cairo "wideint" code on some platforms • Many, many others... Experimental backends (quartz, XCB, OS/2, BeOS, directfb) --------------------------------------------------------- None of cairo's experimental backends are graduating to "supported" status with 1.4.0, but two of them in particular (quartz and xcb), are very close. The quartz baceknd has been entirely rewritten and is now much more efficient. The XCB backend has been updated to track the latest XCB API (which recently had a 1.0 release). We hope to see these backends become supported in a future release, (once they are passing all the tests in cairo's test suite). The experimental OS/2 backend is new in cairo 1.4 compared to cairo 1.2. Documentation improvements -------------------------- We have added documentation for several functions and types that were previously undocumented, and improved documentation on other ones. As of this release, there remain only two undocumented symbols: cairo_filter_t and cairo_operator_t. [*]Thanks to everyone --------------------- I've accounted for 41 distinct people with attributed code added to cairo between 1.2.6 and 1.4.0, (their names are below). That's an impressive number, but there are certainly dozens more that contributed with testing, suggestions, clarifying questions, and encouragement. I'm grateful for the friendships that have developed as we have worked on cairo together. Thanks to everyone for making this all so much fun! Adrian Johnson, Alfred Peng, Alp Toker, Behdad Esfahbod, Benjamin Otte, Brian Ewins, Carl Worth, Christian Biesinger, Christopher (Monty) Montgomery, Daniel Amelang, Dan Williams, Dave Yeo, David Turner, Emmanuel Pacaud, Eugeniy Meshcheryakov, Frederic Crozat, Hans Breuer, Ian Osgood, Jamey Sharp, Jeff Muizelaar, Jeff Smith, Jinghua Luo, Jonathan Watt, Joonas Pihlaja, Jorn Baayen, Kalle Vahlman, Kjartan Maraas, Kristian Høgsberg, M Joonas Pihlaja, Mathias Hasselmann, Mathieu Lacage, Michael Emmel, Nicholas Miell, Pavel Roskin, Peter Weilbacher, Robert O'Callahan, Soren Sandmann Pedersen, Stuart Parmenter, T Rowley, Vladimir Vukicevic Snapshot 1.3.16 (2007-03-02 Carl Worth ) =========================================================== New API functions ----------------- A few new public functions have been added to the cairo API since the 1.3.14 snapshot. These include a function to query the current scaled font: cairo_get_scaled_font New functions to query the reference count of all cairo objects: cairo_get_reference_count cairo_surface_get_reference_count cairo_pattern_get_reference_count cairo_font_face_get_reference_count cairo_scaled_font_get_reference_count And new functions to allow the use of user_data with any cairo object, (previously these were only available on cairo_surface_t and cairo_font_face_t objects): cairo_set_user_data cairo_get_user_data cairo_pattern_set_user_data cairo_pattern_get_user_data cairo_scaled_font_set_user_data cairo_scaled_font_get_user_data Usability improvement for PDF/PS/SVG generation ----------------------------------------------- In previous versions of cairo, generating single-page output with the cairo-pdf, cairo-ps, or cairo-svg backends required a final call to cairo_show_page. This was often quite confusing as people would port functional code from a non-paginated backend and be totally mystified as to why the output was blank until they learned to add this call. Now that call to cairo_show_page is optional, (it will be generated implicitly if the user does not call it). So cairo_show_page is only needed to explicitly separate multiple pages. Greatly improved PDF output --------------------------- We are very happy to be able to announce that cairo-generated PDF output will now have text that can be selected, cut-and-paste, and searched with most capable PDF viewer applications. This is something that was not ever possible with cairo 1.2. Also, the PDF output now has much more compact encoding of text than before. Cairo is now much more careful to not embed multiple copies of the same font at different sizes. It also compresses text and font streams within the PDF output. Major bug fixes --------------- • Fixed radial gradients The rendering of radial gradients has been greatly improved. In the cairo 1.2 series, there was a serious regression affecting radial gradients---results would be very incorrect unless one of the gradient circles had a radius of 0.0 and a center point within the other circle. These bugs have now been fixed. • Fixed dashing Several fixes have been made to the implementation of dashed stroking. Previously, some dashed, stroked rectangles would mis-render and fill half of the rectangle with a large triangular shape. This bug has now been fixed. • Fixed transformed images in PDF/PS output In previous versions of cairo, painting with an image-based source surface pattern to the PDF or PS backends would cause many kinds of incorrect results. One of the most common problems was that an image would be repeated many times even when the user had explicitly requested no repetition with CAIRO_EXTEND_NONE. These bugs have now been fixed. • Eliminate errors from CAIRO_EXTEND_REFLECT and CAIRO_EXTEND_PAD In the 1.2 version of cairo any use of CAIRO_EXTEND_REFLECT or CAIRO_EXTEND_PAD with a surface-based pattern resulted in an error, (cairo would stop rendering). This bug has now been fixed. Now, CAIRO_EXTEND_REFLECT should work properly with surface patterns. CAIRO_EXTEND_PAD is still not working correctly, but it will now simply behave as CAIRO_EXTEND_NONE rather than triggering the error. New rewrite of quartz backend (still experimental) -------------------------------------------------- Cairo's quartz backend has been entirely rewritten and is now much more efficient. This backend is still marked as experimental, not supported, but it is now much closer to becoming an officially supported backend. (For people that used the experimental nquartz backend in previous snapshots, that implementation has now been renamed from "nquartz" to "quartz" and has replaced the old quartz backend.) Documentation improvements -------------------------- We have added documentation for several functions and types that were previously undocumented, and improved documentation on other ones. As of this release, there remain only two undocumented symbols: cairo_filter_t and cairo_operator_t. Other bug fixes --------------- • cairo-svg: Fix bug that was preventing text from appearing in many viewers • cairo-ft: Return correct metrics when hinting is off • Cairo 1.3.14 deadlocks in cairo_scaled_font_glyph_extents or _cairo_ft_unscaled_font_lock_face https://bugs.freedesktop.org/show_bug.cgi?id=10035 • cairo crashes in cairo_create_similar if nil surface returned by other->backend->create_similar https://bugs.freedesktop.org/show_bug.cgi?id=9844 • evolution crash in _cairo_gstate_backend_to_user() https://bugs.freedesktop.org/show_bug.cgi?id=9906 • Fix memory leak in rectilinear stroking code Things not in this release -------------------------- • Solid-surface-pattern cache: This patch had been applied during the 1.3.x series, but it was reverted due to some inter-thread problems it caused. The patch is interesting since it made a big benefit for text rendering performance---so we'll work to bring a corrected version of this patch back as soon as possible. Snapshot 1.3.14 (2006-02-13 Carl Worth ) =========================================================== This is the seventh development snapshot in the 1.3 series, (and there likely won't be many more before the 1.4.0 release). It comes just over 3 weeks after the 1.3.12 snapshot. Since we're so close to the 1.4.0 release, there are not a lot of new features nor even a lot of new performance improvements in this snapshot. Instead, there are a great number of bug fixes. Some are long-standing bugs that we're glad to say goodbye to, and several are fixes for regressions that were introduced as part of the optimization efforts during the 1.3.x series. PDF text selection fixed ------------------------ The inability to correctly select text in cairo-generated PDF has been a defect ever since the initial support for the PDF backend in the cairo 1.2.0 release. With the 1.3.14 snapshot, in most situations, and with most PDF viewer applications, the PDF generated by cairo will allow text to be correctly selected for copy-and-paste, (as well as searching). We're very excited about this new functionality, (and very grateful to Adrian Johnson, Behdad Esfahbod, and others that have put a lot of work into this lately). Please test this new ability and give feedback on the cairo@cairographics.org list. Many thread-safety issues fixed ------------------------------- We've discovered that no release of cairo has ever provided safe text rendering from a multi-threaded application. With the 1.3.14 snapshot a huge number of the bugs in this area have been fixed, and multiple application dvelopers have now reported success at writing multi-threaded applications with cairo. Other fixes ----------- Fixed a bug that was causing glyph spacing to be 32 times larger than desired when using cairo-win32. Fixed a regression in the rendering of linear gradients that had been present since the 1.3.8 snapshot. Fixed several problems in cairo-atsui that were leading to assertion failures when rendering text. Fix corrupted results when rendering a transformed source image surface to an xlib surface. This was a regression that had been present since the 1.3.2 snapshot. Fixed PDF output to prevent problems printing from some versions of Acrobat Reader, (a single glyph was being substituted for every glyph). And many other fixes as well, (see the logs for details). Snapshot 1.3.12 (2007-01-20 Carl Worth ) =========================================================== The relentless march toward the cairo 1.4 release continues, (even if slightly late out of the starting blocks in 2007). This is the sixth development snapshot in the 1.3 series. It comes 4 weeks after the 1.3.10 snapshot. Performance ----------- As usual, this snapshot has some fun performance improvements to show off: image-rgba long-lines-uncropped-100 470.08 -> 4.95: 94.91x speedup ███████████████████████████████████████████████ image-rgb long-lines-uncropped-100 461.60 -> 4.96: 93.02x speedup ██████████████████████████████████████████████ This 100x improvement, (and yes, that's 100x, not 100%), in the image backend occurs when drawing large shapes where only a fraction of the shape actually appears in the final result, (the rest being outside the bounds of the destination surface). Many applications should see speedups here, and the actual amount of speedup depends on the ratio of non-visible to visible portions of geometry. [Note: There remains a similar performance bug when drawing mostly non-visible objects with the xlib backend. This is due to a similar bug in the X server itself, but we hope a future cairo snapshot will workaround that bug to get a similar speedup with the xlib backend.] image-rgba unaligned_clip-100 0.09 -> 0.06: 1.67x speedup â– image-rgb unaligned_clip-100 0.09 -> 0.06: 1.66x speedup â– This speedup is due to further MMX optimization by Soeren Sandmann for a case commonly hit when rendering PDF files, (and thanks to Jeff Muizelaar for writing code to extract the test case for us). There's another MMX optimization in this snapshot (without a fancy speedup chart) by Dan Williams which improves compositing performance specifically for the OLPC machine. Thanks to Adrian Johnson, cairo's PDF output is now much more efficient in the way it encodes text output. By reducing redundant information and adding compression to text output streams, Adrian achieved a ~25x improvement in the efficiency of encoding text in PDF files, (was ~45 bytes per glyph and is now ~1.6 bytes per glyph). Bug fixes --------- In addition to those performance improvements, this snapshot includes several bug fixes: * A huge number of bug fixes for cairo-atsui text rendering, (for mac OS X). These bugs affect font selection, glyph positioning, glyph rendering, etc. One noteworthy bug fixes is that cairo_select_font_face will no longer arbitrarily select bold nor italic when not requested, (at least not when using a standard CSS2 font family name such as "serif", "sans-serif", "monospace", etc.). All these fixes are thanks to Brian Ewins who continues to do a great job as the new cairo-atsui maintainer. * Fix PDF output so that images that are scaled down no longer mysteriously repeat (Carl Worth). * Fix segfault on Mac OS X dues to attempt to measure extents of a zero-length string (Behdad Esfahbod). * Fix text extents to not include the size of initial/trailing non-inked characters (Behdad Esfahbod). API tweaks ---------- Three functions have had API changes to improve consistency. Note that the API functions being changed here are all functions that were introduced as new functions during these 1.3.x snapshots. As always, there will not be any API changes to functions included in a major release (1.2.x, 1.4.x, etc.) of cairo. The changes are as follows: * Rename of cairo_copy_clip_rectangles to cairo_copy_clip_rectangle_list. * Change cairo_get_dash_count to return an int rather than accepting a pointer to an int for the return value. * Change cairo_get_dash to have a void return type rather than returning cairo_status_t. It's possible there will be one more round of changes to these functions, (and perhaps cairo_get_color_stop as well), as we seek to establish a unifying convention for returning lists of values. Snapshot 1.3.10 (2006-12-23 Carl Worth ) =========================================================== Santa Claus is coming just a little bit early this year, and he's bringing a shiny new cairo snapshot for all the good little boys and girls to play with. This is the fifth development snapshot in the 1.3 series. It comes 9 days after the 1.3.8 snapshot, and still well within our goal of having a new snapshot every week, (though don't expect one next week---we'll all be too stuffed with sugar plums). Speaking of sugar plums, there's a sweet treat waiting in this cairo snapshot---greatly improved performance for stroking rectilinear shapes, like the ever common rectangle: image-rgb box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup ████████████████████████▋ image-rgba box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup ████████████████████████▋ xlib-rgb box-outline-stroke-100 0.49 -> 0.06: 8.67x speedup ███████▋ xlib-rgba box-outline-stroke-100 0.22 -> 0.04: 5.39x speedup ████■In past releases of cairo, some people had noticed that using cairo_stroke to draw rectilinear shapes could be awfully slow. Many people had worked around this by using cairo_fill with a more complex path and gotten a 5-15x performance benefit from that. If you're one of those people, please rip that workaround out, as now the more natural use of cairo_stroke should be 1.2-2x faster than the unnatural use of cairo_fill. And if you hadn't ever implemented that workaround, then you just might get to see your stroked rectangles now get drawn 5-25x faster. Beyond that performance fix, there are a handful of bug fixes in this snapshot: * Fix for glyph cache race condition in glitz backend (Jinghua Luo) * Many fixes for ATSUI text rendering (Brian Ewins) * Un-break recent optimization-triggered regression in rendering text with a translation in the font matrix (Behdad Esfahbod) * Fix make check to work on OPD platforms (IA64 or PPC64) (Frederic Crozat) * Fix a couple of character spacing issues on Windows (Jonathan Watt) Have fun with that, everybody, and we'll be back for more in the new year, (with a plan to add the last of our performance improvements in this round, fix a few bad, lingering bugs, and then finish off a nice, stable 1.4 release before the end of January). -Carl Snapshot 1.3.8 (2006-12-14 Carl Worth ) ========================================================== This is the fourth development snapshot in the 1.3 series. It comes just slightly more than one week after the 1.3.6 snapshot. After the bug fixes in 1.3.6, we're back to our original program of weekly snapshots, each one faster than the one from the week before. Cairo 1.3.8 brings a 2x improvement in the speed of rendering linear gradients (thanks to David Turner), and a significant reduction in X traffic when rendering text (thanks to Xan Lopez and Behdad Esfahbod), making cairo behave very much like Xft does. A few other things in the 1.3.8 snapshot worth noting include a more forgiving image comparator in the test suite, (using the "perceptual diff" metric and GPL implementation by Hector Yee[*]), a bug fix for broken linking on x86_64 (thanks to M Joonas Pihlaja) and an even better implementation of _cairo_lround, (not faster, but supporting a more complete input range), from Daniel Amelang. [*] http://pdiff.sourceforge.net/ Snapshot 1.3.6 (2006-12-06 Carl Worth ) ========================================================== This is the third development snapshot in the 1.3 series. It comes two weeks after the 1.3.4 snapshot. We don't have fancy performance charts this week as the primary changes in this snapshot are bug fixes. The performance work continues and the next snapshot (planned for one week from today) should include several improvements. The bug fixes in this snapshot include: * Fix undesirable rounding in glyph positioning (Dan Amelang) This bug was noticed by several users, most commonly by seeing improper text spacing or scrambled glyphs as drawn by nautilus. For example: Update to cairo-1.3.4 worsen font rendering https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=217819 * Fix reduced range of valid input coordinates to tessellator (M Joonas Pihlaja) This bug was causing lots of assertion failures in mozilla as mentioned here: CAIRO_BO_GUARD_BITS and coordinate space? http://lists.freedesktop.org/archives/cairo/2006-December/008743.html * Fix several regressions in new tessellator (M Joonas Pihlaja) Joonas just had a good eye for detail here. I don't think any external cairo users had noticed any of these bugs yet. * Fix compilation problems of cairo "wideint" code on some platforms (Mathieu Lacage) * Fix failed configure due to broken grep (Dan Amelang) This bug was reported here: AX_C_FLOAT_WORDS_BIGENDIAN doesn't work because grep doesn't work with binary file https://bugs.freedesktop.org/show_bug.cgi?id=9124 * Remove the pkg-config minimum version requirement (Behdad Esfahbod) Some systems ship with pkg-config 0.15 and there was really no good reason for cairo to insist on having version 0.19 before it would build. There is also one new (but inert) feature in this snapshot. There's a new option that can be passed to cairo's configure script: --disable-some-floating-point Disable certain code paths that rely heavily on double precision floating-point calculation. This option can improve performance on systems without a double precision floating-point unit, but might degrade performance on those that do. As of this snapshot, this option does not make any change to cairo, but it is possible that future versions of cairo will respect this option and change the implementation of various functions as appropriate. Snapshot 1.3.4 (2006-11-22 Carl Worth ) ========================================================== This is the second development snapshot in the 1.3 series. It comes one week after the 1.3.2 snapshot. This snapshot has a couple of significant performance improvements, and also adds new support for producing multi-page SVG output, (when targeting SVG 1.2)---thanks to Emmanuel Pacaud. The details of the performance improvements are as follows: 1. The long-awaited "new tessellator". The credit for this being an improvement goes to Joonas Pihlaja. He took my really slow code and really put it through its paces to get the dramatic performance improvement seen below (up to 38x faster on realistic cases, and more than 10x faster for the zrusin_another test). His own writeup of the work he did is quite thorough, but more than can be quoted here. Please see his post for the interesting details: http://lists.freedesktop.org/archives/cairo/2006-November/008483.html (Though note that this snapshot also includes some additional, significant improvements that were only sketched out in that email---see "Generating fewer trapezoids"). 2. More floating-point improvements Daniel Amelang continues to work the magic he began in the 1.3.2 snapshot. This time he short-circuits floating-point transformations by identity matrices and applies the earlier floating-to-fixed-point technique to the problem of rounding. The improvements here will primarily benefit text performance, and will benefit platforms without hardware floating-point more than those that have it, (some text tests show 20% improvement on an x86 machine and closer to 80% improvement on arm). The performance chart comparing 1.3.2 to 1.3.4 really speaks for itself, (this is on an x86 laptop). This is quite a lot of progress for one week: xlib-rgb stroke_similar_rgba_over-256 74.99 1.45% -> 2.03 68.38%: 36.86x speedup ███████████████████████████████████▉ xlib-rgb stroke_similar_rgba_source-256 78.23 1.43% -> 3.30 67.05%: 23.71x speedup ██████████████████████▊ xlib-rgba tessellate-256-100 820.42 0.15% -> 35.06 2.84%: 23.40x speedup ██████████████████████■image-rgba tessellate-256-100 819.55 0.32% -> 35.04 3.56%: 23.39x speedup ██████████████████████■xlib-rgb stroke_image_rgba_over-256 78.10 1.43% -> 4.33 65.56%: 18.04x speedup █████████████████ xlib-rgb stroke_image_rgba_source-256 80.11 1.63% -> 5.75 63.99%: 13.94x speedup █████████████ xlib-rgba zrusin_another_tessellate-415 89.22 0.35% -> 8.38 5.23%: 10.65x speedup █████████▋ image-rgba zrusin_another_tessellate-415 87.38 0.89% -> 8.37 5.22%: 10.44x speedup █████████■image-rgba zrusin_another_fill-415 117.67 1.34% -> 12.88 2.77%: 9.14x speedup ████████■xlib-rgba zrusin_another_fill-415 140.52 1.57% -> 15.79 2.88%: 8.90x speedup ███████▉ image-rgba tessellate-64-100 9.68 3.42% -> 1.42 0.60%: 6.82x speedup █████▉ xlib-rgba tessellate-64-100 9.78 4.35% -> 1.45 0.83%: 6.72x speedup █████▊ xlib-rgb stroke_linear_rgba_over-256 46.01 2.44% -> 7.74 54.51%: 5.94x speedup █████ xlib-rgb stroke_linear_rgba_source-256 48.09 2.15% -> 9.14 53.00%: 5.26x speedup ████▎ xlib-rgb stroke_radial_rgba_over-256 50.96 2.34% -> 12.46 47.99%: 4.09x speedup ███■xlib-rgb stroke_radial_rgba_source-256 53.06 1.57% -> 13.96 46.57%: 3.80x speedup ██▊ image-rgba paint_similar_rgba_source-256 0.12 1.57% -> 0.08 9.92%: 1.42x speedup â– image-rgba paint_image_rgba_source-256 0.12 2.49% -> 0.08 10.70%: 1.41x speedup â– image-rgba world_map-800 356.28 0.46% -> 275.72 1.15%: 1.29x speedup â–Ž xlib-rgba world_map-800 456.81 0.39% -> 357.95 1.39%: 1.28x speedup â–Ž image-rgb tessellate-16-100 0.09 0.57% -> 0.07 3.43%: 1.23x speedup â–Ž image-rgba tessellate-16-100 0.09 0.06% -> 0.07 2.46%: 1.23x speedup â–Ž image-rgba text_solid_rgb_over-256 5.39 4.01% -> 4.47 0.70%: 1.21x speedup â–Ž image-rgba text_solid_rgba_over-256 5.37 0.82% -> 4.45 0.75%: 1.21x speedup â–Ž image-rgba text_image_rgb_over-64 0.78 0.10% -> 0.65 0.74%: 1.20x speedup â–Ž image-rgba text_image_rgba_over-64 0.78 0.29% -> 0.65 0.68%: 1.19x speedup â–Ž image-rgb text_solid_rgb_over-64 0.76 2.45% -> 0.63 0.81%: 1.19x speedup â–Ž image-rgba text_solid_rgba_over-64 0.76 0.33% -> 0.64 0.66%: 1.19x speedup â–Ž image-rgba text_similar_rgba_over-256 5.99 4.72% -> 5.04 1.09%: 1.19x speedup â–Ž We should point out that there is some potential for slowdown in this snapshot. The following are the worst slowdowns reported by the cairo performance suite when comparing 1.3.2 to 1.3.4: image-rgba subimage_copy-256 0.01 0.87% -> 0.01 3.61%: 1.45x slowdown â–Œ xlib-rgb paint_solid_rgb_over-256 0.31 10.23% -> 0.38 0.33%: 1.26x slowdown â–Ž image-rgba box-outline-fill-100 0.01 0.30% -> 0.01 2.52%: 1.21x slowdown â–Ž image-rgba fill_solid_rgb_over-64 0.20 1.22% -> 0.22 1.59%: 1.12x slowdown â– image-rgb fill_similar_rgb_over-64 0.21 1.04% -> 0.24 1.06%: 1.11x slowdown â– image-rgba fill_image_rgb_over-64 0.21 1.19% -> 0.24 0.72%: 1.11x slowdown â– image-rgba fill_similar_rgb_over-64 0.21 0.18% -> 0.24 0.30%: 1.11x slowdown â– image-rgb fill_solid_rgba_over-64 0.22 1.66% -> 0.24 1.15%: 1.11x slowdown â– image-rgb fill_image_rgb_over-64 0.21 0.14% -> 0.24 0.80%: 1.11x slowdown â– image-rgba fill_image_rgba_over-64 0.22 1.34% -> 0.25 0.20%: 1.11x slowdown â– image-rgba fill_solid_rgba_over-64 0.22 1.48% -> 0.24 0.95%: 1.11x slowdown â– image-rgb fill_similar_rgba_over-64 0.22 1.13% -> 0.25 1.25%: 1.10x slowdown â– The 45% slowdown for subimage_copy is an extreme case. It's unlikely to hit many applications unless they often use cairo_rectangle; cairo_fill to copy a single pixel at a time. In any case, it shows a worst-case impact of the overhead of the new tessellator. The other slowdowns (~ 10%) are probably more realistic, and still very concerning. We will work to ensure that performance regressions like these are not present from one major release of cairo to the next, (for example, from 1.2 to 1.4). But we're putting this 1.3.4 snapshot out there now, even with this potential slowdown so that people can experiment with it. If you've got complex geometry, we hope you will see some benefit from the new tessellator. If you've got primarily simple geometry, we hope things won't slowdown too much, but please let us know what slowdown you see, if any, so we can calibrate our performance suite against real-world impacts. Thanks, and have fun with cairo! Snapshot 1.3.2 (2006-11-14 Carl Worth ) ========================================================== This is the first development snapshot since the 1.2 stable series branched off shortly after the 1.2.4 release in August 2006. This snapshot includes all the bug fixes from the 1.2.6 release, (since they originated here on the 1.3 branch first and were cherry-picked over to 1.2). But more importantly, it contains some new API in preparation for a future 1.4 release, and most importantly, it contains several performance improvements. The bug fixes will not be reviewed here, as most of them are already described in the 1.2.6 release notes. But details for the new API and some performance improvements are included here. As with all snapshots, this is experimental code, and the new API added here is still experimental and is not guaranteed to appear unchanged in any future release of cairo. API additions ------------- Several new API additions are available in this release. There is a common theme among all the additions in that they allow cairo to advertise information about its state that it was refusing to volunteer earlier. So this isn't groundbreaking new functionality, but it is essential for easily achieving several tasks. The new functions can be divided into three categories: Getting information about the current clip region ------------------------------------------------- cairo_clip_extents cairo_copy_clip_rectangles cairo_rectangle_list_destroy Getting information about the current dash setting -------------------------------------------------- cairo_get_dash_count cairo_get_dash Getting information from a pattern ---------------------------------- cairo_pattern_get_rgba cairo_pattern_get_surface cairo_pattern_get_color_stop_rgba cairo_pattern_get_color_stop_count cairo_pattern_get_linear_points cairo_pattern_get_radial_circles In each of these areas, we have new API for providing a list of uniform values from cairo. The closest thing we had to this before was cairo_copy_path, (which is rather unique in providing a list of non-uniform data). The copy_clip_rectangles/rectangle_list_destroy functions follow a style similar to that of cairo_copy_path. Meanwhile, the dash and pattern color stop functions introduce a new style in which there is a single call to return the number of elements available (get_dash_count and get_color_stop_count) and then a function to be called once to get each element (get_dash and get_color_stop_rgba). I'm interested in hearing feedback from users of these new API functions, particularly from people writing language bindings. One open question is whether the clip "getter" functionality should adopt a style similar to that of the new dash and color_stop interfaces. API deprecation --------------- The CAIRO_FORMAT_RGB16_565 enum value has been deprecated. It never worked as a format value for cairo_image_surface_create, and it wasn't necessary for supporting 16-bit 565 X server visuals. XCB backend changes ------------------- The XCB backend has been updated to track the latest XCB API (which recently had a 1.0 release). New quartz backend ------------------ Vladimir Vukicevic has written a new "native quartz" backend which will eventually replace the current "image-surface wrapping" quartz backend. For now, both backends are available, (the old one is "quartz" and the new one is "nquartz"). But it is anticipated that the new backend will replace the old one and take on the "quartz" name before this backend is marked as supported in a release of cairo. New OS/2 backend ---------------- Doodle and Peter Weilbacher have contributed a new, experimental backend for using cairo on OS/2 systems. Performance improvements ------------------------ Here are some highlights from cairo's performance suite showing improvements from cairo 1.2.6 to cairo 1.3.2. The command used to generate this data is: ./cairo-perf-diff 1.2.6 HEAD available in the perf/ directory of a recent checkout of cairo's source, (the cairo-perf-diff script does require a git checkout and will not work from a tar file---though ./cairo-perf can still be used to generate a single report there and ./cairo-perf-diff-files can be used to compare two reports). Results are described below both for an x86 laptop (with an old Radeon video card, recent X.org build, XAA, free software drivers), as well as for a Nokia 770. First the x86 results with comments on each, (all times are reported in milliseconds). Copying subsets of an image surface to an xlib surface (much faster) -------------------------------------------------------------------- xlib-rgba subimage_copy-512 10.50 -> : 53.97x speedup █████████████████████████████████████████████████████ Thanks to Christopher (Monty) Montgomery for this big performance improvement. Any application which has a large image surface and is copying small pieces of it at a time to an xlib surface, (imagine an application that loads a single image containing all the "sprites" for that application), will benefit from this fix. The larger the ratio of the image surface to the portion being copied, the larger the benefit. Floating-point conversion (3x faster) ------------------------------------- xlib-rgba pattern_create_radial-16 27.75 -> 3.93 : 2.94x speedup ██ image-rgb pattern_create_radial-16 26.06 -> 3.74 : 2.90x speedup █▉ Thanks to Daniel Amelang, (and others who had contributed the idea earlier), for this nice improvement in the speed of converting floating-point values to fixed-point. Text rendering (1.3 - 2x faster) ------------------------------ xlib-rgba text_image_rgba_source-256 319.73 -> 62.40 : 2.13x speedup █■image-rgb text_solid_rgba_over-64 2.85 -> 0.88 : 1.35x speedup â– I don't think we've ever set out to improve text performance specifically, but we did it a bit anyway. I believe the extra improvement in the xlib backend is due to Monty's image copying fix above, and the rest is due to the floating-point conversion speedup. Thin stroke improvements (1.5x faster) --------------------------------------------- image-rgb world_map-800 1641.09 -> 414.77 : 1.65x speedup â–‹ xlib-rgba world_map-800 1939.66 -> 529.94 : 1.52x speedup â–Œ The most modest stuff to announce in this release is the 50% improvement I made in the world_map case. This is in improvement that should help basically anything that is doing strokes with many straight line segments, (and the thinner the better, since that makes tessellation dominate rasterization). The fixes here are to use a custom quadrilateral tessellator rather than the generic tessellator for straight line segments and the miter joins. Performance results from the Nokia 770 -------------------------------------- xlib-rgba subimage_copy-512 55.88 -> 2.04 : 27.34x speedup ██████████████████████████■xlib-rgb text_image_rgb_over-256 1487.58 -> 294.43 : 5.05x speedup ████ image-rgb pattern_create_radial-16 187.13 -> 91.86 : 2.04x speedup â–ˆ xlib-rgba world_map-800 21261.41 -> 15628.02 : 1.36x speedup â– Here we see that the subimage_copy improvement was only about half as large as the corresponding improvement on my laptop, (27x faster compared to 54x) and the floating-point conversion fix also was quite as significant, (2x compared to 3x). Oddly the improvement to text rendering performance was more than twice as good (5x compared to 2x). I don't know what the reason for that is, but I don't think it's anything anybody should complain about. Release 1.2.6 (2006-11-02 Behdad Esfahbod ) ============================================================== This is the third bug fix release in the 1.2 series, coming less than two months after the 1.2.4 release made on August 18. The 1.2.4 release turned out to be a pretty solid one, except for a crasher bug when forwarding an X connection where the client and the server have varying byte orders, eg. from a PPC to an i686. Other than that, various other small bugs have been fixed. Various improvements have been made in the testing infrastructure to prevent false positives, and to make sure the generated cairo shared object behaves as expected in terms of exported symbols and relocations. There were a total of 89 changes since 1.2.4. The following list the most important ones: Common fixes ------------ - Avoid unsigned loop control variable to eliminate infinite, memory-scribbling loop. (#7593) - Fix cairo_image_surface_create to report INVALID_FORMAT errors. Previously the detected error was being lost and a nil surface was returned that erroneously reported CAIRO_STATUS_NO_MEMORY. - Change _cairo_color_compute_shorts to not rely on any particular floating-point epsilon value. (#7497) - Fix infinite-join test case (bug #8379) - Pass correct surface to create_similar in _cairo_clip_init_deep_copy(). PS/PDF fixes ------------ - Fix Type 1 embedding in PDF. - Correct the value of /LastChar in the PDF Type 1 font dictionary. - Improve error checking in TrueType subsetting. - Compute right index when looking up left side bearing. (bug #8180) - Correct an unsigned to signed conversion problem in truetype subsetting bbox. - Type1 subsetting: Don't put .notdef in Encoding when there are 256 glyphs. - Add cairo version to PS header / PDF document info dictionary. - Set CTM before path construction. Win32 fixes ----------- - Get correct unhinted outlines on win32. (bug 7603) - Make cairo as a win32 static library possible. - Use CAIRO_FORMAT_RGB24 for BITSPIXEL==32 surfaces too. Build system fixes ------------------ - Define WINVER if it's not defined. (bug 6456) - Fix the AMD64 final link by removing SLIM from pixman. - Misc win32 compilation fixes. - Add Sun Pro C definition of pixman_private. - Use pixman_private consistently as prefix not suffix. - Added three tests check-plt.sh, check-def.sh, and check-header.sh that check that the shared object, the .def file, and the public headers agree about the exported symbols. - Require pkg-config 0.19. (#8686) Release 1.2.4 (2006-08-18 Carl Worth ) ========================================================= This is the second bug fix release in the 1.2 series, coming less than two weeks after the 1.2.2 release made on August 8. The big motivation for a quick release was that there were a log of build system snags that people ran into with the 1.2.2 release. But, by the time we got those all done, we found that we had a bunch of fixes for cairo's rendering as well. So there's a lot of goodness in here for such a short time period. Rendering fixes --------------- Fix image surfaces to not be clipped when used as a source (Vladimir Vukicevic) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=72e25648c4c4bc82ddd938aa4e05887a293f0d8b Fix a couple of corner cases in dashing degenerate paths (Jeff Muizelaar) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=fbb1758ba8384650157b2bbbc93d161b0c2a05f0 Fix support for type1 fonts on win32 (Adrian Johnson) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=da1019c9138695cb838a54f8b871bbfd0e8996d7 Fix assertion failure when rotating bitmap fonts (Carl Worth) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0bfa6d4f33b8ddb5dc55bbe419c15df4af856ff9 Fix assertion failure when calling cairo_text_path with bitmap fonts (Carl Worth) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9878a033531e6b96b5f27e69e10e90dee7440cd9 Fix mis-handling of cairo_close_path in some situations (Tim Rowley, Carl Worth) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=53f74e59faf1af78f2f0741ccf1f23aa5dad4efc Respect font_matrix translation in _cairo_gstate_glyph_path (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f183b835b111d23e838889178aa8106ec84663b3 Fix vertical metrics adjustment to work with non-identity shapes (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7bc263842a798d657a95e539e1693372448837f [PS] Set correct ImageMatrix in _cairo_ps_surface_emit_bitmap_glyph_data (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=d47388ad759b0a1a0869655a87d9b5eb6ae2445d Build system fixes ------------------ Fix xlib detection to prefer pkg-config to avoid false libXt dependency (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=0e78e7144353703cbd28aae6a67cd9ca261f1d68 Fix typos causing win32 build problem with PS,PDF, and SVG backends (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=aea83b908d020e26732753830bb3056e6702a774 Fix configure cache to not use stale results (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6d0e3260444a2d5b6fb0cb223ac79f1c0e7b3a6e Fix to not pass unsupported warning options to the compiler (Jens Granseuer) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=97524a8fdb899de1ae4a3e920fb7bda6d76c5571 Fix to allow env. variables such as png_REQUIRES to override configure detection (Jens Granseuer) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=abd16e47d6331bd3811c908e524b4dcb6bd23bf0 Fix test suite to not use an old system cairo when converting svg2png (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6122cc85c8f71b1ba2df3ab86907768edebe1781 Fix test suite to not require signal.h to be present (Behdad Esfahbod) http://gitweb.freedesktop.org/?p=cairo;a=commit;h=6f8cf53b1e1ccdbe1ab6a275656b19c6e5120e40 Code cleanups ------------- Many useful warnings cleanups from sparse, valgrind, and careful eyes (Kjartan Maraas, Pavel Roskin) Release 1.2.2 (2006-08-08 Carl Worth ) ========================================================= This is the first bug fix release in the 1.2 series since the original 1.2.0 release made six weeks ago. There were some very serious bugs in the 1.2.0 release, (see below), so everybody is encouraged to upgrade from 1.2.0 to 1.2.2. The 1.2.2 release maintains source and binary compatibility with 1.2.0 and does not make any API additions. Fix crashes with BGR X servers ------------------------------ With cairo 1.2.0 many people reported problems with all cairo-using programs, (including all GTK+ programs with GTK+ >= 2.8) immediately crashing with a complaint about an unsupported image format. This bug affected X servers that do not provide the Render extension and that provide a visual with BGR rather than RGB channel order. report: https://bugs.freedesktop.org/show_bug.cgi?id=7294 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9ae66174e774b57f16ad791452ed44efc2770a59 Fix the "disappearing text" bug ------------------------------- With cairo 1.2.0 many people reported that text would disappear from applications, sometimes reappearing with mouse motion or selection. The text would disappear after the first space in a string of text. This bug was caused by an underlying bug in (very common) X servers, and only affected text rendered without antialiasing, (either a bitmap font or a vector font with antialiasing disabled). The bug was also exacerbated by a KDE migration bug that caused antialiasing to be disabled more than desired. report: https://bugs.freedesktop.org/show_bug.cgi?id=7494 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=456cdb3058f3b416109a9600167cd8842300ae14 see also: Xorg: https://bugs.freedesktop.org/show_bug.cgi?id=7681 KDE: http://qa.mandriva.com/show_bug.cgi?id=23990 Fix broken image fallback scaling (aka. "broken printing") ---------------------------------------------------------- The various "print" backends, (pdf, ps, and svg), sometimes fallback to using image-based rendering for some operations. In cairo 1.2.0 these image fallbacks were scaled improperly. Applications using cairo can influence the resolution of the image fallbacks with cairo_surface_set_fallback_resolution. With the bug, any value other than 72.0 would lead to incorrect results, (larger values would lead to increasingly shrunken output). report: https://bugs.freedesktop.org/show_bug.cgi?id=7533 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=1feb4291cf7813494355459bb547eec604c54ffb Fix inadvertent semantic change of font matrix translation (Behdad Esfahbod) ---------------------------------------------------------------------------- The 1.2.0 release introduced an inadvertent change to how the translation components of a font matrix are interpreted. In the 1.0 series, font matrix translation could be used to offset the glyph origin, (though glyph metrics were reported incorrectly in 1.0). However in 1.2.0, the translation was applied to the advance values between each glyph. The 1.2.0 behavior is fairly useless in practice, and it was not intentional to introduce a semantic change. With 1.2.2 we return to the 1.0 semantics, with a much better implementation that provides correct glyph metrics. fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=84840e6bba6e72aa88fad7a0ee929e8955ba9051 Fix create_similar to preserve fallback resolution and font options (Behdad Esfahbod) ------------------------------------------------------------------------------------- There has been a long-standing issue with cairo_surface_create_similar such that font options and other settings from the original destination surface would not be preserved to the intermediate "similar" surface. This could result in incorrect rendering (particularly with respect to text hinting/antialiasing) with fallbacks, for example. report: https://bugs.freedesktop.org/show_bug.cgi?id=4106 fixes: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=9fcb3c32c1f16fe6ab913e27eb54d18b7d9a06b0 http://gitweb.freedesktop.org/?p=cairo;a=commit;h=bdb4e1edadb78a2118ff70b28163f8bd4317f1ec xlib: Fix text performance regression from 1.0 to 1.2.0 (Vladimir Vukicevic) ---------------------------------------------------------------------------- Several people noticed that upgrading from cairo 1.0 to cairo 1.2.0 caused a significant performance regression when using the xlib backend. This performance regression was particularly noticeable when doing lots of text rendering and when using a high-latency connection to the X server, (such as a remote X server over an ssh connection). The slowdown was identified and fixed in 1.2.2. report: https://bugs.freedesktop.org/show_bug.cgi?id=7514 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=b7191885c88068dad57d68ced69a752d1162b12c PDF: Eliminate dependency on FreeType library dependency (Adrian Johnson) ------------------------------------------------------------------------- The cairo 1.2 series adds a supported pdf backend to cairo. In cairo 1.2.0 this backend required the freetype library, which was an undesirable dependency on systems such as win32, (cairo is designed to always prefer the "native" font system). As of cairo 1.2.2 the freetype library is not required to use the pdf backend on the win32 platform. report: https://bugs.freedesktop.org/show_bug.cgi?id=7538 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=a0989f427be87c60415963dd6822b3c5c3781691 PDF: Fix broken output on amd64 (Adrian Johnson) ------------------------------------------------ report: http://bugzilla.gnome.org/show_bug.cgi?id=349826 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=f4b12e497b7ac282b2f6831b8fb68deebc412e60 PS: Fix broken output for truetype fonts > 64k (Adrian Johnson) --------------------------------------------------------------- fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=067d97eb1793a6b0d0dddfbd0b54117844511a94 PDF: Fix so that dashing doesn't get stuck on (Kent Worsnop) ------------------------------------------------------------ Kent notices that with the PDF backend in cairo 1.2.0 as soon as a stroke was performed with dashing, all subsequent strokes would also be dashed. There was no way to turn dashing off again. fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=778c4730a86296bf0a71080cf7008d7291792256 Fix memory leaks in failure paths in gradient creation (Alfred Peng) -------------------------------------------------------------------- fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=db06681b487873788b51a6766894fc619eb8d8f2 Fix memory leak in _cairo_surface_show_glyphs (Chris Wilson) ------------------------------------------------------------ report: https://bugs.freedesktop.org/show_bug.cgi?id=7766 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e2fddcccb43d06486d3680a19cfdd5a54963fcbd Solaris: Add definition of cairo_private for some Sun compilers (Alfred Peng) ----------------------------------------------------------------------------- report: https://bugzilla.mozilla.org/show_bug.cgi?id=341874 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=04757a3aa8deeff3265719ebe01b021638990ec6 Solaris: Change version number of Sun's Xorg server with buggy repeat (Brian Cameron) ------------------------------------------------------------------------------------- report: https://bugs.freedesktop.org/show_bug.cgi?id=7483 fix: http://gitweb.freedesktop.org/?p=cairo;a=commit;h=e0ad1aa995bcec4246c0b8ab0d5a5a79871ce235 Various memory leak fixes ------------------------- Fix memory leak in _cairo_surface_show_glyphs (bug 7766) Fix file handle leak in failure path (bug 7616) Fix some memory leaks in the test cases. Fix some memory leaks in font subsetting code used in print backends. Documentation improvements (Behdad Esfahbod) -------------------------------------------- Added new documentation for several functions (cairo_show_page, cairo_copy_page, cairo_in_stroke, cairo_in_fill). Fixed some syntax errors that were preventing some existing documentation from being published. Fixed several minor typographical errors. Added an index for new symbols in 1.2. Release 1.2.0 (2006-06-27 Carl Worth ) ========================================================= This is the culmination of the work that has gone on within the 1.1 branch of cairo. There has been one API addition since the cairo 1.1.10 snapshot: cairo_xlib_surface_get_width cairo_xlib_surface_get_height There's also a new feature without any API change: Dots can now be drawn by using CAIRO_LINE_CAP_ROUND with degenerate sub-paths, (cairo_move_to() followed by either cairo_close_path() or a cairo_line_to() to the same location). And at least the following bugs have been fixed: 6759 fontconfig option AntiAlias doesn't work in cairo 1.1.2 6955 Some characters aren't displayed when using xlib (cache u... 7268 positive device_offset values don't work as source * PDF emit_glyph function needs to support bitmapped glyphs * PS emit_glyph function needs to support bitmapped glyphs * SVG emit_glyph function needs to support bitmapped glyphs * PDF: minefield page one is falling back unnecessarily * PS/PDF: Fix broken placement for vertical glyphs * PS: Fix to not draw BUTT-capped zero-length dash segments * Do device offset before float->fixed conversion http://bugzilla.gnome.org/show_bug.cgi?id=332266 * PS: Fix source surfaces with transformations * PS: Fix to not draw BUTT-capped degnerate sub-paths * PS: Don't walk off end of array when printing "~>" * Fix some memory leaks in the test suite rig * SVG: Fix memory leak when using cairo_mask * Fix EXTEND_REFLECT and EXTEND_PAD to not crash (though these are still not yet fully implemented for surface patterns). This has been a tremendous effort by everyone, and I'm proud to have been a part of it. Congratulations to all contributors to cairo! Snapshot 1.1.10 (2006-06-16 Carl Worth ) =========================================================== This is the fifth in a series of snapshots working toward the 1.2 release of cairo. The primary motivation for this snapshot is to fix a long-standing bug that had long been silent, but as of the 1.1.8 snapshot started causing crashes when run against 16-bit depth X servers, (often Xvnc or Xnest). The fix for this adds a new CAIRO_FORMAT_RGB16_565 to the API. This snapshot also includes a rewrite of cairo's SVG backend to eliminate the dependency on libxml2. With this in place, cairo 1.2 will not depend on any libraries that cairo 1.0 did not. As usual, there are also a few fixes for minor bugs. Snapshot 1.1.8 (2006-06-14 Carl Worth ) ========================================================== This is the fourth in a series of snapshots working toward the 1.2 release of cairo. At this point, all major features of the 1.2 release are in place, leaving just a few bug fixes left. In particular, there well be no additional API changes between this 1.1.8 snapshot and the 1.2 release. The announcement for 1.1.6 mentioned several API changes being considered. Only one of these changes was actually implemented (set_dpi -> fallback_resolution). This change does introduce one source-level incompatibility with respect to previous 1.1.x snapshots, so see below for details. Here is an abbreviated summary of changes since the 1.1.6 snapshot: ** API Change ** ---------------- According to the plan mentioned in the 1.1.6 notes, one source-level incompatible change has been implemented. The following three functions have been removed from cairo's API: cairo_pdf_surface_set_dpi cairo_ps_surface_set_dpi cairo_svg_surface_set_dpi and in their place the following function has been added: cairo_surface_set_fallback_resolution The signature and semantics of the function remains the same, so it is a simple matter of changing the name of the function when calling it. As a transition mechanism, this snapshot will (on many systems) build to include the old symbols so that code previously compiled will still run. However, all source code using the old names must be updated before it will compile. And the upcoming 1.2 release is not anticipated to include the old symbols. Finally, it should be pointed out that the old symbols never existed in the supported API of any stable release of cairo. (In the stable 1.0 releases the PDF, PS, and SVG backends were advertised as experimental and unstable.) And, as always, cairo continues to maintain source and binary compatibility between major releases. So applications compiled against supported backends in a stable release of cairo (1.0.4 say) will continue to compile and run without modification against new major releases (1.2.0 say) without modification. API additions ------------- The following new functions have been added to cairo's API: cairo_surface_get_content cairo_debug_reset_static_data cairo_image_surface_get_data cairo_image_surface_get_format cairo_image_surface_get_stride cairo_win32_font_face_create_for_hfont New, backend-specific pkg-config files -------------------------------------- In addition to the original cairo.pc file, cairo will also now install a pkg-config files for each configured backend, (for example cairo-pdf.pc, cairo-svg.pc, cairo-xlib.pc, cairo-win32.pc, etc.) this also includes optional font backends (such as cairo-ft.pc) and the optional png functionality (cairo-png.pc). These new pkg-config files should be very convenient for allowing cairo-using code to easily check for the existing of optional functionality in cairo without having to write complex rules to grub through cairo header files or the compiled library looking for symbols. Printing backend (PS, PDF, and SVG) ----------------------------------- Improving the quality of the "printing" backends has been a priority of the development between cairo 1.1.6 and cairo 1.1.8. The big improvement here is in the area of text output. Previously, at best, text was output as paths without taking advantage of any font support available in the output file format. Now, at the minimum text paths will be shared by using type3 fonts (for PS and PDF---and similarly, defs for SVG). Also, if possible, type3 and truetype fonts will be embedded in PostScript and PDF output. There are still some known bugs with this, (for example, selecting text in a cairo-generated PDF file with an embedded truetype font does not work). So there will be some more changes in this area before cairo 1.2, but do try test this feature out as it exists so far. Many thanks to Kristian Høgsberg for the truetype and type1 font embedding. win32 backend ------------- Performance improvements by preferring GDI over pixman rendering when possible. Fixes for text rendering. xlib backend ------------ Fix potentially big performance bug by making xlib's create_similar try harder to create a pixmap of a depth matching that of the screen. Bug fixes --------- Among various other fixes, the following bugs listed in bugzilla have been fixed: Bug 2488: Patch to fix pixman samping location bug (#2488). https://bugs.freedesktop.org/show_bug.cgi?id=2488 Bug 4196: undef MIN an MAX before defining to avoid duplicate definition https://bugs.freedesktop.org/show_bug.cgi?id=4196 Bug 4723: configure.in: Fix m4 quoting when examining pkg-config version https://bugs.freedesktop.org/show_bug.cgi?id=4723 Bug 4882: Flag Sun's X server has having buggy_repeat. https://bugs.freedesktop.org/show_bug.cgi?id=4882 Bug 5306: test/pdf2png: Add missing include of stdio.h https://bugs.freedesktop.org/show_bug.cgi?id=5306 Bug 7075: Fix make clean to remove cairo.def https://bugs.freedesktop.org/show_bug.cgi?id=7075 (Many thanks to Behdad Esfahbod for helping us track down and fix many of these.) Snapshot 1.1.6 (2006-05-04 Carl Worth ) ========================================================== This is the third in a series of snapshots working toward the imminent 1.2 release of cairo. For a list of items still needing work on the cairo 1.2 roadmap, please see: http://cairographics.org/ROADMAP As can be seen in that list, there are no longer any API additions left on the roadmap. Instead, there is a feature (PDF type 3 fonts) a performance optimization (X server gradients) and a list of bug fixes. This gives us a fair amount of freedom to cut the 1.2 release at almost any point by deciding to defer remaining bug fixes to subsequent maintenance releases such as 1.2.2 and 1.2.4. Before we will do that, we must first be wiling to commit to all the new API additions. As a heads-up, there are a couple of potential API changes being considered. (Note that these are changes to new API introduced during 1.1 so these will not introduce API incompatibilities compared to the stable 1.0 series). The changes being considered are: cairo_get_group_target: may acquire x and y offset return parameters. May also be eliminated in favor of cairo_get_target assuming its role cairo_pdf_surface_set_dpi: cairo_ps_surface_set_dpi: cairo_svg_surface_set_dpi: These functions may be removed in favor of a new cairo_surface_set_fallback_resolution Additionally there is the possibility of a slight change in the semantics of cairo_set_line_width. We believe the current behavior of the sequence: cairo_set_line_width; ... change CTM ...; cairo_stroke; is buggy. It is currently behaving the same as: ... change CTM ...; cairo_set_line_width; cairo_stroke; We are considering fixing this bug before 1.2 with the hope that nobody is already relying on the buggy behavior described here. Do shout if you suspect you might be in that position. The items included in this snapshot (since the 1.1.4 snapshot) are described below. API additions ------------- The long-awaited group-rendering support is now available with the following function calls: cairo_push_group cairo_push_group_with_content cairo_pop_group cairo_pop_group_to_source cairo_get_group_target This API provides a much more convenient mechanism for doing rendering to an intermediate surface without the need to manually create a temporary cairo_surface_t and a temporary cairo_t and clean them up afterwards. Add the following missing get function to complement cairo_surface_set_device_offset: cairo_surface_get_device_offset PDF backend (API addition) -------------------------- The PDF backend now provides for per-page size changes, (similar to what the PostScript backend got in the 1.1.4 snapshot). The new API is: cairo_pdf_surface_set_size Xlib backend (API additions) ---------------------------- The following functions have been added to allow the extraction of Xlib surface: cairo_xlib_surface_get_display cairo_xlib_surface_get_drawable cairo_xlib_surface_get_screen cairo_xlib_surface_get_visual cairo_xlib_surface_get_depth XCB backend (experimental) -------------------------- Update backend so that it now compiles with the recent XCB 0.9 release. Bug fixes and memory leak cleanup --------------------------------- Various little things, nothing too significant though. Snapshot 1.1.4 (2006-05-03 Carl Worth ) ========================================================== This is the second in a series of snapshots working toward the upcoming 1.2 release of cairo. For a list of items still needing work on the cairo 1.2 roadmap, please see: http://cairographics.org/ROADMAP The items included in this snapshot (since the 1.1.2 snapshot) are described below. PostScript backend: new printing-oriented API --------------------------------------------- We anticipate that with cairo 1.2, toolkits will begin to use cairo for printing on systems that use PostScript as the spool format. To support this use case, we have added 4 new function calls that are specific to the PostScript backend: cairo_ps_surface_set_size cairo_ps_surface_dsc_comment cairo_ps_surface_dsc_begin_setup cairo_ps_surface_dsc_begin_page_setup These functions allow variation of the page size/orientation from one page to the next in the PostScript output. They also allow the toolkit to provide per-document and per-page printer control options in a device-independent way, (for example, by using PPD options and emitting them as DSC comments into the PostScript output). This should allow toolkits to provide very fine-grained control of many options available in printers, (media size, media type, tray selection, etc.). SVG backend: builds by default, version control ----------------------------------------------- The SVG backend continues to see major improvements. It is expected that the SVG backend will be a supported backend in the 1.2 release. This backend will now be built by default if its dependencies (freetype and libxml2) are met. Additionally, the SVG backend now has flexibility with regard to what version of SVG it targets. It will target SVG 1.1 by default, which will require image fallbacks for some of the "fancier" cairo compositing operators. Or with the following new function calls: cairo_svg_surface_restrict_to_version cairo_svg_get_versions cairo_svg_version_to_string it can be made to target SVG 1.2 in which there is native support for these compositing operators. Bug fixes --------- At least the following bugs have been fixed since the 1.1.2 snapshot: crash at XRenderAddGlyphs https://bugs.freedesktop.org/show_bug.cgi?id=4705 Can't build cairo-1.1.2 on opensolaris due to " void function cannot return value" https://bugs.freedesktop.org/show_bug.cgi?id=6792 Missing out-of-memory check at gfx/cairo/cairo/src/cairo-atsui-font.c:185 https://bugzilla.mozilla.org/show_bug.cgi?id=336129 A couple of memory leaks. Snapshot 1.1.2 (2006-04-25 Carl Worth ) ========================================================== This is the first in a series of snapshots working toward the upcoming 1.2 release of cairo. (Subsequent snapshot will use successive even numbers for the third digit, 1.1.4, 1.1.6, etc.) This snapshot is backwards-compatible with the 1.0 series---it makes a few API additions but does not remove any API. PostScript and PDF backends are no longer "experimental" -------------------------------------------------------- The major theme of the 1.2 release is improved PostScript and PDF backends for cairo. Unlike the 1.0 series, in the 1.2 series these backends will not be marked as experimental and will be enabled by default. We encourage people to test this snapshot and the PS/PDF backends in particular as much as possible. The PostScript and PDF output is not yet ideal. * One major problem with the PostScript output is that image fallbacks are used more often than strictly necessary, and the image fallbacks are at a lower resolution than desired, (the cairo_ps_surface_set_dpi call is ignored). * The major drawback of the current PDF backend implementation is its text support. Every glyph is represented by a filled path in the PDF file. The causes file sizes to be much larger and rendering to be much slower than desired. It is anticipated that both of these shortcomings will see some improvements before the final 1.2 release. In spite of those shortcomings, we hope that the PS and PDF backends will yield faithful results for pretty much any cairo operations you can throw at them. Please let us know if you are getting obviously "different" results from the PS/PDF backends than from the image or xlib backends. Other new experimental backends ------------------------------- This snapshot includes three new backends that did not exist in the 1.0 series: * beos backend * directfb backend * svg backend These are all currently marked "experimental" and are disabled by default. But the SVG backend in particular has seen a lot of recent development and is very close to passing the entire cairo test suite. It is possible that this backend will become a fully supported backend by the time of the cairo 1.2 release. Public API additions -------------------- There have been a few new API functions added to cairo, including: New get_type functions for querying sub-types of object: cairo_surface_get_type cairo_pattern_get_type cairo_font_face_get_type cairo_scaled_font_get_type More convenience in working with cairo_scaled_font_t with new getter functions: cairo_scaled_font_get_font_face cairo_scaled_font_get_font_matrix cairo_scaled_font_get_ctm cairo_scaled_font_get_font_options As well as a convenience function for setting a scaled font into a cairo context: cairo_set_scaled_font and a function to allow text extents to be queried directly from a scaled font, (without requiring a cairo_surface_t or a cairo_t): cairo_scaled_font_text_extents These new scaled font functions were motivated by the needs of the pango library. Finally, a new path-construction function was added which clears the current point in preparation for a new sub path. This makes cairo_arc easier to use in some situations: cairo_new_sub_path Before the 1.2 release is final we do still plan a few more API additions specifically motivated by the needs of Mozilla/Firefox. Optimizations and bug fixes --------------------------- Shortly after the 1.0 maintenance series branched off the mainline there was a major rework of the cairo font internals. This should provide some good performance benefits, but it's also another area people should look at closely for potential regressions. There has not yet been any widespread, systematic optimization of cairo, but various performance improvements have been made, (and some of them are fairly significant). So if some things seem faster than 1.0 then things are good. If there are any performance regressions compared to 1.0 then there is a real problem and we would like to hear about that. There has been a huge number of bug fixes---too many to mention in detail. Again, things should be better, and never worse compared to 1.0. Please let us know if your testing shows otherwise. Release 1.0.2 (2005-10-03 Carl Worth ) ========================================================= For each bug number XXXX below, see: https://bugs.freedesktop.org/show_bug.cgi?id=XXXX for more details. General bug fixes ----------------- * 4408 - Add support for dashing of stroked curves (Carl Worth) * 4409 - Fix dashing so that each dash is capped on both ends (Carl Worth) * 4414 - Prevent SIGILL failures (proper use of -mmmx and -msse flags) (Sebastien Bacher, Billy Biggs) * 4299 - Fix crashes with text display in multi-threaded program (Alexey Shabalin, Carl Worth) * 4401 - Do not use sincos function since it is buggy on some platforms) (Tim Mooney, Carl Worth) * 4245 - Fix several bugs in the test suite exposed by amd64 systems (Seemant Kulleen, Carl Worth) * 4321 - Add missing byteswapping on GetImage/PutImage (Sjoerd Simons, Owen Taylor) * 4220 - Make the check for rectangular trapezoids simpler and more accurate (Richard Stellingwerff, Owen Taylor) * 4260 - Add missing channel-order swapping for antialised fonts (Barbie LeVile, Owen Taylor) * 4283 - Fix compilation failure with aggressive inlining (gcc -O3) (Marco Manfredini, Owen Taylor) * 4208 - Fix some warnings from sparse (Kjartan Maraas, Billy Biggs) * 4269 - Fix to not crash when compiled with -fomit-frame-pointer (Ronald Wahl, Owen Taylor) * 4263 - Improve performance for vertical gradients (Richard Stellingwerff, Owen Taylor) * 4231 * 4298 - Accomodate gentoo and Mandriva versions in X server vendor string check (Billy Biggs, Frederic Crozat, Owen Taylor) win32-specific fixes -------------------- * 4599 - Fix "missing wedges" on some stroked paths (win32) (Tim Rowley, Jonathan Watt, Bertram Felgenhauer, Carl Worth, Keith Packard) * 4612 - Fix disappearing text if first character out of surface (win32) (Tim Rowley) * 4602 - Fix shutdown of cairo from failing intermediate, size-0 bitmaps (win32) Aka. the "white rectangles" bug from mozilla-svg testing (Tim Rowley) * Various portability improvements for win32 (Hans Breuer, Owen Taylor, Carl Worth) * 4593 - Fix font sizes to match user expectations (win32) (Tor Lillqvist, Owen Taylor) * 3927 - Fix to report metrics of size 0 for glyph-not-available (win32) (Hans Breuer, Owen Taylor, Tor Lillqvist) * Add locking primitives for win32 (Hans Breuer) xlib-specific fixes ------------------- * Fix crash from size-0 pixmap due to empty clip region (xlib) (Radek Doulík, Carl Worth) Release 1.0.0 (2005-08-24 Carl Worth ) ========================================================= Experimental backends --------------------- * The Glitz, PS, PDF, Quartz, and XCB backends have been declared experimental, and are not part of the API guarantees that accompany this release. They are not built by default, even when the required libraries are available, and must be enabled explicitly with --enable-ps, --enable-pdf, --enable-quartz or --enable-xcb. It is very painful for us to be pushing out a major release without these backends enabled. There has been a tremendous amount of work put into each one and all are quite functional to some extent. However, each also has some limitations. And none of these backends have been tested to the level of completeness and correctness that we expect from cairo backends. We do encourage people to experiment with these backends and report success, failure, or means of improving them. Operator behavior ----------------- * Prior to 0.9.0 the SOURCE, CLEAR and a number of other operators behaved in an inconsistent and buggy fashion and could affect areas outside the clip mask. In 0.9.0, these six "unbounded" operators were fixed to consistently clear areas outside the shape but within the clip mask. This is useful behavior for an operator such as IN, but not what was expected for SOURCE and CLEAR. So, in this release the behavior of SOURCE and CLEAR has been changed again. They now affect areas only within both the source and shape. We can write the new operators as: SOURCE: dest' = (mask IN clip) ? source : dest CLEAR: dest' = (mask IN clip) ? 0 : dest Behavior and API changes ------------------------ * Setting the filter on a gradient pattern would change the interpolation between color stops away from the normal linear interpolation. This dubious behavior has been removed. * The CAIRO_CONTENT_VALID() and CAIRO_FORMAT_VALID() macros -- implementation details that leaked into cairo.h -- have been moved into an internal header. * The cairo_show_text function now advances the current point according to the total advance values of the string. API additions ------------- * cairo_set_dash can now detect error and can set CAIRO_STATUS_INVALID_DASH. Features -------- * When compiled against recent versions of fontconfig and FreeType, artificial bold fonts can now be turned on from fonts.conf using the FC_EMBOLDEN fontconfig key. Optimization ------------ * The compositing code from the 'xserver' code tree has now been completely merged into libpixman. This includes MMX optimization of common operations. * The image transformation code in libpixman has been improved and now performs significantly faster. Bug fixes --------- * Several crashes related to corruption in the font caches have been fixed. * All test cases now match pixel-for-pixel on x86 and PPC; this required fixing bugs in the compositing, stroking, and pattern rendering code. * Negative dash offsets have been fixed to work correctly. * The stroking of paths with mutiple subpaths has now been fixed to apply caps to all subpaths rather than just the last one. * Many build fixes for better portability on various systems. * Lots of other bug fixes, but we're too tired to describe them in more detail here. Release 0.9.2 (2005-08-13 Carl Worth ) ========================================================= Release numbering ----------------- * You will notice that this release jumped from 0.9.0 to 0.9.2. We've decided to use an odd micro version number (eg. 0.9.1) to indicate in-progress development between releases. As soon as 0.9.2 is tagged, the version will be incremented in CVS to 0.9.3 where it will stay until just before 0.9.4 is built, uploaded, and tagged. So, even-micro == a released version, odd-micro == something in-between. Libpixman dependency dropped ---------------------------- * As of this release, the dependency on an external libpixman has been dropped. Instead, the code from libpixman needed for cairo has been incorporated into the cairo source tree. The motivation for this change is that while cairo's API is stable and ready to be maintained after the 1.0 release, libpixman's API is not, so we do not want to expose it at this time. Also, the incorporation of libpixman into cairo also renames all previously-public libpixman symbols in order to avoid any conflict with a future release of libpixman API additions ------------- * Macros and functions have been added so that the version of cairo can be queried at either compile-time or at run-time. The version is made available as both a human-readable string and as a single integer: CAIRO_VERSION_STRING eg. "0.9.2" CAIRO_VERSION eg. 000902 const char* cairo_version_string (void); /* eg. "0.9.2" */ int cairo_version (void); /* eg. 000902 */ A macro is provided to convert a three-part component version into the encoded single-integer form: CAIRO_VERSION_ENCODE(X,Y,Z) For example, the CAIRO_VERSION value of 000902 is obtained as CAIRO_VERSION_ENCODE(0,9,2). The intent is to make version comparisons easy, either at compile-time: #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(0,9,2) ... #endif Or at run-time: if (cairo_version() >= CAIRO_VERSION_ENCODE(0,9,2)) { /* ... */ } Thread safety ------------- * This release adds pthread-based locking (when available) to make the caches used by cairo safe for threaded programs. Some may remember a failed experiment with this locking between the 0.5.1 and 0.5.2 snapshots, (where even single-threaded programs that linked with -lpthread would deadlock). We believe that that problem has been fixed, so we are looking forward to testing and reports from users with threaded applications. Bug fixes --------- * The XCB and Quartz backends failed to compiled in the 0.9.0 release due to minor syntax errors. These have now been fixed. * Various crashes in glitz and pixman due to size 0 glyphs have been fixed. Release 0.9.0 (2005-08-08 Carl Worth ) ========================================================= Soname change ------------- * In all prior snapshots, the libtool library versioning was set to 1:0:0. As this release is intended to mark the beginning of backwards-compatible releases, the versioning has been incremented to 2:0:0. You will notice that the numeric extension on the installed library filename will change similarly. This change will also require all cairo-using applications to be recompiled. We recognize that this may cause some frustration since this release is backwards-compatible with 0.6.0 and in that sense "shouldn't" require re-compilation. However, since all historical snapshots have used the same 1:0:0 version in spite of incompatible API changes between them, it was essential that the upcoming 1.0 release series have distinct library versioning. All future releases will use the library versioning to properly indicate compatibility between releases. So, any application re-compiled now to work with the 0.9.0 will not need to be recompiled when a compatible 1.0 release of cairo is made in the future. API additions ------------- * Add new function calls to set/get the current antialiasing mode in the graphics state: cairo_set_antialias cairo_get_antialias This call accepts the same modes recently added for font options (NONE or GRAY) but affects the rendering of geometry other than text. The intent of this call is to enable more precise control of which pixels are affected by each operation, for example to allow for full-scene antialiasing for seam-free rendering. It is not expected that non-antialiased rendering will perform better than anti-aliased rendering. * Three new functions were added to provide support for mixed cairo- and non-cairo drawing to the same surface: cairo_surface_mark_dirty cairo_surface_mark_dirty_rectangle cairo_surface_flush * The return type of the several "reference" functions was change, (API compatibly), from void to the same type as the argument. The affected functions are: cairo_font_face_reference cairo_scaled_font_reference cairo_pattern_reference cairo_surface_reference cairo_reference This allows a convenient way to assign and reference in a single statement. Semantic changes ---------------- * The behavior of cairo_set_source with a pattern with a non-identity matrix was previously not well-defined. The new behavior is as follows: The pattern's transformation matrix will be locked to the user space in effect at the time of cairo_set_source(). This means that further modifications of the CTM will not affect the source pattern. cairo-win32 ----------- * Some portability improvements, (eg. workaround for missing stdint.h). cairo-ft -------- * Updated to allow compilation with older versions of freetype. Bug fixes --------- * Fix the unbounded operators to actually produce a correct result, (previously the results were artificially restricted to the bounding box of whatever shape was being drawn rather than extending out infinitely). The fixed operators are: CAIRO_OPERATOR_CLEAR CAIRO_OPERATOR_SOURCE CAIRO_OPERATOR_OUT CAIRO_OPERATOR_IN CAIRO_OPERATOR_DEST_IN CAIRO_OPERATOR_DEST_ATOP * Fix cairo_mask and cairo_mask_surface to transform the mask by the current transformation matrix (CTM). * Fix cairo_set_source to lock the CTM used to transform the pattern. * Workaround for X server Render bug involving repeating patterns with a general transformation matrix. * cairo_get_font_face fixed to return a "nil" font face object rather than NULL on error. * cairo_set_font_face fixed to not crash if given a NULL font face, (which is the documented interface for restoring the default font face). * Fix xlib glyphset caching to not try to free a NULL glyph. Snapshot 0.6.0 (2005-07-28 Carl Worth ) ========================================================== API changes ----------- * The prototypes of the following functions have changed: cairo_xlib_surface_create_with_xrender_format cairo_xlib_surface_create_for_bitmap A Screen* parameter has been added to each. This allows the cairo xlib backend to work correctly with multi-head X servers. * The following function has been modified: cairo_scaled_font_create to accept a cairo_font_options_t*. See below fore more details. * All opaque, reference-counted cairo objects have now been moved to a standard error-handling scheme. The new objects to receive this treatment are cairo_font_face_t, cairo_scaled_font_t, and cairo_surface_t. (Previous snapshots already provided this scheme for cairo_t, cairo_path_t, and cairo_pattern_t.) This changes two functions to have a return type of void rather than cairo_status_t: cairo_scaled_font_extent cairo_surface_finish And significantly, none of the create functions for any of the objects listed above will return NULL. The pointer returned from any function will now always be a valid pointer and should always be passed to the corresponding destroy function when finished The simplest strategy for porting code is to switch from: object = cairo__create (); if (object == NULL) goto BAILOUT; /* act on object */ cairo__destroy (object); to: object = cairo__create (); if (cairo__status (object)) goto BAILOUT; /* act on object */ cairo__destroy (object); But significantly, it is not required to check for an error status before the "act on object" portions of the code above. All operations on an object with an error status are, by definition, no-ops without side effect. So new code might be written in an easier-to-read style of: object = cairo__create (); /* act on object */ cairo__destroy (object); with cairo__status checks placed only at strategic locations. For example, passing an error object to another object, (eg. cairo_set_source with an in-error pattern), will propagate the error to the subsequent object (eg. the cairo_t). This means that error checking can often be deferred even beyond the destruction of a temporary object. API additions ------------- * New functions for checking the status of objects that have been switched to the common error-handling scheme: cairo_font_face_status cairo_scaled_font_status cairo_surface_status * The _cairo_error function which was added in 0.5.1 has now been made much more useful. In 0.5.1 only errors on cairo_t objects passed through _cairo_error. Now, an error on any object should pass through _cairo_error making it much more reliable as a debugging mechanism for finding when an error first occurs. * Added new font options support with a myriad of functions: cairo_font_options_create cairo_font_options_copy cairo_font_options_destroy cairo_font_options_status cairo_font_options_merge cairo_font_options_equal cairo_font_options_hash cairo_font_options_set_antialias cairo_font_options_get_antialias cairo_font_options_set_subpixel_order cairo_font_options_get_subpixel_order cairo_font_options_set_hint_style cairo_font_options_get_hint_style cairo_font_options_set_hint_metrics cairo_font_options_get_hint_metrics cairo_surface_get_font_options cairo_ft_font_options_substitute cairo_set_font_options cairo_get_font_options This new font options support allows the application to have much more fine-grained control over how fonts are rendered. Significantly, it also allows surface backends to have some influence over the process. For example, the xlib backend now queries existing Xft properties to set font option defaults. * New function: cairo_xlib_surface_set_drawable which allows the target drawable for an xlib cairo_surface_t to be changed to another with the same format, screen, and display. This is necessary in certain double-buffering techniques. New features ------------ * Sub-pixel text antialiasing is now supported. Bug fixes --------- * Fixed assertion failure in cairo_surface_create_similar when application commits an error by passing a cairo_format_t rather than a cairo_content_t. * Avoid division by zero in various places (cairo-ft). * Fix infinite loop when using non-default visuals (cairo-xlib). * Eliminate segfault in cairo_image_surface_create_from_png_stream. * Prevent errant sign-extension of masks on 64-bit architectures (cairo-xlib and cairo-xcb). * Other miscellaneous fixes. Snapshot 0.5.2 (2005-07-18 Carl Worth ) ========================================================== API changes ----------- * New functions for creating patterns of a single color: cairo_pattern_create_rgb cairo_pattern_create_rgba * Change cairo_surface_create_similar to accept a new type of cairo_content_t rather than cairo_format_t: typedef enum _cairo_content { CAIRO_CONTENT_COLOR = 0x1000, CAIRO_CONTENT_ALPHA = 0x2000, CAIRO_CONTENT_COLOR_ALPHA = 0x3000 } cairo_content_t; * Add new CAIRO_FORMAT_VALID and CAIRO_CONTENT_VALID macros. * Remove unused status value: CAIRO_STATUS_NO_TARGET_SURFACE * Add new status values: CAIRO_STATUS_INVALID_STATUS * Require libpixman >= 0.1.5 (for necessary bug fixes) Bug fixes --------- * Fix cairo_surface_write_to_png for RGB24 images. * Fix broken metrics and rendering for bitmap fonts. Add mostly useless bitmap glyph transformation. * Fix glyph caches to not eject entries that might be immediately needed, (fixing intermittent crashes when rendering text). * Fix all memory leaks found by running "make check-valgrind". ATSUI backend changes --------------------- * Allow building against < 10.3 SDK. * Prevent crash on empty strings. Glitz backend changes --------------------- * Require glitz >= 0.4.4. * Use frame buffer objects instead of pbuffers for accelerated offscreen drawing. * Minor improvement to gradient pattern creation. PostScript backend fixes ------------------------ * Rewrite of the PS backend to generate more interesting output that the old big-image implementation. Win32 backend fixes ------------------- * Implement glyph path support. * Fix swap of blue and green values in the fill_rectangles path. Xlib backend fixes ------------------ * Add optimization to use XCopyArea rather than XRenderComposite when transforming only with an integer translation, and using SOURCE operator or OVER with a source pattern without alpha. Snapshot 0.5.1 (2005-06-20 Carl Worth ) ========================================================== API changes ----------- * Removed cairo_status_string(cairo_t*) and add cairo_status_to_string(cairo_status_t) in its place. Code using cairo_status_string can be ported forward as follows: cairo_status (cr); -> cairo_status_to_string (cairo_status (cr)); * Removed the BAD_NESTING restriction which means that two different cairo_t objects can now interleave drawing to the same cairo_surface_t without causing an error. * The following functions which previously had a return type of cairo_status_t now have a return type of void: cairo_pattern_add_color_stop_rgba cairo_pattern_set_matrix cairo_pattern_get_matrix cairo_pattern_set_extend cairo_pattern_set_filter See discussion of cairo_pattern_status below for more details. API additions ------------- * Improved error handling: cairo_status_t cairo_pattern_status (cairo_pattern_t *pattern); This snapshot expands the status-based error handling scheme from cairo_t to cairo_path_t and cairo_pattern_t. It also expands the scheme so that object-creating functions, (cairo_create, cairo_pattern_create_*, cairo_copy_path_*), are now guaranteed to not return NULL. Instead, in the case of out-of-memory these functions will return a static object with status==CAIRO_STATUS_NO_MEMORY. The status can be checked with the functions cairo_status and cairo_pattern_status, or by direct inspection of the new status field in cairo_path_t. Please note that some objects, including cairo_surface_t and all of the font-related objects have not been converted to this error-handling scheme. * In addition to the above changes, a new private function has been added: _cairo_error This function can be used to set a breakpoint in a debugger to make it easier to find programming error in cairo-using code. (Currently, _cairo_error is called when any error is detected within a cairo_t context, but is not called for non-cairo_t errors such as for cairo_path_t and cairo_pattern_t). * Fixed cairo_path_data_t so that its enum is visible to C++ code, (as cairo_path_data_type_t). Performance improvements ------------------------ * Made a minor performance improvement for clipping, (restrict clip surface to the new intersected bounds). * Optimize rendering of a solid source pattern with a pixel-aligned rectangular path to use backend clipping rather than rasterization and backend compositing. * Optimize cairo_paint_with_alpha to defer to cairo_paint when alpha is 1.0. Bug fixes --------- * Fixed memory leak in cairo_copy_path. * A build fix for non-srcdir builds. PDF backend fixes ----------------- * New support for path-based clipping. * Fix for text rotated to angles other than multiples of Ï€/2. Win32 backend fixes ------------------- * Fix for text extents. Xlib backend ------------ * Implemented a complex workaround for X server bug[*] related to Render-based compositing with untransformed, repeating source pictures. The workaround uses core Xlib when possible for performance, (ie. with CAIRO_OPERATOR_SOURCE or CAIRO_OPERATOR_OVER with an opaque source surface), and falls back to the pixman image-based compositing otherwise. [*] https://bugs.freedesktop.org/show_bug.cgi?id=3566 * Various bug fixes, particularly in the fallback paths. Snapshot 0.5.0 (2005-05-17 Carl Worth ) ========================================================== This is a pretty big, and fairly significant snapshot. It represents between 2 and 3 months of solid work from a lot of people on improving the API as much as possible. I'd like to express my appreciation and congratulations to everyone who has worked on the big API Shakeup, (whether in email battles over names, or fixing my silly bugs). This snapshot will require some effort on the part of users, since there are a _lot_ of API changes (ie. no cairo program ever written is safe --- they're all broken now in at least one way). But, in spite of that, we do encourage everyone to move their code to this snapshot as soon as possible. And we're doing everything we can think of to make the transition as smooth as possible. The idea behind 0.5 is that we've tried to make every good API change we could want now, and get them all done with. That is, between now and the 1.0 release of cairo, we expect very few new API changes, (though some will certainly sneak in). We will have some significant additions, but the pain of moving code from cairo 0.4 to cairo 0.5 should be a one time experience, and things should be much smoother as we continue to move toward cairo 1.0. And with so many changes coming out for the first time in this 0.5 release, we really do need a lot of people trying this out to make sure the ideas are solid before we freeze the API in preparation for the 1.0 release. OK, enough introduction. Here is a (not-quite-complete) description of the API removals, changes and additions in this snapshot, (compared to 0.4.0) API removals ============ The following public functions have been removed: - cairo_set_target_* This is a big change. See the description of cairo_create in the API changes section for how to deal with this. - cairo_set_alpha Alpha blending hasn't gone away; there's just a much more unified rendering model now. Almost all uses of cairo_set_alpha will be trivially replaced with cairo_set_source_rgba and a few others will be replaced just as easily with cairo_paint_with_alpha. - cairo_show_surface Another useful function that we realized was muddling up the rendering model. The replacement is quite easy: cairo_set_source_surface and cairo_paint. - cairo_matrix_create - cairo_matrix_destroy - cairo_matrix_copy - cairo_matrix_get_affine These functions supported an opaque cairo_matrix_t. We now have an exposed cairo_matrix_t structure, so these can be dropped. - cairo_surface_set_repeat - cairo_surface_set_matrix - cairo_surface_set_filter These properties don't belong on surfaces. If you were using them, you'll just want to instead use cairo_pattern_create_for_surface and then set these properties on the pattern. - cairo_copy This was a confusing function and hopefully nobody will miss it. But if you really don't find cairo_save/restore adequate, let us know and we have another idea for a potential replacement. And while we're on the subject of removals, we carefully tightened up the cairo header files so they no longer gratuitously include header files that are not strictly necessary, (stdio.h, stdint.h, pixman.h, Xrender.h, etc. and their dependencies). This may lead to some surprising errors, so keep your eyes open for that. API changes =========== Here are some of the API changes that have occurred: ~ cairo_create(void) -> cairo_create(cairo_surface_t *) This is the big change that breaks every program. The ability to re-target a cairo_t was not particularly useful, but it did introduce a lot of muddy semantic questions. To eliminate that, cairo_create now requires its target surface to be passed in at creation time. This isn't too hard to cope with as the typical first operation after cairo_create was often cairo_set_target_foo. So the order of those two swap and the application instead has cairo_foo_surface_create, then cairo_create. ~ cairo_current_* -> cairo_get_* We had a strange mixture of cairo_get and cairo_current functions. They've all been standardized on cairo_get, (though note one is cairo_get_current_point). ~ CAIRO_OPERATOR_SRC -> CAIRO_OPERATOR_SOURCE ~ CAIRO_OPERATOR_OVER_REVERSE -> CAIRO_OPERATOR_DEST_OVER Many of the cairo_operator_t symbolic values were renamed to reduce the amount of abbreviation. The confusing "OP_REVERSE" naming was also changed to use "DEST_OP" instead which is easier to read and has wider acceptance in other libraries/languages. ~ cairo_set_pattern -> cairo_set_source ~ cairo_set_rgb_color -> cairo_set_source_rgb All of the various functions that changed the source color/pattern were unified to use cairo_set_source names to make the relation more clear. ~ cairo_transform_point -> cairo_user_to_device ~ cairo_transform_distance -> cairo_user_to_device_distance ~ cairo_inverse_transform_point -> cairo_device_to_user ~ cairo_inverse_transform_distance -> cairo_device_to_user_distance These names just seemed a lot more clear. ~ cairo_init_clip -> cairo_reset_clip ~ cairo_concat_matrix -> cairo_transform More abbreviation elimination ~ cairo_current_path -> cairo_copy_path ~ cairo_current_path_flat -> cairo_copy_path_flat The former mechanism for examining the current path was a function that required 3 or 4 callbacks. This was more complexity than warranted in most situations. The new cairo_copy_path function copies the current path into an exposed data structure, and the documentation provides a convenient idiom for navigating the path data. API additions ------------- + cairo_paint A generalized version of the painting operators cairo_stroke and cairo_fill. The cairo_paint call applies the source paint everywhere within the current clip region. Very useful for clearing a surface to a solid color, or painting an image, (see cairo_set_source_surface). + cairo_paint_with_alpha Like cairo_paint but applying some alpha to the source, (making the source paint translucent, eg. to blend an image on top of another). + cairo_mask A more generalized version of cairo_paint_with_alpha which allows a pattern to specify the amount of translucence at each point rather than using a constant value everywhere. + cairo_mask_surface A convenience function on cairo_mask for when the mask pattern is already contained within a surface. + cairo_surface_set_user_data + cairo_surface_get_user_data + cairo_font_face_set_user_data + cairo_font_face_get_user_data Associate arbitrary data with a surface or font face for later retrieval. Get notified when a surface or font face object is destroyed. + cairo_surface_finish Allows the user to instruct cairo to finish all of its operations for a given surface. This provides a safe point for doing things such as flushing and closing files that the surface may have had open for writing. + cairo_fill_preserve + cairo_stroke_preserve + cairo_clip_preserve One interesting change in cairo is that the path is no longer part of the graphics state managed by cairo_save/restore. This allows functions to construct paths without interfering with the graphics state. But it prevents the traditional idiom for fill-and-stroke: cairo_save; cairo_fill; cairo_restore; cairo_stroke Instead we know have alternate versions cairo cairo_fill, cairo_stroke, and cairo_clip that preserve the current path rather than consuming it. So the idiom now becomes simply: cairo_fill_preserve; cairo_stroke + cairo_surface_write_to_png + cairo_surface_write_to_png_stream In place of a single PNG backend, now a surface created through any backend (except PDF currently) can be written out to a PNG image. + cairo_image_surface_create_from_png + cairo_image_surface_create_from_png_stream And its just as easy to load a PNG image into a surface as well. + cairo_append_path With the new, exposed path data structure, it's now possible to append bulk path data to the current path, (rather than issuing a long sequence of cairo_move_to/line_to/curve_to function calls). Xlib and XCB backends --------------------- Any cairo_format_t and Colormap arguments have been dropped from cairo_xlib_surface_create. There are also two new cairo_xlib|xcb_surface_create functions: cairo_xlib|xcb_surface_create_for_bitmap (Particular for creating A1 surfaces) cairo_xlib|xcb_surface_create_with_xrender_format (For any other surface types, not described by a Visual*) All of these surface create functions now accept width and height. In addition, there are new cairo_xlib|xcb_surface_set_size functions which must be called each time a window that is underlying a surface changes size. Print backends (PS and PDF) --------------------------- The old FILE* based interfaces have been eliminated. In their place we have two different functions. One accepts a simple const char *filename. The other is a more general function which accepts a callback write function and a void* closure. This should allow the flexibility needed to hook up with various stream object in many languages. In addition, when specifying the surface size during construction, the units are now device-space units (ie. points) rather than inches. This provides consistency with all the other surface types and also makes it much easier to reason about the size of the surface when drawing to it with the default identity matrix. Finally, the DPI parameters, which are only needed to control the quality of fallbacks, have been made optional. Nothing is required during surface_create (300 DPI is assumed) and cairo_ps|pdf_surface_set_dpi can be used to set alternate values if needed. Font system ----------- Owen very graciously listened to feedback after the big font rework he had done for 0.4, and came up with way to improve it even more. In 0.4 there was a cairo_font_t that was always pre-scaled. Now, there is an unscaled cairo_font_face_t which is easier to construct, (eg. no scaling matrix required) and work with, (it can be scaled and transformed after being set on the graphics state). And the font size manipulation functions are much easier. You can set an explicit size and read/modify/write the font matrix with: cairo_set_font_size cairo_get_font_matrix cairo_set_font_matrix (Previously you could only multiply in a scale factor or a matrix.) A pleasant side effect is that we can (and do) now have a default font size that is reasonable, as opposed to the old default height of one device-space unit which was useless until scaled. Of course, the old pre-scaled font had allowed some performance benefits when getting many metrics for a font. Those benefits are still made available through the new cairo_scaled_font_t. And a cairo_font_face_t can be "promoted" to a cairo_scaled_font_t by suppling a font_matrix and the desired CTM. Quartz backend -------------- Tim Rowley put in the work to bring the Quartz backend back after it had been disabled in the 0.4.0 snapshot. He was not able to bring back the function that allows one to create a cairo_font_t from an ATSUI style: cairo_font_t * cairo_atsui_font_create (ATSUStyle style); because he didn't have a test case for it. If you care about this function, please provide a fairly minimal test and we'll try to bring it back in an upcoming snapshot. Snapshot 0.4.0 (2005-03-08 Carl Worth ) ========================================================== New documentation ----------------- Owen Taylor has converted cairo's documentation system to gtk-doc and has begun some long-needed work on the documentation, which can now be viewed online here: http://cairographics.org/manual/ New backend: win32 ------------------ This is the first snapshot to include a functional win32 backend, (thanks to Owen Taylor). The interface is as follows: #include void cairo_set_target_win32 (cairo_t *cr, HDC hdc); cairo_surface_t * cairo_win32_surface_create (HDC hdc); cairo_font_t * cairo_win32_font_create_for_logfontw (LOGFONTW *logfont, cairo_matrix_t *scale); cairo_status_t cairo_win32_font_select_font (cairo_font_t *font, HDC hdc); void cairo_win32_font_done_font (cairo_font_t *font); double cairo_win32_font_get_scale_factor (cairo_font_t *font); And see also the documentation at: http://cairographics.org/manual/cairo-Microsoft-Windows-Backend.html Disabled backend: quartz ------------------------ Unfortunately, the quartz backend code is currently out of date with respect to some recent backend interface changes. So, the quartz backend is disabled in this snapshot. If the quartz backend is brought up-to-date before the next snapshot, we would be glad to make a 0.4.1 snapshot that re-enables it, (we do not expect many more big backend interface changes). API Changes ----------- The font system has been revamped, (as Owen Taylor's work with integrating pango and cairo gave us the first serious usage of the non-toy font API). One fundamental, user-visible change is that the cairo_font_t object now represents a font that is scaled to a particular device resolution. Further changes are described below. cairo.h ------- Removed cairo_font_set_transform and cairo_font_current_transform. Added cairo_font_extents and cairo_font_glyph_extents. See documentation for details: http://cairographics.org/manual/cairo-cairo-t.html#cairo-font-extents cairo-ft.h ---------- The cairo_ft_font API changed considerably. Please see the documentation for details: http://cairographics.org/manual/cairo-FreeType-Fonts.html Performance ----------- Make the fast-path clipping (pixel-aligned rectangles) faster. Add optimization for applying a constant alpha to a pattern. Optimize gradients that are horizontal or vertical in device space. Xlib: When RENDER is not available, use image surfaces for intermediate surfaces rather than xlib surfaces. Backend-specific changes ------------------------ Glitz ----- Major update to glitz backend. The output quality should now be just as good as the image and xlib backends. Track changes to glitz 0.4.0. PDF --- Various improvements to produce more conformant output. Internals --------- David Reveman contributed a large re-work of the cairo_pattern_t implementation, providing cleaner code and more optimization opportunities. Backend interface changes ------------------------- Rework backend interface to accept patterns, not surfaces for source and mask. Remove set_matrix, set_filter, and set_repeat functions. More sophisticated backend interface for image fallbacks, ({acquire,release}_{source,dest}_image() and clone_similar). Bug fixes --------- Only install header files for backends that have been compiled. Fixed some rounding errors leading to incorrectly placed glyphs. Many other minor fixes. Snapshot 0.3.0 (2005-01-21 Carl Worth ) ========================================================== Major API changes ----------------- 1) The public header files will no longer be directly installed into the system include directory. They will now be installed in a subdirectory named "cairo", (eg. in /usr/include/cairo rather than in /usr/include). As always, the easiest way for applications to discover the location of the header file is to let pkg-config generate the necessary -I CFLAGS and -L/-l LDFLAGS. For example: cc `pkg-config --cflags --libs cairo` -o foo foo.c IMPORTANT: Users with old versions of cairo installed will need to manually remove cairo.h and cairo-features.h from the system include directories in order to prevent the old headers from being used in preference to the new ones. 2) The backend-specific portions of the old monolithic cairo.h have been split out into individual public header files. The new files are: cairo-atsui.h cairo-ft.h cairo-glitz.h cairo-pdf.h cairo-png.h cairo-ps.h cairo-quartz.h cairo-xcb.h cairo-xlib.h Applications will need to be modified to explicitly include the new header files where appropriate. 3) There are two new graphics backends in this snapshot, a PDF backend, and a Quartz backend. There is also one new font backend, ATSUI. PDF backend ----------- Kristian Høgsberg has contributed a new backend to allow cairo-based applications to generate PDF output. The interface for creating a PDF surface is similar to that of the PS backend, as can be seen in cairo-pdf.h: void cairo_set_target_pdf (cairo_t *cr, FILE *file, double width_inches, double height_inches, double x_pixels_per_inch, double y_pixels_per_inch); cairo_surface_t * cairo_pdf_surface_create (FILE *file, double width_inches, double height_inches, double x_pixels_per_inch, double y_pixels_per_inch); Once a PDF surface has been created, applications can draw to it as any other cairo surface. This code is still a bit rough around the edges, and does not yet support clipping, surface patterns, or transparent gradients. Text only works with TrueType fonts at this point and only black text is supported. Also, the size of the generated PDF files is currently quite big. Kristian is still actively developing this backend, so watch this space for future progress. Quartz backend -------------- Calum Robinson has contributed a new backend to allow cairo applications to target native Mac OS X windows through the Quartz API. Geoff Norton integrated this backend into the current configure-based build system, while Calum also provided Xcode build support in the separate "macosx" module available in CVS. The new interface, available in cairo-quartz.h, is as follows: void cairo_set_target_quartz_context (cairo_t *cr, CGContextRef context, int width, int height); cairo_surface_t * cairo_quartz_surface_create (CGContextRef context, int width, int height); There is an example program available in CVS in cairo-demo/quartz. It is a port of Keith Packard's fdclock program originally written for the xlib backend. A screenshot of this program running on Mac OS X is available here: http://cairographics.org/~cworth/images/fdclock-quartz.png ATSUI font backend ------------------ This new font backend complements the Quartz backend by allowing applications to use native font selection on Mac OS X. The interface is a single new function: cairo_font_t * cairo_atsui_font_create (ATSUStyle style); Minor API changes ----------------- Prototype for non-existent function "cairo_ft_font_destroy" removed. Now depends on libpixman 0.1.2 or newer, (0.1.3 is being released concurrently and has some useful performance improvements). Default paint color is now opaque black, (was opaque white). Default background color is transparent (as before). Renamed "struct cairo" to "struct _cairo" to free up the word "cairo" from the C++ identifier name space. Functions returning multiple return values through provided pointers, (cairo_matrix_get_affine, cairo_current_point, and cairo_current_color_rgb), will now accept NULL for values the user wants to ignore. CAIRO_HAS_FREETYPE_FONT has now been renamed to CAIRO_HAS_FT_FONT. Performance improvements ------------------------ Alexander Larsson provided some fantastic performance improvements yielding a 10000% performance improvement in his application, (when also including his performance work in libpixman-0.1.3). These include * Fixed handling of cache misses. * Creating intermediate clip surfaces at the minimal size required. * Eliminating roundtrips when creating intermediate Xlib surfaces. Implementation -------------- Major re-work of font metrics system by Keith Packard. Font metrics should now be much more reliable. Glitz backend ------------- Updated for glitz-0.3.0. Bug fixes in reference counting. Test suite ---------- New tests for cache crashing, rotating text, improper filling of complex polygons, and leaky rasterization. Bug fixes --------- Fixed assertion failure when selecting the same font multiple times in sequence. Fixed reference counting so cache_destroy functions work. Remove unintended copyright statement from files generated with PostScript backend. Fixed to eliminate new warnings from gcc 3.4 and gcc 4. Snapshot 0.2.0 (2004-10-27 Carl Worth ) =========================================================== New license: LGPL/MPL --------------------- The most significant news with this release is that the license of cairo has changed. It is now dual-licensed under the LGPL and the MPL. For details see the COPYING file as well as COPYING-LGPL-2.1 and COPYING-MPL-1.1. I express my thanks to everyone involved in the license change process for their patience and support! New font and glyph internals ---------------------------- Graydon Hoare has put a tremendous amount of work into new internals for handling fonts and glyphs, including caches where appropriate. This work has no impact on the user-level API, but should result in great performance improvements for applications using text. New test suite -------------- This snapshot of cairo includes a (small) test suite in cairo/test. The tests can be run with "make check". The test suite was designed to make it very easy to add new tests, and we hope to see many contributions here. As you find bugs, please try adding a minimal test case to the suite, and submit it with the bug report to the cairo@cairographics.org mailing list. This will make it much easier for us to track progress in fixing bugs. New name for glitz backend -------------------------- The gl backend has now been renamed to the glitz backend. This means that the following names have changed: CAIRO_HAS_GL_SURFACE -> CAIRO_HAS_GLITZ_SURFACE cairo_set_target_gl -> cairo_set_target_glitz cairo_gl_surface_create -> cairo_glitz_surface_create This change obviously breaks backwards compatibility for applications using the old gl backend. Up-to-date with latest glitz snapshots -------------------------------------- This snapshot of cairo is now up to date with the latest glitz snapshot, (currently 0.2.3). We know that the latest cairo and glitz snapshots have been incompatible for a very long time. We've finally fixed that now and we're determined to not let that happen again. Revert some tessellation regression bugs ---------------------------------------- People that have been seeing some tessellation bugs, (eg. leaked fills), in the CVS version of cairo may have better luck with this release. A change since the last snapshot was identified to trigger some of these bugs and was reverted before making the snapshot. The behavior should be the same as the previous (0.1.23) snapshot. Miscellaneous changes --------------------- Changed CAIRO_FILTER_DEFAULT to CAIRO_FILTER_BEST to make gradients easier. Track XCB API change regarding iterators. Various bug fixes ----------------- Fix calculation of required number of vertices for pen. Fix to avoid zero-dimensioned pixmaps. Fix broken sort of pen vertices. Fix bug when cairo_show_text called with a NULL string. Fix clipping bugs. Fix bug in computing image length with XCB. Fix infinite loop bug in cairo_arc. Fix memory management interactions with libpixman. Snapshot 0.1.23 (2004-05-11 Carl Worth ) ======================================================== Fixes for gcc 3.4 ----------------- Fix prototype mismatches so that cairo can be built by gcc 3.4. Updates to track glitz ---------------------- Various fixes to support the latest glitz snapshot (0.1.2). Gradient updates ---------------- Radial gradients now support both inner and outer circles. Transformed linear gradients are now properly handled. Fixes for extend type reflect. Glitz updates ------------- Converted shading routines to use fixed point values and introduced a shading operator structure for more efficient shading calculations. Support compositing with mask surface when mask is solid or multi-texturing is available. PNG backend cleanups -------------------- Fix output to properly compensate for pre-multiplied alpha format in cairo. Add support for A8 and A1 image formats. Bug fixes --------- Avoid crash or infinite loop on null strings and degeneratively short splines. New? bugs in cairo_clip ----------------------- There are some fairly serious bugs in cairo_clip. It is sometimes causing an incorrect result. And even when it does work, it is sometimes so slow as to be unusable. Some of these bugs may not be new, (indeed cairo_clip has only ever had a braindead-slow implementation), but I think they're worth mentioning here. Snapshot 0.1.22 (2004-04-16 Carl Worth ) ======================================================== Cairo was updated to track the changes in libpixman, and now depends on libpixman version 0.1.1. Snapshot 0.1.21 (2004-04-09 David Reveman ) ============================================================= New OpenGL backend ------------------ The OpenGL backend provides hardware accelerated output for X11 and OS X. The significant new functions are: cairo_set_target_gl cairo_gl_surface_create Automatic detection of available backends ----------------------------------------- The configure script now automatically detect what backends are available, (use ./configure --disable-`backend' to prevent compilation of specific backends). Snapshot 0.1.20 (2004-04-06 Carl Worth ) ======================================================== New pattern API --------------- David Reveman has contributed a new pattern API which enable linear and radial gradient patterns in addition to the original surface-based patterns. The significant new top-level functions are: cairo_pattern_create_linear cairo_pattern_create_radial cairo_pattern_create_for_surface cairo_pattern_add_color_stop cairo_set_pattern Any code using the old cairo_set_pattern, (which accepted a cairo_surface_t rather than a cairo_pattern_t), will need to be updated. Update to XCB backend --------------------- The XCB backend is now enabled by default, (use ./configure --disable-xcb to turn it off). Faster clipping --------------- Graydon Hoare has added optimizations that make cairo_clip much faster when the path is a pixel-aligned, rectangular region. Bug fixes. Snapshot 0.1.19 (2004-02-24 Carl Worth ) ======================================================== New PNG backend --------------- Olivier Andrieu contributed a new PNG backend. It builds on the existing image backend to make it easy to render "directly" to a .png file. The user never needs to deal with the actual image buffer. The significant new functions are: cairo_set_target_png cairo_png_surface_create The PNG backend is not enabled by default so that by default there is not a new dependency on libpng. Use ./configure --enable-png to enable this backend. Snapshot 0.1.18 (2004-02-17 Carl Worth ) ======================================================== Path query functionality ------------------------ It's now possible to query the current path. The two new functions are: cairo_current_path cairo_current_path_flat Each function accepts a number of callback functions that will be called for each element in the path (move_to, line_to, curve_to, close_path). The cairo_current_path_flat function does not accept a curve_to callback. Instead, all curved portions of the path will be converted to line segments, (within the current tolerance value). This can be handy for doing things like text-on-path without having to manually interpolate Bézier splines. New XCB backend --------------- Jamey Sharp has contributed a second X backend that uses the new, lean XCB library rather than Xlib. It cannot currently be compiled at the same time as the Xlib backend. See ./configure --enable-xcb. Build fixes for cygwin. Bug fixes. Snapshot 0.1.17 (2003-12-16 Carl Worth ) ======================================================== Better text support ------------------- This snapshot provides much better text support by implementing the following four functions: cairo_text_extents cairo_glyph_extents cairo_text_path cairo_glyph_path The text/glyph_extents functions can be used to determine the bounding box (and advance) for text as if drawn by show_text/glyphs. The text/glyph_path objects functions place text shapes on the current path, where they can be subsequently manipulated. For example, following these functions with cairo_stroke allows outline text to be drawn. Calling cairo_clip allows clipping to a text-shaped region. Combined dependencies --------------------- The cairo core now depends only on the libpixman library. This single library replaces the three previous libraries libic, libpixregion, and slim. Thanks to Dave Beckett for all of the heavy lifting with this renaming effort. Conditional compilation of backends ----------------------------------- Cairo now allows optional backends to be disabled at compile time. The following options may now be passed to the configure script: --disable-xlib --disable-ps Note that the first option is a change from the old --without-x option which will no longer have any effect. OS X supported - several byte-order issues resolved --------------------------------------------------- Cairo has now been successfully compiled under OS X. Testing revealed that there were some byte-order problems in the PostScript backend and the PNG generation in the demos. These have now been resolved. 2003-10 ======= Graydon Hoare implemented the first real text support using Freetype/fontconfig, (previous versions of cairo used Xft and could only draw text when using an X backend). 2003-09 ======= Graydon Hoare added the first real support for running cairo with a non-render-aware X server. Jamey Sharp virtualized the backend font and surface interfaces in September, 2003. 2003-06 ======= Xr is renamed cairo to avoid confusion since it no longer had a strict dependence on X. 2003-05 ======= A new image surface backend is added to Xr. Keith Packard wrote the image compositing code in libic that is used for the image_surface backend. This code was originally written as the software fallback for the render extension within the X server. 2002-06 ======= Carl Worth wrote the first lines of Xr, after Keith Packard proposed the plan for a stateful drawing library in C providing a PostScript-like rendering model. LocalWords: mutex BeOS extraordinaire libgdiplus-2.11/cairo/src/0000775000175000017500000000000012225470635012470 500000000000000libgdiplus-2.11/cairo/src/test-fallback-surface.h0000664000175000017500000000335312225470167016727 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #ifndef TEST_FALLBACK_SURFACE_H #define TEST_FALLBACK_SURFACE_H #include "cairo.h" CAIRO_BEGIN_DECLS cairo_surface_t * _cairo_test_fallback_surface_create (cairo_content_t content, int width, int height); CAIRO_END_DECLS #endif /* TEST_FALLBACK_SURFACE_H */ libgdiplus-2.11/cairo/src/cairo-xlib-visual.c0000664000175000017500000001157412225470167016116 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2008 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-xlib-private.h" /* A perceptual distance metric between two colors. No sqrt needed * since the square of the distance is still a valid metric. */ /* XXX: This is currently using linear distance in RGB space which is * decidedly not perceptually linear. If someone cared a lot about the * quality, they might choose something else here. Then again, they * might also choose not to use a PseudoColor visual... */ static inline int _color_distance (unsigned short r1, unsigned short g1, unsigned short b1, unsigned short r2, unsigned short g2, unsigned short b2) { r1 >>= 8; g1 >>= 8; b1 >>= 8; r2 >>= 8; g2 >>= 8; b2 >>= 8; return ((r2 - r1) * (r2 - r1) + (g2 - g1) * (g2 - g1) + (b2 - b1) * (b2 - b1)); } cairo_status_t _cairo_xlib_visual_info_create (Display *dpy, int screen, VisualID visualid, cairo_xlib_visual_info_t **out) { cairo_xlib_visual_info_t *info; Colormap colormap = DefaultColormap (dpy, screen); XColor color; int gray, red, green, blue; int i, index, distance, min_distance = 0; const unsigned short index5_to_short[5] = { 0x0000, 0x4000, 0x8000, 0xc000, 0xffff }; const unsigned short index8_to_short[8] = { 0x0000, 0x2492, 0x4924, 0x6db6, 0x9249, 0xb6db, 0xdb6d, 0xffff }; info = malloc (sizeof (cairo_xlib_visual_info_t)); if (info == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); info->visualid = visualid; /* Allocate a 16-entry gray ramp and a 5x5x5 color cube. Give up * as soon as failures start. */ for (gray = 0; gray < 16; gray++) { color.red = (gray << 12) | (gray << 8) | (gray << 4) | gray; color.green = (gray << 12) | (gray << 8) | (gray << 4) | gray; color.blue = (gray << 12) | (gray << 8) | (gray << 4) | gray; if (! XAllocColor (dpy, colormap, &color)) goto DONE_ALLOCATE; } /* XXX: Could do this in a more clever order to have the best * possible results from early failure. Could also choose a cube * uniformly distributed in a better space than RGB. */ for (red = 0; red < 5; red++) { for (green = 0; green < 5; green++) { for (blue = 0; blue < 5; blue++) { color.red = index5_to_short[red]; color.green = index5_to_short[green]; color.blue = index5_to_short[blue]; color.pixel = 0; color.flags = 0; color.pad = 0; if (! XAllocColor (dpy, colormap, &color)) goto DONE_ALLOCATE; } } } DONE_ALLOCATE: for (i = 0; i < ARRAY_LENGTH (info->colors); i++) info->colors[i].pixel = i; XQueryColors (dpy, colormap, info->colors, ARRAY_LENGTH (info->colors)); /* Search for nearest colors within allocated colormap. */ for (red = 0; red < 8; red++) { for (green = 0; green < 8; green++) { for (blue = 0; blue < 8; blue++) { index = (red << 6) | (green << 3) | (blue); for (i = 0; i < 256; i++) { distance = _color_distance (index8_to_short[red], index8_to_short[green], index8_to_short[blue], info->colors[i].red, info->colors[i].green, info->colors[i].blue); if (i == 0 || distance < min_distance) { info->rgb333_to_pseudocolor[index] = info->colors[i].pixel; min_distance = distance; } } } } } *out = info; return CAIRO_STATUS_SUCCESS; } void _cairo_xlib_visual_info_destroy (Display *dpy, cairo_xlib_visual_info_t *info) { /* No need for XFreeColors() whilst using DefaultColormap */ free (info); } libgdiplus-2.11/cairo/src/cairo-backend.pc.in0000664000175000017500000000051312225470167016022 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: cairo-@backend_name@ Description: @Backend_Name@ backend for cairo graphics library Version: @VERSION@ Requires: @BACKEND_BASE@ @BACKEND_REQUIRES@ Libs: @BACKEND_NONPKGCONFIG_LIBS@ Cflags: -I${includedir}/cairo @BACKEND_NONPKGCONFIG_CFLAGS@ libgdiplus-2.11/cairo/src/cairo-ft-private.h0000664000175000017500000000515712225470167015745 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Graydon Hoare * Owen Taylor */ #ifndef CAIRO_FT_PRIVATE_H #define CAIRO_FT_PRIVATE_H #include #include #if CAIRO_HAS_FT_FONT CAIRO_BEGIN_DECLS typedef struct _cairo_ft_unscaled_font cairo_ft_unscaled_font_t; cairo_private cairo_bool_t _cairo_unscaled_font_is_ft (cairo_unscaled_font_t *unscaled_font); cairo_private cairo_bool_t _cairo_scaled_font_is_ft (cairo_scaled_font_t *scaled_font); /* These functions are needed by the PDF backend, which needs to keep track of the * the different fonts-on-disk used by a document, so it can embed them */ cairo_private cairo_unscaled_font_t * _cairo_ft_scaled_font_get_unscaled_font (cairo_scaled_font_t *scaled_font); cairo_private FT_Face _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled); cairo_private void _cairo_ft_unscaled_font_unlock_face (cairo_ft_unscaled_font_t *unscaled); cairo_private cairo_bool_t _cairo_ft_scaled_font_is_vertical (cairo_scaled_font_t *scaled_font); slim_hidden_proto (cairo_ft_scaled_font_lock_face); slim_hidden_proto (cairo_ft_scaled_font_unlock_face); CAIRO_END_DECLS #endif /* CAIRO_HAS_FT_FONT */ #endif /* CAIRO_FT_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-debug.c0000664000175000017500000000542412225470167014742 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" /** * cairo_debug_reset_static_data: * * Resets all static data within cairo to its original state, * (ie. identical to the state at the time of program invocation). For * example, all caches within cairo will be flushed empty. * * This function is intended to be useful when using memory-checking * tools such as valgrind. When valgrind's memcheck analyzes a * cairo-using program without a call to cairo_debug_reset_static_data(), * it will report all data reachable via cairo's static objects as * "still reachable". Calling cairo_debug_reset_static_data() just prior * to program termination will make it easier to get squeaky clean * reports from valgrind. * * WARNING: It is only safe to call this function when there are no * active cairo objects remaining, (ie. the appropriate destroy * functions have been called as necessary). If there are active cairo * objects, this call is likely to cause a crash, (eg. an assertion * failure due to a hash table being destroyed when non-empty). **/ void cairo_debug_reset_static_data (void) { CAIRO_MUTEX_INITIALIZE (); _cairo_font_reset_static_data (); #if CAIRO_HAS_FT_FONT _cairo_ft_font_reset_static_data (); #endif _cairo_pattern_reset_static_data (); _cairo_scaled_font_reset_static_data (); CAIRO_MUTEX_FINALIZE (); } libgdiplus-2.11/cairo/src/Makefile.in0000664000175000017500000037650412225470356014474 00000000000000# Makefile.in generated by automake 1.11.6 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @CAIRO_HAS_FT_FONT_TRUE@am__append_1 = $(font_subset_sources_ft) @CAIRO_HAS_PS_SURFACE_TRUE@am__append_2 = $(ps_headers) @CAIRO_HAS_PS_SURFACE_TRUE@am__append_3 = $(ps_sources) @CAIRO_HAS_PS_SURFACE_TRUE@am__append_4 = cairo-ps.pc @CAIRO_HAS_PDF_SURFACE_TRUE@am__append_5 = $(pdf_headers) @CAIRO_HAS_PDF_SURFACE_TRUE@am__append_6 = $(pdf_sources) @CAIRO_HAS_PDF_SURFACE_TRUE@am__append_7 = cairo-pdf.pc @CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_8 = $(png_sources) @CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__append_9 = cairo-png.pc @CAIRO_HAS_SVG_SURFACE_TRUE@am__append_10 = $(svg_headers) @CAIRO_HAS_SVG_SURFACE_TRUE@am__append_11 = $(svg_sources) @CAIRO_HAS_SVG_SURFACE_TRUE@am__append_12 = cairo-svg.pc @CAIRO_HAS_TEST_SURFACES_TRUE@am__append_13 = $(test_sources) @CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_14 = $(xlib_headers) @CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_15 = $(xlib_sources) @CAIRO_HAS_XLIB_SURFACE_TRUE@am__append_16 = cairo-xlib.pc @CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_17 = $(xlib_xrender_headers) @CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE@am__append_18 = cairo-xlib-xrender.pc @CAIRO_HAS_XCB_SURFACE_TRUE@am__append_19 = $(xcb_headers) @CAIRO_HAS_XCB_SURFACE_TRUE@am__append_20 = $(xcb_sources) @CAIRO_HAS_XCB_SURFACE_TRUE@am__append_21 = cairo-xcb.pc @CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_22 = $(quartz_headers) @CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_23 = $(quartz_sources) @CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__append_24 = cairo-quartz.pc @CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_25 = cairo-quartz-image.h @CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE@am__append_26 = cairo-quartz-image.pc @CAIRO_HAS_QUARTZ_FONT_TRUE@am__append_27 = $(quartz_font_sources) @OS_WIN32_TRUE@am__append_28 = $(os_win32_sources) @CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_29 = $(win32_headers) @CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_30 = $(win32_sources) @CAIRO_HAS_WIN32_SURFACE_TRUE@am__append_31 = cairo-win32.pc @CAIRO_HAS_WIN32_FONT_TRUE@am__append_32 = $(win32_font_sources) @CAIRO_HAS_WIN32_FONT_TRUE@am__append_33 = cairo-win32-font.pc @CAIRO_HAS_OS2_SURFACE_TRUE@am__append_34 = $(os2_headers) @CAIRO_HAS_OS2_SURFACE_TRUE@am__append_35 = $(os2_sources) @CAIRO_HAS_OS2_SURFACE_TRUE@am__append_36 = cairo-os2.pc @CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_37 = $(beos_headers) @CAIRO_HAS_BEOS_SURFACE_TRUE@am__append_38 = cairo-beos.pc @CAIRO_HAS_GLITZ_SURFACE_TRUE@am__append_39 = $(glitz_headers) @CAIRO_HAS_GLITZ_SURFACE_TRUE@am__append_40 = $(glitz_sources) @CAIRO_HAS_GLITZ_SURFACE_TRUE@am__append_41 = cairo-glitz.pc @CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_42 = $(directfb_headers) @CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_43 = $(directfb_sources) @CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__append_44 = cairo-directfb.pc @CAIRO_HAS_FT_FONT_TRUE@am__append_45 = $(ft_headers) @CAIRO_HAS_FT_FONT_TRUE@am__append_46 = $(ft_sources) @CAIRO_HAS_FT_FONT_TRUE@am__append_47 = cairo-ft.pc subdir = src DIST_COMMON = $(am__noinst_HEADERS_DIST) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/cairo.pc.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = cairo.pc CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = am__libcairo_la_SOURCES_DIST = cairo.c cairo.h cairo-private.h \ cairo-arc.c cairo-arc-private.h cairo-array.c cairo-atomic.c \ cairo-atomic-private.h cairo-base85-stream.c \ cairo-bentley-ottmann.c cairo-cache.c cairo-clip.c \ cairo-clip-private.h cairo-color.c cairo-compiler-private.h \ cairo-debug.c cairo-fixed.c cairo-font-face.c \ cairo-font-options.c cairo-freelist.c cairo-freelist-private.h \ cairo-gstate.c cairo-gstate-private.h cairo-hash.c \ cairo-hash-private.h cairo-hull.c cairo-image-surface.c \ cairo-lzw.c cairo-misc.c cairo-malloc-private.h cairo-matrix.c \ cairo-mutex.c cairo-mutex-private.h cairo-mutex-type-private.h \ cairo-path.c cairo-path-private.h cairo-path-bounds.c \ cairo-path-fill.c cairo-path-fixed.c \ cairo-path-fixed-private.h cairo-path-stroke.c cairo-pen.c \ cairo-polygon.c cairo-rectangle.c \ cairo-reference-count-private.h cairo-region.c \ cairo-region-private.h cairo-scaled-font.c \ cairo-scaled-font-private.h cairo-skiplist.c \ cairo-skiplist-private.h cairo-slope.c cairo-spline.c \ cairo-stroke-style.c cairo-surface.c cairo-surface-fallback.c \ cairo-surface-fallback-private.h cairo-surface-private.h \ cairo-traps.c cairo-pattern.c cairo-unicode.c \ cairo-output-stream.c cairo-output-stream-private.h \ cairo-wideint.c cairo-wideint-private.h \ cairo-wideint-type-private.h cairo-meta-surface.c \ cairo-meta-surface-private.h cairo-paginated-private.h \ cairo-paginated-surface.c cairo-paginated-surface-private.h \ cairo-analysis-surface.c cairo-analysis-surface-private.h \ cairoint.h cairo-ps-surface.c cairo-ps-surface-private.h \ cairo-pdf-surface.c cairo-pdf-surface-private.h \ cairo-pdf-operators.c cairo-pdf-operators-private.h \ cairo-deflate-stream.c cairo-png.c cairo-svg-surface.c \ cairo-svg-surface-private.h cairo-cff-subset.c \ cairo-truetype-subset.c cairo-type1-fallback.c \ cairo-type1-private.h cairo-truetype-subset-private.h \ cairo-scaled-font-subsets.c \ cairo-scaled-font-subsets-private.h cairo-type1-subset.c \ test-fallback-surface.c test-fallback-surface.h \ test-meta-surface.c test-meta-surface.h \ test-paginated-surface.c test-paginated-surface.h \ cairo-xlib-surface.c cairo-xlib-surface-private.h \ cairo-xlib-display.c cairo-xlib-screen.c cairo-xlib-visual.c \ cairo-xlib-private.h cairo-xlib-xrender-private.h \ cairo-xcb-surface.c cairo-quartz-surface.c \ cairo-quartz-image-surface.c cairo-quartz-private.h \ cairo-quartz-font.c cairo-win32.c cairo-win32-surface.c \ cairo-win32-printing-surface.c cairo-win32-private.h \ cairo-win32-font.c cairo-os2-surface.c cairo-os2-private.h \ cairo-glitz-surface.c cairo-glitz-private.h \ cairo-directfb-surface.c cairo-ft-font.c cairo-ft-private.h \ cairo-cache-private.h cairo-fixed-private.h \ cairo-fixed-type-private.h cairo-mutex-list-private.h \ cairo-types-private.h am__objects_1 = libcairo_la-cairo.lo libcairo_la-cairo-arc.lo \ libcairo_la-cairo-array.lo libcairo_la-cairo-atomic.lo \ libcairo_la-cairo-base85-stream.lo \ libcairo_la-cairo-bentley-ottmann.lo \ libcairo_la-cairo-cache.lo libcairo_la-cairo-clip.lo \ libcairo_la-cairo-color.lo libcairo_la-cairo-debug.lo \ libcairo_la-cairo-fixed.lo libcairo_la-cairo-font-face.lo \ libcairo_la-cairo-font-options.lo \ libcairo_la-cairo-freelist.lo libcairo_la-cairo-gstate.lo \ libcairo_la-cairo-hash.lo libcairo_la-cairo-hull.lo \ libcairo_la-cairo-image-surface.lo libcairo_la-cairo-lzw.lo \ libcairo_la-cairo-misc.lo libcairo_la-cairo-matrix.lo \ libcairo_la-cairo-mutex.lo libcairo_la-cairo-path.lo \ libcairo_la-cairo-path-bounds.lo \ libcairo_la-cairo-path-fill.lo libcairo_la-cairo-path-fixed.lo \ libcairo_la-cairo-path-stroke.lo libcairo_la-cairo-pen.lo \ libcairo_la-cairo-polygon.lo libcairo_la-cairo-rectangle.lo \ libcairo_la-cairo-region.lo libcairo_la-cairo-scaled-font.lo \ libcairo_la-cairo-skiplist.lo libcairo_la-cairo-slope.lo \ libcairo_la-cairo-spline.lo libcairo_la-cairo-stroke-style.lo \ libcairo_la-cairo-surface.lo \ libcairo_la-cairo-surface-fallback.lo \ libcairo_la-cairo-traps.lo libcairo_la-cairo-pattern.lo \ libcairo_la-cairo-unicode.lo \ libcairo_la-cairo-output-stream.lo \ libcairo_la-cairo-wideint.lo libcairo_la-cairo-meta-surface.lo \ libcairo_la-cairo-paginated-surface.lo \ libcairo_la-cairo-analysis-surface.lo am__objects_2 = libcairo_la-cairo-ps-surface.lo @CAIRO_HAS_PS_SURFACE_TRUE@am__objects_3 = $(am__objects_2) am__objects_4 = libcairo_la-cairo-pdf-surface.lo \ libcairo_la-cairo-pdf-operators.lo \ libcairo_la-cairo-deflate-stream.lo @CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_5 = $(am__objects_4) am__objects_6 = libcairo_la-cairo-png.lo @CAIRO_HAS_PNG_FUNCTIONS_TRUE@am__objects_7 = $(am__objects_6) am__objects_8 = libcairo_la-cairo-svg-surface.lo @CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_9 = $(am__objects_8) am__objects_10 = libcairo_la-cairo-cff-subset.lo \ libcairo_la-cairo-truetype-subset.lo \ libcairo_la-cairo-type1-fallback.lo \ libcairo_la-cairo-scaled-font-subsets.lo am__objects_11 = libcairo_la-cairo-type1-subset.lo @CAIRO_HAS_FT_FONT_TRUE@am__objects_12 = $(am__objects_11) am__objects_13 = $(am__objects_10) $(am__objects_12) @CAIRO_HAS_PDF_SURFACE_FALSE@@CAIRO_HAS_PS_SURFACE_FALSE@@CAIRO_HAS_SVG_SURFACE_TRUE@am__objects_14 = $(am__objects_13) @CAIRO_HAS_PDF_SURFACE_FALSE@@CAIRO_HAS_PS_SURFACE_TRUE@am__objects_14 = $(am__objects_13) @CAIRO_HAS_PDF_SURFACE_TRUE@am__objects_14 = $(am__objects_13) am__objects_15 = libcairo_la-test-fallback-surface.lo \ libcairo_la-test-meta-surface.lo \ libcairo_la-test-paginated-surface.lo @CAIRO_HAS_TEST_SURFACES_TRUE@am__objects_16 = $(am__objects_15) am__objects_17 = libcairo_la-cairo-xlib-surface.lo \ libcairo_la-cairo-xlib-display.lo \ libcairo_la-cairo-xlib-screen.lo \ libcairo_la-cairo-xlib-visual.lo @CAIRO_HAS_XLIB_SURFACE_TRUE@am__objects_18 = $(am__objects_17) am__objects_19 = libcairo_la-cairo-xcb-surface.lo @CAIRO_HAS_XCB_SURFACE_TRUE@am__objects_20 = $(am__objects_19) am__objects_21 = libcairo_la-cairo-quartz-surface.lo \ libcairo_la-cairo-quartz-image-surface.lo @CAIRO_HAS_QUARTZ_SURFACE_TRUE@am__objects_22 = $(am__objects_21) am__objects_23 = libcairo_la-cairo-quartz-font.lo @CAIRO_HAS_QUARTZ_FONT_TRUE@am__objects_24 = $(am__objects_23) am__objects_25 = libcairo_la-cairo-win32.lo @OS_WIN32_TRUE@am__objects_26 = $(am__objects_25) am__objects_27 = libcairo_la-cairo-win32-surface.lo \ libcairo_la-cairo-win32-printing-surface.lo @CAIRO_HAS_WIN32_SURFACE_TRUE@am__objects_28 = $(am__objects_27) am__objects_29 = libcairo_la-cairo-win32-font.lo @CAIRO_HAS_WIN32_FONT_TRUE@am__objects_30 = $(am__objects_29) am__objects_31 = libcairo_la-cairo-os2-surface.lo @CAIRO_HAS_OS2_SURFACE_TRUE@am__objects_32 = $(am__objects_31) am__objects_33 = libcairo_la-cairo-glitz-surface.lo @CAIRO_HAS_GLITZ_SURFACE_TRUE@am__objects_34 = $(am__objects_33) am__objects_35 = libcairo_la-cairo-directfb-surface.lo @CAIRO_HAS_DIRECTFB_SURFACE_TRUE@am__objects_36 = $(am__objects_35) am__objects_37 = libcairo_la-cairo-ft-font.lo @CAIRO_HAS_FT_FONT_TRUE@am__objects_38 = $(am__objects_37) am__objects_39 = $(am__objects_1) $(am__objects_3) $(am__objects_5) \ $(am__objects_7) $(am__objects_9) $(am__objects_14) \ $(am__objects_16) $(am__objects_18) $(am__objects_20) \ $(am__objects_22) $(am__objects_24) $(am__objects_26) \ $(am__objects_28) $(am__objects_30) $(am__objects_32) \ $(am__objects_34) $(am__objects_36) $(am__objects_38) am__objects_40 = am_libcairo_la_OBJECTS = $(am__objects_39) $(am__objects_40) libcairo_la_OBJECTS = $(am_libcairo_la_OBJECTS) libcairo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcairo_la_CFLAGS) \ $(CFLAGS) $(libcairo_la_LDFLAGS) $(LDFLAGS) -o $@ DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/../depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ SOURCES = $(libcairo_la_SOURCES) DIST_SOURCES = $(am__libcairo_la_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac DATA = $(noinst_DATA) am__noinst_HEADERS_DIST = cairo-deprecated.h cairo.h cairo-embed.h \ cairo-ps.h cairo-pdf.h cairo-svg.h cairo-xlib.h \ cairo-xlib-xrender.h cairo-xcb.h cairo-xcb-xrender.h \ cairo-quartz.h cairo-quartz-image.h cairo-win32.h cairo-os2.h \ cairo-beos.h cairo-glitz.h cairo-directfb.h cairo-ft.h HEADERS = $(nodist_noinst_HEADERS) $(noinst_HEADERS) ETAGS = etags CTAGS = ctags am__tty_colors = \ red=; grn=; lgn=; blu=; std= DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CAIROPERF_LIBS = @CAIROPERF_LIBS@ CAIRO_CFLAGS = @CAIRO_CFLAGS@ CAIRO_LDADD = @CAIRO_LDADD@ CAIRO_LIBS = @CAIRO_LIBS@ CAIRO_NONPKGCONFIG_CFLAGS = @CAIRO_NONPKGCONFIG_CFLAGS@ CAIRO_NONPKGCONFIG_LIBS = @CAIRO_NONPKGCONFIG_LIBS@ CAIRO_REQUIRES = @CAIRO_REQUIRES@ CAIRO_VERSION_MAJOR = @CAIRO_VERSION_MAJOR@ CAIRO_VERSION_MICRO = @CAIRO_VERSION_MICRO@ CAIRO_VERSION_MINOR = @CAIRO_VERSION_MINOR@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIND = @FIND@ FONTCONFIG_CFLAGS = @FONTCONFIG_CFLAGS@ # These names match automake style variable definition conventions so # without these lines, automake will complain during the handling of # the libcairo_la_LIBADD below. (The INCLUDES is an autoconf only # term and automake does not care about it) FONTCONFIG_LIBS = @FONTCONFIG_LIBS@ FREETYPE_CFLAGS = @FREETYPE_CFLAGS@ FREETYPE_CONFIG = @FREETYPE_CONFIG@ FREETYPE_LIBS = @FREETYPE_LIBS@ GLITZ_AGL_CFLAGS = @GLITZ_AGL_CFLAGS@ GLITZ_AGL_LIBS = @GLITZ_AGL_LIBS@ GLITZ_EGL_CFLAGS = @GLITZ_EGL_CFLAGS@ GLITZ_EGL_LIBS = @GLITZ_EGL_LIBS@ GLITZ_GLX_CFLAGS = @GLITZ_GLX_CFLAGS@ GLITZ_GLX_LIBS = @GLITZ_GLX_LIBS@ GLITZ_WGL_CFLAGS = @GLITZ_WGL_CFLAGS@ GLITZ_WGL_LIBS = @GLITZ_WGL_LIBS@ GREP = @GREP@ GS = @GS@ HTML_DIR = @HTML_DIR@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBM = @LIBM@ LIBOBJS = @LIBOBJS@ LIBRSVG_CFLAGS = @LIBRSVG_CFLAGS@ LIBRSVG_LIBS = @LIBRSVG_LIBS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LTP = @LTP@ LTP_GENHTML = @LTP_GENHTML@ LT_CURRENT_MINUS_AGE = @LT_CURRENT_MINUS_AGE@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKGCONFIG_REQUIRES = @PKGCONFIG_REQUIRES@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ POPPLER_CFLAGS = @POPPLER_CFLAGS@ POPPLER_LIBS = @POPPLER_LIBS@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SHTOOL = @SHTOOL@ STRIP = @STRIP@ VERSION = @VERSION@ VERSION_INFO = @VERSION_INFO@ XARGS = @XARGS@ XMKMF = @XMKMF@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ directfb_CFLAGS = @directfb_CFLAGS@ directfb_LIBS = @directfb_LIBS@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ glitz_CFLAGS = @glitz_CFLAGS@ glitz_LIBS = @glitz_LIBS@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ png_CFLAGS = @png_CFLAGS@ png_LIBS = @png_LIBS@ png_REQUIRES = @png_REQUIRES@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ xcb_CFLAGS = @xcb_CFLAGS@ xcb_LIBS = @xcb_LIBS@ xlib_CFLAGS = @xlib_CFLAGS@ xlib_LIBS = @xlib_LIBS@ xlib_xrender_CFLAGS = @xlib_xrender_CFLAGS@ xlib_xrender_LIBS = @xlib_xrender_LIBS@ backend_pkgconfigs = $(am__append_4) $(am__append_7) $(am__append_9) \ $(am__append_12) $(am__append_16) $(am__append_18) \ $(am__append_21) $(am__append_24) $(am__append_26) \ $(am__append_31) $(am__append_33) $(am__append_36) \ $(am__append_38) $(am__append_41) $(am__append_44) \ $(am__append_47) cairo_base_headers = cairo.h cairo-embed.h cairo_base_sources = \ cairo.c \ cairo.h \ cairo-private.h \ cairo-arc.c \ cairo-arc-private.h \ cairo-array.c \ cairo-atomic.c \ cairo-atomic-private.h \ cairo-base85-stream.c \ cairo-bentley-ottmann.c \ cairo-cache.c \ cairo-clip.c \ cairo-clip-private.h \ cairo-color.c \ cairo-compiler-private.h \ cairo-debug.c \ cairo-fixed.c \ cairo-font-face.c \ cairo-font-options.c \ cairo-freelist.c \ cairo-freelist-private.h \ cairo-gstate.c \ cairo-gstate-private.h \ cairo-hash.c \ cairo-hash-private.h \ cairo-hull.c \ cairo-image-surface.c \ cairo-lzw.c \ cairo-misc.c \ cairo-malloc-private.h \ cairo-matrix.c \ cairo-mutex.c \ cairo-mutex-private.h \ cairo-mutex-type-private.h \ cairo-path.c \ cairo-path-private.h \ cairo-path-bounds.c \ cairo-path-fill.c \ cairo-path-fixed.c \ cairo-path-fixed-private.h \ cairo-path-stroke.c \ cairo-pen.c \ cairo-polygon.c \ cairo-rectangle.c \ cairo-reference-count-private.h \ cairo-region.c \ cairo-region-private.h \ cairo-scaled-font.c \ cairo-scaled-font-private.h \ cairo-skiplist.c \ cairo-skiplist-private.h \ cairo-slope.c \ cairo-spline.c \ cairo-stroke-style.c \ cairo-surface.c \ cairo-surface-fallback.c \ cairo-surface-fallback-private.h \ cairo-surface-private.h \ cairo-traps.c \ cairo-pattern.c \ cairo-unicode.c \ cairo-output-stream.c \ cairo-output-stream-private.h \ cairo-wideint.c \ cairo-wideint-private.h \ cairo-wideint-type-private.h \ cairo-meta-surface.c \ cairo-meta-surface-private.h \ cairo-paginated-private.h \ cairo-paginated-surface.c \ cairo-paginated-surface-private.h \ cairo-analysis-surface.c \ cairo-analysis-surface-private.h \ cairoint.h cairo_all_sources = $(cairo_base_sources) $(cairo_base_headers) \ $(font_subset_sources_base) $(font_subset_sources_ft) \ $(ps_headers) $(ps_sources) $(pdf_headers) $(pdf_sources) \ $(png_sources) $(svg_headers) $(svg_sources) $(test_sources) \ $(xlib_headers) $(xlib_sources) $(xlib_xrender_headers) \ $(xcb_headers) $(xcb_sources) $(quartz_headers) \ $(quartz_sources) $(quartz_font_sources) $(os_win32_sources) \ $(win32_headers) $(win32_sources) $(win32_font_sources) \ $(os2_headers) $(os2_sources) $(beos_headers) $(beos_sources) \ $(glitz_headers) $(glitz_sources) $(directfb_headers) \ $(directfb_sources) $(ft_headers) $(ft_sources) cairo_headers = $(cairo_base_headers) $(am__append_2) $(am__append_5) \ $(am__append_10) $(am__append_14) $(am__append_17) \ $(am__append_19) $(am__append_22) $(am__append_25) \ $(am__append_29) $(am__append_34) $(am__append_37) \ $(am__append_39) $(am__append_42) $(am__append_45) cairo_sources = $(cairo_base_sources) $(am__append_3) $(am__append_6) \ $(am__append_8) $(am__append_11) \ $(libcairo_font_subset_sources) $(am__append_13) \ $(am__append_15) $(am__append_20) $(am__append_23) \ $(am__append_27) $(am__append_28) $(am__append_30) \ $(am__append_32) $(am__append_35) $(am__append_40) \ $(am__append_43) $(am__append_46) font_subset_sources_base = \ cairo-cff-subset.c \ cairo-truetype-subset.c \ cairo-type1-fallback.c \ cairo-type1-private.h \ cairo-truetype-subset-private.h \ cairo-scaled-font-subsets.c \ cairo-scaled-font-subsets-private.h font_subset_sources_ft = cairo-type1-subset.c font_subset_sources = $(font_subset_sources_base) $(am__append_1) ps_headers = cairo-ps.h ps_sources = cairo-ps-surface.c cairo-ps-surface-private.h @CAIRO_HAS_PDF_SURFACE_TRUE@libcairo_font_subset_sources = $(font_subset_sources) @CAIRO_HAS_PS_SURFACE_TRUE@libcairo_font_subset_sources = $(font_subset_sources) @CAIRO_HAS_SVG_SURFACE_TRUE@libcairo_font_subset_sources = $(font_subset_sources) pdf_headers = cairo-pdf.h pdf_sources = cairo-pdf-surface.c cairo-pdf-surface-private.h \ cairo-pdf-operators.c cairo-pdf-operators-private.h \ cairo-deflate-stream.c png_sources = cairo-png.c svg_headers = cairo-svg.h svg_sources = cairo-svg-surface.c cairo-svg-surface-private.h test_sources = test-fallback-surface.c test-fallback-surface.h \ test-meta-surface.c test-meta-surface.h \ test-paginated-surface.c test-paginated-surface.h xlib_headers = cairo-xlib.h xlib_sources = cairo-xlib-surface.c \ cairo-xlib-surface-private.h \ cairo-xlib-display.c \ cairo-xlib-screen.c \ cairo-xlib-visual.c \ cairo-xlib-private.h \ cairo-xlib-xrender-private.h xlib_xrender_headers = cairo-xlib-xrender.h xcb_headers = cairo-xcb.h cairo-xcb-xrender.h xcb_sources = cairo-xcb-surface.c quartz_headers = cairo-quartz.h quartz_sources = cairo-quartz-surface.c cairo-quartz-image-surface.c cairo-quartz-private.h quartz_font_sources = cairo-quartz-font.c os_win32_sources = cairo-win32.c @OS_WIN32_TRUE@export_symbols = -export-symbols cairo.def @OS_WIN32_TRUE@cairo_def_dependency = cairo.def win32_headers = cairo-win32.h win32_sources = cairo-win32-surface.c cairo-win32-printing-surface.c cairo-win32-private.h win32_font_sources = cairo-win32-font.c os2_headers = cairo-os2.h os2_sources = cairo-os2-surface.c cairo-os2-private.h beos_headers = cairo-beos.h beos_sources = cairo-beos-surface.cpp #noinst_LTLIBRARIES = libcairo_beos.la #libcairo_beos_la_SOURCES = $(libcairo_beos_sources) # BeOS system headers trigger this warning #libcairo_beos_la_CXXFLAGS = -Wno-multichar glitz_headers = cairo-glitz.h glitz_sources = cairo-glitz-surface.c cairo-glitz-private.h directfb_headers = cairo-directfb.h directfb_sources = cairo-directfb-surface.c ft_headers = cairo-ft.h ft_sources = cairo-ft-font.c cairo-ft-private.h XRENDER_LIBS = @XRENDER_LIBS@ cairoincludedir = $(includedir)/cairo noinst_HEADERS = \ cairo-deprecated.h \ $(cairo_headers) nodist_noinst_HEADERS = \ cairo-features.h noinst_LTLIBRARIES = libcairo.la # source files that cannot be passed to compiler directly. # mostly when they depend recursively on cairoint.h. that is, # cairoint.h includes them in the middle. cairo_special_sources = \ cairo-cache-private.h \ cairo-fixed-private.h \ cairo-fixed-type-private.h \ cairo-mutex-list-private.h \ cairo-types-private.h libcairo_la_SOURCES = \ $(cairo_sources) \ $(cairo_special_sources) cairo_all_source_file = \ $(cairo_all_sources) \ $(cairo_special_sources) libcairo_la_LDFLAGS = -version-info @VERSION_INFO@ -no-undefined $(export_symbols) libcairo_la_CFLAGS = -I$(srcdir) $(CAIRO_CFLAGS) libcairo_la_LIBADD = $(CAIRO_LIBS) $(CAIRO_LDADD) libcairo_la_DEPENDENCIES = $(cairo_def_dependency) pkgconfigdir = $(libdir)/pkgconfig noinst_DATA = cairo.pc $(backend_pkgconfigs) DISTCLEANFILES = $(backend_pkgconfigs) cairo-features.h \ cairo-no-features.h check-has-hidden-symbols.i EXTRA_DIST = cairo-backend.pc.in $(TESTS) check-has-hidden-symbols.c \ Makefile.win32 CLEANFILES = cairo.def TESTS_ENVIRONMENT = srcdir="$(srcdir)" MAKE="$(MAKE)" cairo_all_source_file="$(cairo_all_source_file)" TESTS = check-def.sh check-plt.sh check-headers.sh check-cairoint.sh check-doc-syntax.sh SPARSE = sparse SPLINT = splint -badflag all: all-am .SUFFIXES: .SUFFIXES: .c .i .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): cairo.pc: $(top_builddir)/config.status $(srcdir)/cairo.pc.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ test "$$dir" != "$$p" || dir=.; \ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done libcairo.la: $(libcairo_la_OBJECTS) $(libcairo_la_DEPENDENCIES) $(EXTRA_libcairo_la_DEPENDENCIES) $(libcairo_la_LINK) $(libcairo_la_OBJECTS) $(libcairo_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-analysis-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-arc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-array.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-atomic.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-base85-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-bentley-ottmann.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-cache.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-cff-subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-clip.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-color.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-debug.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-deflate-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-directfb-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-fixed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-font-face.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-font-options.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-freelist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-ft-font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-glitz-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-gstate.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-hash.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-hull.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-image-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-lzw.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-matrix.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-meta-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-mutex.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-os2-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-output-stream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-paginated-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-path-bounds.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-path-fill.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-path-fixed.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-path-stroke.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-path.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-pattern.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-pdf-operators.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-pdf-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-pen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-png.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-polygon.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-ps-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-quartz-font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-quartz-image-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-quartz-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-rectangle.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-region.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-scaled-font-subsets.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-scaled-font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-skiplist.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-slope.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-spline.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-stroke-style.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-surface-fallback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-svg-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-traps.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-truetype-subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-type1-fallback.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-type1-subset.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-unicode.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-wideint.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-win32-font.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-win32-printing-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-win32-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-win32.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-xcb-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-xlib-display.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-xlib-screen.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-xlib-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo-xlib-visual.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-cairo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-test-fallback-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-test-meta-surface.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libcairo_la-test-paginated-surface.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< libcairo_la-cairo.lo: cairo.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo.Tpo -c -o libcairo_la-cairo.lo `test -f 'cairo.c' || echo '$(srcdir)/'`cairo.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo.Tpo $(DEPDIR)/libcairo_la-cairo.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo.c' object='libcairo_la-cairo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo.lo `test -f 'cairo.c' || echo '$(srcdir)/'`cairo.c libcairo_la-cairo-arc.lo: cairo-arc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-arc.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-arc.Tpo -c -o libcairo_la-cairo-arc.lo `test -f 'cairo-arc.c' || echo '$(srcdir)/'`cairo-arc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-arc.Tpo $(DEPDIR)/libcairo_la-cairo-arc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-arc.c' object='libcairo_la-cairo-arc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-arc.lo `test -f 'cairo-arc.c' || echo '$(srcdir)/'`cairo-arc.c libcairo_la-cairo-array.lo: cairo-array.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-array.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-array.Tpo -c -o libcairo_la-cairo-array.lo `test -f 'cairo-array.c' || echo '$(srcdir)/'`cairo-array.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-array.Tpo $(DEPDIR)/libcairo_la-cairo-array.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-array.c' object='libcairo_la-cairo-array.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-array.lo `test -f 'cairo-array.c' || echo '$(srcdir)/'`cairo-array.c libcairo_la-cairo-atomic.lo: cairo-atomic.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-atomic.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-atomic.Tpo -c -o libcairo_la-cairo-atomic.lo `test -f 'cairo-atomic.c' || echo '$(srcdir)/'`cairo-atomic.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-atomic.Tpo $(DEPDIR)/libcairo_la-cairo-atomic.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-atomic.c' object='libcairo_la-cairo-atomic.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-atomic.lo `test -f 'cairo-atomic.c' || echo '$(srcdir)/'`cairo-atomic.c libcairo_la-cairo-base85-stream.lo: cairo-base85-stream.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-base85-stream.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-base85-stream.Tpo -c -o libcairo_la-cairo-base85-stream.lo `test -f 'cairo-base85-stream.c' || echo '$(srcdir)/'`cairo-base85-stream.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-base85-stream.Tpo $(DEPDIR)/libcairo_la-cairo-base85-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-base85-stream.c' object='libcairo_la-cairo-base85-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-base85-stream.lo `test -f 'cairo-base85-stream.c' || echo '$(srcdir)/'`cairo-base85-stream.c libcairo_la-cairo-bentley-ottmann.lo: cairo-bentley-ottmann.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-bentley-ottmann.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-bentley-ottmann.Tpo -c -o libcairo_la-cairo-bentley-ottmann.lo `test -f 'cairo-bentley-ottmann.c' || echo '$(srcdir)/'`cairo-bentley-ottmann.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-bentley-ottmann.Tpo $(DEPDIR)/libcairo_la-cairo-bentley-ottmann.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-bentley-ottmann.c' object='libcairo_la-cairo-bentley-ottmann.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-bentley-ottmann.lo `test -f 'cairo-bentley-ottmann.c' || echo '$(srcdir)/'`cairo-bentley-ottmann.c libcairo_la-cairo-cache.lo: cairo-cache.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-cache.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-cache.Tpo -c -o libcairo_la-cairo-cache.lo `test -f 'cairo-cache.c' || echo '$(srcdir)/'`cairo-cache.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-cache.Tpo $(DEPDIR)/libcairo_la-cairo-cache.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-cache.c' object='libcairo_la-cairo-cache.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-cache.lo `test -f 'cairo-cache.c' || echo '$(srcdir)/'`cairo-cache.c libcairo_la-cairo-clip.lo: cairo-clip.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-clip.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-clip.Tpo -c -o libcairo_la-cairo-clip.lo `test -f 'cairo-clip.c' || echo '$(srcdir)/'`cairo-clip.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-clip.Tpo $(DEPDIR)/libcairo_la-cairo-clip.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-clip.c' object='libcairo_la-cairo-clip.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-clip.lo `test -f 'cairo-clip.c' || echo '$(srcdir)/'`cairo-clip.c libcairo_la-cairo-color.lo: cairo-color.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-color.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-color.Tpo -c -o libcairo_la-cairo-color.lo `test -f 'cairo-color.c' || echo '$(srcdir)/'`cairo-color.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-color.Tpo $(DEPDIR)/libcairo_la-cairo-color.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-color.c' object='libcairo_la-cairo-color.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-color.lo `test -f 'cairo-color.c' || echo '$(srcdir)/'`cairo-color.c libcairo_la-cairo-debug.lo: cairo-debug.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-debug.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-debug.Tpo -c -o libcairo_la-cairo-debug.lo `test -f 'cairo-debug.c' || echo '$(srcdir)/'`cairo-debug.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-debug.Tpo $(DEPDIR)/libcairo_la-cairo-debug.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-debug.c' object='libcairo_la-cairo-debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-debug.lo `test -f 'cairo-debug.c' || echo '$(srcdir)/'`cairo-debug.c libcairo_la-cairo-fixed.lo: cairo-fixed.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-fixed.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-fixed.Tpo -c -o libcairo_la-cairo-fixed.lo `test -f 'cairo-fixed.c' || echo '$(srcdir)/'`cairo-fixed.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-fixed.Tpo $(DEPDIR)/libcairo_la-cairo-fixed.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-fixed.c' object='libcairo_la-cairo-fixed.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-fixed.lo `test -f 'cairo-fixed.c' || echo '$(srcdir)/'`cairo-fixed.c libcairo_la-cairo-font-face.lo: cairo-font-face.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-font-face.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-font-face.Tpo -c -o libcairo_la-cairo-font-face.lo `test -f 'cairo-font-face.c' || echo '$(srcdir)/'`cairo-font-face.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-font-face.Tpo $(DEPDIR)/libcairo_la-cairo-font-face.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-font-face.c' object='libcairo_la-cairo-font-face.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-font-face.lo `test -f 'cairo-font-face.c' || echo '$(srcdir)/'`cairo-font-face.c libcairo_la-cairo-font-options.lo: cairo-font-options.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-font-options.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-font-options.Tpo -c -o libcairo_la-cairo-font-options.lo `test -f 'cairo-font-options.c' || echo '$(srcdir)/'`cairo-font-options.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-font-options.Tpo $(DEPDIR)/libcairo_la-cairo-font-options.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-font-options.c' object='libcairo_la-cairo-font-options.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-font-options.lo `test -f 'cairo-font-options.c' || echo '$(srcdir)/'`cairo-font-options.c libcairo_la-cairo-freelist.lo: cairo-freelist.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-freelist.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-freelist.Tpo -c -o libcairo_la-cairo-freelist.lo `test -f 'cairo-freelist.c' || echo '$(srcdir)/'`cairo-freelist.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-freelist.Tpo $(DEPDIR)/libcairo_la-cairo-freelist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-freelist.c' object='libcairo_la-cairo-freelist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-freelist.lo `test -f 'cairo-freelist.c' || echo '$(srcdir)/'`cairo-freelist.c libcairo_la-cairo-gstate.lo: cairo-gstate.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-gstate.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-gstate.Tpo -c -o libcairo_la-cairo-gstate.lo `test -f 'cairo-gstate.c' || echo '$(srcdir)/'`cairo-gstate.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-gstate.Tpo $(DEPDIR)/libcairo_la-cairo-gstate.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-gstate.c' object='libcairo_la-cairo-gstate.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-gstate.lo `test -f 'cairo-gstate.c' || echo '$(srcdir)/'`cairo-gstate.c libcairo_la-cairo-hash.lo: cairo-hash.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-hash.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-hash.Tpo -c -o libcairo_la-cairo-hash.lo `test -f 'cairo-hash.c' || echo '$(srcdir)/'`cairo-hash.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-hash.Tpo $(DEPDIR)/libcairo_la-cairo-hash.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-hash.c' object='libcairo_la-cairo-hash.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-hash.lo `test -f 'cairo-hash.c' || echo '$(srcdir)/'`cairo-hash.c libcairo_la-cairo-hull.lo: cairo-hull.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-hull.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-hull.Tpo -c -o libcairo_la-cairo-hull.lo `test -f 'cairo-hull.c' || echo '$(srcdir)/'`cairo-hull.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-hull.Tpo $(DEPDIR)/libcairo_la-cairo-hull.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-hull.c' object='libcairo_la-cairo-hull.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-hull.lo `test -f 'cairo-hull.c' || echo '$(srcdir)/'`cairo-hull.c libcairo_la-cairo-image-surface.lo: cairo-image-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-image-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-image-surface.Tpo -c -o libcairo_la-cairo-image-surface.lo `test -f 'cairo-image-surface.c' || echo '$(srcdir)/'`cairo-image-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-image-surface.Tpo $(DEPDIR)/libcairo_la-cairo-image-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-image-surface.c' object='libcairo_la-cairo-image-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-image-surface.lo `test -f 'cairo-image-surface.c' || echo '$(srcdir)/'`cairo-image-surface.c libcairo_la-cairo-lzw.lo: cairo-lzw.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-lzw.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-lzw.Tpo -c -o libcairo_la-cairo-lzw.lo `test -f 'cairo-lzw.c' || echo '$(srcdir)/'`cairo-lzw.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-lzw.Tpo $(DEPDIR)/libcairo_la-cairo-lzw.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-lzw.c' object='libcairo_la-cairo-lzw.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-lzw.lo `test -f 'cairo-lzw.c' || echo '$(srcdir)/'`cairo-lzw.c libcairo_la-cairo-misc.lo: cairo-misc.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-misc.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-misc.Tpo -c -o libcairo_la-cairo-misc.lo `test -f 'cairo-misc.c' || echo '$(srcdir)/'`cairo-misc.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-misc.Tpo $(DEPDIR)/libcairo_la-cairo-misc.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-misc.c' object='libcairo_la-cairo-misc.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-misc.lo `test -f 'cairo-misc.c' || echo '$(srcdir)/'`cairo-misc.c libcairo_la-cairo-matrix.lo: cairo-matrix.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-matrix.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-matrix.Tpo -c -o libcairo_la-cairo-matrix.lo `test -f 'cairo-matrix.c' || echo '$(srcdir)/'`cairo-matrix.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-matrix.Tpo $(DEPDIR)/libcairo_la-cairo-matrix.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-matrix.c' object='libcairo_la-cairo-matrix.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-matrix.lo `test -f 'cairo-matrix.c' || echo '$(srcdir)/'`cairo-matrix.c libcairo_la-cairo-mutex.lo: cairo-mutex.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-mutex.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-mutex.Tpo -c -o libcairo_la-cairo-mutex.lo `test -f 'cairo-mutex.c' || echo '$(srcdir)/'`cairo-mutex.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-mutex.Tpo $(DEPDIR)/libcairo_la-cairo-mutex.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-mutex.c' object='libcairo_la-cairo-mutex.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-mutex.lo `test -f 'cairo-mutex.c' || echo '$(srcdir)/'`cairo-mutex.c libcairo_la-cairo-path.lo: cairo-path.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-path.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-path.Tpo -c -o libcairo_la-cairo-path.lo `test -f 'cairo-path.c' || echo '$(srcdir)/'`cairo-path.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-path.Tpo $(DEPDIR)/libcairo_la-cairo-path.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-path.c' object='libcairo_la-cairo-path.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-path.lo `test -f 'cairo-path.c' || echo '$(srcdir)/'`cairo-path.c libcairo_la-cairo-path-bounds.lo: cairo-path-bounds.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-path-bounds.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-path-bounds.Tpo -c -o libcairo_la-cairo-path-bounds.lo `test -f 'cairo-path-bounds.c' || echo '$(srcdir)/'`cairo-path-bounds.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-path-bounds.Tpo $(DEPDIR)/libcairo_la-cairo-path-bounds.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-path-bounds.c' object='libcairo_la-cairo-path-bounds.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-path-bounds.lo `test -f 'cairo-path-bounds.c' || echo '$(srcdir)/'`cairo-path-bounds.c libcairo_la-cairo-path-fill.lo: cairo-path-fill.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-path-fill.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-path-fill.Tpo -c -o libcairo_la-cairo-path-fill.lo `test -f 'cairo-path-fill.c' || echo '$(srcdir)/'`cairo-path-fill.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-path-fill.Tpo $(DEPDIR)/libcairo_la-cairo-path-fill.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-path-fill.c' object='libcairo_la-cairo-path-fill.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-path-fill.lo `test -f 'cairo-path-fill.c' || echo '$(srcdir)/'`cairo-path-fill.c libcairo_la-cairo-path-fixed.lo: cairo-path-fixed.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-path-fixed.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-path-fixed.Tpo -c -o libcairo_la-cairo-path-fixed.lo `test -f 'cairo-path-fixed.c' || echo '$(srcdir)/'`cairo-path-fixed.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-path-fixed.Tpo $(DEPDIR)/libcairo_la-cairo-path-fixed.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-path-fixed.c' object='libcairo_la-cairo-path-fixed.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-path-fixed.lo `test -f 'cairo-path-fixed.c' || echo '$(srcdir)/'`cairo-path-fixed.c libcairo_la-cairo-path-stroke.lo: cairo-path-stroke.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-path-stroke.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-path-stroke.Tpo -c -o libcairo_la-cairo-path-stroke.lo `test -f 'cairo-path-stroke.c' || echo '$(srcdir)/'`cairo-path-stroke.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-path-stroke.Tpo $(DEPDIR)/libcairo_la-cairo-path-stroke.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-path-stroke.c' object='libcairo_la-cairo-path-stroke.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-path-stroke.lo `test -f 'cairo-path-stroke.c' || echo '$(srcdir)/'`cairo-path-stroke.c libcairo_la-cairo-pen.lo: cairo-pen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-pen.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-pen.Tpo -c -o libcairo_la-cairo-pen.lo `test -f 'cairo-pen.c' || echo '$(srcdir)/'`cairo-pen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-pen.Tpo $(DEPDIR)/libcairo_la-cairo-pen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-pen.c' object='libcairo_la-cairo-pen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-pen.lo `test -f 'cairo-pen.c' || echo '$(srcdir)/'`cairo-pen.c libcairo_la-cairo-polygon.lo: cairo-polygon.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-polygon.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-polygon.Tpo -c -o libcairo_la-cairo-polygon.lo `test -f 'cairo-polygon.c' || echo '$(srcdir)/'`cairo-polygon.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-polygon.Tpo $(DEPDIR)/libcairo_la-cairo-polygon.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-polygon.c' object='libcairo_la-cairo-polygon.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-polygon.lo `test -f 'cairo-polygon.c' || echo '$(srcdir)/'`cairo-polygon.c libcairo_la-cairo-rectangle.lo: cairo-rectangle.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-rectangle.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-rectangle.Tpo -c -o libcairo_la-cairo-rectangle.lo `test -f 'cairo-rectangle.c' || echo '$(srcdir)/'`cairo-rectangle.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-rectangle.Tpo $(DEPDIR)/libcairo_la-cairo-rectangle.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-rectangle.c' object='libcairo_la-cairo-rectangle.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-rectangle.lo `test -f 'cairo-rectangle.c' || echo '$(srcdir)/'`cairo-rectangle.c libcairo_la-cairo-region.lo: cairo-region.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-region.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-region.Tpo -c -o libcairo_la-cairo-region.lo `test -f 'cairo-region.c' || echo '$(srcdir)/'`cairo-region.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-region.Tpo $(DEPDIR)/libcairo_la-cairo-region.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-region.c' object='libcairo_la-cairo-region.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-region.lo `test -f 'cairo-region.c' || echo '$(srcdir)/'`cairo-region.c libcairo_la-cairo-scaled-font.lo: cairo-scaled-font.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-scaled-font.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-scaled-font.Tpo -c -o libcairo_la-cairo-scaled-font.lo `test -f 'cairo-scaled-font.c' || echo '$(srcdir)/'`cairo-scaled-font.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-scaled-font.Tpo $(DEPDIR)/libcairo_la-cairo-scaled-font.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-scaled-font.c' object='libcairo_la-cairo-scaled-font.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-scaled-font.lo `test -f 'cairo-scaled-font.c' || echo '$(srcdir)/'`cairo-scaled-font.c libcairo_la-cairo-skiplist.lo: cairo-skiplist.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-skiplist.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-skiplist.Tpo -c -o libcairo_la-cairo-skiplist.lo `test -f 'cairo-skiplist.c' || echo '$(srcdir)/'`cairo-skiplist.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-skiplist.Tpo $(DEPDIR)/libcairo_la-cairo-skiplist.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-skiplist.c' object='libcairo_la-cairo-skiplist.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-skiplist.lo `test -f 'cairo-skiplist.c' || echo '$(srcdir)/'`cairo-skiplist.c libcairo_la-cairo-slope.lo: cairo-slope.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-slope.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-slope.Tpo -c -o libcairo_la-cairo-slope.lo `test -f 'cairo-slope.c' || echo '$(srcdir)/'`cairo-slope.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-slope.Tpo $(DEPDIR)/libcairo_la-cairo-slope.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-slope.c' object='libcairo_la-cairo-slope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-slope.lo `test -f 'cairo-slope.c' || echo '$(srcdir)/'`cairo-slope.c libcairo_la-cairo-spline.lo: cairo-spline.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-spline.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-spline.Tpo -c -o libcairo_la-cairo-spline.lo `test -f 'cairo-spline.c' || echo '$(srcdir)/'`cairo-spline.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-spline.Tpo $(DEPDIR)/libcairo_la-cairo-spline.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-spline.c' object='libcairo_la-cairo-spline.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-spline.lo `test -f 'cairo-spline.c' || echo '$(srcdir)/'`cairo-spline.c libcairo_la-cairo-stroke-style.lo: cairo-stroke-style.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-stroke-style.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-stroke-style.Tpo -c -o libcairo_la-cairo-stroke-style.lo `test -f 'cairo-stroke-style.c' || echo '$(srcdir)/'`cairo-stroke-style.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-stroke-style.Tpo $(DEPDIR)/libcairo_la-cairo-stroke-style.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-stroke-style.c' object='libcairo_la-cairo-stroke-style.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-stroke-style.lo `test -f 'cairo-stroke-style.c' || echo '$(srcdir)/'`cairo-stroke-style.c libcairo_la-cairo-surface.lo: cairo-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-surface.Tpo -c -o libcairo_la-cairo-surface.lo `test -f 'cairo-surface.c' || echo '$(srcdir)/'`cairo-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-surface.Tpo $(DEPDIR)/libcairo_la-cairo-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-surface.c' object='libcairo_la-cairo-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-surface.lo `test -f 'cairo-surface.c' || echo '$(srcdir)/'`cairo-surface.c libcairo_la-cairo-surface-fallback.lo: cairo-surface-fallback.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-surface-fallback.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-surface-fallback.Tpo -c -o libcairo_la-cairo-surface-fallback.lo `test -f 'cairo-surface-fallback.c' || echo '$(srcdir)/'`cairo-surface-fallback.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-surface-fallback.Tpo $(DEPDIR)/libcairo_la-cairo-surface-fallback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-surface-fallback.c' object='libcairo_la-cairo-surface-fallback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-surface-fallback.lo `test -f 'cairo-surface-fallback.c' || echo '$(srcdir)/'`cairo-surface-fallback.c libcairo_la-cairo-traps.lo: cairo-traps.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-traps.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-traps.Tpo -c -o libcairo_la-cairo-traps.lo `test -f 'cairo-traps.c' || echo '$(srcdir)/'`cairo-traps.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-traps.Tpo $(DEPDIR)/libcairo_la-cairo-traps.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-traps.c' object='libcairo_la-cairo-traps.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-traps.lo `test -f 'cairo-traps.c' || echo '$(srcdir)/'`cairo-traps.c libcairo_la-cairo-pattern.lo: cairo-pattern.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-pattern.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-pattern.Tpo -c -o libcairo_la-cairo-pattern.lo `test -f 'cairo-pattern.c' || echo '$(srcdir)/'`cairo-pattern.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-pattern.Tpo $(DEPDIR)/libcairo_la-cairo-pattern.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-pattern.c' object='libcairo_la-cairo-pattern.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-pattern.lo `test -f 'cairo-pattern.c' || echo '$(srcdir)/'`cairo-pattern.c libcairo_la-cairo-unicode.lo: cairo-unicode.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-unicode.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-unicode.Tpo -c -o libcairo_la-cairo-unicode.lo `test -f 'cairo-unicode.c' || echo '$(srcdir)/'`cairo-unicode.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-unicode.Tpo $(DEPDIR)/libcairo_la-cairo-unicode.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-unicode.c' object='libcairo_la-cairo-unicode.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-unicode.lo `test -f 'cairo-unicode.c' || echo '$(srcdir)/'`cairo-unicode.c libcairo_la-cairo-output-stream.lo: cairo-output-stream.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-output-stream.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-output-stream.Tpo -c -o libcairo_la-cairo-output-stream.lo `test -f 'cairo-output-stream.c' || echo '$(srcdir)/'`cairo-output-stream.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-output-stream.Tpo $(DEPDIR)/libcairo_la-cairo-output-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-output-stream.c' object='libcairo_la-cairo-output-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-output-stream.lo `test -f 'cairo-output-stream.c' || echo '$(srcdir)/'`cairo-output-stream.c libcairo_la-cairo-wideint.lo: cairo-wideint.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-wideint.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-wideint.Tpo -c -o libcairo_la-cairo-wideint.lo `test -f 'cairo-wideint.c' || echo '$(srcdir)/'`cairo-wideint.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-wideint.Tpo $(DEPDIR)/libcairo_la-cairo-wideint.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-wideint.c' object='libcairo_la-cairo-wideint.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-wideint.lo `test -f 'cairo-wideint.c' || echo '$(srcdir)/'`cairo-wideint.c libcairo_la-cairo-meta-surface.lo: cairo-meta-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-meta-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-meta-surface.Tpo -c -o libcairo_la-cairo-meta-surface.lo `test -f 'cairo-meta-surface.c' || echo '$(srcdir)/'`cairo-meta-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-meta-surface.Tpo $(DEPDIR)/libcairo_la-cairo-meta-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-meta-surface.c' object='libcairo_la-cairo-meta-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-meta-surface.lo `test -f 'cairo-meta-surface.c' || echo '$(srcdir)/'`cairo-meta-surface.c libcairo_la-cairo-paginated-surface.lo: cairo-paginated-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-paginated-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-paginated-surface.Tpo -c -o libcairo_la-cairo-paginated-surface.lo `test -f 'cairo-paginated-surface.c' || echo '$(srcdir)/'`cairo-paginated-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-paginated-surface.Tpo $(DEPDIR)/libcairo_la-cairo-paginated-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-paginated-surface.c' object='libcairo_la-cairo-paginated-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-paginated-surface.lo `test -f 'cairo-paginated-surface.c' || echo '$(srcdir)/'`cairo-paginated-surface.c libcairo_la-cairo-analysis-surface.lo: cairo-analysis-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-analysis-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-analysis-surface.Tpo -c -o libcairo_la-cairo-analysis-surface.lo `test -f 'cairo-analysis-surface.c' || echo '$(srcdir)/'`cairo-analysis-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-analysis-surface.Tpo $(DEPDIR)/libcairo_la-cairo-analysis-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-analysis-surface.c' object='libcairo_la-cairo-analysis-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-analysis-surface.lo `test -f 'cairo-analysis-surface.c' || echo '$(srcdir)/'`cairo-analysis-surface.c libcairo_la-cairo-ps-surface.lo: cairo-ps-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-ps-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-ps-surface.Tpo -c -o libcairo_la-cairo-ps-surface.lo `test -f 'cairo-ps-surface.c' || echo '$(srcdir)/'`cairo-ps-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-ps-surface.Tpo $(DEPDIR)/libcairo_la-cairo-ps-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-ps-surface.c' object='libcairo_la-cairo-ps-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-ps-surface.lo `test -f 'cairo-ps-surface.c' || echo '$(srcdir)/'`cairo-ps-surface.c libcairo_la-cairo-pdf-surface.lo: cairo-pdf-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-pdf-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-pdf-surface.Tpo -c -o libcairo_la-cairo-pdf-surface.lo `test -f 'cairo-pdf-surface.c' || echo '$(srcdir)/'`cairo-pdf-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-pdf-surface.Tpo $(DEPDIR)/libcairo_la-cairo-pdf-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-pdf-surface.c' object='libcairo_la-cairo-pdf-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-pdf-surface.lo `test -f 'cairo-pdf-surface.c' || echo '$(srcdir)/'`cairo-pdf-surface.c libcairo_la-cairo-pdf-operators.lo: cairo-pdf-operators.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-pdf-operators.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-pdf-operators.Tpo -c -o libcairo_la-cairo-pdf-operators.lo `test -f 'cairo-pdf-operators.c' || echo '$(srcdir)/'`cairo-pdf-operators.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-pdf-operators.Tpo $(DEPDIR)/libcairo_la-cairo-pdf-operators.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-pdf-operators.c' object='libcairo_la-cairo-pdf-operators.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-pdf-operators.lo `test -f 'cairo-pdf-operators.c' || echo '$(srcdir)/'`cairo-pdf-operators.c libcairo_la-cairo-deflate-stream.lo: cairo-deflate-stream.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-deflate-stream.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-deflate-stream.Tpo -c -o libcairo_la-cairo-deflate-stream.lo `test -f 'cairo-deflate-stream.c' || echo '$(srcdir)/'`cairo-deflate-stream.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-deflate-stream.Tpo $(DEPDIR)/libcairo_la-cairo-deflate-stream.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-deflate-stream.c' object='libcairo_la-cairo-deflate-stream.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-deflate-stream.lo `test -f 'cairo-deflate-stream.c' || echo '$(srcdir)/'`cairo-deflate-stream.c libcairo_la-cairo-png.lo: cairo-png.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-png.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-png.Tpo -c -o libcairo_la-cairo-png.lo `test -f 'cairo-png.c' || echo '$(srcdir)/'`cairo-png.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-png.Tpo $(DEPDIR)/libcairo_la-cairo-png.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-png.c' object='libcairo_la-cairo-png.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-png.lo `test -f 'cairo-png.c' || echo '$(srcdir)/'`cairo-png.c libcairo_la-cairo-svg-surface.lo: cairo-svg-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-svg-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-svg-surface.Tpo -c -o libcairo_la-cairo-svg-surface.lo `test -f 'cairo-svg-surface.c' || echo '$(srcdir)/'`cairo-svg-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-svg-surface.Tpo $(DEPDIR)/libcairo_la-cairo-svg-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-svg-surface.c' object='libcairo_la-cairo-svg-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-svg-surface.lo `test -f 'cairo-svg-surface.c' || echo '$(srcdir)/'`cairo-svg-surface.c libcairo_la-cairo-cff-subset.lo: cairo-cff-subset.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-cff-subset.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-cff-subset.Tpo -c -o libcairo_la-cairo-cff-subset.lo `test -f 'cairo-cff-subset.c' || echo '$(srcdir)/'`cairo-cff-subset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-cff-subset.Tpo $(DEPDIR)/libcairo_la-cairo-cff-subset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-cff-subset.c' object='libcairo_la-cairo-cff-subset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-cff-subset.lo `test -f 'cairo-cff-subset.c' || echo '$(srcdir)/'`cairo-cff-subset.c libcairo_la-cairo-truetype-subset.lo: cairo-truetype-subset.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-truetype-subset.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-truetype-subset.Tpo -c -o libcairo_la-cairo-truetype-subset.lo `test -f 'cairo-truetype-subset.c' || echo '$(srcdir)/'`cairo-truetype-subset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-truetype-subset.Tpo $(DEPDIR)/libcairo_la-cairo-truetype-subset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-truetype-subset.c' object='libcairo_la-cairo-truetype-subset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-truetype-subset.lo `test -f 'cairo-truetype-subset.c' || echo '$(srcdir)/'`cairo-truetype-subset.c libcairo_la-cairo-type1-fallback.lo: cairo-type1-fallback.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-type1-fallback.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-type1-fallback.Tpo -c -o libcairo_la-cairo-type1-fallback.lo `test -f 'cairo-type1-fallback.c' || echo '$(srcdir)/'`cairo-type1-fallback.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-type1-fallback.Tpo $(DEPDIR)/libcairo_la-cairo-type1-fallback.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-type1-fallback.c' object='libcairo_la-cairo-type1-fallback.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-type1-fallback.lo `test -f 'cairo-type1-fallback.c' || echo '$(srcdir)/'`cairo-type1-fallback.c libcairo_la-cairo-scaled-font-subsets.lo: cairo-scaled-font-subsets.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-scaled-font-subsets.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-scaled-font-subsets.Tpo -c -o libcairo_la-cairo-scaled-font-subsets.lo `test -f 'cairo-scaled-font-subsets.c' || echo '$(srcdir)/'`cairo-scaled-font-subsets.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-scaled-font-subsets.Tpo $(DEPDIR)/libcairo_la-cairo-scaled-font-subsets.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-scaled-font-subsets.c' object='libcairo_la-cairo-scaled-font-subsets.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-scaled-font-subsets.lo `test -f 'cairo-scaled-font-subsets.c' || echo '$(srcdir)/'`cairo-scaled-font-subsets.c libcairo_la-cairo-type1-subset.lo: cairo-type1-subset.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-type1-subset.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-type1-subset.Tpo -c -o libcairo_la-cairo-type1-subset.lo `test -f 'cairo-type1-subset.c' || echo '$(srcdir)/'`cairo-type1-subset.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-type1-subset.Tpo $(DEPDIR)/libcairo_la-cairo-type1-subset.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-type1-subset.c' object='libcairo_la-cairo-type1-subset.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-type1-subset.lo `test -f 'cairo-type1-subset.c' || echo '$(srcdir)/'`cairo-type1-subset.c libcairo_la-test-fallback-surface.lo: test-fallback-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-test-fallback-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-test-fallback-surface.Tpo -c -o libcairo_la-test-fallback-surface.lo `test -f 'test-fallback-surface.c' || echo '$(srcdir)/'`test-fallback-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-test-fallback-surface.Tpo $(DEPDIR)/libcairo_la-test-fallback-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-fallback-surface.c' object='libcairo_la-test-fallback-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-test-fallback-surface.lo `test -f 'test-fallback-surface.c' || echo '$(srcdir)/'`test-fallback-surface.c libcairo_la-test-meta-surface.lo: test-meta-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-test-meta-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-test-meta-surface.Tpo -c -o libcairo_la-test-meta-surface.lo `test -f 'test-meta-surface.c' || echo '$(srcdir)/'`test-meta-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-test-meta-surface.Tpo $(DEPDIR)/libcairo_la-test-meta-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-meta-surface.c' object='libcairo_la-test-meta-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-test-meta-surface.lo `test -f 'test-meta-surface.c' || echo '$(srcdir)/'`test-meta-surface.c libcairo_la-test-paginated-surface.lo: test-paginated-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-test-paginated-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-test-paginated-surface.Tpo -c -o libcairo_la-test-paginated-surface.lo `test -f 'test-paginated-surface.c' || echo '$(srcdir)/'`test-paginated-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-test-paginated-surface.Tpo $(DEPDIR)/libcairo_la-test-paginated-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='test-paginated-surface.c' object='libcairo_la-test-paginated-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-test-paginated-surface.lo `test -f 'test-paginated-surface.c' || echo '$(srcdir)/'`test-paginated-surface.c libcairo_la-cairo-xlib-surface.lo: cairo-xlib-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-xlib-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-xlib-surface.Tpo -c -o libcairo_la-cairo-xlib-surface.lo `test -f 'cairo-xlib-surface.c' || echo '$(srcdir)/'`cairo-xlib-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-xlib-surface.Tpo $(DEPDIR)/libcairo_la-cairo-xlib-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-xlib-surface.c' object='libcairo_la-cairo-xlib-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-xlib-surface.lo `test -f 'cairo-xlib-surface.c' || echo '$(srcdir)/'`cairo-xlib-surface.c libcairo_la-cairo-xlib-display.lo: cairo-xlib-display.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-xlib-display.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-xlib-display.Tpo -c -o libcairo_la-cairo-xlib-display.lo `test -f 'cairo-xlib-display.c' || echo '$(srcdir)/'`cairo-xlib-display.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-xlib-display.Tpo $(DEPDIR)/libcairo_la-cairo-xlib-display.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-xlib-display.c' object='libcairo_la-cairo-xlib-display.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-xlib-display.lo `test -f 'cairo-xlib-display.c' || echo '$(srcdir)/'`cairo-xlib-display.c libcairo_la-cairo-xlib-screen.lo: cairo-xlib-screen.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-xlib-screen.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-xlib-screen.Tpo -c -o libcairo_la-cairo-xlib-screen.lo `test -f 'cairo-xlib-screen.c' || echo '$(srcdir)/'`cairo-xlib-screen.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-xlib-screen.Tpo $(DEPDIR)/libcairo_la-cairo-xlib-screen.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-xlib-screen.c' object='libcairo_la-cairo-xlib-screen.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-xlib-screen.lo `test -f 'cairo-xlib-screen.c' || echo '$(srcdir)/'`cairo-xlib-screen.c libcairo_la-cairo-xlib-visual.lo: cairo-xlib-visual.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-xlib-visual.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-xlib-visual.Tpo -c -o libcairo_la-cairo-xlib-visual.lo `test -f 'cairo-xlib-visual.c' || echo '$(srcdir)/'`cairo-xlib-visual.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-xlib-visual.Tpo $(DEPDIR)/libcairo_la-cairo-xlib-visual.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-xlib-visual.c' object='libcairo_la-cairo-xlib-visual.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-xlib-visual.lo `test -f 'cairo-xlib-visual.c' || echo '$(srcdir)/'`cairo-xlib-visual.c libcairo_la-cairo-xcb-surface.lo: cairo-xcb-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-xcb-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-xcb-surface.Tpo -c -o libcairo_la-cairo-xcb-surface.lo `test -f 'cairo-xcb-surface.c' || echo '$(srcdir)/'`cairo-xcb-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-xcb-surface.Tpo $(DEPDIR)/libcairo_la-cairo-xcb-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-xcb-surface.c' object='libcairo_la-cairo-xcb-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-xcb-surface.lo `test -f 'cairo-xcb-surface.c' || echo '$(srcdir)/'`cairo-xcb-surface.c libcairo_la-cairo-quartz-surface.lo: cairo-quartz-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-quartz-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-quartz-surface.Tpo -c -o libcairo_la-cairo-quartz-surface.lo `test -f 'cairo-quartz-surface.c' || echo '$(srcdir)/'`cairo-quartz-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-quartz-surface.Tpo $(DEPDIR)/libcairo_la-cairo-quartz-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-quartz-surface.c' object='libcairo_la-cairo-quartz-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-quartz-surface.lo `test -f 'cairo-quartz-surface.c' || echo '$(srcdir)/'`cairo-quartz-surface.c libcairo_la-cairo-quartz-image-surface.lo: cairo-quartz-image-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-quartz-image-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-quartz-image-surface.Tpo -c -o libcairo_la-cairo-quartz-image-surface.lo `test -f 'cairo-quartz-image-surface.c' || echo '$(srcdir)/'`cairo-quartz-image-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-quartz-image-surface.Tpo $(DEPDIR)/libcairo_la-cairo-quartz-image-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-quartz-image-surface.c' object='libcairo_la-cairo-quartz-image-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-quartz-image-surface.lo `test -f 'cairo-quartz-image-surface.c' || echo '$(srcdir)/'`cairo-quartz-image-surface.c libcairo_la-cairo-quartz-font.lo: cairo-quartz-font.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-quartz-font.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-quartz-font.Tpo -c -o libcairo_la-cairo-quartz-font.lo `test -f 'cairo-quartz-font.c' || echo '$(srcdir)/'`cairo-quartz-font.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-quartz-font.Tpo $(DEPDIR)/libcairo_la-cairo-quartz-font.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-quartz-font.c' object='libcairo_la-cairo-quartz-font.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-quartz-font.lo `test -f 'cairo-quartz-font.c' || echo '$(srcdir)/'`cairo-quartz-font.c libcairo_la-cairo-win32.lo: cairo-win32.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-win32.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-win32.Tpo -c -o libcairo_la-cairo-win32.lo `test -f 'cairo-win32.c' || echo '$(srcdir)/'`cairo-win32.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-win32.Tpo $(DEPDIR)/libcairo_la-cairo-win32.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-win32.c' object='libcairo_la-cairo-win32.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-win32.lo `test -f 'cairo-win32.c' || echo '$(srcdir)/'`cairo-win32.c libcairo_la-cairo-win32-surface.lo: cairo-win32-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-win32-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-win32-surface.Tpo -c -o libcairo_la-cairo-win32-surface.lo `test -f 'cairo-win32-surface.c' || echo '$(srcdir)/'`cairo-win32-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-win32-surface.Tpo $(DEPDIR)/libcairo_la-cairo-win32-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-win32-surface.c' object='libcairo_la-cairo-win32-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-win32-surface.lo `test -f 'cairo-win32-surface.c' || echo '$(srcdir)/'`cairo-win32-surface.c libcairo_la-cairo-win32-printing-surface.lo: cairo-win32-printing-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-win32-printing-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-win32-printing-surface.Tpo -c -o libcairo_la-cairo-win32-printing-surface.lo `test -f 'cairo-win32-printing-surface.c' || echo '$(srcdir)/'`cairo-win32-printing-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-win32-printing-surface.Tpo $(DEPDIR)/libcairo_la-cairo-win32-printing-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-win32-printing-surface.c' object='libcairo_la-cairo-win32-printing-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-win32-printing-surface.lo `test -f 'cairo-win32-printing-surface.c' || echo '$(srcdir)/'`cairo-win32-printing-surface.c libcairo_la-cairo-win32-font.lo: cairo-win32-font.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-win32-font.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-win32-font.Tpo -c -o libcairo_la-cairo-win32-font.lo `test -f 'cairo-win32-font.c' || echo '$(srcdir)/'`cairo-win32-font.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-win32-font.Tpo $(DEPDIR)/libcairo_la-cairo-win32-font.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-win32-font.c' object='libcairo_la-cairo-win32-font.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-win32-font.lo `test -f 'cairo-win32-font.c' || echo '$(srcdir)/'`cairo-win32-font.c libcairo_la-cairo-os2-surface.lo: cairo-os2-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-os2-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-os2-surface.Tpo -c -o libcairo_la-cairo-os2-surface.lo `test -f 'cairo-os2-surface.c' || echo '$(srcdir)/'`cairo-os2-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-os2-surface.Tpo $(DEPDIR)/libcairo_la-cairo-os2-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-os2-surface.c' object='libcairo_la-cairo-os2-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-os2-surface.lo `test -f 'cairo-os2-surface.c' || echo '$(srcdir)/'`cairo-os2-surface.c libcairo_la-cairo-glitz-surface.lo: cairo-glitz-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-glitz-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-glitz-surface.Tpo -c -o libcairo_la-cairo-glitz-surface.lo `test -f 'cairo-glitz-surface.c' || echo '$(srcdir)/'`cairo-glitz-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-glitz-surface.Tpo $(DEPDIR)/libcairo_la-cairo-glitz-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-glitz-surface.c' object='libcairo_la-cairo-glitz-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-glitz-surface.lo `test -f 'cairo-glitz-surface.c' || echo '$(srcdir)/'`cairo-glitz-surface.c libcairo_la-cairo-directfb-surface.lo: cairo-directfb-surface.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-directfb-surface.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-directfb-surface.Tpo -c -o libcairo_la-cairo-directfb-surface.lo `test -f 'cairo-directfb-surface.c' || echo '$(srcdir)/'`cairo-directfb-surface.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-directfb-surface.Tpo $(DEPDIR)/libcairo_la-cairo-directfb-surface.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-directfb-surface.c' object='libcairo_la-cairo-directfb-surface.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-directfb-surface.lo `test -f 'cairo-directfb-surface.c' || echo '$(srcdir)/'`cairo-directfb-surface.c libcairo_la-cairo-ft-font.lo: cairo-ft-font.c @am__fastdepCC_TRUE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -MT libcairo_la-cairo-ft-font.lo -MD -MP -MF $(DEPDIR)/libcairo_la-cairo-ft-font.Tpo -c -o libcairo_la-cairo-ft-font.lo `test -f 'cairo-ft-font.c' || echo '$(srcdir)/'`cairo-ft-font.c @am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/libcairo_la-cairo-ft-font.Tpo $(DEPDIR)/libcairo_la-cairo-ft-font.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='cairo-ft-font.c' object='libcairo_la-cairo-ft-font.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcairo_la_CFLAGS) $(CFLAGS) -c -o libcairo_la-cairo-ft-font.lo `test -f 'cairo-ft-font.c' || echo '$(srcdir)/'`cairo-ft-font.c mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) set x; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-TESTS: $(TESTS) @failed=0; all=0; xfail=0; xpass=0; skip=0; \ srcdir=$(srcdir); export srcdir; \ list=' $(TESTS) '; \ $(am__tty_colors); \ if test -n "$$list"; then \ for tst in $$list; do \ if test -f ./$$tst; then dir=./; \ elif test -f $$tst; then dir=; \ else dir="$(srcdir)/"; fi; \ if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xpass=`expr $$xpass + 1`; \ failed=`expr $$failed + 1`; \ col=$$red; res=XPASS; \ ;; \ *) \ col=$$grn; res=PASS; \ ;; \ esac; \ elif test $$? -ne 77; then \ all=`expr $$all + 1`; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$tst[\ \ ]*) \ xfail=`expr $$xfail + 1`; \ col=$$lgn; res=XFAIL; \ ;; \ *) \ failed=`expr $$failed + 1`; \ col=$$red; res=FAIL; \ ;; \ esac; \ else \ skip=`expr $$skip + 1`; \ col=$$blu; res=SKIP; \ fi; \ echo "$${col}$$res$${std}: $$tst"; \ done; \ if test "$$all" -eq 1; then \ tests="test"; \ All=""; \ else \ tests="tests"; \ All="All "; \ fi; \ if test "$$failed" -eq 0; then \ if test "$$xfail" -eq 0; then \ banner="$$All$$all $$tests passed"; \ else \ if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ fi; \ else \ if test "$$xpass" -eq 0; then \ banner="$$failed of $$all $$tests failed"; \ else \ if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ fi; \ fi; \ dashes="$$banner"; \ skipped=""; \ if test "$$skip" -ne 0; then \ if test "$$skip" -eq 1; then \ skipped="($$skip test was not run)"; \ else \ skipped="($$skip tests were not run)"; \ fi; \ test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$skipped"; \ fi; \ report=""; \ if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ report="Please report to $(PACKAGE_BUGREPORT)"; \ test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ dashes="$$report"; \ fi; \ dashes=`echo "$$dashes" | sed s/./=/g`; \ if test "$$failed" -eq 0; then \ col="$$grn"; \ else \ col="$$red"; \ fi; \ echo "$${col}$$dashes$${std}"; \ echo "$${col}$$banner$${std}"; \ test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \ test -z "$$report" || echo "$${col}$$report$${std}"; \ echo "$${col}$$dashes$${std}"; \ test "$$failed" -eq 0; \ else :; fi distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-data-local install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \ clean-generic clean-libtool clean-noinstLTLIBRARIES ctags \ distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-data-local install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags uninstall uninstall-am $(backend_pkgconfigs): $(top_srcdir)/configure cd $(top_builddir) && ./config.status --recheck $(top_builddir)/config.h: $(top_srcdir)/config.h.in cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h cairo-features.h cairo-no-features.h: cd $(top_builddir) && ./config.status src/$@ cairo.def: $(cairo_headers) cairo-features.h @echo Generating $@ @(echo EXPORTS; \ (cd $(srcdir); cat $(cairo_headers) || echo 'cairo_ERROR ()' ) | \ grep -v -E '^# *include' | \ ( gcc -include cairo-features.h -E - || echo 'cairo_ERROR ()' ) | \ grep -E '^cairo_.* \(' | \ sed -e 's/[ ].*//' | \ sort; \ echo LIBRARY libcairo-$(LT_CURRENT_MINUS_AGE).dll; \ ) >$@ @ ! grep -q cairo_ERROR $@ || ($(RM) $@; false) install-data-local: @if test -f "$(DESTDIR)$(includedir)/cairo.h" || test -f "$(DESTDIR)$(includedir)/cairo-features.h" ; then \ echo "****************************************************************" ; \ echo "*** Error: Old headers found. You should remove the following" ; \ echo "*** files and then type 'make install' again." ; \ ls $(includedir)/cairo*.h ; \ echo "****************************************************************" ; \ false ; \ fi # The pre-processed result is used by check-{def,plt}.sh to determine whether # cairo has been compiled with symbol hiding. .c.i: $(noinst_HEADERS) $(nodist_noinst_HEADERS) cairoint.h $(top_builddir)/config.h $(CPP) -DHAVE_CONFIG_H -I$(top_builddir) -I. $(libcairo_la_CFLAGS) $< -o $@ sparse: @status=true; for f in $(cairo_sources); do \ echo sparse $$f; \ $(SPARSE) -I$(top_builddir) $(libcairo_la_CFLAGS) -DHAVE_CONFIG_H $$f || status=false; \ done; $$status splint: @status=true; for f in $(cairo_sources); do \ test "$$f" = "`echo "$$f" | sed 's/[.]h$$//'`" || continue; \ echo sparse $$f; \ $(SPLINT) -I$(top_builddir) $(libcairo_la_CFLAGS) -DHAVE_CONFIG_H $$f || status=false; \ done; $$status # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: libgdiplus-2.11/cairo/src/cairo-clip-private.h0000664000175000017500000001041412225470167016253 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg */ #ifndef CAIRO_CLIP_PRIVATE_H #define CAIRO_CLIP_PRIVATE_H #include "cairo-compiler-private.h" #include "cairo-path-fixed-private.h" extern const cairo_private cairo_rectangle_list_t _cairo_rectangles_nil; struct _cairo_clip_path { cairo_reference_count_t ref_count; cairo_path_fixed_t path; cairo_fill_rule_t fill_rule; double tolerance; cairo_antialias_t antialias; cairo_clip_path_t *prev; }; struct _cairo_clip { cairo_clip_mode_t mode; cairo_bool_t all_clipped; /* * Mask-based clipping for cases where the backend * clipping isn't sufficiently able. * * The rectangle here represents the * portion of the destination surface that this * clip surface maps to, it does not * represent the extents of the clip region or * clip paths */ cairo_surface_t *surface; cairo_rectangle_int_t surface_rect; /* * Surface clip serial number to store * in the surface when this clip is set */ unsigned int serial; /* * A clip region that can be placed in the surface */ cairo_region_t region; cairo_bool_t has_region; /* * If the surface supports path clipping, we store the list of * clipping paths that has been set here as a linked list. */ cairo_clip_path_t *path; }; cairo_private void _cairo_clip_init (cairo_clip_t *clip, cairo_surface_t *target); cairo_private cairo_status_t _cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other); cairo_private cairo_status_t _cairo_clip_init_deep_copy (cairo_clip_t *clip, cairo_clip_t *other, cairo_surface_t *target); cairo_private void _cairo_clip_reset (cairo_clip_t *clip); cairo_private cairo_status_t _cairo_clip_clip (cairo_clip_t *clip, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias, cairo_surface_t *target); cairo_private cairo_status_t _cairo_clip_intersect_to_rectangle (cairo_clip_t *clip, cairo_rectangle_int_t *rectangle); cairo_private cairo_status_t _cairo_clip_intersect_to_region (cairo_clip_t *clip, cairo_region_t *region); cairo_private cairo_status_t _cairo_clip_combine_to_surface (cairo_clip_t *clip, cairo_operator_t op, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents); cairo_private void _cairo_clip_translate (cairo_clip_t *clip, cairo_fixed_t tx, cairo_fixed_t ty); cairo_private cairo_rectangle_list_t* _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate); #endif /* CAIRO_CLIP_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-glitz-private.h0000664000175000017500000000313012225470167016452 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. */ #ifndef CAIRO_GLITZ_PRIVATE_H #define CAIRO_GLITZ_PRIVATE_H #include "cairoint.h" #include "cairo-glitz.h" slim_hidden_proto (cairo_glitz_surface_create); #endif /* CAIRO_GLITZ_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-color.c0000664000175000017500000001145012225470167014766 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" static cairo_color_t const cairo_color_white = { 1.0, 1.0, 1.0, 1.0, 0xffff, 0xffff, 0xffff, 0xffff }; static cairo_color_t const cairo_color_black = { 0.0, 0.0, 0.0, 1.0, 0x0, 0x0, 0x0, 0xffff }; static cairo_color_t const cairo_color_transparent = { 0.0, 0.0, 0.0, 0.0, 0x0, 0x0, 0x0, 0x0 }; static cairo_color_t const cairo_color_magenta = { 1.0, 0.0, 1.0, 1.0, 0xffff, 0x0, 0xffff, 0xffff }; const cairo_color_t * _cairo_stock_color (cairo_stock_t stock) { switch (stock) { case CAIRO_STOCK_WHITE: return &cairo_color_white; case CAIRO_STOCK_BLACK: return &cairo_color_black; case CAIRO_STOCK_TRANSPARENT: return &cairo_color_transparent; } ASSERT_NOT_REACHED; /* If the user can get here somehow, give a color that indicates a * problem. */ return &cairo_color_magenta; } void _cairo_color_init (cairo_color_t *color) { *color = cairo_color_white; } void _cairo_color_init_rgb (cairo_color_t *color, double red, double green, double blue) { _cairo_color_init_rgba (color, red, green, blue, 1.0); } /* Convert a double in [0.0, 1.0] to an integer in [0, 65535] * The conversion is designed to divide the input range into 65536 * equally-sized regions. This is achieved by multiplying by 65536 and * then special-casing the result of an input value of 1.0 so that it * maps to 65535 instead of 65536. */ uint16_t _cairo_color_double_to_short (double d) { uint32_t i; i = (uint32_t) (d * 65536); i -= (i >> 16); return i; } static void _cairo_color_compute_shorts (cairo_color_t *color) { color->red_short = _cairo_color_double_to_short (color->red * color->alpha); color->green_short = _cairo_color_double_to_short (color->green * color->alpha); color->blue_short = _cairo_color_double_to_short (color->blue * color->alpha); color->alpha_short = _cairo_color_double_to_short (color->alpha); } void _cairo_color_init_rgba (cairo_color_t *color, double red, double green, double blue, double alpha) { color->red = red; color->green = green; color->blue = blue; color->alpha = alpha; _cairo_color_compute_shorts (color); } void _cairo_color_multiply_alpha (cairo_color_t *color, double alpha) { color->alpha *= alpha; _cairo_color_compute_shorts (color); } void _cairo_color_get_rgba (cairo_color_t *color, double *red, double *green, double *blue, double *alpha) { *red = color->red; *green = color->green; *blue = color->blue; *alpha = color->alpha; } void _cairo_color_get_rgba_premultiplied (cairo_color_t *color, double *red, double *green, double *blue, double *alpha) { *red = color->red * color->alpha; *green = color->green * color->alpha; *blue = color->blue * color->alpha; *alpha = color->alpha; } cairo_bool_t _cairo_color_equal (const cairo_color_t *color_a, const cairo_color_t *color_b) { return color_a->red_short == color_b->red_short && color_a->green_short == color_b->green_short && color_a->blue_short == color_b->blue_short && color_a->alpha_short == color_b->alpha_short; } libgdiplus-2.11/cairo/src/cairo-xlib-display.c0000664000175000017500000003260112225470167016252 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Chris Wilson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Chris Wilson. * */ #include "cairoint.h" #include "cairo-xlib-private.h" #include "cairo-xlib-xrender-private.h" #include #include /* For XESetCloseDisplay */ typedef int (*cairo_xlib_error_func_t) (Display *display, XErrorEvent *event); struct _cairo_xlib_job { cairo_xlib_job_t *next; enum { RESOURCE, WORK } type; union { struct { cairo_xlib_notify_resource_func notify; XID xid; } resource; struct { cairo_xlib_notify_func notify; void *data; void (*destroy) (void *); } work; } func; }; static cairo_xlib_display_t *_cairo_xlib_display_list; static void _cairo_xlib_call_close_display_hooks (cairo_xlib_display_t *display) { cairo_xlib_screen_info_t *screen; cairo_xlib_hook_t *hooks, *list; /* call all registered shutdown routines */ CAIRO_MUTEX_LOCK (display->mutex); for (screen = display->screens; screen != NULL; screen = screen->next) _cairo_xlib_screen_info_close_display (screen); hooks = display->close_display_hooks; while (hooks != NULL) { display->close_display_hooks = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); list = hooks; do { cairo_xlib_hook_t *hook = list; list = hook->next; hook->func (display->display, hook->data); } while (list != NULL); CAIRO_MUTEX_LOCK (display->mutex); do { cairo_xlib_hook_t *hook = hooks; hooks = hook->next; _cairo_freelist_free (&display->hook_freelist, hook); } while (hooks != NULL); hooks = display->close_display_hooks; } display->closed = TRUE; CAIRO_MUTEX_UNLOCK (display->mutex); } static void _cairo_xlib_display_discard_screens (cairo_xlib_display_t *display) { cairo_xlib_screen_info_t *screens; CAIRO_MUTEX_LOCK (display->mutex); screens = display->screens; display->screens = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); while (screens != NULL) { cairo_xlib_screen_info_t *screen = screens; screens = screen->next; _cairo_xlib_screen_info_destroy (screen); } } cairo_xlib_display_t * _cairo_xlib_display_reference (cairo_xlib_display_t *display) { assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&display->ref_count)); _cairo_reference_count_inc (&display->ref_count); return display; } void _cairo_xlib_display_destroy (cairo_xlib_display_t *display) { assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&display->ref_count)); if (! _cairo_reference_count_dec_and_test (&display->ref_count)) return; /* destroy all outstanding notifies */ while (display->workqueue != NULL) { cairo_xlib_job_t *job = display->workqueue; display->workqueue = job->next; if (job->type == WORK && job->func.work.destroy != NULL) job->func.work.destroy (job->func.work.data); _cairo_freelist_free (&display->wq_freelist, job); } _cairo_freelist_fini (&display->wq_freelist); _cairo_freelist_fini (&display->hook_freelist); CAIRO_MUTEX_FINI (display->mutex); free (display); } static int _noop_error_handler (Display *display, XErrorEvent *event) { return False; /* return value is ignored */ } static int _cairo_xlib_close_display (Display *dpy, XExtCodes *codes) { cairo_xlib_display_t *display, **prev, *next; cairo_xlib_error_func_t old_handler; CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); for (display = _cairo_xlib_display_list; display; display = display->next) if (display->display == dpy) break; CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); if (display == NULL) return 0; /* protect the notifies from triggering XErrors */ XSync (dpy, False); old_handler = XSetErrorHandler (_noop_error_handler); _cairo_xlib_display_notify (display); _cairo_xlib_call_close_display_hooks (display); _cairo_xlib_display_discard_screens (display); /* catch any that arrived before marking the display as closed */ _cairo_xlib_display_notify (display); XSync (dpy, False); XSetErrorHandler (old_handler); /* * Unhook from the global list */ CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); prev = &_cairo_xlib_display_list; for (display = _cairo_xlib_display_list; display; display = next) { next = display->next; if (display->display == dpy) { *prev = next; break; } else prev = &display->next; } CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); assert (display != NULL); _cairo_xlib_display_destroy (display); /* Return value in accordance with requirements of * XESetCloseDisplay */ return 0; } cairo_xlib_display_t * _cairo_xlib_display_get (Display *dpy) { cairo_xlib_display_t *display; cairo_xlib_display_t **prev; XExtCodes *codes; int major_unused, minor_unused; /* There is an apparent deadlock between this mutex and the * mutex for the display, but it's actually safe. For the * app to call XCloseDisplay() while any other thread is * inside this function would be an error in the logic * app, and the CloseDisplay hook is the only other place we * acquire this mutex. */ CAIRO_MUTEX_LOCK (_cairo_xlib_display_mutex); for (prev = &_cairo_xlib_display_list; (display = *prev); prev = &(*prev)->next) { if (display->display == dpy) { /* * MRU the list */ if (prev != &_cairo_xlib_display_list) { *prev = display->next; display->next = _cairo_xlib_display_list; _cairo_xlib_display_list = display; } break; } } if (display != NULL) { display = _cairo_xlib_display_reference (display); goto UNLOCK; } display = malloc (sizeof (cairo_xlib_display_t)); if (display == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); goto UNLOCK; } /* Xlib calls out to the extension close_display hooks in LIFO * order. So we have to ensure that all extensions that we depend * on in our close_display hook are properly initialized before we * add our hook. For now, that means Render, so we call into its * QueryVersion function to ensure it gets initialized. */ XRenderQueryVersion (dpy, &major_unused, &minor_unused); codes = XAddExtension (dpy); if (codes == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); free (display); display = NULL; goto UNLOCK; } XESetCloseDisplay (dpy, codes->extension, _cairo_xlib_close_display); _cairo_freelist_init (&display->wq_freelist, sizeof (cairo_xlib_job_t)); _cairo_freelist_init (&display->hook_freelist, sizeof (cairo_xlib_hook_t)); CAIRO_REFERENCE_COUNT_INIT (&display->ref_count, 2); /* add one for the CloseDisplay */ CAIRO_MUTEX_INIT (display->mutex); display->display = dpy; display->screens = NULL; display->workqueue = NULL; display->close_display_hooks = NULL; display->closed = FALSE; display->buggy_repeat = FALSE; if (strstr (ServerVendor (dpy), "X.Org") != NULL) { /* When modularized, the X.Org server VendorRelease was * bogusly reset to a very small number, without any change in * the ServerVendor string. We avoid considering the new * servers with the small number as buggy by restricting the * test to known bad releases. But there could be a problem * again in the future if X.Org server versions ever climb * back up to 6.7 or 6.8. */ if (VendorRelease (dpy) >= 60700000 && VendorRelease (dpy) <= 60802000) display->buggy_repeat = TRUE; /* But even the new modular server has bugs, (bad enough to * crash the X server), that it so happens we can avoid with * the exact same buggy_repeat workaround. We've verified that * this bug exists as least as late as version 1.3.0.0, (which * is in Fedora 8), and is gone again in version 1.4.99.901 * (from a Fedora 9 Beta). Versions between those are still * unknown, but until we learn more, we'll assume that any 1.3 * version is buggy. */ if (VendorRelease (dpy) < 10400000) display->buggy_repeat = TRUE; } else if (strstr (ServerVendor (dpy), "XFree86") != NULL) { if (VendorRelease (dpy) <= 40500000) display->buggy_repeat = TRUE; } display->next = _cairo_xlib_display_list; _cairo_xlib_display_list = display; UNLOCK: CAIRO_MUTEX_UNLOCK (_cairo_xlib_display_mutex); return display; } cairo_bool_t _cairo_xlib_add_close_display_hook (Display *dpy, void (*func) (Display *, void *), void *data, const void *key) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook; cairo_bool_t ret = FALSE; display = _cairo_xlib_display_get (dpy); if (display == NULL) return FALSE; CAIRO_MUTEX_LOCK (display->mutex); if (display->closed == FALSE) { hook = _cairo_freelist_alloc (&display->hook_freelist); if (hook != NULL) { hook->func = func; hook->data = data; hook->key = key; hook->next = display->close_display_hooks; display->close_display_hooks = hook; ret = TRUE; } } CAIRO_MUTEX_UNLOCK (display->mutex); _cairo_xlib_display_destroy (display); return ret; } void _cairo_xlib_remove_close_display_hooks (Display *dpy, const void *key) { cairo_xlib_display_t *display; cairo_xlib_hook_t *hook, *next, **prev; display = _cairo_xlib_display_get (dpy); if (display == NULL) return; CAIRO_MUTEX_LOCK (display->mutex); prev = &display->close_display_hooks; for (hook = display->close_display_hooks; hook != NULL; hook = next) { next = hook->next; if (hook->key == key) { *prev = hook->next; _cairo_freelist_free (&display->hook_freelist, hook); } else prev = &hook->next; } *prev = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); _cairo_xlib_display_destroy (display); } cairo_status_t _cairo_xlib_display_queue_resource (cairo_xlib_display_t *display, cairo_xlib_notify_resource_func notify, XID xid) { cairo_xlib_job_t *job; cairo_status_t status = CAIRO_STATUS_NO_MEMORY; CAIRO_MUTEX_LOCK (display->mutex); if (display->closed == FALSE) { job = _cairo_freelist_alloc (&display->wq_freelist); if (job != NULL) { job->type = RESOURCE; job->func.resource.xid = xid; job->func.resource.notify = notify; job->next = display->workqueue; display->workqueue = job; status = CAIRO_STATUS_SUCCESS; } } CAIRO_MUTEX_UNLOCK (display->mutex); return status; } cairo_status_t _cairo_xlib_display_queue_work (cairo_xlib_display_t *display, cairo_xlib_notify_func notify, void *data, void (*destroy) (void *)) { cairo_xlib_job_t *job; cairo_status_t status = CAIRO_STATUS_NO_MEMORY; CAIRO_MUTEX_LOCK (display->mutex); if (display->closed == FALSE) { job = _cairo_freelist_alloc (&display->wq_freelist); if (job != NULL) { job->type = WORK; job->func.work.data = data; job->func.work.notify = notify; job->func.work.destroy = destroy; job->next = display->workqueue; display->workqueue = job; status = CAIRO_STATUS_SUCCESS; } } CAIRO_MUTEX_UNLOCK (display->mutex); return status; } void _cairo_xlib_display_notify (cairo_xlib_display_t *display) { cairo_xlib_job_t *jobs, *job, *freelist; Display *dpy = display->display; CAIRO_MUTEX_LOCK (display->mutex); jobs = display->workqueue; while (jobs != NULL) { display->workqueue = NULL; CAIRO_MUTEX_UNLOCK (display->mutex); /* reverse the list to obtain FIFO order */ job = NULL; do { cairo_xlib_job_t *next = jobs->next; jobs->next = job; job = jobs; jobs = next; } while (jobs != NULL); freelist = jobs = job; do { job = jobs; jobs = job->next; switch (job->type){ case WORK: job->func.work.notify (dpy, job->func.work.data); if (job->func.work.destroy != NULL) job->func.work.destroy (job->func.work.data); break; case RESOURCE: job->func.resource.notify (dpy, job->func.resource.xid); break; } } while (jobs != NULL); CAIRO_MUTEX_LOCK (display->mutex); do { job = freelist; freelist = job->next; _cairo_freelist_free (&display->wq_freelist, job); } while (freelist != NULL); jobs = display->workqueue; } CAIRO_MUTEX_UNLOCK (display->mutex); } libgdiplus-2.11/cairo/src/cairo-bentley-ottmann.c0000664000175000017500000014707612225470167017006 00000000000000/* * Copyright © 2004 Carl Worth * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Carl Worth * * Contributor(s): * Carl D. Worth */ /* Provide definitions for standalone compilation */ #include "cairoint.h" #include "cairo-skiplist-private.h" #include "cairo-freelist-private.h" typedef cairo_point_t cairo_bo_point32_t; typedef struct _cairo_bo_point128 { cairo_int128_t x; cairo_int128_t y; } cairo_bo_point128_t; typedef struct _cairo_bo_intersect_ordinate { int32_t ordinate; enum { EXACT, INEXACT } exactness; } cairo_bo_intersect_ordinate_t; typedef struct _cairo_bo_intersect_point { cairo_bo_intersect_ordinate_t x; cairo_bo_intersect_ordinate_t y; } cairo_bo_intersect_point_t; typedef struct _cairo_bo_edge cairo_bo_edge_t; typedef struct _sweep_line_elt sweep_line_elt_t; typedef struct _cairo_bo_trap cairo_bo_trap_t; typedef struct _cairo_bo_traps cairo_bo_traps_t; /* A deferred trapezoid of an edge. */ struct _cairo_bo_trap { cairo_bo_edge_t *right; int32_t top; }; struct _cairo_bo_traps { cairo_traps_t *traps; cairo_freelist_t freelist; /* These form the closed bounding box of the original input * points. */ cairo_fixed_t xmin; cairo_fixed_t ymin; cairo_fixed_t xmax; cairo_fixed_t ymax; }; struct _cairo_bo_edge { cairo_bo_point32_t top; cairo_bo_point32_t middle; cairo_bo_point32_t bottom; cairo_bool_t reversed; cairo_bo_edge_t *prev; cairo_bo_edge_t *next; cairo_bo_trap_t *deferred_trap; sweep_line_elt_t *sweep_line_elt; }; struct _sweep_line_elt { cairo_bo_edge_t *edge; skip_elt_t elt; }; #define SKIP_ELT_TO_EDGE_ELT(elt) SKIP_LIST_ELT_TO_DATA (sweep_line_elt_t, (elt)) #define SKIP_ELT_TO_EDGE(elt) (SKIP_ELT_TO_EDGE_ELT (elt)->edge) typedef enum { CAIRO_BO_STATUS_INTERSECTION, CAIRO_BO_STATUS_PARALLEL, CAIRO_BO_STATUS_NO_INTERSECTION } cairo_bo_status_t; typedef enum { CAIRO_BO_EVENT_TYPE_START, CAIRO_BO_EVENT_TYPE_STOP, CAIRO_BO_EVENT_TYPE_INTERSECTION } cairo_bo_event_type_t; typedef struct _cairo_bo_event { cairo_bo_event_type_t type; cairo_bo_edge_t *e1; cairo_bo_edge_t *e2; cairo_bo_point32_t point; skip_elt_t elt; } cairo_bo_event_t; #define SKIP_ELT_TO_EVENT(elt) SKIP_LIST_ELT_TO_DATA (cairo_bo_event_t, (elt)) typedef struct _cairo_bo_event_queue { cairo_skip_list_t intersection_queue; cairo_bo_event_t *startstop_events; cairo_bo_event_t **sorted_startstop_event_ptrs; unsigned next_startstop_event_index; unsigned num_startstop_events; } cairo_bo_event_queue_t; /* This structure extends #cairo_skip_list_t, which must come first. */ typedef struct _cairo_bo_sweep_line { cairo_skip_list_t active_edges; cairo_bo_edge_t *head; cairo_bo_edge_t *tail; int32_t current_y; } cairo_bo_sweep_line_t; static inline int _cairo_bo_point32_compare (cairo_bo_point32_t const *a, cairo_bo_point32_t const *b) { int cmp = a->y - b->y; if (cmp) return cmp; return a->x - b->x; } /* Compare the slope of a to the slope of b, returning 1, 0, -1 if the * slope a is respectively greater than, equal to, or less than the * slope of b. * * For each edge, consider the direction vector formed from: * * top -> bottom * * which is: * * (dx, dy) = (bottom.x - top.x, bottom.y - top.y) * * We then define the slope of each edge as dx/dy, (which is the * inverse of the slope typically used in math instruction). We never * compute a slope directly as the value approaches infinity, but we * can derive a slope comparison without division as follows, (where * the ? represents our compare operator). * * 1. slope(a) ? slope(b) * 2. adx/ady ? bdx/bdy * 3. (adx * bdy) ? (bdx * ady) * * Note that from step 2 to step 3 there is no change needed in the * sign of the result since both ady and bdy are guaranteed to be * greater than or equal to 0. * * When using this slope comparison to sort edges, some care is needed * when interpreting the results. Since the slope compare operates on * distance vectors from top to bottom it gives a correct left to * right sort for edges that have a common top point, (such as two * edges with start events at the same location). On the other hand, * the sense of the result will be exactly reversed for two edges that * have a common stop point. */ static int _slope_compare (cairo_bo_edge_t *a, cairo_bo_edge_t *b) { /* XXX: We're assuming here that dx and dy will still fit in 32 * bits. That's not true in general as there could be overflow. We * should prevent that before the tessellation algorithm * begins. */ int32_t adx = a->bottom.x - a->top.x; int32_t bdx = b->bottom.x - b->top.x; /* Since the dy's are all positive by construction we can fast * path the case where the two edges point in different directions * with respect to x. */ if ((adx ^ bdx) < 0) { return adx < 0 ? -1 : +1; } else { int32_t ady = a->bottom.y - a->top.y; int32_t bdy = b->bottom.y - b->top.y; int64_t adx_bdy = _cairo_int32x32_64_mul (adx, bdy); int64_t bdx_ady = _cairo_int32x32_64_mul (bdx, ady); /* if (adx * bdy > bdx * ady) */ if (_cairo_int64_gt (adx_bdy, bdx_ady)) return 1; /* if (adx * bdy < bdx * ady) */ if (_cairo_int64_lt (adx_bdy, bdx_ady)) return -1; return 0; } } static cairo_quorem64_t edge_x_for_y (cairo_bo_edge_t *edge, int32_t y) { /* XXX: We're assuming here that dx and dy will still fit in 32 * bits. That's not true in general as there could be overflow. We * should prevent that before the tessellation algorithm * begins. */ int32_t dx = edge->bottom.x - edge->top.x; int32_t dy = edge->bottom.y - edge->top.y; int64_t numerator; cairo_quorem64_t quorem; if (edge->middle.y == y) { quorem.quo = edge->middle.x; quorem.rem = 0; return quorem; } if (edge->bottom.y == y) { quorem.quo = edge->bottom.x; quorem.rem = 0; return quorem; } if (dy == 0) { quorem.quo = _cairo_int32_to_int64 (edge->top.x); quorem.rem = 0; return quorem; } /* edge->top.x + (y - edge->top.y) * dx / dy */ numerator = _cairo_int32x32_64_mul ((y - edge->top.y), dx); quorem = _cairo_int64_divrem (numerator, dy); quorem.quo += edge->top.x; return quorem; } static int _cairo_bo_sweep_line_compare_edges (cairo_bo_sweep_line_t *sweep_line, cairo_bo_edge_t *a, cairo_bo_edge_t *b) { cairo_quorem64_t ax; cairo_quorem64_t bx; int cmp; if (a == b) return 0; /* don't bother solving for abscissa if the edges' bounding boxes * can be used to order them. */ { int32_t amin, amax; int32_t bmin, bmax; if (a->middle.x < a->bottom.x) { amin = a->middle.x; amax = a->bottom.x; } else { amin = a->bottom.x; amax = a->middle.x; } if (b->middle.x < b->bottom.x) { bmin = b->middle.x; bmax = b->bottom.x; } else { bmin = b->bottom.x; bmax = b->middle.x; } if (amax < bmin) return -1; if (amin > bmax) return +1; } ax = edge_x_for_y (a, sweep_line->current_y); bx = edge_x_for_y (b, sweep_line->current_y); if (ax.quo > bx.quo) return 1; else if (ax.quo < bx.quo) return -1; /* Quotients are identical, test remainder. */ if (ax.rem > bx.rem) return 1; else if (ax.rem < bx.rem) return -1; /* The two edges intersect exactly at y, so fall back on slope * comparison. We know that this compare_edges function will be * called only when starting a new edge, (not when stopping an * edge), so we don't have to worry about conditionally inverting * the sense of _slope_compare. */ cmp = _slope_compare (a, b); if (cmp) return cmp; /* We've got two collinear edges now. */ /* Since we're dealing with start events, prefer comparing top * edges before bottom edges. */ cmp = _cairo_bo_point32_compare (&a->top, &b->top); if (cmp) return cmp; cmp = _cairo_bo_point32_compare (&a->bottom, &b->bottom); if (cmp) return cmp; /* Finally, we've got two identical edges. Let's finally * discriminate by a simple pointer comparison, (which works only * because we "know" the edges are all in a single array and don't * move. */ if (a > b) return 1; else return -1; } static int _sweep_line_elt_compare (void *list, void *a, void *b) { cairo_bo_sweep_line_t *sweep_line = list; sweep_line_elt_t *edge_elt_a = a; sweep_line_elt_t *edge_elt_b = b; return _cairo_bo_sweep_line_compare_edges (sweep_line, edge_elt_a->edge, edge_elt_b->edge); } static inline int cairo_bo_event_compare (cairo_bo_event_t const *a, cairo_bo_event_t const *b) { int cmp; /* The major motion of the sweep line is vertical (top-to-bottom), * and the minor motion is horizontal (left-to-right), dues to the * infinitesimal tilt rule. * * Our point comparison function respects these rules. */ cmp = _cairo_bo_point32_compare (&a->point, &b->point); if (cmp) return cmp; /* The events share a common point, so further discrimination is * determined by the event type. Due to the infinitesimal * shortening rule, stop events come first, then intersection * events, then start events. */ if (a->type != b->type) { if (a->type == CAIRO_BO_EVENT_TYPE_STOP) return -1; if (a->type == CAIRO_BO_EVENT_TYPE_START) return 1; if (b->type == CAIRO_BO_EVENT_TYPE_STOP) return 1; if (b->type == CAIRO_BO_EVENT_TYPE_START) return -1; } /* At this stage we are looking at two events of the same type at * the same point. The final sort key is a slope comparison. We * need a different sense for start and stop events based on the * shortening rule. * * Note: Fortunately, we get to ignore errors in the relative * ordering of intersection events. This means we don't even have * to look at e2 here, nor worry about which sense of the slope * comparison test is used for intersection events. */ cmp = _slope_compare (a->e1, b->e1); if (cmp) { if (a->type == CAIRO_BO_EVENT_TYPE_START) return cmp; else return - cmp; } /* Next look at the opposite point. This leaves ambiguities only * for identical edges. */ if (a->type == CAIRO_BO_EVENT_TYPE_START) { cmp = _cairo_bo_point32_compare (&b->e1->bottom, &a->e1->bottom); if (cmp) return cmp; } else if (a->type == CAIRO_BO_EVENT_TYPE_STOP) { cmp = _cairo_bo_point32_compare (&a->e1->top, &b->e1->top); if (cmp) return cmp; } else { /* CAIRO_BO_EVENT_TYPE_INTERSECT */ /* For two intersection events at the identical point, we * don't care what order they sort in, but we do care that we * have a stable sort. In particular intersections between * different pairs of edges must never return 0. */ cmp = _cairo_bo_point32_compare (&a->e2->top, &b->e2->top); if (cmp) return cmp; cmp = _cairo_bo_point32_compare (&a->e2->bottom, &b->e2->bottom); if (cmp) return cmp; cmp = _cairo_bo_point32_compare (&a->e1->top, &b->e1->top); if (cmp) return cmp; cmp = _cairo_bo_point32_compare (&a->e1->bottom, &b->e1->bottom); if (cmp) return cmp; } /* Discrimination based on the edge pointers. */ if (a->e1 < b->e1) return -1; if (a->e1 > b->e1) return +1; if (a->e2 < b->e2) return -1; if (a->e2 > b->e2) return +1; return 0; } static int cairo_bo_event_compare_abstract (void *list, void *a, void *b) { cairo_bo_event_t *event_a = a; cairo_bo_event_t *event_b = b; return cairo_bo_event_compare (event_a, event_b); } static int cairo_bo_event_compare_pointers (void const *voida, void const *voidb) { cairo_bo_event_t const * const *a = voida; cairo_bo_event_t const * const *b = voidb; if (*a != *b) { int cmp = cairo_bo_event_compare (*a, *b); if (cmp) return cmp; if (*a < *b) return -1; if (*a > *b) return +1; } return 0; } static inline cairo_int64_t det32_64 (int32_t a, int32_t b, int32_t c, int32_t d) { cairo_int64_t ad; cairo_int64_t bc; /* det = a * d - b * c */ ad = _cairo_int32x32_64_mul (a, d); bc = _cairo_int32x32_64_mul (b, c); return _cairo_int64_sub (ad, bc); } static inline cairo_int128_t det64_128 (cairo_int64_t a, cairo_int64_t b, cairo_int64_t c, cairo_int64_t d) { cairo_int128_t ad; cairo_int128_t bc; /* det = a * d - b * c */ ad = _cairo_int64x64_128_mul (a, d); bc = _cairo_int64x64_128_mul (b, c); return _cairo_int128_sub (ad, bc); } /* Compute the intersection of two lines as defined by two edges. The * result is provided as a coordinate pair of 128-bit integers. * * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection or * CAIRO_BO_STATUS_PARALLEL if the two lines are exactly parallel. */ static cairo_bo_status_t intersect_lines (cairo_bo_edge_t *a, cairo_bo_edge_t *b, cairo_bo_intersect_point_t *intersection) { cairo_int64_t a_det, b_det; /* XXX: We're assuming here that dx and dy will still fit in 32 * bits. That's not true in general as there could be overflow. We * should prevent that before the tessellation algorithm begins. * What we're doing to mitigate this is to perform clamping in * cairo_bo_tessellate_polygon(). */ int32_t dx1 = a->top.x - a->bottom.x; int32_t dy1 = a->top.y - a->bottom.y; int32_t dx2 = b->top.x - b->bottom.x; int32_t dy2 = b->top.y - b->bottom.y; cairo_int64_t den_det = det32_64 (dx1, dy1, dx2, dy2); cairo_quorem64_t qr; if (_cairo_int64_eq (den_det, 0)) return CAIRO_BO_STATUS_PARALLEL; a_det = det32_64 (a->top.x, a->top.y, a->bottom.x, a->bottom.y); b_det = det32_64 (b->top.x, b->top.y, b->bottom.x, b->bottom.y); /* x = det (a_det, dx1, b_det, dx2) / den_det */ qr = _cairo_int_96by64_32x64_divrem (det64_128 (a_det, dx1, b_det, dx2), den_det); if (_cairo_int64_eq (qr.rem,den_det)) return CAIRO_BO_STATUS_NO_INTERSECTION; intersection->x.ordinate = qr.quo; intersection->x.exactness = qr.rem ? INEXACT : EXACT; /* y = det (a_det, dy1, b_det, dy2) / den_det */ qr = _cairo_int_96by64_32x64_divrem (det64_128 (a_det, dy1, b_det, dy2), den_det); if (_cairo_int64_eq (qr.rem, den_det)) return CAIRO_BO_STATUS_NO_INTERSECTION; intersection->y.ordinate = qr.quo; intersection->y.exactness = qr.rem ? INEXACT : EXACT; return CAIRO_BO_STATUS_INTERSECTION; } static int _cairo_bo_intersect_ordinate_32_compare (cairo_bo_intersect_ordinate_t a, int32_t b) { /* First compare the quotient */ if (a.ordinate > b) return +1; if (a.ordinate < b) return -1; /* With quotient identical, if remainder is 0 then compare equal */ /* Otherwise, the non-zero remainder makes a > b */ return INEXACT == a.exactness; } /* Does the given edge contain the given point. The point must already * be known to be contained within the line determined by the edge, * (most likely the point results from an intersection of this edge * with another). * * If we had exact arithmetic, then this function would simply be a * matter of examining whether the y value of the point lies within * the range of y values of the edge. But since intersection points * are not exact due to being rounded to the nearest integer within * the available precision, we must also examine the x value of the * point. * * The definition of "contains" here is that the given intersection * point will be seen by the sweep line after the start event for the * given edge and before the stop event for the edge. See the comments * in the implementation for more details. */ static cairo_bool_t _cairo_bo_edge_contains_intersect_point (cairo_bo_edge_t *edge, cairo_bo_intersect_point_t *point) { int cmp_top, cmp_bottom; /* XXX: When running the actual algorithm, we don't actually need to * compare against edge->top at all here, since any intersection above * top is eliminated early via a slope comparison. We're leaving these * here for now only for the sake of the quadratic-time intersection * finder which needs them. */ cmp_top = _cairo_bo_intersect_ordinate_32_compare (point->y, edge->top.y); cmp_bottom = _cairo_bo_intersect_ordinate_32_compare (point->y, edge->bottom.y); if (cmp_top < 0 || cmp_bottom > 0) { return FALSE; } if (cmp_top > 0 && cmp_bottom < 0) { return TRUE; } /* At this stage, the point lies on the same y value as either * edge->top or edge->bottom, so we have to examine the x value in * order to properly determine containment. */ /* If the y value of the point is the same as the y value of the * top of the edge, then the x value of the point must be greater * to be considered as inside the edge. Similarly, if the y value * of the point is the same as the y value of the bottom of the * edge, then the x value of the point must be less to be * considered as inside. */ if (cmp_top == 0) return (_cairo_bo_intersect_ordinate_32_compare (point->x, edge->top.x) > 0); else /* cmp_bottom == 0 */ return (_cairo_bo_intersect_ordinate_32_compare (point->x, edge->bottom.x) < 0); } /* Compute the intersection of two edges. The result is provided as a * coordinate pair of 128-bit integers. * * Returns %CAIRO_BO_STATUS_INTERSECTION if there is an intersection * that is within both edges, %CAIRO_BO_STATUS_NO_INTERSECTION if the * intersection of the lines defined by the edges occurs outside of * one or both edges, and %CAIRO_BO_STATUS_PARALLEL if the two edges * are exactly parallel. * * Note that when determining if a candidate intersection is "inside" * an edge, we consider both the infinitesimal shortening and the * infinitesimal tilt rules described by John Hobby. Specifically, if * the intersection is exactly the same as an edge point, it is * effectively outside (no intersection is returned). Also, if the * intersection point has the same */ static cairo_bo_status_t _cairo_bo_edge_intersect (cairo_bo_edge_t *a, cairo_bo_edge_t *b, cairo_bo_point32_t *intersection) { cairo_bo_status_t status; cairo_bo_intersect_point_t quorem; status = intersect_lines (a, b, &quorem); if (status) return status; if (! _cairo_bo_edge_contains_intersect_point (a, &quorem)) return CAIRO_BO_STATUS_NO_INTERSECTION; if (! _cairo_bo_edge_contains_intersect_point (b, &quorem)) return CAIRO_BO_STATUS_NO_INTERSECTION; /* Now that we've correctly compared the intersection point and * determined that it lies within the edge, then we know that we * no longer need any more bits of storage for the intersection * than we do for our edge coordinates. We also no longer need the * remainder from the division. */ intersection->x = quorem.x.ordinate; intersection->y = quorem.y.ordinate; return CAIRO_BO_STATUS_INTERSECTION; } static void _cairo_bo_event_init (cairo_bo_event_t *event, cairo_bo_event_type_t type, cairo_bo_edge_t *e1, cairo_bo_edge_t *e2, cairo_bo_point32_t point) { event->type = type; event->e1 = e1; event->e2 = e2; event->point = point; } static cairo_status_t _cairo_bo_event_queue_insert (cairo_bo_event_queue_t *queue, cairo_bo_event_t *event) { cairo_status_t status = CAIRO_STATUS_SUCCESS; /* Don't insert if there's already an equivalent intersection event in the queue. */ if (_cairo_skip_list_insert (&queue->intersection_queue, event, event->type == CAIRO_BO_EVENT_TYPE_INTERSECTION) == NULL) status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return status; } static void _cairo_bo_event_queue_delete (cairo_bo_event_queue_t *queue, cairo_bo_event_t *event) { if (CAIRO_BO_EVENT_TYPE_INTERSECTION == event->type) _cairo_skip_list_delete_given ( &queue->intersection_queue, &event->elt ); } static cairo_bo_event_t * _cairo_bo_event_dequeue (cairo_bo_event_queue_t *event_queue) { skip_elt_t *elt = event_queue->intersection_queue.chains[0]; cairo_bo_event_t *intersection = elt ? SKIP_ELT_TO_EVENT (elt) : NULL; cairo_bo_event_t *startstop; if (event_queue->next_startstop_event_index == event_queue->num_startstop_events) return intersection; startstop = event_queue->sorted_startstop_event_ptrs[ event_queue->next_startstop_event_index]; if (!intersection || cairo_bo_event_compare (startstop, intersection) <= 0) { event_queue->next_startstop_event_index++; return startstop; } return intersection; } static cairo_status_t _cairo_bo_event_queue_init (cairo_bo_event_queue_t *event_queue, cairo_bo_edge_t *edges, int num_edges) { int i; cairo_bo_event_t *events, **sorted_event_ptrs; unsigned num_events = 2*num_edges; memset (event_queue, 0, sizeof(*event_queue)); _cairo_skip_list_init (&event_queue->intersection_queue, cairo_bo_event_compare_abstract, sizeof (cairo_bo_event_t)); if (0 == num_edges) return CAIRO_STATUS_SUCCESS; /* The skip_elt_t field of a cairo_bo_event_t isn't used for start * or stop events, so this allocation is safe. XXX: make the * event type a union so it doesn't always contain the skip * elt? */ events = _cairo_malloc_ab (num_events, sizeof (cairo_bo_event_t) + sizeof(cairo_bo_event_t*)); if (events == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); sorted_event_ptrs = (cairo_bo_event_t **) (events + num_events); event_queue->startstop_events = events; event_queue->sorted_startstop_event_ptrs = sorted_event_ptrs; event_queue->num_startstop_events = num_events; event_queue->next_startstop_event_index = 0; for (i = 0; i < num_edges; i++) { sorted_event_ptrs[2*i] = &events[2*i]; sorted_event_ptrs[2*i+1] = &events[2*i+1]; /* Initialize "middle" to top */ edges[i].middle = edges[i].top; _cairo_bo_event_init (&events[2*i], CAIRO_BO_EVENT_TYPE_START, &edges[i], NULL, edges[i].top); _cairo_bo_event_init (&events[2*i+1], CAIRO_BO_EVENT_TYPE_STOP, &edges[i], NULL, edges[i].bottom); } qsort (sorted_event_ptrs, num_events, sizeof(cairo_bo_event_t *), cairo_bo_event_compare_pointers); return CAIRO_STATUS_SUCCESS; } static void _cairo_bo_event_queue_fini (cairo_bo_event_queue_t *event_queue) { _cairo_skip_list_fini (&event_queue->intersection_queue); if (event_queue->startstop_events) free (event_queue->startstop_events); } static cairo_status_t _cairo_bo_event_queue_insert_if_intersect_below_current_y (cairo_bo_event_queue_t *event_queue, cairo_bo_edge_t *left, cairo_bo_edge_t *right) { cairo_bo_status_t status; cairo_bo_point32_t intersection; cairo_bo_event_t event; if (left == NULL || right == NULL) return CAIRO_STATUS_SUCCESS; /* The names "left" and "right" here are correct descriptions of * the order of the two edges within the active edge list. So if a * slope comparison also puts left less than right, then we know * that the intersection of these two segments has oalready * occurred before the current sweep line position. */ if (_slope_compare (left, right) < 0) return CAIRO_STATUS_SUCCESS; status = _cairo_bo_edge_intersect (left, right, &intersection); if (status == CAIRO_BO_STATUS_PARALLEL || status == CAIRO_BO_STATUS_NO_INTERSECTION) { return CAIRO_STATUS_SUCCESS; } _cairo_bo_event_init (&event, CAIRO_BO_EVENT_TYPE_INTERSECTION, left, right, intersection); return _cairo_bo_event_queue_insert (event_queue, &event); } static void _cairo_bo_sweep_line_init (cairo_bo_sweep_line_t *sweep_line) { _cairo_skip_list_init (&sweep_line->active_edges, _sweep_line_elt_compare, sizeof (sweep_line_elt_t)); sweep_line->head = NULL; sweep_line->tail = NULL; sweep_line->current_y = 0; } static void _cairo_bo_sweep_line_fini (cairo_bo_sweep_line_t *sweep_line) { _cairo_skip_list_fini (&sweep_line->active_edges); } static cairo_status_t _cairo_bo_sweep_line_insert (cairo_bo_sweep_line_t *sweep_line, cairo_bo_edge_t *edge) { skip_elt_t *next_elt; sweep_line_elt_t *sweep_line_elt; cairo_bo_edge_t **prev_of_next, **next_of_prev; sweep_line_elt = _cairo_skip_list_insert (&sweep_line->active_edges, &edge, 1 /* unique inserts*/); if (sweep_line_elt == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); next_elt = sweep_line_elt->elt.next[0]; if (next_elt) prev_of_next = & (SKIP_ELT_TO_EDGE (next_elt)->prev); else prev_of_next = &sweep_line->tail; if (*prev_of_next) next_of_prev = &(*prev_of_next)->next; else next_of_prev = &sweep_line->head; edge->prev = *prev_of_next; edge->next = *next_of_prev; *prev_of_next = edge; *next_of_prev = edge; edge->sweep_line_elt = sweep_line_elt; return CAIRO_STATUS_SUCCESS; } static void _cairo_bo_sweep_line_delete (cairo_bo_sweep_line_t *sweep_line, cairo_bo_edge_t *edge) { cairo_bo_edge_t **left_next, **right_prev; _cairo_skip_list_delete_given (&sweep_line->active_edges, &edge->sweep_line_elt->elt); left_next = &sweep_line->head; if (edge->prev) left_next = &edge->prev->next; right_prev = &sweep_line->tail; if (edge->next) right_prev = &edge->next->prev; *left_next = edge->next; *right_prev = edge->prev; } static void _cairo_bo_sweep_line_swap (cairo_bo_sweep_line_t *sweep_line, cairo_bo_edge_t *left, cairo_bo_edge_t *right) { sweep_line_elt_t *left_elt, *right_elt; cairo_bo_edge_t **before_left, **after_right; /* Within the skip list we can do the swap simply by swapping the * pointers to the edge elements and leaving all of the skip list * elements and pointers unchanged. */ left_elt = left->sweep_line_elt; right_elt = SKIP_ELT_TO_EDGE_ELT (left_elt->elt.next[0]); left_elt->edge = right; right->sweep_line_elt = left_elt; right_elt->edge = left; left->sweep_line_elt = right_elt; /* Within the doubly-linked list of edges, there's a bit more * bookkeeping involved with the swap. */ before_left = &sweep_line->head; if (left->prev) before_left = &left->prev->next; *before_left = right; after_right = &sweep_line->tail; if (right->next) after_right = &right->next->prev; *after_right = left; left->next = right->next; right->next = left; right->prev = left->prev; left->prev = right; } #define DEBUG_PRINT_STATE 0 #if DEBUG_PRINT_STATE static void _cairo_bo_edge_print (cairo_bo_edge_t *edge) { printf ("(0x%x, 0x%x)-(0x%x, 0x%x)", edge->top.x, edge->top.y, edge->bottom.x, edge->bottom.y); } static void _cairo_bo_event_print (cairo_bo_event_t *event) { switch (event->type) { case CAIRO_BO_EVENT_TYPE_START: printf ("Start: "); break; case CAIRO_BO_EVENT_TYPE_STOP: printf ("Stop: "); break; case CAIRO_BO_EVENT_TYPE_INTERSECTION: printf ("Intersection: "); break; } printf ("(%d, %d)\t", event->point.x, event->point.y); _cairo_bo_edge_print (event->e1); if (event->type == CAIRO_BO_EVENT_TYPE_INTERSECTION) { printf (" X "); _cairo_bo_edge_print (event->e2); } printf ("\n"); } static void _cairo_bo_event_queue_print (cairo_bo_event_queue_t *event_queue) { skip_elt_t *elt; /* XXX: fixme to print the start/stop array too. */ cairo_skip_list_t *queue = &event_queue->intersection_queue; cairo_bo_event_t *event; printf ("Event queue:\n"); for (elt = queue->chains[0]; elt; elt = elt->next[0]) { event = SKIP_ELT_TO_EVENT (elt); _cairo_bo_event_print (event); } } static void _cairo_bo_sweep_line_print (cairo_bo_sweep_line_t *sweep_line) { cairo_bool_t first = TRUE; skip_elt_t *elt; cairo_bo_edge_t *edge; printf ("Sweep line (reversed): "); for (edge = sweep_line->tail; edge; edge = edge->prev) { if (!first) printf (", "); _cairo_bo_edge_print (edge); first = FALSE; } printf ("\n"); printf ("Sweep line from edge list: "); first = TRUE; for (edge = sweep_line->head; edge; edge = edge->next) { if (!first) printf (", "); _cairo_bo_edge_print (edge); first = FALSE; } printf ("\n"); printf ("Sweep line from skip list: "); first = TRUE; for (elt = sweep_line->active_edges.chains[0]; elt; elt = elt->next[0]) { if (!first) printf (", "); _cairo_bo_edge_print (SKIP_ELT_TO_EDGE (elt)); first = FALSE; } printf ("\n"); } static void print_state (const char *msg, cairo_bo_event_queue_t *event_queue, cairo_bo_sweep_line_t *sweep_line) { printf ("%s\n", msg); _cairo_bo_event_queue_print (event_queue); _cairo_bo_sweep_line_print (sweep_line); printf ("\n"); } #endif /* Adds the trapezoid, if any, of the left edge to the #cairo_traps_t * of bo_traps. */ static cairo_status_t _cairo_bo_edge_end_trap (cairo_bo_edge_t *left, int32_t bot, cairo_bo_traps_t *bo_traps) { cairo_fixed_t fixed_top, fixed_bot; cairo_bo_trap_t *trap = left->deferred_trap; cairo_bo_edge_t *right; if (!trap) return CAIRO_STATUS_SUCCESS; /* If the right edge of the trapezoid stopped earlier than the * left edge, then cut the trapezoid bottom early. */ right = trap->right; if (right->bottom.y < bot) bot = right->bottom.y; fixed_top = trap->top; fixed_bot = bot; /* Only emit trapezoids with positive height. */ if (fixed_top < fixed_bot) { cairo_point_t left_top, left_bot, right_top, right_bot; cairo_fixed_t xmin = bo_traps->xmin; cairo_fixed_t ymin = bo_traps->ymin; fixed_top += ymin; fixed_bot += ymin; left_top.x = left->top.x + xmin; left_top.y = left->top.y + ymin; right_top.x = right->top.x + xmin; right_top.y = right->top.y + ymin; left_bot.x = left->bottom.x + xmin; left_bot.y = left->bottom.y + ymin; right_bot.x = right->bottom.x + xmin; right_bot.y = right->bottom.y + ymin; /* Avoid emitting the trapezoid if it is obviously degenerate. * TODO: need a real collinearity test here for the cases * where the trapezoid is degenerate, yet the top and bottom * coordinates aren't equal. */ if (left_top.x != right_top.x || left_top.y != right_top.y || left_bot.x != right_bot.x || left_bot.y != right_bot.y) { _cairo_traps_add_trap_from_points (bo_traps->traps, fixed_top, fixed_bot, left_top, left_bot, right_top, right_bot); #if DEBUG_PRINT_STATE printf ("Deferred trap: left=(%08x, %08x)-(%08x,%08x) " "right=(%08x,%08x)-(%08x,%08x) top=%08x, bot=%08x\n", left->top.x, left->top.y, left->bottom.x, left->bottom.y, right->top.x, right->top.y, right->bottom.x, right->bottom.y, trap->top, bot); #endif } } _cairo_freelist_free (&bo_traps->freelist, trap); left->deferred_trap = NULL; return _cairo_traps_status (bo_traps->traps); } /* Start a new trapezoid at the given top y coordinate, whose edges * are `edge' and `edge->next'. If `edge' already has a trapezoid, * then either add it to the traps in `bo_traps', if the trapezoid's * right edge differs from `edge->next', or do nothing if the new * trapezoid would be a continuation of the existing one. */ static cairo_status_t _cairo_bo_edge_start_or_continue_trap (cairo_bo_edge_t *edge, int32_t top, cairo_bo_traps_t *bo_traps) { cairo_status_t status; cairo_bo_trap_t *trap = edge->deferred_trap; if (trap) { if (trap->right == edge->next) return CAIRO_STATUS_SUCCESS; status = _cairo_bo_edge_end_trap (edge, top, bo_traps); if (status) return status; } if (edge->next) { trap = edge->deferred_trap = _cairo_freelist_alloc (&bo_traps->freelist); if (!edge->deferred_trap) return _cairo_error (CAIRO_STATUS_NO_MEMORY); trap->right = edge->next; trap->top = top; } return CAIRO_STATUS_SUCCESS; } static void _cairo_bo_traps_init (cairo_bo_traps_t *bo_traps, cairo_traps_t *traps, cairo_fixed_t xmin, cairo_fixed_t ymin, cairo_fixed_t xmax, cairo_fixed_t ymax) { bo_traps->traps = traps; _cairo_freelist_init (&bo_traps->freelist, sizeof(cairo_bo_trap_t)); bo_traps->xmin = xmin; bo_traps->ymin = ymin; bo_traps->xmax = xmax; bo_traps->ymax = ymax; } static void _cairo_bo_traps_fini (cairo_bo_traps_t *bo_traps) { _cairo_freelist_fini (&bo_traps->freelist); } static void _cairo_bo_sweep_line_validate (cairo_bo_sweep_line_t *sweep_line) { cairo_bo_edge_t *edge; skip_elt_t *elt; /* March through both the skip list's singly-linked list and the * sweep line's own list through pointers in the edges themselves * and make sure they agree at every point. */ for (edge = sweep_line->head, elt = sweep_line->active_edges.chains[0]; edge && elt; edge = edge->next, elt = elt->next[0]) { if (SKIP_ELT_TO_EDGE (elt) != edge) { fprintf (stderr, "*** Error: Sweep line fails to validate: Inconsistent data in the two lists.\n"); exit (1); } } if (edge || elt) { fprintf (stderr, "*** Error: Sweep line fails to validate: One list ran out before the other.\n"); exit (1); } } static cairo_status_t _active_edges_to_traps (cairo_bo_edge_t *head, int32_t top, cairo_fill_rule_t fill_rule, cairo_bo_traps_t *bo_traps) { cairo_status_t status; int in_out = 0; cairo_bo_edge_t *edge; for (edge = head; edge && edge->next; edge = edge->next) { if (fill_rule == CAIRO_FILL_RULE_WINDING) { if (edge->reversed) in_out++; else in_out--; if (in_out == 0) { status = _cairo_bo_edge_end_trap (edge, top, bo_traps); if (status) return status; continue; } } else { in_out++; if ((in_out & 1) == 0) { status = _cairo_bo_edge_end_trap (edge, top, bo_traps); if (status) return status; continue; } } status = _cairo_bo_edge_start_or_continue_trap (edge, top, bo_traps); if (status) return status; } return CAIRO_STATUS_SUCCESS; } /* Execute a single pass of the Bentley-Ottmann algorithm on edges, * generating trapezoids according to the fill_rule and appending them * to traps. */ static cairo_status_t _cairo_bentley_ottmann_tessellate_bo_edges (cairo_bo_edge_t *edges, int num_edges, cairo_fill_rule_t fill_rule, cairo_traps_t *traps, cairo_fixed_t xmin, cairo_fixed_t ymin, cairo_fixed_t xmax, cairo_fixed_t ymax, int *num_intersections) { cairo_status_t status; int intersection_count = 0; cairo_bo_event_queue_t event_queue; cairo_bo_sweep_line_t sweep_line; cairo_bo_traps_t bo_traps; cairo_bo_event_t *event, event_saved; cairo_bo_edge_t *edge; cairo_bo_edge_t *left, *right; cairo_bo_edge_t *edge1, *edge2; status = _cairo_bo_event_queue_init (&event_queue, edges, num_edges); if (status) return status; _cairo_bo_sweep_line_init (&sweep_line); _cairo_bo_traps_init (&bo_traps, traps, xmin, ymin, xmax, ymax); #if DEBUG_PRINT_STATE print_state ("After initializing", &event_queue, &sweep_line); #endif while (1) { event = _cairo_bo_event_dequeue (&event_queue); if (!event) break; if (event->point.y != sweep_line.current_y) { status = _active_edges_to_traps (sweep_line.head, sweep_line.current_y, fill_rule, &bo_traps); if (status) goto unwind; sweep_line.current_y = event->point.y; } event_saved = *event; _cairo_bo_event_queue_delete (&event_queue, event); event = &event_saved; switch (event->type) { case CAIRO_BO_EVENT_TYPE_START: edge = event->e1; status = _cairo_bo_sweep_line_insert (&sweep_line, edge); if (status) goto unwind; /* Cache the insert position for use in pass 2. event->e2 = Sortlist::prev (sweep_line, edge); */ left = edge->prev; right = edge->next; status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, edge); if (status) goto unwind; status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, edge, right); if (status) goto unwind; #if DEBUG_PRINT_STATE print_state ("After processing start", &event_queue, &sweep_line); #endif _cairo_bo_sweep_line_validate (&sweep_line); break; case CAIRO_BO_EVENT_TYPE_STOP: edge = event->e1; left = edge->prev; right = edge->next; _cairo_bo_sweep_line_delete (&sweep_line, edge); status = _cairo_bo_edge_end_trap (edge, edge->bottom.y, &bo_traps); if (status) goto unwind; status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, right); if (status) goto unwind; #if DEBUG_PRINT_STATE print_state ("After processing stop", &event_queue, &sweep_line); #endif _cairo_bo_sweep_line_validate (&sweep_line); break; case CAIRO_BO_EVENT_TYPE_INTERSECTION: edge1 = event->e1; edge2 = event->e2; /* skip this intersection if its edges are not adjacent */ if (edge2 != edge1->next) break; intersection_count++; edge1->middle = event->point; edge2->middle = event->point; left = edge1->prev; right = edge2->next; _cairo_bo_sweep_line_swap (&sweep_line, edge1, edge2); /* after the swap e2 is left of e1 */ status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, left, edge2); if (status) goto unwind; status = _cairo_bo_event_queue_insert_if_intersect_below_current_y (&event_queue, edge1, right); if (status) goto unwind; #if DEBUG_PRINT_STATE print_state ("After processing intersection", &event_queue, &sweep_line); #endif _cairo_bo_sweep_line_validate (&sweep_line); break; } } *num_intersections = intersection_count; unwind: for (edge = sweep_line.head; edge; edge = edge->next) { cairo_status_t status2 = _cairo_bo_edge_end_trap (edge, sweep_line.current_y, &bo_traps); if (!status) status = status2; } _cairo_bo_traps_fini (&bo_traps); _cairo_bo_sweep_line_fini (&sweep_line); _cairo_bo_event_queue_fini (&event_queue); return status; } static void update_minmax(cairo_fixed_t *inout_min, cairo_fixed_t *inout_max, cairo_fixed_t v) { if (v < *inout_min) *inout_min = v; if (v > *inout_max) *inout_max = v; } cairo_status_t _cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps, cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule) { int intersections; cairo_status_t status; cairo_bo_edge_t stack_edges[CAIRO_STACK_ARRAY_LENGTH (cairo_bo_edge_t)]; cairo_bo_edge_t *edges; cairo_fixed_t xmin = 0x7FFFFFFF; cairo_fixed_t ymin = 0x7FFFFFFF; cairo_fixed_t xmax = -0x80000000; cairo_fixed_t ymax = -0x80000000; int num_bo_edges; int i; if (0 == polygon->num_edges) return CAIRO_STATUS_SUCCESS; if (polygon->num_edges < ARRAY_LENGTH (stack_edges)) { edges = stack_edges; } else { edges = _cairo_malloc_ab (polygon->num_edges, sizeof (cairo_bo_edge_t)); if (edges == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Figure out the bounding box of the input coordinates and * validate that we're not given invalid polygon edges. */ for (i = 0; i < polygon->num_edges; i++) { update_minmax (&xmin, &xmax, polygon->edges[i].edge.p1.x); update_minmax (&ymin, &ymax, polygon->edges[i].edge.p1.y); update_minmax (&xmin, &xmax, polygon->edges[i].edge.p2.x); update_minmax (&ymin, &ymax, polygon->edges[i].edge.p2.y); assert (polygon->edges[i].edge.p1.y <= polygon->edges[i].edge.p2.y && "BUG: tessellator given upside down or horizontal edges"); } /* The tessellation functions currently assume that no line * segment extends more than 2^31-1 in either dimension. We * guarantee this by offsetting the internal coordinates to the * range [0,2^31-1], and clamping to 2^31-1 if a coordinate * exceeds the range (and yes, this generates an incorrect * result). First we have to clamp the bounding box itself. */ /* XXX: Rather than changing the input values, a better approach * would be to detect out-of-bounds input and return a * CAIRO_STATUS_OVERFLOW value to the user. */ if (xmax - xmin < 0) xmax = xmin + 0x7FFFFFFF; if (ymax - ymin < 0) ymax = ymin + 0x7FFFFFFF; for (i = 0, num_bo_edges = 0; i < polygon->num_edges; i++) { cairo_bo_edge_t *edge = &edges[num_bo_edges]; cairo_point_t top = polygon->edges[i].edge.p1; cairo_point_t bot = polygon->edges[i].edge.p2; /* Offset coordinates into the non-negative range. */ top.x -= xmin; top.y -= ymin; bot.x -= xmin; bot.y -= ymin; /* If the coordinates are still negative, then their extent is * overflowing 2^31-1. We're going to kludge it and clamp the * coordinates into the clamped bounding box. */ if (top.x < 0) top.x = xmax - xmin; if (top.y < 0) top.y = ymax - ymin; if (bot.x < 0) bot.x = xmax - xmin; if (bot.y < 0) bot.y = ymax - ymin; if (top.y == bot.y) { /* Clamping might have produced horizontal edges. Ignore * those. */ continue; } assert (top.y < bot.y && "BUG: clamping the input range flipped the " "orientation of an edge"); edge->top.x = top.x; edge->top.y = top.y; edge->bottom.x = bot.x; edge->bottom.y = bot.y; /* XXX: The 'clockWise' name that cairo_polygon_t uses is * totally bogus. It's really a (negated!) description of * whether the edge is reversed. */ edge->reversed = (! polygon->edges[i].clockWise); edge->deferred_trap = NULL; edge->prev = NULL; edge->next = NULL; edge->sweep_line_elt = NULL; num_bo_edges++; } /* XXX: This would be the convenient place to throw in multiple * passes of the Bentley-Ottmann algorithm. It would merely * require storing the results of each pass into a temporary * cairo_traps_t. */ status = _cairo_bentley_ottmann_tessellate_bo_edges (edges, num_bo_edges, fill_rule, traps, xmin, ymin, xmax, ymax, &intersections); if (edges != stack_edges) free (edges); return status; } #if 0 static cairo_bool_t edges_have_an_intersection_quadratic (cairo_bo_edge_t *edges, int num_edges) { int i, j; cairo_bo_edge_t *a, *b; cairo_bo_point32_t intersection; cairo_bo_status_t status; /* We must not be given any upside-down edges. */ for (i = 0; i < num_edges; i++) { assert (_cairo_bo_point32_compare (&edges[i].top, &edges[i].bottom) < 0); edges[i].top.x <<= CAIRO_BO_GUARD_BITS; edges[i].top.y <<= CAIRO_BO_GUARD_BITS; edges[i].bottom.x <<= CAIRO_BO_GUARD_BITS; edges[i].bottom.y <<= CAIRO_BO_GUARD_BITS; } for (i = 0; i < num_edges; i++) { for (j = 0; j < num_edges; j++) { if (i == j) continue; a = &edges[i]; b = &edges[j]; status = _cairo_bo_edge_intersect (a, b, &intersection); if (status == CAIRO_BO_STATUS_PARALLEL || status == CAIRO_BO_STATUS_NO_INTERSECTION) { continue; } printf ("Found intersection (%d,%d) between (%d,%d)-(%d,%d) and (%d,%d)-(%d,%d)\n", intersection.x, intersection.y, a->top.x, a->top.y, a->bottom.x, a->bottom.y, b->top.x, b->top.y, b->bottom.x, b->bottom.y); return TRUE; } } return FALSE; } #define TEST_MAX_EDGES 10 typedef struct test { const char *name; const char *description; int num_edges; cairo_bo_edge_t edges[TEST_MAX_EDGES]; } test_t; static test_t tests[] = { { "3 near misses", "3 edges all intersecting very close to each other", 3, { { { 4, 2}, {0, 0}, { 9, 9}, NULL, NULL }, { { 7, 2}, {0, 0}, { 2, 3}, NULL, NULL }, { { 5, 2}, {0, 0}, { 1, 7}, NULL, NULL } } }, { "inconsistent data", "Derived from random testing---was leading to skip list and edge list disagreeing.", 2, { { { 2, 3}, {0, 0}, { 8, 9}, NULL, NULL }, { { 2, 3}, {0, 0}, { 6, 7}, NULL, NULL } } }, { "failed sort", "A test derived from random testing that leads to an inconsistent sort --- looks like we just can't attempt to validate the sweep line with edge_compare?", 3, { { { 6, 2}, {0, 0}, { 6, 5}, NULL, NULL }, { { 3, 5}, {0, 0}, { 5, 6}, NULL, NULL }, { { 9, 2}, {0, 0}, { 5, 6}, NULL, NULL }, } }, { "minimal-intersection", "Intersection of a two from among the smallest possible edges.", 2, { { { 0, 0}, {0, 0}, { 1, 1}, NULL, NULL }, { { 1, 0}, {0, 0}, { 0, 1}, NULL, NULL } } }, { "simple", "A simple intersection of two edges at an integer (2,2).", 2, { { { 1, 1}, {0, 0}, { 3, 3}, NULL, NULL }, { { 2, 1}, {0, 0}, { 2, 3}, NULL, NULL } } }, { "bend-to-horizontal", "With intersection truncation one edge bends to horizontal", 2, { { { 9, 1}, {0, 0}, {3, 7}, NULL, NULL }, { { 3, 5}, {0, 0}, {9, 9}, NULL, NULL } } } }; /* { "endpoint", "An intersection that occurs at the endpoint of a segment.", { { { 4, 6}, { 5, 6}, NULL, { { NULL }} }, { { 4, 5}, { 5, 7}, NULL, { { NULL }} }, { { 0, 0}, { 0, 0}, NULL, { { NULL }} }, } } { name = "overlapping", desc = "Parallel segments that share an endpoint, with different slopes.", edges = { { top = { x = 2, y = 0}, bottom = { x = 1, y = 1}}, { top = { x = 2, y = 0}, bottom = { x = 0, y = 2}}, { top = { x = 0, y = 3}, bottom = { x = 1, y = 3}}, { top = { x = 0, y = 3}, bottom = { x = 2, y = 3}}, { top = { x = 0, y = 4}, bottom = { x = 0, y = 6}}, { top = { x = 0, y = 5}, bottom = { x = 0, y = 6}} } }, { name = "hobby_stage_3", desc = "A particularly tricky part of the 3rd stage of the 'hobby' test below.", edges = { { top = { x = -1, y = -2}, bottom = { x = 4, y = 2}}, { top = { x = 5, y = 3}, bottom = { x = 9, y = 5}}, { top = { x = 5, y = 3}, bottom = { x = 6, y = 3}}, } }, { name = "hobby", desc = "Example from John Hobby's paper. Requires 3 passes of the iterative algorithm.", edges = { { top = { x = 0, y = 0}, bottom = { x = 9, y = 5}}, { top = { x = 0, y = 0}, bottom = { x = 13, y = 6}}, { top = { x = -1, y = -2}, bottom = { x = 9, y = 5}} } }, { name = "slope", desc = "Edges with same start/stop points but different slopes", edges = { { top = { x = 4, y = 1}, bottom = { x = 6, y = 3}}, { top = { x = 4, y = 1}, bottom = { x = 2, y = 3}}, { top = { x = 2, y = 4}, bottom = { x = 4, y = 6}}, { top = { x = 6, y = 4}, bottom = { x = 4, y = 6}} } }, { name = "horizontal", desc = "Test of a horizontal edge", edges = { { top = { x = 1, y = 1}, bottom = { x = 6, y = 6}}, { top = { x = 2, y = 3}, bottom = { x = 5, y = 3}} } }, { name = "vertical", desc = "Test of a vertical edge", edges = { { top = { x = 5, y = 1}, bottom = { x = 5, y = 7}}, { top = { x = 2, y = 4}, bottom = { x = 8, y = 5}} } }, { name = "congruent", desc = "Two overlapping edges with the same slope", edges = { { top = { x = 5, y = 1}, bottom = { x = 5, y = 7}}, { top = { x = 5, y = 2}, bottom = { x = 5, y = 6}}, { top = { x = 2, y = 4}, bottom = { x = 8, y = 5}} } }, { name = "multi", desc = "Several segments with a common intersection point", edges = { { top = { x = 1, y = 2}, bottom = { x = 5, y = 4} }, { top = { x = 1, y = 1}, bottom = { x = 5, y = 5} }, { top = { x = 2, y = 1}, bottom = { x = 4, y = 5} }, { top = { x = 4, y = 1}, bottom = { x = 2, y = 5} }, { top = { x = 5, y = 1}, bottom = { x = 1, y = 5} }, { top = { x = 5, y = 2}, bottom = { x = 1, y = 4} } } } }; */ static int run_test (const char *test_name, cairo_bo_edge_t *test_edges, int num_edges) { int i, intersections, passes; cairo_bo_edge_t *edges; cairo_array_t intersected_edges; printf ("Testing: %s\n", test_name); _cairo_array_init (&intersected_edges, sizeof (cairo_bo_edge_t)); intersections = _cairo_bentley_ottmann_intersect_edges (test_edges, num_edges, &intersected_edges); if (intersections) printf ("Pass 1 found %d intersections:\n", intersections); /* XXX: Multi-pass Bentley-Ottmmann. Preferable would be to add a * pass of Hobby's tolerance-square algorithm instead. */ passes = 1; while (intersections) { int num_edges = _cairo_array_num_elements (&intersected_edges); passes++; edges = _cairo_malloc_ab (num_edges, sizeof (cairo_bo_edge_t)); assert (edges != NULL); memcpy (edges, _cairo_array_index (&intersected_edges, 0), num_edges * sizeof (cairo_bo_edge_t)); _cairo_array_fini (&intersected_edges); _cairo_array_init (&intersected_edges, sizeof (cairo_bo_edge_t)); intersections = _cairo_bentley_ottmann_intersect_edges (edges, num_edges, &intersected_edges); free (edges); if (intersections){ printf ("Pass %d found %d remaining intersections:\n", passes, intersections); } else { if (passes > 3) for (i = 0; i < passes; i++) printf ("*"); printf ("No remainining intersections found after pass %d\n", passes); } } if (edges_have_an_intersection_quadratic (_cairo_array_index (&intersected_edges, 0), _cairo_array_num_elements (&intersected_edges))) printf ("*** FAIL ***\n"); else printf ("PASS\n"); _cairo_array_fini (&intersected_edges); return 0; } #define MAX_RANDOM 300 int main (void) { char random_name[] = "random-XX"; cairo_bo_edge_t random_edges[MAX_RANDOM], *edge; unsigned int i, num_random; test_t *test; for (i = 0; i < ARRAY_LENGTH (tests); i++) { test = &tests[i]; run_test (test->name, test->edges, test->num_edges); } for (num_random = 0; num_random < MAX_RANDOM; num_random++) { srand (0); for (i = 0; i < num_random; i++) { do { edge = &random_edges[i]; edge->top.x = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); edge->top.y = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); edge->bottom.x = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); edge->bottom.y = (int32_t) (10.0 * (rand() / (RAND_MAX + 1.0))); if (edge->top.y > edge->bottom.y) { int32_t tmp = edge->top.y; edge->top.y = edge->bottom.y; edge->bottom.y = tmp; } } while (edge->top.y == edge->bottom.y); } sprintf (random_name, "random-%02d", num_random); run_test (random_name, random_edges, num_random); } return 0; } #endif libgdiplus-2.11/cairo/src/cairo-wideint-private.h0000664000175000017500000002606512225470167017000 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith R. Packard * */ #ifndef CAIRO_WIDEINT_H #define CAIRO_WIDEINT_H #include "cairo-wideint-type-private.h" #include "cairo-compiler-private.h" /* * 64-bit datatypes. Two separate implementations, one using * built-in 64-bit signed/unsigned types another implemented * as a pair of 32-bit ints */ #define I cairo_private #if !HAVE_UINT64_T cairo_uint64_t I _cairo_uint32_to_uint64 (uint32_t i); #define _cairo_uint64_to_uint32(a) ((a).lo) cairo_uint64_t I _cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b); cairo_uint64_t I _cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b); cairo_uint64_t I _cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b); cairo_uint64_t I _cairo_uint32x32_64_mul (uint32_t a, uint32_t b); cairo_uint64_t I _cairo_uint64_lsl (cairo_uint64_t a, int shift); cairo_uint64_t I _cairo_uint64_rsl (cairo_uint64_t a, int shift); cairo_uint64_t I _cairo_uint64_rsa (cairo_uint64_t a, int shift); int I _cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b); int I _cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b); cairo_uint64_t I _cairo_uint64_negate (cairo_uint64_t a); #define _cairo_uint64_negative(a) (((int32_t) ((a).hi)) < 0) cairo_uint64_t I _cairo_uint64_not (cairo_uint64_t a); #define _cairo_uint64_to_int64(i) (i) #define _cairo_int64_to_uint64(i) (i) cairo_int64_t I _cairo_int32_to_int64(int32_t i); #define _cairo_int64_to_int32(a) ((int32_t) _cairo_uint64_to_uint32(a)) #define _cairo_int64_add(a,b) _cairo_uint64_add (a,b) #define _cairo_int64_sub(a,b) _cairo_uint64_sub (a,b) #define _cairo_int64_mul(a,b) _cairo_uint64_mul (a,b) cairo_int64_t I _cairo_int32x32_64_mul (int32_t a, int32_t b); int I _cairo_int64_lt (cairo_uint64_t a, cairo_uint64_t b); #define _cairo_int64_eq(a,b) _cairo_uint64_eq (a,b) #define _cairo_int64_lsl(a,b) _cairo_uint64_lsl (a,b) #define _cairo_int64_rsl(a,b) _cairo_uint64_rsl (a,b) #define _cairo_int64_rsa(a,b) _cairo_uint64_rsa (a,b) #define _cairo_int64_negate(a) _cairo_uint64_negate(a) #define _cairo_int64_negative(a) (((int32_t) ((a).hi)) < 0) #define _cairo_int64_not(a) _cairo_uint64_not(a) #else #define _cairo_uint32_to_uint64(i) ((uint64_t) (i)) #define _cairo_uint64_to_uint32(i) ((uint32_t) (i)) #define _cairo_uint64_add(a,b) ((a) + (b)) #define _cairo_uint64_sub(a,b) ((a) - (b)) #define _cairo_uint64_mul(a,b) ((a) * (b)) #define _cairo_uint32x32_64_mul(a,b) ((uint64_t) (a) * (b)) #define _cairo_uint64_lsl(a,b) ((a) << (b)) #define _cairo_uint64_rsl(a,b) ((uint64_t) (a) >> (b)) #define _cairo_uint64_rsa(a,b) ((uint64_t) ((int64_t) (a) >> (b))) #define _cairo_uint64_lt(a,b) ((a) < (b)) #define _cairo_uint64_eq(a,b) ((a) == (b)) #define _cairo_uint64_negate(a) ((uint64_t) -((int64_t) (a))) #define _cairo_uint64_negative(a) ((int64_t) (a) < 0) #define _cairo_uint64_not(a) (~(a)) #define _cairo_uint64_to_int64(i) ((int64_t) (i)) #define _cairo_int64_to_uint64(i) ((uint64_t) (i)) #define _cairo_int32_to_int64(i) ((int64_t) (i)) #define _cairo_int64_to_int32(i) ((int32_t) (i)) #define _cairo_int64_add(a,b) ((a) + (b)) #define _cairo_int64_sub(a,b) ((a) - (b)) #define _cairo_int64_mul(a,b) ((a) * (b)) #define _cairo_int32x32_64_mul(a,b) ((int64_t) (a) * (b)) #define _cairo_int64_lt(a,b) ((a) < (b)) #define _cairo_int64_eq(a,b) ((a) == (b)) #define _cairo_int64_lsl(a,b) ((a) << (b)) #define _cairo_int64_rsl(a,b) ((int64_t) ((uint64_t) (a) >> (b))) #define _cairo_int64_rsa(a,b) ((int64_t) (a) >> (b)) #define _cairo_int64_negate(a) (-(a)) #define _cairo_int64_negative(a) ((a) < 0) #define _cairo_int64_not(a) (~(a)) #endif /* * 64-bit comparisions derived from lt or eq */ #define _cairo_uint64_le(a,b) (!_cairo_uint64_gt(a,b)) #define _cairo_uint64_ne(a,b) (!_cairo_uint64_eq(a,b)) #define _cairo_uint64_ge(a,b) (!_cairo_uint64_lt(a,b)) #define _cairo_uint64_gt(a,b) _cairo_uint64_lt(b,a) #define _cairo_int64_le(a,b) (!_cairo_int64_gt(a,b)) #define _cairo_int64_ne(a,b) (!_cairo_int64_eq(a,b)) #define _cairo_int64_ge(a,b) (!_cairo_int64_lt(a,b)) #define _cairo_int64_gt(a,b) _cairo_int64_lt(b,a) /* * As the C implementation always computes both, create * a function which returns both for the 'native' type as well */ cairo_uquorem64_t I _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den); cairo_quorem64_t I _cairo_int64_divrem (cairo_int64_t num, cairo_int64_t den); /* * 128-bit datatypes. Again, provide two implementations in * case the machine has a native 128-bit datatype. GCC supports int128_t * on ia64 */ #if !HAVE_UINT128_T cairo_uint128_t I _cairo_uint32_to_uint128 (uint32_t i); cairo_uint128_t I _cairo_uint64_to_uint128 (cairo_uint64_t i); #define _cairo_uint128_to_uint64(a) ((a).lo) #define _cairo_uint128_to_uint32(a) _cairo_uint64_to_uint32(_cairo_uint128_to_uint64(a)) cairo_uint128_t I _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b); cairo_uint128_t I _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b); cairo_uint128_t I _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b); cairo_uint128_t I _cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b); cairo_uint128_t I _cairo_uint128_lsl (cairo_uint128_t a, int shift); cairo_uint128_t I _cairo_uint128_rsl (cairo_uint128_t a, int shift); cairo_uint128_t I _cairo_uint128_rsa (cairo_uint128_t a, int shift); int I _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b); int I _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b); cairo_uint128_t I _cairo_uint128_negate (cairo_uint128_t a); #define _cairo_uint128_negative(a) (_cairo_uint64_negative(a.hi)) cairo_uint128_t I _cairo_uint128_not (cairo_uint128_t a); #define _cairo_uint128_to_int128(i) (i) #define _cairo_int128_to_uint128(i) (i) cairo_int128_t I _cairo_int32_to_int128 (int32_t i); cairo_int128_t I _cairo_int64_to_int128 (cairo_int64_t i); #define _cairo_int128_to_int64(a) ((cairo_int64_t) (a).lo) #define _cairo_int128_to_int32(a) _cairo_int64_to_int32(_cairo_int128_to_int64(a)) #define _cairo_int128_add(a,b) _cairo_uint128_add(a,b) #define _cairo_int128_sub(a,b) _cairo_uint128_sub(a,b) #define _cairo_int128_mul(a,b) _cairo_uint128_mul(a,b) cairo_int128_t I _cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b); #define _cairo_int128_lsl(a,b) _cairo_uint128_lsl(a,b) #define _cairo_int128_rsl(a,b) _cairo_uint128_rsl(a,b) #define _cairo_int128_rsa(a,b) _cairo_uint128_rsa(a,b) int I _cairo_int128_lt (cairo_int128_t a, cairo_int128_t b); #define _cairo_int128_eq(a,b) _cairo_uint128_eq (a,b) #define _cairo_int128_negate(a) _cairo_uint128_negate(a) #define _cairo_int128_negative(a) (_cairo_uint128_negative(a)) #define _cairo_int128_not(a) _cairo_uint128_not(a) #else /* !HAVE_UINT128_T */ #define _cairo_uint32_to_uint128(i) ((uint128_t) (i)) #define _cairo_uint64_to_uint128(i) ((uint128_t) (i)) #define _cairo_uint128_to_uint64(i) ((uint64_t) (i)) #define _cairo_uint128_to_uint32(i) ((uint32_t) (i)) #define _cairo_uint128_add(a,b) ((a) + (b)) #define _cairo_uint128_sub(a,b) ((a) - (b)) #define _cairo_uint128_mul(a,b) ((a) * (b)) #define _cairo_uint64x64_128_mul(a,b) ((uint128_t) (a) * (b)) #define _cairo_uint128_lsl(a,b) ((a) << (b)) #define _cairo_uint128_rsl(a,b) ((uint128_t) (a) >> (b)) #define _cairo_uint128_rsa(a,b) ((uint128_t) ((int128_t) (a) >> (b))) #define _cairo_uint128_lt(a,b) ((a) < (b)) #define _cairo_uint128_eq(a,b) ((a) == (b)) #define _cairo_uint128_negate(a) ((uint128_t) -((int128_t) (a))) #define _cairo_uint128_negative(a) ((int128_t) (a) < 0) #define _cairo_uint128_not(a) (~(a)) #define _cairo_uint128_to_int128(i) ((int128_t) (i)) #define _cairo_int128_to_uint128(i) ((uint128_t) (i)) #define _cairo_int32_to_int128(i) ((int128_t) (i)) #define _cairo_int64_to_int128(i) ((int128_t) (i)) #define _cairo_int128_to_int64(i) ((int64_t) (i)) #define _cairo_int128_to_int32(i) ((int32_t) (i)) #define _cairo_int128_add(a,b) ((a) + (b)) #define _cairo_int128_sub(a,b) ((a) - (b)) #define _cairo_int128_mul(a,b) ((a) * (b)) #define _cairo_int64x64_128_mul(a,b) ((int128_t) (a) * (b)) #define _cairo_int128_lt(a,b) ((a) < (b)) #define _cairo_int128_eq(a,b) ((a) == (b)) #define _cairo_int128_lsl(a,b) ((a) << (b)) #define _cairo_int128_rsl(a,b) ((int128_t) ((uint128_t) (a) >> (b))) #define _cairo_int128_rsa(a,b) ((int128_t) (a) >> (b)) #define _cairo_int128_negate(a) (-(a)) #define _cairo_int128_negative(a) ((a) < 0) #define _cairo_int128_not(a) (~(a)) #endif /* HAVE_UINT128_T */ cairo_uquorem128_t I _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den); cairo_quorem128_t I _cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den); cairo_uquorem64_t I _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num, cairo_uint64_t den); cairo_quorem64_t I _cairo_int_96by64_32x64_divrem (cairo_int128_t num, cairo_int64_t den); #define _cairo_uint128_le(a,b) (!_cairo_uint128_gt(a,b)) #define _cairo_uint128_ne(a,b) (!_cairo_uint128_eq(a,b)) #define _cairo_uint128_ge(a,b) (!_cairo_uint128_lt(a,b)) #define _cairo_uint128_gt(a,b) _cairo_uint128_lt(b,a) #define _cairo_int128_le(a,b) (!_cairo_int128_gt(a,b)) #define _cairo_int128_ne(a,b) (!_cairo_int128_eq(a,b)) #define _cairo_int128_ge(a,b) (!_cairo_int128_lt(a,b)) #define _cairo_int128_gt(a,b) _cairo_int128_lt(b,a) #undef I #endif /* CAIRO_WIDEINT_H */ libgdiplus-2.11/cairo/src/cairo-path-stroke.c0000664000175000017500000012474712225470167016127 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-path-fixed-private.h" typedef struct cairo_stroker { cairo_stroke_style_t *style; cairo_matrix_t *ctm; cairo_matrix_t *ctm_inverse; double tolerance; double ctm_determinant; cairo_bool_t ctm_det_positive; cairo_traps_t *traps; cairo_pen_t pen; cairo_point_t current_point; cairo_point_t first_point; cairo_bool_t has_initial_sub_path; cairo_bool_t has_current_face; cairo_stroke_face_t current_face; cairo_bool_t has_first_face; cairo_stroke_face_t first_face; cairo_bool_t dashed; unsigned int dash_index; cairo_bool_t dash_on; cairo_bool_t dash_starts_on; double dash_remain; cairo_bool_t has_bounds; cairo_box_t bounds; } cairo_stroker_t; /* private functions */ static cairo_status_t _cairo_stroker_init (cairo_stroker_t *stroker, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_traps_t *traps); static void _cairo_stroker_fini (cairo_stroker_t *stroker); static cairo_status_t _cairo_stroker_move_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_stroker_line_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_stroker_line_to_dashed (void *closure, cairo_point_t *point); static cairo_status_t _cairo_stroker_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d); static cairo_status_t _cairo_stroker_curve_to_dashed (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d); static cairo_status_t _cairo_stroker_close_path (void *closure); static void _translate_point (cairo_point_t *point, cairo_point_t *offset); static int _cairo_stroker_face_clockwise (cairo_stroke_face_t *in, cairo_stroke_face_t *out); static cairo_status_t _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_stroke_face_t *out); static void _cairo_stroker_start_dash (cairo_stroker_t *stroker) { double offset; cairo_bool_t on = TRUE; unsigned int i = 0; offset = stroker->style->dash_offset; /* We stop searching for a starting point as soon as the offset reaches zero. Otherwise when an initial dash segment shrinks to zero it will be skipped over. */ while (offset > 0.0 && offset >= stroker->style->dash[i]) { offset -= stroker->style->dash[i]; on = !on; if (++i == stroker->style->num_dashes) i = 0; } stroker->dashed = TRUE; stroker->dash_index = i; stroker->dash_on = stroker->dash_starts_on = on; stroker->dash_remain = stroker->style->dash[i] - offset; } static void _cairo_stroker_step_dash (cairo_stroker_t *stroker, double step) { stroker->dash_remain -= step; if (stroker->dash_remain <= 0) { stroker->dash_index++; if (stroker->dash_index == stroker->style->num_dashes) stroker->dash_index = 0; stroker->dash_on = !stroker->dash_on; stroker->dash_remain = stroker->style->dash[stroker->dash_index]; } } static cairo_status_t _cairo_stroker_init (cairo_stroker_t *stroker, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_traps_t *traps) { cairo_status_t status; stroker->style = stroke_style; stroker->ctm = ctm; stroker->ctm_inverse = ctm_inverse; stroker->tolerance = tolerance; stroker->traps = traps; _cairo_matrix_compute_determinant (stroker->ctm, &stroker->ctm_determinant); if (stroker->ctm_determinant >= 0.0) stroker->ctm_det_positive = TRUE; else stroker->ctm_det_positive = FALSE; status = _cairo_pen_init (&stroker->pen, stroke_style->line_width / 2.0, tolerance, ctm); if (status) return status; stroker->has_current_face = FALSE; stroker->has_first_face = FALSE; stroker->has_initial_sub_path = FALSE; if (stroker->style->dash) _cairo_stroker_start_dash (stroker); else stroker->dashed = FALSE; stroker->has_bounds = _cairo_traps_get_limit (traps, &stroker->bounds); if (stroker->has_bounds) { /* Extend the bounds in each direction to account for the maximum area * we might generate trapezoids, to capture line segments that are outside * of the bounds but which might generate rendering that's within bounds. */ double dx, dy; cairo_fixed_t fdx, fdy; _cairo_stroke_style_max_distance_from_path (stroker->style, stroker->ctm, &dx, &dy); fdx = _cairo_fixed_from_double (dx); fdy = _cairo_fixed_from_double (dy); stroker->bounds.p1.x -= fdx; stroker->bounds.p2.x += fdx; stroker->bounds.p1.y -= fdy; stroker->bounds.p2.y += fdy; } return CAIRO_STATUS_SUCCESS; } static void _cairo_stroker_fini (cairo_stroker_t *stroker) { _cairo_pen_fini (&stroker->pen); } static void _translate_point (cairo_point_t *point, cairo_point_t *offset) { point->x += offset->x; point->y += offset->y; } static int _cairo_stroker_face_clockwise (cairo_stroke_face_t *in, cairo_stroke_face_t *out) { cairo_slope_t in_slope, out_slope; _cairo_slope_init (&in_slope, &in->point, &in->cw); _cairo_slope_init (&out_slope, &out->point, &out->cw); return _cairo_slope_compare (&in_slope, &out_slope) < 0; } /** * _cairo_slope_compare_sgn * * Return -1, 0 or 1 depending on the relative slopes of * two lines. */ static int _cairo_slope_compare_sgn (double dx1, double dy1, double dx2, double dy2) { double c = (dx1 * dy2 - dx2 * dy1); if (c > 0) return 1; if (c < 0) return -1; return 0; } static cairo_status_t _cairo_stroker_join (cairo_stroker_t *stroker, cairo_stroke_face_t *in, cairo_stroke_face_t *out) { int clockwise = _cairo_stroker_face_clockwise (out, in); cairo_point_t *inpt, *outpt; cairo_status_t status; if (in->cw.x == out->cw.x && in->cw.y == out->cw.y && in->ccw.x == out->ccw.x && in->ccw.y == out->ccw.y) { return CAIRO_STATUS_SUCCESS; } if (clockwise) { inpt = &in->ccw; outpt = &out->ccw; } else { inpt = &in->cw; outpt = &out->cw; } switch (stroker->style->line_join) { case CAIRO_LINE_JOIN_ROUND: { int i; int start, step, stop; cairo_point_t tri[3]; cairo_pen_t *pen = &stroker->pen; tri[0] = in->point; if (clockwise) { _cairo_pen_find_active_ccw_vertex_index (pen, &in->dev_vector, &start); step = -1; _cairo_pen_find_active_ccw_vertex_index (pen, &out->dev_vector, &stop); } else { _cairo_pen_find_active_cw_vertex_index (pen, &in->dev_vector, &start); step = +1; _cairo_pen_find_active_cw_vertex_index (pen, &out->dev_vector, &stop); } i = start; tri[1] = *inpt; while (i != stop) { tri[2] = in->point; _translate_point (&tri[2], &pen->vertices[i].point); status = _cairo_traps_tessellate_triangle (stroker->traps, tri); if (status) return status; tri[1] = tri[2]; i += step; if (i < 0) i = pen->num_vertices - 1; if (i >= pen->num_vertices) i = 0; } tri[2] = *outpt; return _cairo_traps_tessellate_triangle (stroker->traps, tri); } case CAIRO_LINE_JOIN_MITER: default: { /* dot product of incoming slope vector with outgoing slope vector */ double in_dot_out = ((-in->usr_vector.x * out->usr_vector.x)+ (-in->usr_vector.y * out->usr_vector.y)); double ml = stroker->style->miter_limit; /* Check the miter limit -- lines meeting at an acute angle * can generate long miters, the limit converts them to bevel * * Consider the miter join formed when two line segments * meet at an angle psi: * * /.\ * /. .\ * /./ \.\ * /./psi\.\ * * We can zoom in on the right half of that to see: * * |\ * | \ psi/2 * | \ * | \ * | \ * | \ * miter \ * length \ * | \ * | .\ * | . \ * |. line \ * \ width \ * \ \ * * * The right triangle in that figure, (the line-width side is * shown faintly with three '.' characters), gives us the * following expression relating miter length, angle and line * width: * * 1 /sin (psi/2) = miter_length / line_width * * The right-hand side of this relationship is the same ratio * in which the miter limit (ml) is expressed. We want to know * when the miter length is within the miter limit. That is * when the following condition holds: * * 1/sin(psi/2) <= ml * 1 <= ml sin(psi/2) * 1 <= ml² sin²(psi/2) * 2 <= ml² 2 sin²(psi/2) * 2·sin²(psi/2) = 1-cos(psi) * 2 <= ml² (1-cos(psi)) * * in · out = |in| |out| cos (psi) * * in and out are both unit vectors, so: * * in · out = cos (psi) * * 2 <= ml² (1 - in · out) * */ if (2 <= ml * ml * (1 - in_dot_out)) { double x1, y1, x2, y2; double mx, my; double dx1, dx2, dy1, dy2; cairo_point_t outer; cairo_point_t quad[4]; double ix, iy; double fdx1, fdy1, fdx2, fdy2; double mdx, mdy; /* * we've got the points already transformed to device * space, but need to do some computation with them and * also need to transform the slope from user space to * device space */ /* outer point of incoming line face */ x1 = _cairo_fixed_to_double (inpt->x); y1 = _cairo_fixed_to_double (inpt->y); dx1 = in->usr_vector.x; dy1 = in->usr_vector.y; cairo_matrix_transform_distance (stroker->ctm, &dx1, &dy1); /* outer point of outgoing line face */ x2 = _cairo_fixed_to_double (outpt->x); y2 = _cairo_fixed_to_double (outpt->y); dx2 = out->usr_vector.x; dy2 = out->usr_vector.y; cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); /* * Compute the location of the outer corner of the miter. * That's pretty easy -- just the intersection of the two * outer edges. We've got slopes and points on each * of those edges. Compute my directly, then compute * mx by using the edge with the larger dy; that avoids * dividing by values close to zero. */ my = (((x2 - x1) * dy1 * dy2 - y2 * dx2 * dy1 + y1 * dx1 * dy2) / (dx1 * dy2 - dx2 * dy1)); if (fabs (dy1) >= fabs (dy2)) mx = (my - y1) * dx1 / dy1 + x1; else mx = (my - y2) * dx2 / dy2 + x2; /* * When the two outer edges are nearly parallel, slight * perturbations in the position of the outer points of the lines * caused by representing them in fixed point form can cause the * intersection point of the miter to move a large amount. If * that moves the miter intersection from between the two faces, * then draw a bevel instead. */ ix = _cairo_fixed_to_double (in->point.x); iy = _cairo_fixed_to_double (in->point.y); /* slope of one face */ fdx1 = x1 - ix; fdy1 = y1 - iy; /* slope of the other face */ fdx2 = x2 - ix; fdy2 = y2 - iy; /* slope from the intersection to the miter point */ mdx = mx - ix; mdy = my - iy; /* * Make sure the miter point line lies between the two * faces by comparing the slopes */ if (_cairo_slope_compare_sgn (fdx1, fdy1, mdx, mdy) != _cairo_slope_compare_sgn (fdx2, fdy2, mdx, mdy)) { /* * Draw the quadrilateral */ outer.x = _cairo_fixed_from_double (mx); outer.y = _cairo_fixed_from_double (my); quad[0] = in->point; quad[1] = *inpt; quad[2] = outer; quad[3] = *outpt; return _cairo_traps_tessellate_convex_quad (stroker->traps, quad); } } /* fall through ... */ } case CAIRO_LINE_JOIN_BEVEL: { cairo_point_t tri[3]; tri[0] = in->point; tri[1] = *inpt; tri[2] = *outpt; return _cairo_traps_tessellate_triangle (stroker->traps, tri); } } } static cairo_status_t _cairo_stroker_add_cap (cairo_stroker_t *stroker, cairo_stroke_face_t *f) { cairo_status_t status; if (stroker->style->line_cap == CAIRO_LINE_CAP_BUTT) return CAIRO_STATUS_SUCCESS; switch (stroker->style->line_cap) { case CAIRO_LINE_CAP_ROUND: { int i; int start, stop; cairo_slope_t slope; cairo_point_t tri[3]; cairo_pen_t *pen = &stroker->pen; slope = f->dev_vector; _cairo_pen_find_active_cw_vertex_index (pen, &slope, &start); slope.dx = -slope.dx; slope.dy = -slope.dy; _cairo_pen_find_active_cw_vertex_index (pen, &slope, &stop); tri[0] = f->point; tri[1] = f->cw; for (i=start; i != stop; i = (i+1) % pen->num_vertices) { tri[2] = f->point; _translate_point (&tri[2], &pen->vertices[i].point); status = _cairo_traps_tessellate_triangle (stroker->traps, tri); if (status) return status; tri[1] = tri[2]; } tri[2] = f->ccw; return _cairo_traps_tessellate_triangle (stroker->traps, tri); } case CAIRO_LINE_CAP_SQUARE: { double dx, dy; cairo_slope_t fvector; cairo_point_t occw, ocw; cairo_polygon_t polygon; dx = f->usr_vector.x; dy = f->usr_vector.y; dx *= stroker->style->line_width / 2.0; dy *= stroker->style->line_width / 2.0; cairo_matrix_transform_distance (stroker->ctm, &dx, &dy); fvector.dx = _cairo_fixed_from_double (dx); fvector.dy = _cairo_fixed_from_double (dy); occw.x = f->ccw.x + fvector.dx; occw.y = f->ccw.y + fvector.dy; ocw.x = f->cw.x + fvector.dx; ocw.y = f->cw.y + fvector.dy; _cairo_polygon_init (&polygon); _cairo_polygon_move_to (&polygon, &f->cw); _cairo_polygon_line_to (&polygon, &ocw); _cairo_polygon_line_to (&polygon, &occw); _cairo_polygon_line_to (&polygon, &f->ccw); _cairo_polygon_close (&polygon); status = _cairo_polygon_status (&polygon); if (status == CAIRO_STATUS_SUCCESS) { status = _cairo_bentley_ottmann_tessellate_polygon (stroker->traps, &polygon, CAIRO_FILL_RULE_WINDING); } _cairo_polygon_fini (&polygon); return status; } case CAIRO_LINE_CAP_BUTT: default: return CAIRO_STATUS_SUCCESS; } } static cairo_status_t _cairo_stroker_add_leading_cap (cairo_stroker_t *stroker, cairo_stroke_face_t *face) { cairo_stroke_face_t reversed; cairo_point_t t; reversed = *face; /* The initial cap needs an outward facing vector. Reverse everything */ reversed.usr_vector.x = -reversed.usr_vector.x; reversed.usr_vector.y = -reversed.usr_vector.y; reversed.dev_vector.dx = -reversed.dev_vector.dx; reversed.dev_vector.dy = -reversed.dev_vector.dy; t = reversed.cw; reversed.cw = reversed.ccw; reversed.ccw = t; return _cairo_stroker_add_cap (stroker, &reversed); } static cairo_status_t _cairo_stroker_add_trailing_cap (cairo_stroker_t *stroker, cairo_stroke_face_t *face) { return _cairo_stroker_add_cap (stroker, face); } static inline cairo_bool_t _compute_normalized_device_slope (double *dx, double *dy, cairo_matrix_t *ctm_inverse, double *mag_out) { double dx0 = *dx, dy0 = *dy; double mag; cairo_matrix_transform_distance (ctm_inverse, &dx0, &dy0); if (dx0 == 0.0 && dy0 == 0.0) { if (mag_out) *mag_out = 0.0; return FALSE; } if (dx0 == 0.0) { *dx = 0.0; if (dy0 > 0.0) { mag = dy0; *dy = 1.0; } else { mag = -dy0; *dy = -1.0; } } else if (dy0 == 0.0) { *dy = 0.0; if (dx0 > 0.0) { mag = dx0; *dx = 1.0; } else { mag = -dx0; *dx = -1.0; } } else { mag = sqrt (dx0 * dx0 + dy0 * dy0); *dx = dx0 / mag; *dy = dy0 / mag; } if (mag_out) *mag_out = mag; return TRUE; } static void _compute_face (cairo_point_t *point, cairo_slope_t *dev_slope, double slope_dx, double slope_dy, cairo_stroker_t *stroker, cairo_stroke_face_t *face); static cairo_status_t _cairo_stroker_add_caps (cairo_stroker_t *stroker) { cairo_status_t status; /* check for a degenerative sub_path */ if (stroker->has_initial_sub_path && !stroker->has_first_face && !stroker->has_current_face && stroker->style->line_cap == CAIRO_LINE_JOIN_ROUND) { /* pick an arbitrary slope to use */ double dx = 1.0, dy = 0.0; cairo_slope_t slope = { CAIRO_FIXED_ONE, 0 }; cairo_stroke_face_t face; _compute_normalized_device_slope (&dx, &dy, stroker->ctm_inverse, NULL); /* arbitrarily choose first_point * first_point and current_point should be the same */ _compute_face (&stroker->first_point, &slope, dx, dy, stroker, &face); status = _cairo_stroker_add_leading_cap (stroker, &face); if (status) return status; status = _cairo_stroker_add_trailing_cap (stroker, &face); if (status) return status; } if (stroker->has_first_face) { status = _cairo_stroker_add_leading_cap (stroker, &stroker->first_face); if (status) return status; } if (stroker->has_current_face) { status = _cairo_stroker_add_trailing_cap (stroker, &stroker->current_face); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static void _compute_face (cairo_point_t *point, cairo_slope_t *dev_slope, double slope_dx, double slope_dy, cairo_stroker_t *stroker, cairo_stroke_face_t *face) { double face_dx, face_dy; cairo_point_t offset_ccw, offset_cw; /* * rotate to get a line_width/2 vector along the face, note that * the vector must be rotated the right direction in device space, * but by 90° in user space. So, the rotation depends on * whether the ctm reflects or not, and that can be determined * by looking at the determinant of the matrix. */ if (stroker->ctm_det_positive) { face_dx = - slope_dy * (stroker->style->line_width / 2.0); face_dy = slope_dx * (stroker->style->line_width / 2.0); } else { face_dx = slope_dy * (stroker->style->line_width / 2.0); face_dy = - slope_dx * (stroker->style->line_width / 2.0); } /* back to device space */ cairo_matrix_transform_distance (stroker->ctm, &face_dx, &face_dy); offset_ccw.x = _cairo_fixed_from_double (face_dx); offset_ccw.y = _cairo_fixed_from_double (face_dy); offset_cw.x = -offset_ccw.x; offset_cw.y = -offset_ccw.y; face->ccw = *point; _translate_point (&face->ccw, &offset_ccw); face->point = *point; face->cw = *point; _translate_point (&face->cw, &offset_cw); face->usr_vector.x = slope_dx; face->usr_vector.y = slope_dy; face->dev_vector = *dev_slope; } static cairo_status_t _cairo_stroker_add_sub_edge (cairo_stroker_t *stroker, cairo_point_t *p1, cairo_point_t *p2, cairo_slope_t *dev_slope, double slope_dx, double slope_dy, cairo_stroke_face_t *start, cairo_stroke_face_t *end) { cairo_point_t rectangle[4]; _compute_face (p1, dev_slope, slope_dx, slope_dy, stroker, start); /* XXX: This could be optimized slightly by not calling _compute_face again but rather translating the relevant fields from start. */ _compute_face (p2, dev_slope, slope_dx, slope_dy, stroker, end); if (p1->x == p2->x && p1->y == p2->y) return CAIRO_STATUS_SUCCESS; rectangle[0] = start->cw; rectangle[1] = start->ccw; rectangle[2] = end->ccw; rectangle[3] = end->cw; return _cairo_traps_tessellate_convex_quad (stroker->traps, rectangle); } static cairo_status_t _cairo_stroker_move_to (void *closure, cairo_point_t *point) { cairo_status_t status; cairo_stroker_t *stroker = closure; /* Cap the start and end of the previous sub path as needed */ status = _cairo_stroker_add_caps (stroker); if (status) return status; stroker->first_point = *point; stroker->current_point = *point; stroker->has_first_face = FALSE; stroker->has_current_face = FALSE; stroker->has_initial_sub_path = FALSE; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_stroker_move_to_dashed (void *closure, cairo_point_t *point) { /* reset the dash pattern for new sub paths */ cairo_stroker_t *stroker = closure; _cairo_stroker_start_dash (stroker); return _cairo_stroker_move_to (closure, point); } static cairo_status_t _cairo_stroker_line_to (void *closure, cairo_point_t *point) { cairo_status_t status; cairo_stroker_t *stroker = closure; cairo_stroke_face_t start, end; cairo_point_t *p1 = &stroker->current_point; cairo_point_t *p2 = point; cairo_slope_t dev_slope; double slope_dx, slope_dy; stroker->has_initial_sub_path = TRUE; if (p1->x == p2->x && p1->y == p2->y) return CAIRO_STATUS_SUCCESS; _cairo_slope_init (&dev_slope, p1, p2); slope_dx = _cairo_fixed_to_double (p2->x - p1->x); slope_dy = _cairo_fixed_to_double (p2->y - p1->y); _compute_normalized_device_slope (&slope_dx, &slope_dy, stroker->ctm_inverse, NULL); status = _cairo_stroker_add_sub_edge (stroker, p1, p2, &dev_slope, slope_dx, slope_dy, &start, &end); if (status) return status; if (stroker->has_current_face) { /* Join with final face from previous segment */ status = _cairo_stroker_join (stroker, &stroker->current_face, &start); if (status) return status; } else if (!stroker->has_first_face) { /* Save sub path's first face in case needed for closing join */ stroker->first_face = start; stroker->has_first_face = TRUE; } stroker->current_face = end; stroker->has_current_face = TRUE; stroker->current_point = *point; return CAIRO_STATUS_SUCCESS; } /* * Dashed lines. Cap each dash end, join around turns when on */ static cairo_status_t _cairo_stroker_line_to_dashed (void *closure, cairo_point_t *point) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_stroker_t *stroker = closure; double mag, remain, step_length = 0; double slope_dx, slope_dy; double dx2, dy2; cairo_stroke_face_t sub_start, sub_end; cairo_point_t *p1 = &stroker->current_point; cairo_point_t *p2 = point; cairo_slope_t dev_slope; cairo_bool_t fully_in_bounds = TRUE; cairo_line_t segment; stroker->has_initial_sub_path = stroker->dash_starts_on; if (p1->x == p2->x && p1->y == p2->y) return CAIRO_STATUS_SUCCESS; if (stroker->has_bounds && (!_cairo_box_contains_point (&stroker->bounds, p1) || !_cairo_box_contains_point (&stroker->bounds, p2))) { fully_in_bounds = FALSE; } _cairo_slope_init (&dev_slope, p1, p2); slope_dx = _cairo_fixed_to_double (p2->x - p1->x); slope_dy = _cairo_fixed_to_double (p2->y - p1->y); if (!_compute_normalized_device_slope (&slope_dx, &slope_dy, stroker->ctm_inverse, &mag)) return CAIRO_STATUS_SUCCESS; remain = mag; segment.p1 = *p1; while (remain) { step_length = MIN (stroker->dash_remain, remain); remain -= step_length; dx2 = slope_dx * (mag - remain); dy2 = slope_dy * (mag - remain); cairo_matrix_transform_distance (stroker->ctm, &dx2, &dy2); segment.p2.x = _cairo_fixed_from_double (dx2) + p1->x; segment.p2.y = _cairo_fixed_from_double (dy2) + p1->y; if (fully_in_bounds || _cairo_box_intersects_line_segment (&stroker->bounds, &segment)) { if (stroker->dash_on) { status = _cairo_stroker_add_sub_edge (stroker, &segment.p1, &segment.p2, &dev_slope, slope_dx, slope_dy, &sub_start, &sub_end); if (status) return status; if (stroker->has_current_face) { /* Join with final face from previous segment */ status = _cairo_stroker_join (stroker, &stroker->current_face, &sub_start); stroker->has_current_face = FALSE; if (status) return status; } else if (!stroker->has_first_face && stroker->dash_starts_on) { /* Save sub path's first face in case needed for closing join */ stroker->first_face = sub_start; stroker->has_first_face = TRUE; } else { /* Cap dash start if not connecting to a previous segment */ status = _cairo_stroker_add_leading_cap (stroker, &sub_start); if (status) return status; } if (remain) { /* Cap dash end if not at end of segment */ status = _cairo_stroker_add_trailing_cap (stroker, &sub_end); if (status) return status; } else { stroker->current_face = sub_end; stroker->has_current_face = TRUE; } } else { if (stroker->has_current_face) { /* Cap final face from previous segment */ status = _cairo_stroker_add_trailing_cap (stroker, &stroker->current_face); if (status) return status; stroker->has_current_face = FALSE; } } } _cairo_stroker_step_dash (stroker, step_length); segment.p1 = segment.p2; } if (stroker->dash_on && !stroker->has_current_face) { /* This segment ends on a transition to dash_on, compute a new face * and add cap for the begining of the next dash_on step. * * Note: this will create a degenerate cap if this is not the last line * in the path. Whether this behaviour is desirable or not is debatable. * On one side these degnerate caps can not be reproduced with regular path stroking. * On the other side Acroread 7 also produces the degenerate caps. */ _compute_face (point, &dev_slope, slope_dx, slope_dy, stroker, &stroker->current_face); stroker->has_current_face = TRUE; status = _cairo_stroker_add_leading_cap (stroker, &stroker->current_face); if (status) return status; } stroker->current_point = *point; return status; } static cairo_status_t _cairo_stroker_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_stroker_t *stroker = closure; cairo_spline_t spline; cairo_pen_t pen; cairo_stroke_face_t start, end; cairo_point_t extra_points[4]; cairo_point_t *a = &stroker->current_point; double initial_slope_dx, initial_slope_dy; double final_slope_dx, final_slope_dy; status = _cairo_spline_init (&spline, a, b, c, d); if (status == CAIRO_INT_STATUS_DEGENERATE) return _cairo_stroker_line_to (closure, d); status = _cairo_pen_init_copy (&pen, &stroker->pen); if (status) goto CLEANUP_SPLINE; initial_slope_dx = _cairo_fixed_to_double (spline.initial_slope.dx); initial_slope_dy = _cairo_fixed_to_double (spline.initial_slope.dy); final_slope_dx = _cairo_fixed_to_double (spline.final_slope.dx); final_slope_dy = _cairo_fixed_to_double (spline.final_slope.dy); if (_compute_normalized_device_slope (&initial_slope_dx, &initial_slope_dy, stroker->ctm_inverse, NULL)) _compute_face (a, &spline.initial_slope, initial_slope_dx, initial_slope_dy, stroker, &start); if (_compute_normalized_device_slope (&final_slope_dx, &final_slope_dy, stroker->ctm_inverse, NULL)) _compute_face (d, &spline.final_slope, final_slope_dx, final_slope_dy, stroker, &end); if (stroker->has_current_face) { status = _cairo_stroker_join (stroker, &stroker->current_face, &start); if (status) goto CLEANUP_PEN; } else if (!stroker->has_first_face) { stroker->first_face = start; stroker->has_first_face = TRUE; } stroker->current_face = end; stroker->has_current_face = TRUE; extra_points[0] = start.cw; extra_points[0].x -= start.point.x; extra_points[0].y -= start.point.y; extra_points[1] = start.ccw; extra_points[1].x -= start.point.x; extra_points[1].y -= start.point.y; extra_points[2] = end.cw; extra_points[2].x -= end.point.x; extra_points[2].y -= end.point.y; extra_points[3] = end.ccw; extra_points[3].x -= end.point.x; extra_points[3].y -= end.point.y; status = _cairo_pen_add_points (&pen, extra_points, 4); if (status) goto CLEANUP_PEN; status = _cairo_pen_stroke_spline (&pen, &spline, stroker->tolerance, stroker->traps); if (status) goto CLEANUP_PEN; CLEANUP_PEN: _cairo_pen_fini (&pen); CLEANUP_SPLINE: _cairo_spline_fini (&spline); stroker->current_point = *d; return status; } /* We're using two different algorithms here for dashed and un-dashed * splines. The dashed algorithm uses the existing line dashing * code. It's linear in path length, but gets subtly wrong results for * self-intersecting paths (an outstanding but for self-intersecting * non-curved paths as well). The non-dashed algorithm tessellates a * single polygon for the whole curve. It handles the * self-intersecting problem, but it's (unsurprisingly) not O(n) and * more significantly, it doesn't yet handle dashes. * * The only reason we're doing split algorithms here is to * minimize the impact of fixing the splines-aren't-dashed bug for * 1.0.2. Long-term the right answer is to rewrite the whole pile * of stroking code so that the entire result is computed as a * single polygon that is tessellated, (that is, stroking can be * built on top of filling). That will solve the self-intersecting * problem. It will also increase the importance of implementing * an efficient and more robust tessellator. */ static cairo_status_t _cairo_stroker_curve_to_dashed (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_stroker_t *stroker = closure; cairo_spline_t spline; cairo_point_t *a = &stroker->current_point; cairo_line_join_t line_join_save; int i; status = _cairo_spline_init (&spline, a, b, c, d); if (status == CAIRO_INT_STATUS_DEGENERATE) return _cairo_stroker_line_to_dashed (closure, d); /* If the line width is so small that the pen is reduced to a single point, then we have nothing to do. */ if (stroker->pen.num_vertices <= 1) goto CLEANUP_SPLINE; /* Temporarily modify the stroker to use round joins to guarantee * smooth stroked curves. */ line_join_save = stroker->style->line_join; stroker->style->line_join = CAIRO_LINE_JOIN_ROUND; status = _cairo_spline_decompose (&spline, stroker->tolerance); if (status) goto CLEANUP_GSTATE; for (i = 1; i < spline.num_points; i++) { if (stroker->dashed) status = _cairo_stroker_line_to_dashed (stroker, &spline.points[i]); else status = _cairo_stroker_line_to (stroker, &spline.points[i]); if (status) break; } CLEANUP_GSTATE: stroker->style->line_join = line_join_save; CLEANUP_SPLINE: _cairo_spline_fini (&spline); return status; } static cairo_status_t _cairo_stroker_close_path (void *closure) { cairo_status_t status; cairo_stroker_t *stroker = closure; if (stroker->dashed) status = _cairo_stroker_line_to_dashed (stroker, &stroker->first_point); else status = _cairo_stroker_line_to (stroker, &stroker->first_point); if (status) return status; if (stroker->has_first_face && stroker->has_current_face) { /* Join first and final faces of sub path */ status = _cairo_stroker_join (stroker, &stroker->current_face, &stroker->first_face); if (status) return status; } else { /* Cap the start and end of the sub path as needed */ status = _cairo_stroker_add_caps (stroker); if (status) return status; } stroker->has_initial_sub_path = FALSE; stroker->has_first_face = FALSE; stroker->has_current_face = FALSE; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_path_fixed_stroke_rectilinear (cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_traps_t *traps); cairo_status_t _cairo_path_fixed_stroke_to_traps (cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_traps_t *traps) { cairo_status_t status; cairo_stroker_t stroker; /* Before we do anything else, we attempt the rectilinear * stroker. It's careful to generate trapezoids that align to * device-pixel boundaries when possible. Many backends can render * those much faster than non-aligned trapezoids, (by using clip * regions, etc.) */ status = _cairo_path_fixed_stroke_rectilinear (path, stroke_style, ctm, traps); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_stroker_init (&stroker, stroke_style, ctm, ctm_inverse, tolerance, traps); if (status) return status; if (stroker.style->dash) status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_stroker_move_to_dashed, _cairo_stroker_line_to_dashed, _cairo_stroker_curve_to_dashed, _cairo_stroker_close_path, &stroker); else status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_stroker_move_to, _cairo_stroker_line_to, _cairo_stroker_curve_to, _cairo_stroker_close_path, &stroker); if (status) goto BAIL; /* Cap the start and end of the final sub path as needed */ status = _cairo_stroker_add_caps (&stroker); BAIL: _cairo_stroker_fini (&stroker); return status; } typedef struct _cairo_rectilinear_stroker { cairo_stroke_style_t *stroke_style; cairo_fixed_t half_line_width; cairo_traps_t *traps; cairo_point_t current_point; cairo_point_t first_point; cairo_bool_t open_sub_path; cairo_line_t *segments; int segments_size; int num_segments; } cairo_rectilinear_stroker_t; static void _cairo_rectilinear_stroker_init (cairo_rectilinear_stroker_t *stroker, cairo_stroke_style_t *stroke_style, cairo_traps_t *traps) { stroker->stroke_style = stroke_style; stroker->half_line_width = _cairo_fixed_from_double (stroke_style->line_width / 2.0); stroker->traps = traps; stroker->open_sub_path = FALSE; stroker->segments = NULL; stroker->segments_size = 0; stroker->num_segments = 0; } static void _cairo_rectilinear_stroker_fini (cairo_rectilinear_stroker_t *stroker) { free (stroker->segments); } static cairo_status_t _cairo_rectilinear_stroker_add_segment (cairo_rectilinear_stroker_t *stroker, cairo_point_t *p1, cairo_point_t *p2) { int new_size; cairo_line_t *new_segments; if (stroker->num_segments == stroker->segments_size) { new_size = stroker->segments_size * 2; /* Common case is one rectangle of exactly 4 segments. */ if (new_size == 0) new_size = 4; new_segments = _cairo_realloc_ab (stroker->segments, new_size, sizeof (cairo_line_t)); if (new_segments == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); stroker->segments_size = new_size; stroker->segments = new_segments; } stroker->segments[stroker->num_segments].p1 = *p1; stroker->segments[stroker->num_segments].p2 = *p2; stroker->num_segments++; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_rectilinear_stroker_emit_segments (cairo_rectilinear_stroker_t *stroker) { cairo_status_t status; cairo_line_cap_t line_cap = stroker->stroke_style->line_cap; cairo_fixed_t half_line_width = stroker->half_line_width; cairo_bool_t lengthen_initial, shorten_final, lengthen_final; cairo_point_t *a, *b; cairo_point_t r[4]; int i; for (i = 0; i < stroker->num_segments; i++) { a = &stroker->segments[i].p1; b = &stroker->segments[i].p2; /* For each segment we generate a single rectangular * trapezoid. This rectangle is based on a perpendicular * extension (by half the line width) of the segment endpoints * after some adjustments of the endpoints to account for caps * and joins. */ /* We adjust the initial point of the segment to extend the * rectangle to include the previous cap or join, (this * adjustment applies to all segments except for the first * segment of open, butt-capped paths). */ lengthen_initial = TRUE; if (i == 0 && stroker->open_sub_path && line_cap == CAIRO_LINE_CAP_BUTT) lengthen_initial = FALSE; /* The adjustment of the final point is trickier. For all but * the last segment we shorten the segment at the final * endpoint to not overlap with the subsequent join. For the * last segment we do the same shortening if the path is * closed. If the path is open and butt-capped we do no * adjustment, while if it's open and square-capped we do a * lengthening adjustment instead to include the cap. */ shorten_final = TRUE; lengthen_final = FALSE; if (i == stroker->num_segments - 1 && stroker->open_sub_path) { shorten_final = FALSE; if (line_cap == CAIRO_LINE_CAP_SQUARE) lengthen_final = TRUE; } /* Perform the adjustments of the endpoints. */ if (a->y == b->y) { if (a->x < b->x) { if (lengthen_initial) a->x -= half_line_width; if (shorten_final) b->x -= half_line_width; else if (lengthen_final) b->x += half_line_width; } else { if (lengthen_initial) a->x += half_line_width; if (shorten_final) b->x += half_line_width; else if (lengthen_final) b->x -= half_line_width; } } else { if (a->y < b->y) { if (lengthen_initial) a->y -= half_line_width; if (shorten_final) b->y -= half_line_width; else if (lengthen_final) b->y += half_line_width; } else { if (lengthen_initial) a->y += half_line_width; if (shorten_final) b->y += half_line_width; else if (lengthen_final) b->y -= half_line_width; } } /* Form the rectangle by expanding by half the line width in * either perdendicular direction. */ r[0] = *a; r[1] = *b; r[2] = *b; r[3] = *a; if (a->y == b->y) { r[0].y -= half_line_width; r[1].y -= half_line_width; r[2].y += half_line_width; r[3].y += half_line_width; } else { r[0].x -= half_line_width; r[1].x -= half_line_width; r[2].x += half_line_width; r[3].x += half_line_width; } status = _cairo_traps_tessellate_convex_quad (stroker->traps, r); if (status) return status; } stroker->num_segments = 0; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_rectilinear_stroker_move_to (void *closure, cairo_point_t *point) { cairo_rectilinear_stroker_t *stroker = closure; cairo_status_t status; status = _cairo_rectilinear_stroker_emit_segments (stroker); if (status) return status; stroker->current_point = *point; stroker->first_point = *point; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_rectilinear_stroker_line_to (void *closure, cairo_point_t *point) { cairo_rectilinear_stroker_t *stroker = closure; cairo_point_t *a = &stroker->current_point; cairo_point_t *b = point; cairo_status_t status; /* We only support horizontal or vertical elements. */ if (! (a->x == b->x || a->y == b->y)) return CAIRO_INT_STATUS_UNSUPPORTED; /* We don't draw anything for degenerate paths. */ if (a->x == b->x && a->y == b->y) return CAIRO_STATUS_SUCCESS; status = _cairo_rectilinear_stroker_add_segment (stroker, a, b); stroker->current_point = *point; stroker->open_sub_path = TRUE; return status; } static cairo_status_t _cairo_rectilinear_stroker_close_path (void *closure) { cairo_rectilinear_stroker_t *stroker = closure; cairo_status_t status; /* We don't draw anything for degenerate paths. */ if (! stroker->open_sub_path) return CAIRO_STATUS_SUCCESS; status = _cairo_rectilinear_stroker_line_to (stroker, &stroker->first_point); if (status) return status; stroker->open_sub_path = FALSE; status = _cairo_rectilinear_stroker_emit_segments (stroker); if (status) return status; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_path_fixed_stroke_rectilinear (cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_traps_t *traps) { cairo_rectilinear_stroker_t rectilinear_stroker; cairo_int_status_t status; /* This special-case rectilinear stroker only supports * miter-joined lines (not curves) and no dashing and a * translation-only matrix (though it could probably be extended * to support a matrix with uniform, integer sacling). * * It also only supports horizontal and vertical line_to * elements. But we don't catch that here, but instead return * UNSUPPORTED from _cairo_rectilinear_stroker_line_to if any * non-rectilinear line_to is encountered. */ if (path->has_curve_to) return CAIRO_INT_STATUS_UNSUPPORTED; if (stroke_style->line_join != CAIRO_LINE_JOIN_MITER) return CAIRO_INT_STATUS_UNSUPPORTED; /* If the miter limit turns right angles into bevels, then we * can't use this optimization. Remember, the ratio is * 1/sin(ɸ/2). So the cutoff is 1/sin(Ï€/4.0) or ⎷2, * which we round for safety. */ if (stroke_style->miter_limit < M_SQRT2) return CAIRO_INT_STATUS_UNSUPPORTED; if (stroke_style->dash) return CAIRO_INT_STATUS_UNSUPPORTED; if (! (stroke_style->line_cap == CAIRO_LINE_CAP_BUTT || stroke_style->line_cap == CAIRO_LINE_CAP_SQUARE)) { return CAIRO_INT_STATUS_UNSUPPORTED; } if (! (_cairo_matrix_is_identity (ctm) || _cairo_matrix_is_translation (ctm))) { return CAIRO_INT_STATUS_UNSUPPORTED; } _cairo_rectilinear_stroker_init (&rectilinear_stroker, stroke_style, traps); status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_rectilinear_stroker_move_to, _cairo_rectilinear_stroker_line_to, NULL, _cairo_rectilinear_stroker_close_path, &rectilinear_stroker); if (status) goto BAIL; status = _cairo_rectilinear_stroker_emit_segments (&rectilinear_stroker); BAIL: _cairo_rectilinear_stroker_fini (&rectilinear_stroker); if (status) _cairo_traps_fini (traps); return status; } libgdiplus-2.11/cairo/src/cairo-unicode.c0000664000175000017500000002317512225470167015305 00000000000000/* cairo_unicode.c: Unicode conversion routines * * The code in this file is derived from GLib's gutf8.c and * ultimately from libunicode. It is relicensed under the * dual LGPL/MPL with permission of the original authors. * * Copyright © 1999 Tom Tromey * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Tom Tromey. * and Red Hat, Inc. * * Contributor(s): * Owen Taylor */ #include "cairoint.h" #define UTF8_COMPUTE(Char, Mask, Len) \ if (Char < 128) \ { \ Len = 1; \ Mask = 0x7f; \ } \ else if ((Char & 0xe0) == 0xc0) \ { \ Len = 2; \ Mask = 0x1f; \ } \ else if ((Char & 0xf0) == 0xe0) \ { \ Len = 3; \ Mask = 0x0f; \ } \ else if ((Char & 0xf8) == 0xf0) \ { \ Len = 4; \ Mask = 0x07; \ } \ else if ((Char & 0xfc) == 0xf8) \ { \ Len = 5; \ Mask = 0x03; \ } \ else if ((Char & 0xfe) == 0xfc) \ { \ Len = 6; \ Mask = 0x01; \ } \ else \ Len = -1; #define UTF8_LENGTH(Char) \ ((Char) < 0x80 ? 1 : \ ((Char) < 0x800 ? 2 : \ ((Char) < 0x10000 ? 3 : \ ((Char) < 0x200000 ? 4 : \ ((Char) < 0x4000000 ? 5 : 6))))) #define UTF8_GET(Result, Chars, Count, Mask, Len) \ (Result) = (Chars)[0] & (Mask); \ for ((Count) = 1; (Count) < (Len); ++(Count)) \ { \ if (((Chars)[(Count)] & 0xc0) != 0x80) \ { \ (Result) = -1; \ break; \ } \ (Result) <<= 6; \ (Result) |= ((Chars)[(Count)] & 0x3f); \ } #define UNICODE_VALID(Char) \ ((Char) < 0x110000 && \ (((Char) & 0xFFFFF800) != 0xD800) && \ ((Char) < 0xFDD0 || (Char) > 0xFDEF) && \ ((Char) & 0xFFFE) != 0xFFFE) static const char utf8_skip_data[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; #define UTF8_NEXT_CHAR(p) ((p) + utf8_skip_data[*(unsigned char *)(p)]) /* Converts a sequence of bytes encoded as UTF-8 to a Unicode character. * If @p does not point to a valid UTF-8 encoded character, results are * undefined. **/ static uint32_t _utf8_get_char (const unsigned char *p) { int i, mask = 0, len; uint32_t result; unsigned char c = (unsigned char) *p; UTF8_COMPUTE (c, mask, len); if (len == -1) return (uint32_t)-1; UTF8_GET (result, p, i, mask, len); return result; } /* Like _utf8_get_char, but take a maximum length * and return (uint32_t)-2 on incomplete trailing character */ static uint32_t _utf8_get_char_extended (const unsigned char *p, long max_len) { int i, len; uint32_t wc = (unsigned char) *p; if (wc < 0x80) { return wc; } else if (wc < 0xc0) { return (uint32_t)-1; } else if (wc < 0xe0) { len = 2; wc &= 0x1f; } else if (wc < 0xf0) { len = 3; wc &= 0x0f; } else if (wc < 0xf8) { len = 4; wc &= 0x07; } else if (wc < 0xfc) { len = 5; wc &= 0x03; } else if (wc < 0xfe) { len = 6; wc &= 0x01; } else { return (uint32_t)-1; } if (max_len >= 0 && len > max_len) { for (i = 1; i < max_len; i++) { if ((((unsigned char *)p)[i] & 0xc0) != 0x80) return (uint32_t)-1; } return (uint32_t)-2; } for (i = 1; i < len; ++i) { uint32_t ch = ((unsigned char *)p)[i]; if ((ch & 0xc0) != 0x80) { if (ch) return (uint32_t)-1; else return (uint32_t)-2; } wc <<= 6; wc |= (ch & 0x3f); } if (UTF8_LENGTH(wc) != len) return (uint32_t)-1; return wc; } /** * _cairo_utf8_to_utf32: * @str: an UTF-8 string * @len: length of @str in bytes, or -1 if it is nul-terminated. * If @len is supplied and the string has an embedded nul * byte, only the portion before the nul byte is converted. * @result: location to store a pointer to a newly allocated UTF-32 * string (always native endian). Free with free(). A 0 * word will be written after the last character. * @items_written: location to store number of 32-bit words * written. (Not including the trailing 0) * * Converts a UTF-8 string to UCS-4. UCS-4 is an encoding of Unicode * with 1 32-bit word per character. The string is validated to * consist entirely of valid Unicode characters. * * Return value: %CAIRO_STATUS_SUCCESS if the entire string was * successfully converted. %CAIRO_STATUS_INVALID_STRING if an * an invalid sequence was found. **/ cairo_status_t _cairo_utf8_to_ucs4 (const unsigned char *str, int len, uint32_t **result, int *items_written) { uint32_t *str32 = NULL; int n_chars, i; const unsigned char *in; in = str; n_chars = 0; while ((len < 0 || str + len - in > 0) && *in) { uint32_t wc = _utf8_get_char_extended (in, str + len - in); if (wc & 0x80000000 || !UNICODE_VALID (wc)) return _cairo_error (CAIRO_STATUS_INVALID_STRING); n_chars++; if (n_chars == INT_MAX) return _cairo_error (CAIRO_STATUS_INVALID_STRING); in = UTF8_NEXT_CHAR (in); } str32 = _cairo_malloc_ab (n_chars + 1, sizeof (uint32_t)); if (!str32) return _cairo_error (CAIRO_STATUS_NO_MEMORY); in = str; for (i=0; i < n_chars; i++) { str32[i] = _utf8_get_char (in); in = UTF8_NEXT_CHAR (in); } str32[i] = 0; *result = str32; if (items_written) *items_written = n_chars; return CAIRO_STATUS_SUCCESS; } #if CAIRO_HAS_UTF8_TO_UTF16 /** * _cairo_utf8_to_utf16: * @str: an UTF-8 string * @len: length of @str in bytes, or -1 if it is nul-terminated. * If @len is supplied and the string has an embedded nul * byte, only the portion before the nul byte is converted. * @result: location to store a pointer to a newly allocated UTF-16 * string (always native endian). Free with free(). A 0 * word will be written after the last character. * @items_written: location to store number of 16-bit words * written. (Not including the trailing 0) * * Converts a UTF-8 string to UTF-16. UTF-16 is an encoding of Unicode * where characters are represented either as a single 16-bit word, or * as a pair of 16-bit "surrogates". The string is validated to * consist entirely of valid Unicode characters. * * Return value: %CAIRO_STATUS_SUCCESS if the entire string was * successfully converted. %CAIRO_STATUS_INVALID_STRING if an * an invalid sequence was found. **/ cairo_status_t _cairo_utf8_to_utf16 (const unsigned char *str, int len, uint16_t **result, int *items_written) { uint16_t *str16 = NULL; int n16, i; const unsigned char *in; in = str; n16 = 0; while ((len < 0 || str + len - in > 0) && *in) { uint32_t wc = _utf8_get_char_extended (in, str + len - in); if (wc & 0x80000000 || !UNICODE_VALID (wc)) return _cairo_error (CAIRO_STATUS_INVALID_STRING); if (wc < 0x10000) n16 += 1; else n16 += 2; if (n16 == INT_MAX - 1 || n16 == INT_MAX) return _cairo_error (CAIRO_STATUS_INVALID_STRING); in = UTF8_NEXT_CHAR (in); } str16 = _cairo_malloc_ab (n16 + 1, sizeof (uint16_t)); if (!str16) return _cairo_error (CAIRO_STATUS_NO_MEMORY); in = str; for (i = 0; i < n16;) { uint32_t wc = _utf8_get_char (in); if (wc < 0x10000) { str16[i++] = wc; } else { str16[i++] = (wc - 0x10000) / 0x400 + 0xd800; str16[i++] = (wc - 0x10000) % 0x400 + 0xdc00; } in = UTF8_NEXT_CHAR (in); } str16[i] = 0; *result = str16; if (items_written) *items_written = n16; return CAIRO_STATUS_SUCCESS; } #endif libgdiplus-2.11/cairo/src/cairo-pdf-surface.c0000664000175000017500000044553312225470167016064 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2006 Red Hat, Inc * Copyright © 2007, 2008 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Carl Worth * Adrian Johnson */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" #include "cairo-pdf.h" #include "cairo-pdf-surface-private.h" #include "cairo-pdf-operators-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-paginated-private.h" #include "cairo-output-stream-private.h" #include "cairo-meta-surface-private.h" #include #include /* Issues: * * - We embed an image in the stream each time it's composited. We * could add generation counters to surfaces and remember the stream * ID for a particular generation for a particular surface. * * - Backend specific meta data. */ /* * Page Structure of the Generated PDF: * * Each page requiring fallbacks images contains a knockout group at * the top level. The first operation of the knockout group paints a * group containing all the supported drawing operations. Fallback * images (if any) are painted in the knockout group. This ensures * that fallback images do not composite with any content under the * fallback images. * * Streams: * * This PDF surface has three types of streams: * - PDF Stream * - Content Stream * - Group Stream * * Calling _cairo_output_stream_printf (surface->output, ...) will * write to the currently open stream. * * PDF Stream: * A PDF Stream may be opened and closed with the following functions: * _cairo_pdf_surface_open stream () * _cairo_pdf_surface_close_stream () * * PDF Streams are written directly to the PDF file. They are used for * fonts, images and patterns. * * Content Stream: * The Content Stream is opened and closed with the following functions: * _cairo_pdf_surface_open_content_stream () * _cairo_pdf_surface_close_content_stream () * * The Content Stream contains the text and graphics operators. * * Group Stream: * A Group Stream may be opened and closed with the following functions: * _cairo_pdf_surface_open_group () * _cairo_pdf_surface_close_group () * * A Group Stream is a Form XObject. It is used for short sequences * of operators. As the content is very short the group is stored in * memory until it is closed. This allows some optimization such as * including the Resource dictionary and stream length inside the * XObject instead of using an indirect object. */ typedef struct _cairo_pdf_object { long offset; } cairo_pdf_object_t; typedef struct _cairo_pdf_font { unsigned int font_id; unsigned int subset_id; cairo_pdf_resource_t subset_resource; } cairo_pdf_font_t; typedef struct _cairo_pdf_rgb_linear_function { cairo_pdf_resource_t resource; double color1[3]; double color2[3]; } cairo_pdf_rgb_linear_function_t; typedef struct _cairo_pdf_alpha_linear_function { cairo_pdf_resource_t resource; double alpha1; double alpha2; } cairo_pdf_alpha_linear_function_t; static cairo_pdf_resource_t _cairo_pdf_surface_new_object (cairo_pdf_surface_t *surface); static void _cairo_pdf_surface_clear (cairo_pdf_surface_t *surface); static void _cairo_pdf_smask_group_destroy (cairo_pdf_smask_group_t *group); static cairo_status_t _cairo_pdf_surface_add_font (unsigned int font_id, unsigned int subset_id, void *closure); static void _cairo_pdf_group_resources_init (cairo_pdf_group_resources_t *res); static cairo_status_t _cairo_pdf_surface_open_stream (cairo_pdf_surface_t *surface, cairo_pdf_resource_t *resource, cairo_bool_t compressed, const char *fmt, ...) CAIRO_PRINTF_FORMAT(4, 5); static cairo_status_t _cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface); static cairo_status_t _cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface); static void _cairo_pdf_surface_write_pages (cairo_pdf_surface_t *surface); static cairo_pdf_resource_t _cairo_pdf_surface_write_info (cairo_pdf_surface_t *surface); static cairo_pdf_resource_t _cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface); static long _cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface); static cairo_status_t _cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface); static cairo_status_t _cairo_pdf_surface_emit_font_subsets (cairo_pdf_surface_t *surface); static const cairo_surface_backend_t cairo_pdf_surface_backend; static const cairo_paginated_surface_backend_t cairo_pdf_surface_paginated_backend; static cairo_pdf_resource_t _cairo_pdf_surface_new_object (cairo_pdf_surface_t *surface) { cairo_pdf_resource_t resource; cairo_status_t status; cairo_pdf_object_t object; object.offset = _cairo_output_stream_get_position (surface->output); status = _cairo_array_append (&surface->objects, &object); if (status) { resource.id = 0; return resource; } resource = surface->next_available_resource; surface->next_available_resource.id++; return resource; } static void _cairo_pdf_surface_update_object (cairo_pdf_surface_t *surface, cairo_pdf_resource_t resource) { cairo_pdf_object_t *object; object = _cairo_array_index (&surface->objects, resource.id - 1); object->offset = _cairo_output_stream_get_position (surface->output); } static void _cairo_pdf_surface_set_size_internal (cairo_pdf_surface_t *surface, double width, double height) { surface->width = width; surface->height = height; cairo_matrix_init (&surface->cairo_to_pdf, 1, 0, 0, -1, 0, height); _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, &surface->cairo_to_pdf); } static cairo_surface_t * _cairo_pdf_surface_create_for_stream_internal (cairo_output_stream_t *output, double width, double height) { cairo_pdf_surface_t *surface; cairo_status_t status, status_ignored; surface = malloc (sizeof (cairo_pdf_surface_t)); if (surface == NULL) { /* destroy stream on behalf of caller */ status = _cairo_output_stream_destroy (output); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } _cairo_surface_init (&surface->base, &cairo_pdf_surface_backend, CAIRO_CONTENT_COLOR_ALPHA); surface->output = output; surface->width = width; surface->height = height; cairo_matrix_init (&surface->cairo_to_pdf, 1, 0, 0, -1, 0, height); _cairo_array_init (&surface->objects, sizeof (cairo_pdf_object_t)); _cairo_array_init (&surface->pages, sizeof (cairo_pdf_resource_t)); _cairo_array_init (&surface->rgb_linear_functions, sizeof (cairo_pdf_rgb_linear_function_t)); _cairo_array_init (&surface->alpha_linear_functions, sizeof (cairo_pdf_alpha_linear_function_t)); _cairo_array_init (&surface->fonts, sizeof (cairo_pdf_font_t)); _cairo_array_init (&surface->patterns, sizeof (cairo_pdf_pattern_t)); _cairo_array_init (&surface->smask_groups, sizeof (cairo_pdf_smask_group_t *)); _cairo_array_init (&surface->knockout_group, sizeof (cairo_pdf_resource_t)); _cairo_pdf_group_resources_init (&surface->resources); surface->font_subsets = _cairo_scaled_font_subsets_create_composite (); if (! surface->font_subsets) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL0; } surface->next_available_resource.id = 1; surface->pages_resource = _cairo_pdf_surface_new_object (surface); if (surface->pages_resource.id == 0) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL1; } surface->compress_content = TRUE; surface->pdf_stream.active = FALSE; surface->pdf_stream.old_output = NULL; surface->group_stream.active = FALSE; surface->group_stream.stream = NULL; surface->group_stream.mem_stream = NULL; surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; surface->force_fallbacks = FALSE; surface->select_pattern_gstate_saved = FALSE; _cairo_pdf_operators_init (&surface->pdf_operators, surface->output, &surface->cairo_to_pdf, surface->font_subsets); _cairo_pdf_operators_set_font_subsets_callback (&surface->pdf_operators, _cairo_pdf_surface_add_font, surface); /* Document header */ _cairo_output_stream_printf (surface->output, "%%PDF-1.4\n"); _cairo_output_stream_printf (surface->output, "%%%c%c%c%c\n", 181, 237, 174, 251); surface->paginated_surface = _cairo_paginated_surface_create ( &surface->base, CAIRO_CONTENT_COLOR_ALPHA, width, height, &cairo_pdf_surface_paginated_backend); status = surface->paginated_surface->status; if (status == CAIRO_STATUS_SUCCESS) return surface->paginated_surface; BAIL1: _cairo_scaled_font_subsets_destroy (surface->font_subsets); BAIL0: _cairo_array_fini (&surface->objects); free (surface); /* destroy stream on behalf of caller */ status_ignored = _cairo_output_stream_destroy (output); return _cairo_surface_create_in_error (status); } /** * cairo_pdf_surface_create_for_stream: * @write_func: a #cairo_write_func_t to accept the output data * @closure: the closure argument for @write_func * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a PDF surface of the specified size in points to be written * incrementally to the stream represented by @write_func and @closure. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 */ cairo_surface_t * cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points) { cairo_output_stream_t *output; output = _cairo_output_stream_create (write_func, NULL, closure); if (_cairo_output_stream_get_status (output)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (output)); return _cairo_pdf_surface_create_for_stream_internal (output, width_in_points, height_in_points); } /** * cairo_pdf_surface_create: * @filename: a filename for the PDF output (must be writable) * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a PDF surface of the specified size in points to be written * to @filename. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 **/ cairo_surface_t * cairo_pdf_surface_create (const char *filename, double width_in_points, double height_in_points) { cairo_output_stream_t *output; output = _cairo_output_stream_create_for_filename (filename); if (_cairo_output_stream_get_status (output)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (output)); return _cairo_pdf_surface_create_for_stream_internal (output, width_in_points, height_in_points); } static cairo_bool_t _cairo_surface_is_pdf (cairo_surface_t *surface) { return surface->backend == &cairo_pdf_surface_backend; } /* If the abstract_surface is a paginated surface, and that paginated * surface's target is a pdf_surface, then set pdf_surface to that * target. Otherwise return %CAIRO_STATUS_SURFACE_TYPE_MISMATCH. */ static cairo_status_t _extract_pdf_surface (cairo_surface_t *surface, cairo_pdf_surface_t **pdf_surface) { cairo_surface_t *target; if (surface->status) return surface->status; if (! _cairo_surface_is_paginated (surface)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); target = _cairo_paginated_surface_get_target (surface); if (target->status) return target->status; if (! _cairo_surface_is_pdf (target)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); *pdf_surface = (cairo_pdf_surface_t *) target; return CAIRO_STATUS_SUCCESS; } /** * cairo_pdf_surface_set_size: * @surface: a PDF #cairo_surface_t * @width_in_points: new surface width, in points (1 point == 1/72.0 inch) * @height_in_points: new surface height, in points (1 point == 1/72.0 inch) * * Changes the size of a PDF surface for the current (and * subsequent) pages. * * This function should only be called before any drawing operations * have been performed on the current page. The simplest way to do * this is to call this function immediately after creating the * surface or immediately after completing a page with either * cairo_show_page() or cairo_copy_page(). * * Since: 1.2 **/ void cairo_pdf_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points) { cairo_pdf_surface_t *pdf_surface = NULL; /* hide compiler warning */ cairo_status_t status; status = _extract_pdf_surface (surface, &pdf_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } _cairo_pdf_surface_set_size_internal (pdf_surface, width_in_points, height_in_points); status = _cairo_paginated_surface_set_size (pdf_surface->paginated_surface, width_in_points, height_in_points); if (status) status = _cairo_surface_set_error (surface, status); } static void _cairo_pdf_surface_clear (cairo_pdf_surface_t *surface) { int i, size; cairo_pdf_pattern_t *pattern; cairo_pdf_smask_group_t *group; size = _cairo_array_num_elements (&surface->patterns); for (i = 0; i < size; i++) { pattern = (cairo_pdf_pattern_t *) _cairo_array_index (&surface->patterns, i); cairo_pattern_destroy (pattern->pattern); } _cairo_array_truncate (&surface->patterns, 0); size = _cairo_array_num_elements (&surface->smask_groups); for (i = 0; i < size; i++) { _cairo_array_copy_element (&surface->smask_groups, i, &group); _cairo_pdf_smask_group_destroy (group); } _cairo_array_truncate (&surface->smask_groups, 0); _cairo_array_truncate (&surface->knockout_group, 0); } static void _cairo_pdf_group_resources_init (cairo_pdf_group_resources_t *res) { _cairo_array_init (&res->alphas, sizeof (double)); _cairo_array_init (&res->smasks, sizeof (cairo_pdf_resource_t)); _cairo_array_init (&res->patterns, sizeof (cairo_pdf_resource_t)); _cairo_array_init (&res->xobjects, sizeof (cairo_pdf_resource_t)); _cairo_array_init (&res->fonts, sizeof (cairo_pdf_font_t)); } static void _cairo_pdf_group_resources_fini (cairo_pdf_group_resources_t *res) { _cairo_array_fini (&res->alphas); _cairo_array_fini (&res->smasks); _cairo_array_fini (&res->patterns); _cairo_array_fini (&res->xobjects); _cairo_array_fini (&res->fonts); } static void _cairo_pdf_group_resources_clear (cairo_pdf_group_resources_t *res) { _cairo_array_truncate (&res->alphas, 0); _cairo_array_truncate (&res->smasks, 0); _cairo_array_truncate (&res->patterns, 0); _cairo_array_truncate (&res->xobjects, 0); _cairo_array_truncate (&res->fonts, 0); } static cairo_status_t _cairo_pdf_surface_add_alpha (cairo_pdf_surface_t *surface, double alpha, int *index) { int num_alphas, i; double other; cairo_status_t status; cairo_pdf_group_resources_t *res = &surface->resources; num_alphas = _cairo_array_num_elements (&res->alphas); for (i = 0; i < num_alphas; i++) { _cairo_array_copy_element (&res->alphas, i, &other); if (alpha == other) { *index = i; return CAIRO_STATUS_SUCCESS; } } status = _cairo_array_append (&res->alphas, &alpha); if (status) return status; *index = _cairo_array_num_elements (&res->alphas) - 1; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_add_smask (cairo_pdf_surface_t *surface, cairo_pdf_resource_t smask) { return _cairo_array_append (&(surface->resources.smasks), &smask); } static cairo_status_t _cairo_pdf_surface_add_pattern (cairo_pdf_surface_t *surface, cairo_pdf_resource_t pattern) { return _cairo_array_append (&(surface->resources.patterns), &pattern); } static cairo_status_t _cairo_pdf_surface_add_xobject (cairo_pdf_surface_t *surface, cairo_pdf_resource_t xobject) { return _cairo_array_append (&(surface->resources.xobjects), &xobject); } static cairo_status_t _cairo_pdf_surface_add_font (unsigned int font_id, unsigned int subset_id, void *closure) { cairo_pdf_surface_t *surface = closure; cairo_pdf_font_t font; int num_fonts, i; cairo_status_t status; cairo_pdf_group_resources_t *res = &surface->resources; num_fonts = _cairo_array_num_elements (&res->fonts); for (i = 0; i < num_fonts; i++) { _cairo_array_copy_element (&res->fonts, i, &font); if (font.font_id == font_id && font.subset_id == subset_id) return CAIRO_STATUS_SUCCESS; } num_fonts = _cairo_array_num_elements (&surface->fonts); for (i = 0; i < num_fonts; i++) { _cairo_array_copy_element (&surface->fonts, i, &font); if (font.font_id == font_id && font.subset_id == subset_id) return _cairo_array_append (&res->fonts, &font); } font.font_id = font_id; font.subset_id = subset_id; font.subset_resource = _cairo_pdf_surface_new_object (surface); if (font.subset_resource.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_array_append (&surface->fonts, &font); if (status) return status; return _cairo_array_append (&res->fonts, &font); } static cairo_pdf_resource_t _cairo_pdf_surface_get_font_resource (cairo_pdf_surface_t *surface, unsigned int font_id, unsigned int subset_id) { cairo_pdf_font_t font; int num_fonts, i; num_fonts = _cairo_array_num_elements (&surface->fonts); for (i = 0; i < num_fonts; i++) { _cairo_array_copy_element (&surface->fonts, i, &font); if (font.font_id == font_id && font.subset_id == subset_id) return font.subset_resource; } font.subset_resource.id = 0; return font.subset_resource; } static void _cairo_pdf_surface_emit_group_resources (cairo_pdf_surface_t *surface, cairo_pdf_group_resources_t *res) { int num_alphas, num_smasks, num_resources, i; double alpha; cairo_pdf_resource_t *smask, *pattern, *xobject; cairo_pdf_font_t *font; _cairo_output_stream_printf (surface->output, "<<\n"); num_alphas = _cairo_array_num_elements (&res->alphas); num_smasks = _cairo_array_num_elements (&res->smasks); if (num_alphas > 0 || num_smasks > 0) { _cairo_output_stream_printf (surface->output, " /ExtGState <<\n"); for (i = 0; i < num_alphas; i++) { _cairo_array_copy_element (&res->alphas, i, &alpha); _cairo_output_stream_printf (surface->output, " /a%d << /CA %f /ca %f >>\n", i, alpha, alpha); } for (i = 0; i < num_smasks; i++) { smask = _cairo_array_index (&res->smasks, i); _cairo_output_stream_printf (surface->output, " /s%d %d 0 R\n", smask->id, smask->id); } _cairo_output_stream_printf (surface->output, " >>\n"); } num_resources = _cairo_array_num_elements (&res->patterns); if (num_resources > 0) { _cairo_output_stream_printf (surface->output, " /Pattern <<"); for (i = 0; i < num_resources; i++) { pattern = _cairo_array_index (&res->patterns, i); _cairo_output_stream_printf (surface->output, " /p%d %d 0 R", pattern->id, pattern->id); } _cairo_output_stream_printf (surface->output, " >>\n"); } num_resources = _cairo_array_num_elements (&res->xobjects); if (num_resources > 0) { _cairo_output_stream_printf (surface->output, " /XObject <<"); for (i = 0; i < num_resources; i++) { xobject = _cairo_array_index (&res->xobjects, i); _cairo_output_stream_printf (surface->output, " /x%d %d 0 R", xobject->id, xobject->id); } _cairo_output_stream_printf (surface->output, " >>\n"); } num_resources = _cairo_array_num_elements (&res->fonts); if (num_resources > 0) { _cairo_output_stream_printf (surface->output," /Font <<\n"); for (i = 0; i < num_resources; i++) { font = _cairo_array_index (&res->fonts, i); _cairo_output_stream_printf (surface->output, " /f-%d-%d %d 0 R\n", font->font_id, font->subset_id, font->subset_resource.id); } _cairo_output_stream_printf (surface->output, " >>\n"); } _cairo_output_stream_printf (surface->output, ">>\n"); } static cairo_pdf_smask_group_t * _cairo_pdf_surface_create_smask_group (cairo_pdf_surface_t *surface) { cairo_pdf_smask_group_t *group; group = calloc (1, sizeof (cairo_pdf_smask_group_t)); if (group == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } group->group_res = _cairo_pdf_surface_new_object (surface); if (group->group_res.id == 0) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); free (group); return NULL; } group->width = surface->width; group->height = surface->height; return group; } static void _cairo_pdf_smask_group_destroy (cairo_pdf_smask_group_t *group) { if (group->operation == PDF_FILL || group->operation == PDF_STROKE) _cairo_path_fixed_fini (&group->path); if (group->source) cairo_pattern_destroy (group->source); if (group->mask) cairo_pattern_destroy (group->mask); if (group->glyphs) free (group->glyphs); if (group->scaled_font) cairo_scaled_font_destroy (group->scaled_font); free (group); } static cairo_status_t _cairo_pdf_surface_add_smask_group (cairo_pdf_surface_t *surface, cairo_pdf_smask_group_t *group) { return _cairo_array_append (&surface->smask_groups, &group); } static cairo_status_t _cairo_pdf_surface_add_pdf_pattern (cairo_pdf_surface_t *surface, cairo_pattern_t *pattern, cairo_pdf_resource_t *pattern_res, cairo_pdf_resource_t *gstate_res) { cairo_pdf_pattern_t pdf_pattern; cairo_status_t status; /* Solid colors are emitted into the content stream */ if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { pattern_res->id = 0; gstate_res->id = 0; return CAIRO_STATUS_SUCCESS; } /* Gradients with zero stops do not produce any output */ if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { cairo_gradient_pattern_t *gradient; gradient = (cairo_gradient_pattern_t *) pattern; if (gradient->n_stops == 0) return CAIRO_INT_STATUS_NOTHING_TO_DO; } pdf_pattern.pattern = cairo_pattern_reference (pattern); pdf_pattern.pattern_res = _cairo_pdf_surface_new_object (surface); if (pdf_pattern.pattern_res.id == 0) { cairo_pattern_destroy (pattern); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } pdf_pattern.gstate_res.id = 0; /* gradient patterns require an smask object to implement transparency */ if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { if (_cairo_pattern_is_opaque (pattern) == FALSE) { pdf_pattern.gstate_res = _cairo_pdf_surface_new_object (surface); if (pdf_pattern.gstate_res.id == 0) { cairo_pattern_destroy (pattern); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } } pdf_pattern.width = surface->width; pdf_pattern.height = surface->height; *pattern_res = pdf_pattern.pattern_res; *gstate_res = pdf_pattern.gstate_res; status = _cairo_array_append (&surface->patterns, &pdf_pattern); if (status) { cairo_pattern_destroy (pattern); return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_open_stream (cairo_pdf_surface_t *surface, cairo_pdf_resource_t *resource, cairo_bool_t compressed, const char *fmt, ...) { va_list ap; cairo_pdf_resource_t self, length; cairo_output_stream_t *output = NULL; if (resource) { self = *resource; _cairo_pdf_surface_update_object (surface, self); } else { self = _cairo_pdf_surface_new_object (surface); if (self.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } length = _cairo_pdf_surface_new_object (surface); if (length.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (compressed) { output = _cairo_deflate_stream_create (surface->output); if (_cairo_output_stream_get_status (output)) return _cairo_output_stream_destroy (output); } surface->pdf_stream.active = TRUE; surface->pdf_stream.self = self; surface->pdf_stream.length = length; surface->pdf_stream.compressed = compressed; _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Length %d 0 R\n", surface->pdf_stream.self.id, surface->pdf_stream.length.id); if (compressed) _cairo_output_stream_printf (surface->output, " /Filter /FlateDecode\n"); if (fmt != NULL) { va_start (ap, fmt); _cairo_output_stream_vprintf (surface->output, fmt, ap); va_end (ap); } _cairo_output_stream_printf (surface->output, ">>\n" "stream\n"); surface->pdf_stream.start_offset = _cairo_output_stream_get_position (surface->output); if (compressed) { assert (surface->pdf_stream.old_output == NULL); surface->pdf_stream.old_output = surface->output; surface->output = output; _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); } return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_close_stream (cairo_pdf_surface_t *surface) { cairo_status_t status = CAIRO_STATUS_SUCCESS; long length; if (! surface->pdf_stream.active) return CAIRO_STATUS_SUCCESS; if (surface->pdf_stream.compressed) { status = _cairo_output_stream_destroy (surface->output); surface->output = surface->pdf_stream.old_output; _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); surface->pdf_stream.old_output = NULL; _cairo_output_stream_printf (surface->output, "\n"); } length = _cairo_output_stream_get_position (surface->output) - surface->pdf_stream.start_offset; _cairo_output_stream_printf (surface->output, "endstream\n" "endobj\n"); _cairo_pdf_surface_update_object (surface, surface->pdf_stream.length); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" " %ld\n" "endobj\n", surface->pdf_stream.length.id, length); surface->pdf_stream.active = FALSE; if (status == CAIRO_STATUS_SUCCESS) status = _cairo_output_stream_get_status (surface->output); return status; } static void _cairo_pdf_surface_write_memory_stream (cairo_pdf_surface_t *surface, cairo_output_stream_t *mem_stream, cairo_pdf_resource_t resource, cairo_pdf_group_resources_t *resources, cairo_bool_t is_knockout_group) { _cairo_pdf_surface_update_object (surface, resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /XObject\n" " /Length %d\n", resource.id, _cairo_memory_stream_length (mem_stream)); if (surface->compress_content) { _cairo_output_stream_printf (surface->output, " /Filter /FlateDecode\n"); } _cairo_output_stream_printf (surface->output, " /Subtype /Form\n" " /BBox [ 0 0 %f %f ]\n" " /Group <<\n" " /Type /Group\n" " /S /Transparency\n" " /CS /DeviceRGB\n", surface->width, surface->height); if (is_knockout_group) _cairo_output_stream_printf (surface->output, " /K true\n"); _cairo_output_stream_printf (surface->output, " >>\n" " /Resources\n"); _cairo_pdf_surface_emit_group_resources (surface, resources); _cairo_output_stream_printf (surface->output, ">>\n" "stream\n"); _cairo_memory_stream_copy (mem_stream, surface->output); _cairo_output_stream_printf (surface->output, "endstream\n" "endobj\n"); } static cairo_status_t _cairo_pdf_surface_open_group (cairo_pdf_surface_t *surface, cairo_pdf_resource_t *resource) { cairo_status_t status; assert (surface->pdf_stream.active == FALSE); assert (surface->group_stream.active == FALSE); surface->group_stream.active = TRUE; surface->group_stream.mem_stream = _cairo_memory_stream_create (); if (surface->compress_content) { surface->group_stream.stream = _cairo_deflate_stream_create (surface->group_stream.mem_stream); } else { surface->group_stream.stream = surface->group_stream.mem_stream; } status = _cairo_output_stream_get_status (surface->group_stream.stream); surface->group_stream.old_output = surface->output; surface->output = surface->group_stream.stream; _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); _cairo_pdf_group_resources_clear (&surface->resources); if (resource) { surface->group_stream.resource = *resource; } else { surface->group_stream.resource = _cairo_pdf_surface_new_object (surface); if (surface->group_stream.resource.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } surface->group_stream.is_knockout = FALSE; return status; } static cairo_status_t _cairo_pdf_surface_open_knockout_group (cairo_pdf_surface_t *surface) { cairo_status_t status; status = _cairo_pdf_surface_open_group (surface, NULL); if (status) return status; surface->group_stream.is_knockout = TRUE; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_close_group (cairo_pdf_surface_t *surface, cairo_pdf_resource_t *group) { cairo_status_t status = CAIRO_STATUS_SUCCESS, status2; assert (surface->pdf_stream.active == FALSE); assert (surface->group_stream.active == TRUE); if (surface->compress_content) { status = _cairo_output_stream_destroy (surface->group_stream.stream); surface->group_stream.stream = NULL; _cairo_output_stream_printf (surface->group_stream.mem_stream, "\n"); } surface->output = surface->group_stream.old_output; _cairo_pdf_operators_set_stream (&surface->pdf_operators, surface->output); surface->group_stream.active = FALSE; _cairo_pdf_surface_write_memory_stream (surface, surface->group_stream.mem_stream, surface->group_stream.resource, &surface->resources, surface->group_stream.is_knockout); if (group) *group = surface->group_stream.resource; status2 = _cairo_output_stream_destroy (surface->group_stream.mem_stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; surface->group_stream.mem_stream = NULL; surface->group_stream.stream = NULL; return status; } static cairo_status_t _cairo_pdf_surface_open_content_stream (cairo_pdf_surface_t *surface, cairo_bool_t is_form) { cairo_status_t status; assert (surface->pdf_stream.active == FALSE); assert (surface->group_stream.active == FALSE); surface->content_resources = _cairo_pdf_surface_new_object (surface); if (surface->content_resources.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (is_form) { status = _cairo_pdf_surface_open_stream (surface, NULL, surface->compress_content, " /Type /XObject\n" " /Subtype /Form\n" " /BBox [ 0 0 %f %f ]\n" " /Group <<\n" " /Type /Group\n" " /S /Transparency\n" " /CS /DeviceRGB\n" " >>\n" " /Resources %d 0 R\n", surface->width, surface->height, surface->content_resources.id); } else { status = _cairo_pdf_surface_open_stream (surface, NULL, surface->compress_content, NULL); } if (status) return status; surface->content = surface->pdf_stream.self; _cairo_output_stream_printf (surface->output, "q\n"); return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_close_content_stream (cairo_pdf_surface_t *surface) { cairo_status_t status; assert (surface->pdf_stream.active == TRUE); assert (surface->group_stream.active == FALSE); _cairo_output_stream_printf (surface->output, "Q\n"); status = _cairo_pdf_surface_close_stream (surface); if (status) return status; _cairo_pdf_surface_update_object (surface, surface->content_resources); _cairo_output_stream_printf (surface->output, "%d 0 obj\n", surface->content_resources.id); _cairo_pdf_surface_emit_group_resources (surface, &surface->resources); _cairo_output_stream_printf (surface->output, "endobj\n"); return _cairo_output_stream_get_status (surface->output); } static cairo_surface_t * _cairo_pdf_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); } static cairo_status_t _cairo_pdf_surface_finish (void *abstract_surface) { cairo_pdf_surface_t *surface = abstract_surface; long offset; cairo_pdf_resource_t info, catalog; cairo_status_t status, status2; status = surface->base.status; if (status == CAIRO_STATUS_SUCCESS) status = _cairo_pdf_surface_emit_font_subsets (surface); _cairo_pdf_surface_write_pages (surface); info = _cairo_pdf_surface_write_info (surface); if (info.id == 0 && status == CAIRO_STATUS_SUCCESS) status = _cairo_error (CAIRO_STATUS_NO_MEMORY); catalog = _cairo_pdf_surface_write_catalog (surface); if (catalog.id == 0 && status == CAIRO_STATUS_SUCCESS) status = _cairo_error (CAIRO_STATUS_NO_MEMORY); offset = _cairo_pdf_surface_write_xref (surface); _cairo_output_stream_printf (surface->output, "trailer\n" "<< /Size %d\n" " /Root %d 0 R\n" " /Info %d 0 R\n" ">>\n", surface->next_available_resource.id, catalog.id, info.id); _cairo_output_stream_printf (surface->output, "startxref\n" "%ld\n" "%%%%EOF\n", offset); _cairo_pdf_operators_fini (&surface->pdf_operators); /* close any active streams still open due to fatal errors */ status2 = _cairo_pdf_surface_close_stream (surface); if (status == CAIRO_STATUS_SUCCESS) status = status2; if (surface->group_stream.stream != NULL) { status2 = _cairo_output_stream_destroy (surface->group_stream.stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (surface->group_stream.mem_stream != NULL) { status2 = _cairo_output_stream_destroy (surface->group_stream.mem_stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (surface->pdf_stream.active) surface->output = surface->pdf_stream.old_output; if (surface->group_stream.active) surface->output = surface->group_stream.old_output; /* and finish the pdf surface */ status2 = _cairo_output_stream_destroy (surface->output); if (status == CAIRO_STATUS_SUCCESS) status = status2; _cairo_pdf_surface_clear (surface); _cairo_pdf_group_resources_fini (&surface->resources); _cairo_array_fini (&surface->objects); _cairo_array_fini (&surface->pages); _cairo_array_fini (&surface->rgb_linear_functions); _cairo_array_fini (&surface->alpha_linear_functions); _cairo_array_fini (&surface->patterns); _cairo_array_fini (&surface->smask_groups); _cairo_array_fini (&surface->fonts); _cairo_array_fini (&surface->knockout_group); if (surface->font_subsets) { _cairo_scaled_font_subsets_destroy (surface->font_subsets); surface->font_subsets = NULL; } return status; } static cairo_int_status_t _cairo_pdf_surface_start_page (void *abstract_surface) { cairo_status_t status; cairo_pdf_surface_t *surface = abstract_surface; surface->has_fallback_images = FALSE; _cairo_pdf_group_resources_clear (&surface->resources); status = _cairo_pdf_surface_open_content_stream (surface, TRUE); if (status) return status; return CAIRO_STATUS_SUCCESS; } /* Emit alpha channel from the image into the given data, providing * an id that can be used to reference the resulting SMask object. * * In the case that the alpha channel happens to be all opaque, then * no SMask object will be emitted and *id_ret will be set to 0. */ static cairo_status_t _cairo_pdf_surface_emit_smask (cairo_pdf_surface_t *surface, cairo_image_surface_t *image, cairo_pdf_resource_t *stream_ret) { cairo_status_t status = CAIRO_STATUS_SUCCESS; char *alpha; unsigned long alpha_size; uint32_t *pixel32; uint8_t *pixel8; int i, x, y; cairo_bool_t opaque; uint8_t a; /* This is the only image format we support, which simplifies things. */ assert (image->format == CAIRO_FORMAT_ARGB32 || image->format == CAIRO_FORMAT_A8 || image->format == CAIRO_FORMAT_A1 ); stream_ret->id = 0; if (image->format == CAIRO_FORMAT_A1) { alpha_size = (image->width + 7) / 8 * image->height; alpha = _cairo_malloc_ab ((image->width+7) / 8, image->height); } else { alpha_size = image->height * image->width; alpha = _cairo_malloc_ab (image->height, image->width); } if (alpha == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP; } opaque = TRUE; i = 0; for (y = 0; y < image->height; y++) { if (image->format == CAIRO_FORMAT_ARGB32) { pixel32 = (uint32_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel32++) { a = (*pixel32 & 0xff000000) >> 24; alpha[i++] = a; if (a != 0xff) opaque = FALSE; } } else if (image->format == CAIRO_FORMAT_A8){ pixel8 = (uint8_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel8++) { a = *pixel8; alpha[i++] = a; if (a != 0xff) opaque = FALSE; } } else { /* image->format == CAIRO_FORMAT_A1 */ pixel8 = (uint8_t *) (image->data + y * image->stride); for (x = 0; x < (image->width + 7) / 8; x++, pixel8++) { a = *pixel8; a = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (a); alpha[i++] = a; if (a != 0xff) opaque = FALSE; } } } /* Bail out without emitting smask if it's all opaque. */ if (opaque) goto CLEANUP_ALPHA; status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, " /Type /XObject\n" " /Subtype /Image\n" " /Width %d\n" " /Height %d\n" " /ColorSpace /DeviceGray\n" " /BitsPerComponent %d\n", image->width, image->height, image->format == CAIRO_FORMAT_A1 ? 1 : 8); if (status) goto CLEANUP_ALPHA; *stream_ret = surface->pdf_stream.self; _cairo_output_stream_write (surface->output, alpha, alpha_size); status = _cairo_pdf_surface_close_stream (surface); CLEANUP_ALPHA: free (alpha); CLEANUP: return status; } /* Emit image data into the given surface, providing a resource that * can be used to reference the data in image_ret. */ static cairo_status_t _cairo_pdf_surface_emit_image (cairo_pdf_surface_t *surface, cairo_image_surface_t *image, cairo_pdf_resource_t *image_ret) { cairo_status_t status = CAIRO_STATUS_SUCCESS; char *rgb; unsigned long rgb_size; uint32_t *pixel; int i, x, y; cairo_pdf_resource_t smask = {0}; /* squelch bogus compiler warning */ cairo_bool_t need_smask; /* These are the only image formats we currently support, (which * makes things a lot simpler here). This is enforced through * _cairo_pdf_surface_analyze_operation which only accept source surfaces of * CONTENT_COLOR or CONTENT_COLOR_ALPHA. */ assert (image->format == CAIRO_FORMAT_RGB24 || image->format == CAIRO_FORMAT_ARGB32 || image->format == CAIRO_FORMAT_A8 || image->format == CAIRO_FORMAT_A1); rgb_size = image->height * image->width * 3; rgb = _cairo_malloc_abc (image->width, image->height, 3); if (rgb == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP; } i = 0; for (y = 0; y < image->height; y++) { pixel = (uint32_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel++) { /* XXX: We're un-premultiplying alpha here. My reading of the PDF * specification suggests that we should be able to avoid having * to do this by filling in the SMask's Matte dictionary * appropriately, but my attempts to do that so far have * failed. */ if (image->format == CAIRO_FORMAT_ARGB32) { uint8_t a; a = (*pixel & 0xff000000) >> 24; if (a == 0) { rgb[i++] = 0; rgb[i++] = 0; rgb[i++] = 0; } else { rgb[i++] = (((*pixel & 0xff0000) >> 16) * 255 + a / 2) / a; rgb[i++] = (((*pixel & 0x00ff00) >> 8) * 255 + a / 2) / a; rgb[i++] = (((*pixel & 0x0000ff) >> 0) * 255 + a / 2) / a; } } else if (image->format == CAIRO_FORMAT_RGB24) { rgb[i++] = (*pixel & 0x00ff0000) >> 16; rgb[i++] = (*pixel & 0x0000ff00) >> 8; rgb[i++] = (*pixel & 0x000000ff) >> 0; } else { rgb[i++] = 0; rgb[i++] = 0; rgb[i++] = 0; } } } need_smask = FALSE; if (image->format == CAIRO_FORMAT_ARGB32 || image->format == CAIRO_FORMAT_A8 || image->format == CAIRO_FORMAT_A1) { status = _cairo_pdf_surface_emit_smask (surface, image, &smask); if (status) goto CLEANUP_RGB; if (smask.id) need_smask = TRUE; } #define IMAGE_DICTIONARY " /Type /XObject\n" \ " /Subtype /Image\n" \ " /Width %d\n" \ " /Height %d\n" \ " /ColorSpace /DeviceRGB\n" \ " /BitsPerComponent 8\n" if (need_smask) status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, IMAGE_DICTIONARY " /SMask %d 0 R\n", image->width, image->height, smask.id); else status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, IMAGE_DICTIONARY, image->width, image->height); if (status) goto CLEANUP_RGB; #undef IMAGE_DICTIONARY *image_ret = surface->pdf_stream.self; _cairo_output_stream_write (surface->output, rgb, rgb_size); status = _cairo_pdf_surface_close_stream (surface); CLEANUP_RGB: free (rgb); CLEANUP: return status; } static cairo_status_t _cairo_pdf_surface_emit_image_surface (cairo_pdf_surface_t *surface, cairo_surface_pattern_t *pattern, cairo_pdf_resource_t *resource, int *width, int *height) { cairo_image_surface_t *image; void *image_extra; cairo_status_t status; status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra); if (status) goto BAIL; status = _cairo_pdf_surface_emit_image (surface, image, resource); if (status) goto BAIL; *width = image->width; *height = image->height; BAIL: _cairo_surface_release_source_image (pattern->surface, image, image_extra); return status; } static cairo_status_t _cairo_pdf_surface_emit_meta_surface (cairo_pdf_surface_t *surface, cairo_surface_t *meta_surface, cairo_pdf_resource_t *resource) { double old_width, old_height; cairo_paginated_mode_t old_paginated_mode; cairo_clip_t *old_clip; cairo_rectangle_int_t meta_extents; cairo_status_t status, status2; int alpha = 0; status = _cairo_surface_get_extents (meta_surface, &meta_extents); if (status) return status; old_width = surface->width; old_height = surface->height; old_paginated_mode = surface->paginated_mode; old_clip = _cairo_surface_get_clip (&surface->base); _cairo_pdf_surface_set_size_internal (surface, meta_extents.width, meta_extents.height); /* Patterns are emitted after fallback images. The paginated mode * needs to be set to _RENDER while the meta surface is replayed * back to this surface. */ surface->paginated_mode = CAIRO_PAGINATED_MODE_RENDER; _cairo_pdf_group_resources_clear (&surface->resources); status = _cairo_pdf_surface_open_content_stream (surface, TRUE); if (status) return status; *resource = surface->content; if (cairo_surface_get_content (meta_surface) == CAIRO_CONTENT_COLOR) { status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); if (status) goto CLEANUP_GROUP; _cairo_output_stream_printf (surface->output, "q /a%d gs 0 0 0 rg 0 0 %f %f re f Q\n", alpha, surface->width, surface->height); } status = _cairo_meta_surface_replay_region (meta_surface, &surface->base, CAIRO_META_REGION_NATIVE); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); if (status) goto CLEANUP_GROUP; status = _cairo_pdf_surface_close_content_stream (surface); CLEANUP_GROUP: _cairo_pdf_surface_set_size_internal (surface, old_width, old_height); surface->paginated_mode = old_paginated_mode; status2 = _cairo_surface_set_clip (&surface->base, old_clip); if (status == CAIRO_STATUS_SUCCESS) status = status2; return status; } static cairo_status_t _cairo_pdf_surface_emit_surface_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern_t *pdf_pattern) { cairo_surface_pattern_t *pattern = (cairo_surface_pattern_t *) pdf_pattern->pattern; cairo_status_t status; cairo_pdf_resource_t pattern_resource = {0}; /* squelch bogus compiler warning */ cairo_matrix_t cairo_p2d, pdf_p2d; cairo_extend_t extend = cairo_pattern_get_extend (&pattern->base); double xstep, ystep; cairo_rectangle_int_t surface_extents; int pattern_width = 0; /* squelch bogus compiler warning */ int pattern_height = 0; /* squelch bogus compiler warning */ int bbox_x, bbox_y; char draw_surface[200]; if (_cairo_surface_is_meta (pattern->surface)) { cairo_surface_t *meta_surface = pattern->surface; cairo_rectangle_int_t pattern_extents; status = _cairo_pdf_surface_emit_meta_surface (surface, meta_surface, &pattern_resource); if (status) return status; status = _cairo_surface_get_extents (meta_surface, &pattern_extents); if (status) return status; pattern_width = pattern_extents.width; pattern_height = pattern_extents.height; } else { status = _cairo_pdf_surface_emit_image_surface (surface, pattern, &pattern_resource, &pattern_width, &pattern_height); if (status) return status; } status = _cairo_surface_get_extents (&surface->base, &surface_extents); if (status) return status; bbox_x = pattern_width; bbox_y = pattern_height; switch (extend) { /* We implement EXTEND_PAD like EXTEND_NONE for now */ case CAIRO_EXTEND_PAD: case CAIRO_EXTEND_NONE: { /* In PS/PDF, (as far as I can tell), all patterns are * repeating. So we support cairo's EXTEND_NONE semantics * by setting the repeat step size to a size large enough * to guarantee that no more than a single occurrence will * be visible. * * First, map the surface extents into pattern space (since * xstep and ystep are in pattern space). Then use an upper * bound on the length of the diagonal of the pattern image * and the surface as repeat size. This guarantees to never * repeat visibly. */ double x1 = 0.0, y1 = 0.0; double x2 = surface->width, y2 = surface->height; _cairo_matrix_transform_bounding_box (&pattern->base.matrix, &x1, &y1, &x2, &y2, NULL); /* Rather than computing precise bounds of the union, just * add the surface extents unconditionally. We only * required an answer that's large enough, we don't really * care if it's not as tight as possible.*/ xstep = ystep = ceil ((x2 - x1) + (y2 - y1) + pattern_width + pattern_height); } break; case CAIRO_EXTEND_REPEAT: xstep = pattern_width; ystep = pattern_height; break; case CAIRO_EXTEND_REFLECT: bbox_x = pattern_width*2; bbox_y = pattern_height*2; xstep = bbox_x; ystep = bbox_y; break; /* All the rest (if any) should have been analyzed away, so this * case should be unreachable. */ default: ASSERT_NOT_REACHED; xstep = 0; ystep = 0; } /* At this point, (that is, within the surface backend interface), * the pattern's matrix maps from cairo's device space to cairo's * pattern space, (both with their origin at the upper-left, and * cairo's pattern space of size width,height). * * Then, we must emit a PDF pattern object that maps from its own * pattern space, (which has a size that we establish in the BBox * dictionary entry), to the PDF page's *initial* space, (which * does not benefit from the Y-axis flipping matrix that we emit * on each page). So the PDF patterns matrix maps from a * (width,height) pattern space to a device space with the origin * in the lower-left corner. * * So to handle all of that, we start with an identity matrix for * the PDF pattern to device matrix. We translate it up by the * image height then flip it in the Y direction, (moving us from * the PDF origin to cairo's origin). We then multiply in the * inverse of the cairo pattern matrix, (since it maps from device * to pattern, while we're setting up pattern to device). Finally, * we translate back down by the image height and flip again to * end up at the lower-left origin that PDF expects. * * Additionally, within the stream that paints the pattern itself, * we are using a PDF image object that has a size of (1,1) so we * have to scale it up by the image width and height to fill our * pattern cell. */ cairo_p2d = pattern->base.matrix; status = cairo_matrix_invert (&cairo_p2d); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_init_identity (&pdf_p2d); cairo_matrix_translate (&pdf_p2d, 0.0, surface_extents.height); cairo_matrix_scale (&pdf_p2d, 1.0, -1.0); cairo_matrix_multiply (&pdf_p2d, &cairo_p2d, &pdf_p2d); cairo_matrix_translate (&pdf_p2d, 0.0, pattern_height); cairo_matrix_scale (&pdf_p2d, 1.0, -1.0); _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); status = _cairo_pdf_surface_open_stream (surface, &pdf_pattern->pattern_res, FALSE, " /PatternType 1\n" " /BBox [0 0 %d %d]\n" " /XStep %f\n" " /YStep %f\n" " /TilingType 1\n" " /PaintType 1\n" " /Matrix [ %f %f %f %f %f %f ]\n" " /Resources << /XObject << /x%d %d 0 R >> >>\n", bbox_x, bbox_y, xstep, ystep, pdf_p2d.xx, pdf_p2d.yx, pdf_p2d.xy, pdf_p2d.yy, pdf_p2d.x0, pdf_p2d.y0, pattern_resource.id, pattern_resource.id); if (status) return status; if (_cairo_surface_is_meta (pattern->surface)) { snprintf(draw_surface, sizeof (draw_surface), "/x%d Do\n", pattern_resource.id); } else { snprintf(draw_surface, sizeof (draw_surface), "q %d 0 0 %d 0 0 cm /x%d Do Q", pattern_width, pattern_height, pattern_resource.id); } if (extend == CAIRO_EXTEND_REFLECT) { _cairo_output_stream_printf (surface->output, "q 0 0 %d %d re W n %s Q\n" "q -1 0 0 1 %d 0 cm 0 0 %d %d re W n %s Q\n" "q 1 0 0 -1 0 %d cm 0 0 %d %d re W n %s Q\n" "q -1 0 0 -1 %d %d cm 0 0 %d %d re W n %s Q\n", pattern_width, pattern_height, draw_surface, pattern_width*2, pattern_width, pattern_height, draw_surface, pattern_height*2, pattern_width, pattern_height, draw_surface, pattern_width*2, pattern_height*2, pattern_width, pattern_height, draw_surface); } else { _cairo_output_stream_printf (surface->output, " %s \n", draw_surface); } status = _cairo_pdf_surface_close_stream (surface); if (status) return status; return _cairo_output_stream_get_status (surface->output); } typedef struct _cairo_pdf_color_stop { double offset; double color[4]; cairo_pdf_resource_t resource; } cairo_pdf_color_stop_t; static cairo_status_t cairo_pdf_surface_emit_rgb_linear_function (cairo_pdf_surface_t *surface, cairo_pdf_color_stop_t *stop1, cairo_pdf_color_stop_t *stop2, cairo_pdf_resource_t *function) { int num_elems, i; cairo_pdf_rgb_linear_function_t elem; cairo_pdf_resource_t res; cairo_status_t status; num_elems = _cairo_array_num_elements (&surface->rgb_linear_functions); for (i = 0; i < num_elems; i++) { _cairo_array_copy_element (&surface->rgb_linear_functions, i, &elem); if (memcmp (&elem.color1[0], &stop1->color[0], sizeof (double)*3) != 0) continue; if (memcmp (&elem.color2[0], &stop2->color[0], sizeof (double)*3) != 0) continue; *function = elem.resource; return CAIRO_STATUS_SUCCESS; } res = _cairo_pdf_surface_new_object (surface); if (res.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /FunctionType 2\n" " /Domain [ 0 1 ]\n" " /C0 [ %f %f %f ]\n" " /C1 [ %f %f %f ]\n" " /N 1\n" ">>\n" "endobj\n", res.id, stop1->color[0], stop1->color[1], stop1->color[2], stop2->color[0], stop2->color[1], stop2->color[2]); elem.resource = res; memcpy (&elem.color1[0], &stop1->color[0], sizeof (double)*3); memcpy (&elem.color2[0], &stop2->color[0], sizeof (double)*3); status = _cairo_array_append (&surface->rgb_linear_functions, &elem); *function = res; return status; } static cairo_status_t cairo_pdf_surface_emit_alpha_linear_function (cairo_pdf_surface_t *surface, cairo_pdf_color_stop_t *stop1, cairo_pdf_color_stop_t *stop2, cairo_pdf_resource_t *function) { int num_elems, i; cairo_pdf_alpha_linear_function_t elem; cairo_pdf_resource_t res; cairo_status_t status; num_elems = _cairo_array_num_elements (&surface->alpha_linear_functions); for (i = 0; i < num_elems; i++) { _cairo_array_copy_element (&surface->alpha_linear_functions, i, &elem); if (elem.alpha1 != stop1->color[3]) continue; if (elem.alpha2 != stop2->color[3]) continue; *function = elem.resource; return CAIRO_STATUS_SUCCESS; } res = _cairo_pdf_surface_new_object (surface); if (res.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /FunctionType 2\n" " /Domain [ 0 1 ]\n" " /C0 [ %f ]\n" " /C1 [ %f ]\n" " /N 1\n" ">>\n" "endobj\n", res.id, stop1->color[3], stop2->color[3]); elem.resource = res; elem.alpha1 = stop1->color[3]; elem.alpha2 = stop2->color[3]; status = _cairo_array_append (&surface->alpha_linear_functions, &elem); *function = res; return status; } static cairo_status_t _cairo_pdf_surface_emit_stitched_colorgradient (cairo_pdf_surface_t *surface, unsigned int n_stops, cairo_pdf_color_stop_t *stops, cairo_bool_t is_alpha, cairo_pdf_resource_t *function) { cairo_pdf_resource_t res; unsigned int i; cairo_status_t status; /* emit linear gradients between pairs of subsequent stops... */ for (i = 0; i < n_stops-1; i++) { if (is_alpha) { status = cairo_pdf_surface_emit_alpha_linear_function (surface, &stops[i], &stops[i+1], &stops[i].resource); if (status) return status; } else { status = cairo_pdf_surface_emit_rgb_linear_function (surface, &stops[i], &stops[i+1], &stops[i].resource); if (status) return status; } } /* ... and stitch them together */ res = _cairo_pdf_surface_new_object (surface); if (res.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /FunctionType 3\n" " /Domain [ %f %f ]\n", res.id, stops[0].offset, stops[n_stops - 1].offset); _cairo_output_stream_printf (surface->output, " /Functions [ "); for (i = 0; i < n_stops-1; i++) _cairo_output_stream_printf (surface->output, "%d 0 R ", stops[i].resource.id); _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, " /Bounds [ "); for (i = 1; i < n_stops-1; i++) _cairo_output_stream_printf (surface->output, "%f ", stops[i].offset); _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, " /Encode [ "); for (i = 1; i < n_stops; i++) _cairo_output_stream_printf (surface->output, "0 1 "); _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); *function = res; return _cairo_output_stream_get_status (surface->output); } static void calc_gradient_color (cairo_pdf_color_stop_t *new_stop, cairo_pdf_color_stop_t *stop1, cairo_pdf_color_stop_t *stop2) { int i; double offset = stop1->offset / (stop1->offset + 1.0 - stop2->offset); for (i = 0; i < 4; i++) new_stop->color[i] = stop1->color[i] + offset*(stop2->color[i] - stop1->color[i]); } #define COLOR_STOP_EPSILON 1e-6 static cairo_status_t _cairo_pdf_surface_emit_pattern_stops (cairo_pdf_surface_t *surface, cairo_gradient_pattern_t *pattern, cairo_pdf_resource_t *color_function, cairo_pdf_resource_t *alpha_function) { cairo_pdf_color_stop_t *allstops, *stops; unsigned int n_stops; unsigned int i; cairo_bool_t emit_alpha = FALSE; cairo_status_t status; color_function->id = 0; alpha_function->id = 0; allstops = _cairo_malloc_ab ((pattern->n_stops + 2), sizeof (cairo_pdf_color_stop_t)); if (allstops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); stops = &allstops[1]; n_stops = pattern->n_stops; for (i = 0; i < n_stops; i++) { stops[i].color[0] = pattern->stops[i].color.red; stops[i].color[1] = pattern->stops[i].color.green; stops[i].color[2] = pattern->stops[i].color.blue; stops[i].color[3] = pattern->stops[i].color.alpha; if (!CAIRO_ALPHA_IS_OPAQUE (stops[i].color[3])) emit_alpha = TRUE; stops[i].offset = pattern->stops[i].offset; } if (pattern->base.extend == CAIRO_EXTEND_REPEAT || pattern->base.extend == CAIRO_EXTEND_REFLECT) { if (stops[0].offset > COLOR_STOP_EPSILON) { if (pattern->base.extend == CAIRO_EXTEND_REFLECT) memcpy (allstops, stops, sizeof (cairo_pdf_color_stop_t)); else calc_gradient_color (&allstops[0], &stops[0], &stops[n_stops-1]); stops = allstops; n_stops++; } stops[0].offset = 0.0; if (stops[n_stops-1].offset < 1.0 - COLOR_STOP_EPSILON) { if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { memcpy (&stops[n_stops], &stops[n_stops - 1], sizeof (cairo_pdf_color_stop_t)); } else { calc_gradient_color (&stops[n_stops], &stops[0], &stops[n_stops-1]); } n_stops++; } stops[n_stops-1].offset = 1.0; } if (n_stops == 2) { /* no need for stitched function */ status = cairo_pdf_surface_emit_rgb_linear_function (surface, &stops[0], &stops[1], color_function); if (status) goto BAIL; if (emit_alpha) { status = cairo_pdf_surface_emit_alpha_linear_function (surface, &stops[0], &stops[1], alpha_function); if (status) goto BAIL; } } else { /* multiple stops: stitch. XXX possible optimization: regularly spaced * stops do not require stitching. XXX */ status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, n_stops, stops, FALSE, color_function); if (status) goto BAIL; if (emit_alpha) { status = _cairo_pdf_surface_emit_stitched_colorgradient (surface, n_stops, stops, TRUE, alpha_function); if (status) goto BAIL; } } BAIL: free (allstops); return status; } static cairo_status_t _cairo_pdf_surface_emit_repeating_function (cairo_pdf_surface_t *surface, cairo_gradient_pattern_t *pattern, cairo_pdf_resource_t *function, int begin, int end) { cairo_pdf_resource_t res; int i; res = _cairo_pdf_surface_new_object (surface); if (res.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /FunctionType 3\n" " /Domain [ %d %d ]\n", res.id, begin, end); _cairo_output_stream_printf (surface->output, " /Functions [ "); for (i = begin; i < end; i++) _cairo_output_stream_printf (surface->output, "%d 0 R ", function->id); _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, " /Bounds [ "); for (i = begin + 1; i < end; i++) _cairo_output_stream_printf (surface->output, "%d ", i); _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, " /Encode [ "); for (i = begin; i < end; i++) { if ((i % 2) && pattern->base.extend == CAIRO_EXTEND_REFLECT) { _cairo_output_stream_printf (surface->output, "1 0 "); } else { _cairo_output_stream_printf (surface->output, "0 1 "); } } _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); *function = res; return _cairo_output_stream_get_status (surface->output); } static cairo_status_t cairo_pdf_surface_emit_transparency_group (cairo_pdf_surface_t *surface, cairo_pdf_resource_t gstate_resource, cairo_pdf_resource_t gradient_mask) { cairo_pdf_resource_t smask_resource; cairo_status_t status; status = _cairo_pdf_surface_open_stream (surface, NULL, surface->compress_content, " /Type /XObject\n" " /Subtype /Form\n" " /FormType 1\n" " /BBox [ 0 0 %f %f ]\n" " /Resources\n" " << /ExtGState\n" " << /a0 << /ca 1 /CA 1 >>" " >>\n" " /Pattern\n" " << /p%d %d 0 R >>\n" " >>\n" " /Group\n" " << /Type /Group\n" " /S /Transparency\n" " /CS /DeviceGray\n" " >>\n", surface->width, surface->height, gradient_mask.id, gradient_mask.id); if (status) return status; _cairo_output_stream_printf (surface->output, "q\n" "/a0 gs\n" "/Pattern cs /p%d scn\n" "0 0 %f %f re\n" "f\n" "Q\n", gradient_mask.id, surface->width, surface->height); status = _cairo_pdf_surface_close_stream (surface); if (status) return status; smask_resource = _cairo_pdf_surface_new_object (surface); if (smask_resource.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Mask\n" " /S /Luminosity\n" " /G %d 0 R\n" ">>\n" "endobj\n", smask_resource.id, surface->pdf_stream.self.id); /* Create GState which uses the transparency group as an SMask. */ _cairo_pdf_surface_update_object (surface, gstate_resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /ExtGState\n" " /SMask %d 0 R\n" " /ca 1\n" " /CA 1\n" " /AIS false\n" ">>\n" "endobj\n", gstate_resource.id, smask_resource.id); return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_emit_linear_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern_t *pdf_pattern) { cairo_linear_pattern_t *pattern = (cairo_linear_pattern_t *) pdf_pattern->pattern; cairo_pdf_resource_t color_function, alpha_function; double x1, y1, x2, y2; double _x1, _y1, _x2, _y2; cairo_matrix_t pat_to_pdf; cairo_extend_t extend; cairo_status_t status; cairo_gradient_pattern_t *gradient = &pattern->base; double first_stop, last_stop; int repeat_begin = 0, repeat_end = 1; assert (pattern->base.n_stops != 0); extend = cairo_pattern_get_extend (pdf_pattern->pattern); pat_to_pdf = pattern->base.base.matrix; status = cairo_matrix_invert (&pat_to_pdf); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); first_stop = gradient->stops[0].offset; last_stop = gradient->stops[gradient->n_stops - 1].offset; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { double dx, dy; int x_rep = 0, y_rep = 0; x1 = _cairo_fixed_to_double (pattern->p1.x); y1 = _cairo_fixed_to_double (pattern->p1.y); cairo_matrix_transform_point (&pat_to_pdf, &x1, &y1); x2 = _cairo_fixed_to_double (pattern->p2.x); y2 = _cairo_fixed_to_double (pattern->p2.y); cairo_matrix_transform_point (&pat_to_pdf, &x2, &y2); dx = fabs (x2 - x1); dy = fabs (y2 - y1); if (dx > 1e-6) x_rep = (int) ceil (surface->width/dx); if (dy > 1e-6) y_rep = (int) ceil (surface->height/dy); repeat_end = MAX (x_rep, y_rep); repeat_begin = -repeat_end; first_stop = repeat_begin; last_stop = repeat_end; } /* PDF requires the first and last stop to be the same as the line * coordinates. For repeating patterns this moves the line * coordinates out to the begin/end of the repeating function. For * non repeating patterns this may move the line coordinates in if * there are not stops at offset 0 and 1. */ x1 = _cairo_fixed_to_double (pattern->p1.x); y1 = _cairo_fixed_to_double (pattern->p1.y); x2 = _cairo_fixed_to_double (pattern->p2.x); y2 = _cairo_fixed_to_double (pattern->p2.y); _x1 = x1 + (x2 - x1)*first_stop; _y1 = y1 + (y2 - y1)*first_stop; _x2 = x1 + (x2 - x1)*last_stop; _y2 = y1 + (y2 - y1)*last_stop; x1 = _x1; x2 = _x2; y1 = _y1; y2 = _y2; /* For EXTEND_NONE and EXTEND_PAD if there are only two stops a * Type 2 function is used by itself without a stitching * function. Type 2 functions always have the domain [0 1] */ if ((pattern->base.base.extend == CAIRO_EXTEND_NONE || pattern->base.base.extend == CAIRO_EXTEND_PAD) && gradient->n_stops == 2) { first_stop = 0.0; last_stop = 1.0; } status = _cairo_pdf_surface_emit_pattern_stops (surface, &pattern->base, &color_function, &alpha_function); if (status) return status; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { status = _cairo_pdf_surface_emit_repeating_function (surface, &pattern->base, &color_function, repeat_begin, repeat_end); if (status) return status; if (alpha_function.id != 0) { status = _cairo_pdf_surface_emit_repeating_function (surface, &pattern->base, &alpha_function, repeat_begin, repeat_end); if (status) return status; } } _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Pattern\n" " /PatternType 2\n" " /Matrix [ %f %f %f %f %f %f ]\n" " /Shading\n" " << /ShadingType 2\n" " /ColorSpace /DeviceRGB\n" " /Coords [ %f %f %f %f ]\n" " /Domain [ %f %f ]\n" " /Function %d 0 R\n", pdf_pattern->pattern_res.id, pat_to_pdf.xx, pat_to_pdf.yx, pat_to_pdf.xy, pat_to_pdf.yy, pat_to_pdf.x0, pat_to_pdf.y0, x1, y1, x2, y2, first_stop, last_stop, color_function.id); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->output, " /Extend [ true true ]\n"); } else { _cairo_output_stream_printf (surface->output, " /Extend [ false false ]\n"); } _cairo_output_stream_printf (surface->output, " >>\n" ">>\n" "endobj\n"); if (alpha_function.id != 0) { cairo_pdf_resource_t mask_resource; assert (pdf_pattern->gstate_res.id != 0); /* Create pattern for SMask. */ mask_resource = _cairo_pdf_surface_new_object (surface); if (mask_resource.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Pattern\n" " /PatternType 2\n" " /Matrix [ %f %f %f %f %f %f ]\n" " /Shading\n" " << /ShadingType 2\n" " /ColorSpace /DeviceGray\n" " /Coords [ %f %f %f %f ]\n" " /Domain [ %f %f ]\n" " /Function %d 0 R\n", mask_resource.id, pat_to_pdf.xx, pat_to_pdf.yx, pat_to_pdf.xy, pat_to_pdf.yy, pat_to_pdf.x0, pat_to_pdf.y0, x1, y1, x2, y2, first_stop, last_stop, alpha_function.id); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->output, " /Extend [ true true ]\n"); } else { _cairo_output_stream_printf (surface->output, " /Extend [ false false ]\n"); } _cairo_output_stream_printf (surface->output, " >>\n" ">>\n" "endobj\n"); status = _cairo_pdf_surface_add_pattern (surface, mask_resource); if (status) return status; status = cairo_pdf_surface_emit_transparency_group (surface, pdf_pattern->gstate_res, mask_resource); if (status) return status; } return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_emit_radial_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern_t *pdf_pattern) { cairo_pdf_resource_t color_function, alpha_function; double x1, y1, x2, y2, r1, r2; cairo_matrix_t pat_to_pdf; cairo_extend_t extend; cairo_status_t status; cairo_radial_pattern_t *pattern = (cairo_radial_pattern_t *) pdf_pattern->pattern; assert (pattern->base.n_stops != 0); extend = cairo_pattern_get_extend (pdf_pattern->pattern); status = _cairo_pdf_surface_emit_pattern_stops (surface, &pattern->base, &color_function, &alpha_function); if (status) return status; pat_to_pdf = pattern->base.base.matrix; status = cairo_matrix_invert (&pat_to_pdf); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_pdf, &pat_to_pdf, &surface->cairo_to_pdf); x1 = _cairo_fixed_to_double (pattern->c1.x); y1 = _cairo_fixed_to_double (pattern->c1.y); r1 = _cairo_fixed_to_double (pattern->r1); x2 = _cairo_fixed_to_double (pattern->c2.x); y2 = _cairo_fixed_to_double (pattern->c2.y); r2 = _cairo_fixed_to_double (pattern->r2); _cairo_pdf_surface_update_object (surface, pdf_pattern->pattern_res); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Pattern\n" " /PatternType 2\n" " /Matrix [ %f %f %f %f %f %f ]\n" " /Shading\n" " << /ShadingType 3\n" " /ColorSpace /DeviceRGB\n" " /Coords [ %f %f %f %f %f %f ]\n" " /Function %d 0 R\n", pdf_pattern->pattern_res.id, pat_to_pdf.xx, pat_to_pdf.yx, pat_to_pdf.xy, pat_to_pdf.yy, pat_to_pdf.x0, pat_to_pdf.y0, x1, y1, r1, x2, y2, r2, color_function.id); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->output, " /Extend [ true true ]\n"); } else { _cairo_output_stream_printf (surface->output, " /Extend [ false false ]\n"); } _cairo_output_stream_printf (surface->output, " >>\n" ">>\n" "endobj\n"); if (alpha_function.id != 0) { cairo_pdf_resource_t mask_resource; assert (pdf_pattern->gstate_res.id != 0); /* Create pattern for SMask. */ mask_resource = _cairo_pdf_surface_new_object (surface); if (mask_resource.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Pattern\n" " /PatternType 2\n" " /Matrix [ %f %f %f %f %f %f ]\n" " /Shading\n" " << /ShadingType 3\n" " /ColorSpace /DeviceGray\n" " /Coords [ %f %f %f %f %f %f ]\n" " /Function %d 0 R\n", mask_resource.id, pat_to_pdf.xx, pat_to_pdf.yx, pat_to_pdf.xy, pat_to_pdf.yy, pat_to_pdf.x0, pat_to_pdf.y0, x1, y1, r1, x2, y2, r2, alpha_function.id); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->output, " /Extend [ true true ]\n"); } else { _cairo_output_stream_printf (surface->output, " /Extend [ false false ]\n"); } _cairo_output_stream_printf (surface->output, " >>\n" ">>\n" "endobj\n"); status = cairo_pdf_surface_emit_transparency_group (surface, pdf_pattern->gstate_res, mask_resource); if (status) return status; } return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_emit_pattern (cairo_pdf_surface_t *surface, cairo_pdf_pattern_t *pdf_pattern) { double old_width, old_height; cairo_status_t status; old_width = surface->width; old_height = surface->height; _cairo_pdf_surface_set_size_internal (surface, pdf_pattern->width, pdf_pattern->height); switch (pdf_pattern->pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: ASSERT_NOT_REACHED; status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); break; case CAIRO_PATTERN_TYPE_SURFACE: status = _cairo_pdf_surface_emit_surface_pattern (surface, pdf_pattern); break; case CAIRO_PATTERN_TYPE_LINEAR: status = _cairo_pdf_surface_emit_linear_pattern (surface, pdf_pattern); break; case CAIRO_PATTERN_TYPE_RADIAL: status = _cairo_pdf_surface_emit_radial_pattern (surface, pdf_pattern); break; default: ASSERT_NOT_REACHED; status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); break; } _cairo_pdf_surface_set_size_internal (surface, old_width, old_height); return status; } static cairo_status_t _cairo_pdf_surface_select_pattern (cairo_pdf_surface_t *surface, cairo_pattern_t *pattern, cairo_pdf_resource_t pattern_res, cairo_bool_t is_stroke) { cairo_status_t status; int alpha; if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_solid_pattern_t *solid_pattern = (cairo_solid_pattern_t *) pattern; status = _cairo_pdf_surface_add_alpha (surface, solid_pattern->color.alpha, &alpha); if (status) return status; _cairo_output_stream_printf (surface->output, "%f %f %f ", solid_pattern->color.red, solid_pattern->color.green, solid_pattern->color.blue); if (is_stroke) _cairo_output_stream_printf (surface->output, "RG "); else _cairo_output_stream_printf (surface->output, "rg "); _cairo_output_stream_printf (surface->output, "/a%d gs\n", alpha); surface->select_pattern_gstate_saved = FALSE; } else { status = _cairo_pdf_surface_add_alpha (surface, 1.0, &alpha); if (status) return status; status = _cairo_pdf_surface_add_pattern (surface, pattern_res); if (status) return status; /* fill-stroke calls select_pattern twice. Don't save if the * gstate is already saved. */ if (!surface->select_pattern_gstate_saved) _cairo_output_stream_printf (surface->output, "q "); if (is_stroke) { _cairo_output_stream_printf (surface->output, "/Pattern CS /p%d SCN ", pattern_res.id); } else { _cairo_output_stream_printf (surface->output, "/Pattern cs /p%d scn ", pattern_res.id); } _cairo_output_stream_printf (surface->output, "/a%d gs\n", alpha); surface->select_pattern_gstate_saved = TRUE; } return _cairo_output_stream_get_status (surface->output); } static void _cairo_pdf_surface_unselect_pattern (cairo_pdf_surface_t *surface) { if (surface->select_pattern_gstate_saved) _cairo_output_stream_printf (surface->output, "Q\n"); surface->select_pattern_gstate_saved = FALSE; } static cairo_int_status_t _cairo_pdf_surface_show_page (void *abstract_surface) { cairo_pdf_surface_t *surface = abstract_surface; cairo_int_status_t status; status = _cairo_pdf_surface_close_content_stream (surface); if (status) return status; status = _cairo_pdf_surface_write_page (surface); if (status) return status; _cairo_pdf_surface_clear (surface); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_pdf_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_pdf_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; /* XXX: The conversion to integers here is pretty bogus, (not to * mention the arbitrary limitation of width to a short(!). We * may need to come up with a better interface for get_size. */ rectangle->width = (int) ceil (surface->width); rectangle->height = (int) ceil (surface->height); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_pdf_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_pdf_surface_t *surface = abstract_surface; if (path == NULL) { _cairo_output_stream_printf (surface->output, "Q q\n"); return CAIRO_STATUS_SUCCESS; } return _cairo_pdf_operators_clip (&surface->pdf_operators, path, fill_rule); } static void _cairo_pdf_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { _cairo_font_options_init_default (options); cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); } static cairo_pdf_resource_t _cairo_pdf_surface_write_info (cairo_pdf_surface_t *surface) { cairo_pdf_resource_t info; info = _cairo_pdf_surface_new_object (surface); if (info.id == 0) return info; _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Creator (cairo %s (http://cairographics.org))\n" " /Producer (cairo %s (http://cairographics.org))\n" ">>\n" "endobj\n", info.id, cairo_version_string (), cairo_version_string ()); return info; } static void _cairo_pdf_surface_write_pages (cairo_pdf_surface_t *surface) { cairo_pdf_resource_t page; int num_pages, i; _cairo_pdf_surface_update_object (surface, surface->pages_resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Pages\n" " /Kids [ ", surface->pages_resource.id); num_pages = _cairo_array_num_elements (&surface->pages); for (i = 0; i < num_pages; i++) { _cairo_array_copy_element (&surface->pages, i, &page); _cairo_output_stream_printf (surface->output, "%d 0 R ", page.id); } _cairo_output_stream_printf (surface->output, "]\n"); _cairo_output_stream_printf (surface->output, " /Count %d\n", num_pages); /* TODO: Figure out which other defaults to be inherited by /Page * objects. */ _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); } static cairo_int_status_t _cairo_pdf_surface_emit_to_unicode_stream (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset, cairo_bool_t is_composite, cairo_pdf_resource_t *stream) { const cairo_scaled_font_backend_t *backend; unsigned int i, num_bfchar; cairo_int_status_t status; stream->id = 0; if (font_subset->to_unicode == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_truetype_create_glyph_to_unicode_map (font_subset); if (status) { if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; backend = font_subset->scaled_font->backend; if (backend->map_glyphs_to_unicode == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; status = backend->map_glyphs_to_unicode (font_subset->scaled_font, font_subset); if (status) return status; } status = _cairo_pdf_surface_open_stream (surface, NULL, surface->compress_content, NULL); if (status) return status; _cairo_output_stream_printf (surface->output, "/CIDInit /ProcSet findresource begin\n" "12 dict begin\n" "begincmap\n" "/CIDSystemInfo\n" "<< /Registry (Adobe)\n" " /Ordering (UCS)\n" " /Supplement 0\n" ">> def\n" "/CMapName /Adobe-Identity-UCS def\n" "/CMapType 2 def\n" "1 begincodespacerange\n"); if (is_composite) { _cairo_output_stream_printf (surface->output, "<0000> \n"); } else { _cairo_output_stream_printf (surface->output, "<00> \n"); } _cairo_output_stream_printf (surface->output, "endcodespacerange\n"); num_bfchar = font_subset->num_glyphs - 1; /* The CMap specification has a limit of 100 characters per beginbfchar operator */ _cairo_output_stream_printf (surface->output, "%d beginbfchar\n", num_bfchar > 100 ? 100 : num_bfchar); for (i = 0; i < num_bfchar; i++) { if (i != 0 && i % 100 == 0) { _cairo_output_stream_printf (surface->output, "endbfchar\n" "%d beginbfchar\n", num_bfchar - i > 100 ? 100 : num_bfchar - i); } if (is_composite) { _cairo_output_stream_printf (surface->output, "<%04x> <%04lx>\n", i + 1, font_subset->to_unicode[i + 1]); } else { _cairo_output_stream_printf (surface->output, "<%02x> <%04lx>\n", i + 1, font_subset->to_unicode[i + 1]); } } _cairo_output_stream_printf (surface->output, "endbfchar\n"); _cairo_output_stream_printf (surface->output, "endcmap\n" "CMapName currentdict /CMap defineresource pop\n" "end\n" "end\n"); *stream = surface->pdf_stream.self; return _cairo_pdf_surface_close_stream (surface); } static cairo_status_t _cairo_pdf_surface_emit_cff_font (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset, cairo_cff_subset_t *subset) { cairo_pdf_resource_t stream, descriptor, cidfont_dict; cairo_pdf_resource_t subset_resource, to_unicode_stream; cairo_pdf_font_t font; unsigned int i; cairo_status_t status; subset_resource = _cairo_pdf_surface_get_font_resource (surface, font_subset->font_id, font_subset->subset_id); if (subset_resource.id == 0) return CAIRO_STATUS_SUCCESS; status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, " /Subtype /CIDFontType0C\n"); if (status) return status; stream = surface->pdf_stream.self; _cairo_output_stream_write (surface->output, subset->data, subset->data_length); status = _cairo_pdf_surface_close_stream (surface); if (status) return status; status = _cairo_pdf_surface_emit_to_unicode_stream (surface, font_subset, TRUE, &to_unicode_stream); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; descriptor = _cairo_pdf_surface_new_object (surface); if (descriptor.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /FontDescriptor\n" " /FontName /%s\n" " /Flags 4\n" " /FontBBox [ %ld %ld %ld %ld ]\n" " /ItalicAngle 0\n" " /Ascent %ld\n" " /Descent %ld\n" " /CapHeight 500\n" " /StemV 80\n" " /StemH 80\n" " /FontFile3 %u 0 R\n" ">>\n" "endobj\n", descriptor.id, subset->base_font, subset->x_min, subset->y_min, subset->x_max, subset->y_max, subset->ascent, subset->descent, stream.id); cidfont_dict = _cairo_pdf_surface_new_object (surface); if (cidfont_dict.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /CIDFontType0\n" " /BaseFont /%s\n" " /CIDSystemInfo\n" " << /Registry (Adobe)\n" " /Ordering (Identity)\n" " /Supplement 0\n" " >>\n" " /FontDescriptor %d 0 R\n" " /W [0 [", cidfont_dict.id, subset->base_font, descriptor.id); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " %d", subset->widths[i]); _cairo_output_stream_printf (surface->output, " ]]\n" ">>\n" "endobj\n"); _cairo_pdf_surface_update_object (surface, subset_resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /Type0\n" " /BaseFont /%s\n" " /Encoding /Identity-H\n" " /DescendantFonts [ %d 0 R]\n", subset_resource.id, subset->base_font, cidfont_dict.id); if (to_unicode_stream.id != 0) _cairo_output_stream_printf (surface->output, " /ToUnicode %d 0 R\n", to_unicode_stream.id); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); font.font_id = font_subset->font_id; font.subset_id = font_subset->subset_id; font.subset_resource = subset_resource; status = _cairo_array_append (&surface->fonts, &font); return status; } static cairo_status_t _cairo_pdf_surface_emit_cff_font_subset (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status; cairo_cff_subset_t subset; char name[64]; snprintf (name, sizeof name, "CairoFont-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_cff_subset_init (&subset, name, font_subset); if (status) return status; status = _cairo_pdf_surface_emit_cff_font (surface, font_subset, &subset); _cairo_cff_subset_fini (&subset); return status; } static cairo_status_t _cairo_pdf_surface_emit_cff_fallback_font (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status; cairo_cff_subset_t subset; char name[64]; snprintf (name, sizeof name, "CairoFont-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_cff_fallback_init (&subset, name, font_subset); if (status) return status; status = _cairo_pdf_surface_emit_cff_font (surface, font_subset, &subset); _cairo_cff_fallback_fini (&subset); return status; } static cairo_status_t _cairo_pdf_surface_emit_type1_font (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset, cairo_type1_subset_t *subset) { cairo_pdf_resource_t stream, descriptor, subset_resource, to_unicode_stream; cairo_pdf_font_t font; cairo_status_t status; unsigned long length; unsigned int i; subset_resource = _cairo_pdf_surface_get_font_resource (surface, font_subset->font_id, font_subset->subset_id); if (subset_resource.id == 0) return CAIRO_STATUS_SUCCESS; /* We ignore the zero-trailer and set Length3 to 0. */ length = subset->header_length + subset->data_length; status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, " /Length1 %lu\n" " /Length2 %lu\n" " /Length3 0\n", subset->header_length, subset->data_length); if (status) return status; stream = surface->pdf_stream.self; _cairo_output_stream_write (surface->output, subset->data, length); status = _cairo_pdf_surface_close_stream (surface); if (status) return status; status = _cairo_pdf_surface_emit_to_unicode_stream (surface, font_subset, FALSE, &to_unicode_stream); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; descriptor = _cairo_pdf_surface_new_object (surface); if (descriptor.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /FontDescriptor\n" " /FontName /%s\n" " /Flags 4\n" " /FontBBox [ %ld %ld %ld %ld ]\n" " /ItalicAngle 0\n" " /Ascent %ld\n" " /Descent %ld\n" " /CapHeight 500\n" " /StemV 80\n" " /StemH 80\n" " /FontFile %u 0 R\n" ">>\n" "endobj\n", descriptor.id, subset->base_font, subset->x_min, subset->y_min, subset->x_max, subset->y_max, subset->ascent, subset->descent, stream.id); _cairo_pdf_surface_update_object (surface, subset_resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /Type1\n" " /BaseFont /%s\n" " /FirstChar 0\n" " /LastChar %d\n" " /FontDescriptor %d 0 R\n" " /Widths [", subset_resource.id, subset->base_font, font_subset->num_glyphs - 1, descriptor.id); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " %d", subset->widths[i]); _cairo_output_stream_printf (surface->output, " ]\n"); if (to_unicode_stream.id != 0) _cairo_output_stream_printf (surface->output, " /ToUnicode %d 0 R\n", to_unicode_stream.id); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); font.font_id = font_subset->font_id; font.subset_id = font_subset->subset_id; font.subset_resource = subset_resource; return _cairo_array_append (&surface->fonts, &font); } #if CAIRO_HAS_FT_FONT static cairo_status_t _cairo_pdf_surface_emit_type1_font_subset (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status; cairo_type1_subset_t subset; char name[64]; snprintf (name, sizeof name, "CairoFont-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_type1_subset_init (&subset, name, font_subset, FALSE); if (status) return status; status = _cairo_pdf_surface_emit_type1_font (surface, font_subset, &subset); _cairo_type1_subset_fini (&subset); return status; } #endif static cairo_status_t _cairo_pdf_surface_emit_type1_fallback_font (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status; cairo_type1_subset_t subset; char name[64]; snprintf (name, sizeof name, "CairoFont-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_type1_fallback_init_binary (&subset, name, font_subset); if (status) return status; status = _cairo_pdf_surface_emit_type1_font (surface, font_subset, &subset); _cairo_type1_fallback_fini (&subset); return status; } #define PDF_UNITS_PER_EM 1000 static cairo_status_t _cairo_pdf_surface_emit_truetype_font_subset (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_pdf_resource_t stream, descriptor, cidfont_dict; cairo_pdf_resource_t subset_resource, to_unicode_stream; cairo_status_t status; cairo_pdf_font_t font; cairo_truetype_subset_t subset; unsigned int i; subset_resource = _cairo_pdf_surface_get_font_resource (surface, font_subset->font_id, font_subset->subset_id); if (subset_resource.id == 0) return CAIRO_STATUS_SUCCESS; status = _cairo_truetype_subset_init (&subset, font_subset); if (status) return status; status = _cairo_pdf_surface_open_stream (surface, NULL, TRUE, " /Length1 %lu\n", subset.data_length); if (status) { _cairo_truetype_subset_fini (&subset); return status; } stream = surface->pdf_stream.self; _cairo_output_stream_write (surface->output, subset.data, subset.data_length); status = _cairo_pdf_surface_close_stream (surface); if (status) { _cairo_truetype_subset_fini (&subset); return status; } status = _cairo_pdf_surface_emit_to_unicode_stream (surface, font_subset, TRUE, &to_unicode_stream); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) { _cairo_truetype_subset_fini (&subset); return status; } descriptor = _cairo_pdf_surface_new_object (surface); if (descriptor.id == 0) { _cairo_truetype_subset_fini (&subset); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /FontDescriptor\n" " /FontName /%s\n" " /Flags 4\n" " /FontBBox [ %ld %ld %ld %ld ]\n" " /ItalicAngle 0\n" " /Ascent %ld\n" " /Descent %ld\n" " /CapHeight %ld\n" " /StemV 80\n" " /StemH 80\n" " /FontFile2 %u 0 R\n" ">>\n" "endobj\n", descriptor.id, subset.base_font, (long)(subset.x_min*PDF_UNITS_PER_EM), (long)(subset.y_min*PDF_UNITS_PER_EM), (long)(subset.x_max*PDF_UNITS_PER_EM), (long)(subset.y_max*PDF_UNITS_PER_EM), (long)(subset.ascent*PDF_UNITS_PER_EM), (long)(subset.descent*PDF_UNITS_PER_EM), (long)(subset.y_max*PDF_UNITS_PER_EM), stream.id); cidfont_dict = _cairo_pdf_surface_new_object (surface); if (cidfont_dict.id == 0) { _cairo_truetype_subset_fini (&subset); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /CIDFontType2\n" " /BaseFont /%s\n" " /CIDSystemInfo\n" " << /Registry (Adobe)\n" " /Ordering (Identity)\n" " /Supplement 0\n" " >>\n" " /FontDescriptor %d 0 R\n" " /W [0 [", cidfont_dict.id, subset.base_font, descriptor.id); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " %ld", (long)(subset.widths[i]*PDF_UNITS_PER_EM)); _cairo_output_stream_printf (surface->output, " ]]\n" ">>\n" "endobj\n"); _cairo_pdf_surface_update_object (surface, subset_resource); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /Type0\n" " /BaseFont /%s\n" " /Encoding /Identity-H\n" " /DescendantFonts [ %d 0 R]\n", subset_resource.id, subset.base_font, cidfont_dict.id); if (to_unicode_stream.id != 0) _cairo_output_stream_printf (surface->output, " /ToUnicode %d 0 R\n", to_unicode_stream.id); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); font.font_id = font_subset->font_id; font.subset_id = font_subset->subset_id; font.subset_resource = subset_resource; status = _cairo_array_append (&surface->fonts, &font); _cairo_truetype_subset_fini (&subset); return status; } static cairo_int_status_t _cairo_pdf_surface_emit_bitmap_glyph (cairo_pdf_surface_t *surface, cairo_scaled_font_t *scaled_font, unsigned long glyph_index, cairo_pdf_resource_t *glyph_ret, cairo_box_t *bbox, double *width) { cairo_scaled_glyph_t *scaled_glyph; cairo_status_t status; cairo_image_surface_t *image; unsigned char *row, *byte; int rows, cols; double x_advance, y_advance; status = _cairo_scaled_glyph_lookup (scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS| CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status) return status; x_advance = scaled_glyph->metrics.x_advance; y_advance = scaled_glyph->metrics.y_advance; cairo_matrix_transform_distance (&scaled_font->ctm, &x_advance, &y_advance); *bbox = scaled_glyph->bbox; *width = x_advance; image = scaled_glyph->surface; if (image->format != CAIRO_FORMAT_A1) { image = _cairo_image_surface_clone (image, CAIRO_FORMAT_A1); status = cairo_surface_status (&image->base); if (status) return status; } status = _cairo_pdf_surface_open_stream (surface, NULL, surface->compress_content, NULL); if (status) { if (image != scaled_glyph->surface) cairo_surface_destroy (&image->base); return status; } *glyph_ret = surface->pdf_stream.self; _cairo_output_stream_printf (surface->output, "%f 0 %f %f %f %f d1\n", x_advance, _cairo_fixed_to_double (scaled_glyph->bbox.p1.x), _cairo_fixed_to_double (scaled_glyph->bbox.p2.y), _cairo_fixed_to_double (scaled_glyph->bbox.p2.x), _cairo_fixed_to_double (scaled_glyph->bbox.p1.y)); _cairo_output_stream_printf (surface->output, "%f 0 0 %f %f %f cm\n", _cairo_fixed_to_double (scaled_glyph->bbox.p2.x) - _cairo_fixed_to_double (scaled_glyph->bbox.p1.x), _cairo_fixed_to_double (scaled_glyph->bbox.p1.y) - _cairo_fixed_to_double (scaled_glyph->bbox.p2.y), _cairo_fixed_to_double (scaled_glyph->bbox.p1.x), _cairo_fixed_to_double (scaled_glyph->bbox.p2.y)); _cairo_output_stream_printf (surface->output, "BI\n" "/IM true\n" "/W %d\n" "/H %d\n" "/BPC 1\n" "/D [1 0]\n", image->width, image->height); _cairo_output_stream_printf (surface->output, "ID "); for (row = image->data, rows = image->height; rows; row += image->stride, rows--) { for (byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) { unsigned char output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); _cairo_output_stream_write (surface->output, &output_byte, 1); } } _cairo_output_stream_printf (surface->output, "\nEI\n"); status = _cairo_pdf_surface_close_stream (surface); if (image != scaled_glyph->surface) cairo_surface_destroy (&image->base); return status; } static cairo_status_t _cairo_pdf_surface_emit_type3_font_subset (cairo_pdf_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_pdf_resource_t *glyphs, encoding, char_procs, subset_resource, to_unicode_stream; cairo_pdf_font_t font; cairo_matrix_t matrix; double *widths; unsigned int i; cairo_box_t font_bbox = {{0,0},{0,0}}; cairo_box_t bbox = {{0,0},{0,0}}; if (font_subset->num_glyphs == 0) return CAIRO_STATUS_SUCCESS; subset_resource = _cairo_pdf_surface_get_font_resource (surface, font_subset->font_id, font_subset->subset_id); if (subset_resource.id == 0) return CAIRO_STATUS_SUCCESS; glyphs = _cairo_malloc_ab (font_subset->num_glyphs, sizeof (cairo_pdf_resource_t)); if (glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); widths = _cairo_malloc_ab (font_subset->num_glyphs, sizeof (double)); if (widths == NULL) { free (glyphs); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < font_subset->num_glyphs; i++) { status = _cairo_pdf_surface_emit_bitmap_glyph (surface, font_subset->scaled_font, font_subset->glyphs[i], &glyphs[i], &bbox, &widths[i]); if (status) break; if (i == 0) { font_bbox.p1.x = bbox.p1.x; font_bbox.p1.y = bbox.p1.y; font_bbox.p2.x = bbox.p2.x; font_bbox.p2.y = bbox.p2.y; } else { if (bbox.p1.x < font_bbox.p1.x) font_bbox.p1.x = bbox.p1.x; if (bbox.p1.y < font_bbox.p1.y) font_bbox.p1.y = bbox.p1.y; if (bbox.p2.x > font_bbox.p2.x) font_bbox.p2.x = bbox.p2.x; if (bbox.p2.y > font_bbox.p2.y) font_bbox.p2.y = bbox.p2.y; } } if (status) { free (glyphs); free (widths); return status; } encoding = _cairo_pdf_surface_new_object (surface); if (encoding.id == 0) { free (glyphs); free (widths); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Encoding\n" " /Differences [0", encoding.id); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " /%d", i); _cairo_output_stream_printf (surface->output, "]\n" ">>\n" "endobj\n"); char_procs = _cairo_pdf_surface_new_object (surface); if (char_procs.id == 0) { free (glyphs); free (widths); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<<\n", char_procs.id); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " /%d %d 0 R\n", i, glyphs[i].id); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); free (glyphs); status = _cairo_pdf_surface_emit_to_unicode_stream (surface, font_subset, FALSE, &to_unicode_stream); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) { free (widths); return status; } _cairo_pdf_surface_update_object (surface, subset_resource); matrix = font_subset->scaled_font->scale_inverse; _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Font\n" " /Subtype /Type3\n" " /FontBBox [%f %f %f %f]\n" " /FontMatrix [ %f %f %f %f 0 0 ]\n" " /Encoding %d 0 R\n" " /CharProcs %d 0 R\n" " /FirstChar 0\n" " /LastChar %d\n", subset_resource.id, _cairo_fixed_to_double (font_bbox.p1.x), _cairo_fixed_to_double (font_bbox.p1.y), _cairo_fixed_to_double (font_bbox.p2.x), _cairo_fixed_to_double (font_bbox.p2.y), matrix.xx, matrix.yx, -matrix.xy, -matrix.yy, encoding.id, char_procs.id, font_subset->num_glyphs - 1); _cairo_output_stream_printf (surface->output, " /Widths ["); for (i = 0; i < font_subset->num_glyphs; i++) _cairo_output_stream_printf (surface->output, " %f", widths[i]); _cairo_output_stream_printf (surface->output, "]\n"); free (widths); if (to_unicode_stream.id != 0) _cairo_output_stream_printf (surface->output, " /ToUnicode %d 0 R\n", to_unicode_stream.id); _cairo_output_stream_printf (surface->output, ">>\n" "endobj\n"); font.font_id = font_subset->font_id; font.subset_id = font_subset->subset_id; font.subset_resource = subset_resource; return _cairo_array_append (&surface->fonts, &font); } static cairo_status_t _cairo_pdf_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset, void *closure) { cairo_pdf_surface_t *surface = closure; cairo_status_t status; if (font_subset->is_composite) { status = _cairo_pdf_surface_emit_cff_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_pdf_surface_emit_truetype_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_pdf_surface_emit_cff_fallback_font (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; } else { #if CAIRO_HAS_FT_FONT status = _cairo_pdf_surface_emit_type1_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; #endif status = _cairo_pdf_surface_emit_type1_fallback_font (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; } ASSERT_NOT_REACHED; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset, void *closure) { cairo_pdf_surface_t *surface = closure; cairo_status_t status; status = _cairo_pdf_surface_emit_type3_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; ASSERT_NOT_REACHED; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_emit_font_subsets (cairo_pdf_surface_t *surface) { cairo_status_t status; status = _cairo_scaled_font_subsets_foreach_unscaled (surface->font_subsets, _cairo_pdf_surface_emit_unscaled_font_subset, surface); if (status) goto BAIL; status = _cairo_scaled_font_subsets_foreach_scaled (surface->font_subsets, _cairo_pdf_surface_emit_scaled_font_subset, surface); BAIL: _cairo_scaled_font_subsets_destroy (surface->font_subsets); surface->font_subsets = NULL; return status; } static cairo_pdf_resource_t _cairo_pdf_surface_write_catalog (cairo_pdf_surface_t *surface) { cairo_pdf_resource_t catalog; catalog = _cairo_pdf_surface_new_object (surface); if (catalog.id == 0) return catalog; _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Catalog\n" " /Pages %d 0 R\n" ">>\n" "endobj\n", catalog.id, surface->pages_resource.id); return catalog; } static long _cairo_pdf_surface_write_xref (cairo_pdf_surface_t *surface) { cairo_pdf_object_t *object; int num_objects, i; long offset; char buffer[11]; num_objects = _cairo_array_num_elements (&surface->objects); offset = _cairo_output_stream_get_position (surface->output); _cairo_output_stream_printf (surface->output, "xref\n" "%d %d\n", 0, num_objects + 1); _cairo_output_stream_printf (surface->output, "0000000000 65535 f \n"); for (i = 0; i < num_objects; i++) { object = _cairo_array_index (&surface->objects, i); snprintf (buffer, sizeof buffer, "%010ld", object->offset); _cairo_output_stream_printf (surface->output, "%s 00000 n \n", buffer); } return offset; } static cairo_status_t _cairo_pdf_surface_write_mask_group (cairo_pdf_surface_t *surface, cairo_pdf_smask_group_t *group) { cairo_pdf_resource_t mask_group; cairo_pdf_resource_t smask; cairo_pdf_smask_group_t *smask_group; cairo_pdf_resource_t pattern_res, gstate_res; cairo_status_t status; /* Create mask group */ status = _cairo_pdf_surface_open_group (surface, NULL); if (status) return status; pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, group->mask, &pattern_res, &gstate_res); if (status) return status; if (gstate_res.id != 0) { smask_group = _cairo_pdf_surface_create_smask_group (surface); if (smask_group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); smask_group->operation = PDF_PAINT; smask_group->source = cairo_pattern_reference (group->mask); smask_group->source_res = pattern_res; status = _cairo_pdf_surface_add_smask_group (surface, smask_group); if (status) { _cairo_pdf_smask_group_destroy (smask_group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, smask_group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, group->mask, pattern_res, FALSE); if (status) return status; _cairo_output_stream_printf (surface->output, "0 0 %f %f re f\n", surface->width, surface->height); _cairo_pdf_surface_unselect_pattern (surface); } status = _cairo_pdf_surface_close_group (surface, &mask_group); if (status) return status; /* Create source group */ status = _cairo_pdf_surface_open_group (surface, &group->source_res); if (status) return status; pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, group->source, &pattern_res, &gstate_res); if (status) return status; if (gstate_res.id != 0) { smask_group = _cairo_pdf_surface_create_smask_group (surface); if (smask_group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); smask_group->operation = PDF_PAINT; smask_group->source = cairo_pattern_reference (group->source); smask_group->source_res = pattern_res; status = _cairo_pdf_surface_add_smask_group (surface, smask_group); if (status) { _cairo_pdf_smask_group_destroy (smask_group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, smask_group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, smask_group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, group->source, pattern_res, FALSE); if (status) return status; _cairo_output_stream_printf (surface->output, "0 0 %f %f re f\n", surface->width, surface->height); _cairo_pdf_surface_unselect_pattern (surface); } status = _cairo_pdf_surface_close_group (surface, NULL); if (status) return status; /* Create an smask based on the alpha component of mask_group */ smask = _cairo_pdf_surface_new_object (surface); if (smask.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Mask\n" " /S /Alpha\n" " /G %d 0 R\n" ">>\n" "endobj\n", smask.id, mask_group.id); /* Create a GState that uses the smask */ _cairo_pdf_surface_update_object (surface, group->group_res); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /ExtGState\n" " /SMask %d 0 R\n" " /ca 1\n" " /CA 1\n" " /AIS false\n" ">>\n" "endobj\n", group->group_res.id, smask.id); return _cairo_output_stream_get_status (surface->output); } static cairo_status_t _cairo_pdf_surface_write_smask_group (cairo_pdf_surface_t *surface, cairo_pdf_smask_group_t *group) { double old_width, old_height; cairo_status_t status; old_width = surface->width; old_height = surface->height; _cairo_pdf_surface_set_size_internal (surface, group->width, group->height); /* _mask is a special case that requires two groups - source * and mask as well as a smask and gstate dictionary */ if (group->operation == PDF_MASK) return _cairo_pdf_surface_write_mask_group (surface, group); status = _cairo_pdf_surface_open_group (surface, &group->group_res); if (status) return status; status = _cairo_pdf_surface_select_pattern (surface, group->source, group->source_res, group->operation == PDF_STROKE); if (status) return status; switch (group->operation) { case PDF_PAINT: _cairo_output_stream_printf (surface->output, "0 0 %f %f re f\n", surface->width, surface->height); break; case PDF_MASK: ASSERT_NOT_REACHED; break; case PDF_FILL: status = _cairo_pdf_operators_fill (&surface->pdf_operators, &group->path, group->fill_rule); break; case PDF_STROKE: status = _cairo_pdf_operators_stroke (&surface->pdf_operators, &group->path, group->style, &group->ctm, &group->ctm_inverse); break; case PDF_SHOW_GLYPHS: status = _cairo_pdf_operators_show_glyphs (&surface->pdf_operators, group->glyphs, group->num_glyphs, group->scaled_font); break; } if (status) return status; _cairo_pdf_surface_unselect_pattern (surface); status = _cairo_pdf_surface_close_group (surface, NULL); _cairo_pdf_surface_set_size_internal (surface, old_width, old_height); return status; } static cairo_status_t _cairo_pdf_surface_write_patterns_and_smask_groups (cairo_pdf_surface_t *surface) { cairo_pdf_pattern_t pattern; cairo_pdf_smask_group_t *group; int pattern_index, group_index; cairo_status_t status; /* Writing out PDF_MASK groups will cause additional smask groups * to be appended to surface->smask_groups. Additional patterns * may also be appended to surface->patterns. * * Writing meta surface patterns will cause additional patterns * and groups to be appended. */ pattern_index = 0; group_index = 0; while ((pattern_index < _cairo_array_num_elements (&surface->patterns)) || (group_index < _cairo_array_num_elements (&surface->smask_groups))) { for (; group_index < _cairo_array_num_elements (&surface->smask_groups); group_index++) { _cairo_array_copy_element (&surface->smask_groups, group_index, &group); status = _cairo_pdf_surface_write_smask_group (surface, group); if (status) return status; } for (; pattern_index < _cairo_array_num_elements (&surface->patterns); pattern_index++) { _cairo_array_copy_element (&surface->patterns, pattern_index, &pattern); status = _cairo_pdf_surface_emit_pattern (surface, &pattern); if (status) return status; } } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_pdf_surface_write_page (cairo_pdf_surface_t *surface) { cairo_pdf_resource_t page, knockout, res; cairo_status_t status; int i, len; _cairo_pdf_group_resources_clear (&surface->resources); if (surface->has_fallback_images) { status = _cairo_pdf_surface_open_knockout_group (surface); if (status) return status; len = _cairo_array_num_elements (&surface->knockout_group); for (i = 0; i < len; i++) { _cairo_array_copy_element (&surface->knockout_group, i, &res); _cairo_output_stream_printf (surface->output, "/x%d Do\n", res.id); status = _cairo_pdf_surface_add_xobject (surface, res); if (status) return status; } _cairo_output_stream_printf (surface->output, "/x%d Do\n", surface->content.id); status = _cairo_pdf_surface_add_xobject (surface, surface->content); if (status) return status; status = _cairo_pdf_surface_close_group (surface, &knockout); if (status) return status; _cairo_pdf_group_resources_clear (&surface->resources); status = _cairo_pdf_surface_open_content_stream (surface, FALSE); if (status) return status; _cairo_output_stream_printf (surface->output, "/x%d Do\n", knockout.id); status = _cairo_pdf_surface_add_xobject (surface, knockout); if (status) return status; status = _cairo_pdf_surface_close_content_stream (surface); if (status) return status; } page = _cairo_pdf_surface_new_object (surface); if (page.id == 0) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_output_stream_printf (surface->output, "%d 0 obj\n" "<< /Type /Page\n" " /Parent %d 0 R\n" " /MediaBox [ 0 0 %f %f ]\n" " /Contents %d 0 R\n" " /Group <<\n" " /Type /Group\n" " /S /Transparency\n" " /CS /DeviceRGB\n" " >>\n" " /Resources %d 0 R\n" ">>\n" "endobj\n", page.id, surface->pages_resource.id, surface->width, surface->height, surface->content.id, surface->content_resources.id); status = _cairo_array_append (&surface->pages, &page); if (status) return status; status = _cairo_pdf_surface_write_patterns_and_smask_groups (surface); if (status) return status; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_pdf_surface_analyze_surface_pattern_transparency (cairo_pdf_surface_t *surface, cairo_surface_pattern_t *pattern) { cairo_image_surface_t *image; void *image_extra; cairo_int_status_t status; cairo_image_transparency_t transparency; status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra); if (status) return status; if (image->base.status) return image->base.status; transparency = _cairo_image_analyze_transparency (image); if (transparency == CAIRO_IMAGE_IS_OPAQUE) status = CAIRO_STATUS_SUCCESS; else status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; _cairo_surface_release_source_image (pattern->surface, image, image_extra); return status; } static cairo_bool_t _surface_pattern_supported (cairo_surface_pattern_t *pattern) { cairo_extend_t extend; if (_cairo_surface_is_meta (pattern->surface)) return TRUE; if (pattern->surface->backend->acquire_source_image == NULL) return FALSE; /* Does an ALPHA-only source surface even make sense? Maybe, but I * don't think it's worth the extra code to support it. */ /* XXX: Need to write this function here... content = cairo_surface_get_content (pattern->surface); if (content == CAIRO_CONTENT_ALPHA) return FALSE; */ extend = cairo_pattern_get_extend (&pattern->base); switch (extend) { case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_REPEAT: case CAIRO_EXTEND_REFLECT: /* There's no point returning FALSE for EXTEND_PAD, as the image * surface does not currently implement it either */ case CAIRO_EXTEND_PAD: return TRUE; } ASSERT_NOT_REACHED; return FALSE; } static cairo_bool_t _gradient_pattern_supported (cairo_pattern_t *pattern) { cairo_extend_t extend; extend = cairo_pattern_get_extend (pattern); /* Radial gradients are currently only supported with EXTEND_NONE * and EXTEND_PAD and when one circle is inside the other. */ if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { double x1, y1, x2, y2, r1, r2, d; cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) pattern; if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { return FALSE; } x1 = _cairo_fixed_to_double (radial->c1.x); y1 = _cairo_fixed_to_double (radial->c1.y); r1 = _cairo_fixed_to_double (radial->r1); x2 = _cairo_fixed_to_double (radial->c2.x); y2 = _cairo_fixed_to_double (radial->c2.y); r2 = _cairo_fixed_to_double (radial->r2); d = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); if (d > fabs(r2 - r1)) { return FALSE; } } return TRUE; } static cairo_bool_t _pattern_supported (cairo_pattern_t *pattern) { if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) return TRUE; if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || pattern->type == CAIRO_PATTERN_TYPE_RADIAL) return _gradient_pattern_supported (pattern); if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) return _surface_pattern_supported ((cairo_surface_pattern_t *) pattern); return FALSE; } static cairo_int_status_t _cairo_pdf_surface_analyze_operation (cairo_pdf_surface_t *surface, cairo_operator_t op, cairo_pattern_t *pattern) { if (surface->force_fallbacks && surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_INT_STATUS_UNSUPPORTED; if (! _pattern_supported (pattern)) return CAIRO_INT_STATUS_UNSUPPORTED; if (op == CAIRO_OPERATOR_OVER) { if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; if ( _cairo_surface_is_meta (surface_pattern->surface)) return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; } } if (op == CAIRO_OPERATOR_OVER) return CAIRO_STATUS_SUCCESS; /* The SOURCE operator is supported if the pattern is opaque or if * there is nothing painted underneath. */ if (op == CAIRO_OPERATOR_SOURCE) { if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; if (_cairo_surface_is_meta (surface_pattern->surface)) { if (_cairo_pattern_is_opaque (pattern)) return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; } else { return _cairo_pdf_surface_analyze_surface_pattern_transparency (surface, surface_pattern); } } if (_cairo_pattern_is_opaque (pattern)) return CAIRO_STATUS_SUCCESS; else return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_bool_t _cairo_pdf_surface_operation_supported (cairo_pdf_surface_t *surface, cairo_operator_t op, cairo_pattern_t *pattern) { if (_cairo_pdf_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED) return TRUE; else return FALSE; } static cairo_int_status_t _cairo_pdf_surface_start_fallback (cairo_pdf_surface_t *surface) { cairo_status_t status; status = _cairo_pdf_surface_close_content_stream (surface); if (status) return status; status = _cairo_array_append (&surface->knockout_group, &surface->content); if (status) return status; surface->has_fallback_images = TRUE; _cairo_pdf_group_resources_clear (&surface->resources); return _cairo_pdf_surface_open_content_stream (surface, TRUE); } static cairo_int_status_t _cairo_pdf_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_pdf_surface_t *surface = abstract_surface; cairo_status_t status; cairo_pdf_smask_group_t *group; cairo_pdf_resource_t pattern_res, gstate_res; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { return _cairo_pdf_surface_analyze_operation (surface, op, source); } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { status = _cairo_pdf_surface_start_fallback (surface); if (status) return status; } assert (_cairo_pdf_surface_operation_supported (surface, op, source)); pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, source, &pattern_res, &gstate_res); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; if (gstate_res.id != 0) { group = _cairo_pdf_surface_create_smask_group (surface); if (group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); group->operation = PDF_PAINT; group->source = cairo_pattern_reference (source); group->source_res = pattern_res; status = _cairo_pdf_surface_add_smask_group (surface, group); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, FALSE); if (status) return status; _cairo_output_stream_printf (surface->output, "0 0 %f %f re f\n", surface->width, surface->height); _cairo_pdf_surface_unselect_pattern (surface); } return _cairo_output_stream_get_status (surface->output); } static cairo_int_status_t _cairo_pdf_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_pdf_surface_t *surface = abstract_surface; cairo_pdf_smask_group_t *group; cairo_status_t status, status2; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { status = _cairo_pdf_surface_analyze_operation (surface, op, source); if (status != CAIRO_STATUS_SUCCESS && status != CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) return status; status2 = _cairo_pdf_surface_analyze_operation (surface, op, mask); if (status2 != CAIRO_STATUS_SUCCESS) return status2; return status; } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { status = _cairo_pdf_surface_start_fallback (surface); if (status) return status; } assert (_cairo_pdf_surface_operation_supported (surface, op, source)); assert (_cairo_pdf_surface_operation_supported (surface, op, mask)); group = _cairo_pdf_surface_create_smask_group (surface); if (group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); group->operation = PDF_MASK; group->source = cairo_pattern_reference (source); group->mask = cairo_pattern_reference (mask); group->source_res = _cairo_pdf_surface_new_object (surface); if (group->source_res.id == 0) { _cairo_pdf_smask_group_destroy (group); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } status = _cairo_pdf_surface_add_smask_group (surface, group); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } status = _cairo_pdf_surface_add_smask (surface, group->group_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, group->source_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", group->group_res.id, group->source_res.id); return _cairo_output_stream_get_status (surface->output); } static cairo_int_status_t _cairo_pdf_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_pdf_surface_t *surface = abstract_surface; cairo_status_t status; cairo_pdf_smask_group_t *group; cairo_pdf_resource_t pattern_res, gstate_res; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_pdf_surface_analyze_operation (surface, op, source); assert (_cairo_pdf_surface_operation_supported (surface, op, source)); pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, source, &pattern_res, &gstate_res); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; if (gstate_res.id != 0) { group = _cairo_pdf_surface_create_smask_group (surface); if (group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); group->operation = PDF_STROKE; group->source = cairo_pattern_reference (source); group->source_res = pattern_res; status = _cairo_path_fixed_init_copy (&group->path, path); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } group->style = style; group->ctm = *ctm; group->ctm_inverse = *ctm_inverse; status = _cairo_pdf_surface_add_smask_group (surface, group); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, TRUE); if (status) return status; status = _cairo_pdf_operators_stroke (&surface->pdf_operators, path, style, ctm, ctm_inverse); if (status) return status; _cairo_pdf_surface_unselect_pattern (surface); } return _cairo_output_stream_get_status (surface->output); } static cairo_int_status_t _cairo_pdf_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_pdf_surface_t *surface = abstract_surface; cairo_status_t status; cairo_pdf_smask_group_t *group; cairo_pdf_resource_t pattern_res, gstate_res; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { return _cairo_pdf_surface_analyze_operation (surface, op, source); } else if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { status = _cairo_pdf_surface_start_fallback (surface); if (status) return status; } assert (_cairo_pdf_surface_operation_supported (surface, op, source)); pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, source, &pattern_res, &gstate_res); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; if (gstate_res.id != 0) { group = _cairo_pdf_surface_create_smask_group (surface); if (group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); group->operation = PDF_FILL; group->source = cairo_pattern_reference (source); group->source_res = pattern_res; status = _cairo_path_fixed_init_copy (&group->path, path); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } group->fill_rule = fill_rule; status = _cairo_pdf_surface_add_smask_group (surface, group); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, FALSE); if (status) return status; status = _cairo_pdf_operators_fill (&surface->pdf_operators, path, fill_rule); if (status) return status; _cairo_pdf_surface_unselect_pattern (surface); } return _cairo_output_stream_get_status (surface->output); } static cairo_int_status_t _cairo_pdf_surface_fill_stroke (void *abstract_surface, cairo_operator_t fill_op, cairo_pattern_t *fill_source, cairo_fill_rule_t fill_rule, double fill_tolerance, cairo_antialias_t fill_antialias, cairo_path_fixed_t *path, cairo_operator_t stroke_op, cairo_pattern_t *stroke_source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double stroke_tolerance, cairo_antialias_t stroke_antialias) { cairo_pdf_surface_t *surface = abstract_surface; cairo_status_t status; cairo_pdf_resource_t fill_pattern_res, stroke_pattern_res, gstate_res; /* During analysis we return unsupported and let the _fill and * _stroke functions that are on the fallback path do the analysis * for us. During render we may still encounter unsupported * combinations of fill/stroke patterns. However we can return * unsupported anytime to let the _fill and _stroke functions take * over. */ if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_INT_STATUS_UNSUPPORTED; /* PDF rendering of fill-stroke is not the same as cairo when * either the fill or stroke is not opaque. */ if ( !_cairo_pattern_is_opaque (fill_source) || !_cairo_pattern_is_opaque (stroke_source)) { return CAIRO_INT_STATUS_UNSUPPORTED; } fill_pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, fill_source, &fill_pattern_res, &gstate_res); if (status) return status; assert (gstate_res.id == 0); stroke_pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, stroke_source, &stroke_pattern_res, &gstate_res); if (status) return status; assert (gstate_res.id == 0); /* As PDF has separate graphics state for fill and stroke we can * select both at the same time */ status = _cairo_pdf_surface_select_pattern (surface, fill_source, fill_pattern_res, FALSE); if (status) return status; status = _cairo_pdf_surface_select_pattern (surface, stroke_source, stroke_pattern_res, TRUE); if (status) return status; status = _cairo_pdf_operators_fill_stroke (&surface->pdf_operators, path, fill_rule, stroke_style, stroke_ctm, stroke_ctm_inverse); if (status) return status; _cairo_pdf_surface_unselect_pattern (surface); return _cairo_output_stream_get_status (surface->output); } static cairo_int_status_t _cairo_pdf_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_pdf_surface_t *surface = abstract_surface; cairo_status_t status; cairo_pdf_smask_group_t *group; cairo_pdf_resource_t pattern_res, gstate_res; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_pdf_surface_analyze_operation (surface, op, source); assert (_cairo_pdf_surface_operation_supported (surface, op, source)); pattern_res.id = 0; gstate_res.id = 0; status = _cairo_pdf_surface_add_pdf_pattern (surface, source, &pattern_res, &gstate_res); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; if (gstate_res.id != 0) { group = _cairo_pdf_surface_create_smask_group (surface); if (group == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); group->operation = PDF_SHOW_GLYPHS; group->source = cairo_pattern_reference (source); group->source_res = pattern_res; group->glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); if (group->glyphs == NULL) { _cairo_pdf_smask_group_destroy (group); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } memcpy (group->glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); group->num_glyphs = num_glyphs; group->scaled_font = cairo_scaled_font_reference (scaled_font); status = _cairo_pdf_surface_add_smask_group (surface, group); if (status) { _cairo_pdf_smask_group_destroy (group); return status; } status = _cairo_pdf_surface_add_smask (surface, gstate_res); if (status) return status; status = _cairo_pdf_surface_add_xobject (surface, group->group_res); if (status) return status; _cairo_output_stream_printf (surface->output, "q /s%d gs /x%d Do Q\n", gstate_res.id, group->group_res.id); } else { status = _cairo_pdf_surface_select_pattern (surface, source, pattern_res, FALSE); if (status) return status; status = _cairo_pdf_operators_show_glyphs (&surface->pdf_operators, glyphs, num_glyphs, scaled_font); if (status) return status; _cairo_pdf_surface_unselect_pattern (surface); } return _cairo_output_stream_get_status (surface->output); } static void _cairo_pdf_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t paginated_mode) { cairo_pdf_surface_t *surface = abstract_surface; surface->paginated_mode = paginated_mode; } static const cairo_surface_backend_t cairo_pdf_surface_backend = { CAIRO_SURFACE_TYPE_PDF, _cairo_pdf_surface_create_similar, _cairo_pdf_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* _cairo_pdf_surface_copy_page */ _cairo_pdf_surface_show_page, NULL, /* set_clip_region */ _cairo_pdf_surface_intersect_clip_path, _cairo_pdf_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_pdf_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ /* Here are the drawing functions */ _cairo_pdf_surface_paint, _cairo_pdf_surface_mask, _cairo_pdf_surface_stroke, _cairo_pdf_surface_fill, _cairo_pdf_surface_show_glyphs, NULL, /* snapshot */ NULL, /* is_compatible */ NULL, /* reset */ _cairo_pdf_surface_fill_stroke, }; static const cairo_paginated_surface_backend_t cairo_pdf_surface_paginated_backend = { _cairo_pdf_surface_start_page, _cairo_pdf_surface_set_paginated_mode }; libgdiplus-2.11/cairo/src/cairo-truetype-subset.c0000664000175000017500000012217212225470167017040 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg * Adrian Johnson */ /* * Useful links: * http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6.html * http://www.microsoft.com/typography/specs/default.htm */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-truetype-subset-private.h" typedef struct subset_glyph subset_glyph_t; struct subset_glyph { int parent_index; unsigned long location; }; typedef struct _cairo_truetype_font cairo_truetype_font_t; typedef struct table table_t; struct table { unsigned long tag; cairo_status_t (*write) (cairo_truetype_font_t *font, unsigned long tag); int pos; /* position in the font directory */ }; struct _cairo_truetype_font { cairo_scaled_font_subset_t *scaled_font_subset; table_t truetype_tables[10]; int num_tables; struct { char *base_font; unsigned int num_glyphs; int *widths; long x_min, y_min, x_max, y_max; long ascent, descent; int units_per_em; } base; subset_glyph_t *glyphs; const cairo_scaled_font_backend_t *backend; int num_glyphs_in_face; int checksum_index; cairo_array_t output; cairo_array_t string_offsets; unsigned long last_offset; unsigned long last_boundary; int *parent_to_subset; cairo_status_t status; }; static cairo_status_t cairo_truetype_font_use_glyph (cairo_truetype_font_t *font, unsigned short glyph, unsigned short *out); #define SFNT_VERSION 0x00010000 #define SFNT_STRING_MAX_LENGTH 65535 static cairo_status_t _cairo_truetype_font_set_error (cairo_truetype_font_t *font, cairo_status_t status) { if (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED) return status; _cairo_status_set_error (&font->status, status); return _cairo_error (status); } static cairo_status_t _cairo_truetype_font_create (cairo_scaled_font_subset_t *scaled_font_subset, cairo_truetype_font_t **font_return) { cairo_status_t status; cairo_truetype_font_t *font; const cairo_scaled_font_backend_t *backend; tt_head_t head; tt_hhea_t hhea; tt_maxp_t maxp; tt_name_t *name; tt_name_record_t *record; unsigned long size; int i, j; backend = scaled_font_subset->scaled_font->backend; if (!backend->load_truetype_table) return CAIRO_INT_STATUS_UNSUPPORTED; /* FIXME: We should either support subsetting vertical fonts, or fail on * vertical. Currently font_options_t doesn't have vertical flag, but * it should be added in the future. For now, the freetype backend * returns UNSUPPORTED in load_truetype_table if the font is vertical. * * if (cairo_font_options_get_vertical_layout (scaled_font_subset->scaled_font)) * return CAIRO_INT_STATUS_UNSUPPORTED; */ size = sizeof (tt_head_t); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_head, 0, (unsigned char *) &head, &size); if (status) return status; size = sizeof (tt_maxp_t); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_maxp, 0, (unsigned char *) &maxp, &size); if (status) return status; size = sizeof (tt_hhea_t); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_hhea, 0, (unsigned char *) &hhea, &size); if (status) return status; size = 0; status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_name, 0, NULL, &size); if (status) return status; name = malloc(size); if (name == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_name, 0, (unsigned char *) name, &size); if (status) goto fail0; font = malloc (sizeof (cairo_truetype_font_t)); if (font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail0; } font->backend = backend; font->num_glyphs_in_face = be16_to_cpu (maxp.num_glyphs); font->scaled_font_subset = scaled_font_subset; font->last_offset = 0; font->last_boundary = 0; _cairo_array_init (&font->output, sizeof (char)); status = _cairo_array_grow_by (&font->output, 4096); if (status) goto fail1; font->glyphs = calloc (font->num_glyphs_in_face + 1, sizeof (subset_glyph_t)); if (font->glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } font->parent_to_subset = calloc (font->num_glyphs_in_face, sizeof (int)); if (font->parent_to_subset == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } font->base.num_glyphs = 0; font->base.x_min = (int16_t) be16_to_cpu (head.x_min); font->base.y_min = (int16_t) be16_to_cpu (head.y_min); font->base.x_max = (int16_t) be16_to_cpu (head.x_max); font->base.y_max = (int16_t) be16_to_cpu (head.y_max); font->base.ascent = (int16_t) be16_to_cpu (hhea.ascender); font->base.descent = (int16_t) be16_to_cpu (hhea.descender); font->base.units_per_em = (int16_t) be16_to_cpu (head.units_per_em); if (font->base.units_per_em == 0) font->base.units_per_em = 2048; /* Extract the font name from the name table. At present this * just looks for the Mac platform/Roman encoded font name. It * should be extended to use any suitable font name in the * name table. If the mac/roman font name is not found a * CairoFont-x-y name is created. */ font->base.base_font = NULL; for (i = 0; i < be16_to_cpu(name->num_records); i++) { record = &(name->records[i]); if ((be16_to_cpu (record->platform) == 1) && (be16_to_cpu (record->encoding) == 0) && (be16_to_cpu (record->name) == 4)) { font->base.base_font = malloc (be16_to_cpu(record->length) + 1); if (font->base.base_font) { strncpy(font->base.base_font, ((char*)name) + be16_to_cpu (name->strings_offset) + be16_to_cpu (record->offset), be16_to_cpu (record->length)); font->base.base_font[be16_to_cpu (record->length)] = 0; } break; } } free (name); name = NULL; if (font->base.base_font == NULL) { font->base.base_font = malloc (30); if (font->base.base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } snprintf(font->base.base_font, 30, "CairoFont-%u-%u", scaled_font_subset->font_id, scaled_font_subset->subset_id); } for (i = 0, j = 0; font->base.base_font[j]; j++) { if (font->base.base_font[j] == ' ') continue; font->base.base_font[i++] = font->base.base_font[j]; } font->base.base_font[i] = '\0'; font->base.widths = calloc (font->num_glyphs_in_face, sizeof (int)); if (font->base.widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail4; } _cairo_array_init (&font->string_offsets, sizeof (unsigned long)); status = _cairo_array_grow_by (&font->string_offsets, 10); if (status) goto fail5; font->status = CAIRO_STATUS_SUCCESS; *font_return = font; return CAIRO_STATUS_SUCCESS; fail5: _cairo_array_fini (&font->string_offsets); free (font->base.widths); fail4: free (font->base.base_font); fail3: free (font->parent_to_subset); fail2: free (font->glyphs); fail1: _cairo_array_fini (&font->output); free (font); fail0: if (name) free (name); return status; } static void cairo_truetype_font_destroy (cairo_truetype_font_t *font) { _cairo_array_fini (&font->string_offsets); free (font->base.widths); free (font->base.base_font); free (font->parent_to_subset); free (font->glyphs); _cairo_array_fini (&font->output); free (font); } static cairo_status_t cairo_truetype_font_allocate_write_buffer (cairo_truetype_font_t *font, size_t length, unsigned char **buffer) { cairo_status_t status; if (font->status) return font->status; status = _cairo_array_allocate (&font->output, length, (void **) buffer); if (status) return _cairo_truetype_font_set_error (font, status); return CAIRO_STATUS_SUCCESS; } static void cairo_truetype_font_write (cairo_truetype_font_t *font, const void *data, size_t length) { cairo_status_t status; if (font->status) return; status = _cairo_array_append_multiple (&font->output, data, length); if (status) status = _cairo_truetype_font_set_error (font, status); } static void cairo_truetype_font_write_be16 (cairo_truetype_font_t *font, uint16_t value) { uint16_t be16_value; if (font->status) return; be16_value = cpu_to_be16 (value); cairo_truetype_font_write (font, &be16_value, sizeof be16_value); } static void cairo_truetype_font_write_be32 (cairo_truetype_font_t *font, uint32_t value) { uint32_t be32_value; if (font->status) return; be32_value = cpu_to_be32 (value); cairo_truetype_font_write (font, &be32_value, sizeof be32_value); } static cairo_status_t cairo_truetype_font_align_output (cairo_truetype_font_t *font, unsigned long *aligned) { int length, pad; unsigned char *padding; length = _cairo_array_num_elements (&font->output); *aligned = (length + 3) & ~3; pad = *aligned - length; if (pad) { cairo_status_t status; status = cairo_truetype_font_allocate_write_buffer (font, pad, &padding); if (status) return status; memset (padding, 0, pad); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_check_boundary (cairo_truetype_font_t *font, unsigned long boundary) { cairo_status_t status; if (font->status) return font->status; if (boundary - font->last_offset > SFNT_STRING_MAX_LENGTH) { status = _cairo_array_append (&font->string_offsets, &font->last_boundary); if (status) return _cairo_truetype_font_set_error (font, status); font->last_offset = font->last_boundary; } font->last_boundary = boundary; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_cmap_table (cairo_truetype_font_t *font, unsigned long tag) { unsigned int i; cairo_truetype_font_write_be16 (font, 0); /* Table version */ cairo_truetype_font_write_be16 (font, 2); /* Num tables */ cairo_truetype_font_write_be16 (font, 3); /* Platform */ cairo_truetype_font_write_be16 (font, 0); /* Encoding */ cairo_truetype_font_write_be32 (font, 20); /* Offset to start of table */ cairo_truetype_font_write_be16 (font, 1); /* Platform */ cairo_truetype_font_write_be16 (font, 0); /* Encoding */ cairo_truetype_font_write_be32 (font, 52); /* Offset to start of table */ /* Output a format 4 encoding table. */ cairo_truetype_font_write_be16 (font, 4); /* Format */ cairo_truetype_font_write_be16 (font, 32); /* Length */ cairo_truetype_font_write_be16 (font, 0); /* Version */ cairo_truetype_font_write_be16 (font, 4); /* 2*segcount */ cairo_truetype_font_write_be16 (font, 4); /* searchrange */ cairo_truetype_font_write_be16 (font, 1); /* entry selector */ cairo_truetype_font_write_be16 (font, 0); /* rangeshift */ cairo_truetype_font_write_be16 (font, 0xf000 + font->base.num_glyphs - 1); /* end count[0] */ cairo_truetype_font_write_be16 (font, 0xffff); /* end count[1] */ cairo_truetype_font_write_be16 (font, 0); /* reserved */ cairo_truetype_font_write_be16 (font, 0xf000); /* startCode[0] */ cairo_truetype_font_write_be16 (font, 0xffff); /* startCode[1] */ cairo_truetype_font_write_be16 (font, 0x1000); /* delta[0] */ cairo_truetype_font_write_be16 (font, 1); /* delta[1] */ cairo_truetype_font_write_be16 (font, 0); /* rangeOffset[0] */ cairo_truetype_font_write_be16 (font, 0); /* rangeOffset[1] */ /* Output a format 6 encoding table. */ cairo_truetype_font_write_be16 (font, 6); cairo_truetype_font_write_be16 (font, 10 + 2 * font->base.num_glyphs); cairo_truetype_font_write_be16 (font, 0); cairo_truetype_font_write_be16 (font, 0); /* First character */ cairo_truetype_font_write_be16 (font, font->base.num_glyphs); for (i = 0; i < font->base.num_glyphs; i++) cairo_truetype_font_write_be16 (font, i); return font->status; } static cairo_status_t cairo_truetype_font_write_generic_table (cairo_truetype_font_t *font, unsigned long tag) { cairo_status_t status; unsigned char *buffer; unsigned long size; if (font->status) return font->status; size = 0; status = font->backend->load_truetype_table(font->scaled_font_subset->scaled_font, tag, 0, NULL, &size); if (status) return _cairo_truetype_font_set_error (font, status); status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); if (status) return _cairo_truetype_font_set_error (font, status); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, tag, 0, buffer, &size); if (status) return _cairo_truetype_font_set_error (font, status); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_remap_composite_glyph (cairo_truetype_font_t *font, unsigned char *buffer, unsigned long size) { tt_glyph_data_t *glyph_data; tt_composite_glyph_t *composite_glyph; int num_args; int has_more_components; unsigned short flags; unsigned short index; cairo_status_t status; unsigned char *end = buffer + size; if (font->status) return font->status; glyph_data = (tt_glyph_data_t *) buffer; if ((unsigned char *)(&glyph_data->data) >= end) return CAIRO_INT_STATUS_UNSUPPORTED; if ((int16_t)be16_to_cpu (glyph_data->num_contours) >= 0) return CAIRO_STATUS_SUCCESS; composite_glyph = &glyph_data->glyph; do { if ((unsigned char *)(&composite_glyph->args[1]) >= end) return CAIRO_INT_STATUS_UNSUPPORTED; flags = be16_to_cpu (composite_glyph->flags); has_more_components = flags & TT_MORE_COMPONENTS; status = cairo_truetype_font_use_glyph (font, be16_to_cpu (composite_glyph->index), &index); if (status) return status; composite_glyph->index = cpu_to_be16 (index); num_args = 1; if (flags & TT_ARG_1_AND_2_ARE_WORDS) num_args += 1; if (flags & TT_WE_HAVE_A_SCALE) num_args += 1; else if (flags & TT_WE_HAVE_AN_X_AND_Y_SCALE) num_args += 2; else if (flags & TT_WE_HAVE_A_TWO_BY_TWO) num_args += 3; composite_glyph = (tt_composite_glyph_t *) &(composite_glyph->args[num_args]); } while (has_more_components); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_glyf_table (cairo_truetype_font_t *font, unsigned long tag) { unsigned long start_offset, index, size, next; tt_head_t header; unsigned long begin, end; unsigned char *buffer; unsigned int i; union { unsigned char *bytes; uint16_t *short_offsets; uint32_t *long_offsets; } u; cairo_status_t status; if (font->status) return font->status; size = sizeof (tt_head_t); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_head, 0, (unsigned char*) &header, &size); if (status) return _cairo_truetype_font_set_error (font, status); if (be16_to_cpu (header.index_to_loc_format) == 0) size = sizeof (int16_t) * (font->num_glyphs_in_face + 1); else size = sizeof (int32_t) * (font->num_glyphs_in_face + 1); u.bytes = malloc (size); if (u.bytes == NULL) return _cairo_truetype_font_set_error (font, CAIRO_STATUS_NO_MEMORY); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_loca, 0, u.bytes, &size); if (status) return _cairo_truetype_font_set_error (font, status); start_offset = _cairo_array_num_elements (&font->output); for (i = 0; i < font->base.num_glyphs; i++) { index = font->glyphs[i].parent_index; if (be16_to_cpu (header.index_to_loc_format) == 0) { begin = be16_to_cpu (u.short_offsets[index]) * 2; end = be16_to_cpu (u.short_offsets[index + 1]) * 2; } else { begin = be32_to_cpu (u.long_offsets[index]); end = be32_to_cpu (u.long_offsets[index + 1]); } /* quick sanity check... */ if (end < begin) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto FAIL; } size = end - begin; status = cairo_truetype_font_align_output (font, &next); if (status) goto FAIL; status = cairo_truetype_font_check_boundary (font, next); if (status) goto FAIL; font->glyphs[i].location = next - start_offset; status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); if (status) goto FAIL; if (size != 0) { status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_glyf, begin, buffer, &size); if (status) goto FAIL; status = cairo_truetype_font_remap_composite_glyph (font, buffer, size); if (status) goto FAIL; } } status = cairo_truetype_font_align_output (font, &next); if (status) goto FAIL; font->glyphs[i].location = next - start_offset; status = font->status; FAIL: free (u.bytes); return _cairo_truetype_font_set_error (font, status); } static cairo_status_t cairo_truetype_font_write_head_table (cairo_truetype_font_t *font, unsigned long tag) { unsigned char *buffer; unsigned long size; cairo_status_t status; if (font->status) return font->status; size = 0; status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, tag, 0, NULL, &size); if (status) return _cairo_truetype_font_set_error (font, status); font->checksum_index = _cairo_array_num_elements (&font->output) + 8; status = cairo_truetype_font_allocate_write_buffer (font, size, &buffer); if (status) return _cairo_truetype_font_set_error (font, status); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, tag, 0, buffer, &size); if (status) return _cairo_truetype_font_set_error (font, status); /* set checkSumAdjustment to 0 for table checksum calcualtion */ *(uint32_t *)(buffer + 8) = 0; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_hhea_table (cairo_truetype_font_t *font, unsigned long tag) { tt_hhea_t *hhea; unsigned long size; cairo_status_t status; if (font->status) return font->status; size = sizeof (tt_hhea_t); status = cairo_truetype_font_allocate_write_buffer (font, size, (unsigned char **) &hhea); if (status) return _cairo_truetype_font_set_error (font, status); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, tag, 0, (unsigned char *) hhea, &size); if (status) return _cairo_truetype_font_set_error (font, status); hhea->num_hmetrics = cpu_to_be16 ((uint16_t)(font->base.num_glyphs)); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_hmtx_table (cairo_truetype_font_t *font, unsigned long tag) { unsigned long size; unsigned long long_entry_size; unsigned long short_entry_size; short *p; unsigned int i; tt_hhea_t hhea; int num_hmetrics; cairo_status_t status; if (font->status) return font->status; size = sizeof (tt_hhea_t); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hhea, 0, (unsigned char*) &hhea, &size); if (status) return _cairo_truetype_font_set_error (font, status); num_hmetrics = be16_to_cpu(hhea.num_hmetrics); for (i = 0; i < font->base.num_glyphs; i++) { long_entry_size = 2 * sizeof (int16_t); short_entry_size = sizeof (int16_t); status = cairo_truetype_font_allocate_write_buffer (font, long_entry_size, (unsigned char **) &p); if (status) return _cairo_truetype_font_set_error (font, status); if (font->glyphs[i].parent_index < num_hmetrics) { status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hmtx, font->glyphs[i].parent_index * long_entry_size, (unsigned char *) p, &long_entry_size); if (status) return _cairo_truetype_font_set_error (font, status); } else { status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hmtx, (num_hmetrics - 1) * long_entry_size, (unsigned char *) p, &short_entry_size); if (status) return _cairo_truetype_font_set_error (font, status); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hmtx, num_hmetrics * long_entry_size + (font->glyphs[i].parent_index - num_hmetrics) * short_entry_size, (unsigned char *) (p + 1), &short_entry_size); if (status) return _cairo_truetype_font_set_error (font, status); } font->base.widths[i] = be16_to_cpu (p[0]); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_loca_table (cairo_truetype_font_t *font, unsigned long tag) { unsigned int i; tt_head_t header; unsigned long size; cairo_status_t status; if (font->status) return font->status; size = sizeof(tt_head_t); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_head, 0, (unsigned char*) &header, &size); if (status) return _cairo_truetype_font_set_error (font, status); if (be16_to_cpu (header.index_to_loc_format) == 0) { for (i = 0; i < font->base.num_glyphs + 1; i++) cairo_truetype_font_write_be16 (font, font->glyphs[i].location / 2); } else { for (i = 0; i < font->base.num_glyphs + 1; i++) cairo_truetype_font_write_be32 (font, font->glyphs[i].location); } return font->status; } static cairo_status_t cairo_truetype_font_write_maxp_table (cairo_truetype_font_t *font, unsigned long tag) { tt_maxp_t *maxp; unsigned long size; cairo_status_t status; if (font->status) return font->status; size = sizeof (tt_maxp_t); status = cairo_truetype_font_allocate_write_buffer (font, size, (unsigned char **) &maxp); if (status) return _cairo_truetype_font_set_error (font, status); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, tag, 0, (unsigned char *) maxp, &size); if (status) return _cairo_truetype_font_set_error (font, status); maxp->num_glyphs = cpu_to_be16 (font->base.num_glyphs); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_truetype_font_write_offset_table (cairo_truetype_font_t *font) { cairo_status_t status; unsigned char *table_buffer; size_t table_buffer_length; unsigned short search_range, entry_selector, range_shift; if (font->status) return font->status; search_range = 1; entry_selector = 0; while (search_range * 2 <= font->num_tables) { search_range *= 2; entry_selector++; } search_range *= 16; range_shift = font->num_tables * 16 - search_range; cairo_truetype_font_write_be32 (font, SFNT_VERSION); cairo_truetype_font_write_be16 (font, font->num_tables); cairo_truetype_font_write_be16 (font, search_range); cairo_truetype_font_write_be16 (font, entry_selector); cairo_truetype_font_write_be16 (font, range_shift); /* Allocate space for the table directory. Each directory entry * will be filled in by cairo_truetype_font_update_entry() after * the table is written. */ table_buffer_length = font->num_tables * 16; status = cairo_truetype_font_allocate_write_buffer (font, table_buffer_length, &table_buffer); if (status) return _cairo_truetype_font_set_error (font, status); return CAIRO_STATUS_SUCCESS; } static uint32_t cairo_truetype_font_calculate_checksum (cairo_truetype_font_t *font, unsigned long start, unsigned long end) { uint32_t *padded_end; uint32_t *p; uint32_t checksum; char *data; checksum = 0; data = _cairo_array_index (&font->output, 0); p = (uint32_t *) (data + start); padded_end = (uint32_t *) (data + ((end + 3) & ~3)); while (p < padded_end) checksum += be32_to_cpu(*p++); return checksum; } static void cairo_truetype_font_update_entry (cairo_truetype_font_t *font, int index, unsigned long tag, unsigned long start, unsigned long end) { uint32_t *entry; entry = _cairo_array_index (&font->output, 12 + 16 * index); entry[0] = cpu_to_be32 ((uint32_t)tag); entry[1] = cpu_to_be32 (cairo_truetype_font_calculate_checksum (font, start, end)); entry[2] = cpu_to_be32 ((uint32_t)start); entry[3] = cpu_to_be32 ((uint32_t)(end - start)); } static cairo_status_t cairo_truetype_font_generate (cairo_truetype_font_t *font, const char **data, unsigned long *length, const unsigned long **string_offsets, unsigned long *num_strings) { cairo_status_t status; unsigned long start, end, next; uint32_t checksum, *checksum_location; int i; if (font->status) return font->status; status = cairo_truetype_font_write_offset_table (font); if (status) goto FAIL; status = cairo_truetype_font_align_output (font, &start); if (status) goto FAIL; end = 0; for (i = 0; i < font->num_tables; i++) { status = font->truetype_tables[i].write (font, font->truetype_tables[i].tag); if (status) goto FAIL; end = _cairo_array_num_elements (&font->output); status = cairo_truetype_font_align_output (font, &next); if (status) goto FAIL; cairo_truetype_font_update_entry (font, font->truetype_tables[i].pos, font->truetype_tables[i].tag, start, end); status = cairo_truetype_font_check_boundary (font, next); if (status) goto FAIL; start = next; } checksum = 0xb1b0afba - cairo_truetype_font_calculate_checksum (font, 0, end); checksum_location = _cairo_array_index (&font->output, font->checksum_index); *checksum_location = cpu_to_be32 (checksum); *data = _cairo_array_index (&font->output, 0); *length = _cairo_array_num_elements (&font->output); *num_strings = _cairo_array_num_elements (&font->string_offsets); if (*num_strings != 0) *string_offsets = _cairo_array_index (&font->string_offsets, 0); else *string_offsets = NULL; FAIL: return _cairo_truetype_font_set_error (font, status); } static cairo_status_t cairo_truetype_font_use_glyph (cairo_truetype_font_t *font, unsigned short glyph, unsigned short *out) { if (glyph >= font->num_glyphs_in_face) return CAIRO_INT_STATUS_UNSUPPORTED; if (font->parent_to_subset[glyph] == 0) { font->parent_to_subset[glyph] = font->base.num_glyphs; font->glyphs[font->base.num_glyphs].parent_index = glyph; font->base.num_glyphs++; } *out = font->parent_to_subset[glyph]; return CAIRO_STATUS_SUCCESS; } static void cairo_truetype_font_add_truetype_table (cairo_truetype_font_t *font, unsigned long tag, cairo_status_t (*write) (cairo_truetype_font_t *font, unsigned long tag), int pos) { font->truetype_tables[font->num_tables].tag = tag; font->truetype_tables[font->num_tables].write = write; font->truetype_tables[font->num_tables].pos = pos; font->num_tables++; } /* cairo_truetype_font_create_truetype_table_list() builds the list of * truetype tables to be embedded in the subsetted font. Each call to * cairo_truetype_font_add_truetype_table() adds a table, the callback * for generating the table, and the position in the table directory * to the truetype_tables array. * * As we write out the glyf table we remap composite glyphs. * Remapping composite glyphs will reference the sub glyphs the * composite glyph is made up of. The "glyf" table callback needs to * be called first so we have all the glyphs in the subset before * going further. * * The order in which tables are added to the truetype_table array * using cairo_truetype_font_add_truetype_table() specifies the order * in which the callback functions will be called. * * The tables in the table directory must be listed in alphabetical * order. The "cvt", "fpgm", and "prep" are optional tables. They * will only be embedded in the subset if they exist in the source * font. The pos parameter of cairo_truetype_font_add_truetype_table() * specifies the position of the table in the table directory. */ static void cairo_truetype_font_create_truetype_table_list (cairo_truetype_font_t *font) { cairo_bool_t has_cvt = FALSE; cairo_bool_t has_fpgm = FALSE; cairo_bool_t has_prep = FALSE; unsigned long size; int pos; size = 0; if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_cvt, 0, NULL, &size) == CAIRO_STATUS_SUCCESS) has_cvt = TRUE; size = 0; if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_fpgm, 0, NULL, &size) == CAIRO_STATUS_SUCCESS) has_fpgm = TRUE; size = 0; if (font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_prep, 0, NULL, &size) == CAIRO_STATUS_SUCCESS) has_prep = TRUE; font->num_tables = 0; pos = 1; if (has_cvt) pos++; if (has_fpgm) pos++; cairo_truetype_font_add_truetype_table (font, TT_TAG_glyf, cairo_truetype_font_write_glyf_table, pos); pos = 0; cairo_truetype_font_add_truetype_table (font, TT_TAG_cmap, cairo_truetype_font_write_cmap_table, pos++); if (has_cvt) cairo_truetype_font_add_truetype_table (font, TT_TAG_cvt, cairo_truetype_font_write_generic_table, pos++); if (has_fpgm) cairo_truetype_font_add_truetype_table (font, TT_TAG_fpgm, cairo_truetype_font_write_generic_table, pos++); pos++; cairo_truetype_font_add_truetype_table (font, TT_TAG_head, cairo_truetype_font_write_head_table, pos++); cairo_truetype_font_add_truetype_table (font, TT_TAG_hhea, cairo_truetype_font_write_hhea_table, pos++); cairo_truetype_font_add_truetype_table (font, TT_TAG_hmtx, cairo_truetype_font_write_hmtx_table, pos++); cairo_truetype_font_add_truetype_table (font, TT_TAG_loca, cairo_truetype_font_write_loca_table, pos++); cairo_truetype_font_add_truetype_table (font, TT_TAG_maxp, cairo_truetype_font_write_maxp_table, pos++); if (has_prep) cairo_truetype_font_add_truetype_table (font, TT_TAG_prep, cairo_truetype_font_write_generic_table, pos); } cairo_status_t _cairo_truetype_subset_init (cairo_truetype_subset_t *truetype_subset, cairo_scaled_font_subset_t *font_subset) { cairo_truetype_font_t *font = NULL; cairo_status_t status; const char *data = NULL; /* squelch bogus compiler warning */ unsigned long length = 0; /* squelch bogus compiler warning */ unsigned long offsets_length; unsigned int i; const unsigned long *string_offsets = NULL; unsigned long num_strings = 0; status = _cairo_truetype_font_create (font_subset, &font); if (status) return status; for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { unsigned short parent_glyph = font->scaled_font_subset->glyphs[i]; status = cairo_truetype_font_use_glyph (font, parent_glyph, &parent_glyph); if (status) goto fail1; } cairo_truetype_font_create_truetype_table_list (font); status = cairo_truetype_font_generate (font, &data, &length, &string_offsets, &num_strings); if (status) goto fail1; truetype_subset->base_font = strdup (font->base.base_font); if (truetype_subset->base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } /* The widths array returned must contain only widths for the * glyphs in font_subset. Any subglyphs appended after * font_subset->num_glyphs are omitted. */ truetype_subset->widths = calloc (sizeof (double), font->scaled_font_subset->num_glyphs); if (truetype_subset->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) truetype_subset->widths[i] = (double)font->base.widths[i]/font->base.units_per_em; truetype_subset->x_min = (double)font->base.x_min/font->base.units_per_em; truetype_subset->y_min = (double)font->base.y_min/font->base.units_per_em; truetype_subset->x_max = (double)font->base.x_max/font->base.units_per_em; truetype_subset->y_max = (double)font->base.y_max/font->base.units_per_em; truetype_subset->ascent = (double)font->base.ascent/font->base.units_per_em; truetype_subset->descent = (double)font->base.descent/font->base.units_per_em; if (length) { truetype_subset->data = malloc (length); if (truetype_subset->data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } memcpy (truetype_subset->data, data, length); } else truetype_subset->data = NULL; truetype_subset->data_length = length; if (num_strings) { offsets_length = num_strings * sizeof (unsigned long); truetype_subset->string_offsets = malloc (offsets_length); if (truetype_subset->string_offsets == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail4; } memcpy (truetype_subset->string_offsets, string_offsets, offsets_length); truetype_subset->num_string_offsets = num_strings; } else { truetype_subset->string_offsets = NULL; truetype_subset->num_string_offsets = 0; } cairo_truetype_font_destroy (font); return CAIRO_STATUS_SUCCESS; fail4: free (truetype_subset->data); fail3: free (truetype_subset->widths); fail2: free (truetype_subset->base_font); fail1: cairo_truetype_font_destroy (font); return status; } void _cairo_truetype_subset_fini (cairo_truetype_subset_t *subset) { free (subset->base_font); free (subset->widths); free (subset->data); free (subset->string_offsets); } static cairo_int_status_t _cairo_truetype_map_glyphs_to_unicode (cairo_scaled_font_subset_t *font_subset, unsigned long table_offset) { cairo_status_t status; const cairo_scaled_font_backend_t *backend; tt_segment_map_t *map; char buf[4]; unsigned int num_segments, i, j; unsigned long size; uint16_t *start_code; uint16_t *end_code; uint16_t *delta; uint16_t *range_offset; uint16_t *glyph_array; uint16_t g_id, c; backend = font_subset->scaled_font->backend; size = 4; status = backend->load_truetype_table (font_subset->scaled_font, TT_TAG_cmap, table_offset, (unsigned char *) &buf, &size); if (status) return status; /* All table formats have the same first two words */ map = (tt_segment_map_t *) buf; if (be16_to_cpu (map->format) != 4) return CAIRO_INT_STATUS_UNSUPPORTED; size = be16_to_cpu (map->length); map = malloc (size); if (map == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = backend->load_truetype_table (font_subset->scaled_font, TT_TAG_cmap, table_offset, (unsigned char *) map, &size); if (status) goto fail; num_segments = be16_to_cpu (map->segCountX2)/2; end_code = map->endCount; start_code = &(end_code[num_segments + 1]); delta = &(start_code[num_segments]); range_offset = &(delta[num_segments]); glyph_array = &(range_offset[num_segments]); i = 0; while (i < font_subset->num_glyphs) { g_id = (uint16_t) font_subset->glyphs[i]; /* search for glyph in segments * with rangeOffset=0 */ for (j = 0; j < num_segments; j++) { c = g_id - be16_to_cpu (delta[j]); if (range_offset[j] == 0 && c >= be16_to_cpu (start_code[j]) && c <= be16_to_cpu (end_code[j])) { font_subset->to_unicode[i] = c; goto next_glyph; } } /* search for glyph in segments with rangeOffset=1 */ for (j = 0; j < num_segments; j++) { if (range_offset[j] != 0) { uint16_t *glyph_ids = &range_offset[j] + be16_to_cpu (range_offset[j])/2; int range_size = be16_to_cpu (end_code[j]) - be16_to_cpu (start_code[j]) + 1; uint16_t g_id_be = cpu_to_be16 (g_id); int k; for (k = 0; k < range_size; k++) { if (glyph_ids[k] == g_id_be) { font_subset->to_unicode[i] = be16_to_cpu (start_code[j]) + k; goto next_glyph; } } } } next_glyph: i++; } status = CAIRO_STATUS_SUCCESS; fail: free (map); return status; } cairo_int_status_t _cairo_truetype_create_glyph_to_unicode_map (cairo_scaled_font_subset_t *font_subset) { cairo_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; const cairo_scaled_font_backend_t *backend; tt_cmap_t *cmap; char buf[4]; int num_tables, i; unsigned long size; backend = font_subset->scaled_font->backend; if (!backend->load_truetype_table) return CAIRO_INT_STATUS_UNSUPPORTED; size = 4; status = backend->load_truetype_table (font_subset->scaled_font, TT_TAG_cmap, 0, (unsigned char *) &buf, &size); if (status) return status; cmap = (tt_cmap_t *) buf; num_tables = be16_to_cpu (cmap->num_tables); size = 4 + num_tables*sizeof(tt_cmap_index_t); cmap = malloc (size); if (cmap == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = backend->load_truetype_table (font_subset->scaled_font, TT_TAG_cmap, 0, (unsigned char *) cmap, &size); if (status) goto cleanup; /* Find a table with Unicode mapping */ for (i = 0; i < num_tables; i++) { if (be16_to_cpu (cmap->index[i].platform) == 3 && be16_to_cpu (cmap->index[i].encoding) == 1) { status = _cairo_truetype_map_glyphs_to_unicode (font_subset, be32_to_cpu (cmap->index[i].offset)); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto cleanup; } } cleanup: free (cmap); return status; } libgdiplus-2.11/cairo/src/cairo-quartz-private.h0000664000175000017500000000635112225470167016657 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Calum Robinson * Copyright (C) 2006,2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Calum Robinson * * Contributor(s): * Calum Robinson * Vladimir Vukicevic */ #ifndef CAIRO_QUARTZ_PRIVATE_H #define CAIRO_QUARTZ_PRIVATE_H #include "cairoint.h" #ifdef CAIRO_HAS_QUARTZ_SURFACE #include typedef struct cairo_quartz_surface { cairo_surface_t base; CGContextRef cgContext; CGAffineTransform cgContextBaseCTM; void *imageData; cairo_surface_t *imageSurfaceEquiv; cairo_rectangle_int_t extents; /* These are stored while drawing operations are in place, set up * by quartz_setup_source() and quartz_finish_source() */ CGAffineTransform sourceTransform; CGImageRef sourceImage; cairo_surface_t *sourceImageSurface; CGRect sourceImageRect; CGShadingRef sourceShading; CGPatternRef sourcePattern; CGInterpolationQuality oldInterpolationQuality; } cairo_quartz_surface_t; typedef struct cairo_quartz_image_surface { cairo_surface_t base; cairo_rectangle_int_t extents; CGImageRef image; cairo_image_surface_t *imageSurface; } cairo_quartz_image_surface_t; cairo_bool_t _cairo_quartz_verify_surface_size(int width, int height); CGImageRef _cairo_quartz_create_cgimage (cairo_format_t format, unsigned int width, unsigned int height, unsigned int stride, void *data, cairo_bool_t interpolate, CGColorSpaceRef colorSpaceOverride, CGDataProviderReleaseDataCallback releaseCallback, void *releaseInfo); CGFontRef _cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont); #endif /* CAIRO_HAS_QUARTZ_SURFACE */ #if CAIRO_HAS_CGFONT_FONT CGFontRef _cairo_cgfont_scaled_font_get_cg_font_ref (cairo_scaled_font_t *sfont); #endif /* CAIRO_HAS_CGFONT_FONT */ #endif /* CAIRO_QUARTZ_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-pattern.c0000664000175000017500000020503512225470167015331 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 David Reveman * Copyright © 2005 Red Hat, Inc. * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of David * Reveman not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. David Reveman makes no representations about the * suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Authors: David Reveman * Keith Packard * Carl Worth */ #include "cairoint.h" const cairo_solid_pattern_t _cairo_pattern_nil = { { CAIRO_PATTERN_TYPE_SOLID, /* type */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ CAIRO_STATUS_NO_MEMORY, /* status */ { 0, 0, 0, NULL }, /* user_data */ { 1., 0., 0., 1., 0., 0., }, /* matrix */ CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT }, /* extend */ }; static const cairo_solid_pattern_t _cairo_pattern_nil_null_pointer = { { CAIRO_PATTERN_TYPE_SOLID, /* type */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ CAIRO_STATUS_NULL_POINTER, /* status */ { 0, 0, 0, NULL }, /* user_data */ { 1., 0., 0., 1., 0., 0., }, /* matrix */ CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT }, /* extend */ }; const cairo_solid_pattern_t cairo_pattern_none = { { CAIRO_PATTERN_TYPE_SOLID, /* type */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ CAIRO_STATUS_SUCCESS, /* status */ { 0, 0, 0, NULL }, /* user_data */ { 1., 0., 0., 1., 0., 0., }, /* matrix */ CAIRO_FILTER_DEFAULT, /* filter */ CAIRO_EXTEND_GRADIENT_DEFAULT }, /* extend */ }; /** * _cairo_pattern_set_error: * @pattern: a pattern * @status: a status value indicating an error, (eg. not * CAIRO_STATUS_SUCCESS) * * Atomically sets pattern->status to @status and calls _cairo_error; * * All assignments of an error status to pattern->status should happen * through _cairo_pattern_set_error(). Note that due to the nature of * the atomic operation, it is not safe to call this function on the nil * objects. * * The purpose of this function is to allow the user to set a * breakpoint in _cairo_error() to generate a stack trace for when the * user causes cairo to detect an error. **/ static cairo_status_t _cairo_pattern_set_error (cairo_pattern_t *pattern, cairo_status_t status) { /* Don't overwrite an existing error. This preserves the first * error, which is the most significant. */ _cairo_status_set_error (&pattern->status, status); return _cairo_error (status); } static void _cairo_pattern_init (cairo_pattern_t *pattern, cairo_pattern_type_t type) { pattern->type = type; CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 1); pattern->status = CAIRO_STATUS_SUCCESS; _cairo_user_data_array_init (&pattern->user_data); if (type == CAIRO_PATTERN_TYPE_SURFACE) pattern->extend = CAIRO_EXTEND_SURFACE_DEFAULT; else pattern->extend = CAIRO_EXTEND_GRADIENT_DEFAULT; pattern->filter = CAIRO_FILTER_DEFAULT; cairo_matrix_init_identity (&pattern->matrix); } static cairo_status_t _cairo_gradient_pattern_init_copy (cairo_gradient_pattern_t *pattern, const cairo_gradient_pattern_t *other) { if (other->base.type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *dst = (cairo_linear_pattern_t *) pattern; cairo_linear_pattern_t *src = (cairo_linear_pattern_t *) other; *dst = *src; } else { cairo_radial_pattern_t *dst = (cairo_radial_pattern_t *) pattern; cairo_radial_pattern_t *src = (cairo_radial_pattern_t *) other; *dst = *src; } if (other->stops == other->stops_embedded) pattern->stops = pattern->stops_embedded; else if (other->stops) { pattern->stops = _cairo_malloc_ab (other->stops_size, sizeof (cairo_gradient_stop_t)); if (pattern->stops == NULL) { pattern->stops_size = 0; pattern->n_stops = 0; return _cairo_pattern_set_error (&pattern->base, CAIRO_STATUS_NO_MEMORY); } memcpy (pattern->stops, other->stops, other->n_stops * sizeof (cairo_gradient_stop_t)); } return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_pattern_init_copy (cairo_pattern_t *pattern, const cairo_pattern_t *other) { if (other->status) return _cairo_pattern_set_error (pattern, other->status); switch (other->type) { case CAIRO_PATTERN_TYPE_SOLID: { cairo_solid_pattern_t *dst = (cairo_solid_pattern_t *) pattern; cairo_solid_pattern_t *src = (cairo_solid_pattern_t *) other; *dst = *src; } break; case CAIRO_PATTERN_TYPE_SURFACE: { cairo_surface_pattern_t *dst = (cairo_surface_pattern_t *) pattern; cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) other; *dst = *src; cairo_surface_reference (dst->surface); } break; case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: { cairo_gradient_pattern_t *dst = (cairo_gradient_pattern_t *) pattern; cairo_gradient_pattern_t *src = (cairo_gradient_pattern_t *) other; cairo_status_t status; status = _cairo_gradient_pattern_init_copy (dst, src); if (status) return status; } break; } /* The reference count and user_data array are unique to the copy. */ CAIRO_REFERENCE_COUNT_INIT (&pattern->ref_count, 1); _cairo_user_data_array_init (&pattern->user_data); return CAIRO_STATUS_SUCCESS; } void _cairo_pattern_fini (cairo_pattern_t *pattern) { _cairo_user_data_array_fini (&pattern->user_data); switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: break; case CAIRO_PATTERN_TYPE_SURFACE: { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; cairo_surface_destroy (surface_pattern->surface); } break; case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: { cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; if (gradient->stops && gradient->stops != gradient->stops_embedded) free (gradient->stops); } break; } } cairo_status_t _cairo_pattern_create_copy (cairo_pattern_t **pattern, const cairo_pattern_t *other) { cairo_status_t status; if (other->status) return other->status; switch (other->type) { case CAIRO_PATTERN_TYPE_SOLID: *pattern = malloc (sizeof (cairo_solid_pattern_t)); break; case CAIRO_PATTERN_TYPE_SURFACE: *pattern = malloc (sizeof (cairo_surface_pattern_t)); break; case CAIRO_PATTERN_TYPE_LINEAR: *pattern = malloc (sizeof (cairo_linear_pattern_t)); break; case CAIRO_PATTERN_TYPE_RADIAL: *pattern = malloc (sizeof (cairo_radial_pattern_t)); break; } if (*pattern == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_pattern_init_copy (*pattern, other); if (status) { free (*pattern); return status; } return CAIRO_STATUS_SUCCESS; } void _cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, const cairo_color_t *color, cairo_content_t content) { _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SOLID); pattern->color = *color; pattern->content = content; } void _cairo_pattern_init_for_surface (cairo_surface_pattern_t *pattern, cairo_surface_t *surface) { if (surface->status) { /* Force to solid to simplify the pattern_fini process. */ _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SOLID); _cairo_pattern_set_error (&pattern->base, surface->status); return; } _cairo_pattern_init (&pattern->base, CAIRO_PATTERN_TYPE_SURFACE); pattern->surface = cairo_surface_reference (surface); } static void _cairo_pattern_init_gradient (cairo_gradient_pattern_t *pattern, cairo_pattern_type_t type) { _cairo_pattern_init (&pattern->base, type); pattern->n_stops = 0; pattern->stops_size = 0; pattern->stops = NULL; } void _cairo_pattern_init_linear (cairo_linear_pattern_t *pattern, double x0, double y0, double x1, double y1) { _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_LINEAR); pattern->p1.x = _cairo_fixed_from_double (x0); pattern->p1.y = _cairo_fixed_from_double (y0); pattern->p2.x = _cairo_fixed_from_double (x1); pattern->p2.y = _cairo_fixed_from_double (y1); } void _cairo_pattern_init_radial (cairo_radial_pattern_t *pattern, double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) { _cairo_pattern_init_gradient (&pattern->base, CAIRO_PATTERN_TYPE_RADIAL); pattern->c1.x = _cairo_fixed_from_double (cx0); pattern->c1.y = _cairo_fixed_from_double (cy0); pattern->r1 = _cairo_fixed_from_double (fabs (radius0)); pattern->c2.x = _cairo_fixed_from_double (cx1); pattern->c2.y = _cairo_fixed_from_double (cy1); pattern->r2 = _cairo_fixed_from_double (fabs (radius1)); } /* We use a small freed pattern cache here, because we don't want to * constantly reallocate simple colors. */ #define MAX_PATTERN_CACHE_SIZE 4 static struct { cairo_solid_pattern_t *patterns[MAX_PATTERN_CACHE_SIZE]; int size; } solid_pattern_cache; cairo_pattern_t * _cairo_pattern_create_solid (const cairo_color_t *color, cairo_content_t content) { cairo_solid_pattern_t *pattern = NULL; CAIRO_MUTEX_LOCK (_cairo_pattern_solid_pattern_cache_lock); if (solid_pattern_cache.size) { int i = --solid_pattern_cache.size % ARRAY_LENGTH (solid_pattern_cache.patterns); pattern = solid_pattern_cache.patterns[i]; solid_pattern_cache.patterns[i] = NULL; } CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_pattern_cache_lock); if (pattern == NULL) { /* None cached, need to create a new pattern. */ pattern = malloc (sizeof (cairo_solid_pattern_t)); } if (pattern == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); pattern = (cairo_solid_pattern_t *) &_cairo_pattern_nil; } else _cairo_pattern_init_solid (pattern, color, content); return &pattern->base; } static void _cairo_pattern_reset_solid_pattern_cache (void) { int i; CAIRO_MUTEX_LOCK (_cairo_pattern_solid_pattern_cache_lock); for (i = 0; i < MIN (ARRAY_LENGTH (solid_pattern_cache.patterns), solid_pattern_cache.size); i++) { free (solid_pattern_cache.patterns[i]); solid_pattern_cache.patterns[i] = NULL; } solid_pattern_cache.size = 0; CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_pattern_cache_lock); } static const cairo_pattern_t * _cairo_pattern_create_in_error (cairo_status_t status) { cairo_pattern_t *pattern; if (status == CAIRO_STATUS_NO_MEMORY) return (cairo_pattern_t *)&_cairo_pattern_nil.base; CAIRO_MUTEX_INITIALIZE (); pattern = _cairo_pattern_create_solid (_cairo_stock_color (CAIRO_STOCK_BLACK), CAIRO_CONTENT_COLOR); if (pattern->status == CAIRO_STATUS_SUCCESS) status = _cairo_pattern_set_error (pattern, status); return pattern; } /** * cairo_pattern_create_rgb: * @red: red component of the color * @green: green component of the color * @blue: blue component of the color * * Creates a new #cairo_pattern_t corresponding to an opaque color. The * color components are floating point numbers in the range 0 to 1. * If the values passed in are outside that range, they will be * clamped. * * Return value: the newly created #cairo_pattern_t if successful, or * an error pattern in case of no memory. The caller owns the * returned object and should call cairo_pattern_destroy() when * finished with it. * * This function will always return a valid pointer, but if an error * occurred the pattern status will be set to an error. To inspect * the status of a pattern use cairo_pattern_status(). **/ cairo_pattern_t * cairo_pattern_create_rgb (double red, double green, double blue) { cairo_color_t color; _cairo_restrict_value (&red, 0.0, 1.0); _cairo_restrict_value (&green, 0.0, 1.0); _cairo_restrict_value (&blue, 0.0, 1.0); _cairo_color_init_rgb (&color, red, green, blue); CAIRO_MUTEX_INITIALIZE (); return _cairo_pattern_create_solid (&color, CAIRO_CONTENT_COLOR); } slim_hidden_def (cairo_pattern_create_rgb); /** * cairo_pattern_create_rgba: * @red: red component of the color * @green: green component of the color * @blue: blue component of the color * @alpha: alpha component of the color * * Creates a new #cairo_pattern_t corresponding to a translucent color. * The color components are floating point numbers in the range 0 to * 1. If the values passed in are outside that range, they will be * clamped. * * Return value: the newly created #cairo_pattern_t if successful, or * an error pattern in case of no memory. The caller owns the * returned object and should call cairo_pattern_destroy() when * finished with it. * * This function will always return a valid pointer, but if an error * occurred the pattern status will be set to an error. To inspect * the status of a pattern use cairo_pattern_status(). **/ cairo_pattern_t * cairo_pattern_create_rgba (double red, double green, double blue, double alpha) { cairo_color_t color; _cairo_restrict_value (&red, 0.0, 1.0); _cairo_restrict_value (&green, 0.0, 1.0); _cairo_restrict_value (&blue, 0.0, 1.0); _cairo_restrict_value (&alpha, 0.0, 1.0); _cairo_color_init_rgba (&color, red, green, blue, alpha); CAIRO_MUTEX_INITIALIZE (); return _cairo_pattern_create_solid (&color, CAIRO_CONTENT_COLOR_ALPHA); } slim_hidden_def (cairo_pattern_create_rgba); /** * cairo_pattern_create_for_surface: * @surface: the surface * * Create a new #cairo_pattern_t for the given surface. * * Return value: the newly created #cairo_pattern_t if successful, or * an error pattern in case of no memory. The caller owns the * returned object and should call cairo_pattern_destroy() when * finished with it. * * This function will always return a valid pointer, but if an error * occurred the pattern status will be set to an error. To inspect * the status of a pattern use cairo_pattern_status(). **/ cairo_pattern_t * cairo_pattern_create_for_surface (cairo_surface_t *surface) { cairo_surface_pattern_t *pattern; if (surface == NULL) { _cairo_error_throw (CAIRO_STATUS_NULL_POINTER); return (cairo_pattern_t*) &_cairo_pattern_nil_null_pointer; } if (surface->status) return (cairo_pattern_t*) _cairo_pattern_create_in_error (surface->status); pattern = malloc (sizeof (cairo_surface_pattern_t)); if (pattern == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_pattern_t *)&_cairo_pattern_nil.base; } CAIRO_MUTEX_INITIALIZE (); _cairo_pattern_init_for_surface (pattern, surface); return &pattern->base; } slim_hidden_def (cairo_pattern_create_for_surface); /** * cairo_pattern_create_linear: * @x0: x coordinate of the start point * @y0: y coordinate of the start point * @x1: x coordinate of the end point * @y1: y coordinate of the end point * * Create a new linear gradient #cairo_pattern_t along the line defined * by (x0, y0) and (x1, y1). Before using the gradient pattern, a * number of color stops should be defined using * cairo_pattern_add_color_stop_rgb() or * cairo_pattern_add_color_stop_rgba(). * * Note: The coordinates here are in pattern space. For a new pattern, * pattern space is identical to user space, but the relationship * between the spaces can be changed with cairo_pattern_set_matrix(). * * Return value: the newly created #cairo_pattern_t if successful, or * an error pattern in case of no memory. The caller owns the * returned object and should call cairo_pattern_destroy() when * finished with it. * * This function will always return a valid pointer, but if an error * occurred the pattern status will be set to an error. To inspect * the status of a pattern use cairo_pattern_status(). **/ cairo_pattern_t * cairo_pattern_create_linear (double x0, double y0, double x1, double y1) { cairo_linear_pattern_t *pattern; pattern = malloc (sizeof (cairo_linear_pattern_t)); if (pattern == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_pattern_t *) &_cairo_pattern_nil.base; } CAIRO_MUTEX_INITIALIZE (); _cairo_pattern_init_linear (pattern, x0, y0, x1, y1); return &pattern->base.base; } /** * cairo_pattern_create_radial: * @cx0: x coordinate for the center of the start circle * @cy0: y coordinate for the center of the start circle * @radius0: radius of the start circle * @cx1: x coordinate for the center of the end circle * @cy1: y coordinate for the center of the end circle * @radius1: radius of the end circle * * Creates a new radial gradient #cairo_pattern_t between the two * circles defined by (cx0, cy0, radius0) and (cx1, cy1, radius1). Before using the * gradient pattern, a number of color stops should be defined using * cairo_pattern_add_color_stop_rgb() or * cairo_pattern_add_color_stop_rgba(). * * Note: The coordinates here are in pattern space. For a new pattern, * pattern space is identical to user space, but the relationship * between the spaces can be changed with cairo_pattern_set_matrix(). * * Return value: the newly created #cairo_pattern_t if successful, or * an error pattern in case of no memory. The caller owns the * returned object and should call cairo_pattern_destroy() when * finished with it. * * This function will always return a valid pointer, but if an error * occurred the pattern status will be set to an error. To inspect * the status of a pattern use cairo_pattern_status(). **/ cairo_pattern_t * cairo_pattern_create_radial (double cx0, double cy0, double radius0, double cx1, double cy1, double radius1) { cairo_radial_pattern_t *pattern; pattern = malloc (sizeof (cairo_radial_pattern_t)); if (pattern == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_pattern_t *) &_cairo_pattern_nil.base; } CAIRO_MUTEX_INITIALIZE (); _cairo_pattern_init_radial (pattern, cx0, cy0, radius0, cx1, cy1, radius1); return &pattern->base.base; } /** * cairo_pattern_reference: * @pattern: a #cairo_pattern_t * * Increases the reference count on @pattern by one. This prevents * @pattern from being destroyed until a matching call to * cairo_pattern_destroy() is made. * * The number of references to a #cairo_pattern_t can be get using * cairo_pattern_get_reference_count(). * * Return value: the referenced #cairo_pattern_t. **/ cairo_pattern_t * cairo_pattern_reference (cairo_pattern_t *pattern) { if (pattern == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) return pattern; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&pattern->ref_count)); _cairo_reference_count_inc (&pattern->ref_count); return pattern; } slim_hidden_def (cairo_pattern_reference); /** * cairo_pattern_get_type: * @pattern: a #cairo_pattern_t * * This function returns the type a pattern. * See #cairo_pattern_type_t for available types. * * Return value: The type of @pattern. * * Since: 1.2 **/ cairo_pattern_type_t cairo_pattern_get_type (cairo_pattern_t *pattern) { return pattern->type; } slim_hidden_def (cairo_pattern_get_type); /** * cairo_pattern_status: * @pattern: a #cairo_pattern_t * * Checks whether an error has previously occurred for this * pattern. * * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_STATUS_NO_MEMORY, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. **/ cairo_status_t cairo_pattern_status (cairo_pattern_t *pattern) { return pattern->status; } slim_hidden_def (cairo_pattern_status); /** * cairo_pattern_destroy: * @pattern: a #cairo_pattern_t * * Decreases the reference count on @pattern by one. If the result is * zero, then @pattern and all associated resources are freed. See * cairo_pattern_reference(). **/ void cairo_pattern_destroy (cairo_pattern_t *pattern) { if (pattern == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&pattern->ref_count)); if (! _cairo_reference_count_dec_and_test (&pattern->ref_count)) return; _cairo_pattern_fini (pattern); /* maintain a small cache of freed patterns */ if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) { int i; CAIRO_MUTEX_LOCK (_cairo_pattern_solid_pattern_cache_lock); i = solid_pattern_cache.size++ % ARRAY_LENGTH (solid_pattern_cache.patterns); /* swap an old pattern for this 'cache-hot' pattern */ if (solid_pattern_cache.patterns[i]) free (solid_pattern_cache.patterns[i]); solid_pattern_cache.patterns[i] = (cairo_solid_pattern_t *) pattern; CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_pattern_cache_lock); } else { free (pattern); } } slim_hidden_def (cairo_pattern_destroy); /** * cairo_pattern_get_reference_count: * @pattern: a #cairo_pattern_t * * Returns the current reference count of @pattern. * * Return value: the current reference count of @pattern. If the * object is a nil object, 0 will be returned. * * Since: 1.4 **/ unsigned int cairo_pattern_get_reference_count (cairo_pattern_t *pattern) { if (pattern == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) return 0; return CAIRO_REFERENCE_COUNT_GET_VALUE (&pattern->ref_count); } /** * cairo_pattern_get_user_data: * @pattern: a #cairo_pattern_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Return user data previously attached to @pattern using the * specified key. If no user data has been attached with the given * key this function returns %NULL. * * Return value: the user data previously attached or %NULL. * * Since: 1.4 **/ void * cairo_pattern_get_user_data (cairo_pattern_t *pattern, const cairo_user_data_key_t *key) { return _cairo_user_data_array_get_data (&pattern->user_data, key); } /** * cairo_pattern_set_user_data: * @pattern: a #cairo_pattern_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach to the #cairo_pattern_t * @destroy: a #cairo_destroy_func_t which will be called when the * #cairo_t is destroyed or when new user data is attached using the * same key. * * Attach user data to @pattern. To remove user data from a surface, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. * * Since: 1.4 **/ cairo_status_t cairo_pattern_set_user_data (cairo_pattern_t *pattern, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&pattern->ref_count)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _cairo_user_data_array_set_data (&pattern->user_data, key, user_data, destroy); } /* make room for at least one more color stop */ static cairo_status_t _cairo_pattern_gradient_grow (cairo_gradient_pattern_t *pattern) { cairo_gradient_stop_t *new_stops; int old_size = pattern->stops_size; int embedded_size = ARRAY_LENGTH (pattern->stops_embedded); int new_size = 2 * MAX (old_size, 4); /* we have a local buffer at pattern->stops_embedded. try to fulfill the request * from there. */ if (old_size < embedded_size) { pattern->stops = pattern->stops_embedded; pattern->stops_size = embedded_size; return CAIRO_STATUS_SUCCESS; } assert (pattern->n_stops <= pattern->stops_size); if (pattern->stops == pattern->stops_embedded) { new_stops = _cairo_malloc_ab (new_size, sizeof (cairo_gradient_stop_t)); if (new_stops) memcpy (new_stops, pattern->stops, old_size * sizeof (cairo_gradient_stop_t)); } else { new_stops = _cairo_realloc_ab (pattern->stops, new_size, sizeof (cairo_gradient_stop_t)); } if (new_stops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); pattern->stops = new_stops; pattern->stops_size = new_size; return CAIRO_STATUS_SUCCESS; } static void _cairo_pattern_add_color_stop (cairo_gradient_pattern_t *pattern, double offset, double red, double green, double blue, double alpha) { cairo_gradient_stop_t *stops; unsigned int i; if (pattern->n_stops >= pattern->stops_size) { cairo_status_t status = _cairo_pattern_gradient_grow (pattern); if (status) { status = _cairo_pattern_set_error (&pattern->base, status); return; } } stops = pattern->stops; for (i = 0; i < pattern->n_stops; i++) { if (offset < stops[i].offset) { memmove (&stops[i + 1], &stops[i], sizeof (cairo_gradient_stop_t) * (pattern->n_stops - i)); break; } } stops[i].offset = offset; stops[i].color.red = red; stops[i].color.green = green; stops[i].color.blue = blue; stops[i].color.alpha = alpha; stops[i].color.red_short = _cairo_color_double_to_short (red); stops[i].color.green_short = _cairo_color_double_to_short (green); stops[i].color.blue_short = _cairo_color_double_to_short (blue); stops[i].color.alpha_short = _cairo_color_double_to_short (alpha); pattern->n_stops++; } /** * cairo_pattern_add_color_stop_rgb: * @pattern: a #cairo_pattern_t * @offset: an offset in the range [0.0 .. 1.0] * @red: red component of color * @green: green component of color * @blue: blue component of color * * Adds an opaque color stop to a gradient pattern. The offset * specifies the location along the gradient's control vector. For * example, a linear gradient's control vector is from (x0,y0) to * (x1,y1) while a radial gradient's control vector is from any point * on the start circle to the corresponding point on the end circle. * * The color is specified in the same way as in cairo_set_source_rgb(). * * If two (or more) stops are specified with identical offset values, * they will be sorted according to the order in which the stops are * added, (stops added earlier will compare less than stops added * later). This can be useful for reliably making sharp color * transitions instead of the typical blend. * * * Note: If the pattern is not a gradient pattern, (eg. a linear or * radial pattern), then the pattern will be put into an error status * with a status of %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. **/ void cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, double offset, double red, double green, double blue) { if (pattern->status) return; if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && pattern->type != CAIRO_PATTERN_TYPE_RADIAL) { _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); return; } _cairo_restrict_value (&offset, 0.0, 1.0); _cairo_restrict_value (&red, 0.0, 1.0); _cairo_restrict_value (&green, 0.0, 1.0); _cairo_restrict_value (&blue, 0.0, 1.0); _cairo_pattern_add_color_stop ((cairo_gradient_pattern_t *) pattern, offset, red, green, blue, 1.0); } /** * cairo_pattern_add_color_stop_rgba: * @pattern: a #cairo_pattern_t * @offset: an offset in the range [0.0 .. 1.0] * @red: red component of color * @green: green component of color * @blue: blue component of color * @alpha: alpha component of color * * Adds a translucent color stop to a gradient pattern. The offset * specifies the location along the gradient's control vector. For * example, a linear gradient's control vector is from (x0,y0) to * (x1,y1) while a radial gradient's control vector is from any point * on the start circle to the corresponding point on the end circle. * * The color is specified in the same way as in cairo_set_source_rgba(). * * If two (or more) stops are specified with identical offset values, * they will be sorted according to the order in which the stops are * added, (stops added earlier will compare less than stops added * later). This can be useful for reliably making sharp color * transitions instead of the typical blend. * * Note: If the pattern is not a gradient pattern, (eg. a linear or * radial pattern), then the pattern will be put into an error status * with a status of %CAIRO_STATUS_PATTERN_TYPE_MISMATCH. */ void cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, double offset, double red, double green, double blue, double alpha) { if (pattern->status) return; if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && pattern->type != CAIRO_PATTERN_TYPE_RADIAL) { _cairo_pattern_set_error (pattern, CAIRO_STATUS_PATTERN_TYPE_MISMATCH); return; } _cairo_restrict_value (&offset, 0.0, 1.0); _cairo_restrict_value (&red, 0.0, 1.0); _cairo_restrict_value (&green, 0.0, 1.0); _cairo_restrict_value (&blue, 0.0, 1.0); _cairo_restrict_value (&alpha, 0.0, 1.0); _cairo_pattern_add_color_stop ((cairo_gradient_pattern_t *) pattern, offset, red, green, blue, alpha); } /** * cairo_pattern_set_matrix: * @pattern: a #cairo_pattern_t * @matrix: a #cairo_matrix_t * * Sets the pattern's transformation matrix to @matrix. This matrix is * a transformation from user space to pattern space. * * When a pattern is first created it always has the identity matrix * for its transformation matrix, which means that pattern space is * initially identical to user space. * * Important: Please note that the direction of this transformation * matrix is from user space to pattern space. This means that if you * imagine the flow from a pattern to user space (and on to device * space), then coordinates in that flow will be transformed by the * inverse of the pattern matrix. * * For example, if you want to make a pattern appear twice as large as * it does by default the correct code to use is: * * * cairo_matrix_init_scale (&matrix, 0.5, 0.5); * cairo_pattern_set_matrix (pattern, &matrix); * * * Meanwhile, using values of 2.0 rather than 0.5 in the code above * would cause the pattern to appear at half of its default size. * * Also, please note the discussion of the user-space locking * semantics of cairo_set_source(). **/ void cairo_pattern_set_matrix (cairo_pattern_t *pattern, const cairo_matrix_t *matrix) { cairo_matrix_t inverse; cairo_status_t status; if (pattern->status) return; pattern->matrix = *matrix; inverse = *matrix; status = cairo_matrix_invert (&inverse); if (status) status = _cairo_pattern_set_error (pattern, status); } slim_hidden_def (cairo_pattern_set_matrix); /** * cairo_pattern_get_matrix: * @pattern: a #cairo_pattern_t * @matrix: return value for the matrix * * Stores the pattern's transformation matrix into @matrix. **/ void cairo_pattern_get_matrix (cairo_pattern_t *pattern, cairo_matrix_t *matrix) { *matrix = pattern->matrix; } /** * cairo_pattern_set_filter: * @pattern: a #cairo_pattern_t * @filter: a #cairo_filter_t describing the filter to use for resizing * the pattern * * Sets the filter to be used for resizing when using this pattern. * See #cairo_filter_t for details on each filter. * * * Note that you might want to control filtering even when you do not * have an explicit #cairo_pattern_t object, (for example when using * cairo_set_source_surface()). In these cases, it is convenient to * use cairo_get_source() to get access to the pattern that cairo * creates implicitly. For example: * * * cairo_set_source_surface (cr, image, x, y); * cairo_pattern_set_filter (cairo_get_source (cr), %CAIRO_FILTER_NEAREST); * **/ void cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter) { if (pattern->status) return; pattern->filter = filter; } /** * cairo_pattern_get_filter: * @pattern: a #cairo_pattern_t * * Gets the current filter for a pattern. See #cairo_filter_t * for details on each filter. * * Return value: the current filter used for resizing the pattern. **/ cairo_filter_t cairo_pattern_get_filter (cairo_pattern_t *pattern) { return pattern->filter; } /** * cairo_pattern_set_extend: * @pattern: a #cairo_pattern_t * @extend: a #cairo_extend_t describing how the area outside of the * pattern will be drawn * * Sets the mode to be used for drawing outside the area of a pattern. * See #cairo_extend_t for details on the semantics of each extend * strategy. * * The default extend mode is %CAIRO_EXTEND_NONE for surface patterns * and %CAIRO_EXTEND_PAD for gradient patterns. **/ void cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend) { if (pattern->status) return; pattern->extend = extend; } /** * cairo_pattern_get_extend: * @pattern: a #cairo_pattern_t * * Gets the current extend mode for a pattern. See #cairo_extend_t * for details on the semantics of each extend strategy. * * Return value: the current extend strategy used for drawing the * pattern. **/ cairo_extend_t cairo_pattern_get_extend (cairo_pattern_t *pattern) { return pattern->extend; } slim_hidden_def (cairo_pattern_get_extend); void _cairo_pattern_transform (cairo_pattern_t *pattern, const cairo_matrix_t *ctm_inverse) { if (pattern->status) return; cairo_matrix_multiply (&pattern->matrix, ctm_inverse, &pattern->matrix); } static void _cairo_linear_pattern_classify (cairo_linear_pattern_t *pattern, double offset_x, double offset_y, int width, int height, cairo_bool_t *is_horizontal, cairo_bool_t *is_vertical) { cairo_point_double_t point0, point1; double a, b, c, d, tx, ty; double scale, start, dx, dy; cairo_fixed_t factors[3]; int i; /* To classify a pattern as horizontal or vertical, we first * compute the (fixed point) factors at the corners of the * pattern. We actually only need 3/4 corners, so we skip the * fourth. */ point0.x = _cairo_fixed_to_double (pattern->p1.x); point0.y = _cairo_fixed_to_double (pattern->p1.y); point1.x = _cairo_fixed_to_double (pattern->p2.x); point1.y = _cairo_fixed_to_double (pattern->p2.y); _cairo_matrix_get_affine (&pattern->base.base.matrix, &a, &b, &c, &d, &tx, &ty); dx = point1.x - point0.x; dy = point1.y - point0.y; scale = dx * dx + dy * dy; scale = (scale) ? 1.0 / scale : 1.0; start = dx * point0.x + dy * point0.y; for (i = 0; i < 3; i++) { double qx_device = (i % 2) * (width - 1) + offset_x; double qy_device = (i / 2) * (height - 1) + offset_y; /* transform fragment into pattern space */ double qx = a * qx_device + c * qy_device + tx; double qy = b * qx_device + d * qy_device + ty; factors[i] = _cairo_fixed_from_double (((dx * qx + dy * qy) - start) * scale); } /* We consider a pattern to be vertical if the fixed point factor * at the two upper corners is the same. We could accept a small * change, but determining what change is acceptable would require * sorting the stops in the pattern and looking at the differences. * * Horizontal works the same way with the two left corners. */ *is_vertical = factors[1] == factors[0]; *is_horizontal = factors[2] == factors[0]; } static cairo_int_status_t _cairo_pattern_acquire_surface_for_gradient (cairo_gradient_pattern_t *pattern, cairo_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_surface_t **out, cairo_surface_attributes_t *attr) { cairo_image_surface_t *image; pixman_image_t *pixman_image; pixman_transform_t pixman_transform; cairo_status_t status; cairo_bool_t repeat = FALSE; pixman_gradient_stop_t pixman_stops_static[2]; pixman_gradient_stop_t *pixman_stops = pixman_stops_static; unsigned int i; if (pattern->n_stops > ARRAY_LENGTH(pixman_stops_static)) { pixman_stops = _cairo_malloc_ab (pattern->n_stops, sizeof(pixman_gradient_stop_t)); if (pixman_stops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < pattern->n_stops; i++) { pixman_stops[i].x = _cairo_fixed_16_16_from_double (pattern->stops[i].offset); pixman_stops[i].color.red = pattern->stops[i].color.red_short; pixman_stops[i].color.green = pattern->stops[i].color.green_short; pixman_stops[i].color.blue = pattern->stops[i].color.blue_short; pixman_stops[i].color.alpha = pattern->stops[i].color.alpha_short; } if (pattern->base.type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t *) pattern; pixman_point_fixed_t p1, p2; p1.x = _cairo_fixed_to_16_16 (linear->p1.x); p1.y = _cairo_fixed_to_16_16 (linear->p1.y); p2.x = _cairo_fixed_to_16_16 (linear->p2.x); p2.y = _cairo_fixed_to_16_16 (linear->p2.y); pixman_image = pixman_image_create_linear_gradient (&p1, &p2, pixman_stops, pattern->n_stops); } else { cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) pattern; pixman_point_fixed_t c1, c2; pixman_fixed_t r1, r2; c1.x = _cairo_fixed_to_16_16 (radial->c1.x); c1.y = _cairo_fixed_to_16_16 (radial->c1.y); r1 = _cairo_fixed_to_16_16 (radial->r1); c2.x = _cairo_fixed_to_16_16 (radial->c2.x); c2.y = _cairo_fixed_to_16_16 (radial->c2.y); r2 = _cairo_fixed_to_16_16 (radial->r2); pixman_image = pixman_image_create_radial_gradient (&c1, &c2, r1, r2, pixman_stops, pattern->n_stops); } if (pixman_stops != pixman_stops_static) free (pixman_stops); if (pixman_image == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (_cairo_surface_is_image (dst)) { image = (cairo_image_surface_t *) _cairo_image_surface_create_for_pixman_image (pixman_image, PIXMAN_a8r8g8b8); if (image->base.status) { pixman_image_unref (pixman_image); return image->base.status; } attr->x_offset = attr->y_offset = 0; attr->matrix = pattern->base.matrix; attr->extend = pattern->base.extend; attr->filter = CAIRO_FILTER_NEAREST; attr->acquired = FALSE; *out = &image->base; return CAIRO_STATUS_SUCCESS; } if (pattern->base.type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_bool_t is_horizontal; cairo_bool_t is_vertical; _cairo_linear_pattern_classify ((cairo_linear_pattern_t *)pattern, x, y, width, height, &is_horizontal, &is_vertical); if (is_horizontal) { height = 1; repeat = TRUE; } /* width-1 repeating patterns are quite slow with scan-line based * compositing code, so we use a wider strip and spend some extra * expense in computing the gradient. It's possible that for narrow * gradients we'd be better off using a 2 or 4 pixel strip; the * wider the gradient, the more it's worth spending extra time * computing a sample. */ if (is_vertical && width > 8) { width = 8; repeat = TRUE; } } image = (cairo_image_surface_t *) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); if (image->base.status) { pixman_image_unref (pixman_image); return image->base.status; } pixman_image_set_filter (pixman_image, PIXMAN_FILTER_BILINEAR, NULL, 0); _cairo_matrix_to_pixman_matrix (&pattern->base.matrix, &pixman_transform); if (!pixman_image_set_transform (pixman_image, &pixman_transform)) { cairo_surface_destroy (&image->base); pixman_image_unref (pixman_image); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } switch (pattern->base.extend) { case CAIRO_EXTEND_NONE: pixman_image_set_repeat (pixman_image, PIXMAN_REPEAT_NONE); break; case CAIRO_EXTEND_REPEAT: pixman_image_set_repeat (pixman_image, PIXMAN_REPEAT_NORMAL); break; case CAIRO_EXTEND_REFLECT: pixman_image_set_repeat (pixman_image, PIXMAN_REPEAT_REFLECT); break; case CAIRO_EXTEND_PAD: pixman_image_set_repeat (pixman_image, PIXMAN_REPEAT_PAD); break; } pixman_image_composite (PIXMAN_OP_SRC, pixman_image, NULL, image->pixman_image, x, y, 0, 0, 0, 0, width, height); pixman_image_unref (pixman_image); status = _cairo_surface_clone_similar (dst, &image->base, 0, 0, width, height, out); cairo_surface_destroy (&image->base); attr->x_offset = -x; attr->y_offset = -y; cairo_matrix_init_identity (&attr->matrix); attr->extend = repeat ? CAIRO_EXTEND_REPEAT : CAIRO_EXTEND_NONE; attr->filter = CAIRO_FILTER_NEAREST; attr->acquired = FALSE; return status; } /* We maintain a small cache here, because we don't want to constantly * recreate surfaces for simple solid colors. */ #define MAX_SURFACE_CACHE_SIZE 16 static struct { struct _cairo_pattern_solid_surface_cache{ cairo_color_t color; cairo_surface_t *surface; } cache[MAX_SURFACE_CACHE_SIZE]; int size; } solid_surface_cache; static cairo_bool_t _cairo_pattern_solid_surface_matches ( const struct _cairo_pattern_solid_surface_cache *cache, const cairo_solid_pattern_t *pattern, cairo_surface_t *dst) { if (CAIRO_REFERENCE_COUNT_GET_VALUE (&cache->surface->ref_count) != 1) return FALSE; if (! _cairo_color_equal (&cache->color, &pattern->color)) return FALSE; if (! _cairo_surface_is_similar (cache->surface, dst, pattern->content)) return FALSE; return TRUE; } static cairo_int_status_t _cairo_pattern_acquire_surface_for_solid (cairo_solid_pattern_t *pattern, cairo_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_surface_t **out, cairo_surface_attributes_t *attribs) { static int i; cairo_surface_t *surface; cairo_status_t status; CAIRO_MUTEX_LOCK (_cairo_pattern_solid_surface_cache_lock); /* Check cache first */ if (i < solid_surface_cache.size && _cairo_pattern_solid_surface_matches (&solid_surface_cache.cache[i], pattern, dst)) { if (! _cairo_surface_reset (solid_surface_cache.cache[i].surface)) goto DONE; } for (i = 0 ; i < solid_surface_cache.size; i++) { if (_cairo_pattern_solid_surface_matches (&solid_surface_cache.cache[i], pattern, dst)) { if (! _cairo_surface_reset (solid_surface_cache.cache[i].surface)) goto DONE; } } /* Not cached, need to create new */ surface = _cairo_surface_create_similar_solid (dst, pattern->content, 1, 1, &pattern->color, &pattern->base); if (surface->status) { status = surface->status; goto UNLOCK; } if (! _cairo_surface_is_similar (surface, dst, pattern->content)) { /* in the rare event of a substitute surface being returned (e.g. * malloc failure) don't cache the fallback surface */ *out = surface; goto NOCACHE; } /* Cache new */ if (solid_surface_cache.size < MAX_SURFACE_CACHE_SIZE) { solid_surface_cache.size++; } else { i = rand () % MAX_SURFACE_CACHE_SIZE; /* Evict old */ cairo_surface_destroy (solid_surface_cache.cache[i].surface); } solid_surface_cache.cache[i].color = pattern->color; solid_surface_cache.cache[i].surface = surface; DONE: *out = cairo_surface_reference (solid_surface_cache.cache[i].surface); NOCACHE: attribs->x_offset = attribs->y_offset = 0; cairo_matrix_init_identity (&attribs->matrix); attribs->extend = CAIRO_EXTEND_REPEAT; attribs->filter = CAIRO_FILTER_NEAREST; attribs->acquired = FALSE; status = CAIRO_STATUS_SUCCESS; UNLOCK: CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_surface_cache_lock); return status; } static void _cairo_pattern_reset_solid_surface_cache (void) { int i; CAIRO_MUTEX_LOCK (_cairo_pattern_solid_surface_cache_lock); for (i = 0; i < solid_surface_cache.size; i++) cairo_surface_destroy (solid_surface_cache.cache[i].surface); solid_surface_cache.size = 0; CAIRO_MUTEX_UNLOCK (_cairo_pattern_solid_surface_cache_lock); } /** * _cairo_pattern_is_opaque_solid * * Convenience function to determine whether a pattern is an opaque * (alpha==1.0) solid color pattern. This is done by testing whether * the pattern's alpha value when converted to a byte is 255, so if a * backend actually supported deep alpha channels this function might * not do the right thing. * * Return value: %TRUE if the pattern is an opaque, solid color. **/ cairo_bool_t _cairo_pattern_is_opaque_solid (const cairo_pattern_t *pattern) { cairo_solid_pattern_t *solid; if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) return FALSE; solid = (cairo_solid_pattern_t *) pattern; return CAIRO_COLOR_IS_OPAQUE (&solid->color); } static cairo_bool_t _gradient_is_opaque (const cairo_gradient_pattern_t *gradient) { unsigned int i; for (i = 0; i < gradient->n_stops; i++) if (! CAIRO_COLOR_IS_OPAQUE (&gradient->stops[i].color)) return FALSE; return TRUE; } /** * _cairo_pattern_is_opaque * * Convenience function to determine whether a pattern is an opaque * pattern (of any type). The same caveats that apply to * _cairo_pattern_is_opaque_solid apply here as well. * * Return value: %TRUE if the pattern is a opaque. **/ cairo_bool_t _cairo_pattern_is_opaque (const cairo_pattern_t *abstract_pattern) { const cairo_pattern_union_t *pattern; pattern = (cairo_pattern_union_t *) abstract_pattern; switch (pattern->base.type) { case CAIRO_PATTERN_TYPE_SOLID: return _cairo_pattern_is_opaque_solid (abstract_pattern); case CAIRO_PATTERN_TYPE_SURFACE: return cairo_surface_get_content (pattern->surface.surface) == CAIRO_CONTENT_COLOR; case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: return _gradient_is_opaque (&pattern->gradient.base); } ASSERT_NOT_REACHED; return FALSE; } static cairo_int_status_t _cairo_pattern_acquire_surface_for_surface (cairo_surface_pattern_t *pattern, cairo_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_surface_t **out, cairo_surface_attributes_t *attr) { cairo_int_status_t status; int tx, ty; attr->acquired = FALSE; attr->extend = pattern->base.extend; attr->filter = pattern->base.filter; if (_cairo_matrix_is_integer_translation (&pattern->base.matrix, &tx, &ty)) { cairo_matrix_init_identity (&attr->matrix); attr->x_offset = tx; attr->y_offset = ty; attr->filter = CAIRO_FILTER_NEAREST; } else { attr->matrix = pattern->base.matrix; attr->x_offset = attr->y_offset = 0; tx = 0; ty = 0; } /* XXX: Hack: * * The way we currently support CAIRO_EXTEND_REFLECT is to create * an image twice bigger on each side, and create a pattern of four * images such that the new image, when repeated, has the same effect * of reflecting the original pattern. * * This is because the reflect support in pixman is broken and we * pass repeat instead of reflect to pixman. See * _cairo_image_surface_set_attributes() for that. */ if (attr->extend == CAIRO_EXTEND_REFLECT) { cairo_t *cr; int w,h; cairo_rectangle_int_t extents; status = _cairo_surface_get_extents (pattern->surface, &extents); if (status) return status; attr->extend = CAIRO_EXTEND_REPEAT; /* TODO: Instead of rendering pattern->surface four times to * out, we should first copy pattern->surface to surface similar * to dst and then copy that four times to out. This may cause * an extra copy in the case of image destination, but for X servers, * this will send pattern->surface just once over the wire instead * of current four. */ x = extents.x; y = extents.y; w = 2 * extents.width; h = 2 * extents.height; *out = cairo_surface_create_similar (dst, dst->content, w, h); status = cairo_surface_status (*out); if (status) { cairo_surface_destroy (*out); *out = NULL; return status; } (*out)->device_transform = pattern->surface->device_transform; (*out)->device_transform_inverse = pattern->surface->device_transform_inverse; cr = cairo_create (*out); cairo_set_source_surface (cr, pattern->surface, -x, -y); cairo_paint (cr); cairo_scale (cr, -1, +1); cairo_set_source_surface (cr, pattern->surface, x-w, -y); cairo_paint (cr); cairo_scale (cr, +1, -1); cairo_set_source_surface (cr, pattern->surface, x-w, y-h); cairo_paint (cr); cairo_scale (cr, -1, +1); cairo_set_source_surface (cr, pattern->surface, -x, y-h); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); if (status) { cairo_surface_destroy (*out); *out = NULL; } return status; } if (_cairo_surface_is_image (dst)) { cairo_image_surface_t *image; status = _cairo_surface_acquire_source_image (pattern->surface, &image, &attr->extra); if (status) return status; *out = &image->base; attr->acquired = TRUE; } else { cairo_rectangle_int_t extents; status = _cairo_surface_get_extents (pattern->surface, &extents); if (status) return status; /* If we're repeating, we just play it safe and clone the entire surface. */ /* If requested width and height are -1, clone the entire surface. * This is relied on in the svg backend. */ if (attr->extend == CAIRO_EXTEND_REPEAT || (width == (unsigned int) -1 && height == (unsigned int) -1)) { x = extents.x; y = extents.y; width = extents.width; height = extents.height; } else { /* Otherwise, we first transform the rectangle to the * coordinate space of the source surface so that we can * clone only that portion of the surface that will be * read. */ if (! _cairo_matrix_is_identity (&attr->matrix)) { double x1 = x; double y1 = y; double x2 = x + width; double y2 = y + height; cairo_bool_t is_tight; _cairo_matrix_transform_bounding_box (&attr->matrix, &x1, &y1, &x2, &y2, &is_tight); /* The transform_bounding_box call may have resulted * in a region larger than the surface, but we never * want to clone more than the surface itself, (we * know we're not repeating at this point due to the * above. * * XXX: The one padding here is to account for filter * radius. It's a workaround right now, until we get a * proper fix. (see bug #10508) */ x = MAX (0, floor (x1) - 1); y = MAX (0, floor (y1) - 1); width = MIN (extents.width, ceil (x2) + 1) - x; height = MIN (extents.height, ceil (y2) + 1) - y; } x += tx; y += ty; } status = _cairo_surface_clone_similar (dst, pattern->surface, x, y, width, height, out); } return status; } /** * _cairo_pattern_acquire_surface: * @pattern: a #cairo_pattern_t * @dst: destination surface * @x: X coordinate in source corresponding to left side of destination area * @y: Y coordinate in source corresponding to top side of destination area * @width: width of destination area * @height: height of destination area * @surface_out: location to store a pointer to a surface * @attributes: surface attributes that destination backend should apply to * the returned surface * * A convenience function to obtain a surface to use as the source for * drawing on @dst. * * Return value: %CAIRO_STATUS_SUCCESS if a surface was stored in @surface_out. **/ cairo_int_status_t _cairo_pattern_acquire_surface (cairo_pattern_t *pattern, cairo_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_surface_t **surface_out, cairo_surface_attributes_t *attributes) { cairo_status_t status; if (pattern->status) { *surface_out = NULL; attributes->acquired = FALSE; return pattern->status; } switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: { cairo_solid_pattern_t *src = (cairo_solid_pattern_t *) pattern; status = _cairo_pattern_acquire_surface_for_solid (src, dst, x, y, width, height, surface_out, attributes); } break; case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: { cairo_gradient_pattern_t *src = (cairo_gradient_pattern_t *) pattern; /* fast path for gradients with less than 2 color stops */ if (src->n_stops < 2) { cairo_solid_pattern_t solid; if (src->n_stops) { cairo_color_t color; _cairo_color_init_rgba (&color, src->stops->color.red, src->stops->color.green, src->stops->color.blue, src->stops->color.alpha); _cairo_pattern_init_solid (&solid, &color, CAIRO_COLOR_IS_OPAQUE (&color) ? CAIRO_CONTENT_COLOR : CAIRO_CONTENT_COLOR_ALPHA); } else { const cairo_color_t *color; color = _cairo_stock_color (CAIRO_STOCK_TRANSPARENT); _cairo_pattern_init_solid (&solid, color, CAIRO_CONTENT_ALPHA); } status = _cairo_pattern_acquire_surface_for_solid (&solid, dst, x, y, width, height, surface_out, attributes); } else { status = _cairo_pattern_acquire_surface_for_gradient (src, dst, x, y, width, height, surface_out, attributes); } } break; case CAIRO_PATTERN_TYPE_SURFACE: { cairo_surface_pattern_t *src = (cairo_surface_pattern_t *) pattern; status = _cairo_pattern_acquire_surface_for_surface (src, dst, x, y, width, height, surface_out, attributes); } break; default: ASSERT_NOT_REACHED; status = _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); } return status; } /** * _cairo_pattern_release_surface: * @pattern: a #cairo_pattern_t * @surface: a surface obtained by _cairo_pattern_acquire_surface * @attributes: attributes obtained by _cairo_pattern_acquire_surface * * Releases resources obtained by _cairo_pattern_acquire_surface. **/ void _cairo_pattern_release_surface (cairo_pattern_t *pattern, cairo_surface_t *surface, cairo_surface_attributes_t *attributes) { if (attributes->acquired) { cairo_surface_pattern_t *surface_pattern; assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE); surface_pattern = (cairo_surface_pattern_t *) pattern; _cairo_surface_release_source_image (surface_pattern->surface, (cairo_image_surface_t *) surface, attributes->extra); } else { cairo_surface_destroy (surface); } } cairo_int_status_t _cairo_pattern_acquire_surfaces (cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, unsigned int width, unsigned int height, cairo_surface_t **src_out, cairo_surface_t **mask_out, cairo_surface_attributes_t *src_attributes, cairo_surface_attributes_t *mask_attributes) { cairo_int_status_t status; cairo_pattern_union_t src_tmp, mask_tmp; if (src->status) return src->status; if (mask && mask->status) return mask->status; /* If src and mask are both solid, then the mask alpha can be * combined into src and mask can be ignored. */ /* XXX: This optimization assumes that there is no color * information in mask, so this will need to change when we * support RENDER-style 4-channel masks. */ if (src->type == CAIRO_PATTERN_TYPE_SOLID && mask && mask->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_color_t combined; cairo_solid_pattern_t *src_solid = (cairo_solid_pattern_t *) src; cairo_solid_pattern_t *mask_solid = (cairo_solid_pattern_t *) mask; combined = src_solid->color; _cairo_color_multiply_alpha (&combined, mask_solid->color.alpha); _cairo_pattern_init_solid (&src_tmp.solid, &combined, CAIRO_COLOR_IS_OPAQUE (&combined) ? CAIRO_CONTENT_COLOR : CAIRO_CONTENT_COLOR_ALPHA); mask = NULL; } else { status = _cairo_pattern_init_copy (&src_tmp.base, src); if (status) return status; } status = _cairo_pattern_acquire_surface (&src_tmp.base, dst, src_x, src_y, width, height, src_out, src_attributes); if (status) { _cairo_pattern_fini (&src_tmp.base); return status; } if (mask == NULL) { _cairo_pattern_fini (&src_tmp.base); *mask_out = NULL; return CAIRO_STATUS_SUCCESS; } status = _cairo_pattern_init_copy (&mask_tmp.base, mask); if (status) goto CLEANUP_SOURCE; status = _cairo_pattern_acquire_surface (&mask_tmp.base, dst, mask_x, mask_y, width, height, mask_out, mask_attributes); _cairo_pattern_fini (&mask_tmp.base); CLEANUP_SOURCE: if (status) _cairo_pattern_release_surface (&src_tmp.base, *src_out, src_attributes); _cairo_pattern_fini (&src_tmp.base); return status; } /** * _cairo_pattern_get_extents: * * Return the "target-space" extents of @pattern in @extents. * * For unbounded patterns, the @extents will be initialized with * "infinite" extents, (minimum and maximum fixed-point values). * * XXX: Currently, bounded gradient patterns will also return * "infinite" extents, though it would be possible to optimize these * with a little more work. **/ cairo_status_t _cairo_pattern_get_extents (cairo_pattern_t *pattern, cairo_rectangle_int_t *extents) { if (pattern->extend == CAIRO_EXTEND_NONE && pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_status_t status; cairo_rectangle_int_t surface_extents; cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; cairo_surface_t *surface = surface_pattern->surface; cairo_matrix_t imatrix; double x1, y1, x2, y2; status = _cairo_surface_get_extents (surface, &surface_extents); if (status) return status; x1 = surface_extents.x; y1 = surface_extents.y; x2 = x1 + surface_extents.width; y2 = y1 + surface_extents.height; imatrix = pattern->matrix; status = cairo_matrix_invert (&imatrix); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); _cairo_matrix_transform_bounding_box (&imatrix, &x1, &y1, &x2, &y2, NULL); x1 = floor (x1); if (x1 < 0) x1 = 0; y1 = floor (y1); if (y1 < 0) y1 = 0; x2 = ceil (x2); if (x2 > CAIRO_RECT_INT_MAX) x2 = CAIRO_RECT_INT_MAX; y2 = ceil (y2); if (y2 > CAIRO_RECT_INT_MAX) y2 = CAIRO_RECT_INT_MAX; extents->x = x1; extents->width = x2 - x1; extents->y = y1; extents->height = y2 - y1; return CAIRO_STATUS_SUCCESS; } /* XXX: We could optimize gradients with pattern->extend of NONE * here in some cases, (eg. radial gradients and 1 axis of * horizontal/vertical linear gradients). */ /* XXX: because extents are represented as x, y, w, h we can't * actually have a rectangle that covers our entire valid * coordinate space, since we'd need width/height to be 2*INT_MAX. */ extents->x = 0; extents->y = 0; extents->width = CAIRO_RECT_INT_MAX; extents->height = CAIRO_RECT_INT_MAX; return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_rgba * @pattern: a #cairo_pattern_t * @red: return value for red component of color, or %NULL * @green: return value for green component of color, or %NULL * @blue: return value for blue component of color, or %NULL * @alpha: return value for alpha component of color, or %NULL * * Gets the solid color for a solid color pattern. * * Return value: %CAIRO_STATUS_SUCCESS, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a solid * color pattern. * * Since: 1.4 **/ cairo_status_t cairo_pattern_get_rgba (cairo_pattern_t *pattern, double *red, double *green, double *blue, double *alpha) { cairo_solid_pattern_t *solid = (cairo_solid_pattern_t*) pattern; double r0, g0, b0, a0; if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); _cairo_color_get_rgba (&solid->color, &r0, &g0, &b0, &a0); if (red) *red = r0; if (green) *green = g0; if (blue) *blue = b0; if (alpha) *alpha = a0; return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_surface * @pattern: a #cairo_pattern_t * @surface: return value for surface of pattern, or %NULL * * Gets the surface of a surface pattern. The reference returned in * @surface is owned by the pattern; the caller should call * cairo_surface_reference() if the surface is to be retained. * * Return value: %CAIRO_STATUS_SUCCESS, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if the pattern is not a surface * pattern. * * Since: 1.4 **/ cairo_status_t cairo_pattern_get_surface (cairo_pattern_t *pattern, cairo_surface_t **surface) { cairo_surface_pattern_t *spat = (cairo_surface_pattern_t*) pattern; if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (surface) *surface = spat->surface; return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_color_stop_rgba * @pattern: a #cairo_pattern_t * @index: index of the stop to return data for * @offset: return value for the offset of the stop, or %NULL * @red: return value for red component of color, or %NULL * @green: return value for green component of color, or %NULL * @blue: return value for blue component of color, or %NULL * @alpha: return value for alpha component of color, or %NULL * * Gets the color and offset information at the given @index for a * gradient pattern. Values of @index are 0 to 1 less than the number * returned by cairo_pattern_get_color_stop_count(). * * Return value: %CAIRO_STATUS_SUCCESS, or %CAIRO_STATUS_INVALID_INDEX * if @index is not valid for the given pattern. If the pattern is * not a gradient pattern, %CAIRO_STATUS_PATTERN_TYPE_MISMATCH is * returned. * * Since: 1.4 **/ cairo_status_t cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, int index, double *offset, double *red, double *green, double *blue, double *alpha) { cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t*) pattern; if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && pattern->type != CAIRO_PATTERN_TYPE_RADIAL) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (index < 0 || (unsigned int) index >= gradient->n_stops) return _cairo_error (CAIRO_STATUS_INVALID_INDEX); if (offset) *offset = gradient->stops[index].offset; if (red) *red = gradient->stops[index].color.red; if (green) *green = gradient->stops[index].color.green; if (blue) *blue = gradient->stops[index].color.blue; if (alpha) *alpha = gradient->stops[index].color.alpha; return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_color_stop_count * @pattern: a #cairo_pattern_t * @count: return value for the number of color stops, or %NULL * * Gets the number of color stops specified in the given gradient * pattern. * * Return value: %CAIRO_STATUS_SUCCESS, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a gradient * pattern. * * Since: 1.4 */ cairo_status_t cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern, int *count) { cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t*) pattern; if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR && pattern->type != CAIRO_PATTERN_TYPE_RADIAL) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (count) *count = gradient->n_stops; return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_linear_points * @pattern: a #cairo_pattern_t * @x0: return value for the x coordinate of the first point, or %NULL * @y0: return value for the y coordinate of the first point, or %NULL * @x1: return value for the x coordinate of the second point, or %NULL * @y1: return value for the y coordinate of the second point, or %NULL * * Gets the gradient endpoints for a linear gradient. * * Return value: %CAIRO_STATUS_SUCCESS, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a linear * gradient pattern. * * Since: 1.4 **/ cairo_status_t cairo_pattern_get_linear_points (cairo_pattern_t *pattern, double *x0, double *y0, double *x1, double *y1) { cairo_linear_pattern_t *linear = (cairo_linear_pattern_t*) pattern; if (pattern->type != CAIRO_PATTERN_TYPE_LINEAR) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (x0) *x0 = _cairo_fixed_to_double (linear->p1.x); if (y0) *y0 = _cairo_fixed_to_double (linear->p1.y); if (x1) *x1 = _cairo_fixed_to_double (linear->p2.x); if (y1) *y1 = _cairo_fixed_to_double (linear->p2.y); return CAIRO_STATUS_SUCCESS; } /** * cairo_pattern_get_radial_circles * @pattern: a #cairo_pattern_t * @x0: return value for the x coordinate of the center of the first circle, or %NULL * @y0: return value for the y coordinate of the center of the first circle, or %NULL * @r0: return value for the radius of the first circle, or %NULL * @x1: return value for the x coordinate of the center of the second circle, or %NULL * @y1: return value for the y coordinate of the center of the second circle, or %NULL * @r1: return value for the radius of the second circle, or %NULL * * Gets the gradient endpoint circles for a radial gradient, each * specified as a center coordinate and a radius. * * Return value: %CAIRO_STATUS_SUCCESS, or * %CAIRO_STATUS_PATTERN_TYPE_MISMATCH if @pattern is not a radial * gradient pattern. * * Since: 1.4 **/ cairo_status_t cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, double *x0, double *y0, double *r0, double *x1, double *y1, double *r1) { cairo_radial_pattern_t *radial = (cairo_radial_pattern_t*) pattern; if (pattern->type != CAIRO_PATTERN_TYPE_RADIAL) return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); if (x0) *x0 = _cairo_fixed_to_double (radial->c1.x); if (y0) *y0 = _cairo_fixed_to_double (radial->c1.y); if (r0) *r0 = _cairo_fixed_to_double (radial->r1); if (x1) *x1 = _cairo_fixed_to_double (radial->c2.x); if (y1) *y1 = _cairo_fixed_to_double (radial->c2.y); if (r1) *r1 = _cairo_fixed_to_double (radial->r2); return CAIRO_STATUS_SUCCESS; } void _cairo_pattern_reset_static_data (void) { _cairo_pattern_reset_solid_pattern_cache (); _cairo_pattern_reset_solid_surface_cache (); } libgdiplus-2.11/cairo/src/cairo-region.c0000664000175000017500000001351612225470167015140 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Owen Taylor * Vladimir Vukicevic */ #include "cairoint.h" void _cairo_region_init (cairo_region_t *region) { pixman_region_init (®ion->rgn); } void _cairo_region_init_rect (cairo_region_t *region, cairo_rectangle_int_t *rect) { pixman_region_init_rect (®ion->rgn, rect->x, rect->y, rect->width, rect->height); } cairo_int_status_t _cairo_region_init_boxes (cairo_region_t *region, cairo_box_int_t *boxes, int count) { pixman_box16_t stack_pboxes[CAIRO_STACK_ARRAY_LENGTH (pixman_box16_t)]; pixman_box16_t *pboxes = stack_pboxes; cairo_int_status_t status = CAIRO_STATUS_SUCCESS; int i; if (count > ARRAY_LENGTH(stack_pboxes)) { pboxes = _cairo_malloc_ab (count, sizeof(pixman_box16_t)); if (pboxes == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < count; i++) { pboxes[i].x1 = boxes[i].p1.x; pboxes[i].y1 = boxes[i].p1.y; pboxes[i].x2 = boxes[i].p2.x; pboxes[i].y2 = boxes[i].p2.y; } if (!pixman_region_init_rects (®ion->rgn, pboxes, count)) status = _cairo_error (CAIRO_STATUS_NO_MEMORY); if (pboxes != stack_pboxes) free (pboxes); return status; } void _cairo_region_fini (cairo_region_t *region) { pixman_region_fini (®ion->rgn); } cairo_int_status_t _cairo_region_copy (cairo_region_t *dst, cairo_region_t *src) { if (!pixman_region_copy (&dst->rgn, &src->rgn)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } int _cairo_region_num_boxes (cairo_region_t *region) { return pixman_region_n_rects (®ion->rgn); } cairo_int_status_t _cairo_region_get_boxes (cairo_region_t *region, int *num_boxes, cairo_box_int_t **boxes) { int nboxes; pixman_box16_t *pboxes; cairo_box_int_t *cboxes; int i; pboxes = pixman_region_rectangles (®ion->rgn, &nboxes); if (nboxes == 0) { *num_boxes = 0; *boxes = NULL; return CAIRO_STATUS_SUCCESS; } cboxes = _cairo_malloc_ab (nboxes, sizeof(cairo_box_int_t)); if (cboxes == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < nboxes; i++) { cboxes[i].p1.x = pboxes[i].x1; cboxes[i].p1.y = pboxes[i].y1; cboxes[i].p2.x = pboxes[i].x2; cboxes[i].p2.y = pboxes[i].y2; } *num_boxes = nboxes; *boxes = cboxes; return CAIRO_STATUS_SUCCESS; } void _cairo_region_boxes_fini (cairo_region_t *region, cairo_box_int_t *boxes) { free (boxes); } /** * _cairo_region_get_extents: * @region: a #cairo_region_t * @rect: rectangle into which to store the extents * * Gets the bounding box of a region as a #cairo_rectangle_int_t **/ void _cairo_region_get_extents (cairo_region_t *region, cairo_rectangle_int_t *extents) { pixman_box16_t *pextents = pixman_region_extents (®ion->rgn); extents->x = pextents->x1; extents->y = pextents->y1; extents->width = pextents->x2 - pextents->x1; extents->height = pextents->y2 - pextents->y1; } cairo_int_status_t _cairo_region_subtract (cairo_region_t *dst, cairo_region_t *a, cairo_region_t *b) { if (!pixman_region_subtract (&dst->rgn, &a->rgn, &b->rgn)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } cairo_int_status_t _cairo_region_intersect (cairo_region_t *dst, cairo_region_t *a, cairo_region_t *b) { if (!pixman_region_intersect (&dst->rgn, &a->rgn, &b->rgn)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } cairo_int_status_t _cairo_region_union_rect (cairo_region_t *dst, cairo_region_t *src, cairo_rectangle_int_t *rect) { if (!pixman_region_union_rect (&dst->rgn, &src->rgn, rect->x, rect->y, rect->width, rect->height)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } cairo_bool_t _cairo_region_not_empty (cairo_region_t *region) { return (cairo_bool_t) pixman_region_not_empty (®ion->rgn); } void _cairo_region_translate (cairo_region_t *region, int x, int y) { pixman_region_translate (®ion->rgn, x, y); } pixman_region_overlap_t _cairo_region_contains_rectangle (cairo_region_t *region, cairo_rectangle_int_t *rect) { pixman_box16_t pbox; pbox.x1 = rect->x; pbox.y1 = rect->y; pbox.x2 = rect->x + rect->width; pbox.y2 = rect->y + rect->height; return pixman_region_contains_rectangle (®ion->rgn, &pbox); } libgdiplus-2.11/cairo/src/cairo-surface-fallback.c0000664000175000017500000011253412225470167017042 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-surface-fallback-private.h" #include "cairo-clip-private.h" typedef struct { cairo_surface_t *dst; cairo_rectangle_int_t extents; cairo_image_surface_t *image; cairo_rectangle_int_t image_rect; void *image_extra; } fallback_state_t; /** * _fallback_init: * * Acquire destination image surface needed for an image-based * fallback. * * Return value: %CAIRO_INT_STATUS_NOTHING_TO_DO if the extents are not * visible, %CAIRO_STATUS_SUCCESS if some portion is visible and all * went well, or some error status otherwise. **/ static cairo_int_status_t _fallback_init (fallback_state_t *state, cairo_surface_t *dst, int x, int y, int width, int height) { cairo_status_t status; state->extents.x = x; state->extents.y = y; state->extents.width = width; state->extents.height = height; state->dst = dst; status = _cairo_surface_acquire_dest_image (dst, &state->extents, &state->image, &state->image_rect, &state->image_extra); if (status) return status; /* XXX: This NULL value tucked away in state->image is a rather * ugly interface. Cleaner would be to push the * CAIRO_INT_STATUS_NOTHING_TO_DO value down into * _cairo_surface_acquire_dest_image and its backend * counterparts. */ if (state->image == NULL) return CAIRO_INT_STATUS_NOTHING_TO_DO; return CAIRO_STATUS_SUCCESS; } static void _fallback_fini (fallback_state_t *state) { _cairo_surface_release_dest_image (state->dst, &state->extents, state->image, &state->image_rect, state->image_extra); } typedef cairo_status_t (*cairo_draw_func_t) (void *closure, cairo_operator_t op, cairo_pattern_t *src, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents); static cairo_status_t _create_composite_mask_pattern (cairo_surface_pattern_t *mask_pattern, cairo_clip_t *clip, cairo_draw_func_t draw_func, void *draw_closure, cairo_surface_t *dst, const cairo_rectangle_int_t *extents) { cairo_surface_t *mask; cairo_status_t status; mask = cairo_surface_create_similar (dst, CAIRO_CONTENT_ALPHA, extents->width, extents->height); if (mask->status) return mask->status; status = (*draw_func) (draw_closure, CAIRO_OPERATOR_ADD, NULL, mask, extents->x, extents->y, extents); if (status) goto CLEANUP_SURFACE; if (clip && clip->surface) status = _cairo_clip_combine_to_surface (clip, CAIRO_OPERATOR_IN, mask, extents->x, extents->y, extents); if (status) goto CLEANUP_SURFACE; _cairo_pattern_init_for_surface (mask_pattern, mask); CLEANUP_SURFACE: cairo_surface_destroy (mask); return status; } /* Handles compositing with a clip surface when the operator allows * us to combine the clip with the mask */ static cairo_status_t _clip_and_composite_with_mask (cairo_clip_t *clip, cairo_operator_t op, cairo_pattern_t *src, cairo_draw_func_t draw_func, void *draw_closure, cairo_surface_t *dst, const cairo_rectangle_int_t *extents) { cairo_surface_pattern_t mask_pattern; cairo_status_t status; status = _create_composite_mask_pattern (&mask_pattern, clip, draw_func, draw_closure, dst, extents); if (status) return status; status = _cairo_surface_composite (op, src, &mask_pattern.base, dst, extents->x, extents->y, 0, 0, extents->x, extents->y, extents->width, extents->height); _cairo_pattern_fini (&mask_pattern.base); return status; } /* Handles compositing with a clip surface when we have to do the operation * in two pieces and combine them together. */ static cairo_status_t _clip_and_composite_combine (cairo_clip_t *clip, cairo_operator_t op, cairo_pattern_t *src, cairo_draw_func_t draw_func, void *draw_closure, cairo_surface_t *dst, const cairo_rectangle_int_t *extents) { cairo_surface_t *intermediate; cairo_surface_pattern_t dst_pattern; cairo_surface_pattern_t intermediate_pattern; cairo_status_t status; /* We'd be better off here creating a surface identical in format * to dst, but we have no way of getting that information. * A CAIRO_CONTENT_CLONE or something might be useful. * cairo_surface_create_similar() also unnecessarily clears the surface. */ intermediate = cairo_surface_create_similar (dst, CAIRO_CONTENT_COLOR_ALPHA, extents->width, extents->height); if (intermediate->status) return intermediate->status; /* Initialize the intermediate surface from the destination surface */ _cairo_pattern_init_for_surface (&dst_pattern, dst); status = _cairo_surface_composite (CAIRO_OPERATOR_SOURCE, &dst_pattern.base, NULL, intermediate, extents->x, extents->y, 0, 0, 0, 0, extents->width, extents->height); _cairo_pattern_fini (&dst_pattern.base); if (status) goto CLEANUP_SURFACE; status = (*draw_func) (draw_closure, op, src, intermediate, extents->x, extents->y, extents); if (status) goto CLEANUP_SURFACE; /* Combine that with the clip */ status = _cairo_clip_combine_to_surface (clip, CAIRO_OPERATOR_DEST_IN, intermediate, extents->x, extents->y, extents); if (status) goto CLEANUP_SURFACE; /* Punch the clip out of the destination */ status = _cairo_clip_combine_to_surface (clip, CAIRO_OPERATOR_DEST_OUT, dst, 0, 0, extents); if (status) goto CLEANUP_SURFACE; /* Now add the two results together */ _cairo_pattern_init_for_surface (&intermediate_pattern, intermediate); status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, &intermediate_pattern.base, NULL, dst, 0, 0, 0, 0, extents->x, extents->y, extents->width, extents->height); _cairo_pattern_fini (&intermediate_pattern.base); CLEANUP_SURFACE: cairo_surface_destroy (intermediate); return status; } /* Handles compositing for %CAIRO_OPERATOR_SOURCE, which is special; it's * defined as (src IN mask IN clip) ADD (dst OUT (mask IN clip)) */ static cairo_status_t _clip_and_composite_source (cairo_clip_t *clip, cairo_pattern_t *src, cairo_draw_func_t draw_func, void *draw_closure, cairo_surface_t *dst, const cairo_rectangle_int_t *extents) { cairo_surface_pattern_t mask_pattern; cairo_status_t status; /* Create a surface that is mask IN clip */ status = _create_composite_mask_pattern (&mask_pattern, clip, draw_func, draw_closure, dst, extents); if (status) return status; /* Compute dest' = dest OUT (mask IN clip) */ status = _cairo_surface_composite (CAIRO_OPERATOR_DEST_OUT, &mask_pattern.base, NULL, dst, 0, 0, 0, 0, extents->x, extents->y, extents->width, extents->height); if (status) goto CLEANUP_MASK_PATTERN; /* Now compute (src IN (mask IN clip)) ADD dest' */ status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, src, &mask_pattern.base, dst, extents->x, extents->y, 0, 0, extents->x, extents->y, extents->width, extents->height); CLEANUP_MASK_PATTERN: _cairo_pattern_fini (&mask_pattern.base); return status; } static int _cairo_rectangle_empty (const cairo_rectangle_int_t *rect) { return rect->width == 0 || rect->height == 0; } /** * _clip_and_composite: * @clip: a #cairo_clip_t * @op: the operator to draw with * @src: source pattern * @draw_func: function that can be called to draw with the mask onto a surface. * @draw_closure: data to pass to @draw_func. * @dst: destination surface * @extents: rectangle holding a bounding box for the operation; this * rectangle will be used as the size for the temporary * surface. * * When there is a surface clip, we typically need to create an intermediate * surface. This function handles the logic of creating a temporary surface * drawing to it, then compositing the result onto the target surface. * * @draw_func is to called to draw the mask; it will be called no more * than once. * * Return value: %CAIRO_STATUS_SUCCESS if the drawing succeeded. **/ static cairo_status_t _clip_and_composite (cairo_clip_t *clip, cairo_operator_t op, cairo_pattern_t *src, cairo_draw_func_t draw_func, void *draw_closure, cairo_surface_t *dst, const cairo_rectangle_int_t *extents) { cairo_pattern_union_t solid_pattern; cairo_status_t status; if (_cairo_rectangle_empty (extents)) /* Nothing to do */ return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_CLEAR) { _cairo_pattern_init_solid (&solid_pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); src = &solid_pattern.base; op = CAIRO_OPERATOR_DEST_OUT; } if ((clip && clip->surface) || op == CAIRO_OPERATOR_SOURCE) { if (op == CAIRO_OPERATOR_SOURCE) status = _clip_and_composite_source (clip, src, draw_func, draw_closure, dst, extents); else if (_cairo_operator_bounded_by_mask (op)) status = _clip_and_composite_with_mask (clip, op, src, draw_func, draw_closure, dst, extents); else status = _clip_and_composite_combine (clip, op, src, draw_func, draw_closure, dst, extents); } else { status = (*draw_func) (draw_closure, op, src, dst, 0, 0, extents); } if (src == &solid_pattern.base) _cairo_pattern_fini (&solid_pattern.base); return status; } /* Composites a region representing a set of trapezoids. */ static cairo_status_t _composite_trap_region (cairo_clip_t *clip, cairo_pattern_t *src, cairo_operator_t op, cairo_surface_t *dst, cairo_region_t *trap_region, cairo_rectangle_int_t *extents) { cairo_status_t status; cairo_pattern_union_t solid_pattern; cairo_pattern_union_t mask; int num_rects = _cairo_region_num_boxes (trap_region); unsigned int clip_serial; cairo_surface_t *clip_surface = clip ? clip->surface : NULL; if (clip_surface && op == CAIRO_OPERATOR_CLEAR) { _cairo_pattern_init_solid (&solid_pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); src = &solid_pattern.base; op = CAIRO_OPERATOR_DEST_OUT; } if (num_rects == 0) return CAIRO_STATUS_SUCCESS; if (num_rects > 1) { if (_cairo_surface_get_clip_mode (dst) != CAIRO_CLIP_MODE_REGION) return CAIRO_INT_STATUS_UNSUPPORTED; clip_serial = _cairo_surface_allocate_clip_serial (dst); status = _cairo_surface_set_clip_region (dst, trap_region, clip_serial); if (status) return status; } if (clip_surface) _cairo_pattern_init_for_surface (&mask.surface, clip_surface); status = _cairo_surface_composite (op, src, clip_surface ? &mask.base : NULL, dst, extents->x, extents->y, extents->x - (clip_surface ? clip->surface_rect.x : 0), extents->y - (clip_surface ? clip->surface_rect.y : 0), extents->x, extents->y, extents->width, extents->height); /* Restore the original clip if we modified it temporarily. */ if (num_rects > 1) { cairo_status_t status2 = _cairo_surface_set_clip (dst, clip); if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (clip_surface) _cairo_pattern_fini (&mask.base); if (src == &solid_pattern.base) _cairo_pattern_fini (&solid_pattern.base); return status; } typedef struct { cairo_traps_t *traps; cairo_antialias_t antialias; } cairo_composite_traps_info_t; static cairo_status_t _composite_traps_draw_func (void *closure, cairo_operator_t op, cairo_pattern_t *src, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents) { cairo_composite_traps_info_t *info = closure; cairo_pattern_union_t pattern; cairo_status_t status; if (dst_x != 0 || dst_y != 0) _cairo_traps_translate (info->traps, - dst_x, - dst_y); _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); if (!src) src = &pattern.base; status = _cairo_surface_composite_trapezoids (op, src, dst, info->antialias, extents->x, extents->y, extents->x - dst_x, extents->y - dst_y, extents->width, extents->height, info->traps->traps, info->traps->num_traps); _cairo_pattern_fini (&pattern.base); return status; } /* Warning: This call modifies the coordinates of traps */ static cairo_status_t _clip_and_composite_trapezoids (cairo_pattern_t *src, cairo_operator_t op, cairo_surface_t *dst, cairo_traps_t *traps, cairo_clip_t *clip, cairo_antialias_t antialias) { cairo_status_t status; cairo_region_t trap_region; cairo_region_t clear_region; cairo_bool_t has_trap_region = FALSE; cairo_bool_t has_clear_region = FALSE; cairo_rectangle_int_t extents; cairo_composite_traps_info_t traps_info; if (traps->num_traps == 0) return CAIRO_STATUS_SUCCESS; status = _cairo_surface_get_extents (dst, &extents); if (status) return status; status = _cairo_traps_extract_region (traps, &trap_region); if (CAIRO_INT_STATUS_UNSUPPORTED == status) { has_trap_region = FALSE; } else if (status) { return status; } else { has_trap_region = TRUE; } if (_cairo_operator_bounded_by_mask (op)) { cairo_rectangle_int_t trap_extents; if (has_trap_region) { status = _cairo_clip_intersect_to_region (clip, &trap_region); if (status) goto out; _cairo_region_get_extents (&trap_region, &trap_extents); } else { cairo_box_t trap_box; _cairo_traps_extents (traps, &trap_box); _cairo_box_round_to_rectangle (&trap_box, &trap_extents); } _cairo_rectangle_intersect (&extents, &trap_extents); status = _cairo_clip_intersect_to_rectangle (clip, &extents); if (status) goto out; } else { cairo_surface_t *clip_surface = clip ? clip->surface : NULL; if (has_trap_region && !clip_surface) { /* If we optimize drawing with an unbounded operator to * _cairo_surface_fill_rectangles() or to drawing with a * clip region, then we have an additional region to clear. */ _cairo_region_init_rect (&clear_region, &extents); has_clear_region = TRUE; status = _cairo_clip_intersect_to_region (clip, &clear_region); if (status) goto out; _cairo_region_get_extents (&clear_region, &extents); status = _cairo_region_subtract (&clear_region, &clear_region, &trap_region); if (status) goto out; if (!_cairo_region_not_empty (&clear_region)) { _cairo_region_fini (&clear_region); has_clear_region = FALSE; } } else { status = _cairo_clip_intersect_to_rectangle (clip, &extents); } } if (status) goto out; if (has_trap_region) { cairo_surface_t *clip_surface = clip ? clip->surface : NULL; if ((src->type == CAIRO_PATTERN_TYPE_SOLID || op == CAIRO_OPERATOR_CLEAR) && !clip_surface) { const cairo_color_t *color; if (op == CAIRO_OPERATOR_CLEAR) { color = CAIRO_COLOR_TRANSPARENT; } else { color = &((cairo_solid_pattern_t *)src)->color; } /* Solid rectangles special case */ status = _cairo_surface_fill_region (dst, op, color, &trap_region); if (!status && has_clear_region) status = _cairo_surface_fill_region (dst, CAIRO_OPERATOR_CLEAR, CAIRO_COLOR_TRANSPARENT, &clear_region); goto out; } if ((_cairo_operator_bounded_by_mask (op) && op != CAIRO_OPERATOR_SOURCE) || !clip_surface) { /* For a simple rectangle, we can just use composite(), for more * rectangles, we have to set a clip region. The cost of rasterizing * trapezoids is pretty high for most backends currently, so it's * worthwhile even if a region is needed. * * If we have a clip surface, we set it as the mask; this only works * for bounded operators other than SOURCE; for unbounded operators, * clip and mask cannot be interchanged. For SOURCE, the operator * as implemented by the backends is different in it's handling * of the mask then what we want. * * CAIRO_INT_STATUS_UNSUPPORTED will be returned if the region has * more than rectangle and the destination doesn't support clip * regions. In that case, we fall through. */ status = _composite_trap_region (clip, src, op, dst, &trap_region, &extents); if (status != CAIRO_INT_STATUS_UNSUPPORTED) { if (!status && has_clear_region) status = _cairo_surface_fill_region (dst, CAIRO_OPERATOR_CLEAR, CAIRO_COLOR_TRANSPARENT, &clear_region); goto out; } } } traps_info.traps = traps; traps_info.antialias = antialias; status = _clip_and_composite (clip, op, src, _composite_traps_draw_func, &traps_info, dst, &extents); out: if (has_trap_region) _cairo_region_fini (&trap_region); if (has_clear_region) _cairo_region_fini (&clear_region); return status; } cairo_status_t _cairo_surface_fallback_paint (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_status_t status; cairo_rectangle_int_t extents; cairo_box_t box; cairo_traps_t traps; status = _cairo_surface_get_extents (surface, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents); if (status) return status; box.p1.x = _cairo_fixed_from_int (extents.x); box.p1.y = _cairo_fixed_from_int (extents.y); box.p2.x = _cairo_fixed_from_int (extents.x + extents.width); box.p2.y = _cairo_fixed_from_int (extents.y + extents.height); status = _cairo_traps_init_box (&traps, &box); if (status) return status; status = _clip_and_composite_trapezoids (source, op, surface, &traps, surface->clip, CAIRO_ANTIALIAS_NONE); _cairo_traps_fini (&traps); return status; } static cairo_status_t _cairo_surface_mask_draw_func (void *closure, cairo_operator_t op, cairo_pattern_t *src, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents) { cairo_pattern_t *mask = closure; if (src) return _cairo_surface_composite (op, src, mask, dst, extents->x, extents->y, extents->x, extents->y, extents->x - dst_x, extents->y - dst_y, extents->width, extents->height); else return _cairo_surface_composite (op, mask, NULL, dst, extents->x, extents->y, 0, 0, /* unused */ extents->x - dst_x, extents->y - dst_y, extents->width, extents->height); } cairo_status_t _cairo_surface_fallback_mask (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_status_t status; cairo_rectangle_int_t extents, source_extents, mask_extents; status = _cairo_surface_get_extents (surface, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } if (_cairo_operator_bounded_by_mask (op)) { status = _cairo_pattern_get_extents (mask, &mask_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &mask_extents); } status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents); if (status) return status; status = _clip_and_composite (surface->clip, op, source, _cairo_surface_mask_draw_func, mask, surface, &extents); return status; } cairo_status_t _cairo_surface_fallback_stroke (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_traps_t traps; cairo_box_t box; cairo_rectangle_int_t extents; status = _cairo_surface_get_extents (surface, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents); if (status) return status; box.p1.x = _cairo_fixed_from_int (extents.x); box.p1.y = _cairo_fixed_from_int (extents.y); box.p2.x = _cairo_fixed_from_int (extents.x + extents.width); box.p2.y = _cairo_fixed_from_int (extents.y + extents.height); _cairo_traps_init (&traps); _cairo_traps_limit (&traps, &box); status = _cairo_path_fixed_stroke_to_traps (path, stroke_style, ctm, ctm_inverse, tolerance, &traps); if (status) { _cairo_traps_fini (&traps); return status; } status = _clip_and_composite_trapezoids (source, op, surface, &traps, surface->clip, antialias); _cairo_traps_fini (&traps); return status; } cairo_status_t _cairo_surface_fallback_fill (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_traps_t traps; cairo_box_t box; cairo_rectangle_int_t extents; status = _cairo_surface_get_extents (surface, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents); if (status) return status; box.p1.x = _cairo_fixed_from_int (extents.x); box.p1.y = _cairo_fixed_from_int (extents.y); box.p2.x = _cairo_fixed_from_int (extents.x + extents.width); box.p2.y = _cairo_fixed_from_int (extents.y + extents.height); _cairo_traps_init (&traps); _cairo_traps_limit (&traps, &box); status = _cairo_path_fixed_fill_to_traps (path, fill_rule, tolerance, &traps); if (status) { _cairo_traps_fini (&traps); return status; } status = _clip_and_composite_trapezoids (source, op, surface, &traps, surface->clip, antialias); _cairo_traps_fini (&traps); return status; } typedef struct { cairo_scaled_font_t *font; cairo_glyph_t *glyphs; int num_glyphs; } cairo_show_glyphs_info_t; static cairo_status_t _cairo_surface_old_show_glyphs_draw_func (void *closure, cairo_operator_t op, cairo_pattern_t *src, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents) { cairo_show_glyphs_info_t *glyph_info = closure; cairo_pattern_union_t pattern; cairo_status_t status; /* Modifying the glyph array is fine because we know that this function * will be called only once, and we've already made a copy of the * glyphs in the wrapper. */ if (dst_x != 0 || dst_y != 0) { int i; for (i = 0; i < glyph_info->num_glyphs; ++i) { ((cairo_glyph_t *) glyph_info->glyphs)[i].x -= dst_x; ((cairo_glyph_t *) glyph_info->glyphs)[i].y -= dst_y; } } _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); if (!src) src = &pattern.base; status = _cairo_surface_old_show_glyphs (glyph_info->font, op, src, dst, extents->x, extents->y, extents->x - dst_x, extents->y - dst_y, extents->width, extents->height, glyph_info->glyphs, glyph_info->num_glyphs); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_scaled_font_show_glyphs (glyph_info->font, op, src, dst, extents->x, extents->y, extents->x - dst_x, extents->y - dst_y, extents->width, extents->height, glyph_info->glyphs, glyph_info->num_glyphs); if (src == &pattern.base) _cairo_pattern_fini (&pattern.base); return status; } cairo_status_t _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_status_t status; cairo_rectangle_int_t extents; cairo_show_glyphs_info_t glyph_info; status = _cairo_surface_get_extents (surface, &extents); if (status) return status; if (_cairo_operator_bounded_by_mask (op)) { cairo_rectangle_int_t glyph_extents; status = _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, &glyph_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &glyph_extents); } status = _cairo_clip_intersect_to_rectangle (surface->clip, &extents); if (status) return status; glyph_info.font = scaled_font; glyph_info.glyphs = glyphs; glyph_info.num_glyphs = num_glyphs; status = _clip_and_composite (surface->clip, op, source, _cairo_surface_old_show_glyphs_draw_func, &glyph_info, surface, &extents); return status; } cairo_surface_t * _cairo_surface_fallback_snapshot (cairo_surface_t *surface) { cairo_surface_t *snapshot; cairo_status_t status; cairo_pattern_union_t pattern; cairo_image_surface_t *image; void *image_extra; status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); if (status) return _cairo_surface_create_in_error (status); snapshot = cairo_image_surface_create (image->format, image->width, image->height); if (cairo_surface_status (snapshot)) { _cairo_surface_release_source_image (surface, image, image_extra); return snapshot; } _cairo_pattern_init_for_surface (&pattern.surface, &image->base); status = _cairo_surface_composite (CAIRO_OPERATOR_SOURCE, &pattern.base, NULL, snapshot, 0, 0, 0, 0, 0, 0, image->width, image->height); _cairo_pattern_fini (&pattern.base); _cairo_surface_release_source_image (surface, image, image_extra); if (status) { cairo_surface_destroy (snapshot); return _cairo_surface_create_in_error (status); } snapshot->device_transform = surface->device_transform; snapshot->device_transform_inverse = surface->device_transform_inverse; snapshot->is_snapshot = TRUE; return snapshot; } cairo_status_t _cairo_surface_fallback_composite (cairo_operator_t op, cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { fallback_state_t state; cairo_status_t status; status = _fallback_init (&state, dst, dst_x, dst_y, width, height); if (status) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; return status; } /* We know this will never fail with the image backend; but * instead of calling into it directly, we call * _cairo_surface_composite so that we get the correct device * offset handling. */ status = _cairo_surface_composite (op, src, mask, &state.image->base, src_x, src_y, mask_x, mask_y, dst_x - state.image_rect.x, dst_y - state.image_rect.y, width, height); _fallback_fini (&state); return status; } cairo_status_t _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects) { fallback_state_t state; cairo_rectangle_int_t *offset_rects = NULL; cairo_status_t status; int x1, y1, x2, y2; int i; assert (! surface->is_snapshot); if (num_rects <= 0) return CAIRO_STATUS_SUCCESS; /* Compute the bounds of the rectangles, so that we know what area of the * destination surface to fetch */ x1 = rects[0].x; y1 = rects[0].y; x2 = rects[0].x + rects[0].width; y2 = rects[0].y + rects[0].height; for (i = 1; i < num_rects; i++) { if (rects[i].x < x1) x1 = rects[i].x; if (rects[i].y < y1) y1 = rects[i].y; if ((int)(rects[i].x + rects[i].width) > x2) x2 = rects[i].x + rects[i].width; if ((int)(rects[i].y + rects[i].height) > y2) y2 = rects[i].y + rects[i].height; } status = _fallback_init (&state, surface, x1, y1, x2 - x1, y2 - y1); if (status) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; return status; } /* If the fetched image isn't at 0,0, we need to offset the rectangles */ if (state.image_rect.x != 0 || state.image_rect.y != 0) { offset_rects = _cairo_malloc_ab (num_rects, sizeof (cairo_rectangle_int_t)); if (offset_rects == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto DONE; } for (i = 0; i < num_rects; i++) { offset_rects[i].x = rects[i].x - state.image_rect.x; offset_rects[i].y = rects[i].y - state.image_rect.y; offset_rects[i].width = rects[i].width; offset_rects[i].height = rects[i].height; } rects = offset_rects; } status = _cairo_surface_fill_rectangles (&state.image->base, op, color, rects, num_rects); free (offset_rects); DONE: _fallback_fini (&state); return status; } cairo_status_t _cairo_surface_fallback_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps) { fallback_state_t state; cairo_trapezoid_t *offset_traps = NULL; cairo_status_t status; status = _fallback_init (&state, dst, dst_x, dst_y, width, height); if (status) { if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; return status; } /* If the destination image isn't at 0,0, we need to offset the trapezoids */ if (state.image_rect.x != 0 || state.image_rect.y != 0) { offset_traps = _cairo_malloc_ab (num_traps, sizeof (cairo_trapezoid_t)); if (!offset_traps) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto DONE; } _cairo_trapezoid_array_translate_and_scale (offset_traps, traps, num_traps, - state.image_rect.x, - state.image_rect.y, 1.0, 1.0); traps = offset_traps; } status = _cairo_surface_composite_trapezoids (op, pattern, &state.image->base, antialias, src_x, src_y, dst_x - state.image_rect.x, dst_y - state.image_rect.y, width, height, traps, num_traps); if (offset_traps) free (offset_traps); DONE: _fallback_fini (&state); return status; } cairo_status_t _cairo_surface_fallback_clone_similar (cairo_surface_t *surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_status_t status; cairo_surface_t *new_surface = NULL; cairo_t *cr; new_surface = _cairo_surface_create_similar_scratch (surface, cairo_surface_get_content (src), width, height); if (new_surface->status) return new_surface->status; /* We have to copy these here, so that the coordinate spaces are correct */ new_surface->device_transform = src->device_transform; new_surface->device_transform_inverse = src->device_transform_inverse; /* We can't use _cairo_composite directly, because backends that * implement the "high-level" API may not have it implemented. * (For example, SVG.) We can fix this by either checking if the * destination supports composite first, or we can make clone a * required "high-level" operation. */ cr = cairo_create (new_surface); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_surface (cr, src, -src_x, -src_y); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); if (status == CAIRO_STATUS_SUCCESS) *clone_out = new_surface; else cairo_surface_destroy (new_surface); return status; } libgdiplus-2.11/cairo/src/check-doc-syntax.sh0000775000175000017500000000440712225470167016120 00000000000000#!/bin/sh LANG=C if ! grep --version 2>/dev/null | grep GNU >/dev/null; then echo "GNU grep not found; skipping test" exit 0 fi test -z "$srcdir" && srcdir=. status=0 echo Checking documentation for incorrect syntax # Note: this test is also run from doc/public/ to check the SGML files if test "x$SGML_DOCS" = x; then FILES=`find "$srcdir" -name '*.h' -or -name '*.c' -or -name '*.cpp'` fi # Note: This test reports false positives on non-gtk-doc comments and # non-public enum values, (such as CAIRO_FIXED_FRAC_BITS in the comment # for _cairo_output_stream_init). I'm opposed to uglifying those comments # with % just to shut this warning up. So instead, I'm turning this check # off. (cworth 2008-03-02) # # Meanwhile, I'd love to see a system that would just link things like # enums up without any decoration. # #enum_regexp='\([^%@]\|^\)\<\(FALSE\|TRUE\|NULL\|CAIRO_[0-9A-Z_]*[^(0-9A-Z_]\)' #if test "x$SGML_DOCS" = x; then # enum_regexp='^[/ ][*] .*'$enum_regexp #fi #if grep "$enum_regexp" $FILES | grep -v '#####'; then # status=1 # echo Error: some macros in the docs are not prefixed by percent sign. # echo Fix this by searching for the following regexp in the above files: # echo " '$enum_regexp'" #fi type_regexp='\( .*[^#]\| \|^\)\\($\|[^:]$\|[^:].\)' if test "x$SGML_DOCS" = x; then type_regexp='^[/ ][*]'$type_regexp else type_regexp='\(.'$type_regexp'\)\|\('$type_regexp'.\)' fi if grep "$type_regexp" $FILES | grep -v '#####'; then status=1 echo Error: some type names in the docs are not prefixed by hash sign, echo neither are the only token in the doc line followed by colon. echo Fix this by searching for the following regexp in the above files: echo " '$type_regexp'" fi func_regexp='\([^#]\|^\)\<\(cairo_[][<>/0-9a-z_]*\> \?[^][ <>(]\)' if test "x$SGML_DOCS" = x; then func_regexp='^[/ ][*] .*'$func_regexp fi if grep "$func_regexp" $FILES | grep -v '#####'; then status=1 echo Error: some function names in the docs are not followed by parentheses. echo Fix this by searching for the following regexp in the above files: echo " '$func_regexp'" fi note_regexp='NOTE' if grep "$note_regexp" $FILES; then status=1 echo Error: some source files contain the string 'NOTE'. echo Be civil and replace it by 'Note' please. fi exit $status libgdiplus-2.11/cairo/src/cairo-svg.h0000664000175000017500000000533112225470167014455 00000000000000/* cairo - a vector graphics library with display and print output * * cairo-svg.h * * Copyright © 2005 Emmanuel Pacaud * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * */ #ifndef CAIRO_SVG_H #define CAIRO_SVG_H #include #if CAIRO_HAS_SVG_SURFACE CAIRO_BEGIN_DECLS /** * cairo_svg_version_t: * @CAIRO_SVG_VERSION_1_1: The version 1.1 of the SVG specification. * @CAIRO_SVG_VERSION_1_2: The version 1.2 of the SVG specification. * * #cairo_svg_version_t is used to describe the version number of the SVG * specification that a generated SVG file will conform to. */ typedef enum _cairo_svg_version { CAIRO_SVG_VERSION_1_1, CAIRO_SVG_VERSION_1_2 } cairo_svg_version_t; cairo_public cairo_surface_t * cairo_svg_surface_create (const char *filename, double width_in_points, double height_in_points); cairo_public cairo_surface_t * cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points); cairo_public void cairo_svg_surface_restrict_to_version (cairo_surface_t *surface, cairo_svg_version_t version); cairo_public void cairo_svg_get_versions (cairo_svg_version_t const **versions, int *num_versions); cairo_public const char * cairo_svg_version_to_string (cairo_svg_version_t version); CAIRO_END_DECLS #else /* CAIRO_HAS_SVG_SURFACE */ # error Cairo was not compiled with support for the svg backend #endif /* CAIRO_HAS_SVG_SURFACE */ #endif /* CAIRO_SVG_H */ libgdiplus-2.11/cairo/src/cairo-win32.c0000664000175000017500000000550212225470167014613 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Adrian Johnson. * * Contributor(s): * Adrian Johnson */ #define WIN32_LEAN_AND_MEAN /* We require Windows 2000 features such as ETO_PDY */ #if !defined(WINVER) || (WINVER < 0x0500) # define WINVER 0x0500 #endif #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) # define _WIN32_WINNT 0x0500 #endif #include "cairoint.h" #include #include /* tmpfile() replacment for Windows. * * On Windows tmpfile() creates the file in the root directory. This * may fail due to unsufficient privileges. */ FILE * _cairo_win32_tmpfile (void) { DWORD path_len; WCHAR path_name[MAX_PATH + 1]; WCHAR file_name[MAX_PATH + 1]; HANDLE handle; int fd; FILE *fp; path_len = GetTempPathW (MAX_PATH, path_name); if (path_len <= 0 || path_len >= MAX_PATH) return NULL; if (GetTempFileNameW (path_name, L"ps_", 0, file_name) == 0) return NULL; handle = CreateFileW (file_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_DELETE_ON_CLOSE, NULL); if (handle == INVALID_HANDLE_VALUE) { DeleteFileW (file_name); return NULL; } fd = _open_osfhandle((intptr_t) handle, 0); if (fd < 0) { CloseHandle (handle); return NULL; } fp = fdopen(fd, "w+b"); if (fp == NULL) { _close(fd); return NULL; } return fp; } libgdiplus-2.11/cairo/src/cairo-reference-count-private.h0000664000175000017500000000507412225470167020416 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2007 Chris Wilson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Chris Wilson */ #ifndef CAIRO_REFRENCE_COUNT_PRIVATE_H #define CAIRO_REFRENCE_COUNT_PRIVATE_H #include "cairo-atomic-private.h" CAIRO_BEGIN_DECLS /* Encapsulate operations on the object's reference count */ typedef struct { cairo_atomic_int_t ref_count; } cairo_reference_count_t; #define _cairo_reference_count_inc(RC) _cairo_atomic_int_inc (&(RC)->ref_count) #define _cairo_reference_count_dec_and_test(RC) _cairo_atomic_int_dec_and_test (&(RC)->ref_count) #define CAIRO_REFERENCE_COUNT_INIT(RC, VALUE) ((RC)->ref_count = (VALUE)) #define CAIRO_REFERENCE_COUNT_GET_VALUE(RC) _cairo_atomic_int_get (&(RC)->ref_count) #define CAIRO_REFERENCE_COUNT_SET_VALUE(RC, VALUE) _cairo_atomic_int_set (&(RC)->ref_count, (VALUE)) #define CAIRO_REFERENCE_COUNT_INVALID_VALUE ((cairo_atomic_int_t) -1) #define CAIRO_REFERENCE_COUNT_INVALID {CAIRO_REFERENCE_COUNT_INVALID_VALUE} #define CAIRO_REFERENCE_COUNT_IS_INVALID(RC) (CAIRO_REFERENCE_COUNT_GET_VALUE (RC) == CAIRO_REFERENCE_COUNT_INVALID_VALUE) #define CAIRO_REFERENCE_COUNT_HAS_REFERENCE(RC) (CAIRO_REFERENCE_COUNT_GET_VALUE (RC) > 0) CAIRO_END_DECLS #endif libgdiplus-2.11/cairo/src/cairo-mutex-private.h0000664000175000017500000001247512225470167016477 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005,2007 Red Hat, Inc. * Copyright © 2007 Mathias Hasselmann * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Mathias Hasselmann * Behdad Esfahbod */ #ifndef CAIRO_MUTEX_PRIVATE_H #define CAIRO_MUTEX_PRIVATE_H #if HAVE_CONFIG_H #include "config.h" #endif #include #include "cairo-compiler-private.h" #include "cairo-mutex-type-private.h" /* Only the following three are mandatory at this point */ #ifndef CAIRO_MUTEX_LOCK # error "CAIRO_MUTEX_LOCK not defined. Check cairo-mutex-type-private.h." #endif #ifndef CAIRO_MUTEX_UNLOCK # error "CAIRO_MUTEX_UNLOCK not defined. Check cairo-mutex-type-private.h." #endif #ifndef CAIRO_MUTEX_NIL_INITIALIZER # error "CAIRO_MUTEX_NIL_INITIALIZER not defined. Check cairo-mutex-type-private.h." #endif CAIRO_BEGIN_DECLS #define CAIRO_MUTEX_DECLARE(mutex) extern cairo_mutex_t mutex #include "cairo-mutex-list-private.h" #undef CAIRO_MUTEX_DECLARE /* make sure implementations don't fool us: we decide these ourself */ #undef _CAIRO_MUTEX_USE_STATIC_INITIALIZER #undef _CAIRO_MUTEX_USE_STATIC_FINALIZER #ifdef CAIRO_MUTEX_INIT /* If %CAIRO_MUTEX_INIT is defined, we may need to initialize all * static mutex'es. */ # ifndef CAIRO_MUTEX_INITIALIZE # define CAIRO_MUTEX_INITIALIZE() do { \ if (!_cairo_mutex_initialized) \ _cairo_mutex_initialize (); \ } while(0) cairo_private void _cairo_mutex_initialize (void); /* and make sure we implement the above */ # define _CAIRO_MUTEX_USE_STATIC_INITIALIZER 1 # endif /* CAIRO_MUTEX_INITIALIZE */ #else /* no CAIRO_MUTEX_INIT */ /* Otherwise we probably don't need to initialize static mutex'es, */ # ifndef CAIRO_MUTEX_INITIALIZE # define CAIRO_MUTEX_INITIALIZE() CAIRO_MUTEX_NOOP # endif /* CAIRO_MUTEX_INITIALIZE */ /* and dynamic ones can be initialized using the static initializer. */ # define CAIRO_MUTEX_INIT(mutex) do { \ cairo_mutex_t _tmp_mutex = CAIRO_MUTEX_NIL_INITIALIZER; \ memcpy (&(mutex), &_tmp_mutex, sizeof (_tmp_mutex)); \ } while (0) #endif /* CAIRO_MUTEX_INIT */ #ifdef CAIRO_MUTEX_FINI /* If %CAIRO_MUTEX_FINI is defined, we may need to finalize all * static mutex'es. */ # ifndef CAIRO_MUTEX_FINALIZE # define CAIRO_MUTEX_FINALIZE() do { \ if (_cairo_mutex_initialized) \ _cairo_mutex_finalize (); \ } while(0) cairo_private void _cairo_mutex_finalize (void); /* and make sure we implement the above */ # define _CAIRO_MUTEX_USE_STATIC_FINALIZER 1 # endif /* CAIRO_MUTEX_FINALIZE */ #else /* no CAIRO_MUTEX_FINI */ /* Otherwise we probably don't need to finalize static mutex'es, */ # ifndef CAIRO_MUTEX_FINALIZE # define CAIRO_MUTEX_FINALIZE() CAIRO_MUTEX_NOOP # endif /* CAIRO_MUTEX_FINALIZE */ /* neither do the dynamic ones. */ # define CAIRO_MUTEX_FINI(mutex) CAIRO_MUTEX_NOOP1(mutex) #endif /* CAIRO_MUTEX_FINI */ #ifndef _CAIRO_MUTEX_USE_STATIC_INITIALIZER #define _CAIRO_MUTEX_USE_STATIC_INITIALIZER 0 #endif #ifndef _CAIRO_MUTEX_USE_STATIC_FINALIZER #define _CAIRO_MUTEX_USE_STATIC_FINALIZER 0 #endif /* only if using static initializer and/or finalizer define the boolean */ #if _CAIRO_MUTEX_USE_STATIC_INITIALIZER || _CAIRO_MUTEX_USE_STATIC_FINALIZER cairo_private extern cairo_bool_t _cairo_mutex_initialized; #endif CAIRO_END_DECLS /* Make sure everything we want is defined */ #ifndef CAIRO_MUTEX_INITIALIZE # error "CAIRO_MUTEX_INITIALIZE not defined" #endif #ifndef CAIRO_MUTEX_FINALIZE # error "CAIRO_MUTEX_FINALIZE not defined" #endif #ifndef CAIRO_MUTEX_LOCK # error "CAIRO_MUTEX_LOCK not defined" #endif #ifndef CAIRO_MUTEX_UNLOCK # error "CAIRO_MUTEX_UNLOCK not defined" #endif #ifndef CAIRO_MUTEX_INIT # error "CAIRO_MUTEX_INIT not defined" #endif #ifndef CAIRO_MUTEX_FINI # error "CAIRO_MUTEX_FINI not defined" #endif #ifndef CAIRO_MUTEX_NIL_INITIALIZER # error "CAIRO_MUTEX_NIL_INITIALIZER not defined" #endif #endif libgdiplus-2.11/cairo/src/cairo-rectangle.c0000664000175000017500000001313012225470167015611 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" /* XXX We currently have a confusing mix of boxes and rectangles as * exemplified by this function. A #cairo_box_t is a rectangular area * represented by the coordinates of the upper left and lower right * corners, expressed in fixed point numbers. A #cairo_rectangle_int_t is * also a rectangular area, but represented by the upper left corner * and the width and the height, as integer numbers. * * This function converts a #cairo_box_t to a #cairo_rectangle_int_t by * increasing the area to the nearest integer coordinates. We should * standardize on #cairo_rectangle_fixed_t and #cairo_rectangle_int_t, and * this function could be renamed to the more reasonable * _cairo_rectangle_fixed_round. */ void _cairo_box_round_to_rectangle (cairo_box_t *box, cairo_rectangle_int_t *rectangle) { rectangle->x = _cairo_fixed_integer_floor (box->p1.x); rectangle->y = _cairo_fixed_integer_floor (box->p1.y); rectangle->width = _cairo_fixed_integer_ceil (box->p2.x) - rectangle->x; rectangle->height = _cairo_fixed_integer_ceil (box->p2.y) - rectangle->y; } void _cairo_rectangle_intersect (cairo_rectangle_int_t *dest, cairo_rectangle_int_t *src) { int x1, y1, x2, y2; x1 = MAX (dest->x, src->x); y1 = MAX (dest->y, src->y); x2 = MIN (dest->x + dest->width, src->x + src->width); y2 = MIN (dest->y + dest->height, src->y + src->height); if (x1 >= x2 || y1 >= y2) { dest->x = 0; dest->y = 0; dest->width = 0; dest->height = 0; } else { dest->x = x1; dest->y = y1; dest->width = x2 - x1; dest->height = y2 - y1; } } #define P1x (line->p1.x) #define P1y (line->p1.y) #define P2x (line->p2.x) #define P2y (line->p2.y) #define B1x (box->p1.x) #define B1y (box->p1.y) #define B2x (box->p2.x) #define B2y (box->p2.y) /* * Check whether any part of line intersects box. This function essentially * computes whether the ray starting at line->p1 in the direction of line->p2 * intersects the box before it reaches p2. Normally, this is done * by dividing by the lengths of the line projected onto each axis. Because * we're in fixed point, this function does a bit more work to avoid having to * do the division -- we don't care about the actual intersection point, so * it's of no interest to us. */ cairo_bool_t _cairo_box_intersects_line_segment (cairo_box_t *box, cairo_line_t *line) { cairo_fixed_t t1=0, t2=0, t3=0, t4=0; cairo_int64_t t1y, t2y, t3x, t4x; cairo_fixed_t xlen, ylen; if (_cairo_box_contains_point(box, &line->p1) || _cairo_box_contains_point(box, &line->p2)) return TRUE; xlen = P2x - P1x; ylen = P2y - P1y; if (xlen) { if (xlen > 0) { t1 = B1x - P1x; t2 = B2x - P1x; } else { t1 = P1x - B2x; t2 = P1x - B1x; xlen = - xlen; } if ((t1 < 0 || t1 > xlen) && (t2 < 0 || t2 > xlen)) return FALSE; } else { /* Fully vertical line -- check that X is in bounds */ if (P1x < B1x || P1x > B2x) return FALSE; } if (ylen) { if (ylen > 0) { t3 = B1y - P1y; t4 = B2y - P1y; } else { t3 = P1y - B2y; t4 = P1y - B1y; ylen = - ylen; } if ((t3 < 0 || t3 > ylen) && (t4 < 0 || t4 > ylen)) return FALSE; } else { /* Fully horizontal line -- check Y */ if (P1y < B1y || P1y > B2y) return FALSE; } /* If we had a horizontal or vertical line, then it's already been checked */ if (P1x == P2x || P1y == P2y) return TRUE; /* Check overlap. Note that t1 < t2 and t3 < t4 here. */ t1y = _cairo_int32x32_64_mul (t1, ylen); t2y = _cairo_int32x32_64_mul (t2, ylen); t3x = _cairo_int32x32_64_mul (t3, xlen); t4x = _cairo_int32x32_64_mul (t4, xlen); if (_cairo_int64_lt(t1y, t4x) && _cairo_int64_lt(t3x, t2y)) return TRUE; return FALSE; } cairo_bool_t _cairo_box_contains_point (cairo_box_t *box, cairo_point_t *point) { if (point->x < box->p1.x || point->x > box->p2.x || point->y < box->p1.y || point->y > box->p2.y) return FALSE; return TRUE; } libgdiplus-2.11/cairo/src/cairo-quartz.h0000664000175000017500000000513012225470167015201 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006, 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation. * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_QUARTZ_H #define CAIRO_QUARTZ_H #include #if CAIRO_HAS_QUARTZ_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_quartz_surface_create (cairo_format_t format, unsigned int width, unsigned int height); cairo_public cairo_surface_t * cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, unsigned int width, unsigned int height); cairo_public CGContextRef cairo_quartz_surface_get_cg_context (cairo_surface_t *surface); /* * Quartz font support */ #ifdef CAIRO_HAS_QUARTZ_FONT cairo_public cairo_font_face_t * cairo_quartz_font_face_create_for_cgfont (CGFontRef font); cairo_public cairo_font_face_t * cairo_quartz_font_face_create_for_atsu_font_id (ATSUFontID font_id); #endif /* CAIRO_HAS_QUARTZ_FONT */ CAIRO_END_DECLS #else # error Cairo was not compiled with support for the quartz backend #endif /* CAIRO_HAS_QUARTZ_SURFACE */ #endif /* CAIRO_QUARTZ_H */ libgdiplus-2.11/cairo/src/cairo-xlib-surface-private.h0000664000175000017500000000623512225470167017716 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. */ #ifndef CAIRO_XLIB_SURFACE_PRIVATE_H #define CAIRO_XLIB_SURFACE_PRIVATE_H #include "cairo-xlib.h" #include "cairo-xlib-private.h" #include "cairo-xlib-xrender-private.h" #include "cairo-surface-private.h" typedef struct _cairo_xlib_surface cairo_xlib_surface_t; struct _cairo_xlib_surface { cairo_surface_t base; Display *dpy; cairo_xlib_screen_info_t *screen_info; GC gc; Drawable drawable; Screen *screen; cairo_bool_t owns_pixmap; Visual *visual; int use_pixmap; int render_major; int render_minor; /* TRUE if the server has a bug with repeating pictures * * https://bugs.freedesktop.org/show_bug.cgi?id=3566 * * We can't test for this because it depends on whether the * picture is in video memory or not. * * We also use this variable as a guard against a second * independent bug with transformed repeating pictures: * * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html * * Both are fixed in xorg >= 6.9 and hopefully in > 6.8.2, so * we can reuse the test for now. */ cairo_bool_t buggy_repeat; int width; int height; int depth; Picture dst_picture, src_picture; unsigned int clip_dirty; cairo_bool_t have_clip_rects; XRectangle embedded_clip_rects[4]; XRectangle *clip_rects; int num_clip_rects; XRenderPictFormat *xrender_format; cairo_filter_t filter; int repeat; XTransform xtransform; uint32_t a_mask; uint32_t r_mask; uint32_t g_mask; uint32_t b_mask; }; enum { CAIRO_XLIB_SURFACE_CLIP_DIRTY_GC = 0x01, CAIRO_XLIB_SURFACE_CLIP_DIRTY_PICTURE = 0x02, CAIRO_XLIB_SURFACE_CLIP_DIRTY_ALL = 0x03 }; #endif /* CAIRO_XLIB_SURFACE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-quartz-image-surface.c0000664000175000017500000002527412225470167017715 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright � 2008 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation. * * Contributor(s): * Vladimir Vukicevic */ #include "cairoint.h" #ifdef CAIRO_HAS_QUARTZ_IMAGE_SURFACE #include "cairo-quartz-image.h" #endif #include "cairo-quartz-private.h" #ifndef kCGBitmapByteOrder32Host #define kCGBitmapByteOrder32Host 0 #endif #define SURFACE_ERROR_NO_MEMORY (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_NO_MEMORY))) #define SURFACE_ERROR_INVALID_FORMAT (_cairo_surface_create_in_error(_cairo_error(CAIRO_STATUS_INVALID_FORMAT))) CGImageRef _cairo_quartz_create_cgimage (cairo_format_t format, unsigned int width, unsigned int height, unsigned int stride, void *data, cairo_bool_t interpolate, CGColorSpaceRef colorSpaceOverride, CGDataProviderReleaseDataCallback releaseCallback, void *releaseInfo) { CGImageRef image = NULL; CGDataProviderRef dataProvider = NULL; CGColorSpaceRef colorSpace = colorSpaceOverride; CGBitmapInfo bitinfo; int bitsPerComponent, bitsPerPixel; switch (format) { case CAIRO_FORMAT_ARGB32: if (colorSpace == NULL) colorSpace = CGColorSpaceCreateDeviceRGB(); bitinfo = kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host; bitsPerComponent = 8; bitsPerPixel = 32; break; case CAIRO_FORMAT_RGB24: if (colorSpace == NULL) colorSpace = CGColorSpaceCreateDeviceRGB(); bitinfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host; bitsPerComponent = 8; bitsPerPixel = 32; break; /* XXX -- should use CGImageMaskCreate! */ case CAIRO_FORMAT_A8: if (colorSpace == NULL) colorSpace = CGColorSpaceCreateDeviceGray(); bitinfo = kCGImageAlphaNone; bitsPerComponent = 8; bitsPerPixel = 8; break; case CAIRO_FORMAT_A1: default: return NULL; } dataProvider = CGDataProviderCreateWithData (releaseInfo, data, height * stride, releaseCallback); if (!dataProvider) { // manually release if (releaseCallback) releaseCallback (releaseInfo, data, height * stride); goto FINISH; } image = CGImageCreate (width, height, bitsPerComponent, bitsPerPixel, stride, colorSpace, bitinfo, dataProvider, NULL, interpolate, kCGRenderingIntentDefault); FINISH: CGDataProviderRelease (dataProvider); if (colorSpace != colorSpaceOverride) CGColorSpaceRelease (colorSpace); return image; } #ifdef CAIRO_HAS_QUARTZ_IMAGE_SURFACE static void DataProviderReleaseCallback (void *info, const void *data, size_t size) { cairo_surface_t *surface = (cairo_surface_t *) info; cairo_surface_destroy (surface); } static cairo_surface_t * _cairo_quartz_image_surface_create_similar (void *asurface, cairo_content_t content, int width, int height) { cairo_surface_t *result; cairo_surface_t *isurf = cairo_image_surface_create (_cairo_format_from_content (content), width, height); if (cairo_surface_status(isurf)) return isurf; result = cairo_quartz_image_surface_create (isurf); cairo_surface_destroy (isurf); return result; } static cairo_status_t _cairo_quartz_image_surface_finish (void *asurface) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; /* the imageSurface will be destroyed by the data provider's release callback */ CGImageRelease (surface->image); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_quartz_image_surface_acquire_source_image (void *asurface, cairo_image_surface_t **image_out, void **image_extra) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; *image_out = surface->imageSurface; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_quartz_image_surface_acquire_dest_image (void *asurface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; *image_out = surface->imageSurface; *image_rect = surface->extents; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_image_surface_get_extents (void *asurface, cairo_rectangle_int_t *extents) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; *extents = surface->extents; return CAIRO_STATUS_SUCCESS; } /* we assume some drawing happened to the image buffer; make sure it's * represented in the CGImage on flush() */ static cairo_status_t _cairo_quartz_image_surface_flush (void *asurface) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) asurface; CGImageRef oldImage = surface->image; CGImageRef newImage = NULL; /* To be released by the ReleaseCallback */ cairo_surface_reference ((cairo_surface_t*) surface->imageSurface); newImage = _cairo_quartz_create_cgimage (surface->imageSurface->format, surface->imageSurface->width, surface->imageSurface->height, surface->imageSurface->stride, surface->imageSurface->data, TRUE, NULL, DataProviderReleaseCallback, surface->imageSurface); surface->image = newImage; CGImageRelease (oldImage); return CAIRO_STATUS_SUCCESS; } static const cairo_surface_backend_t cairo_quartz_image_surface_backend = { CAIRO_SURFACE_TYPE_QUARTZ_IMAGE, _cairo_quartz_image_surface_create_similar, _cairo_quartz_image_surface_finish, _cairo_quartz_image_surface_acquire_source_image, NULL, /* release_source_image */ _cairo_quartz_image_surface_acquire_dest_image, NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ NULL, /* intersect_clip_path */ _cairo_quartz_image_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ _cairo_quartz_image_surface_flush, NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ NULL, /* surface_show_glyphs */ NULL, /* snapshot */ NULL, /* is_similar */ NULL, /* reset */ NULL /* fill_stroke */ }; /** * cairo_quartz_image_surface_create * @surface: a cairo image surface to wrap with a quartz image surface * * Creates a Quartz surface backed by a CGImageRef that references the * given image surface. The resulting surface can be rendered quickly * when used as a source when rendering to a #cairo_quartz_surface. If * the data in the image surface is ever updated, cairo_surface_flush() * must be called on the #cairo_quartz_image_surface to ensure that the * CGImageRef refers to the updated data. * * Return value: the newly created surface. * * Since: 1.6 */ cairo_surface_t * cairo_quartz_image_surface_create (cairo_surface_t *surface) { cairo_quartz_image_surface_t *qisurf; CGImageRef image; cairo_image_surface_t *image_surface; int width, height, stride; cairo_format_t format; unsigned char *data; if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_IMAGE) return SURFACE_ERROR_NO_MEMORY; image_surface = (cairo_image_surface_t*) surface; width = image_surface->width; height = image_surface->height; stride = image_surface->stride; format = image_surface->format; data = image_surface->data; if (!_cairo_quartz_verify_surface_size(width, height)) return SURFACE_ERROR_NO_MEMORY; if (width == 0 || height == 0) return SURFACE_ERROR_NO_MEMORY; if (format != CAIRO_FORMAT_ARGB32 && format != CAIRO_FORMAT_RGB24) return SURFACE_ERROR_INVALID_FORMAT; qisurf = malloc(sizeof(cairo_quartz_image_surface_t)); if (qisurf == NULL) return SURFACE_ERROR_NO_MEMORY; memset (qisurf, 0, sizeof(cairo_quartz_image_surface_t)); /* In case the create_cgimage fails, this ref will * be released via the callback (which will be called in * case of failure.) */ cairo_surface_reference (surface); image = _cairo_quartz_create_cgimage (format, width, height, stride, data, TRUE, NULL, DataProviderReleaseCallback, surface); if (!image) { free (qisurf); return SURFACE_ERROR_NO_MEMORY; } _cairo_surface_init (&qisurf->base, &cairo_quartz_image_surface_backend, _cairo_content_from_format (format)); qisurf->extents.x = qisurf->extents.y = 0; qisurf->extents.width = width; qisurf->extents.height = height; qisurf->image = image; qisurf->imageSurface = image_surface; return &qisurf->base; } cairo_surface_t * cairo_quartz_image_surface_get_image (cairo_surface_t *asurface) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t*) asurface; if (cairo_surface_get_type(asurface) != CAIRO_SURFACE_TYPE_QUARTZ_IMAGE) return NULL; return (cairo_surface_t*) surface->imageSurface; } #endif /* CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ libgdiplus-2.11/cairo/src/cairo-slope.c0000664000175000017500000000724712225470167015003 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" void _cairo_slope_init (cairo_slope_t *slope, cairo_point_t *a, cairo_point_t *b) { slope->dx = b->x - a->x; slope->dy = b->y - a->y; } /* Compare two slopes. Slope angles begin at 0 in the direction of the positive X axis and increase in the direction of the positive Y axis. This function always compares the slope vectors based on the smaller angular difference between them, (that is based on an angular difference that is strictly less than pi). To break ties when comparing slope vectors with an angular difference of exactly pi, the vector with a positive dx (or positive dy if dx's are zero) is considered to be more positive than the other. Also, all slope vectors with both dx==0 and dy==0 are considered equal and more positive than any non-zero vector. < 0 => a less positive than b == 0 => a equal to b > 0 => a more positive than b */ int _cairo_slope_compare (cairo_slope_t *a, cairo_slope_t *b) { cairo_fixed_48_16_t diff; diff = ((cairo_fixed_48_16_t) a->dy * (cairo_fixed_48_16_t) b->dx - (cairo_fixed_48_16_t) b->dy * (cairo_fixed_48_16_t) a->dx); if (diff > 0) return 1; if (diff < 0) return -1; /* special-case zero vectors. the intended logic here is: * zero vectors all compare equal, and more positive than any * non-zero vector. */ if (a->dx == 0 && a->dy == 0 && b->dx == 0 && b->dy ==0) return 0; if (a->dx == 0 && a->dy == 0) return 1; if (b->dx == 0 && b->dy ==0) return -1; /* Finally, we're looking at two vectors that are either equal or * that differ by exactly pi. We can identify the "differ by pi" * case by looking for a change in sign in either dx or dy between * a and b. * * And in these cases, we eliminate the ambiguity by reducing the angle * of b by an infinitesimally small amount, (that is, 'a' will * always be considered less than 'b'). */ if (((a->dx > 0) != (b->dx > 0)) || ((a->dy > 0) != (b->dy > 0))) { if (a->dx > 0 || (a->dx == 0 && a->dy > 0)) return +1; else return -1; } /* Finally, for identical slopes, we obviously return 0. */ return 0; } libgdiplus-2.11/cairo/src/cairo-wideint-type-private.h0000664000175000017500000000635612225470167017760 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith R. Packard * */ #ifndef CAIRO_WIDEINT_TYPE_H #define CAIRO_WIDEINT_TYPE_H #if HAVE_CONFIG_H #include "config.h" #endif #if HAVE_STDINT_H # include #elif HAVE_INTTYPES_H # include #elif HAVE_SYS_INT_TYPES_H # include #elif defined(_MSC_VER) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; # ifndef HAVE_UINT64_T # define HAVE_UINT64_T 1 # endif # ifndef INT16_MIN # define INT16_MIN (-32767-1) # endif # ifndef INT16_MAX # define INT16_MAX (32767) # endif # ifndef UINT16_MAX # define UINT16_MAX (65535) # endif # ifndef INT32_MIN # define INT32_MIN (-2147483647-1) # endif # ifndef INT32_MAX # define INT32_MAX (2147483647) # endif #else #error Cannot find definitions for fixed-width integral types (uint8_t, uint32_t, etc.) #endif #if !HAVE_UINT64_T typedef struct _cairo_uint64 { uint32_t lo, hi; } cairo_uint64_t, cairo_int64_t; #else typedef uint64_t cairo_uint64_t; typedef int64_t cairo_int64_t; #endif typedef struct _cairo_uquorem64 { cairo_uint64_t quo; cairo_uint64_t rem; } cairo_uquorem64_t; typedef struct _cairo_quorem64 { cairo_int64_t quo; cairo_int64_t rem; } cairo_quorem64_t; #if !HAVE_UINT128_T typedef struct cairo_uint128 { cairo_uint64_t lo, hi; } cairo_uint128_t, cairo_int128_t; #else typedef uint128_t cairo_uint128_t; typedef int128_t cairo_int128_t; #endif typedef struct _cairo_uquorem128 { cairo_uint128_t quo; cairo_uint128_t rem; } cairo_uquorem128_t; typedef struct _cairo_quorem128 { cairo_int128_t quo; cairo_int128_t rem; } cairo_quorem128_t; #endif /* CAIRO_WIDEINT_H */ libgdiplus-2.11/cairo/src/cairo-directfb.h0000664000175000017500000000425712225470167015446 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ /* * Environment variables affecting the backend: * * %CAIRO_DIRECTFB_NO_ACCEL (boolean) * if found, disables acceleration at all * * %CAIRO_DIRECTFB_ARGB_FONT (boolean) * if found, enables using ARGB fonts instead of A8 */ #ifndef CAIRO_DIRECTFB_H #define CAIRO_DIRECTFB_H #include #ifdef CAIRO_HAS_DIRECTFB_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_directfb_surface_create (IDirectFB *dfb, IDirectFBSurface *surface); CAIRO_END_DECLS #else /*CAIRO_HAS_DIRECTFB_SURFACE*/ # error Cairo was not compiled with support for the directfb backend #endif /*CAIRO_HAS_DIRECTFB_SURFACE*/ #endif /*CAIRO_DIRECTFB_H*/ libgdiplus-2.11/cairo/src/cairo-os2-surface.c0000664000175000017500000013635312225470167016013 00000000000000/* vim: set sw=4 sts=4 et cin: */ /* cairo - a vector graphics library with display and print output * * Copyright (c) 2005-2006 netlabs.org * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is * Doodle * * Contributor(s): * Peter Weilbacher */ #include "cairoint.h" #include "cairo-os2-private.h" #include #include #ifdef BUILD_CAIRO_DLL # define INCL_WIN # define INCL_GPI # define INCL_DOS # define INCL_DOSERRORS # include # include "cairo-os2.h" # ifndef __WATCOMC__ # include # endif #endif /* * Here comes the extra API for the OS/2 platform. Currently it consists * of two extra functions, the cairo_os2_init () and the * cairo_os2_fini (). Both of them are called automatically if * Cairo is compiled to be a DLL file, but you have to call them before * using the Cairo API if you link to Cairo statically! * * You'll also find the code in here which deals with DLL initialization * and termination, if the code is built to be a DLL. * (if BUILD_CAIRO_DLL is defined) */ /* Initialization counter: */ static int cairo_os2_initialization_count = 0; static void inline DisableFPUException (void) { unsigned short usCW; /* Some OS/2 PM API calls modify the FPU Control Word, * but forget to restore it. * * This can result in XCPT_FLOAT_INVALID_OPCODE exceptions, * so to be sure, we disable Invalid Opcode FPU exception * before using FPU stuffs. */ usCW = _control87 (0, 0); usCW = usCW | EM_INVALID | 0x80; _control87 (usCW, MCW_EM | 0x80); } /** * cairo_os2_init: * * Initializes the Cairo library. This function is automatically called if * Cairo was compiled to be a DLL (however it's not a problem if it's called * multiple times). But if you link to Cairo statically, you have to call it * once to set up Cairo's internal structures and mutexes. * * Since: 1.4 **/ cairo_public void cairo_os2_init (void) { /* This may initialize some stuffs, like create mutex semaphores etc.. */ cairo_os2_initialization_count++; if (cairo_os2_initialization_count > 1) return; DisableFPUException (); #if CAIRO_HAS_FT_FONT /* Initialize FontConfig */ FcInit (); #endif CAIRO_MUTEX_INITIALIZE (); } /** * cairo_os2_fini: * * Uninitializes the Cairo library. This function is automatically called if * Cairo was compiled to be a DLL (however it's not a problem if it's called * multiple times). But if you link to Cairo statically, you have to call it * once to shut down Cairo, to let it free all the resources it has allocated. * * Since: 1.4 **/ cairo_public void cairo_os2_fini (void) { /* This has to uninitialize some stuffs, like destroy mutex semaphores etc.. */ if (cairo_os2_initialization_count <= 0) return; cairo_os2_initialization_count--; if (cairo_os2_initialization_count > 0) return; DisableFPUException (); /* Free allocated memories! */ /* (Check cairo_debug_reset_static_data () for an example of this!) */ _cairo_font_reset_static_data (); #if CAIRO_HAS_FT_FONT _cairo_ft_font_reset_static_data (); #endif CAIRO_MUTEX_FINALIZE (); #if CAIRO_HAS_FT_FONT /* Uninitialize FontConfig */ FcFini (); #endif #ifdef __WATCOMC__ /* It can happen that the libraries we use have memory leaks, * so there are still memory chunks allocated at this point. * In these cases, Watcom might still have a bigger memory chunk, * called "the heap" allocated from the OS. * As we want to minimize the memory we lose from the point of * view of the OS, we call this function to shrink that heap * as much as possible. */ _heapshrink (); #else /* GCC has a heapmin function that approximately corresponds to * what the Watcom function does */ _heapmin (); #endif } /* * This function calls the allocation function depending on which * method was compiled into the library: it can be native allocation * (DosAllocMem/DosFreeMem) or C-Library based allocation (malloc/free). * Actually, for pixel buffers that we use this function for, cairo * uses _cairo_malloc_abc, so we use that here, too. And use the * change to check the size argument */ void *_buffer_alloc (size_t a, size_t b, const unsigned int size) { /* check length like in the _cairo_malloc_abc macro, but we can leave * away the unsigned casts as our arguments are unsigned already */ size_t nbytes = b && a >= INT32_MAX / b ? 0 : size && a*b >= INT32_MAX / size ? 0 : a * b * size; void *buffer = NULL; #ifdef OS2_USE_PLATFORM_ALLOC APIRET rc = NO_ERROR; rc = DosAllocMem ((PPVOID)&buffer, nbytes, #ifdef OS2_HIGH_MEMORY /* only if compiled with high-memory support, */ OBJ_ANY | /* we can allocate anywhere! */ #endif PAG_READ | PAG_WRITE | PAG_COMMIT); if (rc != NO_ERROR) { /* should there for some reason be another error, let's return * a null surface and free the buffer again, because that's * how a malloc failure would look like */ if (rc != ERROR_NOT_ENOUGH_MEMORY && buffer) { DosFreeMem (buffer); } return NULL; } #else buffer = malloc (nbytes); #endif /* This does not seem to be needed, malloc'd space is usually * already zero'd out! */ /* * memset (buffer, 0x00, nbytes); */ return buffer; } /* * This function selects the free function depending on which * allocation method was compiled into the library */ void _buffer_free (void *buffer) { #ifdef OS2_USE_PLATFORM_ALLOC DosFreeMem (buffer); #else free (buffer); #endif } #ifdef BUILD_CAIRO_DLL /* The main DLL entry for DLL initialization and uninitialization */ /* Only include this code if we're about to build a DLL. */ #ifdef __WATCOMC__ unsigned _System LibMain (unsigned hmod, unsigned termination) #else unsigned long _System _DLL_InitTerm (unsigned long hModule, unsigned long termination) #endif { if (termination) { /* Unloading the DLL */ cairo_os2_fini (); #ifndef __WATCOMC__ /* Uninitialize RTL of GCC */ __ctordtorTerm (); _CRT_term (); #endif return 1; } else { /* Loading the DLL */ #ifndef __WATCOMC__ /* Initialize RTL of GCC */ if (_CRT_init () != 0) return 0; __ctordtorInit (); #endif cairo_os2_init (); return 1; } } #endif /* BUILD_CAIRO_DLL */ /* * The following part of the source file contains the code which might * be called the "core" of the OS/2 backend support. This contains the * OS/2 surface support functions and structures. */ /* Forward declaration */ static const cairo_surface_backend_t cairo_os2_surface_backend; /* Unpublished API: * GpiEnableYInversion = PMGPI.723 * GpiQueryYInversion = PMGPI.726 * BOOL APIENTRY GpiEnableYInversion (HPS hps, LONG lHeight); * LONG APIENTRY GpiQueryYInversion (HPS hps); */ BOOL APIENTRY GpiEnableYInversion (HPS hps, LONG lHeight); LONG APIENTRY GpiQueryYInversion (HPS hps); #ifdef __WATCOMC__ /* Function declaration for GpiDrawBits () (missing from OpenWatcom headers) */ LONG APIENTRY GpiDrawBits (HPS hps, PVOID pBits, PBITMAPINFO2 pbmiInfoTable, LONG lCount, PPOINTL aptlPoints, LONG lRop, ULONG flOptions); #endif static void _cairo_os2_surface_blit_pixels (cairo_os2_surface_t *surface, HPS hps_begin_paint, PRECTL prcl_begin_paint_rect) { POINTL aptlPoints[4]; LONG lOldYInversion, rc = GPI_OK; /* Enable Y Inversion for the HPS, so the * GpiDrawBits will work with upside-top image, not with upside-down image! */ lOldYInversion = GpiQueryYInversion (hps_begin_paint); GpiEnableYInversion (hps_begin_paint, surface->bitmap_info.cy-1); /* Target coordinates (Noninclusive) */ aptlPoints[0].x = prcl_begin_paint_rect->xLeft; aptlPoints[0].y = prcl_begin_paint_rect->yBottom; aptlPoints[1].x = prcl_begin_paint_rect->xRight-1; aptlPoints[1].y = prcl_begin_paint_rect->yTop-1; /* Source coordinates (Inclusive) */ aptlPoints[2].x = prcl_begin_paint_rect->xLeft; aptlPoints[2].y = prcl_begin_paint_rect->yBottom; aptlPoints[3].x = prcl_begin_paint_rect->xRight; aptlPoints[3].y = (prcl_begin_paint_rect->yTop); /* Some extra checking for limits * (Dunno if really needed, but had some crashes sometimes without it, * while developing the code...) */ { int i; for (i = 0; i < 4; i++) { if (aptlPoints[i].x < 0) aptlPoints[i].x = 0; if (aptlPoints[i].y < 0) aptlPoints[i].y = 0; if (aptlPoints[i].x > (LONG) surface->bitmap_info.cx) aptlPoints[i].x = (LONG) surface->bitmap_info.cx; if (aptlPoints[i].y > (LONG) surface->bitmap_info.cy) aptlPoints[i].y = (LONG) surface->bitmap_info.cy; } } /* Debug code to draw rectangle limits */ #if 0 { int x, y; unsigned char *pixels; pixels = surface->pixels; for (x = 0; x < surface->bitmap_info.cx; x++) { for (y = 0; y < surface->bitmap_info.cy; y++) { if ((x == 0) || (y == 0) || (x == y) || (x >= surface->bitmap_info.cx-1) || (y >= surface->bitmap_info.cy-1)) { pixels[y*surface->bitmap_info.cx*4+x*4] = 255; } } } } #endif rc = GpiDrawBits (hps_begin_paint, surface->pixels, &(surface->bitmap_info), 4, aptlPoints, ROP_SRCCOPY, BBO_IGNORE); if (rc != GPI_OK) { /* if GpiDrawBits () failed then this is most likely because the * display driver could not handle a 32bit bitmap. So we need to * - create a buffer that only contains 3 bytes per pixel * - change the bitmap info header to contain 24bit * - pass the new buffer to GpiDrawBits () again * - clean up the new buffer */ BITMAPINFOHEADER2 bmpheader; unsigned char *pchPixBuf, *pchPixSource; void *pBufStart; ULONG ulPixels; /* allocate temporary pixel buffer */ pchPixBuf = (unsigned char *) _buffer_alloc (surface->bitmap_info.cy, surface->bitmap_info.cx, 3); pchPixSource = surface->pixels; /* start at beginning of pixel buffer */ pBufStart = pchPixBuf; /* remember beginning of the new pixel buffer */ /* copy the first three bytes for each pixel but skip over the fourth */ for (ulPixels = 0; ulPixels < surface->bitmap_info.cx * surface->bitmap_info.cy; ulPixels++) { /* copy BGR from source buffer */ *pchPixBuf++ = *pchPixSource++; *pchPixBuf++ = *pchPixSource++; *pchPixBuf++ = *pchPixSource++; pchPixSource++; /* jump over alpha channel in source buffer */ } /* jump back to start of the buffer for display and cleanup */ pchPixBuf = pBufStart; /* set up the bitmap header, but this time with 24bit depth only */ memset (&bmpheader, 0, sizeof (bmpheader)); bmpheader.cbFix = sizeof (BITMAPINFOHEADER2); bmpheader.cx = surface->bitmap_info.cx; bmpheader.cy = surface->bitmap_info.cy; bmpheader.cPlanes = surface->bitmap_info.cPlanes; bmpheader.cBitCount = 24; rc = GpiDrawBits (hps_begin_paint, pchPixBuf, (PBITMAPINFO2)&bmpheader, 4, aptlPoints, ROP_SRCCOPY, BBO_IGNORE); _buffer_free (pchPixBuf); } /* Restore Y inversion */ GpiEnableYInversion (hps_begin_paint, lOldYInversion); } static void _cairo_os2_surface_get_pixels_from_screen (cairo_os2_surface_t *surface, HPS hps_begin_paint, PRECTL prcl_begin_paint_rect) { HPS hps; HDC hdc; HAB hab; SIZEL sizlTemp; HBITMAP hbmpTemp; BITMAPINFO2 bmi2Temp; POINTL aptlPoints[4]; int y; unsigned char *pchTemp; /* To copy pixels from screen to our buffer, we do the following steps: * * - Blit pixels from screen to a HBITMAP: * -- Create Memory Device Context * -- Create a PS into it * -- Create a HBITMAP * -- Select HBITMAP into memory PS * -- Blit dirty pixels from screen to HBITMAP * - Copy HBITMAP lines (pixels) into our buffer * - Free resources * * These steps will require an Anchor Block (HAB). However, * WinQUeryAnchorBlock () documentation says that HAB is not * used in current OS/2 implementations, OS/2 deduces all information * it needs from the TID. Anyway, we'd be in trouble if we'd have to * get a HAB where we only know a HPS... * So, we'll simply use a fake HAB. */ hab = (HAB) 1; /* OS/2 doesn't really use HAB... */ /* Create a memory device context */ hdc = DevOpenDC (hab, OD_MEMORY,"*",0L, NULL, NULLHANDLE); if (!hdc) { return; } /* Create a memory PS */ sizlTemp.cx = prcl_begin_paint_rect->xRight - prcl_begin_paint_rect->xLeft; sizlTemp.cy = prcl_begin_paint_rect->yTop - prcl_begin_paint_rect->yBottom; hps = GpiCreatePS (hab, hdc, &sizlTemp, PU_PELS | GPIT_NORMAL | GPIA_ASSOC); if (!hps) { DevCloseDC (hdc); return; } /* Create an uninitialized bitmap. */ /* Prepare BITMAPINFO2 structure for our buffer */ memset (&bmi2Temp, 0, sizeof (bmi2Temp)); bmi2Temp.cbFix = sizeof (BITMAPINFOHEADER2); bmi2Temp.cx = sizlTemp.cx; bmi2Temp.cy = sizlTemp.cy; bmi2Temp.cPlanes = 1; bmi2Temp.cBitCount = 32; hbmpTemp = GpiCreateBitmap (hps, (PBITMAPINFOHEADER2) &bmi2Temp, 0, NULL, NULL); if (!hbmpTemp) { GpiDestroyPS (hps); DevCloseDC (hdc); return; } /* Select the bitmap into the memory device context. */ GpiSetBitmap (hps, hbmpTemp); /* Target coordinates (Noninclusive) */ aptlPoints[0].x = 0; aptlPoints[0].y = 0; aptlPoints[1].x = sizlTemp.cx; aptlPoints[1].y = sizlTemp.cy; /* Source coordinates (Inclusive) */ aptlPoints[2].x = prcl_begin_paint_rect->xLeft; aptlPoints[2].y = surface->bitmap_info.cy - prcl_begin_paint_rect->yBottom; aptlPoints[3].x = prcl_begin_paint_rect->xRight; aptlPoints[3].y = surface->bitmap_info.cy - prcl_begin_paint_rect->yTop; /* Blit pixels from screen to bitmap */ GpiBitBlt (hps, hps_begin_paint, 4, aptlPoints, ROP_SRCCOPY, BBO_IGNORE); /* Now we have to extract the pixels from the bitmap. */ pchTemp = surface->pixels + (prcl_begin_paint_rect->yBottom)*surface->bitmap_info.cx*4 + prcl_begin_paint_rect->xLeft*4; for (y = 0; y < sizlTemp.cy; y++) { /* Get one line of pixels */ GpiQueryBitmapBits (hps, sizlTemp.cy - y - 1, /* lScanStart */ 1, /* lScans */ pchTemp, &bmi2Temp); /* Go for next line */ pchTemp += surface->bitmap_info.cx*4; } /* Clean up resources */ GpiSetBitmap (hps, (HBITMAP) NULL); GpiDeleteBitmap (hbmpTemp); GpiDestroyPS (hps); DevCloseDC (hdc); } static cairo_status_t _cairo_os2_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); /* Increase lend counter */ local_os2_surface->pixel_array_lend_count++; *image_out = local_os2_surface->image_surface; *image_extra = NULL; DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); return CAIRO_STATUS_SUCCESS; } static void _cairo_os2_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return; } /* Decrease Lend counter! */ DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); if (local_os2_surface->pixel_array_lend_count > 0) local_os2_surface->pixel_array_lend_count--; DosPostEventSem (local_os2_surface->hev_pixel_array_came_back); DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); return; } static cairo_status_t _cairo_os2_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); /* Increase lend counter */ local_os2_surface->pixel_array_lend_count++; *image_out = local_os2_surface->image_surface; *image_extra = NULL; image_rect->x = 0; image_rect->y = 0; image_rect->width = local_os2_surface->bitmap_info.cx; image_rect->height = local_os2_surface->bitmap_info.cy; DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); return CAIRO_STATUS_SUCCESS; } static void _cairo_os2_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_os2_surface_t *local_os2_surface; RECTL rclToBlit; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return; } /* So, we got back the image, and if all goes well, then * something has been changed inside the interest_rect. * So, we blit it to the screen! */ if (local_os2_surface->blit_as_changes) { /* Get mutex, we'll work with the pixel array! */ if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT)!=NO_ERROR) { /* Could not get mutex! */ return; } if (local_os2_surface->hwnd_client_window) { /* We know the HWND, so let's invalidate the window region, * so the application will redraw itself, using the * cairo_os2_surface_refresh_window () API from its own PM thread. * * This is the safe method, which should be preferred every time. */ rclToBlit.xLeft = interest_rect->x; rclToBlit.xRight = interest_rect->x+interest_rect->width; /* Noninclusive */ rclToBlit.yTop = local_os2_surface->bitmap_info.cy - (interest_rect->y); rclToBlit.yBottom = local_os2_surface->bitmap_info.cy - (interest_rect->y+interest_rect->height); /* Noninclusive */ WinInvalidateRect (local_os2_surface->hwnd_client_window, &rclToBlit, FALSE); } else { /* We don't know the HWND, so try to blit the pixels from here! * Please note that it can be problematic if this is not the PM thread! * * It can cause internal PM stuffs to be scewed up, for some reason. * Please always tell the HWND to the surface using the * cairo_os2_surface_set_hwnd () API, and call cairo_os2_surface_refresh_window () * from your WM_PAINT, if it's possible! */ rclToBlit.xLeft = interest_rect->x; rclToBlit.xRight = interest_rect->x+interest_rect->width; /* Noninclusive */ rclToBlit.yBottom = interest_rect->y; rclToBlit.yTop = interest_rect->y+interest_rect->height; /* Noninclusive */ /* Now blit there the stuffs! */ _cairo_os2_surface_blit_pixels (local_os2_surface, local_os2_surface->hps_client_window, &rclToBlit); } DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); } /* Also decrease Lend counter! */ DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); if (local_os2_surface->pixel_array_lend_count > 0) local_os2_surface->pixel_array_lend_count--; DosPostEventSem (local_os2_surface->hev_pixel_array_came_back); DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); } static cairo_int_status_t _cairo_os2_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } rectangle->x = 0; rectangle->y = 0; rectangle->width = local_os2_surface->bitmap_info.cx; rectangle->height = local_os2_surface->bitmap_info.cy; return CAIRO_STATUS_SUCCESS; } /** * cairo_os2_surface_create: * @hps_client_window: the presentation handle to bind the surface to * @width: the width of the surface * @height: the height of the surface * * Create a Cairo surface which is bound to a given presentation space (HPS). * The surface will be created to have the given size. * By default every change to the surface will be made visible immediately by * blitting it into the window. This can be changed with * cairo_os2_surface_set_manual_window_refresh(). * Note that the surface will contain garbage when created, so the pixels have * to be initialized by hand first. You can use the Cairo functions to fill it * with black, or use cairo_surface_mark_dirty() to fill the surface with pixels * from the window/HPS. * * Return value: the newly created surface * * Since: 1.4 **/ cairo_surface_t * cairo_os2_surface_create (HPS hps_client_window, int width, int height) { cairo_os2_surface_t *local_os2_surface; cairo_status_t status; int rc; /* Check the size of the window */ if ((width <= 0) || (height <= 0)) { /* Invalid window size! */ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } local_os2_surface = (cairo_os2_surface_t *) malloc (sizeof (cairo_os2_surface_t)); if (!local_os2_surface) { /* Not enough memory! */ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* Initialize the OS/2 specific parts of the surface! */ /* Create mutex semaphore */ rc = DosCreateMutexSem (NULL, &(local_os2_surface->hmtx_use_private_fields), 0, FALSE); if (rc != NO_ERROR) { /* Could not create mutex semaphore! */ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* Save PS handle */ local_os2_surface->hps_client_window = hps_client_window; /* Defaults */ local_os2_surface->hwnd_client_window = NULLHANDLE; local_os2_surface->blit_as_changes = TRUE; local_os2_surface->pixel_array_lend_count = 0; rc = DosCreateEventSem (NULL, &(local_os2_surface->hev_pixel_array_came_back), 0, FALSE); if (rc != NO_ERROR) { /* Could not create event semaphore! */ DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); free (local_os2_surface); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* Prepare BITMAPINFO2 structure for our buffer */ memset (&(local_os2_surface->bitmap_info), 0, sizeof (local_os2_surface->bitmap_info)); local_os2_surface->bitmap_info.cbFix = sizeof (BITMAPINFOHEADER2); local_os2_surface->bitmap_info.cx = width; local_os2_surface->bitmap_info.cy = height; local_os2_surface->bitmap_info.cPlanes = 1; local_os2_surface->bitmap_info.cBitCount = 32; /* Allocate memory for pixels */ local_os2_surface->pixels = (unsigned char *) _buffer_alloc (height, width, 4); if (!(local_os2_surface->pixels)) { /* Not enough memory for the pixels! */ DosCloseEventSem (local_os2_surface->hev_pixel_array_came_back); DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); free (local_os2_surface); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* Create image surface from pixel array */ local_os2_surface->image_surface = (cairo_image_surface_t *) cairo_image_surface_create_for_data (local_os2_surface->pixels, CAIRO_FORMAT_ARGB32, width, /* Width */ height, /* Height */ width * 4); /* Rowstride */ status = local_os2_surface->image_surface->base.status; if (status) { /* Could not create image surface! */ _buffer_free (local_os2_surface->pixels); DosCloseEventSem (local_os2_surface->hev_pixel_array_came_back); DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); free (local_os2_surface); return _cairo_surface_create_in_error (status); } /* Initialize base surface */ _cairo_surface_init (&local_os2_surface->base, &cairo_os2_surface_backend, _cairo_content_from_format (CAIRO_FORMAT_ARGB32)); return (cairo_surface_t *)local_os2_surface; } /** * cairo_os2_surface_set_size: * @surface: the cairo surface to resize * @new_width: the new width of the surface * @new_height: the new height of the surface * @timeout: timeout value in milliseconds * * When the client window is resized, call this API to set the new size in the * underlying surface accordingly. This function will reallocate everything, * so you'll have to redraw everything in the surface after this call. * The surface will contain garbage after the resizing. So the notes of * cairo_os2_surface_create() apply here, too. * * The timeout value specifies how long the function should wait on other parts * of the program to release the buffers. It is necessary, because it can happen * that Cairo is just drawing something into the surface while we want to * destroy and recreate it. * * Return value: %CAIRO_STATUS_SUCCESS if the surface could be resized, * %CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface is not an OS/2 surface, * %CAIRO_STATUS_NO_MEMORY if the new size could not be allocated, for invalid * sizes, or if the timeout happened before all the buffers were released * * Since: 1.4 **/ int cairo_os2_surface_set_size (cairo_surface_t *surface, int new_width, int new_height, int timeout) { cairo_os2_surface_t *local_os2_surface; unsigned char *pchNewPixels; int rc; cairo_image_surface_t *pNewImageSurface; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } if ((new_width <= 0) || (new_height <= 0)) { /* Invalid size! */ return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Allocate memory for new stuffs */ pchNewPixels = (unsigned char *) _buffer_alloc (new_height, new_width, 4); if (!pchNewPixels) { /* Not enough memory for the pixels! * Everything remains the same! */ return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Create image surface from new pixel array */ pNewImageSurface = (cairo_image_surface_t *) cairo_image_surface_create_for_data (pchNewPixels, CAIRO_FORMAT_ARGB32, new_width, /* Width */ new_height, /* Height */ new_width * 4); /* Rowstride */ if (pNewImageSurface->base.status) { /* Could not create image surface! * Everything remains the same! */ _buffer_free (pchNewPixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Okay, new memory allocated, so it's time to swap old buffers * to new ones! */ if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT)!=NO_ERROR) { /* Could not get mutex! * Everything remains the same! */ cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); _buffer_free (pchNewPixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* We have to make sure that we won't destroy a surface which * is lent to some other code (Cairo is drawing into it)! */ while (local_os2_surface->pixel_array_lend_count > 0) { ULONG ulPostCount; DosResetEventSem (local_os2_surface->hev_pixel_array_came_back, &ulPostCount); DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); /* Wait for somebody to return the pixels! */ rc = DosWaitEventSem (local_os2_surface->hev_pixel_array_came_back, timeout); if (rc != NO_ERROR) { /* Either timeout or something wrong... Exit. */ cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); _buffer_free (pchNewPixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Okay, grab mutex and check counter again! */ if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) != NO_ERROR) { /* Could not get mutex! * Everything remains the same! */ cairo_surface_destroy ((cairo_surface_t *) pNewImageSurface); _buffer_free (pchNewPixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } /* Destroy old image surface */ cairo_surface_destroy ((cairo_surface_t *) (local_os2_surface->image_surface)); /* Destroy old pixel buffer */ _buffer_free (local_os2_surface->pixels); /* Set new image surface */ local_os2_surface->image_surface = pNewImageSurface; /* Set new pixel buffer */ local_os2_surface->pixels = pchNewPixels; /* Change bitmap2 structure */ local_os2_surface->bitmap_info.cx = new_width; local_os2_surface->bitmap_info.cy = new_height; DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); return CAIRO_STATUS_SUCCESS; } /** * cairo_os2_surface_refresh_window: * @surface: the cairo surface to refresh * @hps_begin_paint: the presentation handle of the window to refresh * @prcl_begin_paint_rect: the rectangle to redraw * * This function can be used to force a repaint of a given area of the client * window. It should usually be called from the WM_PAINT processing of the * window procedure. However, it can be called any time a given part of the * window has to be updated. * * The HPS and RECTL to be passed can be taken from the usual WinBeginPaint call * of the window procedure, but you can also get the HPS using WinGetPS, and you * can assemble your own update rectangle by hand. * If hps_begin_paint is %NULL, the function will use the HPS passed into * cairo_os2_surface_create(). If @prcl_begin_paint_rect is %NULL, the function * will query the current window size and repaint the whole window. * * Cairo assumes that if you set the HWND to the surface using * cairo_os2_surface_set_hwnd(), this function will be called by the application * every time it gets a WM_PAINT for that HWND. If the HWND is set in the * surface, Cairo uses this function to handle dirty areas too. * * Since: 1.4 **/ void cairo_os2_surface_refresh_window (cairo_surface_t *surface, HPS hps_begin_paint, PRECTL prcl_begin_paint_rect) { cairo_os2_surface_t *local_os2_surface; RECTL rclTemp; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return; } /* Manage defaults (NULLs) */ if (!hps_begin_paint) hps_begin_paint = local_os2_surface->hps_client_window; if (prcl_begin_paint_rect == NULL) { /* Update the whole window! */ rclTemp.xLeft = 0; rclTemp.xRight = local_os2_surface->bitmap_info.cx; rclTemp.yTop = local_os2_surface->bitmap_info.cy; rclTemp.yBottom = 0; } else { /* Use the rectangle we got passed as parameter! */ rclTemp.xLeft = prcl_begin_paint_rect->xLeft; rclTemp.xRight = prcl_begin_paint_rect->xRight; rclTemp.yTop = local_os2_surface->bitmap_info.cy - prcl_begin_paint_rect->yBottom; rclTemp.yBottom = local_os2_surface->bitmap_info.cy - prcl_begin_paint_rect->yTop ; } /* Get mutex, we'll work with the pixel array! */ if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) != NO_ERROR) { /* Could not get mutex! */ return; } if ((local_os2_surface->dirty_area_present) && (local_os2_surface->rcl_dirty_area.xLeft == rclTemp.xLeft) && (local_os2_surface->rcl_dirty_area.xRight == rclTemp.xRight) && (local_os2_surface->rcl_dirty_area.yTop == rclTemp.yTop) && (local_os2_surface->rcl_dirty_area.yBottom == rclTemp.yBottom)) { /* Aha, this call was because of a dirty area, so in this case we * have to blit the pixels from the screen to the surface! */ local_os2_surface->dirty_area_present = FALSE; _cairo_os2_surface_get_pixels_from_screen (local_os2_surface, hps_begin_paint, &rclTemp); } else { /* Okay, we have the surface, have the HPS * (might be from WinBeginPaint () or from WinGetPS () ) * Now blit there the stuffs! */ _cairo_os2_surface_blit_pixels (local_os2_surface, hps_begin_paint, &rclTemp); } DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); } static cairo_status_t _cairo_os2_surface_finish (void *abstract_surface) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) abstract_surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT); /* Destroy old image surface */ cairo_surface_destroy ((cairo_surface_t *) (local_os2_surface->image_surface)); /* Destroy old pixel buffer */ _buffer_free (local_os2_surface->pixels); DosCloseMutexSem (local_os2_surface->hmtx_use_private_fields); DosCloseEventSem (local_os2_surface->hev_pixel_array_came_back); /* The memory itself will be free'd by the cairo_surface_destroy () * who called us. */ return CAIRO_STATUS_SUCCESS; } /** * cairo_os2_surface_set_hwnd: * @surface: the cairo surface to associate with the window handle * @hwnd_client_window: the window handle of the client window * * Sets window handle for surface. If Cairo wants to blit into the window * because it is set to blit as the surface changes (see * cairo_os2_surface_set_manual_window_refresh()), then there are two ways it * can choose: * If it knows the HWND of the surface, then it invalidates that area, so the * application will get a WM_PAINT message and it can call * cairo_os2_surface_refresh_window() to redraw that area. Otherwise cairo itself * will use the HPS it got at surface creation time, and blit the pixels itself. * It's also a solution, but experience shows that if this happens from a non-PM * thread, then it can screw up PM internals. * * So, best solution is to set the HWND for the surface after the surface * creation, so every blit will be done from application's message processing * loop, which is the safest way to do. * * Since: 1.4 **/ void cairo_os2_surface_set_hwnd (cairo_surface_t *surface, HWND hwnd_client_window) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return; } if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) != NO_ERROR) { /* Could not get mutex! */ return; } local_os2_surface->hwnd_client_window = hwnd_client_window; DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); } /** * cairo_os2_surface_set_manual_window_refresh: * @surface: the cairo surface to set the refresh mode for * @manual_refresh: the switch for manual surface refresh * * This API can tell Cairo if it should show every change to this surface * immediately in the window or if it should be cached and will only be visible * once the user calls cairo_os2_surface_refresh_window() explicitly. If the * HWND was not set in the cairo surface, then the HPS will be used to blit the * graphics. Otherwise it will invalidate the given window region so the user * will get the WM_PAINT message to redraw that area of the window. * * So, if you're only interested in displaying the final result after several * drawing operations, you might get better performance if you put the surface * into manual refresh mode by passing a true value to this function. Then call * cairo_os2_surface_refresh() whenever desired. * * Since: 1.4 **/ void cairo_os2_surface_set_manual_window_refresh (cairo_surface_t *surface, cairo_bool_t manual_refresh) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return; } local_os2_surface->blit_as_changes = !manual_refresh; } /** * cairo_os2_surface_get_manual_window_refresh: * @surface: the cairo surface to query the refresh mode from * * Return value: current refresh mode of the surface (true by default) * * Since: 1.4 **/ cairo_bool_t cairo_os2_surface_get_manual_window_refresh (cairo_surface_t *surface) { cairo_os2_surface_t *local_os2_surface; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return FALSE; } return !(local_os2_surface->blit_as_changes); } static cairo_status_t _cairo_os2_surface_mark_dirty_rectangle (void *surface, int x, int y, int width, int height) { cairo_os2_surface_t *local_os2_surface; RECTL rclToBlit; local_os2_surface = (cairo_os2_surface_t *) surface; if ((!local_os2_surface) || (local_os2_surface->base.backend != &cairo_os2_surface_backend)) { /* Invalid parameter (wrong surface)! */ return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); } /* Get mutex, we'll work with the pixel array! */ if (DosRequestMutexSem (local_os2_surface->hmtx_use_private_fields, SEM_INDEFINITE_WAIT) != NO_ERROR) { /* Could not get mutex! */ return CAIRO_STATUS_NO_MEMORY; } /* Check for defaults */ if (width < 0) width = local_os2_surface->bitmap_info.cx; if (height < 0) height = local_os2_surface->bitmap_info.cy; if (local_os2_surface->hwnd_client_window) { /* We know the HWND, so let's invalidate the window region, * so the application will redraw itself, using the * cairo_os2_surface_refresh_window () API from its own PM thread. * From that function we'll note that it's not a redraw but a * dirty-rectangle deal stuff, so we'll handle the things from * there. * * This is the safe method, which should be preferred every time. */ rclToBlit.xLeft = x; rclToBlit.xRight = x + width; /* Noninclusive */ rclToBlit.yTop = local_os2_surface->bitmap_info.cy - (y); rclToBlit.yBottom = local_os2_surface->bitmap_info.cy - (y + height); /* Noninclusive */ #if 0 if (local_os2_surface->dirty_area_present) { /* Yikes, there is already a dirty area which should be * cleaned up, but we'll overwrite it. Sorry. * TODO: Something clever should be done here. */ } #endif /* Set up dirty area reminder stuff */ memcpy (&(local_os2_surface->rcl_dirty_area), &rclToBlit, sizeof (RECTL)); local_os2_surface->dirty_area_present = TRUE; /* Invalidate window area */ WinInvalidateRect (local_os2_surface->hwnd_client_window, &rclToBlit, FALSE); } else { /* We don't know the HWND, so try to blit the pixels from here! * Please note that it can be problematic if this is not the PM thread! * * It can cause internal PM stuffs to be scewed up, for some reason. * Please always tell the HWND to the surface using the * cairo_os2_surface_set_hwnd () API, and call cairo_os2_surface_refresh_window () * from your WM_PAINT, if it's possible! */ rclToBlit.xLeft = x; rclToBlit.xRight = x + width; /* Noninclusive */ rclToBlit.yBottom = y; rclToBlit.yTop = y + height; /* Noninclusive */ /* Now get the pixels from the screen! */ _cairo_os2_surface_get_pixels_from_screen (local_os2_surface, local_os2_surface->hps_client_window, &rclToBlit); } DosReleaseMutexSem (local_os2_surface->hmtx_use_private_fields); return CAIRO_STATUS_SUCCESS; } static const cairo_surface_backend_t cairo_os2_surface_backend = { CAIRO_SURFACE_TYPE_OS2, NULL, /* create_similar */ _cairo_os2_surface_finish, _cairo_os2_surface_acquire_source_image, _cairo_os2_surface_release_source_image, _cairo_os2_surface_acquire_dest_image, _cairo_os2_surface_release_dest_image, NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ NULL, /* intersect_clip_path */ _cairo_os2_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ _cairo_os2_surface_mark_dirty_rectangle, NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ NULL, /* show_glyphs */ NULL /* snapshot */ }; libgdiplus-2.11/cairo/src/cairo-pdf.h0000664000175000017500000000440112225470167014424 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_PDF_H #define CAIRO_PDF_H #include #if CAIRO_HAS_PDF_SURFACE CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_pdf_surface_create (const char *filename, double width_in_points, double height_in_points); cairo_public cairo_surface_t * cairo_pdf_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points); cairo_public void cairo_pdf_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points); CAIRO_END_DECLS #else /* CAIRO_HAS_PDF_SURFACE */ # error Cairo was not compiled with support for the pdf backend #endif /* CAIRO_HAS_PDF_SURFACE */ #endif /* CAIRO_PDF_H */ libgdiplus-2.11/cairo/src/check-cairoint.sh0000775000175000017500000000047012225470167015633 00000000000000#!/bin/sh LANG=C test -z "$srcdir" && srcdir=. status=0 echo 'Checking source files for missing or misplaced #include "cairoint.h"' find "$srcdir" -name '*.c' -or -name '*.cpp' | while read x; do grep '\' "$x" /dev/null | head -n 1 done | grep -v '"cairoint.h"' | grep . && status=1 exit $status libgdiplus-2.11/cairo/src/cairo-svg-surface-private.h0000664000175000017500000000453212225470167017555 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2005-2006 Emmanuel Pacaud * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Emmanuel Pacaud * Carl Worth */ #ifndef CAIRO_SVG_SURFACE_PRIVATE_H #define CAIRO_SVG_SURFACE_PRIVATE_H #include "cairo-svg.h" #include "cairo-surface-private.h" typedef struct cairo_svg_document cairo_svg_document_t; typedef struct cairo_svg_surface { cairo_surface_t base; cairo_content_t content; unsigned int id; double width; double height; cairo_svg_document_t *document; cairo_output_stream_t *xml_node; cairo_array_t page_set; unsigned int clip_level; unsigned int base_clip; cairo_bool_t is_base_clip_emitted; cairo_paginated_mode_t paginated_mode; cairo_bool_t force_fallbacks; } cairo_svg_surface_t; #endif /* CAIRO_SVG_SURFACE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-ft.h0000664000175000017500000000467312225470167014277 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Graydon Hoare * Owen Taylor */ #ifndef CAIRO_FT_H #define CAIRO_FT_H #include #if CAIRO_HAS_FT_FONT /* Fontconfig/Freetype platform-specific font interface */ #include #include #include FT_FREETYPE_H CAIRO_BEGIN_DECLS cairo_public cairo_font_face_t * cairo_ft_font_face_create_for_pattern (FcPattern *pattern); cairo_public void cairo_ft_font_options_substitute (const cairo_font_options_t *options, FcPattern *pattern); cairo_public cairo_font_face_t * cairo_ft_font_face_create_for_ft_face (FT_Face face, int load_flags); cairo_public FT_Face cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *scaled_font); cairo_public void cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *scaled_font); CAIRO_END_DECLS #else /* CAIRO_HAS_FT_FONT */ # error Cairo was not compiled with support for the freetype font backend #endif /* CAIRO_HAS_FT_FONT */ #endif /* CAIRO_FT_H */ libgdiplus-2.11/cairo/src/cairo-stroke-style.c0000664000175000017500000000671312225470167016323 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #include "cairoint.h" void _cairo_stroke_style_init (cairo_stroke_style_t *style) { style->line_width = CAIRO_GSTATE_LINE_WIDTH_DEFAULT; style->line_cap = CAIRO_GSTATE_LINE_CAP_DEFAULT; style->line_join = CAIRO_GSTATE_LINE_JOIN_DEFAULT; style->miter_limit = CAIRO_GSTATE_MITER_LIMIT_DEFAULT; style->dash = NULL; style->num_dashes = 0; style->dash_offset = 0.0; } cairo_status_t _cairo_stroke_style_init_copy (cairo_stroke_style_t *style, cairo_stroke_style_t *other) { style->line_width = other->line_width; style->line_cap = other->line_cap; style->line_join = other->line_join; style->miter_limit = other->miter_limit; style->num_dashes = other->num_dashes; if (other->dash == NULL) { style->dash = NULL; } else { style->dash = _cairo_malloc_ab (style->num_dashes, sizeof (double)); if (style->dash == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (style->dash, other->dash, style->num_dashes * sizeof (double)); } style->dash_offset = other->dash_offset; return CAIRO_STATUS_SUCCESS; } void _cairo_stroke_style_fini (cairo_stroke_style_t *style) { if (style->dash) { free (style->dash); style->dash = NULL; } style->num_dashes = 0; } /* * For a stroke in the given style, compute the maximum distance * from the path that vertices could be generated. In the case * of rotation in the ctm, the distance will not be exact. */ void _cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style, const cairo_matrix_t *ctm, double *dx, double *dy) { double style_expansion = MAX(style->line_cap == CAIRO_LINE_CAP_SQUARE ? M_SQRT1_2 : 0.5, style->line_join == CAIRO_LINE_JOIN_MITER ? style->miter_limit : 0.5); *dx = style->line_width * style_expansion * (fabs(ctm->xx) + fabs(ctm->xy)); *dy = style->line_width * style_expansion * (fabs(ctm->yy) + fabs(ctm->yx)); } libgdiplus-2.11/cairo/src/cairo-quartz-font.c0000664000175000017500000006134212225470167016147 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright � 2008 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation. * * Contributor(s): * Vladimir Vukicevic */ #include "cairoint.h" #include #include "cairo-quartz.h" #include "cairo-quartz-private.h" /* CreateWithFontName exists in 10.5, but not in 10.4; CreateWithName isn't public in 10.4 */ static CGFontRef (*CGFontCreateWithFontNamePtr) (CFStringRef) = NULL; static CGFontRef (*CGFontCreateWithNamePtr) (const char *) = NULL; /* These aren't public before 10.5, and some have different names in 10.4 */ static int (*CGFontGetUnitsPerEmPtr) (CGFontRef) = NULL; static bool (*CGFontGetGlyphAdvancesPtr) (CGFontRef, const CGGlyph[], size_t, int[]) = NULL; static bool (*CGFontGetGlyphBBoxesPtr) (CGFontRef, const CGGlyph[], size_t, CGRect[]) = NULL; static CGRect (*CGFontGetFontBBoxPtr) (CGFontRef) = NULL; /* Not public, but present */ static void (*CGFontGetGlyphsForUnicharsPtr) (CGFontRef, const UniChar[], const CGGlyph[], size_t) = NULL; /* Not public in the least bit */ static CGPathRef (*CGFontGetGlyphPathPtr) (CGFontRef fontRef, CGAffineTransform *textTransform, int unknown, CGGlyph glyph) = NULL; /* CGFontGetHMetrics isn't public, but the other functions are public/present in 10.5 */ typedef struct { int ascent; int descent; int leading; } quartz_CGFontMetrics; static quartz_CGFontMetrics* (*CGFontGetHMetricsPtr) (CGFontRef fontRef) = NULL; static int (*CGFontGetAscentPtr) (CGFontRef fontRef) = NULL; static int (*CGFontGetDescentPtr) (CGFontRef fontRef) = NULL; static int (*CGFontGetLeadingPtr) (CGFontRef fontRef) = NULL; static cairo_bool_t _cairo_quartz_font_symbol_lookup_done = FALSE; static cairo_bool_t _cairo_quartz_font_symbols_present = FALSE; static void quartz_font_ensure_symbols(void) { if (_cairo_quartz_font_symbol_lookup_done) return; /* Look for the 10.5 versions first */ CGFontGetGlyphBBoxesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphBBoxes"); if (!CGFontGetGlyphBBoxesPtr) CGFontGetGlyphBBoxesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphBoundingBoxes"); CGFontGetGlyphsForUnicharsPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnichars"); if (!CGFontGetGlyphsForUnicharsPtr) CGFontGetGlyphsForUnicharsPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphsForUnicodes"); CGFontGetFontBBoxPtr = dlsym(RTLD_DEFAULT, "CGFontGetFontBBox"); /* We just need one of these two */ CGFontCreateWithFontNamePtr = dlsym(RTLD_DEFAULT, "CGFontCreateWithFontName"); CGFontCreateWithNamePtr = dlsym(RTLD_DEFAULT, "CGFontCreateWithName"); /* These have the same name in 10.4 and 10.5 */ CGFontGetUnitsPerEmPtr = dlsym(RTLD_DEFAULT, "CGFontGetUnitsPerEm"); CGFontGetGlyphAdvancesPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphAdvances"); CGFontGetGlyphPathPtr = dlsym(RTLD_DEFAULT, "CGFontGetGlyphPath"); CGFontGetHMetricsPtr = dlsym(RTLD_DEFAULT, "CGFontGetHMetrics"); CGFontGetAscentPtr = dlsym(RTLD_DEFAULT, "CGFontGetAscent"); CGFontGetDescentPtr = dlsym(RTLD_DEFAULT, "CGFontGetDescent"); CGFontGetLeadingPtr = dlsym(RTLD_DEFAULT, "CGFontGetLeading"); if ((CGFontCreateWithFontNamePtr || CGFontCreateWithNamePtr) && CGFontGetGlyphBBoxesPtr && CGFontGetGlyphsForUnicharsPtr && CGFontGetUnitsPerEmPtr && CGFontGetGlyphAdvancesPtr && CGFontGetGlyphPathPtr && (CGFontGetHMetricsPtr || (CGFontGetAscentPtr && CGFontGetDescentPtr && CGFontGetLeadingPtr))) _cairo_quartz_font_symbols_present = TRUE; _cairo_quartz_font_symbol_lookup_done = TRUE; } typedef struct _cairo_quartz_font_face cairo_quartz_font_face_t; typedef struct _cairo_quartz_scaled_font cairo_quartz_scaled_font_t; struct _cairo_quartz_scaled_font { cairo_scaled_font_t base; }; struct _cairo_quartz_font_face { cairo_font_face_t base; CGFontRef cgFont; }; /** ** font face backend **/ static void _cairo_quartz_font_face_destroy (void *abstract_face) { cairo_quartz_font_face_t *font_face = (cairo_quartz_font_face_t*) abstract_face; CGFontRelease (font_face->cgFont); } static cairo_status_t _cairo_quartz_font_face_scaled_font_create (void *abstract_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **font_out) { cairo_quartz_font_face_t *font_face = abstract_face; cairo_quartz_scaled_font_t *font = NULL; cairo_status_t status; cairo_font_extents_t fs_metrics; double ems; CGRect bbox; quartz_font_ensure_symbols(); if (!_cairo_quartz_font_symbols_present) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font = malloc(sizeof(cairo_quartz_scaled_font_t)); if (font == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memset (font, 0, sizeof(cairo_quartz_scaled_font_t)); status = _cairo_scaled_font_init (&font->base, &font_face->base, font_matrix, ctm, options, &cairo_quartz_scaled_font_backend); if (status) goto FINISH; ems = CGFontGetUnitsPerEmPtr (font_face->cgFont); /* initialize metrics */ if (CGFontGetFontBBoxPtr && CGFontGetAscentPtr) { fs_metrics.ascent = (CGFontGetAscentPtr (font_face->cgFont) / ems); fs_metrics.descent = - (CGFontGetDescentPtr (font_face->cgFont) / ems); fs_metrics.height = fs_metrics.ascent + fs_metrics.descent + (CGFontGetLeadingPtr (font_face->cgFont) / ems); bbox = CGFontGetFontBBoxPtr (font_face->cgFont); fs_metrics.max_x_advance = CGRectGetMaxX(bbox) / ems; fs_metrics.max_y_advance = 0.0; } else { CGGlyph wGlyph; UniChar u; quartz_CGFontMetrics *m; m = CGFontGetHMetricsPtr (font_face->cgFont); fs_metrics.ascent = (m->ascent / ems); fs_metrics.descent = - (m->descent / ems); fs_metrics.height = fs_metrics.ascent + fs_metrics.descent + (m->leading / ems); /* We kind of have to guess here; W's big, right? */ u = (UniChar) 'W'; CGFontGetGlyphsForUnicharsPtr (font_face->cgFont, &u, &wGlyph, 1); if (wGlyph && CGFontGetGlyphBBoxesPtr (font_face->cgFont, &wGlyph, 1, &bbox)) { fs_metrics.max_x_advance = CGRectGetMaxX(bbox) / ems; fs_metrics.max_y_advance = 0.0; } else { fs_metrics.max_x_advance = 0.0; fs_metrics.max_y_advance = 0.0; } } status = _cairo_scaled_font_set_metrics (&font->base, &fs_metrics); FINISH: if (status != CAIRO_STATUS_SUCCESS) { free (font); } else { *font_out = (cairo_scaled_font_t*) font; } return status; } static const cairo_font_face_backend_t _cairo_quartz_font_face_backend = { CAIRO_FONT_TYPE_QUARTZ, _cairo_quartz_font_face_destroy, _cairo_quartz_font_face_scaled_font_create }; /** * cairo_quartz_font_face_create_for_cgfont * @font: a #CGFontRef obtained through a method external to cairo. * * Creates a new font for the Quartz font backend based on a * #CGFontRef. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. * * Since: 1.6 */ cairo_font_face_t * cairo_quartz_font_face_create_for_cgfont (CGFontRef font) { cairo_quartz_font_face_t *font_face; quartz_font_ensure_symbols(); font_face = malloc (sizeof (cairo_quartz_font_face_t)); if (!font_face) { _cairo_error (CAIRO_STATUS_NO_MEMORY); return (cairo_font_face_t *)&_cairo_font_face_nil; } font_face->cgFont = CGFontRetain (font); _cairo_font_face_init (&font_face->base, &_cairo_quartz_font_face_backend); return &font_face->base; } /** ** scaled font backend **/ static cairo_quartz_font_face_t * _cairo_quartz_scaled_to_face (void *abstract_font) { cairo_quartz_scaled_font_t *sfont = (cairo_quartz_scaled_font_t*) abstract_font; cairo_font_face_t *font_face = cairo_scaled_font_get_font_face (&sfont->base); if (!font_face || font_face->backend->type != CAIRO_FONT_TYPE_QUARTZ) return NULL; return (cairo_quartz_font_face_t*) font_face; } static cairo_status_t _cairo_quartz_font_create_toy(cairo_toy_font_face_t *toy_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **font_out) { const char *family = toy_face->family; char *full_name = malloc(strlen(family) + 64); // give us a bit of room to tack on Bold, Oblique, etc. CFStringRef cgFontName = NULL; CGFontRef cgFont = NULL; int loop; cairo_status_t status; cairo_font_face_t *face; cairo_scaled_font_t *scaled_font; quartz_font_ensure_symbols(); if (!_cairo_quartz_font_symbols_present) return _cairo_error (CAIRO_STATUS_NO_MEMORY); /* handle CSS-ish faces */ if (!strcmp(family, "serif") || !strcmp(family, "Times Roman")) family = "Times"; else if (!strcmp(family, "sans-serif") || !strcmp(family, "sans")) family = "Helvetica"; else if (!strcmp(family, "cursive")) family = "Apple Chancery"; else if (!strcmp(family, "fantasy")) family = "Papyrus"; else if (!strcmp(family, "monospace") || !strcmp(family, "mono")) family = "Courier"; /* Try to build up the full name, e.g. "Helvetica Bold Oblique" first, * then drop the bold, then drop the slant, then drop both.. finally * just use "Helvetica". And if Helvetica doesn't exist, give up. */ for (loop = 0; loop < 5; loop++) { if (loop == 4) family = "Helvetica"; strcpy (full_name, family); if (loop < 3 && (loop & 1) == 0) { if (toy_face->weight == CAIRO_FONT_WEIGHT_BOLD) strcat (full_name, " Bold"); } if (loop < 3 && (loop & 2) == 0) { if (toy_face->slant == CAIRO_FONT_SLANT_ITALIC) strcat (full_name, " Italic"); else if (toy_face->slant == CAIRO_FONT_SLANT_OBLIQUE) strcat (full_name, " Oblique"); } if (CGFontCreateWithFontNamePtr) { cgFontName = CFStringCreateWithCString (NULL, full_name, kCFStringEncodingASCII); cgFont = CGFontCreateWithFontNamePtr (cgFontName); CFRelease (cgFontName); } else { cgFont = CGFontCreateWithNamePtr (full_name); } if (cgFont) break; } if (!cgFont) { /* Give up */ return CAIRO_STATUS_NO_MEMORY; } face = cairo_quartz_font_face_create_for_cgfont (cgFont); if (face->status) return face->status; status = _cairo_quartz_font_face_scaled_font_create (face, font_matrix, ctm, options, &scaled_font); cairo_font_face_destroy (face); if (status) return status; *font_out = scaled_font; return CAIRO_STATUS_SUCCESS; } static void _cairo_quartz_font_fini(void *abstract_font) { } #define INVALID_GLYPH 0x00 static inline CGGlyph _cairo_quartz_scaled_glyph_index (cairo_scaled_glyph_t *scaled_glyph) { unsigned long index = _cairo_scaled_glyph_index (scaled_glyph); if (index > 0xffff) return INVALID_GLYPH; return (CGGlyph) index; } static inline cairo_status_t _cairo_matrix_to_unit_quartz_matrix (const cairo_matrix_t *m, CGAffineTransform *txout, double *xout, double *yout) { CGAffineTransform transform; double xscale, yscale; cairo_status_t status; status = _cairo_matrix_compute_scale_factors (m, &xscale, &yscale, 1); if (status) return status; transform = CGAffineTransformMake (m->xx, - m->yx, - m->xy, m->yy, 0.0f, 0.0f); if (xout) *xout = xscale; if (yout) *yout = yscale; if (xscale) xscale = 1.0 / xscale; if (yscale) yscale = 1.0 / yscale; *txout = CGAffineTransformScale (transform, xscale, yscale); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_init_glyph_metrics (cairo_quartz_scaled_font_t *font, cairo_scaled_glyph_t *scaled_glyph) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); cairo_text_extents_t extents = {0, 0, 0, 0, 0, 0}; CGAffineTransform textMatrix; CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); int advance; CGRect bbox; double emscale = CGFontGetUnitsPerEmPtr (font_face->cgFont); double xscale, yscale; double xmin, ymin, xmax, ymax; if (glyph == INVALID_GLYPH) goto FAIL; if (!CGFontGetGlyphAdvancesPtr (font_face->cgFont, &glyph, 1, &advance) || !CGFontGetGlyphBBoxesPtr (font_face->cgFont, &glyph, 1, &bbox)) goto FAIL; status = _cairo_matrix_compute_scale_factors (&font->base.scale, &xscale, &yscale, 1); if (status) goto FAIL; bbox = CGRectMake (bbox.origin.x / emscale, bbox.origin.y / emscale, bbox.size.width / emscale, bbox.size.height / emscale); /* Should we want to always integer-align glyph extents, we can do so in this way */ #if 0 { CGAffineTransform textMatrix; textMatrix = CGAffineTransformMake (font->base.scale.xx, -font->base.scale.yx, -font->base.scale.xy, font->base.scale.yy, 0.0f, 0.0f); bbox = CGRectApplyAffineTransform (bbox, textMatrix); bbox = CGRectIntegral (bbox); bbox = CGRectApplyAffineTransform (bbox, CGAffineTransformInvert (textMatrix)); } #endif #if 0 fprintf (stderr, "[0x%04x] bbox: %f %f %f %f\n", glyph, bbox.origin.x / emscale, bbox.origin.y / emscale, bbox.size.width / emscale, bbox.size.height / emscale); #endif xmin = CGRectGetMinX(bbox); ymin = CGRectGetMinY(bbox); xmax = CGRectGetMaxX(bbox); ymax = CGRectGetMaxY(bbox); extents.x_bearing = xmin; extents.y_bearing = - ymax; extents.width = xmax - xmin; extents.height = ymax - ymin; extents.x_advance = (double) advance / emscale; extents.y_advance = 0.0; #if 0 fprintf (stderr, "[0x%04x] extents: bearings: %f %f dim: %f %f adv: %f\n\n", glyph, extents.x_bearing, extents.y_bearing, extents.width, extents.height, extents.x_advance); #endif FAIL: _cairo_scaled_glyph_set_metrics (scaled_glyph, &font->base, &extents); return status; } static void _cairo_quartz_path_apply_func (void *info, const CGPathElement *el) { cairo_path_fixed_t *path = (cairo_path_fixed_t *) info; switch (el->type) { case kCGPathElementMoveToPoint: _cairo_path_fixed_move_to (path, _cairo_fixed_from_double(el->points[0].x), _cairo_fixed_from_double(el->points[0].y)); break; case kCGPathElementAddLineToPoint: _cairo_path_fixed_line_to (path, _cairo_fixed_from_double(el->points[0].x), _cairo_fixed_from_double(el->points[0].y)); break; case kCGPathElementAddQuadCurveToPoint: { cairo_fixed_t fx, fy; double x, y; if (!_cairo_path_fixed_get_current_point (path, &fx, &fy)) fx = fy = 0; x = _cairo_fixed_to_double (fx); y = _cairo_fixed_to_double (fy); _cairo_path_fixed_curve_to (path, _cairo_fixed_from_double((x + el->points[0].x * 2.0) / 3.0), _cairo_fixed_from_double((y + el->points[0].y * 2.0) / 3.0), _cairo_fixed_from_double((el->points[0].x * 2.0 + el->points[1].x) / 3.0), _cairo_fixed_from_double((el->points[0].y * 2.0 + el->points[1].y) / 3.0), _cairo_fixed_from_double(el->points[1].x), _cairo_fixed_from_double(el->points[1].y)); } break; case kCGPathElementAddCurveToPoint: _cairo_path_fixed_curve_to (path, _cairo_fixed_from_double(el->points[0].x), _cairo_fixed_from_double(el->points[0].y), _cairo_fixed_from_double(el->points[1].x), _cairo_fixed_from_double(el->points[1].y), _cairo_fixed_from_double(el->points[2].x), _cairo_fixed_from_double(el->points[2].y)); break; case kCGPathElementCloseSubpath: _cairo_path_fixed_close_path (path); break; } } static cairo_int_status_t _cairo_quartz_init_glyph_path (cairo_quartz_scaled_font_t *font, cairo_scaled_glyph_t *scaled_glyph) { cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); CGAffineTransform textMatrix; CGPathRef glyphPath; cairo_path_fixed_t *path; if (glyph == INVALID_GLYPH) { _cairo_scaled_glyph_set_path (scaled_glyph, &font->base, _cairo_path_fixed_create()); return CAIRO_STATUS_SUCCESS; } textMatrix = CGAffineTransformMake (font->base.scale.xx, -font->base.scale.yx, -font->base.scale.xy, font->base.scale.yy, font->base.scale.x0, font->base.scale.y0); textMatrix = CGAffineTransformConcat (textMatrix, CGAffineTransformMake (1.0, 0.0, 0.0, -1.0, 0.0, 0.0)); glyphPath = CGFontGetGlyphPathPtr (font_face->cgFont, &textMatrix, 0, glyph); if (!glyphPath) return CAIRO_INT_STATUS_UNSUPPORTED; path = _cairo_path_fixed_create (); if (!path) { CGPathRelease (glyphPath); return _cairo_error(CAIRO_STATUS_NO_MEMORY); } CGPathApply (glyphPath, path, _cairo_quartz_path_apply_func); CGPathRelease (glyphPath); _cairo_scaled_glyph_set_path (scaled_glyph, &font->base, path); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_init_glyph_surface (cairo_quartz_scaled_font_t *font, cairo_scaled_glyph_t *scaled_glyph) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; cairo_quartz_font_face_t *font_face = _cairo_quartz_scaled_to_face(font); cairo_image_surface_t *surface = NULL; CGGlyph glyph = _cairo_quartz_scaled_glyph_index (scaled_glyph); int advance; CGRect bbox; double width, height; double xscale, yscale; double emscale = CGFontGetUnitsPerEmPtr (font_face->cgFont); CGColorSpaceRef gray; CGContextRef cgContext = NULL; CGAffineTransform textMatrix; CGRect glyphRect, glyphRectInt; CGPoint glyphOrigin; //fprintf (stderr, "scaled_glyph: %p surface: %p\n", scaled_glyph, scaled_glyph->surface); /* Create blank 2x2 image if we don't have this character. * Maybe we should draw a better missing-glyph slug or something, * but this is ok for now. */ if (glyph == INVALID_GLYPH) { surface = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_A8, 2, 2); status = cairo_surface_status ((cairo_surface_t *) surface); if (status) return status; _cairo_scaled_glyph_set_surface (scaled_glyph, &font->base, surface); return CAIRO_STATUS_SUCCESS; } if (!CGFontGetGlyphAdvancesPtr (font_face->cgFont, &glyph, 1, &advance) || !CGFontGetGlyphBBoxesPtr (font_face->cgFont, &glyph, 1, &bbox)) { return CAIRO_INT_STATUS_UNSUPPORTED; } status = _cairo_matrix_compute_scale_factors (&font->base.scale, &xscale, &yscale, 1); if (status) return status; textMatrix = CGAffineTransformMake (font->base.scale.xx, -font->base.scale.yx, -font->base.scale.xy, font->base.scale.yy, 0.0f, 0.0f); glyphRect = CGRectMake (bbox.origin.x / emscale, bbox.origin.y / emscale, bbox.size.width / emscale, bbox.size.height / emscale); glyphRect = CGRectApplyAffineTransform (glyphRect, textMatrix); /* Round the rectangle outwards, so that we don't have to deal * with non-integer-pixel origins or dimensions. */ glyphRectInt = CGRectIntegral (glyphRect); #if 0 fprintf (stderr, "glyphRect[o]: %f %f %f %f\n", glyphRect.origin.x, glyphRect.origin.y, glyphRect.size.width, glyphRect.size.height); fprintf (stderr, "glyphRectInt: %f %f %f %f\n", glyphRectInt.origin.x, glyphRectInt.origin.y, glyphRectInt.size.width, glyphRectInt.size.height); #endif glyphOrigin = glyphRectInt.origin; //textMatrix = CGAffineTransformConcat (textMatrix, CGAffineTransformInvert (ctm)); width = glyphRectInt.size.width; height = glyphRectInt.size.height; //fprintf (stderr, "glyphRect[n]: %f %f %f %f\n", glyphRect.origin.x, glyphRect.origin.y, glyphRect.size.width, glyphRect.size.height); surface = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); if (surface->base.status) return surface->base.status; gray = CGColorSpaceCreateDeviceGray (); cgContext = CGBitmapContextCreate (surface->data, surface->width, surface->height, 8, surface->stride, gray, kCGImageAlphaNone); CGColorSpaceRelease (gray); CGContextSetFont (cgContext, font_face->cgFont); CGContextSetFontSize (cgContext, 1.0); CGContextSetTextMatrix (cgContext, textMatrix); CGContextClearRect (cgContext, CGRectMake (0.0f, 0.0f, width, height)); if (font->base.options.antialias == CAIRO_ANTIALIAS_NONE) CGContextSetShouldAntialias (cgContext, false); CGContextSetRGBFillColor (cgContext, 1.0, 1.0, 1.0, 1.0); CGContextShowGlyphsAtPoint (cgContext, - glyphOrigin.x, - glyphOrigin.y, &glyph, 1); CGContextRelease (cgContext); cairo_surface_set_device_offset (&surface->base, - glyphOrigin.x, height + glyphOrigin.y); _cairo_scaled_glyph_set_surface (scaled_glyph, &font->base, surface); return status; } static cairo_int_status_t _cairo_quartz_font_scaled_glyph_init (void *abstract_font, cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_glyph_info_t info) { cairo_quartz_scaled_font_t *font = (cairo_quartz_scaled_font_t *) abstract_font; cairo_int_status_t status = CAIRO_STATUS_SUCCESS; if (!status && (info & CAIRO_SCALED_GLYPH_INFO_METRICS)) status = _cairo_quartz_init_glyph_metrics (font, scaled_glyph); if (!status && (info & CAIRO_SCALED_GLYPH_INFO_PATH)) status = _cairo_quartz_init_glyph_path (font, scaled_glyph); if (!status && (info & CAIRO_SCALED_GLYPH_INFO_SURFACE)) status = _cairo_quartz_init_glyph_surface (font, scaled_glyph); return status; } static unsigned long _cairo_quartz_ucs4_to_index (void *abstract_font, uint32_t ucs4) { cairo_quartz_scaled_font_t *font = (cairo_quartz_scaled_font_t*) abstract_font; cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(font); UniChar u = (UniChar) ucs4; CGGlyph glyph; CGFontGetGlyphsForUnicharsPtr (ffont->cgFont, &u, &glyph, 1); return glyph; } const cairo_scaled_font_backend_t cairo_quartz_scaled_font_backend = { CAIRO_FONT_TYPE_QUARTZ, _cairo_quartz_font_create_toy, _cairo_quartz_font_fini, _cairo_quartz_font_scaled_glyph_init, NULL, /* text_to_glyphs */ _cairo_quartz_ucs4_to_index, NULL, /* show_glyphs */ NULL, /* load_truetype_table */ NULL, /* map_glyphs_to_unicode */ }; /* * private methods that the quartz surface uses */ CGFontRef _cairo_quartz_scaled_font_get_cg_font_ref (cairo_scaled_font_t *abstract_font) { cairo_quartz_font_face_t *ffont = _cairo_quartz_scaled_to_face(abstract_font); return ffont->cgFont; } /* * compat with old ATSUI backend */ /** * cairo_quartz_font_face_create_for_atsu_font_id * @font_id: an ATSUFontID for the font. * * Creates a new font for the Quartz font backend based on an * #ATSUFontID. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. * * Since: 1.6 **/ cairo_font_face_t * cairo_quartz_font_face_create_for_atsu_font_id (ATSUFontID font_id) { ATSFontRef atsFont = FMGetATSFontRefFromFont (font_id); CGFontRef cgFont = CGFontCreateWithPlatformFont (&atsFont); return cairo_quartz_font_face_create_for_cgfont (cgFont); } /* This is the old name for the above function, exported for compat purposes */ cairo_font_face_t *cairo_atsui_font_face_create_for_atsu_font_id (ATSUFontID font_id); cairo_font_face_t * cairo_atsui_font_face_create_for_atsu_font_id (ATSUFontID font_id) { return cairo_quartz_font_face_create_for_atsu_font_id (font_id); } libgdiplus-2.11/cairo/src/cairo-paginated-private.h0000664000175000017500000001511612225470167017264 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #ifndef CAIRO_PAGINATED_H #define CAIRO_PAGINATED_H #include "cairoint.h" struct _cairo_paginated_surface_backend { /* Optional. Will be called once for each page. * * Note: With respect to the order of drawing operations as seen * by the target, this call will occur before any drawing * operations for the relevant page. However, with respect to the * function calls as made by the user, this call will be *after* * any drawing operations for the page, (that is, it will occur * during the user's call to cairo_show_page or cairo_copy_page). */ cairo_warn cairo_int_status_t (*start_page) (void *surface); /* Required. Will be called twice for each page, once with an * argument of CAIRO_PAGINATED_MODE_ANALYZE and once with * CAIRO_PAGINATED_MODE_RENDER. See more details in the * documentation for _cairo_paginated_surface_create below. */ void (*set_paginated_mode) (void *surface, cairo_paginated_mode_t mode); /* Optional. Specifies the smallest box that encloses all objects * on the page. Will be called at the end of the ANALYZE phase but * before the mode is changed to RENDER. */ cairo_warn cairo_int_status_t (*set_bounding_box) (void *surface, cairo_box_t *bbox); }; /* A #cairo_paginated_surface_t provides a very convenient wrapper that * is well-suited for doing the analysis common to most surfaces that * have paginated output, (that is, things directed at printers, or * for saving content in files such as PostScript or PDF files). * * To use the paginated surface, you'll first need to create your * 'real' surface using _cairo_surface_init() and the standard * #cairo_surface_backend_t. Then you also call * _cairo_paginated_surface_create which takes its own, much simpler, * #cairo_paginated_surface_backend_t. You are free to return the result * of _cairo_paginated_surface_create() from your public * cairo__surface_create. The paginated backend will be careful * to not let the user see that they really got a "wrapped" * surface. See test-paginated-surface.c for a fairly minimal example * of a paginated-using surface. That should be a reasonable example * to follow. * * What the paginated surface does is first save all drawing * operations for a page into a meta-surface. Then when the user calls * cairo_show_page, the paginated surface performs the following * sequence of operations (using the backend functions passed to * cairo_paginated_surface_create): * * 1. Calls start_page (if non %NULL). At this point, it is appropriate * for the target to emit any page-specific header information into * its output. * * 2. Calls set_paginated_mode with an argument of CAIRO_PAGINATED_MODE_ANALYZE * * 3. Replays the meta-surface to the target surface, (with an * analysis surface inserted between which watches the return value * from each operation). This analysis stage is used to decide which * operations will require fallbacks. * * 4. Calls set_bounding_box to provide the target surface with the * tight bounding box of the page. * * 5. Calls set_paginated_mode with an argument of CAIRO_PAGINATED_MODE_RENDER * * 6. Replays a subset of the meta-surface operations to the target surface * * 7. Calls set_paginated_mode with an argument of CAIRO_PAGINATED_MODE_FALLBACK * * 8. Replays the remaining operations to an image surface, sets an * appropriate clip on the target, then paints the resulting image * surface to the target. * * So, the target will see drawing operations during three separate * stages, (ANALYZE, RENDER and FALLBACK). During the ANALYZE phase * the target should not actually perform any rendering, (for example, * if performing output to a file, no output should be generated * during this stage). Instead the drawing functions simply need to * return %CAIRO_STATUS_SUCCESS or %CAIRO_INT_STATUS_UNSUPPORTED to * indicate whether rendering would be supported. And it should do * this as quickly as possible. The FALLBACK phase allows the surface * to distinguish fallback images from native rendering in case they * need to be handled as a special case. * * Note: The paginated surface layer assumes that the target surface * is "blank" by default at the beginning of each page, without any * need for an explicit erase operation, (as opposed to an image * surface, for example, which might have uninitialized content * originally). As such, it optimizes away CLEAR operations that * happen at the beginning of each page---the target surface will not * even see these operations. */ cairo_private cairo_surface_t * _cairo_paginated_surface_create (cairo_surface_t *target, cairo_content_t content, int width, int height, const cairo_paginated_surface_backend_t *backend); cairo_private cairo_surface_t * _cairo_paginated_surface_get_target (cairo_surface_t *surface); cairo_private cairo_bool_t _cairo_surface_is_paginated (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_paginated_surface_set_size (cairo_surface_t *surface, int width, int height); #endif /* CAIRO_PAGINATED_H */ libgdiplus-2.11/cairo/src/cairo-scaled-font-private.h0000664000175000017500000001066512225470167017533 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_SCALED_FONT_PRIVATE_H #define CAIRO_SCALED_FONT_PRIVATE_H #include "cairo.h" #include "cairo-types-private.h" #include "cairo-mutex-type-private.h" #include "cairo-reference-count-private.h" struct _cairo_scaled_font { /* For most cairo objects, the rule for multiple threads is that * the user is responsible for any locking if the same object is * manipulated from multiple threads simultaneously. * * However, with the caching that cairo does for scaled fonts, a * user can easily end up with the same cairo_scaled_font object * being manipulated from multiple threads without the user ever * being aware of this, (and in fact, unable to control it). * * So, as a special exception, the cairo implementation takes care * of all locking needed for cairo_scaled_font_t. Most of what is * in the scaled font is immutable, (which is what allows for the * sharing in the first place). The things that are modified and * the locks protecting them are as follows: * * 1. The reference count (scaled_font->ref_count) * * Modifications to the reference count are protected by the * _cairo_scaled_font_map_mutex. This is because the reference * count of a scaled font is intimately related with the font * map itself, (and the magic holdovers array). * * 2. The cache of glyphs (scaled_font->glyphs) * 3. The backend private data (scaled_font->surface_backend, * scaled_font->surface_private) * * Modifications to these fields are protected with locks on * scaled_font->mutex in the generic scaled_font code. */ /* must be first to be stored in a hash table */ cairo_hash_entry_t hash_entry; /* useful bits for _cairo_scaled_font_nil */ cairo_status_t status; cairo_reference_count_t ref_count; cairo_user_data_array_t user_data; /* hash key members */ cairo_font_face_t *font_face; /* may be NULL */ cairo_matrix_t font_matrix; /* font space => user space */ cairo_matrix_t ctm; /* user space => device space */ cairo_font_options_t options; /* "live" scaled_font members */ cairo_matrix_t scale; /* font space => device space */ cairo_matrix_t scale_inverse; /* device space => font space */ cairo_font_extents_t extents; /* user space */ /* The mutex protects modification to all subsequent fields. */ cairo_mutex_t mutex; cairo_cache_t *glyphs; /* glyph index -> cairo_scaled_glyph_t */ /* * One surface backend may store data in each glyph. * Whichever surface manages to store its pointer here * first gets to store data in each glyph */ const cairo_surface_backend_t *surface_backend; void *surface_private; /* font backend managing this scaled font */ const cairo_scaled_font_backend_t *backend; }; #endif /* CAIRO_SCALED_FONT_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-deprecated.h0000664000175000017500000002241212225470167015755 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_DEPRECATED_H #define CAIRO_DEPRECATED_H /* The %CAIRO_FORMAT_RGB16_565 value was added in cairo 1.2.0 as part * of fixing cairo's xlib backend to work with X servers advertising a * 16-bit, 565 visual. But as it turned out, adding this format to * #cairo_format_t was not necessary, and was a mistake, (cairo's xlib * backend can work fine with 16-bit visuals in the same way it works * with BGR visuals without any BGR formats in * #cairo_format_t). * * Additionally, the support for the RGB16_565 format was never * completely implemented. So while this format value is currently * deprecated, it may eventually acquire complete support in the future. */ #define CAIRO_FORMAT_RGB16_565 4 #define CAIRO_FONT_TYPE_ATSUI CAIRO_FONT_TYPE_QUARTZ #ifndef _CAIROINT_H_ /* Obsolete functions. These definitions exist to coerce the compiler * into providing a little bit of guidance with its error * messages. The idea is to help users port their old code without * having to dig through lots of documentation. * * The first set of REPLACED_BY functions is for functions whose names * have just been changed. So fixing these up is mechanical, (and * automated by means of the cairo/util/cairo-api-update script. * * The second set of DEPRECATED_BY functions is for functions where * the replacement is used in a different way, (ie. different * arguments, multiple functions instead of one, etc). Fixing these up * will require a bit more work on the user's part, (and hopefully we * can get cairo-api-update to find these and print some guiding * information). */ #define cairo_current_font_extents cairo_current_font_extents_REPLACED_BY_cairo_font_extents #define cairo_get_font_extents cairo_get_font_extents_REPLACED_BY_cairo_font_extents #define cairo_current_operator cairo_current_operator_REPLACED_BY_cairo_get_operator #define cairo_current_tolerance cairo_current_tolerance_REPLACED_BY_cairo_get_tolerance #define cairo_current_point cairo_current_point_REPLACED_BY_cairo_get_current_point #define cairo_current_fill_rule cairo_current_fill_rule_REPLACED_BY_cairo_get_fill_rule #define cairo_current_line_width cairo_current_line_width_REPLACED_BY_cairo_get_line_width #define cairo_current_line_cap cairo_current_line_cap_REPLACED_BY_cairo_get_line_cap #define cairo_current_line_join cairo_current_line_join_REPLACED_BY_cairo_get_line_join #define cairo_current_miter_limit cairo_current_miter_limit_REPLACED_BY_cairo_get_miter_limit #define cairo_current_matrix cairo_current_matrix_REPLACED_BY_cairo_get_matrix #define cairo_current_target_surface cairo_current_target_surface_REPLACED_BY_cairo_get_target #define cairo_get_status cairo_get_status_REPLACED_BY_cairo_status #define cairo_concat_matrix cairo_concat_matrix_REPLACED_BY_cairo_transform #define cairo_scale_font cairo_scale_font_REPLACED_BY_cairo_set_font_size #define cairo_select_font cairo_select_font_REPLACED_BY_cairo_select_font_face #define cairo_transform_font cairo_transform_font_REPLACED_BY_cairo_set_font_matrix #define cairo_transform_point cairo_transform_point_REPLACED_BY_cairo_user_to_device #define cairo_transform_distance cairo_transform_distance_REPLACED_BY_cairo_user_to_device_distance #define cairo_inverse_transform_point cairo_inverse_transform_point_REPLACED_BY_cairo_device_to_user #define cairo_inverse_transform_distance cairo_inverse_transform_distance_REPLACED_BY_cairo_device_to_user_distance #define cairo_init_clip cairo_init_clip_REPLACED_BY_cairo_reset_clip #define cairo_surface_create_for_image cairo_surface_create_for_image_REPLACED_BY_cairo_image_surface_create_for_data #define cairo_default_matrix cairo_default_matrix_REPLACED_BY_cairo_identity_matrix #define cairo_matrix_set_affine cairo_matrix_set_affine_REPLACED_BY_cairo_matrix_init #define cairo_matrix_set_identity cairo_matrix_set_identity_REPLACED_BY_cairo_matrix_init_identity #define cairo_pattern_add_color_stop cairo_pattern_add_color_stop_REPLACED_BY_cairo_pattern_add_color_stop_rgba #define cairo_set_rgb_color cairo_set_rgb_color_REPLACED_BY_cairo_set_source_rgb #define cairo_set_pattern cairo_set_pattern_REPLACED_BY_cairo_set_source #define cairo_xlib_surface_create_for_pixmap_with_visual cairo_xlib_surface_create_for_pixmap_with_visual_REPLACED_BY_cairo_xlib_surface_create #define cairo_xlib_surface_create_for_window_with_visual cairo_xlib_surface_create_for_window_with_visual_REPLACED_BY_cairo_xlib_surface_create #define cairo_xcb_surface_create_for_pixmap_with_visual cairo_xcb_surface_create_for_pixmap_with_visual_REPLACED_BY_cairo_xcb_surface_create #define cairo_xcb_surface_create_for_window_with_visual cairo_xcb_surface_create_for_window_with_visual_REPLACED_BY_cairo_xcb_surface_create #define cairo_ps_surface_set_dpi cairo_ps_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution #define cairo_pdf_surface_set_dpi cairo_pdf_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution #define cairo_svg_surface_set_dpi cairo_svg_surface_set_dpi_REPLACED_BY_cairo_surface_set_fallback_resolution #define cairo_atsui_font_face_create_for_atsu_font_id cairo_atsui_font_face_create_for_atsu_font_id_REPLACED_BY_cairo_quartz_font_face_create_for_atsu_font_id #define cairo_current_path cairo_current_path_DEPRECATED_BY_cairo_copy_path #define cairo_current_path_flat cairo_current_path_flat_DEPRECATED_BY_cairo_copy_path_flat #define cairo_get_path cairo_get_path_DEPRECATED_BY_cairo_copy_path #define cairo_get_path_flat cairo_get_path_flat_DEPRECATED_BY_cairo_get_path_flat #define cairo_set_alpha cairo_set_alpha_DEPRECATED_BY_cairo_set_source_rgba_OR_cairo_paint_with_alpha #define cairo_show_surface cairo_show_surface_DEPRECATED_BY_cairo_set_source_surface_AND_cairo_paint #define cairo_copy cairo_copy_DEPRECATED_BY_cairo_create_AND_MANY_INDIVIDUAL_FUNCTIONS #define cairo_surface_set_repeat cairo_surface_set_repeat_DEPRECATED_BY_cairo_pattern_set_extend #define cairo_surface_set_matrix cairo_surface_set_matrix_DEPRECATED_BY_cairo_pattern_set_matrix #define cairo_surface_get_matrix cairo_surface_get_matrix_DEPRECATED_BY_cairo_pattern_get_matrix #define cairo_surface_set_filter cairo_surface_set_filter_DEPRECATED_BY_cairo_pattern_set_filter #define cairo_surface_get_filter cairo_surface_get_filter_DEPRECATED_BY_cairo_pattern_get_filter #define cairo_matrix_create cairo_matrix_create_DEPRECATED_BY_cairo_matrix_t #define cairo_matrix_destroy cairo_matrix_destroy_DEPRECATED_BY_cairo_matrix_t #define cairo_matrix_copy cairo_matrix_copy_DEPRECATED_BY_cairo_matrix_t #define cairo_matrix_get_affine cairo_matrix_get_affine_DEPRECATED_BY_cairo_matrix_t #define cairo_set_target_surface cairo_set_target_surface_DEPRECATED_BY_cairo_create #define cairo_set_target_glitz cairo_set_target_glitz_DEPRECATED_BY_cairo_glitz_surface_create #define cairo_set_target_image cairo_set_target_image_DEPRECATED_BY_cairo_image_surface_create_for_data #define cairo_set_target_pdf cairo_set_target_pdf_DEPRECATED_BY_cairo_pdf_surface_create #define cairo_set_target_png cairo_set_target_png_DEPRECATED_BY_cairo_surface_write_to_png #define cairo_set_target_ps cairo_set_target_ps_DEPRECATED_BY_cairo_ps_surface_create #define cairo_set_target_quartz cairo_set_target_quartz_DEPRECATED_BY_cairo_quartz_surface_create #define cairo_set_target_win32 cairo_set_target_win32_DEPRECATED_BY_cairo_win32_surface_create #define cairo_set_target_xcb cairo_set_target_xcb_DEPRECATED_BY_cairo_xcb_surface_create #define cairo_set_target_drawable cairo_set_target_drawable_DEPRECATED_BY_cairo_xlib_surface_create #define cairo_get_status_string cairo_get_status_string_DEPRECATED_BY_cairo_status_AND_cairo_status_to_string #define cairo_status_string cairo_status_string_DEPRECATED_BY_cairo_status_AND_cairo_status_to_string #endif #endif /* CAIRO_DEPRECATED_H */ libgdiplus-2.11/cairo/src/cairo-gstate-private.h0000664000175000017500000000465312225470167016623 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_GSTATE_PRIVATE_H #define CAIRO_GSTATE_PRIVATE_H #include "cairo-clip-private.h" struct _cairo_gstate { cairo_operator_t op; double tolerance; cairo_antialias_t antialias; cairo_stroke_style_t stroke_style; cairo_fill_rule_t fill_rule; cairo_font_face_t *font_face; cairo_scaled_font_t *scaled_font; /* Specific to the current CTM */ cairo_matrix_t font_matrix; cairo_font_options_t font_options; cairo_clip_t clip; cairo_surface_t *target; /* The target to which all rendering is directed */ cairo_surface_t *parent_target; /* The previous target which was receiving rendering */ cairo_surface_t *original_target; /* The original target the initial gstate was created with */ cairo_matrix_t ctm; cairo_matrix_t ctm_inverse; cairo_matrix_t source_ctm_inverse; /* At the time ->source was set */ cairo_pattern_t *source; struct _cairo_gstate *next; }; #endif /* CAIRO_GSTATE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-win32-printing-surface.c0000664000175000017500000013715412225470167020102 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Adrian Johnson. * * Contributor(s): * Adrian Johnson * Vladimir Vukicevic */ #define WIN32_LEAN_AND_MEAN /* We require Windows 2000 features such as ETO_PDY */ #if !defined(WINVER) || (WINVER < 0x0500) # define WINVER 0x0500 #endif #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) # define _WIN32_WINNT 0x0500 #endif #include "cairoint.h" #include "cairo-paginated-private.h" #include "cairo-clip-private.h" #include "cairo-win32-private.h" #include "cairo-meta-surface-private.h" #include #if !defined(POSTSCRIPT_IDENTIFY) # define POSTSCRIPT_IDENTIFY 0x1015 #endif #if !defined(PSIDENT_GDICENTRIC) # define PSIDENT_GDICENTRIC 0x0000 #endif #if !defined(GET_PS_FEATURESETTING) # define GET_PS_FEATURESETTING 0x1019 #endif #if !defined(FEATURESETTING_PSLEVEL) # define FEATURESETTING_PSLEVEL 0x0002 #endif #if !defined(GRADIENT_FILL_RECT_H) # define GRADIENT_FILL_RECT_H 0x00 #endif #define PELS_72DPI ((LONG)(72. / 0.0254)) static const cairo_surface_backend_t cairo_win32_printing_surface_backend; static const cairo_paginated_surface_backend_t cairo_win32_surface_paginated_backend; static void _cairo_win32_printing_surface_init_ps_mode (cairo_win32_surface_t *surface) { DWORD word; INT ps_feature, ps_level; word = PSIDENT_GDICENTRIC; if (ExtEscape (surface->dc, POSTSCRIPT_IDENTIFY, sizeof(DWORD), (char *)&word, 0, (char *)NULL) <= 0) return; ps_feature = FEATURESETTING_PSLEVEL; if (ExtEscape (surface->dc, GET_PS_FEATURESETTING, sizeof(INT), (char *)&ps_feature, sizeof(INT), (char *)&ps_level) <= 0) return; if (ps_level >= 3) surface->flags |= CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT; } static cairo_int_status_t analyze_surface_pattern_transparency (cairo_surface_pattern_t *pattern) { cairo_image_surface_t *image; void *image_extra; cairo_int_status_t status; int x, y; status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra); if (status) return status; if (image->base.status) return image->base.status; if (image->format == CAIRO_FORMAT_RGB24) { status = CAIRO_STATUS_SUCCESS; goto RELEASE_SOURCE; } if (image->format != CAIRO_FORMAT_ARGB32) { /* If the surface does not support the image format, assume * that it does have alpha. The image will be converted to * rgb24 when the surface blends the image into the page * color to remove the transparency. */ status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; goto RELEASE_SOURCE; } for (y = 0; y < image->height; y++) { int a; uint32_t *pixel = (uint32_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel++) { a = (*pixel & 0xff000000) >> 24; if (a != 255) { status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; goto RELEASE_SOURCE; } } } status = CAIRO_STATUS_SUCCESS; RELEASE_SOURCE: _cairo_surface_release_source_image (pattern->surface, image, image_extra); return status; } static cairo_bool_t surface_pattern_supported (const cairo_surface_pattern_t *pattern) { cairo_extend_t extend; if (_cairo_surface_is_meta (pattern->surface)) return TRUE; if (cairo_surface_get_type (pattern->surface) != CAIRO_SURFACE_TYPE_WIN32 && pattern->surface->backend->acquire_source_image == NULL) { return FALSE; } extend = cairo_pattern_get_extend ((cairo_pattern_t*)&pattern->base); switch (extend) { case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_REPEAT: case CAIRO_EXTEND_REFLECT: /* There's no point returning FALSE for EXTEND_PAD, as the image * surface does not currently implement it either */ case CAIRO_EXTEND_PAD: return TRUE; } ASSERT_NOT_REACHED; return FALSE; } static cairo_bool_t pattern_supported (cairo_win32_surface_t *surface, const cairo_pattern_t *pattern) { if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) return TRUE; if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) return surface_pattern_supported ((const cairo_surface_pattern_t *) pattern); if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) return surface->flags & CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT; return FALSE; } static cairo_int_status_t _cairo_win32_printing_surface_analyze_operation (cairo_win32_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern) { if (! pattern_supported (surface, pattern)) return CAIRO_INT_STATUS_UNSUPPORTED; if (!(op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_CLEAR)) return CAIRO_INT_STATUS_UNSUPPORTED; if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; if ( _cairo_surface_is_meta (surface_pattern->surface)) return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; } if (op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_CLEAR) return CAIRO_STATUS_SUCCESS; /* CAIRO_OPERATOR_OVER is only supported for opaque patterns. If * the pattern contains transparency, we return * CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY to the analysis * surface. If the analysis surface determines that there is * anything drawn under this operation, a fallback image will be * used. Otherwise the operation will be replayed during the * render stage and we blend the transarency into the white * background to convert the pattern to opaque. */ if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; return analyze_surface_pattern_transparency (surface_pattern); } if (_cairo_pattern_is_opaque (pattern)) return CAIRO_STATUS_SUCCESS; else return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; } static cairo_bool_t _cairo_win32_printing_surface_operation_supported (cairo_win32_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern) { if (_cairo_win32_printing_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED) return TRUE; else return FALSE; } static void _cairo_win32_printing_surface_init_clear_color (cairo_win32_surface_t *surface, cairo_solid_pattern_t *color) { if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) _cairo_pattern_init_solid (color, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); else _cairo_pattern_init_solid (color, CAIRO_COLOR_BLACK, CAIRO_CONTENT_COLOR); } static COLORREF _cairo_win32_printing_surface_flatten_transparency (cairo_win32_surface_t *surface, const cairo_color_t *color) { COLORREF c; BYTE red, green, blue; red = color->red_short >> 8; green = color->green_short >> 8; blue = color->blue_short >> 8; if (!CAIRO_COLOR_IS_OPAQUE(color)) { if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) { /* Blend into white */ uint8_t one_minus_alpha = 255 - (color->alpha_short >> 8); red = (color->red_short >> 8) + one_minus_alpha; green = (color->green_short >> 8) + one_minus_alpha; blue = (color->blue_short >> 8) + one_minus_alpha; } else { /* Blend into black */ red = (color->red_short >> 8); green = (color->green_short >> 8); blue = (color->blue_short >> 8); } } c = RGB (red, green, blue); return c; } static cairo_status_t _cairo_win32_printing_surface_select_solid_brush (cairo_win32_surface_t *surface, cairo_pattern_t *source) { cairo_solid_pattern_t *pattern = (cairo_solid_pattern_t *) source; COLORREF color; color = _cairo_win32_printing_surface_flatten_transparency (surface, &pattern->color); surface->brush = CreateSolidBrush (color); if (!surface->brush) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_select_solid_brush(CreateSolidBrush)"); surface->old_brush = SelectObject (surface->dc, surface->brush); return CAIRO_STATUS_SUCCESS; } static void _cairo_win32_printing_surface_done_solid_brush (cairo_win32_surface_t *surface) { if (surface->old_brush) { SelectObject (surface->dc, surface->old_brush); DeleteObject (surface->brush); surface->old_brush = NULL; } } static cairo_status_t _cairo_win32_printing_surface_get_ctm_clip_box (cairo_win32_surface_t *surface, RECT *clip) { XFORM xform; _cairo_matrix_to_win32_xform (&surface->ctm, &xform); if (!SetWorldTransform (surface->dc, &xform)) return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_get_clip_box:SetWorldTransform"); GetClipBox (surface->dc, clip); if (!ModifyWorldTransform (surface->dc, &xform, MWT_IDENTITY)) return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_get_clip_box:ModifyWorldTransform"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_printing_surface_paint_solid_pattern (cairo_win32_surface_t *surface, cairo_pattern_t *pattern) { RECT clip; cairo_status_t status; GetClipBox (surface->dc, &clip); status = _cairo_win32_printing_surface_select_solid_brush (surface, pattern); if (status) return status; FillRect (surface->dc, &clip, surface->brush); _cairo_win32_printing_surface_done_solid_brush (surface); return 0; } static cairo_status_t _cairo_win32_printing_surface_paint_meta_pattern (cairo_win32_surface_t *surface, cairo_surface_pattern_t *pattern) { cairo_content_t old_content; cairo_matrix_t old_ctm; cairo_bool_t old_has_ctm; cairo_rectangle_int_t meta_extents; cairo_status_t status; cairo_extend_t extend; cairo_matrix_t p2d; XFORM xform; int x_tile, y_tile, left, right, top, bottom; RECT clip; cairo_surface_t *meta_surface = pattern->surface; extend = cairo_pattern_get_extend (&pattern->base); p2d = pattern->base.matrix; status = cairo_matrix_invert (&p2d); /* _cairo_pattern_set_matrix guarantees invertibility */ assert (status == CAIRO_STATUS_SUCCESS); old_ctm = surface->ctm; old_has_ctm = surface->has_ctm; cairo_matrix_multiply (&p2d, &p2d, &surface->ctm); surface->ctm = p2d; SaveDC (surface->dc); _cairo_matrix_to_win32_xform (&p2d, &xform); status = _cairo_surface_get_extents (meta_surface, &meta_extents); if (status) return status; status = _cairo_win32_printing_surface_get_ctm_clip_box (surface, &clip); if (status) return status; if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { left = (int) floor((double)clip.left/meta_extents.width); right = (int) ceil((double)clip.right/meta_extents.width); top = (int) floor((double)clip.top/meta_extents.height); bottom = (int) ceil((double)clip.bottom/meta_extents.height); } else { left = 0; right = 1; top = 0; bottom = 1; } old_content = surface->content; if (cairo_surface_get_content (meta_surface) == CAIRO_CONTENT_COLOR) { cairo_pattern_t *source; cairo_solid_pattern_t black; surface->content = CAIRO_CONTENT_COLOR; _cairo_pattern_init_solid (&black, CAIRO_COLOR_BLACK, CAIRO_CONTENT_COLOR); source = (cairo_pattern_t*) &black; _cairo_win32_printing_surface_paint_solid_pattern (surface, source); } for (y_tile = top; y_tile < bottom; y_tile++) { for (x_tile = left; x_tile < right; x_tile++) { cairo_matrix_t m; double x, y; SaveDC (surface->dc); m = p2d; cairo_matrix_translate (&m, x_tile*meta_extents.width, y_tile*meta_extents.height); if (extend == CAIRO_EXTEND_REFLECT) { if (x_tile % 2) { cairo_matrix_translate (&m, meta_extents.width, 0); cairo_matrix_scale (&m, -1, 1); } if (y_tile % 2) { cairo_matrix_translate (&m, 0, meta_extents.height); cairo_matrix_scale (&m, 1, -1); } } surface->ctm = m; surface->has_ctm = !_cairo_matrix_is_identity (&surface->ctm); /* Set clip path around bbox of the pattern. */ BeginPath (surface->dc); x = 0; y = 0; cairo_matrix_transform_point (&surface->ctm, &x, &y); MoveToEx (surface->dc, (int) x, (int) y, NULL); x = meta_extents.width; y = 0; cairo_matrix_transform_point (&surface->ctm, &x, &y); LineTo (surface->dc, (int) x, (int) y); x = meta_extents.width; y = meta_extents.height; cairo_matrix_transform_point (&surface->ctm, &x, &y); LineTo (surface->dc, (int) x, (int) y); x = 0; y = meta_extents.height; cairo_matrix_transform_point (&surface->ctm, &x, &y); LineTo (surface->dc, (int) x, (int) y); CloseFigure (surface->dc); EndPath (surface->dc); SelectClipPath (surface->dc, RGN_AND); SaveDC (surface->dc); /* Allow clip path to be reset during replay */ status = _cairo_meta_surface_replay_region (meta_surface, &surface->base, CAIRO_META_REGION_NATIVE); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); /* Restore both the clip save and our earlier path SaveDC */ RestoreDC (surface->dc, -2); if (status) return status; } } surface->content = old_content; surface->ctm = old_ctm; surface->has_ctm = old_has_ctm; RestoreDC (surface->dc, -1); return status; } static cairo_status_t _cairo_win32_printing_surface_paint_image_pattern (cairo_win32_surface_t *surface, cairo_surface_pattern_t *pattern) { cairo_status_t status; cairo_extend_t extend; cairo_surface_t *pat_surface; cairo_surface_attributes_t pat_attr; cairo_image_surface_t *image; void *image_extra; cairo_surface_t *opaque_surface; cairo_pattern_union_t opaque_pattern; cairo_image_surface_t *opaque_image = NULL; BITMAPINFO bi; cairo_matrix_t m; int oldmode; XFORM xform; int x_tile, y_tile, left, right, top, bottom; RECT clip; const cairo_color_t *background_color; /* If we can't use StretchDIBits with this surface, we can't do anything * here. */ if (!(surface->flags & CAIRO_WIN32_SURFACE_CAN_STRETCHDIB)) return CAIRO_INT_STATUS_UNSUPPORTED; if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) background_color = CAIRO_COLOR_WHITE; else background_color = CAIRO_COLOR_BLACK; extend = cairo_pattern_get_extend (&pattern->base); status = _cairo_pattern_acquire_surface ((cairo_pattern_t *)pattern, (cairo_surface_t *)surface, 0, 0, -1, -1, &pat_surface, &pat_attr); if (status) return status; status = _cairo_surface_acquire_source_image (pat_surface, &image, &image_extra); if (status) goto FINISH; if (image->base.status) { status = image->base.status; goto FINISH2; } if (image->width == 0 || image->height == 0) { status = CAIRO_STATUS_SUCCESS; goto FINISH2; } if (image->format != CAIRO_FORMAT_RGB24) { opaque_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, image->width, image->height); if (opaque_surface->status) { status = opaque_surface->status; goto FINISH3; } _cairo_pattern_init_for_surface (&opaque_pattern.surface, &image->base); status = _cairo_surface_fill_rectangle (opaque_surface, CAIRO_OPERATOR_SOURCE, background_color, 0, 0, image->width, image->height); if (status) { _cairo_pattern_fini (&opaque_pattern.base); goto FINISH3; } status = _cairo_surface_composite (CAIRO_OPERATOR_OVER, &opaque_pattern.base, NULL, opaque_surface, 0, 0, 0, 0, 0, 0, image->width, image->height); if (status) { _cairo_pattern_fini (&opaque_pattern.base); goto FINISH3; } _cairo_pattern_fini (&opaque_pattern.base); opaque_image = (cairo_image_surface_t *) opaque_surface; } else { opaque_surface = &image->base; opaque_image = image; } bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = opaque_image->width; bi.bmiHeader.biHeight = -opaque_image->height; bi.bmiHeader.biSizeImage = 0; bi.bmiHeader.biXPelsPerMeter = PELS_72DPI; bi.bmiHeader.biYPelsPerMeter = PELS_72DPI; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; m = pattern->base.matrix; status = cairo_matrix_invert (&m); /* _cairo_pattern_set_matrix guarantees invertibility */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&m, &m, &surface->ctm); SaveDC (surface->dc); _cairo_matrix_to_win32_xform (&m, &xform); if (!SetWorldTransform (surface->dc, &xform)) return _cairo_win32_print_gdi_error ("_win32_scaled_font_set_world_transform"); oldmode = SetStretchBltMode(surface->dc, HALFTONE); GetClipBox (surface->dc, &clip); if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { left = (int) floor((double)clip.left/opaque_image->width); right = (int) ceil((double)clip.right/opaque_image->width); top = (int) floor((double)clip.top/opaque_image->height); bottom = (int) ceil((double)clip.bottom/opaque_image->height); } else { left = 0; right = 1; top = 0; bottom = 1; } for (y_tile = top; y_tile < bottom; y_tile++) { for (x_tile = left; x_tile < right; x_tile++) { if (!StretchDIBits (surface->dc, x_tile*opaque_image->width, y_tile*opaque_image->height, opaque_image->width, opaque_image->height, 0, 0, opaque_image->width, opaque_image->height, opaque_image->data, &bi, DIB_RGB_COLORS, SRCCOPY)) return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_paint(StretchDIBits)"); } } SetStretchBltMode(surface->dc, oldmode); RestoreDC (surface->dc, -1); FINISH3: if (opaque_image != image) cairo_surface_destroy (opaque_surface); FINISH2: _cairo_surface_release_source_image (pat_surface, image, image_extra); FINISH: _cairo_pattern_release_surface ((cairo_pattern_t *)pattern, pat_surface, &pat_attr); return status; } static cairo_status_t _cairo_win32_printing_surface_paint_surface_pattern (cairo_win32_surface_t *surface, cairo_surface_pattern_t *pattern) { if (_cairo_surface_is_meta (pattern->surface)) { return _cairo_win32_printing_surface_paint_meta_pattern (surface, pattern); } else { return _cairo_win32_printing_surface_paint_image_pattern (surface, pattern); } } static void vertex_set_color (TRIVERTEX *vert, cairo_color_t *color) { /* MSDN says that the range here is 0x0000 .. 0xff00; * that may well be a typo, but just chop the low bits * here. */ vert->Alpha = 0xff00; vert->Red = color->red_short & 0xff00; vert->Green = color->green_short & 0xff00; vert->Blue = color->blue_short & 0xff00; } static cairo_int_status_t _cairo_win32_printing_surface_paint_linear_pattern (cairo_win32_surface_t *surface, cairo_linear_pattern_t *pattern) { TRIVERTEX *vert; GRADIENT_RECT *rect; RECT clip; XFORM xform; int i, num_stops; cairo_matrix_t mat, rot; double p1x, p1y, p2x, p2y, xd, yd, d, sn, cs; cairo_extend_t extend; int range_start, range_stop, num_ranges, num_rects, stop; int total_verts, total_rects; cairo_status_t status; extend = cairo_pattern_get_extend (&pattern->base.base); SaveDC (surface->dc); mat = pattern->base.base.matrix; status = cairo_matrix_invert (&mat); /* _cairo_pattern_set_matrix guarantees invertibility */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&mat, &surface->ctm, &mat); p1x = _cairo_fixed_to_double (pattern->p1.x); p1y = _cairo_fixed_to_double (pattern->p1.y); p2x = _cairo_fixed_to_double (pattern->p2.x); p2y = _cairo_fixed_to_double (pattern->p2.y); cairo_matrix_translate (&mat, p1x, p1y); xd = p2x - p1x; yd = p2y - p1y; d = sqrt (xd*xd + yd*yd); sn = yd/d; cs = xd/d; cairo_matrix_init (&rot, cs, sn, -sn, cs, 0, 0); cairo_matrix_multiply (&mat, &rot, &mat); _cairo_matrix_to_win32_xform (&mat, &xform); if (!SetWorldTransform (surface->dc, &xform)) return _cairo_win32_print_gdi_error ("_win32_printing_surface_paint_linear_pattern:SetWorldTransform2"); GetClipBox (surface->dc, &clip); if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { range_start = (int) floor(clip.left/d); range_stop = (int) ceil(clip.right/d); } else { range_start = 0; range_stop = 1; } num_ranges = range_stop - range_start; num_stops = pattern->base.n_stops; num_rects = num_stops - 1; /* Add an extra four points and two rectangles for EXTEND_PAD */ vert = malloc (sizeof (TRIVERTEX) * (num_rects*2*num_ranges + 4)); rect = malloc (sizeof (GRADIENT_RECT) * (num_rects*num_ranges + 2)); for (i = 0; i < num_ranges*num_rects; i++) { vert[i*2].y = (LONG) clip.top; if (i%num_rects == 0) { stop = 0; if (extend == CAIRO_EXTEND_REFLECT && (range_start+(i/num_rects))%2) stop = num_rects; vert[i*2].x = (LONG)(d*(range_start + i/num_rects)); vertex_set_color (&vert[i*2], &pattern->base.stops[stop].color); } else { vert[i*2].x = vert[i*2-1].x; vert[i*2].Red = vert[i*2-1].Red; vert[i*2].Green = vert[i*2-1].Green; vert[i*2].Blue = vert[i*2-1].Blue; vert[i*2].Alpha = vert[i*2-1].Alpha; } stop = i%num_rects + 1; vert[i*2+1].x = (LONG)(d*(range_start + i/num_rects + pattern->base.stops[stop].offset)); vert[i*2+1].y = (LONG) clip.bottom; if (extend == CAIRO_EXTEND_REFLECT && (range_start+(i/num_rects))%2) stop = num_rects - stop; vertex_set_color (&vert[i*2+1], &pattern->base.stops[stop].color); rect[i].UpperLeft = i*2; rect[i].LowerRight = i*2 + 1; } total_verts = 2*num_ranges*num_rects; total_rects = num_ranges*num_rects; if (extend == CAIRO_EXTEND_PAD) { vert[i*2].x = vert[i*2-1].x; vert[i*2].y = (LONG) clip.top; vert[i*2].Red = vert[i*2-1].Red; vert[i*2].Green = vert[i*2-1].Green; vert[i*2].Blue = vert[i*2-1].Blue; vert[i*2].Alpha = 0xff00; vert[i*2+1].x = clip.right; vert[i*2+1].y = (LONG) clip.bottom; vert[i*2+1].Red = vert[i*2-1].Red; vert[i*2+1].Green = vert[i*2-1].Green; vert[i*2+1].Blue = vert[i*2-1].Blue; vert[i*2+1].Alpha = 0xff00; rect[i].UpperLeft = i*2; rect[i].LowerRight = i*2 + 1; i++; vert[i*2].x = clip.left; vert[i*2].y = (LONG) clip.top; vert[i*2].Red = vert[0].Red; vert[i*2].Green = vert[0].Green; vert[i*2].Blue = vert[0].Blue; vert[i*2].Alpha = 0xff00; vert[i*2+1].x = vert[0].x; vert[i*2+1].y = (LONG) clip.bottom; vert[i*2+1].Red = vert[0].Red; vert[i*2+1].Green = vert[0].Green; vert[i*2+1].Blue = vert[0].Blue; vert[i*2+1].Alpha = 0xff00; rect[i].UpperLeft = i*2; rect[i].LowerRight = i*2 + 1; total_verts += 4; total_rects += 2; } if (!GradientFill (surface->dc, vert, total_verts, rect, total_rects, GRADIENT_FILL_RECT_H)) return _cairo_win32_print_gdi_error ("_win32_printing_surface_paint_linear_pattern:GradientFill"); free (rect); free (vert); RestoreDC (surface->dc, -1); return 0; } static cairo_int_status_t _cairo_win32_printing_surface_paint_pattern (cairo_win32_surface_t *surface, cairo_pattern_t *pattern) { cairo_status_t status; switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: status = _cairo_win32_printing_surface_paint_solid_pattern (surface, pattern); if (status) return status; break; case CAIRO_PATTERN_TYPE_SURFACE: status = _cairo_win32_printing_surface_paint_surface_pattern (surface, (cairo_surface_pattern_t *) pattern); if (status) return status; break; case CAIRO_PATTERN_TYPE_LINEAR: status = _cairo_win32_printing_surface_paint_linear_pattern (surface, (cairo_linear_pattern_t *) pattern); if (status) return status; break; case CAIRO_PATTERN_TYPE_RADIAL: return CAIRO_INT_STATUS_UNSUPPORTED; break; } return CAIRO_STATUS_SUCCESS; } typedef struct _win32_print_path_info { cairo_win32_surface_t *surface; } win32_path_info_t; static cairo_status_t _cairo_win32_printing_surface_path_move_to (void *closure, cairo_point_t *point) { win32_path_info_t *path_info = closure; if (path_info->surface->has_ctm) { double x, y; x = _cairo_fixed_to_double (point->x); y = _cairo_fixed_to_double (point->y); cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); MoveToEx (path_info->surface->dc, (int) x, (int) y, NULL); } else { MoveToEx (path_info->surface->dc, _cairo_fixed_integer_part (point->x), _cairo_fixed_integer_part (point->y), NULL); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_printing_surface_path_line_to (void *closure, cairo_point_t *point) { win32_path_info_t *path_info = closure; path_info->surface->path_empty = FALSE; if (path_info->surface->has_ctm) { double x, y; x = _cairo_fixed_to_double (point->x); y = _cairo_fixed_to_double (point->y); cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); LineTo (path_info->surface->dc, (int) x, (int) y); } else { LineTo (path_info->surface->dc, _cairo_fixed_integer_part (point->x), _cairo_fixed_integer_part (point->y)); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_printing_surface_path_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { win32_path_info_t *path_info = closure; POINT points[3]; path_info->surface->path_empty = FALSE; if (path_info->surface->has_ctm) { double x, y; x = _cairo_fixed_to_double (b->x); y = _cairo_fixed_to_double (b->y); cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); points[0].x = (LONG) x; points[0].y = (LONG) y; x = _cairo_fixed_to_double (c->x); y = _cairo_fixed_to_double (c->y); cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); points[1].x = (LONG) x; points[1].y = (LONG) y; x = _cairo_fixed_to_double (d->x); y = _cairo_fixed_to_double (d->y); cairo_matrix_transform_point (&path_info->surface->ctm, &x, &y); points[2].x = (LONG) x; points[2].y = (LONG) y; } else { points[0].x = _cairo_fixed_integer_part (b->x); points[0].y = _cairo_fixed_integer_part (b->y); points[1].x = _cairo_fixed_integer_part (c->x); points[1].y = _cairo_fixed_integer_part (c->y); points[2].x = _cairo_fixed_integer_part (d->x); points[2].y = _cairo_fixed_integer_part (d->y); } PolyBezierTo (path_info->surface->dc, points, 3); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_printing_surface_path_close_path (void *closure) { win32_path_info_t *path_info = closure; CloseFigure (path_info->surface->dc); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_printing_surface_emit_path (cairo_win32_surface_t *surface, cairo_path_fixed_t *path) { win32_path_info_t path_info; cairo_status_t status; path_info.surface = surface; status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_win32_printing_surface_path_move_to, _cairo_win32_printing_surface_path_line_to, _cairo_win32_printing_surface_path_curve_to, _cairo_win32_printing_surface_path_close_path, &path_info); return status; } static cairo_int_status_t _cairo_win32_printing_surface_show_page (void *abstract_surface) { cairo_win32_surface_t *surface = abstract_surface; /* Undo both SaveDC's that we did in start_page */ RestoreDC (surface->dc, -2); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_win32_printing_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; if (path == NULL) { RestoreDC (surface->dc, -1); SaveDC (surface->dc); return CAIRO_STATUS_SUCCESS; } BeginPath (surface->dc); status = _cairo_win32_printing_surface_emit_path (surface, path); EndPath (surface->dc); switch (fill_rule) { case CAIRO_FILL_RULE_WINDING: SetPolyFillMode (surface->dc, WINDING); break; case CAIRO_FILL_RULE_EVEN_ODD: SetPolyFillMode (surface->dc, ALTERNATE); break; default: ASSERT_NOT_REACHED; } SelectClipPath (surface->dc, RGN_AND); return status; } static void _cairo_win32_printing_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { _cairo_font_options_init_default (options); cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); } static cairo_int_status_t _cairo_win32_printing_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_win32_surface_t *surface = abstract_surface; cairo_solid_pattern_t clear; if (op == CAIRO_OPERATOR_CLEAR) { _cairo_win32_printing_surface_init_clear_color (surface, &clear); source = (cairo_pattern_t*) &clear; op = CAIRO_OPERATOR_SOURCE; } if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_win32_printing_surface_analyze_operation (surface, op, source); assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); return _cairo_win32_printing_surface_paint_pattern (surface, source); } static int _cairo_win32_line_cap (cairo_line_cap_t cap) { switch (cap) { case CAIRO_LINE_CAP_BUTT: return PS_ENDCAP_FLAT; case CAIRO_LINE_CAP_ROUND: return PS_ENDCAP_ROUND; case CAIRO_LINE_CAP_SQUARE: return PS_ENDCAP_SQUARE; default: ASSERT_NOT_REACHED; return 0; } } static int _cairo_win32_line_join (cairo_line_join_t join) { switch (join) { case CAIRO_LINE_JOIN_MITER: return PS_JOIN_MITER; case CAIRO_LINE_JOIN_ROUND: return PS_JOIN_ROUND; case CAIRO_LINE_JOIN_BEVEL: return PS_JOIN_BEVEL; default: ASSERT_NOT_REACHED; return 0; } } static void _cairo_matrix_factor_out_scale (cairo_matrix_t *m, double *scale) { double s; s = fabs (m->xx); if (fabs (m->xy) > s) s = fabs (m->xy); if (fabs (m->yx) > s) s = fabs (m->yx); if (fabs (m->yy) > s) s = fabs (m->yy); *scale = s; s = 1.0/s; cairo_matrix_scale (m, s, s); } static cairo_int_status_t _cairo_win32_printing_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_win32_surface_t *surface = abstract_surface; cairo_int_status_t status; HPEN pen; LOGBRUSH brush; COLORREF color; XFORM xform; DWORD pen_style; DWORD *dash_array; HGDIOBJ obj; unsigned int i; cairo_solid_pattern_t clear; cairo_matrix_t mat; double scale; if (op == CAIRO_OPERATOR_CLEAR) { _cairo_win32_printing_surface_init_clear_color (surface, &clear); source = (cairo_pattern_t*) &clear; op = CAIRO_OPERATOR_SOURCE; } if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { /* Win32 does not support a dash offset. */ if (style->num_dashes > 0 && style->dash_offset != 0.0) return CAIRO_INT_STATUS_UNSUPPORTED; return _cairo_win32_printing_surface_analyze_operation (surface, op, source); } assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); assert (!(style->num_dashes > 0 && style->dash_offset != 0.0)); cairo_matrix_multiply (&mat, stroke_ctm, &surface->ctm); _cairo_matrix_factor_out_scale (&mat, &scale); pen_style = PS_GEOMETRIC; dash_array = NULL; if (style->num_dashes) { pen_style |= PS_USERSTYLE; dash_array = calloc (sizeof (DWORD), style->num_dashes); for (i = 0; i < style->num_dashes; i++) { dash_array[i] = (DWORD) (scale * style->dash[i]); } } else { pen_style |= PS_SOLID; } SetMiterLimit (surface->dc, (FLOAT) (style->miter_limit), NULL); if (source->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; color = _cairo_win32_printing_surface_flatten_transparency (surface, &solid->color); } else { /* Color not used as the pen will only be used by WidenPath() */ color = RGB (0,0,0); } brush.lbStyle = BS_SOLID; brush.lbColor = color; brush.lbHatch = 0; pen_style |= _cairo_win32_line_cap (style->line_cap); pen_style |= _cairo_win32_line_join (style->line_join); pen = ExtCreatePen(pen_style, scale * style->line_width, &brush, style->num_dashes, dash_array); if (pen == NULL) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:ExtCreatePen"); obj = SelectObject (surface->dc, pen); if (obj == NULL) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectObject"); BeginPath (surface->dc); status = _cairo_win32_printing_surface_emit_path (surface, path); EndPath (surface->dc); if (status) return status; /* * Switch to user space to set line parameters */ SaveDC (surface->dc); _cairo_matrix_to_win32_xform (&mat, &xform); xform.eDx = 0.0f; xform.eDy = 0.0f; if (!SetWorldTransform (surface->dc, &xform)) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SetWorldTransform"); if (source->type == CAIRO_PATTERN_TYPE_SOLID) { StrokePath (surface->dc); } else { if (!WidenPath (surface->dc)) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:WidenPath"); if (!SelectClipPath (surface->dc, RGN_AND)) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:SelectClipPath"); /* Return to device space to paint the pattern */ if (!ModifyWorldTransform (surface->dc, &xform, MWT_IDENTITY)) return _cairo_win32_print_gdi_error ("_win32_surface_stroke:ModifyWorldTransform"); status = _cairo_win32_printing_surface_paint_pattern (surface, source); } RestoreDC (surface->dc, -1); DeleteObject (pen); if (dash_array) free (dash_array); return status; } static cairo_int_status_t _cairo_win32_printing_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_win32_surface_t *surface = abstract_surface; cairo_int_status_t status; cairo_solid_pattern_t clear; if (op == CAIRO_OPERATOR_CLEAR) { _cairo_win32_printing_surface_init_clear_color (surface, &clear); source = (cairo_pattern_t*) &clear; op = CAIRO_OPERATOR_SOURCE; } if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_win32_printing_surface_analyze_operation (surface, op, source); assert (_cairo_win32_printing_surface_operation_supported (surface, op, source)); surface->path_empty = TRUE; BeginPath (surface->dc); status = _cairo_win32_printing_surface_emit_path (surface, path); EndPath (surface->dc); switch (fill_rule) { case CAIRO_FILL_RULE_WINDING: SetPolyFillMode (surface->dc, WINDING); break; case CAIRO_FILL_RULE_EVEN_ODD: SetPolyFillMode (surface->dc, ALTERNATE); break; default: ASSERT_NOT_REACHED; } if (source->type == CAIRO_PATTERN_TYPE_SOLID) { status = _cairo_win32_printing_surface_select_solid_brush (surface, source); if (status) return status; FillPath (surface->dc); _cairo_win32_printing_surface_done_solid_brush (surface); } else if (surface->path_empty == FALSE) { SaveDC (surface->dc); SelectClipPath (surface->dc, RGN_AND); status = _cairo_win32_printing_surface_paint_pattern (surface, source); RestoreDC (surface->dc, -1); } fflush(stderr); return status; } static cairo_int_status_t _cairo_win32_printing_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_scaled_glyph_t *scaled_glyph; cairo_pattern_t *opaque = NULL; int i; cairo_matrix_t old_ctm; cairo_bool_t old_has_ctm; cairo_solid_pattern_t clear; if (op == CAIRO_OPERATOR_CLEAR) { _cairo_win32_printing_surface_init_clear_color (surface, &clear); source = (cairo_pattern_t*) &clear; op = CAIRO_OPERATOR_SOURCE; } if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) { if (!(cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32 && source->type == CAIRO_PATTERN_TYPE_SOLID)) { for (i = 0; i < num_glyphs; i++) { status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); if (status) return status; } } return _cairo_win32_printing_surface_analyze_operation (surface, op, source); } if (source->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; COLORREF color; color = _cairo_win32_printing_surface_flatten_transparency (surface, &solid->color); opaque = cairo_pattern_create_rgb (GetRValue (color) / 255.0, GetGValue (color) / 255.0, GetBValue (color) / 255.0); if (opaque->status) return opaque->status; source = opaque; } if (cairo_scaled_font_get_type (scaled_font) == CAIRO_FONT_TYPE_WIN32 && source->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_matrix_t ctm; if (surface->has_ctm) { for (i = 0; i < num_glyphs; i++) cairo_matrix_transform_point (&surface->ctm, &glyphs[i].x, &glyphs[i].y); cairo_matrix_multiply (&ctm, &scaled_font->ctm, &surface->ctm); scaled_font = cairo_scaled_font_create (scaled_font->font_face, &scaled_font->font_matrix, &ctm, &scaled_font->options); } status = _cairo_win32_surface_show_glyphs (surface, op, source, glyphs, num_glyphs, scaled_font); if (surface->has_ctm) cairo_scaled_font_destroy (scaled_font); return status; } SaveDC (surface->dc); old_ctm = surface->ctm; old_has_ctm = surface->has_ctm; surface->has_ctm = TRUE; surface->path_empty = TRUE; BeginPath (surface->dc); for (i = 0; i < num_glyphs; i++) { status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); if (status) break; surface->ctm = old_ctm; cairo_matrix_translate (&surface->ctm, glyphs[i].x, glyphs[i].y); status = _cairo_win32_printing_surface_emit_path (surface, scaled_glyph->path); } EndPath (surface->dc); surface->ctm = old_ctm; surface->has_ctm = old_has_ctm; if (status == CAIRO_STATUS_SUCCESS && surface->path_empty == FALSE) { if (source->type == CAIRO_PATTERN_TYPE_SOLID) { status = _cairo_win32_printing_surface_select_solid_brush (surface, source); if (status) return status; SetPolyFillMode (surface->dc, WINDING); FillPath (surface->dc); _cairo_win32_printing_surface_done_solid_brush (surface); } else { SelectClipPath (surface->dc, RGN_AND); status = _cairo_win32_printing_surface_paint_pattern (surface, source); } } RestoreDC (surface->dc, -1); if (opaque) cairo_pattern_destroy (opaque); return status; } static cairo_surface_t * _cairo_win32_printing_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); } static cairo_int_status_t _cairo_win32_printing_surface_start_page (void *abstract_surface) { cairo_win32_surface_t *surface = abstract_surface; XFORM xform; double x_res, y_res; cairo_matrix_t inverse_ctm; cairo_status_t status; SaveDC (surface->dc); /* Save application context first, before doing MWT */ SetGraphicsMode (surface->dc, GM_ADVANCED); GetWorldTransform(surface->dc, &xform); surface->ctm.xx = xform.eM11; surface->ctm.xy = xform.eM21; surface->ctm.yx = xform.eM12; surface->ctm.yy = xform.eM22; surface->ctm.x0 = xform.eDx; surface->ctm.y0 = xform.eDy; surface->has_ctm = !_cairo_matrix_is_identity (&surface->ctm); inverse_ctm = surface->ctm; status = cairo_matrix_invert (&inverse_ctm); if (status) return status; x_res = (double) GetDeviceCaps(surface->dc, LOGPIXELSX); y_res = (double) GetDeviceCaps(surface->dc, LOGPIXELSY); cairo_matrix_transform_distance (&inverse_ctm, &x_res, &y_res); _cairo_surface_set_resolution (&surface->base, x_res, y_res); if (!ModifyWorldTransform (surface->dc, NULL, MWT_IDENTITY)) return _cairo_win32_print_gdi_error ("_cairo_win32_printing_surface_start_page:ModifyWorldTransform"); SaveDC (surface->dc); /* Then save Cairo's known-good clip state, so the clip path can be reset */ return CAIRO_STATUS_SUCCESS; } static void _cairo_win32_printing_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t paginated_mode) { cairo_win32_surface_t *surface = abstract_surface; surface->paginated_mode = paginated_mode; } /** * cairo_win32_printing_surface_create: * @hdc: the DC to create a surface for * * Creates a cairo surface that targets the given DC. The DC will be * queried for its initial clip extents, and this will be used as the * size of the cairo surface. The DC should be a printing DC; * antialiasing will be ignored, and GDI will be used as much as * possible to draw to the surface. * * The returned surface will be wrapped using the paginated surface to * provide correct complex rendering behaviour; show_page() and * associated methods must be used for correct output. * * Return value: the newly created surface **/ cairo_surface_t * cairo_win32_printing_surface_create (HDC hdc) { cairo_win32_surface_t *surface; RECT rect; surface = malloc (sizeof (cairo_win32_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); if (_cairo_win32_save_initial_clip (hdc, surface) != CAIRO_STATUS_SUCCESS) { free (surface); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } surface->image = NULL; surface->format = CAIRO_FORMAT_RGB24; surface->content = CAIRO_CONTENT_COLOR_ALPHA; surface->dc = hdc; surface->bitmap = NULL; surface->is_dib = FALSE; surface->saved_dc_bitmap = NULL; surface->brush = NULL; surface->old_brush = NULL; GetClipBox(hdc, &rect); surface->extents.x = rect.left; surface->extents.y = rect.top; surface->extents.width = rect.right - rect.left; surface->extents.height = rect.bottom - rect.top; surface->flags = _cairo_win32_flags_for_dc (surface->dc); surface->flags |= CAIRO_WIN32_SURFACE_FOR_PRINTING; _cairo_win32_printing_surface_init_ps_mode (surface); _cairo_surface_init (&surface->base, &cairo_win32_printing_surface_backend, CAIRO_CONTENT_COLOR_ALPHA); return _cairo_paginated_surface_create (&surface->base, CAIRO_CONTENT_COLOR_ALPHA, surface->extents.width, surface->extents.height, &cairo_win32_surface_paginated_backend); } cairo_bool_t _cairo_surface_is_win32_printing (cairo_surface_t *surface) { return surface->backend == &cairo_win32_printing_surface_backend; } static const cairo_surface_backend_t cairo_win32_printing_surface_backend = { CAIRO_SURFACE_TYPE_WIN32_PRINTING, _cairo_win32_printing_surface_create_similar, _cairo_win32_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ _cairo_win32_surface_clone_similar, NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ _cairo_win32_printing_surface_show_page, NULL, /* set_clip_region */ _cairo_win32_printing_surface_intersect_clip_path, _cairo_win32_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_win32_printing_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ _cairo_win32_printing_surface_paint, NULL, /* mask */ _cairo_win32_printing_surface_stroke, _cairo_win32_printing_surface_fill, _cairo_win32_printing_surface_show_glyphs, NULL, /* snapshot */ NULL, /* is_similar */ NULL, /* reset */ NULL, /* fill_stroke */ }; static const cairo_paginated_surface_backend_t cairo_win32_surface_paginated_backend = { _cairo_win32_printing_surface_start_page, _cairo_win32_printing_surface_set_paginated_mode, NULL, /* set_bounding_box */ }; libgdiplus-2.11/cairo/src/cairo-region-private.h0000664000175000017500000000652012225470167016612 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_REGION_PRIVATE_H #define CAIRO_REGION_PRIVATE_H #include #include "cairo-compiler-private.h" /* #cairo_region_t is defined in cairoint.h */ struct _cairo_region { pixman_region16_t rgn; }; cairo_private void _cairo_region_init (cairo_region_t *region); cairo_private void _cairo_region_init_rect (cairo_region_t *region, cairo_rectangle_int_t *rect); cairo_private cairo_int_status_t _cairo_region_init_boxes (cairo_region_t *region, cairo_box_int_t *boxes, int count); cairo_private void _cairo_region_fini (cairo_region_t *region); cairo_private cairo_int_status_t _cairo_region_copy (cairo_region_t *dst, cairo_region_t *src); cairo_private int _cairo_region_num_boxes (cairo_region_t *region); cairo_private cairo_int_status_t _cairo_region_get_boxes (cairo_region_t *region, int *num_boxes, cairo_box_int_t **boxes); cairo_private void _cairo_region_boxes_fini (cairo_region_t *region, cairo_box_int_t *boxes); cairo_private void _cairo_region_get_extents (cairo_region_t *region, cairo_rectangle_int_t *extents); cairo_private cairo_int_status_t _cairo_region_subtract (cairo_region_t *dst, cairo_region_t *a, cairo_region_t *b); cairo_private cairo_int_status_t _cairo_region_intersect (cairo_region_t *dst, cairo_region_t *a, cairo_region_t *b); cairo_private cairo_int_status_t _cairo_region_union_rect (cairo_region_t *dst, cairo_region_t *src, cairo_rectangle_int_t *rect); cairo_private cairo_bool_t _cairo_region_not_empty (cairo_region_t *region); cairo_private void _cairo_region_translate (cairo_region_t *region, int x, int y); cairo_private pixman_region_overlap_t _cairo_region_contains_rectangle (cairo_region_t *region, cairo_rectangle_int_t *box); #endif /* CAIRO_REGION_PRIVATE_H */ libgdiplus-2.11/cairo/src/check-plt.sh0000775000175000017500000000107112225470167014620 00000000000000#!/bin/sh LANG=C if ! which readelf 2>/dev/null >/dev/null; then echo "'readelf' not found; skipping test" exit 0 fi test -z "$srcdir" && srcdir=. test -z "$MAKE" && MAKE=make status=0 $MAKE check-has-hidden-symbols.i > /dev/null || exit 1 if tail -1 check-has-hidden-symbols.i | grep CAIRO_HAS_HIDDEN_SYMBOLS >/dev/null; then echo "Compiler doesn't support symbol visibility; skipping test" exit 0 fi for so in .libs/lib*.so; do echo Checking "$so" for local PLT entries readelf -W -r "$so" | grep 'JU\?MP_SLO' | grep 'cairo' && status=1 done exit $status libgdiplus-2.11/cairo/src/cairo-scaled-font.c0000664000175000017500000016622512225470167016062 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* * Copyright © 2005 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith Packard * Carl D. Worth * Graydon Hoare * Owen Taylor * Behdad Esfahbod */ #include "cairoint.h" #include "cairo-scaled-font-private.h" /* * Notes: * * To store rasterizations of glyphs, we use an image surface and the * device offset to represent the glyph origin. * * A device_transform converts from device space (a conceptual space) to * surface space. For simple cases of translation only, it's called a * device_offset and is public API (cairo_surface_[gs]et_device_offset()). * A possibly better name for those functions could have been * cairo_surface_[gs]et_origin(). So, that's what they do: they set where * the device-space origin (0,0) is in the surface. If the origin is inside * the surface, device_offset values are positive. It may look like this: * * Device space: * (-x,-y) <-- negative numbers * +----------------+ * | . | * | . | * |......(0,0) <---|-- device-space origin * | | * | | * +----------------+ * (width-x,height-y) * * Surface space: * (0,0) <-- surface-space origin * +---------------+ * | . | * | . | * |......(x,y) <--|-- device_offset * | | * | | * +---------------+ * (width,height) * * In other words: device_offset is the coordinates of the device-space * origin relative to the top-left of the surface. * * We use device offsets in a couple of places: * * - Public API: To let toolkits like Gtk+ give user a surface that * only represents part of the final destination (say, the expose * area), but has the same device space as the destination. In these * cases device_offset is typically negative. Example: * * application window * +---------------+ * | . | * | (x,y). | * |......+---+ | * | | | <--|-- expose area * | +---+ | * +---------------+ * * In this case, the user of cairo API can set the device_space on * the expose area to (-x,-y) to move the device space origin to that * of the application window, such that drawing in the expose area * surface and painting it in the application window has the same * effect as drawing in the application window directly. Gtk+ has * been using this feature. * * - Glyph surfaces: In most font rendering systems, glyph surfaces * have an origin at (0,0) and a bounding box that is typically * represented as (x_bearing,y_bearing,width,height). Depending on * which way y progresses in the system, y_bearing may typically be * negative (for systems similar to cairo, with origin at top left), * or be positive (in systems like PDF with origin at bottom left). * No matter which is the case, it is important to note that * (x_bearing,y_bearing) is the coordinates of top-left of the glyph * relative to the glyph origin. That is, for example: * * Scaled-glyph space: * * (x_bearing,y_bearing) <-- negative numbers * +----------------+ * | . | * | . | * |......(0,0) <---|-- glyph origin * | | * | | * +----------------+ * (width+x_bearing,height+y_bearing) * * Note the similarity of the origin to the device space. That is * exactly how we use the device_offset to represent scaled glyphs: * to use the device-space origin as the glyph origin. * * Now compare the scaled-glyph space to device-space and surface-space * and convince yourself that: * * (x_bearing,y_bearing) = (-x,-y) = - device_offset * * That's right. If you are not convinced yet, contrast the definition * of the two: * * "(x_bearing,y_bearing) is the coordinates of top-left of the * glyph relative to the glyph origin." * * "In other words: device_offset is the coordinates of the * device-space origin relative to the top-left of the surface." * * and note that glyph origin = device-space origin. */ static cairo_bool_t _cairo_scaled_glyph_keys_equal (const void *abstract_key_a, const void *abstract_key_b) { const cairo_scaled_glyph_t *key_a = abstract_key_a; const cairo_scaled_glyph_t *key_b = abstract_key_b; return (_cairo_scaled_glyph_index (key_a) == _cairo_scaled_glyph_index (key_b)); } static void _cairo_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph) { cairo_scaled_font_t *scaled_font = scaled_glyph->scaled_font; const cairo_surface_backend_t *surface_backend = scaled_font->surface_backend; if (surface_backend != NULL && surface_backend->scaled_glyph_fini != NULL) surface_backend->scaled_glyph_fini (scaled_glyph, scaled_font); if (scaled_glyph->surface != NULL) cairo_surface_destroy (&scaled_glyph->surface->base); if (scaled_glyph->path != NULL) _cairo_path_fixed_destroy (scaled_glyph->path); } static void _cairo_scaled_glyph_destroy (void *abstract_glyph) { cairo_scaled_glyph_t *scaled_glyph = abstract_glyph; _cairo_scaled_glyph_fini (scaled_glyph); free (scaled_glyph); } #define ZOMBIE 0 static const cairo_scaled_font_t _cairo_scaled_font_nil = { { ZOMBIE }, /* hash_entry */ CAIRO_STATUS_NO_MEMORY, /* status */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ { 0, 0, 0, NULL }, /* user_data */ NULL, /* font_face */ { 1., 0., 0., 1., 0, 0}, /* font_matrix */ { 1., 0., 0., 1., 0, 0}, /* ctm */ { CAIRO_ANTIALIAS_DEFAULT, /* options */ CAIRO_SUBPIXEL_ORDER_DEFAULT, CAIRO_HINT_STYLE_DEFAULT, CAIRO_HINT_METRICS_DEFAULT} , { 1., 0., 0., 1., 0, 0}, /* scale */ { 1., 0., 0., 1., 0, 0}, /* scale_inverse */ { 0., 0., 0., 0., 0. }, /* extents */ CAIRO_MUTEX_NIL_INITIALIZER,/* mutex */ NULL, /* glyphs */ NULL, /* surface_backend */ NULL, /* surface_private */ CAIRO_SCALED_FONT_BACKEND_DEFAULT, }; /** * _cairo_scaled_font_set_error: * @scaled_font: a scaled_font * @status: a status value indicating an error, (eg. not * CAIRO_STATUS_SUCCESS) * * Atomically sets scaled_font->status to @status and calls _cairo_error; * * All assignments of an error status to scaled_font->status should happen * through _cairo_scaled_font_set_error(). Note that due to the nature of * the atomic operation, it is not safe to call this function on the nil * objects. * * The purpose of this function is to allow the user to set a * breakpoint in _cairo_error() to generate a stack trace for when the * user causes cairo to detect an error. * * Return value: the error status. **/ cairo_status_t _cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font, cairo_status_t status) { if (status == CAIRO_STATUS_SUCCESS) return status; /* Don't overwrite an existing error. This preserves the first * error, which is the most significant. */ _cairo_status_set_error (&scaled_font->status, status); return _cairo_error (status); } /** * cairo_scaled_font_get_type: * @scaled_font: a #cairo_scaled_font_t * * This function returns the type of the backend used to create * a scaled font. See #cairo_font_type_t for available types. * * Return value: The type of @scaled_font. * * Since: 1.2 **/ cairo_font_type_t cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) return CAIRO_FONT_TYPE_TOY; return scaled_font->backend->type; } /** * cairo_scaled_font_status: * @scaled_font: a #cairo_scaled_font_t * * Checks whether an error has previously occurred for this * scaled_font. * * Return value: %CAIRO_STATUS_SUCCESS or another error such as * %CAIRO_STATUS_NO_MEMORY. **/ cairo_status_t cairo_scaled_font_status (cairo_scaled_font_t *scaled_font) { return scaled_font->status; } slim_hidden_def (cairo_scaled_font_status); /* Here we keep a unique mapping from * font_face/matrix/ctm/font_options => #cairo_scaled_font_t. * * Here are the things that we want to map: * * a) All otherwise referenced #cairo_scaled_font_t's * b) Some number of not otherwise referenced #cairo_scaled_font_t's * * The implementation uses a hash table which covers (a) * completely. Then, for (b) we have an array of otherwise * unreferenced fonts (holdovers) which are expired in * least-recently-used order. * * The cairo_scaled_font_create() code gets to treat this like a regular * hash table. All of the magic for the little holdover cache is in * cairo_scaled_font_reference() and cairo_scaled_font_destroy(). */ /* This defines the size of the holdover array ... that is, the number * of scaled fonts we keep around even when not otherwise referenced */ #define CAIRO_SCALED_FONT_MAX_HOLDOVERS 256 typedef struct _cairo_scaled_font_map { cairo_hash_table_t *hash_table; cairo_scaled_font_t *holdovers[CAIRO_SCALED_FONT_MAX_HOLDOVERS]; int num_holdovers; } cairo_scaled_font_map_t; static cairo_scaled_font_map_t *cairo_scaled_font_map = NULL; static int _cairo_scaled_font_keys_equal (const void *abstract_key_a, const void *abstract_key_b); static cairo_scaled_font_map_t * _cairo_scaled_font_map_lock (void) { CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); if (cairo_scaled_font_map == NULL) { cairo_scaled_font_map = malloc (sizeof (cairo_scaled_font_map_t)); if (cairo_scaled_font_map == NULL) goto CLEANUP_MUTEX_LOCK; cairo_scaled_font_map->hash_table = _cairo_hash_table_create (_cairo_scaled_font_keys_equal); if (cairo_scaled_font_map->hash_table == NULL) goto CLEANUP_SCALED_FONT_MAP; cairo_scaled_font_map->num_holdovers = 0; } return cairo_scaled_font_map; CLEANUP_SCALED_FONT_MAP: free (cairo_scaled_font_map); cairo_scaled_font_map = NULL; CLEANUP_MUTEX_LOCK: CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } static void _cairo_scaled_font_map_unlock (void) { CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); } void _cairo_scaled_font_map_destroy (void) { int i; cairo_scaled_font_map_t *font_map; cairo_scaled_font_t *scaled_font; CAIRO_MUTEX_LOCK (_cairo_scaled_font_map_mutex); font_map = cairo_scaled_font_map; if (font_map == NULL) { goto CLEANUP_MUTEX_LOCK; } for (i = 0; i < font_map->num_holdovers; i++) { scaled_font = font_map->holdovers[i]; /* We should only get here through the reset_static_data path * and there had better not be any active references at that * point. */ assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); _cairo_hash_table_remove (font_map->hash_table, &scaled_font->hash_entry); _cairo_scaled_font_fini (scaled_font); free (scaled_font); } _cairo_hash_table_destroy (font_map->hash_table); free (cairo_scaled_font_map); cairo_scaled_font_map = NULL; CLEANUP_MUTEX_LOCK: CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_map_mutex); } /* Fowler / Noll / Vo (FNV) Hash (http://www.isthe.com/chongo/tech/comp/fnv/) * * Not necessarily better than a lot of other hashes, but should be OK, and * well tested with binary data. */ #define FNV_32_PRIME ((uint32_t)0x01000193) #define FNV1_32_INIT ((uint32_t)0x811c9dc5) static uint32_t _hash_bytes_fnv (unsigned char *buffer, int len, uint32_t hval) { while (len--) { hval *= FNV_32_PRIME; hval ^= *buffer++; } return hval; } static void _cairo_scaled_font_init_key (cairo_scaled_font_t *scaled_font, cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options) { uint32_t hash = FNV1_32_INIT; scaled_font->status = CAIRO_STATUS_SUCCESS; scaled_font->font_face = font_face; scaled_font->font_matrix = *font_matrix; scaled_font->ctm = *ctm; /* ignore translation values in the ctm */ scaled_font->ctm.x0 = 0.; scaled_font->ctm.y0 = 0.; _cairo_font_options_init_copy (&scaled_font->options, options); /* We do a bytewise hash on the font matrices */ hash = _hash_bytes_fnv ((unsigned char *)(&scaled_font->font_matrix.xx), sizeof(cairo_matrix_t), hash); hash = _hash_bytes_fnv ((unsigned char *)(&scaled_font->ctm.xx), sizeof(cairo_matrix_t), hash); hash ^= (unsigned long) scaled_font->font_face; hash ^= cairo_font_options_hash (&scaled_font->options); assert (hash != ZOMBIE); scaled_font->hash_entry.hash = hash; } static cairo_bool_t _cairo_scaled_font_keys_equal (const void *abstract_key_a, const void *abstract_key_b) { const cairo_scaled_font_t *key_a = abstract_key_a; const cairo_scaled_font_t *key_b = abstract_key_b; return (key_a->font_face == key_b->font_face && memcmp ((unsigned char *)(&key_a->font_matrix.xx), (unsigned char *)(&key_b->font_matrix.xx), sizeof(cairo_matrix_t)) == 0 && memcmp ((unsigned char *)(&key_a->ctm.xx), (unsigned char *)(&key_b->ctm.xx), sizeof(double) * 4) == 0 && cairo_font_options_equal (&key_a->options, &key_b->options)); } /* XXX: This 256 number is arbitary---we've never done any measurement * of this. In fact, having a per-font glyph caches each managed * separately is probably not what we want anyway. Would probably be * much better to have a single cache for glyphs with random * replacement across all glyphs of all fonts. */ #define MAX_GLYPHS_CACHED_PER_FONT 256 /* * Basic #cairo_scaled_font_t object management */ cairo_status_t _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, const cairo_scaled_font_backend_t *backend) { cairo_status_t status; status = cairo_font_options_status ((cairo_font_options_t *) options); if (status) return status; _cairo_scaled_font_init_key (scaled_font, font_face, font_matrix, ctm, options); cairo_matrix_multiply (&scaled_font->scale, &scaled_font->font_matrix, &scaled_font->ctm); scaled_font->scale_inverse = scaled_font->scale; status = cairo_matrix_invert (&scaled_font->scale_inverse); if (status) { /* If the font scale matrix is rank 0, just using an all-zero inverse matrix * makes everything work correctly. This make font size 0 work without * producing an error. * * FIXME: If the scale is rank 1, we still go into error mode. But then * again, that's what we doo everywhere in cairo. * * Also, the check for == 0. below may bee too harsh... */ if (scaled_font->scale.xx == 0. && scaled_font->scale.xy == 0. && scaled_font->scale.yx == 0. && scaled_font->scale.yy == 0.) cairo_matrix_init (&scaled_font->scale_inverse, 0, 0, 0, 0, -scaled_font->scale.x0, -scaled_font->scale.y0); else return status; } scaled_font->glyphs = _cairo_cache_create (_cairo_scaled_glyph_keys_equal, _cairo_scaled_glyph_destroy, MAX_GLYPHS_CACHED_PER_FONT); if (scaled_font->glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); CAIRO_REFERENCE_COUNT_INIT (&scaled_font->ref_count, 1); _cairo_user_data_array_init (&scaled_font->user_data); cairo_font_face_reference (font_face); CAIRO_MUTEX_INIT (scaled_font->mutex); scaled_font->surface_backend = NULL; scaled_font->surface_private = NULL; scaled_font->backend = backend; return CAIRO_STATUS_SUCCESS; } void _cairo_scaled_font_freeze_cache (cairo_scaled_font_t *scaled_font) { _cairo_cache_freeze (scaled_font->glyphs); } void _cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font) { _cairo_cache_thaw (scaled_font->glyphs); } void _cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font) { _cairo_cache_destroy (scaled_font->glyphs); scaled_font->glyphs = _cairo_cache_create (_cairo_scaled_glyph_keys_equal, _cairo_scaled_glyph_destroy, MAX_GLYPHS_CACHED_PER_FONT); } cairo_status_t _cairo_scaled_font_set_metrics (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *fs_metrics) { cairo_status_t status; double font_scale_x, font_scale_y; status = _cairo_matrix_compute_scale_factors (&scaled_font->font_matrix, &font_scale_x, &font_scale_y, /* XXX */ 1); if (status) return status; /* * The font responded in unscaled units, scale by the font * matrix scale factors to get to user space */ scaled_font->extents.ascent = fs_metrics->ascent * font_scale_y; scaled_font->extents.descent = fs_metrics->descent * font_scale_y; scaled_font->extents.height = fs_metrics->height * font_scale_y; scaled_font->extents.max_x_advance = fs_metrics->max_x_advance * font_scale_x; scaled_font->extents.max_y_advance = fs_metrics->max_y_advance * font_scale_y; return CAIRO_STATUS_SUCCESS; } void _cairo_scaled_font_fini (cairo_scaled_font_t *scaled_font) { if (scaled_font->font_face != NULL) cairo_font_face_destroy (scaled_font->font_face); if (scaled_font->glyphs != NULL) _cairo_cache_destroy (scaled_font->glyphs); CAIRO_MUTEX_FINI (scaled_font->mutex); if (scaled_font->surface_backend != NULL && scaled_font->surface_backend->scaled_font_fini != NULL) scaled_font->surface_backend->scaled_font_fini (scaled_font); scaled_font->backend->fini (scaled_font); _cairo_user_data_array_fini (&scaled_font->user_data); } /** * cairo_scaled_font_create: * @font_face: a #cairo_font_face_t * @font_matrix: font space to user space transformation matrix for the * font. In the simplest case of a N point font, this matrix is * just a scale by N, but it can also be used to shear the font * or stretch it unequally along the two axes. See * cairo_set_font_matrix(). * @ctm: user to device transformation matrix with which the font will * be used. * @options: options to use when getting metrics for the font and * rendering with it. A %NULL pointer will be interpreted as * meaning the default options. * * Creates a #cairo_scaled_font_t object from a font face and matrices that * describe the size of the font and the environment in which it will * be used. * * Return value: a newly created #cairo_scaled_font_t. Destroy with * cairo_scaled_font_destroy() **/ cairo_scaled_font_t * cairo_scaled_font_create (cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options) { cairo_status_t status; cairo_scaled_font_map_t *font_map; cairo_scaled_font_t key, *scaled_font = NULL; if (font_face->status) return _cairo_scaled_font_create_in_error (font_face->status); status = cairo_font_options_status ((cairo_font_options_t *) options); if (status) return _cairo_scaled_font_create_in_error (status); /* Note that degenerate ctm or font_matrix *are* allowed. * We want to support a font size of 0. */ font_map = _cairo_scaled_font_map_lock (); if (font_map == NULL) return _cairo_scaled_font_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_scaled_font_init_key (&key, font_face, font_matrix, ctm, options); /* Return existing scaled_font if it exists in the hash table. */ if (_cairo_hash_table_lookup (font_map->hash_table, &key.hash_entry, (cairo_hash_entry_t**) &scaled_font)) { /* If the original reference count is 0, then this font must have * been found in font_map->holdovers, (which means this caching is * actually working). So now we remove it from the holdovers * array. */ if (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)) { int i; for (i = 0; i < font_map->num_holdovers; i++) if (font_map->holdovers[i] == scaled_font) break; assert (i < font_map->num_holdovers); font_map->num_holdovers--; memmove (&font_map->holdovers[i], &font_map->holdovers[i+1], (font_map->num_holdovers - i) * sizeof (cairo_scaled_font_t*)); /* reset any error status */ scaled_font->status = CAIRO_STATUS_SUCCESS; } if (scaled_font->status == CAIRO_STATUS_SUCCESS) { /* We increment the reference count manually here, (rather * than calling into cairo_scaled_font_reference), since we * must modify the reference count while our lock is still * held. */ _cairo_reference_count_inc (&scaled_font->ref_count); _cairo_scaled_font_map_unlock (); return scaled_font; } /* the font has been put into an error status - abandon the cache */ _cairo_hash_table_remove (font_map->hash_table, &key.hash_entry); scaled_font->hash_entry.hash = ZOMBIE; } /* Otherwise create it and insert it into the hash table. */ status = font_face->backend->scaled_font_create (font_face, font_matrix, ctm, options, &scaled_font); if (status) { _cairo_scaled_font_map_unlock (); status = _cairo_font_face_set_error (font_face, status); return _cairo_scaled_font_create_in_error (status); } status = _cairo_hash_table_insert (font_map->hash_table, &scaled_font->hash_entry); _cairo_scaled_font_map_unlock (); if (status) { /* We can't call _cairo_scaled_font_destroy here since it expects * that the font has already been successfully inserted into the * hash table. */ _cairo_scaled_font_fini (scaled_font); free (scaled_font); return _cairo_scaled_font_create_in_error (status); } return scaled_font; } slim_hidden_def (cairo_scaled_font_create); static cairo_scaled_font_t *_cairo_scaled_font_nil_objects[CAIRO_STATUS_LAST_STATUS + 1]; /* XXX This should disappear in favour of a common pool of error objects. */ cairo_scaled_font_t * _cairo_scaled_font_create_in_error (cairo_status_t status) { cairo_scaled_font_t *scaled_font; assert (status != CAIRO_STATUS_SUCCESS); if (status == CAIRO_STATUS_NO_MEMORY) return (cairo_scaled_font_t *) &_cairo_scaled_font_nil; CAIRO_MUTEX_LOCK (_cairo_scaled_font_error_mutex); scaled_font = _cairo_scaled_font_nil_objects[status]; if (scaled_font == NULL) { scaled_font = malloc (sizeof (cairo_scaled_font_t)); if (scaled_font == NULL) { CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_scaled_font_t *) &_cairo_scaled_font_nil; } *scaled_font = _cairo_scaled_font_nil; scaled_font->status = status; _cairo_scaled_font_nil_objects[status] = scaled_font; } CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); return scaled_font; } void _cairo_scaled_font_reset_static_data (void) { int status; CAIRO_MUTEX_LOCK (_cairo_scaled_font_error_mutex); for (status = CAIRO_STATUS_SUCCESS; status <= CAIRO_STATUS_LAST_STATUS; status++) { if (_cairo_scaled_font_nil_objects[status] != NULL) { free (_cairo_scaled_font_nil_objects[status]); _cairo_scaled_font_nil_objects[status] = NULL; } } CAIRO_MUTEX_UNLOCK (_cairo_scaled_font_error_mutex); } /** * cairo_scaled_font_reference: * @scaled_font: a #cairo_scaled_font_t, (may be %NULL in which case * this function does nothing) * * Increases the reference count on @scaled_font by one. This prevents * @scaled_font from being destroyed until a matching call to * cairo_scaled_font_destroy() is made. * * The number of references to a #cairo_scaled_font_t can be get using * cairo_scaled_font_get_reference_count(). * * Returns: the referenced #cairo_scaled_font_t **/ cairo_scaled_font_t * cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font) { if (scaled_font == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) return scaled_font; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); _cairo_reference_count_inc (&scaled_font->ref_count); return scaled_font; } slim_hidden_def (cairo_scaled_font_reference); /** * cairo_scaled_font_destroy: * @scaled_font: a #cairo_scaled_font_t * * Decreases the reference count on @font by one. If the result * is zero, then @font and all associated resources are freed. * See cairo_scaled_font_reference(). **/ void cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font) { cairo_scaled_font_map_t *font_map; cairo_scaled_font_t *lru = NULL; if (scaled_font == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) return; font_map = _cairo_scaled_font_map_lock (); assert (font_map != NULL); assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&scaled_font->ref_count)); if (_cairo_reference_count_dec_and_test (&scaled_font->ref_count)) { if (scaled_font->hash_entry.hash != ZOMBIE) { /* Rather than immediately destroying this object, we put it into * the font_map->holdovers array in case it will get used again * soon (and is why we must hold the lock over the atomic op on * the reference count). To make room for it, we do actually * destroy the least-recently-used holdover. */ if (font_map->num_holdovers == CAIRO_SCALED_FONT_MAX_HOLDOVERS) { lru = font_map->holdovers[0]; assert (! CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&lru->ref_count)); _cairo_hash_table_remove (font_map->hash_table, &lru->hash_entry); font_map->num_holdovers--; memmove (&font_map->holdovers[0], &font_map->holdovers[1], font_map->num_holdovers * sizeof (cairo_scaled_font_t*)); } font_map->holdovers[font_map->num_holdovers] = scaled_font; font_map->num_holdovers++; } else lru = scaled_font; } _cairo_scaled_font_map_unlock (); /* If we pulled an item from the holdovers array, (while the font * map lock was held, of course), then there is no way that anyone * else could have acquired a reference to it. So we can now * safely call fini on it without any lock held. This is desirable * as we never want to call into any backend function with a lock * held. */ if (lru) { _cairo_scaled_font_fini (lru); free (lru); } } slim_hidden_def (cairo_scaled_font_destroy); /** * cairo_scaled_font_get_reference_count: * @scaled_font: a #cairo_scaled_font_t * * Returns the current reference count of @scaled_font. * * Return value: the current reference count of @scaled_font. If the * object is a nil object, 0 will be returned. * * Since: 1.4 **/ unsigned int cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font) { if (scaled_font == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) return 0; return CAIRO_REFERENCE_COUNT_GET_VALUE (&scaled_font->ref_count); } /** * cairo_scaled_font_get_user_data: * @scaled_font: a #cairo_scaled_font_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Return user data previously attached to @scaled_font using the * specified key. If no user data has been attached with the given * key this function returns %NULL. * * Return value: the user data previously attached or %NULL. * * Since: 1.4 **/ void * cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font, const cairo_user_data_key_t *key) { return _cairo_user_data_array_get_data (&scaled_font->user_data, key); } /** * cairo_scaled_font_set_user_data: * @scaled_font: a #cairo_scaled_font_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach to the #cairo_scaled_font_t * @destroy: a #cairo_destroy_func_t which will be called when the * #cairo_t is destroyed or when new user data is attached using the * same key. * * Attach user data to @scaled_font. To remove user data from a surface, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. * * Since: 1.4 **/ cairo_status_t cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&scaled_font->ref_count)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _cairo_user_data_array_set_data (&scaled_font->user_data, key, user_data, destroy); } /* Public font API follows. */ /** * cairo_scaled_font_extents: * @scaled_font: a #cairo_scaled_font_t * @extents: a #cairo_font_extents_t which to store the retrieved extents. * * Gets the metrics for a #cairo_scaled_font_t. **/ void cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *extents) { *extents = scaled_font->extents; } slim_hidden_def (cairo_scaled_font_extents); /** * cairo_scaled_font_text_extents: * @scaled_font: a #cairo_scaled_font_t * @utf8: a string of text, encoded in UTF-8 * @extents: a #cairo_text_extents_t which to store the retrieved extents. * * Gets the extents for a string of text. The extents describe a * user-space rectangle that encloses the "inked" portion of the text * drawn at the origin (0,0) (as it would be drawn by cairo_show_text() * if the cairo graphics state were set to the same font_face, * font_matrix, ctm, and font_options as @scaled_font). Additionally, * the x_advance and y_advance values indicate the amount by which the * current point would be advanced by cairo_show_text(). * * Note that whitespace characters do not directly contribute to the * size of the rectangle (extents.width and extents.height). They do * contribute indirectly by changing the position of non-whitespace * characters. In particular, trailing whitespace characters are * likely to not affect the size of the rectangle, though they will * affect the x_advance and y_advance values. * * Since: 1.2 **/ void cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font, const char *utf8, cairo_text_extents_t *extents) { cairo_status_t status; cairo_glyph_t *glyphs; int num_glyphs; if (scaled_font->status) goto ZERO_EXTENTS; if (utf8 == NULL) goto ZERO_EXTENTS; status = _cairo_scaled_font_text_to_glyphs (scaled_font, 0., 0., utf8, &glyphs, &num_glyphs); if (status) goto ZERO_EXTENTS; cairo_scaled_font_glyph_extents (scaled_font, glyphs, num_glyphs, extents); free (glyphs); return; ZERO_EXTENTS: extents->x_bearing = 0.0; extents->y_bearing = 0.0; extents->width = 0.0; extents->height = 0.0; extents->x_advance = 0.0; extents->y_advance = 0.0; } /** * cairo_scaled_font_glyph_extents: * @scaled_font: a #cairo_scaled_font_t * @glyphs: an array of glyph IDs with X and Y offsets. * @num_glyphs: the number of glyphs in the @glyphs array * @extents: a #cairo_text_extents_t which to store the retrieved extents. * * Gets the extents for an array of glyphs. The extents describe a * user-space rectangle that encloses the "inked" portion of the * glyphs, (as they would be drawn by cairo_show_glyphs() if the cairo * graphics state were set to the same font_face, font_matrix, ctm, * and font_options as @scaled_font). Additionally, the x_advance and * y_advance values indicate the amount by which the current point * would be advanced by cairo_show_glyphs(). * * Note that whitespace glyphs do not contribute to the size of the * rectangle (extents.width and extents.height). **/ void cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents) { cairo_status_t status; int i; double min_x = 0.0, min_y = 0.0, max_x = 0.0, max_y = 0.0; cairo_bool_t visible = FALSE; cairo_scaled_glyph_t *scaled_glyph = NULL; if (scaled_font->status) { extents->x_bearing = 0.0; extents->y_bearing = 0.0; extents->width = 0.0; extents->height = 0.0; extents->x_advance = 0.0; extents->y_advance = 0.0; return; } CAIRO_MUTEX_LOCK (scaled_font->mutex); _cairo_scaled_font_freeze_cache (scaled_font); for (i = 0; i < num_glyphs; i++) { double left, top, right, bottom; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); if (status) { status = _cairo_scaled_font_set_error (scaled_font, status); goto UNLOCK; } /* "Ink" extents should skip "invisible" glyphs */ if (scaled_glyph->metrics.width == 0 || scaled_glyph->metrics.height == 0) continue; left = scaled_glyph->metrics.x_bearing + glyphs[i].x; right = left + scaled_glyph->metrics.width; top = scaled_glyph->metrics.y_bearing + glyphs[i].y; bottom = top + scaled_glyph->metrics.height; if (!visible) { visible = TRUE; min_x = left; max_x = right; min_y = top; max_y = bottom; } else { if (left < min_x) min_x = left; if (right > max_x) max_x = right; if (top < min_y) min_y = top; if (bottom > max_y) max_y = bottom; } } if (visible) { extents->x_bearing = min_x - glyphs[0].x; extents->y_bearing = min_y - glyphs[0].y; extents->width = max_x - min_x; extents->height = max_y - min_y; } else { extents->x_bearing = 0.0; extents->y_bearing = 0.0; extents->width = 0.0; extents->height = 0.0; } if (num_glyphs) { double x0, y0, x1, y1; x0 = glyphs[0].x; y0 = glyphs[0].y; /* scaled_glyph contains the glyph for num_glyphs - 1 already. */ x1 = glyphs[num_glyphs - 1].x + scaled_glyph->metrics.x_advance; y1 = glyphs[num_glyphs - 1].y + scaled_glyph->metrics.y_advance; extents->x_advance = x1 - x0; extents->y_advance = y1 - y0; } else { extents->x_advance = 0.0; extents->y_advance = 0.0; } UNLOCK: _cairo_scaled_font_thaw_cache (scaled_font); CAIRO_MUTEX_UNLOCK (scaled_font->mutex); } slim_hidden_def (cairo_scaled_font_glyph_extents); cairo_status_t _cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, double x, double y, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs) { int i; uint32_t *ucs4 = NULL; cairo_status_t status; cairo_scaled_glyph_t *scaled_glyph; status = scaled_font->status; if (status) return status; if (utf8[0] == '\0') { *num_glyphs = 0; *glyphs = NULL; return CAIRO_STATUS_SUCCESS; } CAIRO_MUTEX_LOCK (scaled_font->mutex); _cairo_scaled_font_freeze_cache (scaled_font); if (scaled_font->backend->text_to_glyphs) { status = scaled_font->backend->text_to_glyphs (scaled_font, x, y, utf8, glyphs, num_glyphs); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto DONE; } status = _cairo_utf8_to_ucs4 ((unsigned char*)utf8, -1, &ucs4, num_glyphs); if (status) goto DONE; *glyphs = (cairo_glyph_t *) _cairo_malloc_ab ((*num_glyphs), sizeof (cairo_glyph_t)); if (*glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto DONE; } for (i = 0; i < *num_glyphs; i++) { (*glyphs)[i].index = (*scaled_font->backend-> ucs4_to_index) (scaled_font, ucs4[i]); (*glyphs)[i].x = x; (*glyphs)[i].y = y; status = _cairo_scaled_glyph_lookup (scaled_font, (*glyphs)[i].index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); if (status) { free (*glyphs); *glyphs = NULL; goto DONE; } x += scaled_glyph->metrics.x_advance; y += scaled_glyph->metrics.y_advance; } DONE: _cairo_scaled_font_thaw_cache (scaled_font); CAIRO_MUTEX_UNLOCK (scaled_font->mutex); if (ucs4) free (ucs4); return _cairo_scaled_font_set_error (scaled_font, status); } /* * Compute a device-space bounding box for the glyphs. */ cairo_status_t _cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_rectangle_int_t *extents) { cairo_status_t status = CAIRO_STATUS_SUCCESS; int i; cairo_point_int_t min = { CAIRO_RECT_INT_MAX, CAIRO_RECT_INT_MAX }; cairo_point_int_t max = { CAIRO_RECT_INT_MIN, CAIRO_RECT_INT_MIN }; if (scaled_font->status) return scaled_font->status; for (i = 0; i < num_glyphs; i++) { cairo_scaled_glyph_t *scaled_glyph; int left, top; int right, bottom; int x, y; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); if (status) return _cairo_scaled_font_set_error (scaled_font, status); /* glyph images are snapped to pixel locations */ x = _cairo_lround (glyphs[i].x); y = _cairo_lround (glyphs[i].y); left = x + _cairo_fixed_integer_floor(scaled_glyph->bbox.p1.x); top = y + _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); right = x + _cairo_fixed_integer_ceil(scaled_glyph->bbox.p2.x); bottom = y + _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y); if (left < min.x) min.x = left; if (right > max.x) max.x = right; if (top < min.y) min.y = top; if (bottom > max.y) max.y = bottom; } if (min.x < max.x && min.y < max.y) { extents->x = min.x; extents->width = max.x - min.x; extents->y = min.y; extents->height = max.y - min.y; } else { extents->x = extents->y = 0; extents->width = extents->height = 0; } return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; cairo_surface_t *mask = NULL; cairo_format_t mask_format = CAIRO_FORMAT_A1; /* shut gcc up */ cairo_surface_pattern_t mask_pattern; cairo_solid_pattern_t white_pattern; int i; /* These operators aren't interpreted the same way by the backends; * they are implemented in terms of other operators in cairo-gstate.c */ assert (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_CLEAR); if (scaled_font->status) return scaled_font->status; if (!num_glyphs) return CAIRO_STATUS_SUCCESS; if (scaled_font->backend->show_glyphs != NULL) { status = scaled_font->backend->show_glyphs (scaled_font, op, pattern, surface, source_x, source_y, dest_x, dest_y, width, height, glyphs, num_glyphs); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_scaled_font_set_error (scaled_font, status); } /* Font display routine either does not exist or failed. */ status = CAIRO_STATUS_SUCCESS; _cairo_pattern_init_solid (&white_pattern, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); _cairo_cache_freeze (scaled_font->glyphs); for (i = 0; i < num_glyphs; i++) { int x, y; cairo_surface_pattern_t glyph_pattern; cairo_image_surface_t *glyph_surface; cairo_scaled_glyph_t *scaled_glyph; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status) goto CLEANUP_MASK; glyph_surface = scaled_glyph->surface; /* To start, create the mask using the format from the first * glyph. Later we'll deal with different formats. */ if (mask == NULL) { mask_format = glyph_surface->format; mask = cairo_image_surface_create (mask_format, width, height); if (mask->status) { status = mask->status; goto CLEANUP_MASK; } } /* If we have glyphs of different formats, we "upgrade" the mask * to the wider of the formats. */ if (glyph_surface->format != mask_format && _cairo_format_bits_per_pixel (mask_format) < _cairo_format_bits_per_pixel (glyph_surface->format) ) { cairo_surface_t *new_mask; cairo_surface_pattern_t mask_pattern; switch (glyph_surface->format) { case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_A8: case CAIRO_FORMAT_A1: mask_format = glyph_surface->format; break; case CAIRO_FORMAT_RGB24: default: ASSERT_NOT_REACHED; mask_format = CAIRO_FORMAT_ARGB32; break; } new_mask = cairo_image_surface_create (mask_format, width, height); if (new_mask->status) { status = new_mask->status; cairo_surface_destroy (new_mask); goto CLEANUP_MASK; } _cairo_pattern_init_for_surface (&mask_pattern, mask); status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, &white_pattern.base, &mask_pattern.base, new_mask, 0, 0, 0, 0, 0, 0, width, height); _cairo_pattern_fini (&mask_pattern.base); if (status) { cairo_surface_destroy (new_mask); goto CLEANUP_MASK; } cairo_surface_destroy (mask); mask = new_mask; } /* round glyph locations to the nearest pixel */ /* XXX: FRAGILE: We're ignoring device_transform scaling here. A bug? */ x = _cairo_lround (glyphs[i].x - glyph_surface->base.device_transform.x0); y = _cairo_lround (glyphs[i].y - glyph_surface->base.device_transform.y0); _cairo_pattern_init_for_surface (&glyph_pattern, &glyph_surface->base); status = _cairo_surface_composite (CAIRO_OPERATOR_ADD, &white_pattern.base, &glyph_pattern.base, mask, 0, 0, 0, 0, x - dest_x, y - dest_y, glyph_surface->width, glyph_surface->height); _cairo_pattern_fini (&glyph_pattern.base); if (status) goto CLEANUP_MASK; } if (mask_format == CAIRO_FORMAT_ARGB32) pixman_image_set_component_alpha (((cairo_image_surface_t*) mask)-> pixman_image, TRUE); _cairo_pattern_init_for_surface (&mask_pattern, mask); status = _cairo_surface_composite (op, pattern, &mask_pattern.base, surface, source_x, source_y, 0, 0, dest_x, dest_y, width, height); _cairo_pattern_fini (&mask_pattern.base); CLEANUP_MASK: _cairo_cache_thaw (scaled_font->glyphs); _cairo_pattern_fini (&white_pattern.base); if (mask != NULL) cairo_surface_destroy (mask); return _cairo_scaled_font_set_error (scaled_font, status); } typedef struct _cairo_scaled_glyph_path_closure { cairo_point_t offset; cairo_path_fixed_t *path; } cairo_scaled_glyph_path_closure_t; static cairo_status_t _scaled_glyph_path_move_to (void *abstract_closure, cairo_point_t *point) { cairo_scaled_glyph_path_closure_t *closure = abstract_closure; return _cairo_path_fixed_move_to (closure->path, point->x + closure->offset.x, point->y + closure->offset.y); } static cairo_status_t _scaled_glyph_path_line_to (void *abstract_closure, cairo_point_t *point) { cairo_scaled_glyph_path_closure_t *closure = abstract_closure; return _cairo_path_fixed_line_to (closure->path, point->x + closure->offset.x, point->y + closure->offset.y); } static cairo_status_t _scaled_glyph_path_curve_to (void *abstract_closure, cairo_point_t *p0, cairo_point_t *p1, cairo_point_t *p2) { cairo_scaled_glyph_path_closure_t *closure = abstract_closure; return _cairo_path_fixed_curve_to (closure->path, p0->x + closure->offset.x, p0->y + closure->offset.y, p1->x + closure->offset.x, p1->y + closure->offset.y, p2->x + closure->offset.x, p2->y + closure->offset.y); } static cairo_status_t _scaled_glyph_path_close_path (void *abstract_closure) { cairo_scaled_glyph_path_closure_t *closure = abstract_closure; return _cairo_path_fixed_close_path (closure->path); } /* Add a single-device-unit rectangle to a path. */ static cairo_status_t _add_unit_rectangle_to_path (cairo_path_fixed_t *path, int x, int y) { cairo_status_t status; status = _cairo_path_fixed_move_to (path, _cairo_fixed_from_int (x), _cairo_fixed_from_int (y)); if (status) return status; status = _cairo_path_fixed_rel_line_to (path, _cairo_fixed_from_int (1), _cairo_fixed_from_int (0)); if (status) return status; status = _cairo_path_fixed_rel_line_to (path, _cairo_fixed_from_int (0), _cairo_fixed_from_int (1)); if (status) return status; status = _cairo_path_fixed_rel_line_to (path, _cairo_fixed_from_int (-1), _cairo_fixed_from_int (0)); if (status) return status; status = _cairo_path_fixed_close_path (path); if (status) return status; return CAIRO_STATUS_SUCCESS; } /** * _trace_mask_to_path: * @bitmap: An alpha mask (either %CAIRO_FORMAT_A1 or %CAIRO_FORMAT_A8) * @path: An initialized path to hold the result * * Given a mask surface, (an alpha image), fill out the provided path * so that when filled it would result in something that approximates * the mask. * * Note: The current tracing code here is extremely primitive. It * operates only on an A1 surface, (converting an A8 surface to A1 if * necessary), and performs the tracing by drawing a little square * around each pixel that is on in the mask. We do not pretend that * this is a high-quality result. But we are leaving it up to someone * who cares enough about getting a better result to implement * something more sophisticated. **/ static cairo_status_t _trace_mask_to_path (cairo_image_surface_t *mask, cairo_path_fixed_t *path) { cairo_status_t status; cairo_image_surface_t *a1_mask; unsigned char *row, *byte_ptr, byte; int rows, cols, bytes_per_row; int x, y, bit; double xoff, yoff; if (mask->format == CAIRO_FORMAT_A1) a1_mask = (cairo_image_surface_t *) cairo_surface_reference (&mask->base); else a1_mask = _cairo_image_surface_clone (mask, CAIRO_FORMAT_A1); status = cairo_surface_status (&a1_mask->base); if (status) { cairo_surface_destroy (&a1_mask->base); return status; } cairo_surface_get_device_offset (&mask->base, &xoff, &yoff); bytes_per_row = (a1_mask->width + 7) / 8; for (y = 0, row = a1_mask->data, rows = a1_mask->height; rows; row += a1_mask->stride, rows--, y++) { for (x = 0, byte_ptr = row, cols = (a1_mask->width + 7) / 8; cols; byte_ptr++, cols--) { byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte_ptr); for (bit = 7; bit >= 0 && x < a1_mask->width; bit--, x++) { if (byte & (1 << bit)) { status = _add_unit_rectangle_to_path (path, x - xoff, y - yoff); if (status) goto BAIL; } } } } BAIL: cairo_surface_destroy (&a1_mask->base); return status; } cairo_status_t _cairo_scaled_font_glyph_path (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_path_fixed_t *path) { cairo_status_t status; int i; cairo_scaled_glyph_path_closure_t closure; cairo_path_fixed_t *glyph_path; status = scaled_font->status; if (status) return status; closure.path = path; _cairo_scaled_font_freeze_cache (scaled_font); for (i = 0; i < num_glyphs; i++) { cairo_scaled_glyph_t *scaled_glyph; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); if (status == CAIRO_STATUS_SUCCESS) glyph_path = scaled_glyph->path; else if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto BAIL; /* If the font is incapable of providing a path, then we'll * have to trace our own from a surface. */ if (status == CAIRO_INT_STATUS_UNSUPPORTED) { status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status) goto BAIL; glyph_path = _cairo_path_fixed_create (); if (glyph_path == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } status = _trace_mask_to_path (scaled_glyph->surface, glyph_path); if (status) { _cairo_path_fixed_destroy (glyph_path); goto BAIL; } } closure.offset.x = _cairo_fixed_from_double (glyphs[i].x); closure.offset.y = _cairo_fixed_from_double (glyphs[i].y); status = _cairo_path_fixed_interpret (glyph_path, CAIRO_DIRECTION_FORWARD, _scaled_glyph_path_move_to, _scaled_glyph_path_line_to, _scaled_glyph_path_curve_to, _scaled_glyph_path_close_path, &closure); if (glyph_path != scaled_glyph->path) _cairo_path_fixed_destroy (glyph_path); if (status) goto BAIL; } BAIL: _cairo_scaled_font_thaw_cache (scaled_font); return _cairo_scaled_font_set_error (scaled_font, status); } /** * cairo_scaled_glyph_set_metrics: * @scaled_glyph: a #cairo_scaled_glyph_t * @scaled_font: a #cairo_scaled_font_t * @fs_metrics: a #cairo_text_extents_t in font space * * _cairo_scaled_glyph_set_metrics() stores user space metrics * for the specified glyph given font space metrics. It is * called by the font backend when initializing a glyph with * CAIRO_SCALED_GLYPH_INFO_METRICS. **/ void _cairo_scaled_glyph_set_metrics (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_text_extents_t *fs_metrics) { cairo_bool_t first = TRUE; double hm, wm; double min_user_x = 0.0, max_user_x = 0.0, min_user_y = 0.0, max_user_y = 0.0; double min_device_x = 0.0, max_device_x = 0.0, min_device_y = 0.0, max_device_y = 0.0; double device_x_advance, device_y_advance; for (hm = 0.0; hm <= 1.0; hm += 1.0) for (wm = 0.0; wm <= 1.0; wm += 1.0) { double x, y; /* Transform this corner to user space */ x = fs_metrics->x_bearing + fs_metrics->width * wm; y = fs_metrics->y_bearing + fs_metrics->height * hm; cairo_matrix_transform_point (&scaled_font->font_matrix, &x, &y); if (first) { min_user_x = max_user_x = x; min_user_y = max_user_y = y; } else { if (x < min_user_x) min_user_x = x; if (x > max_user_x) max_user_x = x; if (y < min_user_y) min_user_y = y; if (y > max_user_y) max_user_y = y; } /* Transform this corner to device space from glyph origin */ x = fs_metrics->x_bearing + fs_metrics->width * wm; y = fs_metrics->y_bearing + fs_metrics->height * hm; cairo_matrix_transform_distance (&scaled_font->scale, &x, &y); if (first) { min_device_x = max_device_x = x; min_device_y = max_device_y = y; } else { if (x < min_device_x) min_device_x = x; if (x > max_device_x) max_device_x = x; if (y < min_device_y) min_device_y = y; if (y > max_device_y) max_device_y = y; } first = FALSE; } scaled_glyph->metrics.x_bearing = min_user_x; scaled_glyph->metrics.y_bearing = min_user_y; scaled_glyph->metrics.width = max_user_x - min_user_x; scaled_glyph->metrics.height = max_user_y - min_user_y; scaled_glyph->metrics.x_advance = fs_metrics->x_advance; scaled_glyph->metrics.y_advance = fs_metrics->y_advance; cairo_matrix_transform_distance (&scaled_font->font_matrix, &scaled_glyph->metrics.x_advance, &scaled_glyph->metrics.y_advance); device_x_advance = fs_metrics->x_advance; device_y_advance = fs_metrics->y_advance; cairo_matrix_transform_distance (&scaled_font->scale, &device_x_advance, &device_y_advance); scaled_glyph->bbox.p1.x = _cairo_fixed_from_double (min_device_x); scaled_glyph->bbox.p1.y = _cairo_fixed_from_double (min_device_y); scaled_glyph->bbox.p2.x = _cairo_fixed_from_double (max_device_x); scaled_glyph->bbox.p2.y = _cairo_fixed_from_double (max_device_y); scaled_glyph->x_advance = _cairo_lround (device_x_advance); scaled_glyph->y_advance = _cairo_lround (device_y_advance); } void _cairo_scaled_glyph_set_surface (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_image_surface_t *surface) { if (scaled_glyph->surface != NULL) cairo_surface_destroy (&scaled_glyph->surface->base); scaled_glyph->surface = surface; } void _cairo_scaled_glyph_set_path (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_path_fixed_t *path) { if (scaled_glyph->path != NULL) _cairo_path_fixed_destroy (scaled_glyph->path); scaled_glyph->path = path; } /** * _cairo_scaled_glyph_lookup: * @scaled_font: a #cairo_scaled_font_t * @index: the glyph to create * @info: a #cairo_scaled_glyph_info_t marking which portions of * the glyph should be filled in. * @scaled_glyph_ret: a #cairo_scaled_glyph_t * where the glyph * is returned. * * Returns: a glyph with the requested portions filled in. Glyph * lookup is cached and glyph will be automatically freed along * with the scaled_font so no explicit free is required. * @info can be one or more of: * %CAIRO_SCALED_GLYPH_INFO_METRICS - glyph metrics and bounding box * %CAIRO_SCALED_GLYPH_INFO_SURFACE - surface holding glyph image * %CAIRO_SCALED_GLYPH_INFO_PATH - path holding glyph outline in device space * * If the desired info is not available, (for example, when trying to * get INFO_PATH with a bitmapped font), this function will return * CAIRO_INT_STATUS_UNSUPPORTED. * * Note: This function must be called with scaled_font->mutex held. **/ cairo_int_status_t _cairo_scaled_glyph_lookup (cairo_scaled_font_t *scaled_font, unsigned long index, cairo_scaled_glyph_info_t info, cairo_scaled_glyph_t **scaled_glyph_ret) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_cache_entry_t key; cairo_scaled_glyph_t *scaled_glyph; cairo_scaled_glyph_info_t need_info; if (scaled_font->status) return scaled_font->status; key.hash = index; /* * Check cache for glyph */ info |= CAIRO_SCALED_GLYPH_INFO_METRICS; if (!_cairo_cache_lookup (scaled_font->glyphs, &key, (cairo_cache_entry_t **) &scaled_glyph)) { /* * On miss, create glyph and insert into cache */ scaled_glyph = malloc (sizeof (cairo_scaled_glyph_t)); if (scaled_glyph == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP; } _cairo_scaled_glyph_set_index(scaled_glyph, index); scaled_glyph->cache_entry.size = 1; /* XXX */ scaled_glyph->scaled_font = scaled_font; scaled_glyph->surface = NULL; scaled_glyph->path = NULL; scaled_glyph->surface_private = NULL; /* ask backend to initialize metrics and shape fields */ status = (*scaled_font->backend-> scaled_glyph_init) (scaled_font, scaled_glyph, info); if (status) { _cairo_scaled_glyph_destroy (scaled_glyph); goto CLEANUP; } /* on success, the cache takes ownership of the scaled_glyph */ status = _cairo_cache_insert (scaled_font->glyphs, &scaled_glyph->cache_entry); if (status) { _cairo_scaled_glyph_destroy (scaled_glyph); goto CLEANUP; } } /* * Check and see if the glyph, as provided, * already has the requested data and ammend it if not */ need_info = 0; if ((info & CAIRO_SCALED_GLYPH_INFO_SURFACE) != 0 && scaled_glyph->surface == NULL) need_info |= CAIRO_SCALED_GLYPH_INFO_SURFACE; if (((info & CAIRO_SCALED_GLYPH_INFO_PATH) != 0 && scaled_glyph->path == NULL)) need_info |= CAIRO_SCALED_GLYPH_INFO_PATH; if (need_info) { status = (*scaled_font->backend-> scaled_glyph_init) (scaled_font, scaled_glyph, need_info); if (status) goto CLEANUP; } CLEANUP: if (status) { /* It's not an error for the backend to not support the info we want. */ if (status != CAIRO_INT_STATUS_UNSUPPORTED) status = _cairo_scaled_font_set_error (scaled_font, status); *scaled_glyph_ret = NULL; } else { *scaled_glyph_ret = scaled_glyph; } return status; } /** * cairo_scaled_font_get_font_face: * @scaled_font: a #cairo_scaled_font_t * * Gets the font face that this scaled font was created for. * * Return value: The #cairo_font_face_t with which @scaled_font was * created. * * Since: 1.2 **/ cairo_font_face_t * cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font) { if (scaled_font->status) return (cairo_font_face_t*) &_cairo_font_face_nil; return scaled_font->font_face; } slim_hidden_def (cairo_scaled_font_get_font_face); /** * cairo_scaled_font_get_font_matrix: * @scaled_font: a #cairo_scaled_font_t * @font_matrix: return value for the matrix * * Stores the font matrix with which @scaled_font was created into * @matrix. * * Since: 1.2 **/ void cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font, cairo_matrix_t *font_matrix) { if (scaled_font->status) { cairo_matrix_init_identity (font_matrix); return; } *font_matrix = scaled_font->font_matrix; } slim_hidden_def (cairo_scaled_font_get_font_matrix); /** * cairo_scaled_font_get_ctm: * @scaled_font: a #cairo_scaled_font_t * @ctm: return value for the CTM * * Stores the CTM with which @scaled_font was created into @ctm. * * Since: 1.2 **/ void cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font, cairo_matrix_t *ctm) { if (scaled_font->status) { cairo_matrix_init_identity (ctm); return; } *ctm = scaled_font->ctm; } slim_hidden_def (cairo_scaled_font_get_ctm); /** * cairo_scaled_font_get_font_options: * @scaled_font: a #cairo_scaled_font_t * @options: return value for the font options * * Stores the font options with which @scaled_font was created into * @options. * * Since: 1.2 **/ void cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, cairo_font_options_t *options) { if (cairo_font_options_status (options)) return; if (scaled_font->status) { _cairo_font_options_init_default (options); return; } _cairo_font_options_init_copy (options, &scaled_font->options); } slim_hidden_def (cairo_scaled_font_get_font_options); libgdiplus-2.11/cairo/src/cairo-win32-surface.c0000664000175000017500000016770112225470167016253 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Owen Taylor * Stuart Parmenter * Vladimir Vukicevic */ #define WIN32_LEAN_AND_MEAN /* We require Windows 2000 features such as ETO_PDY */ #if !defined(WINVER) || (WINVER < 0x0500) # define WINVER 0x0500 #endif #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) # define _WIN32_WINNT 0x0500 #endif #include "cairoint.h" #include "cairo-clip-private.h" #include "cairo-win32-private.h" #include #if defined(__MINGW32__) && !defined(ETO_PDY) # define ETO_PDY 0x2000 #endif #undef DEBUG_COMPOSITE /* for older SDKs */ #ifndef SHADEBLENDCAPS #define SHADEBLENDCAPS 120 #endif #ifndef SB_NONE #define SB_NONE 0x00000000 #endif #define PELS_72DPI ((LONG)(72. / 0.0254)) static const cairo_surface_backend_t cairo_win32_surface_backend; /** * _cairo_win32_print_gdi_error: * @context: context string to display along with the error * * Helper function to dump out a human readable form of the * current error code. * * Return value: A cairo status code for the error code **/ cairo_status_t _cairo_win32_print_gdi_error (const char *context) { void *lpMsgBuf; DWORD last_error = GetLastError (); if (!FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, last_error, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR) &lpMsgBuf, 0, NULL)) { fprintf (stderr, "%s: Unknown GDI error", context); } else { fprintf (stderr, "%s: %s", context, (char *)lpMsgBuf); LocalFree (lpMsgBuf); } /* We should switch off of last_status, but we'd either return * CAIRO_STATUS_NO_MEMORY or CAIRO_STATUS_UNKNOWN_ERROR and there * is no CAIRO_STATUS_UNKNOWN_ERROR. */ return _cairo_error (CAIRO_STATUS_NO_MEMORY); } uint32_t _cairo_win32_flags_for_dc (HDC dc) { uint32_t flags = 0; if (GetDeviceCaps(dc, TECHNOLOGY) == DT_RASDISPLAY) { flags |= CAIRO_WIN32_SURFACE_IS_DISPLAY; /* These will always be possible, but the actual GetDeviceCaps * calls will return whether they're accelerated or not. * We may want to use our own (pixman) routines sometimes * if they're eventually faster, but for now have GDI do * everything. */ flags |= CAIRO_WIN32_SURFACE_CAN_BITBLT; flags |= CAIRO_WIN32_SURFACE_CAN_ALPHABLEND; flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHBLT; flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHDIB; } else { int cap; cap = GetDeviceCaps(dc, SHADEBLENDCAPS); if (cap != SB_NONE) flags |= CAIRO_WIN32_SURFACE_CAN_ALPHABLEND; cap = GetDeviceCaps(dc, RASTERCAPS); if (cap & RC_BITBLT) flags |= CAIRO_WIN32_SURFACE_CAN_BITBLT; if (cap & RC_STRETCHBLT) flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHBLT; if (cap & RC_STRETCHDIB) flags |= CAIRO_WIN32_SURFACE_CAN_STRETCHDIB; } return flags; } static cairo_status_t _create_dc_and_bitmap (cairo_win32_surface_t *surface, HDC original_dc, cairo_format_t format, int width, int height, unsigned char **bits_out, int *rowstride_out) { cairo_status_t status; BITMAPINFO *bitmap_info = NULL; struct { BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[2]; } bmi_stack; void *bits; int num_palette = 0; /* Quiet GCC */ int i; surface->dc = NULL; surface->bitmap = NULL; surface->is_dib = FALSE; switch (format) { case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_RGB24: num_palette = 0; break; case CAIRO_FORMAT_A8: num_palette = 256; break; case CAIRO_FORMAT_A1: num_palette = 2; break; } if (num_palette > 2) { bitmap_info = _cairo_malloc_ab_plus_c (num_palette, sizeof(RGBQUAD), sizeof(BITMAPINFOHEADER)); if (!bitmap_info) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } else { bitmap_info = (BITMAPINFO *)&bmi_stack; } bitmap_info->bmiHeader.biSize = sizeof (BITMAPINFOHEADER); bitmap_info->bmiHeader.biWidth = width == 0 ? 1 : width; bitmap_info->bmiHeader.biHeight = height == 0 ? -1 : - height; /* top-down */ bitmap_info->bmiHeader.biSizeImage = 0; bitmap_info->bmiHeader.biXPelsPerMeter = PELS_72DPI; /* unused here */ bitmap_info->bmiHeader.biYPelsPerMeter = PELS_72DPI; /* unused here */ bitmap_info->bmiHeader.biPlanes = 1; switch (format) { /* We can't create real RGB24 bitmaps because something seems to * break if we do, especially if we don't set up an image * fallback. It could be a bug with using a 24bpp pixman image * (and creating one with masks). So treat them like 32bpp. * Note: This causes problems when using BitBlt/AlphaBlend/etc! * see end of file. */ case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: bitmap_info->bmiHeader.biBitCount = 32; bitmap_info->bmiHeader.biCompression = BI_RGB; bitmap_info->bmiHeader.biClrUsed = 0; /* unused */ bitmap_info->bmiHeader.biClrImportant = 0; break; case CAIRO_FORMAT_A8: bitmap_info->bmiHeader.biBitCount = 8; bitmap_info->bmiHeader.biCompression = BI_RGB; bitmap_info->bmiHeader.biClrUsed = 256; bitmap_info->bmiHeader.biClrImportant = 0; for (i = 0; i < 256; i++) { bitmap_info->bmiColors[i].rgbBlue = i; bitmap_info->bmiColors[i].rgbGreen = i; bitmap_info->bmiColors[i].rgbRed = i; bitmap_info->bmiColors[i].rgbReserved = 0; } break; case CAIRO_FORMAT_A1: bitmap_info->bmiHeader.biBitCount = 1; bitmap_info->bmiHeader.biCompression = BI_RGB; bitmap_info->bmiHeader.biClrUsed = 2; bitmap_info->bmiHeader.biClrImportant = 0; for (i = 0; i < 2; i++) { bitmap_info->bmiColors[i].rgbBlue = i * 255; bitmap_info->bmiColors[i].rgbGreen = i * 255; bitmap_info->bmiColors[i].rgbRed = i * 255; bitmap_info->bmiColors[i].rgbReserved = 0; } break; } surface->dc = CreateCompatibleDC (original_dc); if (!surface->dc) goto FAIL; surface->bitmap = CreateDIBSection (surface->dc, bitmap_info, DIB_RGB_COLORS, &bits, NULL, 0); if (!surface->bitmap) goto FAIL; surface->is_dib = TRUE; GdiFlush(); surface->saved_dc_bitmap = SelectObject (surface->dc, surface->bitmap); if (!surface->saved_dc_bitmap) goto FAIL; if (bitmap_info && num_palette > 2) free (bitmap_info); if (bits_out) *bits_out = bits; if (rowstride_out) { /* Windows bitmaps are padded to 32-bit (dword) boundaries */ switch (format) { case CAIRO_FORMAT_ARGB32: case CAIRO_FORMAT_RGB24: *rowstride_out = 4 * width; break; case CAIRO_FORMAT_A8: *rowstride_out = (width + 3) & ~3; break; case CAIRO_FORMAT_A1: *rowstride_out = ((width + 31) & ~31) / 8; break; } } surface->flags = _cairo_win32_flags_for_dc (surface->dc); return CAIRO_STATUS_SUCCESS; FAIL: status = _cairo_win32_print_gdi_error ("_create_dc_and_bitmap"); if (bitmap_info && num_palette > 2) free (bitmap_info); if (surface->saved_dc_bitmap) { SelectObject (surface->dc, surface->saved_dc_bitmap); surface->saved_dc_bitmap = NULL; } if (surface->bitmap) { DeleteObject (surface->bitmap); surface->bitmap = NULL; } if (surface->dc) { DeleteDC (surface->dc); surface->dc = NULL; } return status; } static cairo_surface_t * _cairo_win32_surface_create_for_dc (HDC original_dc, cairo_format_t format, int width, int height) { cairo_status_t status; cairo_win32_surface_t *surface; unsigned char *bits; int rowstride; surface = malloc (sizeof (cairo_win32_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); status = _create_dc_and_bitmap (surface, original_dc, format, width, height, &bits, &rowstride); if (status) goto FAIL; surface->image = cairo_image_surface_create_for_data (bits, format, width, height, rowstride); status = surface->image->status; if (status) goto FAIL; surface->format = format; surface->clip_rect.x = 0; surface->clip_rect.y = 0; surface->clip_rect.width = width; surface->clip_rect.height = height; surface->initial_clip_rgn = NULL; surface->had_simple_clip = FALSE; surface->extents = surface->clip_rect; _cairo_surface_init (&surface->base, &cairo_win32_surface_backend, _cairo_content_from_format (format)); return &surface->base; FAIL: if (surface->bitmap) { SelectObject (surface->dc, surface->saved_dc_bitmap); DeleteObject (surface->bitmap); DeleteDC (surface->dc); } free (surface); return _cairo_surface_create_in_error (status); } static cairo_surface_t * _cairo_win32_surface_create_similar_internal (void *abstract_src, cairo_content_t content, int width, int height, cairo_bool_t force_dib) { cairo_win32_surface_t *src = abstract_src; cairo_format_t format = _cairo_format_from_content (content); cairo_win32_surface_t *new_surf; /* We force a DIB always if: * - we need alpha; or * - the parent is a DIB; or * - the parent is for printing (because we don't care about the bit depth at that point) */ if (src->is_dib || (content & CAIRO_CONTENT_ALPHA) || src->base.backend->type == CAIRO_SURFACE_TYPE_WIN32_PRINTING) { force_dib = TRUE; } if (force_dib) { new_surf = (cairo_win32_surface_t*) _cairo_win32_surface_create_for_dc (src->dc, format, width, height); } else { /* otherwise, create a ddb */ HBITMAP ddb = CreateCompatibleBitmap (src->dc, width, height); HDC ddb_dc = CreateCompatibleDC (src->dc); HBITMAP saved_dc_bitmap; saved_dc_bitmap = SelectObject (ddb_dc, ddb); new_surf = (cairo_win32_surface_t*) cairo_win32_surface_create (ddb_dc); if (new_surf->base.status == CAIRO_STATUS_SUCCESS) { new_surf->bitmap = ddb; new_surf->saved_dc_bitmap = saved_dc_bitmap; new_surf->is_dib = FALSE; } else { SelectObject (ddb_dc, saved_dc_bitmap); DeleteDC (ddb_dc); DeleteObject (ddb); } } return (cairo_surface_t*) new_surf; } cairo_surface_t * _cairo_win32_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { return _cairo_win32_surface_create_similar_internal (abstract_src, content, width, height, FALSE); } cairo_status_t _cairo_win32_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_content_t src_content; cairo_surface_t *new_surface; cairo_status_t status; cairo_pattern_union_t pattern; src_content = cairo_surface_get_content(src); new_surface = _cairo_win32_surface_create_similar_internal (abstract_surface, src_content, width, height, FALSE); if (cairo_surface_status(new_surface)) return cairo_surface_status(new_surface); _cairo_pattern_init_for_surface (&pattern.surface, src); status = _cairo_surface_composite (CAIRO_OPERATOR_SOURCE, &pattern.base, NULL, new_surface, src_x, src_y, 0, 0, 0, 0, width, height); _cairo_pattern_fini (&pattern.base); if (status == CAIRO_STATUS_SUCCESS) *clone_out = new_surface; else cairo_surface_destroy (new_surface); return status; } cairo_status_t _cairo_win32_surface_finish (void *abstract_surface) { cairo_win32_surface_t *surface = abstract_surface; if (surface->image) cairo_surface_destroy (surface->image); /* If we created the Bitmap and DC, destroy them */ if (surface->bitmap) { SelectObject (surface->dc, surface->saved_dc_bitmap); DeleteObject (surface->bitmap); DeleteDC (surface->dc); } else { _cairo_win32_restore_initial_clip (surface); } if (surface->initial_clip_rgn) DeleteObject (surface->initial_clip_rgn); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_surface_get_subimage (cairo_win32_surface_t *surface, int x, int y, int width, int height, cairo_win32_surface_t **local_out) { cairo_win32_surface_t *local; cairo_int_status_t status; cairo_content_t content = _cairo_content_from_format (surface->format); local = (cairo_win32_surface_t *) _cairo_win32_surface_create_similar_internal (surface, content, width, height, TRUE); if (local->base.status) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = CAIRO_INT_STATUS_UNSUPPORTED; /* Only BitBlt if the source surface supports it. */ if ((surface->flags & CAIRO_WIN32_SURFACE_CAN_BITBLT) && BitBlt (local->dc, 0, 0, width, height, surface->dc, x, y, SRCCOPY)) { status = CAIRO_STATUS_SUCCESS; } if (status) { /* If we failed here, most likely the source or dest doesn't * support BitBlt/AlphaBlend (e.g. a printer). * You can't reliably get bits from a printer DC, so just fill in * the surface as white (common case for printing). */ RECT r; r.left = r.top = 0; r.right = width; r.bottom = height; FillRect(local->dc, &r, (HBRUSH)GetStockObject(WHITE_BRUSH)); } *local_out = local; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_win32_surface_t *surface = abstract_surface; cairo_win32_surface_t *local = NULL; cairo_status_t status; if (surface->image) { *image_out = (cairo_image_surface_t *)surface->image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } status = _cairo_win32_surface_get_subimage (abstract_surface, 0, 0, surface->extents.width, surface->extents.height, &local); if (status) return status; *image_out = (cairo_image_surface_t *)local->image; *image_extra = local; return CAIRO_STATUS_SUCCESS; } static void _cairo_win32_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_win32_surface_t *local = image_extra; if (local) cairo_surface_destroy ((cairo_surface_t *)local); } static cairo_status_t _cairo_win32_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra) { cairo_win32_surface_t *surface = abstract_surface; cairo_win32_surface_t *local = NULL; cairo_status_t status; RECT clip_box; int x1, y1, x2, y2; if (surface->image) { GdiFlush(); image_rect->x = 0; image_rect->y = 0; image_rect->width = surface->extents.width; image_rect->height = surface->extents.height; *image_out = (cairo_image_surface_t *)surface->image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } if (GetClipBox (surface->dc, &clip_box) == ERROR) return _cairo_win32_print_gdi_error ("_cairo_win3_surface_acquire_dest_image"); x1 = clip_box.left; x2 = clip_box.right; y1 = clip_box.top; y2 = clip_box.bottom; if (interest_rect->x > x1) x1 = interest_rect->x; if (interest_rect->y > y1) y1 = interest_rect->y; if (interest_rect->x + interest_rect->width < x2) x2 = interest_rect->x + interest_rect->width; if (interest_rect->y + interest_rect->height < y2) y2 = interest_rect->y + interest_rect->height; if (x1 >= x2 || y1 >= y2) { *image_out = NULL; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } status = _cairo_win32_surface_get_subimage (abstract_surface, x1, y1, x2 - x1, y2 - y1, &local); if (status) return status; *image_out = (cairo_image_surface_t *)local->image; *image_extra = local; image_rect->x = x1; image_rect->y = y1; image_rect->width = x2 - x1; image_rect->height = y2 - y1; return CAIRO_STATUS_SUCCESS; } static void _cairo_win32_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_win32_surface_t *surface = abstract_surface; cairo_win32_surface_t *local = image_extra; if (!local) return; if (!BitBlt (surface->dc, image_rect->x, image_rect->y, image_rect->width, image_rect->height, local->dc, 0, 0, SRCCOPY)) _cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image"); cairo_surface_destroy ((cairo_surface_t *)local); } #if !defined(AC_SRC_OVER) #define AC_SRC_OVER 0x00 #pragma pack(1) typedef struct { BYTE BlendOp; BYTE BlendFlags; BYTE SourceConstantAlpha; BYTE AlphaFormat; }BLENDFUNCTION; #pragma pack() #endif /* for compatibility with VC++ 6 */ #ifndef AC_SRC_ALPHA #define AC_SRC_ALPHA 0x01 #endif typedef BOOL (WINAPI *cairo_alpha_blend_func_t) (HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, BLENDFUNCTION blendFunction); static cairo_int_status_t _composite_alpha_blend (cairo_win32_surface_t *dst, cairo_win32_surface_t *src, int alpha, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h) { static unsigned alpha_blend_checked = FALSE; static cairo_alpha_blend_func_t alpha_blend = NULL; BLENDFUNCTION blend_function; /* Check for AlphaBlend dynamically to allow compiling on * MSVC 6 and use on older windows versions */ if (!alpha_blend_checked) { OSVERSIONINFO os; os.dwOSVersionInfoSize = sizeof (os); GetVersionEx (&os); /* If running on Win98, disable using AlphaBlend() * to avoid Win98 AlphaBlend() bug */ if (VER_PLATFORM_WIN32_WINDOWS != os.dwPlatformId || os.dwMajorVersion != 4 || os.dwMinorVersion != 10) { HMODULE msimg32_dll = LoadLibraryA ("msimg32"); if (msimg32_dll != NULL) alpha_blend = (cairo_alpha_blend_func_t)GetProcAddress (msimg32_dll, "AlphaBlend"); } alpha_blend_checked = TRUE; } if (alpha_blend == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; if (!(dst->flags & CAIRO_WIN32_SURFACE_CAN_ALPHABLEND)) return CAIRO_INT_STATUS_UNSUPPORTED; if (src->format == CAIRO_FORMAT_RGB24 && dst->format == CAIRO_FORMAT_ARGB32) return CAIRO_INT_STATUS_UNSUPPORTED; blend_function.BlendOp = AC_SRC_OVER; blend_function.BlendFlags = 0; blend_function.SourceConstantAlpha = alpha; blend_function.AlphaFormat = (src->format == CAIRO_FORMAT_ARGB32) ? AC_SRC_ALPHA : 0; if (!alpha_blend (dst->dc, dst_x, dst_y, dst_w, dst_h, src->dc, src_x, src_y, src_w, src_h, blend_function)) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite(AlphaBlend)"); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_win32_surface_composite_inner (cairo_win32_surface_t *src, cairo_image_surface_t *src_image, cairo_win32_surface_t *dst, cairo_rectangle_int_t src_extents, cairo_rectangle_int_t src_r, cairo_rectangle_int_t dst_r, int alpha, cairo_bool_t needs_alpha, cairo_bool_t needs_scale) { /* Then do BitBlt, StretchDIBits, StretchBlt, AlphaBlend, or MaskBlt */ if (src_image) { if (needs_alpha || needs_scale) return CAIRO_INT_STATUS_UNSUPPORTED; if (dst->flags & CAIRO_WIN32_SURFACE_CAN_STRETCHBLT) { BITMAPINFO bi; bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bi.bmiHeader.biWidth = src_image->width; bi.bmiHeader.biHeight = - src_image->height; bi.bmiHeader.biSizeImage = 0; bi.bmiHeader.biXPelsPerMeter = PELS_72DPI; bi.bmiHeader.biYPelsPerMeter = PELS_72DPI; bi.bmiHeader.biPlanes = 1; bi.bmiHeader.biBitCount = 32; bi.bmiHeader.biCompression = BI_RGB; bi.bmiHeader.biClrUsed = 0; bi.bmiHeader.biClrImportant = 0; /* StretchDIBits is broken with top-down dibs; you need to do some * special munging to make the coordinate space work (basically, * need to address everything based on the bottom left, instead of top left, * and need to tell it to flip the resulting image. * * See http://blog.vlad1.com/archives/2006/10/26/134/ and comments. */ if (!StretchDIBits (dst->dc, /* dst x,y,w,h */ dst_r.x, dst_r.y + dst_r.height - 1, dst_r.width, - (int) dst_r.height, /* src x,y,w,h */ src_r.x, src_extents.height - src_r.y + 1, src_r.width, - (int) src_r.height, src_image->data, &bi, DIB_RGB_COLORS, SRCCOPY)) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite(StretchDIBits)"); } } else if (!needs_alpha) { /* BitBlt or StretchBlt? */ if (!needs_scale && (dst->flags & CAIRO_WIN32_SURFACE_CAN_BITBLT)) { if (!BitBlt (dst->dc, dst_r.x, dst_r.y, dst_r.width, dst_r.height, src->dc, src_r.x, src_r.y, SRCCOPY)) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_composite(BitBlt)"); } else if (dst->flags & CAIRO_WIN32_SURFACE_CAN_STRETCHBLT) { /* StretchBlt? */ /* XXX check if we want HALFTONE, based on the src filter */ BOOL success; int oldmode = SetStretchBltMode(dst->dc, HALFTONE); success = StretchBlt(dst->dc, dst_r.x, dst_r.y, dst_r.width, dst_r.height, src->dc, src_r.x, src_r.y, src_r.width, src_r.height, SRCCOPY); SetStretchBltMode(dst->dc, oldmode); if (!success) return _cairo_win32_print_gdi_error ("StretchBlt"); } } else if (needs_alpha && !needs_scale) { return _composite_alpha_blend (dst, src, alpha, src_r.x, src_r.y, src_r.width, src_r.height, dst_r.x, dst_r.y, dst_r.width, dst_r.height); } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_win32_surface_composite (cairo_operator_t op, cairo_pattern_t *pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_win32_surface_t *dst = abstract_dst; cairo_win32_surface_t *src; cairo_surface_pattern_t *src_surface_pattern; int alpha; double scalex, scaley; cairo_fixed_t x0_fixed, y0_fixed; cairo_int_status_t status; cairo_bool_t needs_alpha, needs_scale, needs_repeat; cairo_image_surface_t *src_image = NULL; cairo_format_t src_format; cairo_rectangle_int_t src_extents; cairo_rectangle_int_t src_r = { src_x, src_y, width, height }; cairo_rectangle_int_t dst_r = { dst_x, dst_y, width, height }; #ifdef DEBUG_COMPOSITE fprintf (stderr, "+++ composite: %d %p %p %p [%d %d] [%d %d] [%d %d] %dx%d\n", op, pattern, mask_pattern, abstract_dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); #endif /* If the destination can't do any of these, then * we may as well give up, since this is what we'll * look to for optimization. */ if ((dst->flags & (CAIRO_WIN32_SURFACE_CAN_BITBLT | CAIRO_WIN32_SURFACE_CAN_ALPHABLEND | CAIRO_WIN32_SURFACE_CAN_STRETCHBLT | CAIRO_WIN32_SURFACE_CAN_STRETCHDIB)) == 0) { goto UNSUPPORTED; } if (pattern->type != CAIRO_PATTERN_TYPE_SURFACE) goto UNSUPPORTED; if (pattern->extend != CAIRO_EXTEND_NONE && pattern->extend != CAIRO_EXTEND_REPEAT) goto UNSUPPORTED; if (mask_pattern) { /* FIXME: When we fully support RENDER style 4-channel * masks we need to check r/g/b != 1.0. */ if (mask_pattern->type != CAIRO_PATTERN_TYPE_SOLID) return CAIRO_INT_STATUS_UNSUPPORTED; alpha = ((cairo_solid_pattern_t *)mask_pattern)->color.alpha_short >> 8; } else { alpha = 255; } src_surface_pattern = (cairo_surface_pattern_t *)pattern; src = (cairo_win32_surface_t *)src_surface_pattern->surface; if (src->base.type == CAIRO_SURFACE_TYPE_IMAGE && dst->flags & (CAIRO_WIN32_SURFACE_CAN_STRETCHDIB)) { /* In some very limited cases, we can use StretchDIBits to draw * an image surface directly: * - source is CAIRO_FORMAT_ARGB32 * - dest is CAIRO_FORMAT_ARGB32 * - alpha is 255 * - operator is SOURCE or OVER * - image stride is 4*width */ src_image = (cairo_image_surface_t*) src; if (src_image->format != CAIRO_FORMAT_RGB24 || dst->format != CAIRO_FORMAT_RGB24 || alpha != 255 || (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) || src_image->stride != (src_image->width * 4)) { goto UNSUPPORTED; } src_format = src_image->format; src_extents.x = 0; src_extents.y = 0; src_extents.width = src_image->width; src_extents.height = src_image->height; } else if (src->base.backend != dst->base.backend) { goto UNSUPPORTED; } else { src_format = src->format; src_extents = src->extents; } #ifdef DEBUG_COMPOSITE fprintf (stderr, "Before check: src size: (%d %d) xy [%d %d] -> dst [%d %d %d %d] {srcmat %f %f %f %f}\n", src_extents.width, src_extents.height, src_x, src_y, dst_x, dst_y, width, height, pattern->matrix.x0, pattern->matrix.y0, pattern->matrix.xx, pattern->matrix.yy); #endif /* We can only use GDI functions if the source and destination rectangles * are on integer pixel boundaries. Figure that out here. */ x0_fixed = _cairo_fixed_from_double(pattern->matrix.x0 / pattern->matrix.xx); y0_fixed = _cairo_fixed_from_double(pattern->matrix.y0 / pattern->matrix.yy); if (pattern->matrix.yx != 0.0 || pattern->matrix.xy != 0.0 || !_cairo_fixed_is_integer(x0_fixed) || !_cairo_fixed_is_integer(y0_fixed)) { goto UNSUPPORTED; } scalex = pattern->matrix.xx; scaley = pattern->matrix.yy; src_r.x += _cairo_fixed_integer_part(x0_fixed); src_r.y += _cairo_fixed_integer_part(y0_fixed); /* Success, right? */ if (scalex == 0.0 || scaley == 0.0) return CAIRO_STATUS_SUCCESS; if (scalex != 1.0 || scaley != 1.0) goto UNSUPPORTED; /* If the src coordinates are outside of the source surface bounds, * we have to fix them up, because this is an error for the GDI * functions. */ #ifdef DEBUG_COMPOSITE fprintf (stderr, "before: [%d %d %d %d] -> [%d %d %d %d]\n", src_r.x, src_r.y, src_r.width, src_r.height, dst_r.x, dst_r.y, dst_r.width, dst_r.height); fflush (stderr); #endif /* If the src recangle doesn't wholly lie within the src extents, * fudge things. We really need to do fixup on the unpainted * region -- e.g. the SOURCE operator is broken for areas outside * of the extents, because it won't clear that area to transparent * black. */ if (pattern->extend != CAIRO_EXTEND_REPEAT) { needs_repeat = FALSE; /* If the src rect and the extents of the source image don't overlap at all, * we can't do anything useful here. */ if (src_r.x > src_extents.width || src_r.y > src_extents.height || (src_r.x + src_r.width) < 0 || (src_r.y + src_r.height) < 0) { if (op == CAIRO_OPERATOR_OVER) return CAIRO_STATUS_SUCCESS; goto UNSUPPORTED; } if (src_r.x < 0) { src_r.width += src_r.x; src_r.x = 0; dst_r.width += src_r.x; dst_r.x -= src_r.x; } if (src_r.y < 0) { src_r.height += src_r.y; src_r.y = 0; dst_r.height += dst_r.y; dst_r.y -= src_r.y; } if (src_r.x + src_r.width > src_extents.width) { src_r.width = src_extents.width - src_r.x; dst_r.width = src_r.width; } if (src_r.y + src_r.height > src_extents.height) { src_r.height = src_extents.height - src_r.y; dst_r.height = src_r.height; } } else { needs_repeat = TRUE; } /* * Operations that we can do: * * RGB OVER RGB -> BitBlt (same as SOURCE) * RGB OVER ARGB -> UNSUPPORTED (AlphaBlend treats this as a BitBlt, even with SCA 255 and no AC_SRC_ALPHA) * ARGB OVER ARGB -> AlphaBlend, with AC_SRC_ALPHA * ARGB OVER RGB -> AlphaBlend, with AC_SRC_ALPHA; we'll have junk in the dst A byte * * RGB OVER RGB + mask -> AlphaBlend, no AC_SRC_ALPHA * RGB OVER ARGB + mask -> UNSUPPORTED * ARGB OVER ARGB + mask -> AlphaBlend, with AC_SRC_ALPHA * ARGB OVER RGB + mask -> AlphaBlend, with AC_SRC_ALPHA; junk in the dst A byte * * RGB SOURCE RGB -> BitBlt * RGB SOURCE ARGB -> UNSUPPORTED (AlphaBlend treats this as a BitBlt, even with SCA 255 and no AC_SRC_ALPHA) * ARGB SOURCE ARGB -> BitBlt * ARGB SOURCE RGB -> BitBlt * * RGB SOURCE RGB + mask -> unsupported * RGB SOURCE ARGB + mask -> unsupported * ARGB SOURCE ARGB + mask -> unsupported * ARGB SOURCE RGB + mask -> unsupported */ /* * Figure out what action to take. */ if (op == CAIRO_OPERATOR_OVER) { if (alpha == 0) return CAIRO_STATUS_SUCCESS; if (src_format == dst->format) { if (alpha == 255 && src_format == CAIRO_FORMAT_RGB24) { needs_alpha = FALSE; } else { needs_alpha = TRUE; } } else if (src_format == CAIRO_FORMAT_ARGB32 && dst->format == CAIRO_FORMAT_RGB24) { needs_alpha = TRUE; } else { goto UNSUPPORTED; } } else if (alpha == 255 && op == CAIRO_OPERATOR_SOURCE) { if ((src_format == dst->format) || (src_format == CAIRO_FORMAT_ARGB32 && dst->format == CAIRO_FORMAT_RGB24)) { needs_alpha = FALSE; } else { goto UNSUPPORTED; } } else { goto UNSUPPORTED; } if (scalex == 1.0 && scaley == 1.0) { needs_scale = FALSE; } else { /* Should never be reached until we turn StretchBlt back on */ needs_scale = TRUE; } #ifdef DEBUG_COMPOSITE fprintf (stderr, "action: [%d %d %d %d] -> [%d %d %d %d]\n", src_r.x, src_r.y, src_r.width, src_r.height, dst_r.x, dst_r.y, dst_r.width, dst_r.height); fflush (stderr); #endif /* If we need to repeat, we turn the repeated blit into * a bunch of piece-by-piece blits. */ if (needs_repeat) { cairo_rectangle_int_t piece_src_r, piece_dst_r; uint32_t rendered_width = 0, rendered_height = 0; uint32_t to_render_height, to_render_width; int32_t piece_x, piece_y; int32_t src_start_x = src_r.x % src_extents.width; int32_t src_start_y = src_r.y % src_extents.height; if (needs_scale) goto UNSUPPORTED; /* If both the src and dest have an image, we may as well fall * back, because it will be faster than our separate blits. * Our blit code will be fastest when the src is a DDB and the * destination is a DDB. */ if ((src_image || src->image) && dst->image) goto UNSUPPORTED; /* If the src is not a bitmap but an on-screen (or unknown) * DC, chances are that fallback will be faster. */ if (src->bitmap == NULL) goto UNSUPPORTED; /* If we can use PatBlt, just do so */ if (!src_image && !needs_alpha) { HBRUSH brush; HGDIOBJ old_brush; POINT old_brush_origin; /* Set up the brush with our bitmap */ brush = CreatePatternBrush (src->bitmap); /* SetBrushOrgEx sets the coordinates in the destination DC of where the * pattern should start. */ SetBrushOrgEx (dst->dc, dst_r.x - src_start_x, dst_r.y - src_start_y, &old_brush_origin); old_brush = SelectObject (dst->dc, brush); PatBlt (dst->dc, dst_r.x, dst_r.y, dst_r.width, dst_r.height, PATCOPY); /* Restore the old brush and pen */ SetBrushOrgEx (dst->dc, old_brush_origin.x, old_brush_origin.y, NULL); SelectObject (dst->dc, old_brush); DeleteObject (brush); return CAIRO_STATUS_SUCCESS; } /* If we were not able to use PatBlt, then manually expand out the blit */ /* Arbitrary factor; we think that going through * fallback will be faster if we have to do more * than this amount of blits in either direction. */ if (dst_r.width / src_extents.width > 5 || dst_r.height / src_extents.height > 5) goto UNSUPPORTED; for (rendered_height = 0; rendered_height < dst_r.height; rendered_height += to_render_height) { piece_y = (src_start_y + rendered_height) % src_extents.height; to_render_height = src_extents.height - piece_y; if (rendered_height + to_render_height > dst_r.height) to_render_height = dst_r.height - rendered_height; for (rendered_width = 0; rendered_width < dst_r.width; rendered_width += to_render_width) { piece_x = (src_start_x + rendered_width) % src_extents.width; to_render_width = src_extents.width - piece_x; if (rendered_width + to_render_width > dst_r.width) to_render_width = dst_r.width - rendered_width; piece_src_r.x = piece_x; piece_src_r.y = piece_y; piece_src_r.width = to_render_width; piece_src_r.height = to_render_height; piece_dst_r.x = dst_r.x + rendered_width; piece_dst_r.y = dst_r.y + rendered_height; piece_dst_r.width = to_render_width; piece_dst_r.height = to_render_height; status = _cairo_win32_surface_composite_inner (src, src_image, dst, src_extents, piece_src_r, piece_dst_r, alpha, needs_alpha, needs_scale); if (status != CAIRO_STATUS_SUCCESS) { /* Uh oh. If something failed, and it's the first * piece, then we can jump to UNSUPPORTED. * Otherwise, this is bad times, because part of the * rendering was already done. */ if (rendered_width == 0 && rendered_height == 0) { goto UNSUPPORTED; } return status; } } } } else { status = _cairo_win32_surface_composite_inner (src, src_image, dst, src_extents, src_r, dst_r, alpha, needs_alpha, needs_scale); } if (status == CAIRO_STATUS_SUCCESS) return status; UNSUPPORTED: /* Fall back to image surface directly, if this is a DIB surface */ if (dst->image) { GdiFlush(); return dst->image->backend->composite (op, pattern, mask_pattern, dst->image, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); } return CAIRO_INT_STATUS_UNSUPPORTED; } /* This big function tells us how to optimize operators for the * case of solid destination and constant-alpha source * * Note: This function needs revisiting if we add support for * super-luminescent colors (a == 0, r,g,b > 0) */ static enum { DO_CLEAR, DO_SOURCE, DO_NOTHING, DO_UNSUPPORTED } categorize_solid_dest_operator (cairo_operator_t op, unsigned short alpha) { enum { SOURCE_TRANSPARENT, SOURCE_LIGHT, SOURCE_SOLID, SOURCE_OTHER } source; if (alpha >= 0xff00) source = SOURCE_SOLID; else if (alpha < 0x100) source = SOURCE_TRANSPARENT; else source = SOURCE_OTHER; switch (op) { case CAIRO_OPERATOR_CLEAR: /* 0 0 */ case CAIRO_OPERATOR_OUT: /* 1 - Ab 0 */ return DO_CLEAR; break; case CAIRO_OPERATOR_SOURCE: /* 1 0 */ case CAIRO_OPERATOR_IN: /* Ab 0 */ return DO_SOURCE; break; case CAIRO_OPERATOR_OVER: /* 1 1 - Aa */ case CAIRO_OPERATOR_ATOP: /* Ab 1 - Aa */ if (source == SOURCE_SOLID) return DO_SOURCE; else if (source == SOURCE_TRANSPARENT) return DO_NOTHING; else return DO_UNSUPPORTED; break; case CAIRO_OPERATOR_DEST_OUT: /* 0 1 - Aa */ case CAIRO_OPERATOR_XOR: /* 1 - Ab 1 - Aa */ if (source == SOURCE_SOLID) return DO_CLEAR; else if (source == SOURCE_TRANSPARENT) return DO_NOTHING; else return DO_UNSUPPORTED; break; case CAIRO_OPERATOR_DEST: /* 0 1 */ case CAIRO_OPERATOR_DEST_OVER:/* 1 - Ab 1 */ case CAIRO_OPERATOR_SATURATE: /* min(1,(1-Ab)/Aa) 1 */ return DO_NOTHING; break; case CAIRO_OPERATOR_DEST_IN: /* 0 Aa */ case CAIRO_OPERATOR_DEST_ATOP:/* 1 - Ab Aa */ if (source == SOURCE_SOLID) return DO_NOTHING; else if (source == SOURCE_TRANSPARENT) return DO_CLEAR; else return DO_UNSUPPORTED; break; case CAIRO_OPERATOR_ADD: /* 1 1 */ if (source == SOURCE_TRANSPARENT) return DO_NOTHING; else return DO_UNSUPPORTED; break; } ASSERT_NOT_REACHED; return DO_UNSUPPORTED; } static cairo_int_status_t _cairo_win32_surface_fill_rectangles (void *abstract_surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status; COLORREF new_color; HBRUSH new_brush; int i; /* XXXperf If it's not RGB24, we need to do a little more checking * to figure out when we can use GDI. We don't have that checking * anywhere at the moment, so just bail and use the fallback * paths. */ if (surface->format != CAIRO_FORMAT_RGB24) return CAIRO_INT_STATUS_UNSUPPORTED; /* Optimize for no destination alpha (surface->pixman_image is non-NULL for all * surfaces with alpha.) */ switch (categorize_solid_dest_operator (op, color->alpha_short)) { case DO_CLEAR: new_color = RGB (0, 0, 0); break; case DO_SOURCE: new_color = RGB (color->red_short >> 8, color->green_short >> 8, color->blue_short >> 8); break; case DO_NOTHING: return CAIRO_STATUS_SUCCESS; case DO_UNSUPPORTED: default: return CAIRO_INT_STATUS_UNSUPPORTED; } new_brush = CreateSolidBrush (new_color); if (!new_brush) return _cairo_win32_print_gdi_error ("_cairo_win32_surface_fill_rectangles"); for (i = 0; i < num_rects; i++) { RECT rect; rect.left = rects[i].x; rect.top = rects[i].y; rect.right = rects[i].x + rects[i].width; rect.bottom = rects[i].y + rects[i].height; if (!FillRect (surface->dc, &rect, new_brush)) goto FAIL; } DeleteObject (new_brush); return CAIRO_STATUS_SUCCESS; FAIL: status = _cairo_win32_print_gdi_error ("_cairo_win32_surface_fill_rectangles"); DeleteObject (new_brush); return status; } static cairo_int_status_t _cairo_win32_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; /* If we are in-memory, then we set the clip on the image surface * as well as on the underlying GDI surface. */ if (surface->image) { unsigned int serial; serial = _cairo_surface_allocate_clip_serial (surface->image); status = _cairo_surface_set_clip_region (surface->image, region, serial); if (status) return status; } /* The semantics we want is that any clip set by cairo combines * is intersected with the clip on device context that the * surface was created for. To implement this, we need to * save the original clip when first setting a clip on surface. */ /* Clear any clip set by cairo, return to the original first */ status = _cairo_win32_restore_initial_clip (surface); /* Then combine any new region with it */ if (region) { cairo_rectangle_int_t extents; cairo_box_int_t *boxes; int num_boxes; RGNDATA *data; size_t data_size; RECT *rects; int i; HRGN gdi_region; /* Create a GDI region for the cairo region */ _cairo_region_get_extents (region, &extents); status = _cairo_region_get_boxes (region, &num_boxes, &boxes); if (status) return status; if (num_boxes == 1 && boxes[0].p1.x == 0 && boxes[0].p1.y == 0 && boxes[0].p2.x == surface->extents.width && boxes[0].p2.y == surface->extents.height) { gdi_region = NULL; SelectClipRgn (surface->dc, NULL); IntersectClipRect (surface->dc, boxes[0].p1.x, boxes[0].p1.y, boxes[0].p2.x, boxes[0].p2.y); _cairo_region_boxes_fini (region, boxes); } else { /* XXX see notes in _cairo_win32_save_initial_clip -- * this code will interact badly with a HDC which had an initial * world transform -- we should probably manually transform the * region rects, because SelectClipRgn takes device units, not * logical units (unlike IntersectClipRect). */ data_size = sizeof (RGNDATAHEADER) + num_boxes * sizeof (RECT); data = malloc (data_size); if (!data) { _cairo_region_boxes_fini (region, boxes); return _cairo_error(CAIRO_STATUS_NO_MEMORY); } rects = (RECT *)data->Buffer; data->rdh.dwSize = sizeof (RGNDATAHEADER); data->rdh.iType = RDH_RECTANGLES; data->rdh.nCount = num_boxes; data->rdh.nRgnSize = num_boxes * sizeof (RECT); data->rdh.rcBound.left = extents.x; data->rdh.rcBound.top = extents.y; data->rdh.rcBound.right = extents.x + extents.width; data->rdh.rcBound.bottom = extents.y + extents.height; for (i = 0; i < num_boxes; i++) { rects[i].left = boxes[i].p1.x; rects[i].top = boxes[i].p1.y; rects[i].right = boxes[i].p2.x; rects[i].bottom = boxes[i].p2.y; } _cairo_region_boxes_fini (region, boxes); gdi_region = ExtCreateRegion (NULL, data_size, data); free (data); if (!gdi_region) return _cairo_error (CAIRO_STATUS_NO_MEMORY); /* AND the new region into our DC */ if (ExtSelectClipRgn (surface->dc, gdi_region, RGN_AND) == ERROR) status = _cairo_win32_print_gdi_error ("_cairo_win32_surface_set_clip_region"); DeleteObject (gdi_region); } } return status; } cairo_int_status_t _cairo_win32_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_win32_surface_t *surface = abstract_surface; *rectangle = surface->extents; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_win32_surface_flush (void *abstract_surface) { return _cairo_surface_reset_clip (abstract_surface); } #define STACK_GLYPH_SIZE 256 cairo_int_status_t _cairo_win32_surface_show_glyphs (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { #if CAIRO_HAS_WIN32_FONT cairo_win32_surface_t *dst = surface; WORD glyph_buf_stack[STACK_GLYPH_SIZE]; WORD *glyph_buf = glyph_buf_stack; int dxy_buf_stack[2 * STACK_GLYPH_SIZE]; int *dxy_buf = dxy_buf_stack; BOOL win_result = 0; int i, j; cairo_solid_pattern_t *solid_pattern; COLORREF color; cairo_matrix_t device_to_logical; int start_x, start_y; double user_x, user_y; int logical_x, logical_y; /* We can only handle win32 fonts */ if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_WIN32) return CAIRO_INT_STATUS_UNSUPPORTED; /* We can only handle opaque solid color sources */ if (!_cairo_pattern_is_opaque_solid(source)) return CAIRO_INT_STATUS_UNSUPPORTED; /* We can only handle operator SOURCE or OVER with the destination * having no alpha */ if ((op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_OVER) || (dst->format != CAIRO_FORMAT_RGB24)) return CAIRO_INT_STATUS_UNSUPPORTED; /* If we have a fallback mask clip set on the dst, we have * to go through the fallback path, but only if we're not * doing this for printing */ if (dst->base.clip && !(dst->flags & CAIRO_WIN32_SURFACE_FOR_PRINTING) && (dst->base.clip->mode != CAIRO_CLIP_MODE_REGION || dst->base.clip->surface != NULL)) return CAIRO_INT_STATUS_UNSUPPORTED; solid_pattern = (cairo_solid_pattern_t *)source; color = RGB(((int)solid_pattern->color.red_short) >> 8, ((int)solid_pattern->color.green_short) >> 8, ((int)solid_pattern->color.blue_short) >> 8); cairo_win32_scaled_font_get_device_to_logical(scaled_font, &device_to_logical); SaveDC(dst->dc); cairo_win32_scaled_font_select_font(scaled_font, dst->dc); SetTextColor(dst->dc, color); SetTextAlign(dst->dc, TA_BASELINE | TA_LEFT); SetBkMode(dst->dc, TRANSPARENT); if (num_glyphs > STACK_GLYPH_SIZE) { glyph_buf = (WORD *) _cairo_malloc_ab (num_glyphs, sizeof(WORD)); dxy_buf = (int *) _cairo_malloc_abc (num_glyphs, sizeof(int), 2); } /* It is vital that dx values for dxy_buf are calculated from the delta of * _logical_ x coordinates (not user x coordinates) or else the sum of all * previous dx values may start to diverge from the current glyph's x * coordinate due to accumulated rounding error. As a result strings could * be painted shorter or longer than expected. */ user_x = glyphs[0].x; user_y = glyphs[0].y; cairo_matrix_transform_point(&device_to_logical, &user_x, &user_y); logical_x = _cairo_lround (user_x); logical_y = _cairo_lround (user_y); start_x = logical_x; start_y = logical_y; for (i = 0, j = 0; i < num_glyphs; ++i, j = 2 * i) { glyph_buf[i] = (WORD) glyphs[i].index; if (i == num_glyphs - 1) { dxy_buf[j] = 0; dxy_buf[j+1] = 0; } else { double next_user_x = glyphs[i+1].x; double next_user_y = glyphs[i+1].y; int next_logical_x, next_logical_y; cairo_matrix_transform_point(&device_to_logical, &next_user_x, &next_user_y); next_logical_x = _cairo_lround (next_user_x); next_logical_y = _cairo_lround (next_user_y); dxy_buf[j] = _cairo_lround (next_logical_x - logical_x); dxy_buf[j+1] = _cairo_lround (next_logical_y - logical_y); logical_x = next_logical_x; logical_y = next_logical_y; } } win_result = ExtTextOutW(dst->dc, start_x, start_y, ETO_GLYPH_INDEX | ETO_PDY, NULL, glyph_buf, num_glyphs, dxy_buf); if (!win_result) { _cairo_win32_print_gdi_error("_cairo_win32_surface_show_glyphs(ExtTextOutW failed)"); } RestoreDC(dst->dc, -1); if (glyph_buf != glyph_buf_stack) { free(glyph_buf); free(dxy_buf); } return (win_result) ? CAIRO_STATUS_SUCCESS : CAIRO_INT_STATUS_UNSUPPORTED; #else return CAIRO_INT_STATUS_UNSUPPORTED; #endif } #undef STACK_GLYPH_SIZE /** * cairo_win32_surface_create: * @hdc: the DC to create a surface for * * Creates a cairo surface that targets the given DC. The DC will be * queried for its initial clip extents, and this will be used as the * size of the cairo surface. The resulting surface will always be of * format %CAIRO_FORMAT_RGB24; should you need another surface format, * you will need to create one through * cairo_win32_surface_create_with_dib(). * * Return value: the newly created surface **/ cairo_surface_t * cairo_win32_surface_create (HDC hdc) { cairo_win32_surface_t *surface; int depth; cairo_format_t format; RECT rect; /* Assume that everything coming in as a HDC is RGB24 */ format = CAIRO_FORMAT_RGB24; surface = malloc (sizeof (cairo_win32_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); if (_cairo_win32_save_initial_clip (hdc, surface) != CAIRO_STATUS_SUCCESS) { free (surface); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } surface->image = NULL; surface->format = format; surface->dc = hdc; surface->bitmap = NULL; surface->is_dib = FALSE; surface->saved_dc_bitmap = NULL; surface->brush = NULL; surface->old_brush = NULL; GetClipBox(hdc, &rect); surface->extents.x = rect.left; surface->extents.y = rect.top; surface->extents.width = rect.right - rect.left; surface->extents.height = rect.bottom - rect.top; surface->flags = _cairo_win32_flags_for_dc (surface->dc); _cairo_surface_init (&surface->base, &cairo_win32_surface_backend, _cairo_content_from_format (format)); return (cairo_surface_t *)surface; } /** * cairo_win32_surface_create_with_dib: * @format: format of pixels in the surface to create * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates a device-independent-bitmap surface not associated with * any particular existing surface or device context. The created * bitmap will be uninitialized. * * Return value: the newly created surface * * Since: 1.2 **/ cairo_surface_t * cairo_win32_surface_create_with_dib (cairo_format_t format, int width, int height) { return _cairo_win32_surface_create_for_dc (NULL, format, width, height); } /** * cairo_win32_surface_create_with_ddb: * @hdc: the DC to create a surface for * @format: format of pixels in the surface to create * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates a device-independent-bitmap surface not associated with * any particular existing surface or device context. The created * bitmap will be uninitialized. * * Return value: the newly created surface * * Since: 1.4 **/ cairo_surface_t * cairo_win32_surface_create_with_ddb (HDC hdc, cairo_format_t format, int width, int height) { cairo_win32_surface_t *new_surf; HBITMAP ddb; HDC screen_dc, ddb_dc; HBITMAP saved_dc_bitmap; if (format != CAIRO_FORMAT_RGB24) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); /* XXX handle these eventually format != CAIRO_FORMAT_A8 || format != CAIRO_FORMAT_A1) */ if (!hdc) { screen_dc = GetDC (NULL); hdc = screen_dc; } else { screen_dc = NULL; } ddb_dc = CreateCompatibleDC (hdc); if (ddb_dc == NULL) { _cairo_win32_print_gdi_error("CreateCompatibleDC"); new_surf = (cairo_win32_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto FINISH; } ddb = CreateCompatibleBitmap (hdc, width, height); if (ddb == NULL) { DeleteDC (ddb_dc); /* Note that if an app actually does hit this out of memory * condition, it's going to have lots of other issues, as * video memory is probably exhausted. */ _cairo_win32_print_gdi_error("CreateCompatibleBitmap"); new_surf = (cairo_win32_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto FINISH; } saved_dc_bitmap = SelectObject (ddb_dc, ddb); new_surf = (cairo_win32_surface_t*) cairo_win32_surface_create (ddb_dc); new_surf->bitmap = ddb; new_surf->saved_dc_bitmap = saved_dc_bitmap; new_surf->is_dib = FALSE; FINISH: if (screen_dc) ReleaseDC (NULL, screen_dc); return (cairo_surface_t*) new_surf; } /** * _cairo_surface_is_win32: * @surface: a #cairo_surface_t * * Checks if a surface is a win32 surface. This will * return False if this is a win32 printing surface; use * _cairo_surface_is_win32_printing() to check for that. * * Return value: True if the surface is an win32 surface **/ int _cairo_surface_is_win32 (cairo_surface_t *surface) { return surface->backend == &cairo_win32_surface_backend; } /** * cairo_win32_surface_get_dc * @surface: a #cairo_surface_t * * Returns the HDC associated with this surface, or %NULL if none. * Also returns %NULL if the surface is not a win32 surface. * * Return value: HDC or %NULL if no HDC available. * * Since: 1.2 **/ HDC cairo_win32_surface_get_dc (cairo_surface_t *surface) { cairo_win32_surface_t *winsurf; if (!_cairo_surface_is_win32(surface) && !_cairo_surface_is_win32_printing(surface)) return NULL; winsurf = (cairo_win32_surface_t *) surface; return winsurf->dc; } /** * cairo_win32_surface_get_image * @surface: a #cairo_surface_t * * Returns a #cairo_surface_t image surface that refers to the same bits * as the DIB of the Win32 surface. If the passed-in win32 surface * is not a DIB surface, %NULL is returned. * * Return value: a #cairo_surface_t (owned by the win32 #cairo_surface_t), * or %NULL if the win32 surface is not a DIB. * * Since: 1.4 */ cairo_surface_t * cairo_win32_surface_get_image (cairo_surface_t *surface) { if (!_cairo_surface_is_win32(surface)) return NULL; return ((cairo_win32_surface_t*)surface)->image; } static cairo_bool_t _cairo_win32_surface_is_similar (void *surface_a, void *surface_b, cairo_content_t content) { cairo_win32_surface_t *a = surface_a; cairo_win32_surface_t *b = surface_b; return a->dc == b->dc; } static cairo_status_t _cairo_win32_surface_reset (void *abstract_surface) { cairo_win32_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_win32_surface_set_clip_region (surface, NULL); if (status) return status; return CAIRO_STATUS_SUCCESS; } static const cairo_surface_backend_t cairo_win32_surface_backend = { CAIRO_SURFACE_TYPE_WIN32, _cairo_win32_surface_create_similar, _cairo_win32_surface_finish, _cairo_win32_surface_acquire_source_image, _cairo_win32_surface_release_source_image, _cairo_win32_surface_acquire_dest_image, _cairo_win32_surface_release_dest_image, _cairo_win32_surface_clone_similar, _cairo_win32_surface_composite, _cairo_win32_surface_fill_rectangles, NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ _cairo_win32_surface_set_clip_region, NULL, /* intersect_clip_path */ _cairo_win32_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ _cairo_win32_surface_flush, NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ _cairo_win32_surface_show_glyphs, NULL, /* snapshot */ _cairo_win32_surface_is_similar, _cairo_win32_surface_reset }; /* Notes: * * Win32 alpha-understanding functions * * BitBlt - will copy full 32 bits from a 32bpp DIB to result * (so it's safe to use for ARGB32->ARGB32 SOURCE blits) * (but not safe going RGB24->ARGB32, if RGB24 is also represented * as a 32bpp DIB, since the alpha isn't discarded!) * * AlphaBlend - if both the source and dest have alpha, even if AC_SRC_ALPHA isn't set, * it will still copy over the src alpha, because the SCA value (255) will be * multiplied by all the src components. */ #if !defined(CAIRO_WIN32_STATIC_BUILD) /* declare to avoid "no previous prototype for 'DllMain'" warning */ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved); BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: CAIRO_MUTEX_INITIALIZE (); break; case DLL_PROCESS_DETACH: CAIRO_MUTEX_FINALIZE (); break; } return TRUE; } #endif cairo_int_status_t _cairo_win32_save_initial_clip (HDC hdc, cairo_win32_surface_t *surface) { RECT rect; int clipBoxType; int gm; XFORM saved_xform; /* GetClipBox/GetClipRgn and friends interact badly with a world transform * set. GetClipBox returns values in logical (transformed) coordinates; * it's unclear what GetClipRgn returns, because the region is empty in the * case of a SIMPLEREGION clip, but I assume device (untransformed) coordinates. * Similarily, IntersectClipRect works in logical units, whereas SelectClipRgn * works in device units. * * So, avoid the whole mess and get rid of the world transform * while we store our initial data and when we restore initial coordinates. * * XXX we may need to modify x/y by the ViewportOrg or WindowOrg * here in GM_COMPATIBLE; unclear. */ gm = GetGraphicsMode (hdc); if (gm == GM_ADVANCED) { GetWorldTransform (hdc, &saved_xform); ModifyWorldTransform (hdc, NULL, MWT_IDENTITY); } clipBoxType = GetClipBox (hdc, &rect); if (clipBoxType == ERROR) { _cairo_win32_print_gdi_error ("cairo_win32_surface_create"); SetGraphicsMode (hdc, gm); /* XXX: Can we make a more reasonable guess at the error cause here? */ return _cairo_error (CAIRO_STATUS_NO_MEMORY); } surface->clip_rect.x = rect.left; surface->clip_rect.y = rect.top; surface->clip_rect.width = rect.right - rect.left; surface->clip_rect.height = rect.bottom - rect.top; surface->initial_clip_rgn = NULL; surface->had_simple_clip = FALSE; if (clipBoxType == COMPLEXREGION) { surface->initial_clip_rgn = CreateRectRgn (0, 0, 0, 0); if (GetClipRgn (hdc, surface->initial_clip_rgn) <= 0) { DeleteObject(surface->initial_clip_rgn); surface->initial_clip_rgn = NULL; } } else if (clipBoxType == SIMPLEREGION) { surface->had_simple_clip = TRUE; } if (gm == GM_ADVANCED) SetWorldTransform (hdc, &saved_xform); return CAIRO_STATUS_SUCCESS; } cairo_int_status_t _cairo_win32_restore_initial_clip (cairo_win32_surface_t *surface) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; XFORM saved_xform; int gm = GetGraphicsMode (surface->dc); if (gm == GM_ADVANCED) { GetWorldTransform (surface->dc, &saved_xform); ModifyWorldTransform (surface->dc, NULL, MWT_IDENTITY); } /* initial_clip_rgn will either be a real region or NULL (which means reset to no clip region) */ SelectClipRgn (surface->dc, surface->initial_clip_rgn); if (surface->had_simple_clip) { /* then if we had a simple clip, intersect */ IntersectClipRect (surface->dc, surface->clip_rect.x, surface->clip_rect.y, surface->clip_rect.x + surface->clip_rect.width, surface->clip_rect.y + surface->clip_rect.height); } if (gm == GM_ADVANCED) SetWorldTransform (surface->dc, &saved_xform); return status; } void _cairo_win32_debug_dump_hrgn (HRGN rgn, char *header) { RGNDATA *rd; int z; if (header) fprintf (stderr, "%s\n", header); if (rgn == NULL) { fprintf (stderr, " NULL\n"); } z = GetRegionData(rgn, 0, NULL); rd = (RGNDATA*) malloc(z); z = GetRegionData(rgn, z, rd); fprintf (stderr, " %d rects, bounds: %d %d %d %d\n", rd->rdh.nCount, rd->rdh.rcBound.left, rd->rdh.rcBound.top, rd->rdh.rcBound.right - rd->rdh.rcBound.left, rd->rdh.rcBound.bottom - rd->rdh.rcBound.top); for (z = 0; z < rd->rdh.nCount; z++) { RECT r = ((RECT*)rd->Buffer)[z]; fprintf (stderr, " [%d]: [%d %d %d %d]\n", z, r.left, r.top, r.right - r.left, r.bottom - r.top); } free(rd); fflush (stderr); } libgdiplus-2.11/cairo/src/cairo-output-stream.c0000664000175000017500000004253012225470167016504 00000000000000/* cairo-output-stream.c: Output stream abstraction * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Author(s): * Kristian Høgsberg */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" #include "cairo-output-stream-private.h" #include "cairo-compiler-private.h" #include #include #include #include /* Numbers printed with %f are printed with this number of significant * digits after the decimal. */ #define SIGNIFICANT_DIGITS_AFTER_DECIMAL 6 /* Numbers printed with %g are assumed to only have CAIRO_FIXED_FRAC_BITS * bits of precision available after the decimal point. * * FIXED_POINT_DECIMAL_DIGITS specifies the minimum number of decimal * digits after the decimal point required to preserve the available * precision. * * The conversion is: * * FIXED_POINT_DECIMAL_DIGITS = ceil( CAIRO_FIXED_FRAC_BITS * ln(2)/ln(10) ) * * We can replace ceil(x) with (int)(x+1) since x will never be an * integer for any likely value of CAIRO_FIXED_FRAC_BITS. */ #define FIXED_POINT_DECIMAL_DIGITS ((int)(CAIRO_FIXED_FRAC_BITS*0.301029996 + 1)) void _cairo_output_stream_init (cairo_output_stream_t *stream, cairo_output_stream_write_func_t write_func, cairo_output_stream_close_func_t close_func) { stream->write_func = write_func; stream->close_func = close_func; stream->position = 0; stream->status = CAIRO_STATUS_SUCCESS; stream->closed = FALSE; } cairo_status_t _cairo_output_stream_fini (cairo_output_stream_t *stream) { return _cairo_output_stream_close (stream); } const cairo_output_stream_t _cairo_output_stream_nil = { NULL, /* write_func */ NULL, /* close_func */ 0, /* position */ CAIRO_STATUS_NO_MEMORY, FALSE /* closed */ }; static const cairo_output_stream_t _cairo_output_stream_nil_write_error = { NULL, /* write_func */ NULL, /* close_func */ 0, /* position */ CAIRO_STATUS_WRITE_ERROR, FALSE /* closed */ }; typedef struct _cairo_output_stream_with_closure { cairo_output_stream_t base; cairo_write_func_t write_func; cairo_close_func_t close_func; void *closure; } cairo_output_stream_with_closure_t; static cairo_status_t closure_write (cairo_output_stream_t *stream, const unsigned char *data, unsigned int length) { cairo_output_stream_with_closure_t *stream_with_closure = (cairo_output_stream_with_closure_t *) stream; return stream_with_closure->write_func (stream_with_closure->closure, data, length); } static cairo_status_t closure_close (cairo_output_stream_t *stream) { cairo_output_stream_with_closure_t *stream_with_closure = (cairo_output_stream_with_closure_t *) stream; if (stream_with_closure->close_func != NULL) return stream_with_closure->close_func (stream_with_closure->closure); else return CAIRO_STATUS_SUCCESS; } cairo_output_stream_t * _cairo_output_stream_create (cairo_write_func_t write_func, cairo_close_func_t close_func, void *closure) { cairo_output_stream_with_closure_t *stream; stream = malloc (sizeof (cairo_output_stream_with_closure_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, closure_write, closure_close); stream->write_func = write_func; stream->close_func = close_func; stream->closure = closure; return &stream->base; } cairo_output_stream_t * _cairo_output_stream_create_in_error (cairo_status_t status) { cairo_output_stream_t *stream; /* check for the common ones */ if (status == CAIRO_STATUS_NO_MEMORY) return (cairo_output_stream_t *) &_cairo_output_stream_nil; if (status == CAIRO_STATUS_WRITE_ERROR) return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; stream = malloc (sizeof (cairo_output_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (stream, NULL, NULL); stream->status = status; return stream; } cairo_status_t _cairo_output_stream_close (cairo_output_stream_t *stream) { cairo_status_t status; if (stream->closed) return stream->status; if (stream == &_cairo_output_stream_nil || stream == &_cairo_output_stream_nil_write_error) { return stream->status; } if (stream->close_func) { status = stream->close_func (stream); /* Don't overwrite a pre-existing status failure. */ if (stream->status == CAIRO_STATUS_SUCCESS) stream->status = status; } stream->closed = TRUE; return stream->status; } cairo_status_t _cairo_output_stream_destroy (cairo_output_stream_t *stream) { cairo_status_t status; assert (stream != NULL); if (stream == &_cairo_output_stream_nil || stream == &_cairo_output_stream_nil_write_error) { return stream->status; } status = _cairo_output_stream_fini (stream); free (stream); return status; } void _cairo_output_stream_write (cairo_output_stream_t *stream, const void *data, size_t length) { if (length == 0) return; if (stream->status) return; stream->status = stream->write_func (stream, data, length); stream->position += length; } void _cairo_output_stream_write_hex_string (cairo_output_stream_t *stream, const char *data, size_t length) { const char hex_chars[] = "0123456789abcdef"; char buffer[2]; unsigned int i, column; if (stream->status) return; for (i = 0, column = 0; i < length; i++, column++) { if (column == 38) { _cairo_output_stream_write (stream, "\n", 1); column = 0; } buffer[0] = hex_chars[(data[i] >> 4) & 0x0f]; buffer[1] = hex_chars[data[i] & 0x0f]; _cairo_output_stream_write (stream, buffer, 2); } } /* Format a double in a locale independent way and trim trailing * zeros. Based on code from Alex Larson . * http://mail.gnome.org/archives/gtk-devel-list/2001-October/msg00087.html * * The code in the patch is copyright Red Hat, Inc under the LGPL, but * has been relicensed under the LGPL/MPL dual license for inclusion * into cairo (see COPYING). -- Kristian Høgsberg */ static void _cairo_dtostr (char *buffer, size_t size, double d, cairo_bool_t limited_precision) { struct lconv *locale_data; const char *decimal_point; int decimal_point_len; char *p; int decimal_len; int num_zeros, decimal_digits; /* Omit the minus sign from negative zero. */ if (d == 0.0) d = 0.0; locale_data = localeconv (); decimal_point = locale_data->decimal_point; decimal_point_len = strlen (decimal_point); assert (decimal_point_len != 0); if (limited_precision) { snprintf (buffer, size, "%.*f", FIXED_POINT_DECIMAL_DIGITS, d); } else { /* Using "%f" to print numbers less than 0.1 will result in * reduced precision due to the default 6 digits after the * decimal point. * * For numbers is < 0.1, we print with maximum precision and count * the number of zeros between the decimal point and the first * significant digit. We then print the number again with the * number of decimal places that gives us the required number of * significant digits. This ensures the number is correctly * rounded. */ if (fabs (d) >= 0.1) { snprintf (buffer, size, "%f", d); } else { snprintf (buffer, size, "%.18f", d); p = buffer; if (*p == '+' || *p == '-') p++; while (isdigit (*p)) p++; if (strncmp (p, decimal_point, decimal_point_len) == 0) p += decimal_point_len; num_zeros = 0; while (*p++ == '0') num_zeros++; decimal_digits = num_zeros + SIGNIFICANT_DIGITS_AFTER_DECIMAL; if (decimal_digits < 18) snprintf (buffer, size, "%.*f", decimal_digits, d); } } p = buffer; if (*p == '+' || *p == '-') p++; while (isdigit (*p)) p++; if (strncmp (p, decimal_point, decimal_point_len) == 0) { *p = '.'; decimal_len = strlen (p + decimal_point_len); memmove (p + 1, p + decimal_point_len, decimal_len); p[1 + decimal_len] = 0; /* Remove trailing zeros and decimal point if possible. */ for (p = p + decimal_len; *p == '0'; p--) *p = 0; if (*p == '.') { *p = 0; p--; } } } enum { LENGTH_MODIFIER_LONG = 0x100 }; /* Here's a limited reimplementation of printf. The reason for doing * this is primarily to special case handling of doubles. We want * locale independent formatting of doubles and we want to trim * trailing zeros. This is handled by dtostr() above, and the code * below handles everything else by calling snprintf() to do the * formatting. This functionality is only for internal use and we * only implement the formats we actually use. */ void _cairo_output_stream_vprintf (cairo_output_stream_t *stream, const char *fmt, va_list ap) { #define SINGLE_FMT_BUFFER_SIZE 32 char buffer[512], single_fmt[SINGLE_FMT_BUFFER_SIZE]; int single_fmt_length; char *p; const char *f, *start; int length_modifier, width; cairo_bool_t var_width; if (stream->status) return; f = fmt; p = buffer; while (*f != '\0') { if (p == buffer + sizeof (buffer)) { _cairo_output_stream_write (stream, buffer, sizeof (buffer)); p = buffer; } if (*f != '%') { *p++ = *f++; continue; } start = f; f++; if (*f == '0') f++; var_width = FALSE; if (*f == '*') { var_width = TRUE; f++; } while (isdigit (*f)) f++; length_modifier = 0; if (*f == 'l') { length_modifier = LENGTH_MODIFIER_LONG; f++; } /* The only format strings exist in the cairo implementation * itself. So there's an internal consistency problem if any * of them is larger than our format buffer size. */ single_fmt_length = f - start + 1; assert (single_fmt_length + 1 <= SINGLE_FMT_BUFFER_SIZE); /* Reuse the format string for this conversion. */ memcpy (single_fmt, start, single_fmt_length); single_fmt[single_fmt_length] = '\0'; /* Flush contents of buffer before snprintf()'ing into it. */ _cairo_output_stream_write (stream, buffer, p - buffer); p = buffer; /* We group signed and unsigned together in this switch, the * only thing that matters here is the size of the arguments, * since we're just passing the data through to sprintf(). */ switch (*f | length_modifier) { case '%': buffer[0] = *f; buffer[1] = 0; break; case 'd': case 'u': case 'o': case 'x': case 'X': if (var_width) { width = va_arg (ap, int); snprintf (buffer, sizeof buffer, single_fmt, width, va_arg (ap, int)); } else { snprintf (buffer, sizeof buffer, single_fmt, va_arg (ap, int)); } break; case 'd' | LENGTH_MODIFIER_LONG: case 'u' | LENGTH_MODIFIER_LONG: case 'o' | LENGTH_MODIFIER_LONG: case 'x' | LENGTH_MODIFIER_LONG: case 'X' | LENGTH_MODIFIER_LONG: if (var_width) { width = va_arg (ap, int); snprintf (buffer, sizeof buffer, single_fmt, width, va_arg (ap, long int)); } else { snprintf (buffer, sizeof buffer, single_fmt, va_arg (ap, long int)); } break; case 's': snprintf (buffer, sizeof buffer, single_fmt, va_arg (ap, const char *)); break; case 'f': _cairo_dtostr (buffer, sizeof buffer, va_arg (ap, double), FALSE); break; case 'g': _cairo_dtostr (buffer, sizeof buffer, va_arg (ap, double), TRUE); break; case 'c': buffer[0] = va_arg (ap, int); buffer[1] = 0; break; default: ASSERT_NOT_REACHED; } p = buffer + strlen (buffer); f++; } _cairo_output_stream_write (stream, buffer, p - buffer); } void _cairo_output_stream_printf (cairo_output_stream_t *stream, const char *fmt, ...) { va_list ap; va_start (ap, fmt); _cairo_output_stream_vprintf (stream, fmt, ap); va_end (ap); } long _cairo_output_stream_get_position (cairo_output_stream_t *stream) { return stream->position; } cairo_status_t _cairo_output_stream_get_status (cairo_output_stream_t *stream) { return stream->status; } /* Maybe this should be a configure time option, so embedded targets * don't have to pull in stdio. */ typedef struct _stdio_stream { cairo_output_stream_t base; FILE *file; } stdio_stream_t; static cairo_status_t stdio_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { stdio_stream_t *stream = (stdio_stream_t *) base; if (fwrite (data, 1, length, stream->file) != length) return _cairo_error (CAIRO_STATUS_WRITE_ERROR); return CAIRO_STATUS_SUCCESS; } static cairo_status_t stdio_flush (cairo_output_stream_t *base) { stdio_stream_t *stream = (stdio_stream_t *) base; fflush (stream->file); if (ferror (stream->file)) return _cairo_error (CAIRO_STATUS_WRITE_ERROR); else return CAIRO_STATUS_SUCCESS; } static cairo_status_t stdio_close (cairo_output_stream_t *base) { cairo_status_t status; stdio_stream_t *stream = (stdio_stream_t *) base; status = stdio_flush (base); fclose (stream->file); return status; } cairo_output_stream_t * _cairo_output_stream_create_for_file (FILE *file) { stdio_stream_t *stream; if (file == NULL) { _cairo_error_throw (CAIRO_STATUS_WRITE_ERROR); return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; } stream = malloc (sizeof *stream); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, stdio_write, stdio_flush); stream->file = file; return &stream->base; } cairo_output_stream_t * _cairo_output_stream_create_for_filename (const char *filename) { stdio_stream_t *stream; FILE *file; file = fopen (filename, "wb"); if (file == NULL) { switch (errno) { case ENOMEM: _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; default: _cairo_error_throw (CAIRO_STATUS_WRITE_ERROR); return (cairo_output_stream_t *) &_cairo_output_stream_nil_write_error; } } stream = malloc (sizeof *stream); if (stream == NULL) { fclose (file); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, stdio_write, stdio_close); stream->file = file; return &stream->base; } typedef struct _memory_stream { cairo_output_stream_t base; cairo_array_t array; } memory_stream_t; static cairo_status_t memory_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { memory_stream_t *stream = (memory_stream_t *) base; return _cairo_array_append_multiple (&stream->array, data, length); } static cairo_status_t memory_close (cairo_output_stream_t *base) { memory_stream_t *stream = (memory_stream_t *) base; _cairo_array_fini (&stream->array); return CAIRO_STATUS_SUCCESS; } cairo_output_stream_t * _cairo_memory_stream_create (void) { memory_stream_t *stream; stream = malloc (sizeof *stream); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, memory_write, memory_close); _cairo_array_init (&stream->array, 1); return &stream->base; } void _cairo_memory_stream_copy (cairo_output_stream_t *base, cairo_output_stream_t *dest) { memory_stream_t *stream = (memory_stream_t *) base; if (dest->status) return; if (base->status) { dest->status = base->status; return; } _cairo_output_stream_write (dest, _cairo_array_index (&stream->array, 0), _cairo_array_num_elements (&stream->array)); } int _cairo_memory_stream_length (cairo_output_stream_t *base) { memory_stream_t *stream = (memory_stream_t *) base; return _cairo_array_num_elements (&stream->array); } libgdiplus-2.11/cairo/src/cairo-fixed-private.h0000664000175000017500000001563112225470167016431 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_FIXED_PRIVATE_H #define CAIRO_FIXED_PRIVATE_H #include "cairo-fixed-type-private.h" #include "cairo-wideint-private.h" /* Implementation */ #if (CAIRO_FIXED_BITS != 32) # error CAIRO_FIXED_BITS must be 32, and the type must be a 32-bit type. # error To remove this limitation, you will have to fix the tesselator. #endif #define CAIRO_FIXED_ONE ((cairo_fixed_t)(1 << CAIRO_FIXED_FRAC_BITS)) #define CAIRO_FIXED_ONE_DOUBLE ((double)(1 << CAIRO_FIXED_FRAC_BITS)) #define CAIRO_FIXED_EPSILON ((cairo_fixed_t)(1)) #define CAIRO_FIXED_FRAC_MASK (((cairo_fixed_unsigned_t)(-1)) >> (CAIRO_FIXED_BITS - CAIRO_FIXED_FRAC_BITS)) #define CAIRO_FIXED_WHOLE_MASK (~CAIRO_FIXED_FRAC_MASK) static inline cairo_fixed_t _cairo_fixed_from_int (int i) { return i << CAIRO_FIXED_FRAC_BITS; } /* This is the "magic number" approach to converting a double into fixed * point as described here: * * http://www.stereopsis.com/sree/fpu2006.html (an overview) * http://www.d6.com/users/checker/pdfs/gdmfp.pdf (in detail) * * The basic idea is to add a large enough number to the double that the * literal floating point is moved up to the extent that it forces the * double's value to be shifted down to the bottom of the mantissa (to make * room for the large number being added in). Since the mantissa is, at a * given moment in time, a fixed point integer itself, one can convert a * float to various fixed point representations by moving around the point * of a floating point number through arithmetic operations. This behavior * is reliable on most modern platforms as it is mandated by the IEEE-754 * standard for floating point arithmetic. * * For our purposes, a "magic number" must be carefully selected that is * both large enough to produce the desired point-shifting effect, and also * has no lower bits in its representation that would interfere with our * value at the bottom of the mantissa. The magic number is calculated as * follows: * * (2 ^ (MANTISSA_SIZE - FRACTIONAL_SIZE)) * 1.5 * * where in our case: * - MANTISSA_SIZE for 64-bit doubles is 52 * - FRACTIONAL_SIZE for 16.16 fixed point is 16 * * Although this approach provides a very large speedup of this function * on a wide-array of systems, it does come with two caveats: * * 1) It uses banker's rounding as opposed to arithmetic rounding. * 2) It doesn't function properly if the FPU is in single-precision * mode. */ /* The 16.16 number must always be available */ #define CAIRO_MAGIC_NUMBER_FIXED_16_16 (103079215104.0) #if CAIRO_FIXED_BITS <= 32 #define CAIRO_MAGIC_NUMBER_FIXED ((1LL << (52 - CAIRO_FIXED_FRAC_BITS)) * 1.5) /* For 32-bit fixed point numbers */ static inline cairo_fixed_t _cairo_fixed_from_double (double d) { union { double d; int32_t i[2]; } u; u.d = d + CAIRO_MAGIC_NUMBER_FIXED; #ifdef FLOAT_WORDS_BIGENDIAN return u.i[1]; #else return u.i[0]; #endif } #else # error Please define a magic number for your fixed point type! # error See cairo-fixed-private.h for details. #endif static inline cairo_fixed_t _cairo_fixed_from_26_6 (uint32_t i) { #if CAIRO_FIXED_FRAC_BITS > 6 return i << (CAIRO_FIXED_FRAC_BITS - 6); #else return i >> (6 - CAIRO_FIXED_FRAC_BITS); #endif } static inline double _cairo_fixed_to_double (cairo_fixed_t f) { return ((double) f) / CAIRO_FIXED_ONE_DOUBLE; } static inline int _cairo_fixed_is_integer (cairo_fixed_t f) { return (f & CAIRO_FIXED_FRAC_MASK) == 0; } static inline int _cairo_fixed_integer_part (cairo_fixed_t f) { return f >> CAIRO_FIXED_FRAC_BITS; } static inline int _cairo_fixed_integer_floor (cairo_fixed_t f) { if (f >= 0) return f >> CAIRO_FIXED_FRAC_BITS; else return -((-f - 1) >> CAIRO_FIXED_FRAC_BITS) - 1; } static inline int _cairo_fixed_integer_ceil (cairo_fixed_t f) { if (f > 0) return ((f - 1)>>CAIRO_FIXED_FRAC_BITS) + 1; else return - (-f >> CAIRO_FIXED_FRAC_BITS); } /* A bunch of explicit 16.16 operators; we need these * to interface with pixman and other backends that require * 16.16 fixed point types. */ static inline cairo_fixed_16_16_t _cairo_fixed_to_16_16 (cairo_fixed_t f) { #if (CAIRO_FIXED_FRAC_BITS == 16) && (CAIRO_FIXED_BITS == 32) return f; #elif CAIRO_FIXED_FRAC_BITS > 16 /* We're just dropping the low bits, so we won't ever got over/underflow here */ return f >> (CAIRO_FIXED_FRAC_BITS - 16); #else cairo_fixed_16_16_t x; /* Handle overflow/underflow by clamping to the lowest/highest * value representable as 16.16 */ if ((f >> CAIRO_FIXED_FRAC_BITS) < INT16_MIN) { x = INT32_MIN; } else if ((f >> CAIRO_FIXED_FRAC_BITS) > INT16_MAX) { x = INT32_MAX; } else { x = f << (16 - CAIRO_FIXED_FRAC_BITS); } return x; #endif } static inline cairo_fixed_16_16_t _cairo_fixed_16_16_from_double (double d) { union { double d; int32_t i[2]; } u; u.d = d + CAIRO_MAGIC_NUMBER_FIXED_16_16; #ifdef FLOAT_WORDS_BIGENDIAN return u.i[1]; #else return u.i[0]; #endif } #if CAIRO_FIXED_BITS == 32 static inline cairo_fixed_t _cairo_fixed_mul (cairo_fixed_t a, cairo_fixed_t b) { cairo_int64_t temp = _cairo_int32x32_64_mul (a, b); return _cairo_int64_to_int32(_cairo_int64_rsl (temp, CAIRO_FIXED_FRAC_BITS)); } #else # error Please define multiplication and other operands for your fixed-point type size #endif #endif /* CAIRO_FIXED_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-path-bounds.c0000664000175000017500000001136212225470167016076 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" typedef struct cairo_path_bounder { cairo_point_t move_to_point; cairo_bool_t has_move_to_point; cairo_bool_t has_point; cairo_fixed_t min_x; cairo_fixed_t min_y; cairo_fixed_t max_x; cairo_fixed_t max_y; } cairo_path_bounder_t; static void _cairo_path_bounder_init (cairo_path_bounder_t *bounder); static void _cairo_path_bounder_fini (cairo_path_bounder_t *bounder); static void _cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, cairo_point_t *point); static cairo_status_t _cairo_path_bounder_move_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_path_bounder_line_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_path_bounder_close_path (void *closure); static void _cairo_path_bounder_init (cairo_path_bounder_t *bounder) { bounder->has_move_to_point = FALSE; bounder->has_point = FALSE; } static void _cairo_path_bounder_fini (cairo_path_bounder_t *bounder) { bounder->has_move_to_point = FALSE; bounder->has_point = FALSE; } static void _cairo_path_bounder_add_point (cairo_path_bounder_t *bounder, cairo_point_t *point) { if (bounder->has_point) { if (point->x < bounder->min_x) bounder->min_x = point->x; if (point->y < bounder->min_y) bounder->min_y = point->y; if (point->x > bounder->max_x) bounder->max_x = point->x; if (point->y > bounder->max_y) bounder->max_y = point->y; } else { bounder->min_x = point->x; bounder->min_y = point->y; bounder->max_x = point->x; bounder->max_y = point->y; bounder->has_point = TRUE; } } static cairo_status_t _cairo_path_bounder_move_to (void *closure, cairo_point_t *point) { cairo_path_bounder_t *bounder = closure; bounder->move_to_point = *point; bounder->has_move_to_point = TRUE; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_bounder_line_to (void *closure, cairo_point_t *point) { cairo_path_bounder_t *bounder = closure; if (bounder->has_move_to_point) { _cairo_path_bounder_add_point (bounder, &bounder->move_to_point); bounder->has_move_to_point = FALSE; } _cairo_path_bounder_add_point (bounder, point); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_bounder_close_path (void *closure) { return CAIRO_STATUS_SUCCESS; } /* XXX: Perhaps this should compute a PixRegion rather than 4 doubles */ cairo_status_t _cairo_path_fixed_bounds (cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2, double tolerance) { cairo_path_bounder_t bounder; cairo_status_t status; _cairo_path_bounder_init (&bounder); status = _cairo_path_fixed_interpret_flat (path, CAIRO_DIRECTION_FORWARD, _cairo_path_bounder_move_to, _cairo_path_bounder_line_to, _cairo_path_bounder_close_path, &bounder, tolerance); if (status == CAIRO_STATUS_SUCCESS && bounder.has_point) { *x1 = _cairo_fixed_to_double (bounder.min_x); *y1 = _cairo_fixed_to_double (bounder.min_y); *x2 = _cairo_fixed_to_double (bounder.max_x); *y2 = _cairo_fixed_to_double (bounder.max_y); } else { *x1 = 0.0; *y1 = 0.0; *x2 = 0.0; *y2 = 0.0; } _cairo_path_bounder_fini (&bounder); return status; } libgdiplus-2.11/cairo/src/cairo-path-fixed.c0000664000175000017500000005210312225470167015701 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-path-fixed-private.h" /* private functions */ static cairo_status_t _cairo_path_fixed_add (cairo_path_fixed_t *path, cairo_path_op_t op, cairo_point_t *points, int num_points); static void _cairo_path_fixed_add_buf (cairo_path_fixed_t *path, cairo_path_buf_t *buf); static cairo_path_buf_t * _cairo_path_buf_create (int buf_size); static void _cairo_path_buf_destroy (cairo_path_buf_t *buf); static void _cairo_path_buf_add_op (cairo_path_buf_t *buf, cairo_path_op_t op); static void _cairo_path_buf_add_points (cairo_path_buf_t *buf, cairo_point_t *points, int num_points); void _cairo_path_fixed_init (cairo_path_fixed_t *path) { path->buf_head.base.next = NULL; path->buf_head.base.prev = NULL; path->buf_tail = &path->buf_head.base; path->buf_head.base.num_ops = 0; path->buf_head.base.num_points = 0; path->buf_head.base.buf_size = CAIRO_PATH_BUF_SIZE; path->buf_head.base.op = path->buf_head.op; path->buf_head.base.points = path->buf_head.points; path->current_point.x = 0; path->current_point.y = 0; path->has_current_point = FALSE; path->has_curve_to = FALSE; path->last_move_point = path->current_point; } cairo_status_t _cairo_path_fixed_init_copy (cairo_path_fixed_t *path, cairo_path_fixed_t *other) { cairo_path_buf_t *buf, *other_buf; unsigned int num_points, num_ops, buf_size; _cairo_path_fixed_init (path); path->current_point = other->current_point; path->has_current_point = other->has_current_point; path->has_curve_to = other->has_curve_to; path->last_move_point = other->last_move_point; path->buf_head.base.num_ops = other->buf_head.base.num_ops; path->buf_head.base.num_points = other->buf_head.base.num_points; path->buf_head.base.buf_size = other->buf_head.base.buf_size; memcpy (path->buf_head.op, other->buf_head.base.op, other->buf_head.base.num_ops * sizeof (other->buf_head.op[0])); memcpy (path->buf_head.points, other->buf_head.points, other->buf_head.base.num_points * sizeof (other->buf_head.points[0])); num_points = num_ops = 0; for (other_buf = other->buf_head.base.next; other_buf != NULL; other_buf = other_buf->next) { num_ops += other_buf->num_ops; num_points += other_buf->num_points; } buf_size = MAX (num_ops, (num_points + 1) / 2); if (buf_size) { buf = _cairo_path_buf_create (buf_size); if (buf == NULL) { _cairo_path_fixed_fini (path); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (other_buf = other->buf_head.base.next; other_buf != NULL; other_buf = other_buf->next) { memcpy (buf->op + buf->num_ops, other_buf->op, other_buf->num_ops * sizeof (buf->op[0])); buf->num_ops += other_buf->num_ops; memcpy (buf->points + buf->num_points, other_buf->points, other_buf->num_points * sizeof (buf->points[0])); buf->num_points += other_buf->num_points; } _cairo_path_fixed_add_buf (path, buf); } return CAIRO_STATUS_SUCCESS; } cairo_path_fixed_t * _cairo_path_fixed_create (void) { cairo_path_fixed_t *path; path = malloc (sizeof (cairo_path_fixed_t)); if (!path) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } _cairo_path_fixed_init (path); return path; } void _cairo_path_fixed_fini (cairo_path_fixed_t *path) { cairo_path_buf_t *buf; buf = path->buf_head.base.next; while (buf) { cairo_path_buf_t *this = buf; buf = buf->next; _cairo_path_buf_destroy (this); } path->buf_head.base.next = NULL; path->buf_head.base.prev = NULL; path->buf_tail = &path->buf_head.base; path->buf_head.base.num_ops = 0; path->buf_head.base.num_points = 0; path->has_current_point = FALSE; path->has_curve_to = FALSE; } void _cairo_path_fixed_destroy (cairo_path_fixed_t *path) { _cairo_path_fixed_fini (path); free (path); } cairo_status_t _cairo_path_fixed_move_to (cairo_path_fixed_t *path, cairo_fixed_t x, cairo_fixed_t y) { cairo_status_t status; cairo_point_t point; point.x = x; point.y = y; /* If the previous op was also a MOVE_TO, then just change its * point rather than adding a new op. */ if (path->buf_tail && path->buf_tail->num_ops && path->buf_tail->op[path->buf_tail->num_ops - 1] == CAIRO_PATH_OP_MOVE_TO) { cairo_point_t *last_move_to_point; last_move_to_point = &path->buf_tail->points[path->buf_tail->num_points - 1]; *last_move_to_point = point; } else { status = _cairo_path_fixed_add (path, CAIRO_PATH_OP_MOVE_TO, &point, 1); if (status) return status; } path->current_point = point; path->has_current_point = TRUE; path->last_move_point = path->current_point; return CAIRO_STATUS_SUCCESS; } void _cairo_path_fixed_new_sub_path (cairo_path_fixed_t *path) { path->has_current_point = FALSE; } cairo_status_t _cairo_path_fixed_rel_move_to (cairo_path_fixed_t *path, cairo_fixed_t dx, cairo_fixed_t dy) { cairo_fixed_t x, y; if (! path->has_current_point) return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); x = path->current_point.x + dx; y = path->current_point.y + dy; return _cairo_path_fixed_move_to (path, x, y); } cairo_status_t _cairo_path_fixed_line_to (cairo_path_fixed_t *path, cairo_fixed_t x, cairo_fixed_t y) { cairo_status_t status; cairo_point_t point; point.x = x; point.y = y; /* When there is not yet a current point, the line_to operation * becomes a move_to instead. Note: We have to do this by * explicitly calling into _cairo_path_fixed_line_to to ensure * that the last_move_point state is updated properly. */ if (! path->has_current_point) status = _cairo_path_fixed_move_to (path, point.x, point.y); else status = _cairo_path_fixed_add (path, CAIRO_PATH_OP_LINE_TO, &point, 1); if (status) return status; path->current_point = point; path->has_current_point = TRUE; return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_path_fixed_rel_line_to (cairo_path_fixed_t *path, cairo_fixed_t dx, cairo_fixed_t dy) { cairo_fixed_t x, y; if (! path->has_current_point) return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); x = path->current_point.x + dx; y = path->current_point.y + dy; return _cairo_path_fixed_line_to (path, x, y); } cairo_status_t _cairo_path_fixed_curve_to (cairo_path_fixed_t *path, cairo_fixed_t x0, cairo_fixed_t y0, cairo_fixed_t x1, cairo_fixed_t y1, cairo_fixed_t x2, cairo_fixed_t y2) { cairo_status_t status; cairo_point_t point[3]; point[0].x = x0; point[0].y = y0; point[1].x = x1; point[1].y = y1; point[2].x = x2; point[2].y = y2; if (! path->has_current_point) { status = _cairo_path_fixed_add (path, CAIRO_PATH_OP_MOVE_TO, &point[0], 1); if (status) return status; } status = _cairo_path_fixed_add (path, CAIRO_PATH_OP_CURVE_TO, point, 3); if (status) return status; path->current_point = point[2]; path->has_current_point = TRUE; path->has_curve_to = TRUE; return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_path_fixed_rel_curve_to (cairo_path_fixed_t *path, cairo_fixed_t dx0, cairo_fixed_t dy0, cairo_fixed_t dx1, cairo_fixed_t dy1, cairo_fixed_t dx2, cairo_fixed_t dy2) { cairo_fixed_t x0, y0; cairo_fixed_t x1, y1; cairo_fixed_t x2, y2; if (! path->has_current_point) return _cairo_error (CAIRO_STATUS_NO_CURRENT_POINT); x0 = path->current_point.x + dx0; y0 = path->current_point.y + dy0; x1 = path->current_point.x + dx1; y1 = path->current_point.y + dy1; x2 = path->current_point.x + dx2; y2 = path->current_point.y + dy2; return _cairo_path_fixed_curve_to (path, x0, y0, x1, y1, x2, y2); } cairo_status_t _cairo_path_fixed_close_path (cairo_path_fixed_t *path) { cairo_status_t status; if (! path->has_current_point) return CAIRO_STATUS_SUCCESS; status = _cairo_path_fixed_add (path, CAIRO_PATH_OP_CLOSE_PATH, NULL, 0); if (status) return status; status = _cairo_path_fixed_move_to (path, path->last_move_point.x, path->last_move_point.y); if (status) return status; return CAIRO_STATUS_SUCCESS; } cairo_bool_t _cairo_path_fixed_get_current_point (cairo_path_fixed_t *path, cairo_fixed_t *x, cairo_fixed_t *y) { if (! path->has_current_point) return FALSE; *x = path->current_point.x; *y = path->current_point.y; return TRUE; } static cairo_status_t _cairo_path_fixed_add (cairo_path_fixed_t *path, cairo_path_op_t op, cairo_point_t *points, int num_points) { cairo_path_buf_t *buf = path->buf_tail; if (buf->num_ops + 1 > buf->buf_size || buf->num_points + num_points > 2 * buf->buf_size) { buf = _cairo_path_buf_create (buf->buf_size * 2); if (buf == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_path_fixed_add_buf (path, buf); } _cairo_path_buf_add_op (buf, op); _cairo_path_buf_add_points (buf, points, num_points); return CAIRO_STATUS_SUCCESS; } static void _cairo_path_fixed_add_buf (cairo_path_fixed_t *path, cairo_path_buf_t *buf) { buf->next = NULL; buf->prev = path->buf_tail; path->buf_tail->next = buf; path->buf_tail = buf; } static cairo_path_buf_t * _cairo_path_buf_create (int buf_size) { cairo_path_buf_t *buf; /* adjust buf_size to ensure that buf->points is naturally aligned */ buf_size += sizeof (double) - ((buf_size + sizeof (cairo_path_buf_t)) & (sizeof (double)-1)); buf = _cairo_malloc_ab_plus_c (buf_size, sizeof (cairo_path_op_t) + 2 * sizeof (cairo_point_t), sizeof (cairo_path_buf_t)); if (buf) { buf->next = NULL; buf->prev = NULL; buf->num_ops = 0; buf->num_points = 0; buf->buf_size = buf_size; buf->op = (cairo_path_op_t *) (buf + 1); buf->points = (cairo_point_t *) (buf->op + buf_size); } return buf; } static void _cairo_path_buf_destroy (cairo_path_buf_t *buf) { free (buf); } static void _cairo_path_buf_add_op (cairo_path_buf_t *buf, cairo_path_op_t op) { buf->op[buf->num_ops++] = op; } static void _cairo_path_buf_add_points (cairo_path_buf_t *buf, cairo_point_t *points, int num_points) { int i; for (i=0; i < num_points; i++) { buf->points[buf->num_points++] = points[i]; } } static int const num_args[] = { 1, /* cairo_path_move_to */ 1, /* cairo_path_op_line_to */ 3, /* cairo_path_op_curve_to */ 0, /* cairo_path_op_close_path */ }; cairo_status_t _cairo_path_fixed_interpret (cairo_path_fixed_t *path, cairo_direction_t dir, cairo_path_fixed_move_to_func_t *move_to, cairo_path_fixed_line_to_func_t *line_to, cairo_path_fixed_curve_to_func_t *curve_to, cairo_path_fixed_close_path_func_t *close_path, void *closure) { cairo_status_t status; cairo_path_buf_t *buf; cairo_path_op_t op; cairo_bool_t forward = (dir == CAIRO_DIRECTION_FORWARD); int step = forward ? 1 : -1; for (buf = forward ? &path->buf_head.base : path->buf_tail; buf; buf = forward ? buf->next : buf->prev) { cairo_point_t *points; int start, stop, i; if (forward) { start = 0; stop = buf->num_ops; points = buf->points; } else { start = buf->num_ops - 1; stop = -1; points = buf->points + buf->num_points; } for (i=start; i != stop; i += step) { op = buf->op[i]; if (! forward) { points -= num_args[(int) op]; } switch (op) { case CAIRO_PATH_OP_MOVE_TO: status = (*move_to) (closure, &points[0]); break; case CAIRO_PATH_OP_LINE_TO: status = (*line_to) (closure, &points[0]); break; case CAIRO_PATH_OP_CURVE_TO: status = (*curve_to) (closure, &points[0], &points[1], &points[2]); break; case CAIRO_PATH_OP_CLOSE_PATH: default: status = (*close_path) (closure); break; } if (status) return status; if (forward) { points += num_args[(int) op]; } } } return CAIRO_STATUS_SUCCESS; } static void _cairo_path_fixed_offset_and_scale (cairo_path_fixed_t *path, cairo_fixed_t offx, cairo_fixed_t offy, cairo_fixed_t scalex, cairo_fixed_t scaley) { cairo_path_buf_t *buf = &path->buf_head.base; int i; while (buf) { for (i = 0; i < buf->num_points; i++) { if (scalex != CAIRO_FIXED_ONE) buf->points[i].x = _cairo_fixed_mul (buf->points[i].x, scalex); buf->points[i].x += offx; if (scaley != CAIRO_FIXED_ONE) buf->points[i].y = _cairo_fixed_mul (buf->points[i].y, scaley); buf->points[i].y += offy; } buf = buf->next; } } /** * _cairo_path_fixed_device_transform: * @path: a #cairo_path_fixed_t to be transformed * @device_transform: a matrix with only scaling/translation (no rotation or shear) * * Transform the fixed-point path according to the scaling and * translation of the given matrix. This function assert()s that the * given matrix has no rotation or shear elements, (that is, xy and yx * are 0.0). **/ void _cairo_path_fixed_device_transform (cairo_path_fixed_t *path, cairo_matrix_t *device_transform) { assert (device_transform->yx == 0.0 && device_transform->xy == 0.0); /* XXX: Support freeform matrices someday (right now, only translation and scale * work. */ _cairo_path_fixed_offset_and_scale (path, _cairo_fixed_from_double (device_transform->x0), _cairo_fixed_from_double (device_transform->y0), _cairo_fixed_from_double (device_transform->xx), _cairo_fixed_from_double (device_transform->yy)); } cairo_bool_t _cairo_path_fixed_is_equal (cairo_path_fixed_t *path, cairo_path_fixed_t *other) { cairo_path_buf_t *path_buf, *other_buf; if (path->current_point.x != other->current_point.x || path->current_point.y != other->current_point.y || path->has_current_point != other->has_current_point || path->has_curve_to != other->has_curve_to || path->last_move_point.x != other->last_move_point.x || path->last_move_point.y != other->last_move_point.y) return FALSE; other_buf = &other->buf_head.base; for (path_buf = &path->buf_head.base; path_buf != NULL; path_buf = path_buf->next) { if (other_buf == NULL || path_buf->num_ops != other_buf->num_ops || path_buf->num_points != other_buf->num_points || memcmp (path_buf->op, other_buf->op, sizeof (cairo_path_op_t) * path_buf->num_ops) != 0 || memcmp (path_buf->points, other_buf->points, sizeof (cairo_point_t) * path_buf->num_points) != 0) { return FALSE; } other_buf = other_buf->next; } return TRUE; } /* Closure for path flattening */ typedef struct cairo_path_flattener { double tolerance; cairo_point_t current_point; cairo_path_fixed_move_to_func_t *move_to; cairo_path_fixed_line_to_func_t *line_to; cairo_path_fixed_close_path_func_t *close_path; void *closure; } cpf_t; static cairo_status_t _cpf_move_to (void *closure, cairo_point_t *point) { cpf_t *cpf = closure; cpf->current_point = *point; return cpf->move_to (cpf->closure, point); } static cairo_status_t _cpf_line_to (void *closure, cairo_point_t *point) { cpf_t *cpf = closure; cpf->current_point = *point; return cpf->line_to (cpf->closure, point); } static cairo_status_t _cpf_curve_to (void *closure, cairo_point_t *p1, cairo_point_t *p2, cairo_point_t *p3) { cpf_t *cpf = closure; cairo_status_t status; cairo_spline_t spline; int i; cairo_point_t *p0 = &cpf->current_point; status = _cairo_spline_init (&spline, p0, p1, p2, p3); if (status == CAIRO_INT_STATUS_DEGENERATE) return CAIRO_STATUS_SUCCESS; status = _cairo_spline_decompose (&spline, cpf->tolerance); if (status) goto out; for (i=1; i < spline.num_points; i++) { status = cpf->line_to (cpf->closure, &spline.points[i]); if (status) goto out; } cpf->current_point = *p3; status = CAIRO_STATUS_SUCCESS; out: _cairo_spline_fini (&spline); return status; } static cairo_status_t _cpf_close_path (void *closure) { cpf_t *cpf = closure; return cpf->close_path (cpf->closure); } cairo_status_t _cairo_path_fixed_interpret_flat (cairo_path_fixed_t *path, cairo_direction_t dir, cairo_path_fixed_move_to_func_t *move_to, cairo_path_fixed_line_to_func_t *line_to, cairo_path_fixed_close_path_func_t *close_path, void *closure, double tolerance) { cpf_t flattener; flattener.tolerance = tolerance; flattener.move_to = move_to; flattener.line_to = line_to; flattener.close_path = close_path; flattener.closure = closure; return _cairo_path_fixed_interpret (path, dir, _cpf_move_to, _cpf_line_to, _cpf_curve_to, _cpf_close_path, &flattener); } cairo_bool_t _cairo_path_fixed_is_empty (cairo_path_fixed_t *path) { if (path->buf_head.base.num_ops == 0) return TRUE; return FALSE; } /** * Check whether the given path contains a single rectangle. */ cairo_bool_t _cairo_path_fixed_is_box (cairo_path_fixed_t *path, cairo_box_t *box) { cairo_path_buf_t *buf = &path->buf_head.base; /* We can't have more than one buf for this check */ if (buf->next != NULL) return FALSE; /* Do we have the right number of ops? */ if (buf->num_ops != 5 && buf->num_ops != 6) return FALSE; /* Check whether the ops are those that would be used for a rectangle */ if (buf->op[0] != CAIRO_PATH_OP_MOVE_TO || buf->op[1] != CAIRO_PATH_OP_LINE_TO || buf->op[2] != CAIRO_PATH_OP_LINE_TO || buf->op[3] != CAIRO_PATH_OP_LINE_TO) { return FALSE; } /* Now, there are choices. The rectangle might end with a LINE_TO * (to the original point), but this isn't required. If it * doesn't, then it must end with a CLOSE_PATH. */ if (buf->op[4] == CAIRO_PATH_OP_LINE_TO) { if (buf->points[4].x != buf->points[0].x || buf->points[4].y != buf->points[0].y) return FALSE; } else if (buf->op[4] != CAIRO_PATH_OP_CLOSE_PATH) { return FALSE; } if (buf->num_ops == 6) { /* A trailing CLOSE_PATH or MOVE_TO is ok */ if (buf->op[5] != CAIRO_PATH_OP_MOVE_TO && buf->op[5] != CAIRO_PATH_OP_CLOSE_PATH) return FALSE; } /* Ok, we may have a box, if the points line up */ if (buf->points[0].y == buf->points[1].y && buf->points[1].x == buf->points[2].x && buf->points[2].y == buf->points[3].y && buf->points[3].x == buf->points[0].x) { if (box) { box->p1 = buf->points[0]; box->p2 = buf->points[2]; } return TRUE; } if (buf->points[0].x == buf->points[1].x && buf->points[1].y == buf->points[2].y && buf->points[2].x == buf->points[3].x && buf->points[3].y == buf->points[0].y) { if (box) { box->p1 = buf->points[0]; box->p2 = buf->points[2]; } return TRUE; } return FALSE; } /** * Check whether the given path contains a single rectangle * that is logically equivalent to: * cairo_move_to (cr, x, y); * cairo_rel_line_to (cr, width, 0); * cairo_rel_line_to (cr, 0, height); * cairo_rel_line_to (cr, -width, 0); * cairo_close_path (cr); */ cairo_bool_t _cairo_path_fixed_is_rectangle (cairo_path_fixed_t *path, cairo_box_t *box) { cairo_path_buf_t *buf = &path->buf_head.base; if (!_cairo_path_fixed_is_box (path, box)) return FALSE; if (buf->points[0].y == buf->points[1].y) return TRUE; return FALSE; } libgdiplus-2.11/cairo/src/cairo-output-stream-private.h0000664000175000017500000001407612225470167020165 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Author(s): * Kristian Høgsberg */ #ifndef CAIRO_OUTPUT_STREAM_PRIVATE_H #define CAIRO_OUTPUT_STREAM_PRIVATE_H #include "cairo-compiler-private.h" #include "cairo-types-private.h" typedef cairo_status_t (*cairo_output_stream_write_func_t) (cairo_output_stream_t *output_stream, const unsigned char *data, unsigned int length); typedef cairo_status_t (*cairo_output_stream_close_func_t) (cairo_output_stream_t *output_stream); struct _cairo_output_stream { cairo_output_stream_write_func_t write_func; cairo_output_stream_close_func_t close_func; unsigned long position; cairo_status_t status; cairo_bool_t closed; }; extern const cairo_private cairo_output_stream_t _cairo_output_stream_nil; cairo_private void _cairo_output_stream_init (cairo_output_stream_t *stream, cairo_output_stream_write_func_t write_func, cairo_output_stream_close_func_t close_func); cairo_private cairo_status_t _cairo_output_stream_fini (cairo_output_stream_t *stream); /* We already have the following declared in cairo.h: typedef cairo_status_t (*cairo_write_func_t) (void *closure, const unsigned char *data, unsigned int length); */ typedef cairo_status_t (*cairo_close_func_t) (void *closure); /* This function never returns %NULL. If an error occurs (NO_MEMORY) * while trying to create the output stream this function returns a * valid pointer to a nil output stream. * * Note that even with a nil surface, the close_func callback will be * called by a call to _cairo_output_stream_close or * _cairo_output_stream_destroy. */ cairo_private cairo_output_stream_t * _cairo_output_stream_create (cairo_write_func_t write_func, cairo_close_func_t close_func, void *closure); cairo_private cairo_output_stream_t * _cairo_output_stream_create_in_error (cairo_status_t status); /* Returns the final status value associated with this object, just * before its last gasp. This final status value will capture any * status failure returned by the stream's close_func as well. */ cairo_private cairo_status_t _cairo_output_stream_close (cairo_output_stream_t *stream); /* Returns the final status value associated with this object, just * before its last gasp. This final status value will capture any * status failure returned by the stream's close_func as well. */ cairo_private cairo_status_t _cairo_output_stream_destroy (cairo_output_stream_t *stream); cairo_private void _cairo_output_stream_write (cairo_output_stream_t *stream, const void *data, size_t length); cairo_private void _cairo_output_stream_write_hex_string (cairo_output_stream_t *stream, const char *data, size_t length); cairo_private void _cairo_output_stream_vprintf (cairo_output_stream_t *stream, const char *fmt, va_list ap) CAIRO_PRINTF_FORMAT ( 2, 0); cairo_private void _cairo_output_stream_printf (cairo_output_stream_t *stream, const char *fmt, ...) CAIRO_PRINTF_FORMAT (2, 3); cairo_private long _cairo_output_stream_get_position (cairo_output_stream_t *stream); cairo_private cairo_status_t _cairo_output_stream_get_status (cairo_output_stream_t *stream); /* This function never returns %NULL. If an error occurs (NO_MEMORY or * WRITE_ERROR) while trying to create the output stream this function * returns a valid pointer to a nil output stream. * * Note: Even if a nil surface is returned, the caller should still * call _cairo_output_stream_destroy (or _cairo_output_stream_close at * least) in order to ensure that everything is properly cleaned up. */ cairo_private cairo_output_stream_t * _cairo_output_stream_create_for_filename (const char *filename); /* This function never returns %NULL. If an error occurs (NO_MEMORY or * WRITE_ERROR) while trying to create the output stream this function * returns a valid pointer to a nil output stream. * * The caller still "owns" file and is responsible for calling fclose * on it when finished. The stream will not do this itself. */ cairo_private cairo_output_stream_t * _cairo_output_stream_create_for_file (FILE *file); cairo_private cairo_output_stream_t * _cairo_memory_stream_create (void); cairo_private void _cairo_memory_stream_copy (cairo_output_stream_t *base, cairo_output_stream_t *dest); cairo_private int _cairo_memory_stream_length (cairo_output_stream_t *stream); /* cairo_base85_stream.c */ cairo_private cairo_output_stream_t * _cairo_base85_stream_create (cairo_output_stream_t *output); /* cairo_deflate_stream.c */ cairo_private cairo_output_stream_t * _cairo_deflate_stream_create (cairo_output_stream_t *output); #endif /* CAIRO_OUTPUT_STREAM_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-hash-private.h0000664000175000017500000000602612225470167016253 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc. * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Keith Packard * Graydon Hoare * Carl Worth */ #ifndef CAIRO_HASH_PRIVATE_H #define CAIRO_HASH_PRIVATE_H #include "cairo-compiler-private.h" #include "cairo-types-private.h" /* XXX: I'd like this file to be self-contained in terms of * includeability, but that's not really possible with the current * monolithic cairoint.h. So, for now, just include cairoint.h instead * if you want to include this file. */ typedef cairo_bool_t (*cairo_hash_keys_equal_func_t) (const void *key_a, const void *key_b); typedef cairo_bool_t (*cairo_hash_predicate_func_t) (void *entry); typedef void (*cairo_hash_callback_func_t) (void *entry, void *closure); cairo_private cairo_hash_table_t * _cairo_hash_table_create (cairo_hash_keys_equal_func_t keys_equal); cairo_private void _cairo_hash_table_destroy (cairo_hash_table_t *hash_table); cairo_private cairo_bool_t _cairo_hash_table_lookup (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key, cairo_hash_entry_t **entry_return); cairo_private void * _cairo_hash_table_random_entry (cairo_hash_table_t *hash_table, cairo_hash_predicate_func_t predicate); cairo_private cairo_status_t _cairo_hash_table_insert (cairo_hash_table_t *hash_table, cairo_hash_entry_t *entry); cairo_private void _cairo_hash_table_remove (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key); cairo_private void _cairo_hash_table_foreach (cairo_hash_table_t *hash_table, cairo_hash_callback_func_t hash_callback, void *closure); #endif libgdiplus-2.11/cairo/src/check-headers.sh0000775000175000017500000000100212225470167015426 00000000000000#!/bin/sh LANG=C test -z "$srcdir" && srcdir=. status=0 echo Checking public headers for missing cairo_public decorators find "$srcdir" -name '*.h' ! -name '*-private.h' ! -name '*-test.h' ! -name 'cairoint.h' ! -name 'cairo-no-features.h' | xargs grep -B 1 '^cairo_.*[ ]\+(' | awk ' /^--$/ { context=""; public=0; next; } /:cairo_.*[ ]+\(/ { if (!public) {print context; print; print "--";} next; } /-cairo_public.*[ ]/ {public=1;} { context=$0; } ' | sed 's/[.]h-/.h:/' | grep . && status=1 exit $status libgdiplus-2.11/cairo/src/cairo-ps-surface.c0000664000175000017500000027702012225470167015727 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * Copyright © 2005 Red Hat, Inc * Copyright © 2007,2008 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Kristian Høgsberg * Keith Packard * Adrian Johnson */ #define _BSD_SOURCE /* for ctime_r(), snprintf(), strdup() */ #include "cairoint.h" #include "cairo-ps.h" #include "cairo-ps-surface-private.h" #include "cairo-pdf-operators-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-paginated-private.h" #include "cairo-meta-surface-private.h" #include "cairo-output-stream-private.h" #include #include #include #include #include #define DEBUG_PS 0 #ifndef HAVE_CTIME_R #define ctime_r(T, BUF) ctime (T) #endif static const cairo_surface_backend_t cairo_ps_surface_backend; static const cairo_paginated_surface_backend_t cairo_ps_surface_paginated_backend; static const cairo_ps_level_t _cairo_ps_levels[] = { CAIRO_PS_LEVEL_2, CAIRO_PS_LEVEL_3 }; #define CAIRO_PS_LEVEL_LAST ARRAY_LENGTH (_cairo_ps_levels) static const char * _cairo_ps_level_strings[CAIRO_PS_LEVEL_LAST] = { "PS Level 2", "PS Level 3" }; static void _cairo_ps_surface_emit_header (cairo_ps_surface_t *surface) { char ctime_buf[26]; time_t now; char **comments; int i, num_comments; int level; const char *eps_header = ""; now = time (NULL); if (surface->ps_level_used == CAIRO_PS_LEVEL_2) level = 2; else level = 3; if (surface->eps) eps_header = " EPSF-3.0"; _cairo_output_stream_printf (surface->final_stream, "%%!PS-Adobe-3.0%s\n" "%%%%Creator: cairo %s (http://cairographics.org)\n" "%%%%CreationDate: %s" "%%%%Pages: %d\n" "%%%%BoundingBox: %d %d %d %d\n", eps_header, cairo_version_string (), ctime_r (&now, ctime_buf), surface->num_pages, surface->bbox_x1, surface->bbox_y1, surface->bbox_x2, surface->bbox_y2); _cairo_output_stream_printf (surface->final_stream, "%%%%DocumentData: Clean7Bit\n" "%%%%LanguageLevel: %d\n", level); num_comments = _cairo_array_num_elements (&surface->dsc_header_comments); comments = _cairo_array_index (&surface->dsc_header_comments, 0); for (i = 0; i < num_comments; i++) { _cairo_output_stream_printf (surface->final_stream, "%s\n", comments[i]); free (comments[i]); comments[i] = NULL; } _cairo_output_stream_printf (surface->final_stream, "%%%%EndComments\n"); _cairo_output_stream_printf (surface->final_stream, "%%%%BeginProlog\n"); if (surface->eps) { _cairo_output_stream_printf (surface->final_stream, "/cairo_eps_state save def\n" "/dict_count countdictstack def\n" "/op_count count 1 sub def\n" "userdict begin\n"); } else { _cairo_output_stream_printf (surface->final_stream, "/languagelevel where\n" "{ pop languagelevel } { 1 } ifelse\n" "%d lt { /Helvetica findfont 12 scalefont setfont 50 500 moveto\n" " (This print job requires a PostScript Language Level %d printer.) show\n" " showpage quit } if\n", level, level); } _cairo_output_stream_printf (surface->final_stream, "/q { gsave } bind def\n" "/Q { grestore } bind def\n" "/cm { 6 array astore concat } bind def\n" "/w { setlinewidth } bind def\n" "/J { setlinecap } bind def\n" "/j { setlinejoin } bind def\n" "/M { setmiterlimit } bind def\n" "/d { setdash } bind def\n" "/m { moveto } bind def\n" "/l { lineto } bind def\n" "/c { curveto } bind def\n" "/h { closepath } bind def\n" "/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto\n" " 0 exch rlineto 0 rlineto closepath } bind def\n" "/S { stroke } bind def\n" "/f { fill } bind def\n" "/f* { eofill } bind def\n" "/n { newpath } bind def\n" "/W { clip } bind def\n" "/W* { eoclip } bind def\n" "/Tf { pop /cairo_font exch def } bind def\n" "/BT { } bind def\n" "/ET { } bind def\n" "/Tj { show } bind def\n" "/TJ {\n" " {\n" " dup\n" " type /stringtype eq\n" " { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse\n" " } forall\n" "} bind def\n" "/Td { matrix translate cairo_font_matrix matrix concatmatrix aload\n" " /cairo_font_matrix exch def 6 2 roll 0 0 6 array astore\n" " cairo_font exch selectfont moveto } bind def\n" "/Tm { 6 copy 6 array astore /cairo_font_matrix exch def 6 2 roll 0 0\n" " 6 array astore cairo_font exch selectfont moveto } bind def\n" "/g { setgray } bind def\n" "/rg { setrgbcolor } bind def\n"); _cairo_output_stream_printf (surface->final_stream, "%%%%EndProlog\n"); num_comments = _cairo_array_num_elements (&surface->dsc_setup_comments); if (num_comments) { _cairo_output_stream_printf (surface->final_stream, "%%%%BeginSetup\n"); comments = _cairo_array_index (&surface->dsc_setup_comments, 0); for (i = 0; i < num_comments; i++) { _cairo_output_stream_printf (surface->final_stream, "%s\n", comments[i]); free (comments[i]); comments[i] = NULL; } _cairo_output_stream_printf (surface->final_stream, "%%%%EndSetup\n"); } } #if CAIRO_HAS_FT_FONT static cairo_status_t _cairo_ps_surface_emit_type1_font_subset (cairo_ps_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_type1_subset_t subset; cairo_status_t status; int length; char name[64]; snprintf (name, sizeof name, "f-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_type1_subset_init (&subset, name, font_subset, TRUE); if (status) return status; /* FIXME: Figure out document structure convention for fonts */ #if DEBUG_PS _cairo_output_stream_printf (surface->final_stream, "%% _cairo_ps_surface_emit_type1_font_subset\n"); #endif length = subset.header_length + subset.data_length + subset.trailer_length; _cairo_output_stream_write (surface->final_stream, subset.data, length); _cairo_type1_subset_fini (&subset); return CAIRO_STATUS_SUCCESS; } #endif static cairo_status_t _cairo_ps_surface_emit_type1_font_fallback (cairo_ps_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_type1_subset_t subset; cairo_status_t status; int length; char name[64]; snprintf (name, sizeof name, "f-%d-%d", font_subset->font_id, font_subset->subset_id); status = _cairo_type1_fallback_init_hex (&subset, name, font_subset); if (status) return status; /* FIXME: Figure out document structure convention for fonts */ #if DEBUG_PS _cairo_output_stream_printf (surface->final_stream, "%% _cairo_ps_surface_emit_type1_font_fallback\n"); #endif length = subset.header_length + subset.data_length + subset.trailer_length; _cairo_output_stream_write (surface->final_stream, subset.data, length); _cairo_type1_fallback_fini (&subset); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_truetype_font_subset (cairo_ps_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_truetype_subset_t subset; cairo_status_t status; unsigned int i, begin, end; status = _cairo_truetype_subset_init (&subset, font_subset); if (status) return status; /* FIXME: Figure out document structure convention for fonts */ #if DEBUG_PS _cairo_output_stream_printf (surface->final_stream, "%% _cairo_ps_surface_emit_truetype_font_subset\n"); #endif _cairo_output_stream_printf (surface->final_stream, "11 dict begin\n" "/FontType 42 def\n" "/FontName /f-%d-%d def\n" "/PaintType 0 def\n" "/FontMatrix [ 1 0 0 1 0 0 ] def\n" "/FontBBox [ 0 0 0 0 ] def\n" "/Encoding 256 array def\n" "0 1 255 { Encoding exch /.notdef put } for\n", font_subset->font_id, font_subset->subset_id); /* FIXME: Figure out how subset->x_max etc maps to the /FontBBox */ for (i = 1; i < font_subset->num_glyphs; i++) { if (font_subset->glyph_names != NULL) { _cairo_output_stream_printf (surface->final_stream, "Encoding %d /%s put\n", i, font_subset->glyph_names[i]); } else { _cairo_output_stream_printf (surface->final_stream, "Encoding %d /g%d put\n", i, i); } } _cairo_output_stream_printf (surface->final_stream, "/CharStrings %d dict dup begin\n" "/.notdef 0 def\n", font_subset->num_glyphs); for (i = 1; i < font_subset->num_glyphs; i++) { if (font_subset->glyph_names != NULL) { _cairo_output_stream_printf (surface->final_stream, "/%s %d def\n", font_subset->glyph_names[i], i); } else { _cairo_output_stream_printf (surface->final_stream, "/g%d %d def\n", i, i); } } _cairo_output_stream_printf (surface->final_stream, "end readonly def\n"); _cairo_output_stream_printf (surface->final_stream, "/sfnts [\n"); begin = 0; end = 0; for (i = 0; i < subset.num_string_offsets; i++) { end = subset.string_offsets[i]; _cairo_output_stream_printf (surface->final_stream,"<"); _cairo_output_stream_write_hex_string (surface->final_stream, subset.data + begin, end - begin); _cairo_output_stream_printf (surface->final_stream,"00>\n"); begin = end; } if (subset.data_length > end) { _cairo_output_stream_printf (surface->final_stream,"<"); _cairo_output_stream_write_hex_string (surface->final_stream, subset.data + end, subset.data_length - end); _cairo_output_stream_printf (surface->final_stream,"00>\n"); } _cairo_output_stream_printf (surface->final_stream, "] def\n" "FontName currentdict end definefont pop\n"); _cairo_truetype_subset_fini (&subset); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_ps_surface_emit_bitmap_glyph_data (cairo_ps_surface_t *surface, cairo_scaled_font_t *scaled_font, unsigned long glyph_index, cairo_box_t *bbox) { cairo_scaled_glyph_t *scaled_glyph; cairo_status_t status; cairo_image_surface_t *image; unsigned char *row, *byte; int rows, cols; double x_advance, y_advance; status = _cairo_scaled_glyph_lookup (scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS| CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status) return status; *bbox = scaled_glyph->bbox; x_advance = scaled_glyph->metrics.x_advance; y_advance = scaled_glyph->metrics.y_advance; cairo_matrix_transform_distance (&scaled_font->ctm, &x_advance, &y_advance); image = scaled_glyph->surface; if (image->format != CAIRO_FORMAT_A1) { image = _cairo_image_surface_clone (image, CAIRO_FORMAT_A1); if (cairo_surface_status (&image->base)) return cairo_surface_status (&image->base); } _cairo_output_stream_printf (surface->final_stream, "%f 0 %f %f %f %f setcachedevice\n", x_advance, _cairo_fixed_to_double (scaled_glyph->bbox.p1.x), _cairo_fixed_to_double (scaled_glyph->bbox.p2.y), _cairo_fixed_to_double (scaled_glyph->bbox.p2.x), _cairo_fixed_to_double (scaled_glyph->bbox.p1.y)); _cairo_output_stream_printf (surface->final_stream, "<<\n" " /ImageType 1\n" " /Width %d\n" " /Height %d\n" " /ImageMatrix [%f %f %f %f %f %f]\n" " /Decode [1 0]\n" " /BitsPerComponent 1\n", image->width, image->height, image->base.device_transform.xx, image->base.device_transform.yx, image->base.device_transform.xy, image->base.device_transform.yy, image->base.device_transform.x0, image->base.device_transform.y0); _cairo_output_stream_printf (surface->final_stream, " /DataSource {<"); for (row = image->data, rows = image->height; rows; row += image->stride, rows--) { for (byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) { unsigned char output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); _cairo_output_stream_printf (surface->final_stream, "%02x ", output_byte); } _cairo_output_stream_printf (surface->final_stream, "\n "); } _cairo_output_stream_printf (surface->final_stream, " >}\n"); _cairo_output_stream_printf (surface->final_stream, ">>\n"); _cairo_output_stream_printf (surface->final_stream, "imagemask\n"); if (image != scaled_glyph->surface) cairo_surface_destroy (&image->base); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_glyph (cairo_ps_surface_t *surface, cairo_scaled_font_t *scaled_font, unsigned long scaled_font_glyph_index, unsigned int subset_glyph_index, cairo_box_t *bbox) { cairo_status_t status = CAIRO_STATUS_SUCCESS; _cairo_output_stream_printf (surface->final_stream, "\t\t{ %% %d\n", subset_glyph_index); if (subset_glyph_index != 0) { status = _cairo_ps_surface_emit_bitmap_glyph_data (surface, scaled_font, scaled_font_glyph_index, bbox); } _cairo_output_stream_printf (surface->final_stream, "\t\t}\n"); if (status) status = _cairo_surface_set_error (&surface->base, status); return status; } static cairo_status_t _cairo_ps_surface_emit_type3_font_subset (cairo_ps_surface_t *surface, cairo_scaled_font_subset_t *font_subset) { cairo_status_t status; cairo_matrix_t matrix; unsigned int i; cairo_box_t font_bbox = {{0,0},{0,0}}; cairo_box_t bbox = {{0,0},{0,0}}; #if DEBUG_PS _cairo_output_stream_printf (surface->final_stream, "%% _cairo_ps_surface_emit_type3_font_subset\n"); #endif matrix = font_subset->scaled_font->scale_inverse; _cairo_output_stream_printf (surface->final_stream, "8 dict begin\n" "/FontType 3 def\n" "/FontMatrix [%f %f %f %f 0 0] def\n" "/Encoding 256 array def\n" "0 1 255 { Encoding exch /.notdef put } for\n", matrix.xx, matrix.yx, -matrix.xy, -matrix.yy); for (i = 1; i < font_subset->num_glyphs; i++) { if (font_subset->glyph_names != NULL) { _cairo_output_stream_printf (surface->final_stream, "Encoding %d /%s put\n", i, font_subset->glyph_names[i]); } else { _cairo_output_stream_printf (surface->final_stream, "Encoding %d /g%d put\n", i, i); } } _cairo_output_stream_printf (surface->final_stream, "/Glyphs [\n"); for (i = 0; i < font_subset->num_glyphs; i++) { status = _cairo_ps_surface_emit_glyph (surface, font_subset->scaled_font, font_subset->glyphs[i], i, &bbox); if (status) return status; if (i == 0) { font_bbox.p1.x = bbox.p1.x; font_bbox.p1.y = bbox.p1.y; font_bbox.p2.x = bbox.p2.x; font_bbox.p2.y = bbox.p2.y; } else { if (bbox.p1.x < font_bbox.p1.x) font_bbox.p1.x = bbox.p1.x; if (bbox.p1.y < font_bbox.p1.y) font_bbox.p1.y = bbox.p1.y; if (bbox.p2.x > font_bbox.p2.x) font_bbox.p2.x = bbox.p2.x; if (bbox.p2.y > font_bbox.p2.y) font_bbox.p2.y = bbox.p2.y; } } _cairo_output_stream_printf (surface->final_stream, "] def\n" "/FontBBox [%f %f %f %f] def\n" "/BuildChar {\n" " exch /Glyphs get\n" " exch get exec\n" "} bind def\n" "currentdict\n" "end\n" "/f-%d-%d exch definefont pop\n", _cairo_fixed_to_double (font_bbox.p1.x), _cairo_fixed_to_double (font_bbox.p1.y), _cairo_fixed_to_double (font_bbox.p2.x), _cairo_fixed_to_double (font_bbox.p2.y), font_subset->font_id, font_subset->subset_id); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_unscaled_font_subset (cairo_scaled_font_subset_t *font_subset, void *closure) { cairo_ps_surface_t *surface = closure; cairo_status_t status; status = _cairo_scaled_font_subset_create_glyph_names (font_subset); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; #if CAIRO_HAS_FT_FONT status = _cairo_ps_surface_emit_type1_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; #endif status = _cairo_ps_surface_emit_truetype_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_ps_surface_emit_type1_font_fallback (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; ASSERT_NOT_REACHED; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_scaled_font_subset (cairo_scaled_font_subset_t *font_subset, void *closure) { cairo_ps_surface_t *surface = closure; cairo_status_t status; status = _cairo_scaled_font_subset_create_glyph_names (font_subset); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; status = _cairo_ps_surface_emit_type3_font_subset (surface, font_subset); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; ASSERT_NOT_REACHED; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_font_subsets (cairo_ps_surface_t *surface) { cairo_status_t status; #if DEBUG_PS _cairo_output_stream_printf (surface->final_stream, "%% _cairo_ps_surface_emit_font_subsets\n"); #endif status = _cairo_scaled_font_subsets_foreach_unscaled (surface->font_subsets, _cairo_ps_surface_emit_unscaled_font_subset, surface); if (status) goto BAIL; status = _cairo_scaled_font_subsets_foreach_scaled (surface->font_subsets, _cairo_ps_surface_emit_scaled_font_subset, surface); BAIL: _cairo_scaled_font_subsets_destroy (surface->font_subsets); surface->font_subsets = NULL; return status; } static cairo_status_t _cairo_ps_surface_emit_body (cairo_ps_surface_t *surface) { char buf[4096]; int n; if (ferror (surface->tmpfile) != 0) return _cairo_error (CAIRO_STATUS_TEMP_FILE_ERROR); rewind (surface->tmpfile); while ((n = fread (buf, 1, sizeof (buf), surface->tmpfile)) > 0) _cairo_output_stream_write (surface->final_stream, buf, n); return CAIRO_STATUS_SUCCESS; } static void _cairo_ps_surface_emit_footer (cairo_ps_surface_t *surface) { _cairo_output_stream_printf (surface->final_stream, "%%%%Trailer\n"); if (surface->eps) { _cairo_output_stream_printf (surface->final_stream, "count op_count sub {pop} repeat\n" "countdictstack dict_count sub {end} repeat\n" "cairo_eps_state restore\n"); } _cairo_output_stream_printf (surface->final_stream, "%%%%EOF\n"); } static cairo_surface_t * _cairo_ps_surface_create_for_stream_internal (cairo_output_stream_t *stream, double width, double height) { cairo_status_t status, status_ignored; cairo_ps_surface_t *surface; surface = malloc (sizeof (cairo_ps_surface_t)); if (surface == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP; } _cairo_surface_init (&surface->base, &cairo_ps_surface_backend, CAIRO_CONTENT_COLOR_ALPHA); surface->final_stream = stream; surface->tmpfile = tmpfile (); if (surface->tmpfile == NULL) { switch (errno) { case ENOMEM: status = _cairo_error (CAIRO_STATUS_NO_MEMORY); break; default: status = _cairo_error (CAIRO_STATUS_TEMP_FILE_ERROR); break; } goto CLEANUP_SURFACE; } surface->stream = _cairo_output_stream_create_for_file (surface->tmpfile); status = _cairo_output_stream_get_status (surface->stream); if (status) goto CLEANUP_OUTPUT_STREAM; surface->font_subsets = _cairo_scaled_font_subsets_create_simple (); if (surface->font_subsets == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_OUTPUT_STREAM; } surface->eps = FALSE; surface->ps_level = CAIRO_PS_LEVEL_3; surface->ps_level_used = CAIRO_PS_LEVEL_2; surface->width = width; surface->height = height; cairo_matrix_init (&surface->cairo_to_ps, 1, 0, 0, -1, 0, height); surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; surface->force_fallbacks = FALSE; surface->content = CAIRO_CONTENT_COLOR_ALPHA; surface->use_string_datasource = FALSE; _cairo_pdf_operators_init (&surface->pdf_operators, surface->stream, &surface->cairo_to_ps, surface->font_subsets); surface->num_pages = 0; _cairo_array_init (&surface->dsc_header_comments, sizeof (char *)); _cairo_array_init (&surface->dsc_setup_comments, sizeof (char *)); _cairo_array_init (&surface->dsc_page_setup_comments, sizeof (char *)); surface->dsc_comment_target = &surface->dsc_header_comments; surface->paginated_surface = _cairo_paginated_surface_create ( &surface->base, CAIRO_CONTENT_COLOR_ALPHA, width, height, &cairo_ps_surface_paginated_backend); status = surface->paginated_surface->status; if (status == CAIRO_STATUS_SUCCESS) return surface->paginated_surface; _cairo_scaled_font_subsets_destroy (surface->font_subsets); CLEANUP_OUTPUT_STREAM: status_ignored = _cairo_output_stream_destroy (surface->stream); fclose (surface->tmpfile); CLEANUP_SURFACE: free (surface); CLEANUP: /* destroy stream on behalf of caller */ status_ignored = _cairo_output_stream_destroy (stream); return _cairo_surface_create_in_error (status); } /** * cairo_ps_surface_create: * @filename: a filename for the PS output (must be writable) * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a PostScript surface of the specified size in points to be * written to @filename. See cairo_ps_surface_create_for_stream() for * a more flexible mechanism for handling the PostScript output than * simply writing it to a named file. * * Note that the size of individual pages of the PostScript output can * vary. See cairo_ps_surface_set_size(). * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 **/ cairo_surface_t * cairo_ps_surface_create (const char *filename, double width_in_points, double height_in_points) { cairo_output_stream_t *stream; stream = _cairo_output_stream_create_for_filename (filename); if (_cairo_output_stream_get_status (stream)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); return _cairo_ps_surface_create_for_stream_internal (stream, width_in_points, height_in_points); } /** * cairo_ps_surface_create_for_stream: * @write_func: a #cairo_write_func_t to accept the output data * @closure: the closure argument for @write_func * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a PostScript surface of the specified size in points to be * written incrementally to the stream represented by @write_func and * @closure. See cairo_ps_surface_create() for a more convenient way * to simply direct the PostScript output to a named file. * * Note that the size of individual pages of the PostScript * output can vary. See cairo_ps_surface_set_size(). * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 */ cairo_surface_t * cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points) { cairo_output_stream_t *stream; stream = _cairo_output_stream_create (write_func, NULL, closure); if (_cairo_output_stream_get_status (stream)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); return _cairo_ps_surface_create_for_stream_internal (stream, width_in_points, height_in_points); } static cairo_bool_t _cairo_surface_is_ps (cairo_surface_t *surface) { return surface->backend == &cairo_ps_surface_backend; } /* If the abstract_surface is a paginated surface, and that paginated * surface's target is a ps_surface, then set ps_surface to that * target. Otherwise return %CAIRO_STATUS_SURFACE_TYPE_MISMATCH. */ static cairo_status_t _extract_ps_surface (cairo_surface_t *surface, cairo_ps_surface_t **ps_surface) { cairo_surface_t *target; if (surface->status) return surface->status; if (! _cairo_surface_is_paginated (surface)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); target = _cairo_paginated_surface_get_target (surface); if (target->status) return target->status; if (! _cairo_surface_is_ps (target)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); *ps_surface = (cairo_ps_surface_t *) target; return CAIRO_STATUS_SUCCESS; } /** * cairo_ps_surface_restrict_to_level: * @surface: a PostScript #cairo_surface_t * @level: PostScript level * * Restricts the generated PostSript file to @level. See * cairo_ps_get_levels() for a list of available level values that * can be used here. * * This function should only be called before any drawing operations * have been performed on the given surface. The simplest way to do * this is to call this function immediately after creating the * surface. * * Since: 1.6 **/ void cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, cairo_ps_level_t level) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } if (level < CAIRO_PS_LEVEL_LAST) ps_surface->ps_level = level; } /** * cairo_ps_get_levels: * @levels: supported level list * @num_levels: list length * * Used to retrieve the list of supported levels. See * cairo_ps_surface_restrict_to_level(). * * Since: 1.6 **/ void cairo_ps_get_levels (cairo_ps_level_t const **levels, int *num_levels) { if (levels != NULL) *levels = _cairo_ps_levels; if (num_levels != NULL) *num_levels = CAIRO_PS_LEVEL_LAST; } /** * cairo_ps_level_to_string: * @level: a level id * * Get the string representation of the given @level id. This function * will return %NULL if @level id isn't valid. See cairo_ps_get_levels() * for a way to get the list of valid level ids. * * Return value: the string associated to given level. * * Since: 1.6 **/ const char * cairo_ps_level_to_string (cairo_ps_level_t level) { if (level >= CAIRO_PS_LEVEL_LAST) return NULL; return _cairo_ps_level_strings[level]; } /** * cairo_ps_surface_set_eps: * @surface: a PostScript #cairo_surface_t * @eps: %TRUE to output EPS format PostScript * * If @eps is %TRUE, the PostScript surface will output Encapsulated * PostScript. * * This function should only be called before any drawing operations * have been performed on the current page. The simplest way to do * this is to call this function immediately after creating the * surface. An Encapsulated PostScript file should never contain more * than one page. * * Since: 1.6 **/ void cairo_ps_surface_set_eps (cairo_surface_t *surface, cairo_bool_t eps) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } ps_surface->eps = eps; } /** * cairo_ps_surface_get_eps: * @surface: a PostScript #cairo_surface_t * * Check whether the PostScript surface will output Encapsulated PostScript. * * Return value: %TRUE if the surface will output Encapsulated PostScript. * * Since: 1.6 **/ cairo_public cairo_bool_t cairo_ps_surface_get_eps (cairo_surface_t *surface) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return FALSE; } return ps_surface->eps; } /** * cairo_ps_surface_set_size: * @surface: a PostScript #cairo_surface_t * @width_in_points: new surface width, in points (1 point == 1/72.0 inch) * @height_in_points: new surface height, in points (1 point == 1/72.0 inch) * * Changes the size of a PostScript surface for the current (and * subsequent) pages. * * This function should only be called before any drawing operations * have been performed on the current page. The simplest way to do * this is to call this function immediately after creating the * surface or immediately after completing a page with either * cairo_show_page() or cairo_copy_page(). * * Since: 1.2 **/ void cairo_ps_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } ps_surface->width = width_in_points; ps_surface->height = height_in_points; cairo_matrix_init (&ps_surface->cairo_to_ps, 1, 0, 0, -1, 0, height_in_points); _cairo_pdf_operators_set_cairo_to_pdf_matrix (&ps_surface->pdf_operators, &ps_surface->cairo_to_ps); status = _cairo_paginated_surface_set_size (ps_surface->paginated_surface, width_in_points, height_in_points); if (status) status = _cairo_surface_set_error (surface, status); } /** * cairo_ps_surface_dsc_comment: * @surface: a PostScript #cairo_surface_t * @comment: a comment string to be emitted into the PostScript output * * Emit a comment into the PostScript output for the given surface. * * The comment is expected to conform to the PostScript Language * Document Structuring Conventions (DSC). Please see that manual for * details on the available comments and their meanings. In * particular, the %%IncludeFeature comment allows a * device-independent means of controlling printer device features. So * the PostScript Printer Description Files Specification will also be * a useful reference. * * The comment string must begin with a percent character (%) and the * total length of the string (including any initial percent * characters) must not exceed 255 characters. Violating either of * these conditions will place @surface into an error state. But * beyond these two conditions, this function will not enforce * conformance of the comment with any particular specification. * * The comment string should not have a trailing newline. * * The DSC specifies different sections in which particular comments * can appear. This function provides for comments to be emitted * within three sections: the header, the Setup section, and the * PageSetup section. Comments appearing in the first two sections * apply to the entire document while comments in the BeginPageSetup * section apply only to a single page. * * For comments to appear in the header section, this function should * be called after the surface is created, but before a call to * cairo_ps_surface_begin_setup(). * * For comments to appear in the Setup section, this function should * be called after a call to cairo_ps_surface_begin_setup() but before * a call to cairo_ps_surface_begin_page_setup(). * * For comments to appear in the PageSetup section, this function * should be called after a call to cairo_ps_surface_begin_page_setup(). * * Note that it is only necessary to call cairo_ps_surface_begin_page_setup() * for the first page of any surface. After a call to * cairo_show_page() or cairo_copy_page() comments are unambiguously * directed to the PageSetup section of the current page. But it * doesn't hurt to call this function at the beginning of every page * as that consistency may make the calling code simpler. * * As a final note, cairo automatically generates several comments on * its own. As such, applications must not manually generate any of * the following comments: * * Header section: %!PS-Adobe-3.0, %%Creator, %%CreationDate, %%Pages, * %%BoundingBox, %%DocumentData, %%LanguageLevel, %%EndComments. * * Setup section: %%BeginSetup, %%EndSetup * * PageSetup section: %%BeginPageSetup, %%PageBoundingBox, * %%EndPageSetup. * * Other sections: %%BeginProlog, %%EndProlog, %%Page, %%Trailer, %%EOF * * Here is an example sequence showing how this function might be used: * * * #cairo_surface_t *surface = cairo_ps_surface_create (filename, width, height); * ... * cairo_ps_surface_dsc_comment (surface, "%%Title: My excellent document"); * cairo_ps_surface_dsc_comment (surface, "%%Copyright: Copyright (C) 2006 Cairo Lover") * ... * cairo_ps_surface_dsc_begin_setup (surface); * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor White"); * ... * cairo_ps_surface_dsc_begin_page_setup (surface); * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A3"); * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *InputSlot LargeCapacity"); * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaType Glossy"); * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *MediaColor Blue"); * ... draw to first page here .. * cairo_show_page (cr); * ... * cairo_ps_surface_dsc_comment (surface, "%%IncludeFeature: *PageSize A5"); * ... * * * Since: 1.2 **/ void cairo_ps_surface_dsc_comment (cairo_surface_t *surface, const char *comment) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; char *comment_copy; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } /* A couple of sanity checks on the comment value. */ if (comment == NULL) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_NULL_POINTER); return; } if (comment[0] != '%' || strlen (comment) > 255) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_INVALID_DSC_COMMENT); return; } /* Then, copy the comment and store it in the appropriate array. */ comment_copy = strdup (comment); if (comment_copy == NULL) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_NO_MEMORY); return; } status = _cairo_array_append (ps_surface->dsc_comment_target, &comment_copy); if (status) { free (comment_copy); status = _cairo_surface_set_error (surface, status); return; } } /** * cairo_ps_surface_dsc_begin_setup: * @surface: a PostScript #cairo_surface_t * * This function indicates that subsequent calls to * cairo_ps_surface_dsc_comment() should direct comments to the Setup * section of the PostScript output. * * This function should be called at most once per surface, and must * be called before any call to cairo_ps_surface_dsc_begin_page_setup() * and before any drawing is performed to the surface. * * See cairo_ps_surface_dsc_comment() for more details. * * Since: 1.2 **/ void cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } if (ps_surface->dsc_comment_target == &ps_surface->dsc_header_comments) { ps_surface->dsc_comment_target = &ps_surface->dsc_setup_comments; } } /** * cairo_ps_surface_dsc_begin_page_setup: * @surface: a PostScript #cairo_surface_t * * This function indicates that subsequent calls to * cairo_ps_surface_dsc_comment() should direct comments to the * PageSetup section of the PostScript output. * * This function call is only needed for the first page of a * surface. It should be called after any call to * cairo_ps_surface_dsc_begin_setup() and before any drawing is * performed to the surface. * * See cairo_ps_surface_dsc_comment() for more details. * * Since: 1.2 **/ void cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface) { cairo_ps_surface_t *ps_surface = NULL; cairo_status_t status; status = _extract_ps_surface (surface, &ps_surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } if (ps_surface->dsc_comment_target == &ps_surface->dsc_header_comments || ps_surface->dsc_comment_target == &ps_surface->dsc_setup_comments) { ps_surface->dsc_comment_target = &ps_surface->dsc_page_setup_comments; } } static cairo_surface_t * _cairo_ps_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); } static cairo_status_t _cairo_ps_surface_finish (void *abstract_surface) { cairo_status_t status, status2; cairo_ps_surface_t *surface = abstract_surface; int i, num_comments; char **comments; _cairo_ps_surface_emit_header (surface); status = _cairo_ps_surface_emit_font_subsets (surface); if (status) goto CLEANUP; status = _cairo_ps_surface_emit_body (surface); if (status) goto CLEANUP; _cairo_ps_surface_emit_footer (surface); CLEANUP: status2 = _cairo_output_stream_destroy (surface->stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; fclose (surface->tmpfile); status2 = _cairo_output_stream_destroy (surface->final_stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; num_comments = _cairo_array_num_elements (&surface->dsc_header_comments); comments = _cairo_array_index (&surface->dsc_header_comments, 0); for (i = 0; i < num_comments; i++) free (comments[i]); _cairo_array_fini (&surface->dsc_header_comments); num_comments = _cairo_array_num_elements (&surface->dsc_setup_comments); comments = _cairo_array_index (&surface->dsc_setup_comments, 0); for (i = 0; i < num_comments; i++) free (comments[i]); _cairo_array_fini (&surface->dsc_setup_comments); num_comments = _cairo_array_num_elements (&surface->dsc_page_setup_comments); comments = _cairo_array_index (&surface->dsc_page_setup_comments, 0); for (i = 0; i < num_comments; i++) free (comments[i]); _cairo_array_fini (&surface->dsc_page_setup_comments); return status; } static cairo_int_status_t _cairo_ps_surface_start_page (void *abstract_surface) { cairo_ps_surface_t *surface = abstract_surface; /* Increment before print so page numbers start at 1. */ surface->num_pages++; return CAIRO_STATUS_SUCCESS; } static void _cairo_ps_surface_end_page (cairo_ps_surface_t *surface) { _cairo_output_stream_printf (surface->stream, "Q\n"); } static cairo_int_status_t _cairo_ps_surface_show_page (void *abstract_surface) { cairo_ps_surface_t *surface = abstract_surface; _cairo_ps_surface_end_page (surface); _cairo_output_stream_printf (surface->stream, "showpage\n"); return CAIRO_STATUS_SUCCESS; } static cairo_bool_t color_is_gray (double red, double green, double blue) { const double epsilon = 0.00001; return (fabs (red - green) < epsilon && fabs (red - blue) < epsilon); } static cairo_int_status_t _cairo_ps_surface_analyze_surface_pattern_transparency (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern) { cairo_image_surface_t *image; void *image_extra; cairo_int_status_t status; cairo_image_transparency_t transparency; status = _cairo_surface_acquire_source_image (pattern->surface, &image, &image_extra); if (status) return status; if (image->base.status) return image->base.status; transparency = _cairo_image_analyze_transparency (image); switch (transparency) { case CAIRO_IMAGE_IS_OPAQUE: status = CAIRO_STATUS_SUCCESS; break; case CAIRO_IMAGE_HAS_BILEVEL_ALPHA: if (surface->ps_level == CAIRO_PS_LEVEL_2) { status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; } else { surface->ps_level_used = CAIRO_PS_LEVEL_3; status = CAIRO_STATUS_SUCCESS; } break; case CAIRO_IMAGE_HAS_ALPHA: status = CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; break; case CAIRO_IMAGE_UNKNOWN: ASSERT_NOT_REACHED; } _cairo_surface_release_source_image (pattern->surface, image, image_extra); return status; } static cairo_bool_t surface_pattern_supported (cairo_surface_pattern_t *pattern) { cairo_extend_t extend; if (_cairo_surface_is_meta (pattern->surface)) return TRUE; if (pattern->surface->backend->acquire_source_image == NULL) return FALSE; /* Does an ALPHA-only source surface even make sense? Maybe, but I * don't think it's worth the extra code to support it. */ /* XXX: Need to write this function here... content = cairo_surface_get_content (pattern->surface); if (content == CAIRO_CONTENT_ALPHA) return FALSE; */ /* Cast away the const, trusting get_extend not to muck with it. * And I really wish I had a way to cast away just the const, and * not potentially coerce this pointer to an incorrect type at the * same time. :-( */ extend = cairo_pattern_get_extend ((cairo_pattern_t*)&pattern->base); switch (extend) { case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_REPEAT: case CAIRO_EXTEND_REFLECT: /* There's no point returning FALSE for EXTEND_PAD, as the image * surface does not currently implement it either */ case CAIRO_EXTEND_PAD: return TRUE; } ASSERT_NOT_REACHED; return FALSE; } static cairo_bool_t _gradient_pattern_supported (cairo_ps_surface_t *surface, cairo_pattern_t *pattern) { cairo_extend_t extend; if (surface->ps_level == CAIRO_PS_LEVEL_2) return FALSE; surface->ps_level_used = CAIRO_PS_LEVEL_3; extend = cairo_pattern_get_extend (pattern); /* Radial gradients are currently only supported when one circle * is inside the other. */ if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) { double x1, y1, x2, y2, r1, r2, d; cairo_radial_pattern_t *radial = (cairo_radial_pattern_t *) pattern; if (extend == CAIRO_EXTEND_REPEAT || extend == CAIRO_EXTEND_REFLECT) { return FALSE; } x1 = _cairo_fixed_to_double (radial->c1.x); y1 = _cairo_fixed_to_double (radial->c1.y); r1 = _cairo_fixed_to_double (radial->r1); x2 = _cairo_fixed_to_double (radial->c2.x); y2 = _cairo_fixed_to_double (radial->c2.y); r2 = _cairo_fixed_to_double (radial->r2); d = sqrt((x2 - x1)*(x2 - x1) + (y2 - y1)*(y2 - y1)); if (d > fabs(r2 - r1)) { return FALSE; } } return TRUE; } static cairo_bool_t pattern_supported (cairo_ps_surface_t *surface, cairo_pattern_t *pattern) { if (pattern->type == CAIRO_PATTERN_TYPE_SOLID) return TRUE; if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR || pattern->type == CAIRO_PATTERN_TYPE_RADIAL) return _gradient_pattern_supported (surface, pattern); if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) return surface_pattern_supported ((cairo_surface_pattern_t *) pattern); return FALSE; } static cairo_int_status_t _cairo_ps_surface_analyze_operation (cairo_ps_surface_t *surface, cairo_operator_t op, cairo_pattern_t *pattern) { if (surface->force_fallbacks && surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_INT_STATUS_UNSUPPORTED; if (! pattern_supported (surface, pattern)) return CAIRO_INT_STATUS_UNSUPPORTED; if (!(op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_OVER)) return CAIRO_INT_STATUS_UNSUPPORTED; if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; if ( _cairo_surface_is_meta (surface_pattern->surface)) return CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN; } if (op == CAIRO_OPERATOR_SOURCE) return CAIRO_STATUS_SUCCESS; /* CAIRO_OPERATOR_OVER is only supported for opaque patterns. If * the pattern contains transparency, we return * CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY to the analysis * surface. If the analysis surface determines that there is * anything drawn under this operation, a fallback image will be * used. Otherwise the operation will be replayed during the * render stage and we blend the transarency into the white * background to convert the pattern to opaque. */ if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; return _cairo_ps_surface_analyze_surface_pattern_transparency (surface, surface_pattern); } if (_cairo_pattern_is_opaque (pattern)) return CAIRO_STATUS_SUCCESS; else return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; } static cairo_bool_t _cairo_ps_surface_operation_supported (cairo_ps_surface_t *surface, cairo_operator_t op, cairo_pattern_t *pattern) { if (_cairo_ps_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED) return TRUE; else return FALSE; } /* The "standard" implementation limit for PostScript string sizes is * 65535 characters (see PostScript Language Reference, Appendix * B). We go one short of that because we sometimes need two * characters in a string to represent a single ASCII85 byte, (for the * escape sequences "\\", "\(", and "\)") and we must not split these * across two strings. So we'd be in trouble if we went right to the * limit and one of these escape sequences just happened to land at * the end. */ #define STRING_ARRAY_MAX_STRING_SIZE (65535-1) #define STRING_ARRAY_MAX_COLUMN 72 typedef struct _string_array_stream { cairo_output_stream_t base; cairo_output_stream_t *output; int column; int string_size; cairo_bool_t use_strings; } string_array_stream_t; static cairo_status_t _string_array_stream_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { string_array_stream_t *stream = (string_array_stream_t *) base; unsigned char c; const unsigned char backslash = '\\'; if (length == 0) return CAIRO_STATUS_SUCCESS; while (length--) { if (stream->string_size == 0 && stream->use_strings) { _cairo_output_stream_printf (stream->output, "("); stream->column++; } c = *data++; if (stream->use_strings) { switch (c) { case '\\': case '(': case ')': _cairo_output_stream_write (stream->output, &backslash, 1); stream->column++; stream->string_size++; break; } } /* Have to be careful to never split the final ~> sequence. */ if (c == '~') { _cairo_output_stream_write (stream->output, &c, 1); stream->column++; stream->string_size++; length--; c = *data++; } _cairo_output_stream_write (stream->output, &c, 1); stream->column++; stream->string_size++; if (stream->use_strings && stream->string_size >= STRING_ARRAY_MAX_STRING_SIZE) { _cairo_output_stream_printf (stream->output, ")\n"); stream->string_size = 0; stream->column = 0; } if (stream->column >= STRING_ARRAY_MAX_COLUMN) { _cairo_output_stream_printf (stream->output, "\n "); stream->string_size += 2; stream->column = 1; } } return _cairo_output_stream_get_status (stream->output); } static cairo_status_t _string_array_stream_close (cairo_output_stream_t *base) { cairo_status_t status; string_array_stream_t *stream = (string_array_stream_t *) base; if (stream->use_strings) _cairo_output_stream_printf (stream->output, ")\n"); status = _cairo_output_stream_get_status (stream->output); return status; } /* A string_array_stream wraps an existing output stream. It takes the * data provided to it and output one or more consecutive string * objects, each within the standard PostScript implementation limit * of 65k characters. * * The strings are each separated by a space character for easy * inclusion within an array object, (but the array delimiters are not * added by the string_array_stream). * * The string array stream is also careful to wrap the output within * STRING_ARRAY_MAX_COLUMN columns (+/- 1). The stream also adds * necessary escaping for special characters within a string, * (specifically '\', '(', and ')'). */ static cairo_output_stream_t * _string_array_stream_create (cairo_output_stream_t *output) { string_array_stream_t *stream; stream = malloc (sizeof (string_array_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, _string_array_stream_write, _string_array_stream_close); stream->output = output; stream->column = 0; stream->string_size = 0; stream->use_strings = TRUE; return &stream->base; } /* A base85_array_stream wraps an existing output stream. It wraps the * output within STRING_ARRAY_MAX_COLUMN columns (+/- 1). The output * is not enclosed in strings like string_array_stream. */ static cairo_output_stream_t * _base85_array_stream_create (cairo_output_stream_t *output) { string_array_stream_t *stream; stream = malloc (sizeof (string_array_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, _string_array_stream_write, _string_array_stream_close); stream->output = output; stream->column = 0; stream->string_size = 0; stream->use_strings = FALSE; return &stream->base; } /* PS Output - this section handles output of the parts of the meta * surface we can render natively in PS. */ static cairo_status_t _cairo_ps_surface_flatten_image_transparency (cairo_ps_surface_t *surface, cairo_image_surface_t *image, cairo_image_surface_t **opaque_image) { const cairo_color_t *background_color; cairo_surface_t *opaque; cairo_pattern_union_t pattern; cairo_status_t status; if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) background_color = CAIRO_COLOR_WHITE; else background_color = CAIRO_COLOR_BLACK; opaque = cairo_image_surface_create (CAIRO_FORMAT_RGB24, image->width, image->height); if (opaque->status) return opaque->status; _cairo_pattern_init_for_surface (&pattern.surface, &image->base); status = _cairo_surface_fill_rectangle (opaque, CAIRO_OPERATOR_SOURCE, background_color, 0, 0, image->width, image->height); if (status) goto fail; status = _cairo_surface_composite (CAIRO_OPERATOR_OVER, &pattern.base, NULL, opaque, 0, 0, 0, 0, 0, 0, image->width, image->height); if (status) goto fail; _cairo_pattern_fini (&pattern.base); *opaque_image = (cairo_image_surface_t *) opaque; return CAIRO_STATUS_SUCCESS; fail: _cairo_pattern_fini (&pattern.base); cairo_surface_destroy (opaque); return status; } static cairo_status_t _cairo_ps_surface_emit_base85_string (cairo_ps_surface_t *surface, unsigned char *data, unsigned long length, cairo_bool_t use_strings) { cairo_output_stream_t *base85_stream, *string_array_stream; cairo_status_t status, status2; if (use_strings) string_array_stream = _string_array_stream_create (surface->stream); else string_array_stream = _base85_array_stream_create (surface->stream); status = _cairo_output_stream_get_status (string_array_stream); if (status) return _cairo_output_stream_destroy (string_array_stream); base85_stream = _cairo_base85_stream_create (string_array_stream); status = _cairo_output_stream_get_status (base85_stream); if (status) { status2 = _cairo_output_stream_destroy (string_array_stream); return _cairo_output_stream_destroy (base85_stream); } _cairo_output_stream_write (base85_stream, data, length); status = _cairo_output_stream_destroy (base85_stream); status2 = _cairo_output_stream_destroy (string_array_stream); if (status == CAIRO_STATUS_SUCCESS) status = status2; return status; } static cairo_status_t _cairo_ps_surface_emit_image (cairo_ps_surface_t *surface, cairo_image_surface_t *image, cairo_operator_t op) { cairo_status_t status; unsigned char *data, *data_compressed; unsigned long data_size, data_compressed_size; cairo_image_surface_t *opaque_image = NULL; int x, y, i; cairo_image_transparency_t transparency; cairo_bool_t use_mask; uint32_t *pixel; int bit; if (image->base.status) return image->base.status; transparency = _cairo_image_analyze_transparency (image); /* PostScript can not represent the alpha channel, so we blend the current image over a white (or black for CONTENT_COLOR surfaces) RGB surface to eliminate it. */ if (op == CAIRO_OPERATOR_SOURCE || transparency == CAIRO_IMAGE_HAS_ALPHA || (transparency == CAIRO_IMAGE_HAS_BILEVEL_ALPHA && surface->ps_level == CAIRO_PS_LEVEL_2)) { status = _cairo_ps_surface_flatten_image_transparency (surface, image, &opaque_image); if (status) return status; use_mask = FALSE; } else if (transparency == CAIRO_IMAGE_IS_OPAQUE) { opaque_image = image; use_mask = FALSE; } else { use_mask = TRUE; } if (use_mask) { /* Type 2 (mask and image interleaved) has the mask and image * samples interleaved by row. The mask row is first, one bit * per pixel with (bit 7 first). The row is padded to byte * boundaries. The image data is 3 bytes per pixel RGB * format. */ data_size = image->height * ((image->width + 7)/8 + 3*image->width); } else { data_size = image->height * image->width * 3; } data = malloc (data_size); if (data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto bail1; } if (use_mask) { i = 0; for (y = 0; y < image->height; y++) { /* mask row */ pixel = (uint32_t *) (image->data + y * image->stride); bit = 7; for (x = 0; x < image->width; x++, pixel++) { if (bit == 7) data[i] = 0; if (((*pixel & 0xff000000) >> 24) > 0x80) data[i] |= (1 << bit); bit--; if (bit < 0) { bit = 7; i++; } } if (bit != 7) i++; /* image row*/ pixel = (uint32_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel++) { data[i++] = (*pixel & 0x00ff0000) >> 16; data[i++] = (*pixel & 0x0000ff00) >> 8; data[i++] = (*pixel & 0x000000ff) >> 0; } } } else { i = 0; for (y = 0; y < opaque_image->height; y++) { pixel = (uint32_t *) (opaque_image->data + y * opaque_image->stride); for (x = 0; x < opaque_image->width; x++, pixel++) { data[i++] = (*pixel & 0x00ff0000) >> 16; data[i++] = (*pixel & 0x0000ff00) >> 8; data[i++] = (*pixel & 0x000000ff) >> 0; } } } /* XXX: Should fix cairo-lzw to provide a stream-based interface * instead. */ data_compressed_size = data_size; data_compressed = _cairo_lzw_compress (data, &data_compressed_size); if (data_compressed == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto bail2; } if (surface->use_string_datasource) { /* Emit the image data as a base85-encoded string which will * be used as the data source for the image operator later. */ _cairo_output_stream_printf (surface->stream, "/CairoImageData [\n"); status = _cairo_ps_surface_emit_base85_string (surface, data_compressed, data_compressed_size, TRUE); if (status) goto bail3; _cairo_output_stream_printf (surface->stream, "] def\n"); _cairo_output_stream_printf (surface->stream, "/CairoImageDataIndex 0 def\n"); } if (use_mask) { _cairo_output_stream_printf (surface->stream, "/DeviceRGB setcolorspace\n" "5 dict dup begin\n" " /ImageType 3 def\n" " /InterleaveType 2 def\n" " /DataDict 8 dict def\n" " DataDict begin\n" " /ImageType 1 def\n" " /Width %d def\n" " /Height %d def\n" " /BitsPerComponent 8 def\n" " /Decode [ 0 1 0 1 0 1 ] def\n", image->width, image->height); if (surface->use_string_datasource) { _cairo_output_stream_printf (surface->stream, " /DataSource {\n" " CairoImageData CairoImageDataIndex get\n" " /CairoImageDataIndex CairoImageDataIndex 1 add def\n" " CairoImageDataIndex CairoImageData length 1 sub gt\n" " { /CairoImageDataIndex 0 def } if\n" " } /ASCII85Decode filter /LZWDecode filter def\n"); } else { _cairo_output_stream_printf (surface->stream, " /DataSource currentfile /ASCII85Decode filter /LZWDecode filter def\n"); } _cairo_output_stream_printf (surface->stream, " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" " end\n" " /MaskDict 8 dict def\n" " MaskDict begin\n" " /ImageType 1 def\n" " /Width %d def\n" " /Height %d def\n" " /BitsPerComponent 1 def\n" " /Decode [ 1 0 ] def\n" " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" " end\n" "end\n" "image\n", image->height, image->width, image->height, image->height); } else { _cairo_output_stream_printf (surface->stream, "/DeviceRGB setcolorspace\n" "8 dict dup begin\n" " /ImageType 1 def\n" " /Width %d def\n" " /Height %d def\n" " /BitsPerComponent 8 def\n" " /Decode [ 0 1 0 1 0 1 ] def\n", opaque_image->width, opaque_image->height); if (surface->use_string_datasource) { _cairo_output_stream_printf (surface->stream, " /DataSource {\n" " CairoImageData CairoImageDataIndex get\n" " /CairoImageDataIndex CairoImageDataIndex 1 add def\n" " CairoImageDataIndex CairoImageData length 1 sub gt\n" " { /CairoImageDataIndex 0 def } if\n" " } /ASCII85Decode filter /LZWDecode filter def\n"); } else { _cairo_output_stream_printf (surface->stream, " /DataSource currentfile /ASCII85Decode filter /LZWDecode filter def\n"); } _cairo_output_stream_printf (surface->stream, " /ImageMatrix [ 1 0 0 -1 0 %d ] def\n" "end\n" "image\n", opaque_image->height); } if (!surface->use_string_datasource) { /* Emit the image data as a base85-encoded string which will * be used as the data source for the image operator. */ status = _cairo_ps_surface_emit_base85_string (surface, data_compressed, data_compressed_size, FALSE); } else { status = CAIRO_STATUS_SUCCESS; } bail3: free (data_compressed); bail2: free (data); bail1: if (!use_mask && opaque_image != image) cairo_surface_destroy (&opaque_image->base); return status; } static cairo_status_t _cairo_ps_surface_emit_meta_surface (cairo_ps_surface_t *surface, cairo_surface_t *meta_surface) { double old_width, old_height; cairo_matrix_t old_cairo_to_ps; cairo_content_t old_content; cairo_clip_t *old_clip; cairo_rectangle_int_t meta_extents; cairo_status_t status; status = _cairo_surface_get_extents (meta_surface, &meta_extents); if (status) return status; old_content = surface->content; old_width = surface->width; old_height = surface->height; old_cairo_to_ps = surface->cairo_to_ps; old_clip = _cairo_surface_get_clip (&surface->base); surface->width = meta_extents.width; surface->height = meta_extents.height; cairo_matrix_init (&surface->cairo_to_ps, 1, 0, 0, -1, 0, surface->height); _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, &surface->cairo_to_ps); _cairo_output_stream_printf (surface->stream, " q\n" " 0 0 %f %f rectclip\n", surface->width, surface->height); if (cairo_surface_get_content (meta_surface) == CAIRO_CONTENT_COLOR) { surface->content = CAIRO_CONTENT_COLOR; _cairo_output_stream_printf (surface->stream, " 0 g 0 0 %f %f rectfill\n", surface->width, surface->height); } status = _cairo_meta_surface_replay_region (meta_surface, &surface->base, CAIRO_META_REGION_NATIVE); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); if (status) return status; _cairo_output_stream_printf (surface->stream, " Q\n"); surface->content = old_content; surface->width = old_width; surface->height = old_height; surface->cairo_to_ps = old_cairo_to_ps; status = _cairo_surface_set_clip (&surface->base, old_clip); if (status) return status; _cairo_pdf_operators_set_cairo_to_pdf_matrix (&surface->pdf_operators, &surface->cairo_to_ps); return CAIRO_STATUS_SUCCESS; } static void _cairo_ps_surface_flatten_transparency (cairo_ps_surface_t *surface, const cairo_color_t *color, double *red, double *green, double *blue) { *red = color->red; *green = color->green; *blue = color->blue; if (!CAIRO_COLOR_IS_OPAQUE(color)) { if (surface->content == CAIRO_CONTENT_COLOR_ALPHA) { uint8_t one_minus_alpha = 255 - (color->alpha_short >> 8); *red = ((color->red_short >> 8) + one_minus_alpha) / 255.0; *green = ((color->green_short >> 8) + one_minus_alpha) / 255.0; *blue = ((color->blue_short >> 8) + one_minus_alpha) / 255.0; } else { *red = (color->red_short >> 8) / 255.0; *green = (color->green_short >> 8) / 255.0; *blue = (color->blue_short >> 8) / 255.0; } } } static void _cairo_ps_surface_emit_solid_pattern (cairo_ps_surface_t *surface, cairo_solid_pattern_t *pattern) { double red, green, blue; _cairo_ps_surface_flatten_transparency (surface, &pattern->color, &red, &green, &blue); if (color_is_gray (red, green, blue)) _cairo_output_stream_printf (surface->stream, "%f g\n", red); else _cairo_output_stream_printf (surface->stream, "%f %f %f rg\n", red, green, blue); } static cairo_status_t _cairo_ps_surface_acquire_surface (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern, int *width, int *height, cairo_operator_t op) { cairo_status_t status; if (_cairo_surface_is_meta (pattern->surface)) { cairo_surface_t *meta_surface = pattern->surface; cairo_rectangle_int_t pattern_extents; status = _cairo_surface_get_extents (meta_surface, &pattern_extents); if (status) return status; *width = pattern_extents.width; *height = pattern_extents.height; } else { status = _cairo_surface_acquire_source_image (pattern->surface, &surface->image, &surface->image_extra); if (status) return status; *width = surface->image->width; *height = surface->image->height; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_surface (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern, cairo_operator_t op) { cairo_status_t status; if (_cairo_surface_is_meta (pattern->surface)) { cairo_surface_t *meta_surface = pattern->surface; status = _cairo_ps_surface_emit_meta_surface (surface, meta_surface); } else { status = _cairo_ps_surface_emit_image (surface, surface->image, op); } return status; } static void _cairo_ps_surface_release_surface (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern) { if (!_cairo_surface_is_meta (pattern->surface)) _cairo_surface_release_source_image (pattern->surface, surface->image, surface->image_extra); } static cairo_status_t _cairo_ps_surface_paint_surface (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern, cairo_operator_t op) { cairo_status_t status; int width, height; cairo_matrix_t cairo_p2d, ps_p2d; status = _cairo_ps_surface_acquire_surface (surface, pattern, &width, &height, op); if (status) return status; cairo_p2d = pattern->base.matrix; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_FALLBACK) { double scale = cairo_p2d.xx; _cairo_output_stream_printf (surface->stream, "%% Fallback Image: x=%f, y=%f, w=%d, h=%d res=%fdpi size=%ld\n", -cairo_p2d.x0/scale, -cairo_p2d.y0/scale, (int)(width/scale), (int)(height/scale), scale*72, (long)width*height*3); } else { if (op == CAIRO_OPERATOR_SOURCE) { _cairo_output_stream_printf (surface->stream, "%d g 0 0 %f %f rectfill\n", surface->content == CAIRO_CONTENT_COLOR ? 0 : 1, surface->width, surface->height); } } status = cairo_matrix_invert (&cairo_p2d); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); ps_p2d = surface->cairo_to_ps; cairo_matrix_multiply (&ps_p2d, &cairo_p2d, &ps_p2d); cairo_matrix_translate (&ps_p2d, 0.0, height); cairo_matrix_scale (&ps_p2d, 1.0, -1.0); _cairo_output_stream_printf (surface->stream, "[ %f %f %f %f %f %f ] concat\n", ps_p2d.xx, ps_p2d.yx, ps_p2d.xy, ps_p2d.yy, ps_p2d.x0, ps_p2d.y0); status = _cairo_ps_surface_emit_surface (surface, pattern, op); _cairo_ps_surface_release_surface (surface, pattern); return status; } static cairo_status_t _cairo_ps_surface_emit_surface_pattern (cairo_ps_surface_t *surface, cairo_surface_pattern_t *pattern, cairo_operator_t op) { cairo_status_t status; int pattern_width = 0; /* squelch bogus compiler warning */ int pattern_height = 0; /* squelch bogus compiler warning */ double xstep, ystep; cairo_matrix_t cairo_p2d, ps_p2d; cairo_rectangle_int_t surface_extents; cairo_bool_t old_use_string_datasource; cairo_p2d = pattern->base.matrix; status = cairo_matrix_invert (&cairo_p2d); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); ps_p2d = surface->cairo_to_ps; cairo_matrix_multiply (&ps_p2d, &cairo_p2d, &ps_p2d); cairo_matrix_translate (&ps_p2d, 0.0, pattern_height); cairo_matrix_scale (&ps_p2d, 1.0, -1.0); status = _cairo_ps_surface_acquire_surface (surface, pattern, &pattern_width, &pattern_height, op); if (status) return status; switch (pattern->base.extend) { /* We implement EXTEND_PAD like EXTEND_NONE for now */ case CAIRO_EXTEND_PAD: case CAIRO_EXTEND_NONE: { /* In PS/PDF, (as far as I can tell), all patterns are * repeating. So we support cairo's EXTEND_NONE semantics * by setting the repeat step size to a size large enough * to guarantee that no more than a single occurrence will * be visible. * * First, map the surface extents into pattern space (since * xstep and ystep are in pattern space). Then use an upper * bound on the length of the diagonal of the pattern image * and the surface as repeat size. This guarantees to never * repeat visibly. */ double x1 = 0.0, y1 = 0.0; double x2 = surface->width, y2 = surface->height; _cairo_matrix_transform_bounding_box (&pattern->base.matrix, &x1, &y1, &x2, &y2, NULL); /* Rather than computing precise bounds of the union, just * add the surface extents unconditionally. We only * required an answer that's large enough, we don't really * care if it's not as tight as possible.*/ xstep = ystep = ceil ((x2 - x1) + (y2 - y1) + pattern_width + pattern_height); break; } case CAIRO_EXTEND_REPEAT: xstep = pattern_width; ystep = pattern_height; break; case CAIRO_EXTEND_REFLECT: xstep = pattern_width*2; ystep = pattern_height*2; break; /* All the rest (if any) should have been analyzed away, so these * cases should be unreachable. */ default: ASSERT_NOT_REACHED; xstep = 0; ystep = 0; } _cairo_output_stream_printf (surface->stream, "/CairoPattern {\n"); old_use_string_datasource = surface->use_string_datasource; surface->use_string_datasource = TRUE; if (op == CAIRO_OPERATOR_SOURCE) { _cairo_output_stream_printf (surface->stream, "%d g 0 0 %f %f rectfill\n", surface->content == CAIRO_CONTENT_COLOR ? 0 : 1, xstep, ystep); } status = _cairo_ps_surface_emit_surface (surface, pattern, op); if (status) return status; surface->use_string_datasource = old_use_string_datasource; _cairo_output_stream_printf (surface->stream, "} bind def\n"); _cairo_output_stream_printf (surface->stream, "<< /PatternType 1\n" " /PaintType 1\n" " /TilingType 1\n"); _cairo_output_stream_printf (surface->stream, " /XStep %f /YStep %f\n", xstep, ystep); if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { _cairo_output_stream_printf (surface->stream, " /BBox [0 0 %d %d]\n" " /PaintProc {\n" " CairoPattern\n" " [-1 0 0 1 %d 0] concat CairoPattern\n" " [ 1 0 0 -1 0 %d] concat CairoPattern\n" " [-1 0 0 1 %d 0] concat CairoPattern\n" " CairoPattern\n" " } bind\n", pattern_width*2, pattern_height*2, pattern_width*2, pattern_height*2, pattern_width*2); } else { if (op == CAIRO_OPERATOR_SOURCE) { _cairo_output_stream_printf (surface->stream, " /BBox [0 0 %f %f]\n", xstep, ystep); } else { _cairo_output_stream_printf (surface->stream, " /BBox [0 0 %d %d]\n", pattern_width, pattern_height); } _cairo_output_stream_printf (surface->stream, " /PaintProc { CairoPattern }\n"); } _cairo_output_stream_printf (surface->stream, ">>\n"); status = _cairo_surface_get_extents (&surface->base, &surface_extents); if (status) return status; cairo_p2d = pattern->base.matrix; status = cairo_matrix_invert (&cairo_p2d); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_init_identity (&ps_p2d); cairo_matrix_translate (&ps_p2d, 0.0, surface_extents.height); cairo_matrix_scale (&ps_p2d, 1.0, -1.0); cairo_matrix_multiply (&ps_p2d, &cairo_p2d, &ps_p2d); cairo_matrix_translate (&ps_p2d, 0.0, pattern_height); cairo_matrix_scale (&ps_p2d, 1.0, -1.0); _cairo_output_stream_printf (surface->stream, "[ %f %f %f %f %f %f ]\n", ps_p2d.xx, ps_p2d.yx, ps_p2d.xy, ps_p2d.yy, ps_p2d.x0, ps_p2d.y0); _cairo_output_stream_printf (surface->stream, "makepattern setpattern\n"); return CAIRO_STATUS_SUCCESS; } typedef struct _cairo_ps_color_stop { double offset; double color[4]; } cairo_ps_color_stop_t; static void _cairo_ps_surface_emit_linear_colorgradient (cairo_ps_surface_t *surface, cairo_ps_color_stop_t *stop1, cairo_ps_color_stop_t *stop2) { _cairo_output_stream_printf (surface->stream, " << /FunctionType 2\n" " /Domain [ 0 1 ]\n" " /C0 [ %f %f %f ]\n" " /C1 [ %f %f %f ]\n" " /N 1\n" " >>\n", stop1->color[0], stop1->color[1], stop1->color[2], stop2->color[0], stop2->color[1], stop2->color[2]); } static void _cairo_ps_surface_emit_stitched_colorgradient (cairo_ps_surface_t *surface, unsigned int n_stops, cairo_ps_color_stop_t stops[]) { unsigned int i; _cairo_output_stream_printf (surface->stream, "<< /FunctionType 3\n" " /Domain [ 0 1 ]\n" " /Functions [\n"); for (i = 0; i < n_stops - 1; i++) _cairo_ps_surface_emit_linear_colorgradient (surface, &stops[i], &stops[i+1]); _cairo_output_stream_printf (surface->stream, " ]\n"); _cairo_output_stream_printf (surface->stream, " /Bounds [ "); for (i = 1; i < n_stops-1; i++) _cairo_output_stream_printf (surface->stream, "%f ", stops[i].offset); _cairo_output_stream_printf (surface->stream, "]\n"); _cairo_output_stream_printf (surface->stream, " /Encode [ 1 1 %d { pop 0 1 } for ]\n", n_stops - 1); _cairo_output_stream_printf (surface->stream, ">>\n"); } static void calc_gradient_color (cairo_ps_color_stop_t *new_stop, cairo_ps_color_stop_t *stop1, cairo_ps_color_stop_t *stop2) { int i; double offset = stop1->offset / (stop1->offset + 1.0 - stop2->offset); for (i = 0; i < 4; i++) new_stop->color[i] = stop1->color[i] + offset*(stop2->color[i] - stop1->color[i]); } #define COLOR_STOP_EPSILON 1e-6 static cairo_status_t _cairo_ps_surface_emit_pattern_stops (cairo_ps_surface_t *surface, cairo_gradient_pattern_t *pattern) { cairo_ps_color_stop_t *allstops, *stops; unsigned int i, n_stops; allstops = _cairo_malloc_ab ((pattern->n_stops + 2), sizeof (cairo_ps_color_stop_t)); if (allstops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); stops = &allstops[1]; n_stops = pattern->n_stops; for (i = 0; i < n_stops; i++) { cairo_gradient_stop_t *stop = &pattern->stops[i]; stops[i].color[0] = stop->color.red; stops[i].color[1] = stop->color.green; stops[i].color[2] = stop->color.blue; stops[i].color[3] = stop->color.alpha; stops[i].offset = pattern->stops[i].offset; } if (pattern->base.extend == CAIRO_EXTEND_REPEAT || pattern->base.extend == CAIRO_EXTEND_REFLECT) { if (stops[0].offset > COLOR_STOP_EPSILON) { if (pattern->base.extend == CAIRO_EXTEND_REFLECT) memcpy (allstops, stops, sizeof (cairo_ps_color_stop_t)); else calc_gradient_color (&allstops[0], &stops[0], &stops[n_stops-1]); stops = allstops; n_stops++; } stops[0].offset = 0.0; if (stops[n_stops-1].offset < 1.0 - COLOR_STOP_EPSILON) { if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { memcpy (&stops[n_stops], &stops[n_stops - 1], sizeof (cairo_ps_color_stop_t)); } else { calc_gradient_color (&stops[n_stops], &stops[0], &stops[n_stops-1]); } n_stops++; } stops[n_stops-1].offset = 1.0; } for (i = 0; i < n_stops; i++) { double red, green, blue; cairo_color_t color; _cairo_color_init_rgba (&color, stops[i].color[0], stops[i].color[1], stops[i].color[2], stops[i].color[3]); _cairo_ps_surface_flatten_transparency (surface, &color, &red, &green, &blue); stops[i].color[0] = red; stops[i].color[1] = green; stops[i].color[2] = blue; } _cairo_output_stream_printf (surface->stream, "/CairoFunction\n"); if (n_stops == 2) { /* no need for stitched function */ _cairo_ps_surface_emit_linear_colorgradient (surface, &stops[0], &stops[1]); } else { /* multiple stops: stitch. XXX possible optimization: regulary spaced * stops do not require stitching. XXX */ _cairo_ps_surface_emit_stitched_colorgradient (surface, n_stops,stops); } _cairo_output_stream_printf (surface->stream, "def\n"); free (allstops); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_repeating_function (cairo_ps_surface_t *surface, cairo_gradient_pattern_t *pattern, int begin, int end) { _cairo_output_stream_printf (surface->stream, "/CairoFunction\n" "<< /FunctionType 3\n" " /Domain [ %d %d ]\n" " /Functions [ %d {CairoFunction} repeat ]\n" " /Bounds [ %d 1 %d {} for ]\n", begin, end, end - begin, begin + 1, end - 1); if (pattern->base.extend == CAIRO_EXTEND_REFLECT) { _cairo_output_stream_printf (surface->stream, " /Encode [ %d 1 %d { 2 mod 0 eq {0 1} {1 0} ifelse } for ]\n", begin, end - 1); } else { _cairo_output_stream_printf (surface->stream, " /Encode [ %d 1 %d { pop 0 1 } for ]\n", begin, end - 1); } _cairo_output_stream_printf (surface->stream, ">> def\n"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_ps_surface_emit_linear_pattern (cairo_ps_surface_t *surface, cairo_linear_pattern_t *pattern) { double x1, y1, x2, y2; double _x1, _y1, _x2, _y2; cairo_matrix_t pat_to_ps; cairo_extend_t extend; cairo_status_t status; cairo_gradient_pattern_t *gradient = &pattern->base; double first_stop, last_stop; int repeat_begin = 0, repeat_end = 1; if (pattern->base.n_stops == 0) return CAIRO_INT_STATUS_NOTHING_TO_DO; extend = cairo_pattern_get_extend (&pattern->base.base); pat_to_ps = pattern->base.base.matrix; status = cairo_matrix_invert (&pat_to_ps); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); first_stop = gradient->stops[0].offset; last_stop = gradient->stops[gradient->n_stops - 1].offset; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { double dx, dy; int x_rep = 0, y_rep = 0; x1 = _cairo_fixed_to_double (pattern->p1.x); y1 = _cairo_fixed_to_double (pattern->p1.y); cairo_matrix_transform_point (&pat_to_ps, &x1, &y1); x2 = _cairo_fixed_to_double (pattern->p2.x); y2 = _cairo_fixed_to_double (pattern->p2.y); cairo_matrix_transform_point (&pat_to_ps, &x2, &y2); dx = fabs (x2 - x1); dy = fabs (y2 - y1); if (dx > 1e-6) x_rep = (int) ceil (surface->width/dx); if (dy > 1e-6) y_rep = (int) ceil (surface->height/dy); repeat_end = MAX (x_rep, y_rep); repeat_begin = -repeat_end; first_stop = repeat_begin; last_stop = repeat_end; } /* PS requires the first and last stop to be the same as the line * coordinates. For repeating patterns this moves the line * coordinates out to the begin/end of the repeating function. For * non repeating patterns this may move the line coordinates in if * there are not stops at offset 0 and 1. */ x1 = _cairo_fixed_to_double (pattern->p1.x); y1 = _cairo_fixed_to_double (pattern->p1.y); x2 = _cairo_fixed_to_double (pattern->p2.x); y2 = _cairo_fixed_to_double (pattern->p2.y); _x1 = x1 + (x2 - x1)*first_stop; _y1 = y1 + (y2 - y1)*first_stop; _x2 = x1 + (x2 - x1)*last_stop; _y2 = y1 + (y2 - y1)*last_stop; x1 = _x1; x2 = _x2; y1 = _y1; y2 = _y2; /* For EXTEND_NONE and EXTEND_PAD if there are only two stops a * Type 2 function is used by itself without a stitching * function. Type 2 functions always have the domain [0 1] */ if ((pattern->base.base.extend == CAIRO_EXTEND_NONE || pattern->base.base.extend == CAIRO_EXTEND_PAD) && gradient->n_stops == 2) { first_stop = 0.0; last_stop = 1.0; } status = _cairo_ps_surface_emit_pattern_stops (surface, &pattern->base); if (status) return status; if (pattern->base.base.extend == CAIRO_EXTEND_REPEAT || pattern->base.base.extend == CAIRO_EXTEND_REFLECT) { status = _cairo_ps_surface_emit_repeating_function (surface, &pattern->base, repeat_begin, repeat_end); if (status) return status; } _cairo_output_stream_printf (surface->stream, "<< /PatternType 2\n" " /Shading\n" " << /ShadingType 2\n" " /ColorSpace /DeviceRGB\n" " /Coords [ %f %f %f %f ]\n" " /Domain [ %f %f ]\r\n" " /Function CairoFunction\n", x1, y1, x2, y2, first_stop, last_stop); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->stream, " /Extend [ true true ]\r\n"); } else { _cairo_output_stream_printf (surface->stream, " /Extend [ false false ]\r\n"); } _cairo_output_stream_printf (surface->stream, " >>\n" ">>\n"); _cairo_output_stream_printf (surface->stream, "[ %f %f %f %f %f %f ]\n", pat_to_ps.xx, pat_to_ps.yx, pat_to_ps.xy, pat_to_ps.yy, pat_to_ps.x0, pat_to_ps.y0); _cairo_output_stream_printf (surface->stream, "makepattern setpattern\n"); return status; } static cairo_status_t _cairo_ps_surface_emit_radial_pattern (cairo_ps_surface_t *surface, cairo_radial_pattern_t *pattern) { double x1, y1, x2, y2, r1, r2; cairo_matrix_t pat_to_ps; cairo_extend_t extend; cairo_status_t status; if (pattern->base.n_stops == 0) return CAIRO_INT_STATUS_NOTHING_TO_DO; extend = cairo_pattern_get_extend (&pattern->base.base); pat_to_ps = pattern->base.base.matrix; status = cairo_matrix_invert (&pat_to_ps); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&pat_to_ps, &pat_to_ps, &surface->cairo_to_ps); x1 = _cairo_fixed_to_double (pattern->c1.x); y1 = _cairo_fixed_to_double (pattern->c1.y); r1 = _cairo_fixed_to_double (pattern->r1); x2 = _cairo_fixed_to_double (pattern->c2.x); y2 = _cairo_fixed_to_double (pattern->c2.y); r2 = _cairo_fixed_to_double (pattern->r2); status = _cairo_ps_surface_emit_pattern_stops (surface, &pattern->base); if (status) return status; _cairo_output_stream_printf (surface->stream, "<< /PatternType 2\n" " /Shading\n" " << /ShadingType 3\n" " /ColorSpace /DeviceRGB\n" " /Coords [ %f %f %f %f %f %f ]\n" " /Function CairoFunction\n", x1, y1, r1, x2, y2, r2); if (extend == CAIRO_EXTEND_PAD) { _cairo_output_stream_printf (surface->stream, " /Extend [ true true ]\r\n"); } else { _cairo_output_stream_printf (surface->stream, " /Extend [ false false ]\r\n"); } _cairo_output_stream_printf (surface->stream, " >>\n" ">>\n"); _cairo_output_stream_printf (surface->stream, "[ %f %f %f %f %f %f ]\n", pat_to_ps.xx, pat_to_ps.yx, pat_to_ps.xy, pat_to_ps.yy, pat_to_ps.x0, pat_to_ps.y0); _cairo_output_stream_printf (surface->stream, "makepattern setpattern\n"); return status; } static cairo_status_t _cairo_ps_surface_emit_pattern (cairo_ps_surface_t *surface, cairo_pattern_t *pattern, cairo_operator_t op) { /* FIXME: We should keep track of what pattern is currently set in * the postscript file and only emit code if we're setting a * different pattern. */ cairo_status_t status; switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: _cairo_ps_surface_emit_solid_pattern (surface, (cairo_solid_pattern_t *) pattern); break; case CAIRO_PATTERN_TYPE_SURFACE: status = _cairo_ps_surface_emit_surface_pattern (surface, (cairo_surface_pattern_t *) pattern, op); if (status) return status; break; case CAIRO_PATTERN_TYPE_LINEAR: status = _cairo_ps_surface_emit_linear_pattern (surface, (cairo_linear_pattern_t *) pattern); if (status) return status; break; case CAIRO_PATTERN_TYPE_RADIAL: status = _cairo_ps_surface_emit_radial_pattern (surface, (cairo_radial_pattern_t *) pattern); if (status) return status; break; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_ps_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_ps_surface_t *surface = abstract_surface; cairo_output_stream_t *stream = surface->stream; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; #if DEBUG_PS _cairo_output_stream_printf (stream, "%% _cairo_ps_surface_intersect_clip_path\n"); #endif if (path == NULL) { _cairo_output_stream_printf (stream, "Q q\n"); return CAIRO_STATUS_SUCCESS; } return _cairo_pdf_operators_clip (&surface->pdf_operators, path, fill_rule); } static cairo_int_status_t _cairo_ps_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_ps_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; /* XXX: The conversion to integers here is pretty bogus, (not to * mention the aribitray limitation of width to a short(!). We * may need to come up with a better interface for get_extents. */ rectangle->width = (int) ceil (surface->width); rectangle->height = (int) ceil (surface->height); return CAIRO_STATUS_SUCCESS; } static void _cairo_ps_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { _cairo_font_options_init_default (options); cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); } static cairo_int_status_t _cairo_ps_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_ps_surface_t *surface = abstract_surface; cairo_output_stream_t *stream = surface->stream; cairo_rectangle_int_t extents; cairo_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_ps_surface_analyze_operation (surface, op, source); assert (_cairo_ps_surface_operation_supported (surface, op, source)); #if DEBUG_PS _cairo_output_stream_printf (stream, "%% _cairo_ps_surface_paint\n"); #endif status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (source->type == CAIRO_PATTERN_TYPE_SURFACE && (source->extend == CAIRO_EXTEND_NONE || source->extend == CAIRO_EXTEND_PAD)) { _cairo_output_stream_printf (stream, "q 0 0 %d %d rectclip\n", extents.width, extents.height); status = _cairo_ps_surface_paint_surface (surface, (cairo_surface_pattern_t *) source, op); if (status) return status; _cairo_output_stream_printf (stream, "Q\n"); } else { status = _cairo_ps_surface_emit_pattern (surface, source, op); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; _cairo_output_stream_printf (stream, "0 0 %d %d rectfill\n", extents.width, extents.height); } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_ps_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_ps_surface_t *surface = abstract_surface; cairo_int_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_ps_surface_analyze_operation (surface, op, source); assert (_cairo_ps_surface_operation_supported (surface, op, source)); #if DEBUG_PS _cairo_output_stream_printf (surface->stream, "%% _cairo_ps_surface_stroke\n"); #endif status = _cairo_ps_surface_emit_pattern (surface, source, op); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; return _cairo_pdf_operators_stroke (&surface->pdf_operators, path, style, ctm, ctm_inverse); } static cairo_int_status_t _cairo_ps_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_ps_surface_t *surface = abstract_surface; cairo_int_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_ps_surface_analyze_operation (surface, op, source); assert (_cairo_ps_surface_operation_supported (surface, op, source)); #if DEBUG_PS _cairo_output_stream_printf (surface->stream, "%% _cairo_ps_surface_fill\n"); #endif if (source->type == CAIRO_PATTERN_TYPE_SURFACE && (source->extend == CAIRO_EXTEND_NONE || source->extend == CAIRO_EXTEND_PAD)) { _cairo_output_stream_printf (surface->stream, "q\n"); status = _cairo_pdf_operators_clip (&surface->pdf_operators, path, fill_rule); if (status) return status; status = _cairo_ps_surface_paint_surface (surface, (cairo_surface_pattern_t *) source, op); if (status) return status; _cairo_output_stream_printf (surface->stream, "Q\n"); } else { status = _cairo_ps_surface_emit_pattern (surface, source, op); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; status = _cairo_pdf_operators_fill (&surface->pdf_operators, path, fill_rule); } return status; } static cairo_int_status_t _cairo_ps_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_ps_surface_t *surface = abstract_surface; cairo_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_ps_surface_analyze_operation (surface, op, source); assert (_cairo_ps_surface_operation_supported (surface, op, source)); #if DEBUG_PS _cairo_output_stream_printf (surface->stream, "%% _cairo_ps_surface_show_glyphs\n"); #endif if (num_glyphs <= 0) return CAIRO_STATUS_SUCCESS; status = _cairo_ps_surface_emit_pattern (surface, source, op); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; return _cairo_pdf_operators_show_glyphs (&surface->pdf_operators, glyphs, num_glyphs, scaled_font); } static void _cairo_ps_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t paginated_mode) { cairo_ps_surface_t *surface = abstract_surface; surface->paginated_mode = paginated_mode; } static cairo_int_status_t _cairo_ps_surface_set_bounding_box (void *abstract_surface, cairo_box_t *bbox) { cairo_ps_surface_t *surface = abstract_surface; int i, num_comments; char **comments; int x1, y1, x2, y2; if (surface->eps) { x1 = (int) floor (_cairo_fixed_to_double (bbox->p1.x)); y1 = (int) floor (surface->height - _cairo_fixed_to_double (bbox->p2.y)); x2 = (int) ceil (_cairo_fixed_to_double (bbox->p2.x)); y2 = (int) ceil (surface->height - _cairo_fixed_to_double (bbox->p1.y)); } else { x1 = 0; y1 = 0; x2 = (int) ceil (surface->width); y2 = (int) ceil (surface->height); } _cairo_output_stream_printf (surface->stream, "%%%%Page: %d %d\n", surface->num_pages, surface->num_pages); _cairo_output_stream_printf (surface->stream, "%%%%BeginPageSetup\n"); num_comments = _cairo_array_num_elements (&surface->dsc_page_setup_comments); comments = _cairo_array_index (&surface->dsc_page_setup_comments, 0); for (i = 0; i < num_comments; i++) { _cairo_output_stream_printf (surface->stream, "%s\n", comments[i]); free (comments[i]); comments[i] = NULL; } _cairo_array_truncate (&surface->dsc_page_setup_comments, 0); _cairo_output_stream_printf (surface->stream, "%%%%PageBoundingBox: %d %d %d %d\n", x1, y1, x2, y2); _cairo_output_stream_printf (surface->stream, "%%%%EndPageSetup\n" "q\n"); if (surface->num_pages == 1) { surface->bbox_x1 = x1; surface->bbox_y1 = y1; surface->bbox_x2 = x2; surface->bbox_y2 = y2; } else { if (x1 < surface->bbox_x1) surface->bbox_x1 = x1; if (y1 < surface->bbox_y1) surface->bbox_y1 = y1; if (x2 > surface->bbox_x2) surface->bbox_x2 = x2; if (y2 > surface->bbox_y2) surface->bbox_y2 = y2; } return _cairo_output_stream_get_status (surface->stream); } static const cairo_surface_backend_t cairo_ps_surface_backend = { CAIRO_SURFACE_TYPE_PS, _cairo_ps_surface_create_similar, _cairo_ps_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* cairo_ps_surface_copy_page */ _cairo_ps_surface_show_page, NULL, /* set_clip_region */ _cairo_ps_surface_intersect_clip_path, _cairo_ps_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_ps_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ /* Here are the drawing functions */ _cairo_ps_surface_paint, /* paint */ NULL, /* mask */ _cairo_ps_surface_stroke, _cairo_ps_surface_fill, _cairo_ps_surface_show_glyphs, NULL, /* snapshot */ }; static const cairo_paginated_surface_backend_t cairo_ps_surface_paginated_backend = { _cairo_ps_surface_start_page, _cairo_ps_surface_set_paginated_mode, _cairo_ps_surface_set_bounding_box, }; libgdiplus-2.11/cairo/src/check-def.sh0000775000175000017500000000177112225470167014566 00000000000000#!/bin/sh LANG=C if ! which nm 2>/dev/null >/dev/null; then echo "'nm' not found; skipping test" exit 0 fi test -z "$srcdir" && srcdir=. test -z "$MAKE" && MAKE=make status=0 $MAKE check-has-hidden-symbols.i > /dev/null || exit 1 if tail -1 check-has-hidden-symbols.i | grep CAIRO_HAS_HIDDEN_SYMBOLS >/dev/null; then echo "Compiler doesn't support symbol visibility; skipping test" exit 0 fi get_cairo_syms='nm "$so" | grep " T " | cut -d" " -f3' if [ "`uname -s`" = "Linux" ]; then get_cairo_syms='objdump -t "$so" | sed -n "/.*g *F *\.\(opd\|text\).* \(.*cairo_.*\)$/s//\2/p"' fi defs="cairo.def" $MAKE $defs > /dev/null for def in $defs; do lib=`echo "$def" | sed 's/[.]def$//'` lib=`echo "$lib" | sed 's@.*/@@'` so=.libs/lib${lib}.so test -f "$so" || continue echo Checking $def { echo EXPORTS eval $get_cairo_syms | grep -v '^_cairo_test_\|^_fini\|^_init' | sort -u # cheat: copy the last line from the def file! tail -n1 "$def" } | diff "$def" - || status=1 done exit $status libgdiplus-2.11/cairo/src/cairo-win32.h0000664000175000017500000000673512225470167014631 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Owen Taylor */ #ifndef _CAIRO_WIN32_H_ #define _CAIRO_WIN32_H_ #include #if CAIRO_HAS_WIN32_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_win32_surface_create (HDC hdc); cairo_public cairo_surface_t * cairo_win32_printing_surface_create (HDC hdc); cairo_public cairo_surface_t * cairo_win32_surface_create_with_ddb (HDC hdc, cairo_format_t format, int width, int height); cairo_public cairo_surface_t * cairo_win32_surface_create_with_dib (cairo_format_t format, int width, int height); cairo_public HDC cairo_win32_surface_get_dc (cairo_surface_t *surface); cairo_public cairo_surface_t * cairo_win32_surface_get_image (cairo_surface_t *surface); cairo_public cairo_font_face_t * cairo_win32_font_face_create_for_logfontw (LOGFONTW *logfont); cairo_public cairo_font_face_t * cairo_win32_font_face_create_for_hfont (HFONT font); cairo_public cairo_font_face_t * cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font); cairo_public cairo_status_t cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font, HDC hdc); cairo_public void cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font); cairo_public double cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font); cairo_public void cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, cairo_matrix_t *logical_to_device); cairo_public void cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, cairo_matrix_t *device_to_logical); CAIRO_END_DECLS #else /* CAIRO_HAS_WIN32_SURFACE */ # error Cairo was not compiled with support for the win32 backend #endif /* CAIRO_HAS_WIN32_SURFACE */ #endif /* _CAIRO_WIN32_H_ */ libgdiplus-2.11/cairo/src/cairo-font-face.c0000664000175000017500000004015412225470167015515 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Graydon Hoare * Owen Taylor */ #define _BSD_SOURCE /* for strdup() */ #include "cairoint.h" /* Forward declare so we can use it as an arbitrary backend for * _cairo_font_face_nil. */ static const cairo_font_face_backend_t _cairo_toy_font_face_backend; /* #cairo_font_face_t */ const cairo_font_face_t _cairo_font_face_nil = { { 0 }, /* hash_entry */ CAIRO_STATUS_NO_MEMORY, /* status */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ { 0, 0, 0, NULL }, /* user_data */ &_cairo_toy_font_face_backend }; cairo_status_t _cairo_font_face_set_error (cairo_font_face_t *font_face, cairo_status_t status) { if (status == CAIRO_STATUS_SUCCESS) return status; _cairo_status_set_error (&font_face->status, status); return _cairo_error (status); } void _cairo_font_face_init (cairo_font_face_t *font_face, const cairo_font_face_backend_t *backend) { CAIRO_MUTEX_INITIALIZE (); font_face->status = CAIRO_STATUS_SUCCESS; CAIRO_REFERENCE_COUNT_INIT (&font_face->ref_count, 1); font_face->backend = backend; _cairo_user_data_array_init (&font_face->user_data); } /** * cairo_font_face_reference: * @font_face: a #cairo_font_face_t, (may be %NULL in which case this * function does nothing). * * Increases the reference count on @font_face by one. This prevents * @font_face from being destroyed until a matching call to * cairo_font_face_destroy() is made. * * The number of references to a #cairo_font_face_t can be get using * cairo_font_face_get_reference_count(). * * Return value: the referenced #cairo_font_face_t. **/ cairo_font_face_t * cairo_font_face_reference (cairo_font_face_t *font_face) { if (font_face == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) return font_face; /* We would normally assert that we have a reference here but we * can't get away with that due to the zombie case as documented * in _cairo_ft_font_face_destroy. */ _cairo_reference_count_inc (&font_face->ref_count); return font_face; } slim_hidden_def (cairo_font_face_reference); /** * cairo_font_face_destroy: * @font_face: a #cairo_font_face_t * * Decreases the reference count on @font_face by one. If the result * is zero, then @font_face and all associated resources are freed. * See cairo_font_face_reference(). **/ void cairo_font_face_destroy (cairo_font_face_t *font_face) { if (font_face == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&font_face->ref_count)); if (! _cairo_reference_count_dec_and_test (&font_face->ref_count)) return; font_face->backend->destroy (font_face); /* We allow resurrection to deal with some memory management for the * FreeType backend where cairo_ft_font_face_t and cairo_ft_unscaled_font_t * need to effectively mutually reference each other */ if (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&font_face->ref_count)) return; _cairo_user_data_array_fini (&font_face->user_data); free (font_face); } slim_hidden_def (cairo_font_face_destroy); /** * cairo_font_face_get_type: * @font_face: a font face * * This function returns the type of the backend used to create * a font face. See #cairo_font_type_t for available types. * * Return value: The type of @font_face. * * Since: 1.2 **/ cairo_font_type_t cairo_font_face_get_type (cairo_font_face_t *font_face) { return font_face->backend->type; } /** * cairo_font_face_get_reference_count: * @font_face: a #cairo_font_face_t * * Returns the current reference count of @font_face. * * Return value: the current reference count of @font_face. If the * object is a nil object, 0 will be returned. * * Since: 1.4 **/ unsigned int cairo_font_face_get_reference_count (cairo_font_face_t *font_face) { if (font_face == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) return 0; return CAIRO_REFERENCE_COUNT_GET_VALUE (&font_face->ref_count); } /** * cairo_font_face_status: * @font_face: a #cairo_font_face_t * * Checks whether an error has previously occurred for this * font face * * Return value: %CAIRO_STATUS_SUCCESS or another error such as * %CAIRO_STATUS_NO_MEMORY. **/ cairo_status_t cairo_font_face_status (cairo_font_face_t *font_face) { return font_face->status; } /** * cairo_font_face_get_user_data: * @font_face: a #cairo_font_face_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Return user data previously attached to @font_face using the specified * key. If no user data has been attached with the given key this * function returns %NULL. * * Return value: the user data previously attached or %NULL. **/ void * cairo_font_face_get_user_data (cairo_font_face_t *font_face, const cairo_user_data_key_t *key) { return _cairo_user_data_array_get_data (&font_face->user_data, key); } /** * cairo_font_face_set_user_data: * @font_face: a #cairo_font_face_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach to the font face * @destroy: a #cairo_destroy_func_t which will be called when the * font face is destroyed or when new user data is attached using the * same key. * * Attach user data to @font_face. To remove user data from a font face, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. **/ cairo_status_t cairo_font_face_set_user_data (cairo_font_face_t *font_face, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->ref_count)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _cairo_user_data_array_set_data (&font_face->user_data, key, user_data, destroy); } static const cairo_font_face_backend_t _cairo_toy_font_face_backend; static int _cairo_toy_font_face_keys_equal (const void *key_a, const void *key_b); /* We maintain a hash table from family/weight/slant => * #cairo_font_face_t for #cairo_toy_font_t. The primary purpose of * this mapping is to provide unique #cairo_font_face_t values so that * our cache and mapping from #cairo_font_face_t => #cairo_scaled_font_t * works. Once the corresponding #cairo_font_face_t objects fall out of * downstream caches, we don't need them in this hash table anymore. * * Modifications to this hash table are protected by * _cairo_font_face_mutex. */ static cairo_hash_table_t *cairo_toy_font_face_hash_table = NULL; static cairo_hash_table_t * _cairo_toy_font_face_hash_table_lock (void) { CAIRO_MUTEX_LOCK (_cairo_font_face_mutex); if (cairo_toy_font_face_hash_table == NULL) { cairo_toy_font_face_hash_table = _cairo_hash_table_create (_cairo_toy_font_face_keys_equal); if (cairo_toy_font_face_hash_table == NULL) { CAIRO_MUTEX_UNLOCK (_cairo_font_face_mutex); return NULL; } } return cairo_toy_font_face_hash_table; } static void _cairo_toy_font_face_hash_table_unlock (void) { CAIRO_MUTEX_UNLOCK (_cairo_font_face_mutex); } /** * _cairo_toy_font_face_init_key: * * Initialize those portions of #cairo_toy_font_face_t needed to use * it as a hash table key, including the hash code buried away in * font_face->base.hash_entry. No memory allocation is performed here * so that no fini call is needed. We do this to make it easier to use * an automatic #cairo_toy_font_face_t variable as a key. **/ static void _cairo_toy_font_face_init_key (cairo_toy_font_face_t *key, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { unsigned long hash; key->family = family; key->owns_family = FALSE; key->slant = slant; key->weight = weight; /* 1607 and 1451 are just a couple of arbitrary primes. */ hash = _cairo_hash_string (family); hash += ((unsigned long) slant) * 1607; hash += ((unsigned long) weight) * 1451; assert (hash != 0); key->base.hash_entry.hash = hash; } static cairo_status_t _cairo_toy_font_face_init (cairo_toy_font_face_t *font_face, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { char *family_copy; family_copy = strdup (family); if (family_copy == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_toy_font_face_init_key (font_face, family_copy, slant, weight); font_face->owns_family = TRUE; _cairo_font_face_init (&font_face->base, &_cairo_toy_font_face_backend); return CAIRO_STATUS_SUCCESS; } static void _cairo_toy_font_face_fini (cairo_toy_font_face_t *font_face) { /* We assert here that we own font_face->family before casting * away the const qualifer. */ assert (font_face->owns_family); free ((char*) font_face->family); } static int _cairo_toy_font_face_keys_equal (const void *key_a, const void *key_b) { const cairo_toy_font_face_t *face_a = key_a; const cairo_toy_font_face_t *face_b = key_b; return (strcmp (face_a->family, face_b->family) == 0 && face_a->slant == face_b->slant && face_a->weight == face_b->weight); } /** * _cairo_toy_font_face_create: * @family: a font family name, encoded in UTF-8 * @slant: the slant for the font * @weight: the weight for the font * * Creates a font face from a triplet of family, slant, and weight. * These font faces are used in implementation of the the #cairo_t "toy" * font API. * * Return value: a newly created #cairo_font_face_t, destroy with * cairo_font_face_destroy() **/ cairo_font_face_t * _cairo_toy_font_face_create (const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { cairo_status_t status; cairo_toy_font_face_t key, *font_face; cairo_hash_table_t *hash_table; hash_table = _cairo_toy_font_face_hash_table_lock (); if (hash_table == NULL) goto UNWIND; _cairo_toy_font_face_init_key (&key, family, slant, weight); /* Return existing font_face if it exists in the hash table. */ if (_cairo_hash_table_lookup (hash_table, &key.base.hash_entry, (cairo_hash_entry_t **) &font_face)) { if (! font_face->base.status) { /* We increment the reference count here manually to avoid double-locking. */ _cairo_reference_count_inc (&font_face->base.ref_count); _cairo_toy_font_face_hash_table_unlock (); return &font_face->base; } /* remove the bad font from the hash table */ _cairo_hash_table_remove (hash_table, &key.base.hash_entry); font_face->base.hash_entry.hash = 0; } /* Otherwise create it and insert into hash table. */ font_face = malloc (sizeof (cairo_toy_font_face_t)); if (font_face == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto UNWIND_HASH_TABLE_LOCK; } status = _cairo_toy_font_face_init (font_face, family, slant, weight); if (status) goto UNWIND_FONT_FACE_MALLOC; status = _cairo_hash_table_insert (hash_table, &font_face->base.hash_entry); if (status) goto UNWIND_FONT_FACE_INIT; _cairo_toy_font_face_hash_table_unlock (); return &font_face->base; UNWIND_FONT_FACE_INIT: _cairo_toy_font_face_fini (font_face); UNWIND_FONT_FACE_MALLOC: free (font_face); UNWIND_HASH_TABLE_LOCK: _cairo_toy_font_face_hash_table_unlock (); UNWIND: return (cairo_font_face_t*) &_cairo_font_face_nil; } static void _cairo_toy_font_face_destroy (void *abstract_face) { cairo_toy_font_face_t *font_face = abstract_face; cairo_hash_table_t *hash_table; if (font_face == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&font_face->base.ref_count)) return; hash_table = _cairo_toy_font_face_hash_table_lock (); /* All created objects must have been mapped in the hash table. */ assert (hash_table != NULL); if (font_face->base.hash_entry.hash != 0) _cairo_hash_table_remove (hash_table, &font_face->base.hash_entry); _cairo_toy_font_face_hash_table_unlock (); _cairo_toy_font_face_fini (font_face); } static cairo_status_t _cairo_toy_font_face_scaled_font_create (void *abstract_font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font) { cairo_toy_font_face_t *font_face = abstract_font_face; const cairo_scaled_font_backend_t * backend = CAIRO_SCALED_FONT_BACKEND_DEFAULT; cairo_status_t status; if (font_face->base.status) return font_face->base.status; status = cairo_font_options_status ((cairo_font_options_t *) options); if (status) return status; return _cairo_font_face_set_error (&font_face->base, backend->create_toy (font_face, font_matrix, ctm, options, scaled_font)); } static const cairo_font_face_backend_t _cairo_toy_font_face_backend = { CAIRO_FONT_TYPE_TOY, _cairo_toy_font_face_destroy, _cairo_toy_font_face_scaled_font_create }; void _cairo_unscaled_font_init (cairo_unscaled_font_t *unscaled_font, const cairo_unscaled_font_backend_t *backend) { CAIRO_REFERENCE_COUNT_INIT (&unscaled_font->ref_count, 1); unscaled_font->backend = backend; } cairo_unscaled_font_t * _cairo_unscaled_font_reference (cairo_unscaled_font_t *unscaled_font) { if (unscaled_font == NULL) return NULL; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&unscaled_font->ref_count)); _cairo_reference_count_inc (&unscaled_font->ref_count); return unscaled_font; } void _cairo_unscaled_font_destroy (cairo_unscaled_font_t *unscaled_font) { if (unscaled_font == NULL) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&unscaled_font->ref_count)); if (! _cairo_reference_count_dec_and_test (&unscaled_font->ref_count)) return; unscaled_font->backend->destroy (unscaled_font); free (unscaled_font); } void _cairo_font_reset_static_data (void) { _cairo_scaled_font_map_destroy (); /* We manually acquire the lock rather than calling * cairo_toy_font_face_hash_table_lock simply to avoid * creating the table only to destroy it again. */ CAIRO_MUTEX_LOCK (_cairo_font_face_mutex); _cairo_hash_table_destroy (cairo_toy_font_face_hash_table); cairo_toy_font_face_hash_table = NULL; CAIRO_MUTEX_UNLOCK (_cairo_font_face_mutex); } libgdiplus-2.11/cairo/src/cairo-glitz-surface.c0000664000175000017500000017651612225470167016446 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 David Reveman * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies * and that both that copyright notice and this permission notice * appear in supporting documentation, and that the name of David * Reveman not be used in advertising or publicity pertaining to * distribution of the software without specific, written prior * permission. David Reveman makes no representations about the * suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS, IN NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: David Reveman */ #include "cairoint.h" #include "cairo-glitz.h" #include "cairo-glitz-private.h" typedef struct _cairo_glitz_surface { cairo_surface_t base; glitz_surface_t *surface; glitz_format_t *format; cairo_bool_t has_clip; cairo_region_t clip; } cairo_glitz_surface_t; static const cairo_surface_backend_t * _cairo_glitz_surface_get_backend (void); static cairo_status_t _cairo_glitz_surface_finish (void *abstract_surface) { cairo_glitz_surface_t *surface = abstract_surface; if (surface->has_clip) { glitz_surface_set_clip_region (surface->surface, 0, 0, NULL, 0); _cairo_region_fini (&surface->clip); } glitz_surface_destroy (surface->surface); return CAIRO_STATUS_SUCCESS; } static glitz_format_name_t _glitz_format_from_content (cairo_content_t content) { switch (content) { case CAIRO_CONTENT_COLOR: return GLITZ_STANDARD_RGB24; case CAIRO_CONTENT_ALPHA: return GLITZ_STANDARD_A8; case CAIRO_CONTENT_COLOR_ALPHA: return GLITZ_STANDARD_ARGB32; } ASSERT_NOT_REACHED; return GLITZ_STANDARD_ARGB32; } static cairo_surface_t * _cairo_glitz_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { cairo_glitz_surface_t *src = abstract_src; cairo_surface_t *crsurface; glitz_drawable_t *drawable; glitz_surface_t *surface; glitz_format_t *gformat; drawable = glitz_surface_get_drawable (src->surface); gformat = glitz_find_standard_format (drawable, _glitz_format_from_content (content)); if (!gformat) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); surface = glitz_surface_create (drawable, gformat, width <= 0 ? 1 : width, height <= 0 ? 1 : height, 0, NULL); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); crsurface = cairo_glitz_surface_create (surface); glitz_surface_destroy (surface); return crsurface; } static cairo_bool_t _CAIRO_MASK_FORMAT (cairo_format_masks_t *masks, cairo_format_t *format) { switch (masks->bpp) { case 32: if (masks->alpha_mask == 0xff000000 && masks->red_mask == 0x00ff0000 && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { *format = CAIRO_FORMAT_ARGB32; return TRUE; } if (masks->alpha_mask == 0x00000000 && masks->red_mask == 0x00ff0000 && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { *format = CAIRO_FORMAT_RGB24; return TRUE; } break; case 8: if (masks->alpha_mask == 0xff) { *format = CAIRO_FORMAT_A8; return TRUE; } break; case 1: if (masks->alpha_mask == 0x1) { *format = CAIRO_FORMAT_A1; return TRUE; } break; } return FALSE; } static cairo_status_t _cairo_glitz_get_boxes_from_region (cairo_region_t *region, glitz_box_t **boxes, int *nboxes) { cairo_box_int_t *cboxes; cairo_status_t status; int n, i; status = _cairo_region_get_boxes (region, &n, &cboxes); if (status) return status; if (n == 0) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto done; } *boxes = _cairo_malloc_ab (n, sizeof(glitz_box_t)); if (*boxes == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto done; } for (i = 0; i < n; i++) { (*boxes)[i].x1 = cboxes[i].p1.x; (*boxes)[i].y1 = cboxes[i].p1.y; (*boxes)[i].x2 = cboxes[i].p2.x; (*boxes)[i].y2 = cboxes[i].p2.y; } *nboxes = n; done: _cairo_region_boxes_fini (region, cboxes); return status; } static cairo_status_t _cairo_glitz_surface_get_image (cairo_glitz_surface_t *surface, cairo_rectangle_int_t *interest, cairo_image_surface_t **image_out, cairo_rectangle_int_t *rect_out) { cairo_image_surface_t *image; int x1, y1, x2, y2; int width, height; unsigned char *pixels; cairo_format_masks_t masks; glitz_buffer_t *buffer; glitz_pixel_format_t pf; cairo_format_t format; x1 = 0; y1 = 0; x2 = glitz_surface_get_width (surface->surface); y2 = glitz_surface_get_height (surface->surface); if (interest) { if (interest->x > x1) x1 = interest->x; if (interest->y > y1) y1 = interest->y; if (interest->x + interest->width < x2) x2 = interest->x + interest->width; if (interest->y + interest->height < y2) y2 = interest->y + interest->height; if (x1 >= x2 || y1 >= y2) { *image_out = NULL; return CAIRO_STATUS_SUCCESS; } } width = x2 - x1; height = y2 - y1; if (rect_out) { rect_out->x = x1; rect_out->y = y1; rect_out->width = width; rect_out->height = height; } if (surface->format->color.fourcc == GLITZ_FOURCC_RGB) { if (surface->format->color.red_size > 0) { masks.bpp = 32; if (surface->format->color.alpha_size > 0) masks.alpha_mask = 0xff000000; else masks.alpha_mask = 0x0; masks.red_mask = 0xff0000; masks.green_mask = 0xff00; masks.blue_mask = 0xff; } else { masks.bpp = 8; masks.blue_mask = masks.green_mask = masks.red_mask = 0x0; masks.alpha_mask = 0xff; } } else { masks.bpp = 32; masks.alpha_mask = 0xff000000; masks.red_mask = 0xff0000; masks.green_mask = 0xff00; masks.blue_mask = 0xff; } pf.fourcc = GLITZ_FOURCC_RGB; pf.masks.bpp = masks.bpp; pf.masks.alpha_mask = masks.alpha_mask; pf.masks.red_mask = masks.red_mask; pf.masks.green_mask = masks.green_mask; pf.masks.blue_mask = masks.blue_mask; pf.xoffset = 0; pf.skip_lines = 0; /* XXX: we should eventually return images with negative stride, need to verify that libpixman have no problem with this first. */ pf.bytes_per_line = (((width * masks.bpp) / 8) + 3) & -4; pf.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN; pixels = _cairo_malloc_ab (height, pf.bytes_per_line); if (!pixels) return _cairo_error (CAIRO_STATUS_NO_MEMORY); buffer = glitz_buffer_create_for_data (pixels); if (!buffer) { free (pixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* clear out the glitz clip; the clip affects glitz_get_pixels */ if (surface->has_clip) glitz_surface_set_clip_region (surface->surface, 0, 0, NULL, 0); glitz_get_pixels (surface->surface, x1, y1, width, height, &pf, buffer); glitz_buffer_destroy (buffer); /* restore the clip, if any */ if (surface->has_clip) { glitz_box_t *box; cairo_status_t status; int n; status = _cairo_glitz_get_boxes_from_region (&surface->clip, &box, &n); if (status) { free (pixels); return status; } glitz_surface_set_clip_region (surface->surface, 0, 0, box, n); free (box); } /* * Prefer to use a standard pixman format instead of the * general masks case. */ if (_CAIRO_MASK_FORMAT (&masks, &format)) { image = (cairo_image_surface_t *) cairo_image_surface_create_for_data (pixels, format, x2 - x1, y2 - y1, pf.bytes_per_line); if (image->base.status) goto FAIL; } else { /* * XXX This can't work. We must convert the data to one of the * supported pixman formats. Pixman needs another function * which takes data in an arbitrary format and converts it * to something supported by that library. */ image = (cairo_image_surface_t *) _cairo_image_surface_create_with_masks (pixels, &masks, x2 - x1, y2 - y1, pf.bytes_per_line); if (image->base.status) goto FAIL; } _cairo_image_surface_assume_ownership_of_data (image); *image_out = image; return CAIRO_STATUS_SUCCESS; FAIL: free (pixels); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } static void cairo_format_get_masks (cairo_format_t format, uint32_t *bpp, uint32_t *alpha, uint32_t *red, uint32_t *green, uint32_t *blue) { *red = 0x0; *green = 0x0; *blue = 0x0; *alpha = 0x0; switch (format) { case CAIRO_FORMAT_ARGB32: *alpha = 0xff000000; case CAIRO_FORMAT_RGB24: default: *bpp = 32; *red = 0x00ff0000; *green = 0x0000ff00; *blue = 0x000000ff; break; case CAIRO_FORMAT_A8: *bpp = 8; *alpha = 0xff; break; case CAIRO_FORMAT_A1: *bpp = 1; *alpha = 0x1; break; } } static cairo_status_t _cairo_glitz_surface_set_image (void *abstract_surface, cairo_image_surface_t *image, int src_x, int src_y, int width, int height, int x_dst, int y_dst) { cairo_glitz_surface_t *surface = abstract_surface; glitz_buffer_t *buffer; glitz_pixel_format_t pf; uint32_t bpp, am, rm, gm, bm; char *data; cairo_format_get_masks (image->format, &bpp, &am, &rm, &gm, &bm); pf.fourcc = GLITZ_FOURCC_RGB; pf.masks.bpp = bpp; pf.masks.alpha_mask = am; pf.masks.red_mask = rm; pf.masks.green_mask = gm; pf.masks.blue_mask = bm; pf.xoffset = src_x; pf.skip_lines = src_y; /* check for negative stride */ if (image->stride < 0) { pf.bytes_per_line = -image->stride; pf.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP; data = (char *) image->data + image->stride * (image->height - 1); } else { pf.bytes_per_line = image->stride; pf.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_TOP_DOWN; data = (char *) image->data; } buffer = glitz_buffer_create_for_data (data); if (!buffer) return _cairo_error (CAIRO_STATUS_NO_MEMORY); glitz_set_pixels (surface->surface, x_dst, y_dst, width, height, &pf, buffer); glitz_buffer_destroy (buffer); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_glitz_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_glitz_surface_t *surface = abstract_surface; *image_extra = NULL; return _cairo_glitz_surface_get_image (surface, NULL, image_out, NULL); } static void _cairo_glitz_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_glitz_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { cairo_glitz_surface_t *surface = abstract_surface; cairo_image_surface_t *image; cairo_status_t status; status = _cairo_glitz_surface_get_image (surface, interest_rect, &image, image_rect_out); if (status) return status; *image_out = image; *image_extra = NULL; return status; } static void _cairo_glitz_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_glitz_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_glitz_surface_set_image (surface, image, 0, 0, image->width, image->height, image_rect->x, image_rect->y); if (status) status = _cairo_surface_set_error (&surface->base, status); cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_glitz_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_glitz_surface_t *surface = abstract_surface; cairo_glitz_surface_t *clone; cairo_status_t status; if (surface->base.status) return surface->base.status; if (src->backend == surface->base.backend) { *clone_out = cairo_surface_reference (src); return CAIRO_STATUS_SUCCESS; } else if (_cairo_surface_is_image (src)) { cairo_image_surface_t *image_src = (cairo_image_surface_t *) src; cairo_content_t content; cairo_rectangle_int_t image_extent; cairo_rectangle_int_t extent; content = _cairo_content_from_format (image_src->format); clone = (cairo_glitz_surface_t *) _cairo_glitz_surface_create_similar (surface, content, image_src->width, image_src->height); if (clone->base.status) return clone->base.status; image_extent.x = 0; image_extent.y = 0; image_extent.width = image_src->width; image_extent.height = image_src->height; extent.x = src_x; extent.y = src_y; extent.width = width; extent.height = height; _cairo_rectangle_intersect(&extent, &image_extent); status = _cairo_glitz_surface_set_image (clone, image_src, extent.x, extent.y, extent.width, extent.height, extent.x, extent.y); if (status) { cairo_surface_destroy (&clone->base); return status; } *clone_out = &clone->base; return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } static void _cairo_glitz_surface_set_matrix (cairo_glitz_surface_t *surface, cairo_matrix_t *matrix) { glitz_transform_t transform; transform.matrix[0][0] = _cairo_fixed_from_double (matrix->xx); transform.matrix[0][1] = _cairo_fixed_from_double (matrix->xy); transform.matrix[0][2] = _cairo_fixed_from_double (matrix->x0); transform.matrix[1][0] = _cairo_fixed_from_double (matrix->yx); transform.matrix[1][1] = _cairo_fixed_from_double (matrix->yy); transform.matrix[1][2] = _cairo_fixed_from_double (matrix->y0); transform.matrix[2][0] = 0; transform.matrix[2][1] = 0; transform.matrix[2][2] = _cairo_fixed_from_double (1); glitz_surface_set_transform (surface->surface, &transform); } static glitz_operator_t _glitz_operator (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: return GLITZ_OPERATOR_CLEAR; case CAIRO_OPERATOR_SOURCE: return GLITZ_OPERATOR_SRC; case CAIRO_OPERATOR_OVER: return GLITZ_OPERATOR_OVER; case CAIRO_OPERATOR_IN: return GLITZ_OPERATOR_IN; case CAIRO_OPERATOR_OUT: return GLITZ_OPERATOR_OUT; case CAIRO_OPERATOR_ATOP: return GLITZ_OPERATOR_ATOP; case CAIRO_OPERATOR_DEST: return GLITZ_OPERATOR_DST; case CAIRO_OPERATOR_DEST_OVER: return GLITZ_OPERATOR_OVER_REVERSE; case CAIRO_OPERATOR_DEST_IN: return GLITZ_OPERATOR_IN_REVERSE; case CAIRO_OPERATOR_DEST_OUT: return GLITZ_OPERATOR_OUT_REVERSE; case CAIRO_OPERATOR_DEST_ATOP: return GLITZ_OPERATOR_ATOP_REVERSE; case CAIRO_OPERATOR_XOR: return GLITZ_OPERATOR_XOR; case CAIRO_OPERATOR_ADD: return GLITZ_OPERATOR_ADD; case CAIRO_OPERATOR_SATURATE: /* XXX: This line should never be reached. Glitz backend should bail out earlier if saturate operator is used. OpenGL can't do saturate with pre-multiplied colors. Solid colors can still be done as we can just un-pre-multiply them. However, support for that will have to be added to glitz. */ /* fall-through */ break; } ASSERT_NOT_REACHED; /* Something's very broken if this line of code can be reached, so we want to return something that would give a noticeably incorrect result. The XOR operator seems so rearely desired that it should fit the bill here. */ return CAIRO_OPERATOR_XOR; } #define CAIRO_GLITZ_FEATURE_OK(surface, name) \ (glitz_drawable_get_features (glitz_surface_get_drawable (surface)) & \ (GLITZ_FEATURE_ ## name ## _MASK)) static glitz_status_t _glitz_ensure_target (glitz_surface_t *surface) { if (!glitz_surface_get_attached_drawable (surface)) { glitz_drawable_format_t *target_format, templ; glitz_format_t *format; glitz_drawable_t *drawable, *target; unsigned int width, height; unsigned long mask; drawable = glitz_surface_get_drawable (surface); format = glitz_surface_get_format (surface); width = glitz_surface_get_width (surface); height = glitz_surface_get_height (surface); if (format->color.fourcc != GLITZ_FOURCC_RGB) return CAIRO_INT_STATUS_UNSUPPORTED; templ.color = format->color; templ.depth_size = 0; templ.stencil_size = 0; templ.doublebuffer = 0; templ.samples = 1; mask = GLITZ_FORMAT_RED_SIZE_MASK | GLITZ_FORMAT_GREEN_SIZE_MASK | GLITZ_FORMAT_BLUE_SIZE_MASK | GLITZ_FORMAT_ALPHA_SIZE_MASK | GLITZ_FORMAT_DEPTH_SIZE_MASK | GLITZ_FORMAT_STENCIL_SIZE_MASK | GLITZ_FORMAT_DOUBLEBUFFER_MASK | GLITZ_FORMAT_SAMPLES_MASK; target_format = glitz_find_drawable_format (drawable, mask, &templ, 0); if (!target_format) return CAIRO_INT_STATUS_UNSUPPORTED; target = glitz_create_drawable (drawable, target_format, width, height); if (!target) return CAIRO_INT_STATUS_UNSUPPORTED; glitz_surface_attach (surface, target, GLITZ_DRAWABLE_BUFFER_FRONT_COLOR); glitz_drawable_destroy (target); } return CAIRO_STATUS_SUCCESS; } typedef struct _cairo_glitz_surface_attributes { cairo_surface_attributes_t base; glitz_fill_t fill; glitz_filter_t filter; glitz_fixed16_16_t *params; int n_params; cairo_bool_t acquired; } cairo_glitz_surface_attributes_t; static cairo_int_status_t _cairo_glitz_pattern_acquire_surface (cairo_pattern_t *pattern, cairo_glitz_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_glitz_surface_t **surface_out, cairo_glitz_surface_attributes_t *attr) { cairo_glitz_surface_t *src = NULL; attr->acquired = FALSE; switch (pattern->type) { case CAIRO_PATTERN_TYPE_LINEAR: case CAIRO_PATTERN_TYPE_RADIAL: { cairo_gradient_pattern_t *gradient = (cairo_gradient_pattern_t *) pattern; char *data; glitz_fixed16_16_t *params; unsigned int n_params; unsigned int *pixels; unsigned int i, n_base_params; glitz_buffer_t *buffer; static const glitz_pixel_format_t format = { GLITZ_FOURCC_RGB, { 32, 0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff }, 0, 0, 0, GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP }; /* XXX: the current color gradient acceleration provided by glitz is * experimental, it's been proven inappropriate in a number of ways, * most importantly, it's currently implemented as filters and * gradients are not filters. eventually, it will be replaced with * something more appropriate. */ if (gradient->n_stops < 2) break; if (!CAIRO_GLITZ_FEATURE_OK (dst->surface, FRAGMENT_PROGRAM)) break; if (pattern->type == CAIRO_PATTERN_TYPE_RADIAL) n_base_params = 6; else n_base_params = 4; n_params = gradient->n_stops * 3 + n_base_params; /* check for int overflow */ { int size1, size2; if (n_params >= INT32_MAX / sizeof (glitz_fixed16_16_t) || gradient->n_stops >= INT32_MAX / sizeof (unsigned int)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); size1 = n_params * sizeof (glitz_fixed16_16_t); size2 = gradient->n_stops * sizeof (unsigned int); if (size1 >= INT32_MAX - size2) return _cairo_error (CAIRO_STATUS_NO_MEMORY); data = malloc (size1 + size2); } if (!data) return _cairo_error (CAIRO_STATUS_NO_MEMORY); params = (glitz_fixed16_16_t *) data; pixels = (unsigned int *) (data + sizeof (glitz_fixed16_16_t) * n_params); buffer = glitz_buffer_create_for_data (pixels); if (!buffer) { free (data); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } src = (cairo_glitz_surface_t *) _cairo_surface_create_similar_scratch (&dst->base, CAIRO_CONTENT_COLOR_ALPHA, gradient->n_stops, 1); if (src->base.status) { glitz_buffer_destroy (buffer); free (data); return src->base.status; } for (i = 0; i < gradient->n_stops; i++) { pixels[i] = (((int) (gradient->stops[i].color.alpha_short >> 8)) << 24) | (((int) (gradient->stops[i].color.red_short >> 8)) << 16) | (((int) (gradient->stops[i].color.green_short >> 8)) << 8) | (((int) (gradient->stops[i].color.blue_short >> 8))); params[n_base_params + 3 * i + 0] = _cairo_fixed_16_16_from_double (gradient->stops[i].offset); params[n_base_params + 3 * i + 1] = i << 16; params[n_base_params + 3 * i + 2] = 0; } glitz_set_pixels (src->surface, 0, 0, gradient->n_stops, 1, (glitz_pixel_format_t *)&format, buffer); glitz_buffer_destroy (buffer); if (pattern->type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *grad = (cairo_linear_pattern_t *) pattern; params[0] = grad->p1.x; params[1] = grad->p1.y; params[2] = grad->p2.x; params[3] = grad->p2.y; attr->filter = GLITZ_FILTER_LINEAR_GRADIENT; } else { cairo_radial_pattern_t *grad = (cairo_radial_pattern_t *) pattern; params[0] = grad->c1.x; params[1] = grad->c1.y; params[2] = grad->r1; params[3] = grad->c2.x; params[4] = grad->c2.y; params[5] = grad->r2; attr->filter = GLITZ_FILTER_RADIAL_GRADIENT; } switch (pattern->extend) { case CAIRO_EXTEND_NONE: attr->fill = GLITZ_FILL_TRANSPARENT; break; case CAIRO_EXTEND_REPEAT: attr->fill = GLITZ_FILL_REPEAT; break; case CAIRO_EXTEND_REFLECT: attr->fill = GLITZ_FILL_REFLECT; break; case CAIRO_EXTEND_PAD: attr->fill = GLITZ_FILL_NEAREST; break; } attr->params = params; attr->n_params = n_params; attr->base.matrix = pattern->matrix; attr->base.x_offset = 0; attr->base.y_offset = 0; } break; case CAIRO_PATTERN_TYPE_SOLID: case CAIRO_PATTERN_TYPE_SURFACE: default: break; } if (!src) { cairo_int_status_t status; status = _cairo_pattern_acquire_surface (pattern, &dst->base, x, y, width, height, (cairo_surface_t **) &src, &attr->base); if (status) return status; if (src) { switch (attr->base.extend) { case CAIRO_EXTEND_NONE: attr->fill = GLITZ_FILL_TRANSPARENT; break; case CAIRO_EXTEND_REPEAT: attr->fill = GLITZ_FILL_REPEAT; break; case CAIRO_EXTEND_REFLECT: attr->fill = GLITZ_FILL_REFLECT; break; case CAIRO_EXTEND_PAD: default: attr->fill = GLITZ_FILL_NEAREST; break; } switch (attr->base.filter) { case CAIRO_FILTER_FAST: case CAIRO_FILTER_NEAREST: attr->filter = GLITZ_FILTER_NEAREST; break; case CAIRO_FILTER_GOOD: case CAIRO_FILTER_BEST: case CAIRO_FILTER_BILINEAR: case CAIRO_FILTER_GAUSSIAN: default: attr->filter = GLITZ_FILTER_BILINEAR; break; } attr->params = NULL; attr->n_params = 0; attr->acquired = TRUE; } } *surface_out = src; return CAIRO_STATUS_SUCCESS; } static void _cairo_glitz_pattern_release_surface (cairo_pattern_t *pattern, cairo_glitz_surface_t *surface, cairo_glitz_surface_attributes_t *attr) { if (attr->acquired) _cairo_pattern_release_surface (pattern, &surface->base, &attr->base); else cairo_surface_destroy (&surface->base); } static cairo_int_status_t _cairo_glitz_pattern_acquire_surfaces (cairo_pattern_t *src, cairo_pattern_t *mask, cairo_glitz_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, unsigned int width, unsigned int height, cairo_glitz_surface_t **src_out, cairo_glitz_surface_t **mask_out, cairo_glitz_surface_attributes_t *sattr, cairo_glitz_surface_attributes_t *mattr) { cairo_int_status_t status; cairo_pattern_union_t tmp; /* If src and mask are both solid, then the mask alpha can be * combined into src and mask can be ignored. */ /* XXX: This optimization assumes that there is no color * information in mask, so this will need to change when we * support RENDER-style 4-channel masks. */ if (src->type == CAIRO_PATTERN_TYPE_SOLID && mask->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_color_t combined; cairo_solid_pattern_t *src_solid = (cairo_solid_pattern_t *) src; cairo_solid_pattern_t *mask_solid = (cairo_solid_pattern_t *) mask; combined = src_solid->color; _cairo_color_multiply_alpha (&combined, mask_solid->color.alpha); _cairo_pattern_init_solid (&tmp.solid, &combined, CAIRO_COLOR_IS_OPAQUE (&combined) ? CAIRO_CONTENT_COLOR : CAIRO_CONTENT_COLOR_ALPHA); mask = NULL; } else { status = _cairo_pattern_init_copy (&tmp.base, src); if (status) return status; } status = _cairo_glitz_pattern_acquire_surface (&tmp.base, dst, src_x, src_y, width, height, src_out, sattr); _cairo_pattern_fini (&tmp.base); if (status) return status; if (mask) { status = _cairo_pattern_init_copy (&tmp.base, mask); if (status) return status; status = _cairo_glitz_pattern_acquire_surface (&tmp.base, dst, mask_x, mask_y, width, height, mask_out, mattr); if (status) _cairo_glitz_pattern_release_surface (&tmp.base, *src_out, sattr); _cairo_pattern_fini (&tmp.base); return status; } else { *mask_out = NULL; } return CAIRO_STATUS_SUCCESS; } static void _cairo_glitz_surface_set_attributes (cairo_glitz_surface_t *surface, cairo_glitz_surface_attributes_t *a) { _cairo_glitz_surface_set_matrix (surface, &a->base.matrix); glitz_surface_set_fill (surface->surface, a->fill); glitz_surface_set_filter (surface->surface, a->filter, a->params, a->n_params); } static cairo_int_status_t _cairo_glitz_surface_composite (cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_glitz_surface_attributes_t src_attr, mask_attr; cairo_glitz_surface_t *dst = abstract_dst; cairo_glitz_surface_t *src; cairo_glitz_surface_t *mask; cairo_int_status_t status; if (op == CAIRO_OPERATOR_SATURATE) return CAIRO_INT_STATUS_UNSUPPORTED; if (_glitz_ensure_target (dst->surface)) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_glitz_pattern_acquire_surfaces (src_pattern, mask_pattern, dst, src_x, src_y, mask_x, mask_y, width, height, &src, &mask, &src_attr, &mask_attr); if (status) return status; _cairo_glitz_surface_set_attributes (src, &src_attr); if (mask) { _cairo_glitz_surface_set_attributes (mask, &mask_attr); glitz_composite (_glitz_operator (op), src->surface, mask->surface, dst->surface, src_x + src_attr.base.x_offset, src_y + src_attr.base.y_offset, mask_x + mask_attr.base.x_offset, mask_y + mask_attr.base.y_offset, dst_x, dst_y, width, height); if (mask_attr.n_params) free (mask_attr.params); _cairo_glitz_pattern_release_surface (mask_pattern, mask, &mask_attr); } else { glitz_composite (_glitz_operator (op), src->surface, NULL, dst->surface, src_x + src_attr.base.x_offset, src_y + src_attr.base.y_offset, 0, 0, dst_x, dst_y, width, height); } if (src_attr.n_params) free (src_attr.params); _cairo_glitz_pattern_release_surface (src_pattern, src, &src_attr); if (glitz_surface_get_status (dst->surface) == GLITZ_STATUS_NOT_SUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_glitz_surface_fill_rectangles (void *abstract_dst, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int n_rects) { cairo_glitz_surface_t *dst = abstract_dst; cairo_glitz_surface_t *src; switch (op) { case CAIRO_OPERATOR_SOURCE: { glitz_color_t glitz_color; glitz_color.red = color->red_short; glitz_color.green = color->green_short; glitz_color.blue = color->blue_short; glitz_color.alpha = color->alpha_short; glitz_set_rectangles (dst->surface, &glitz_color, (glitz_rectangle_t *) rects, n_rects); } break; case CAIRO_OPERATOR_CLEAR: { static const glitz_color_t glitz_color = { 0, 0, 0, 0 }; glitz_set_rectangles (dst->surface, &glitz_color, (glitz_rectangle_t *) rects, n_rects); } break; case CAIRO_OPERATOR_SATURATE: return CAIRO_INT_STATUS_UNSUPPORTED; case CAIRO_OPERATOR_OVER: case CAIRO_OPERATOR_IN: case CAIRO_OPERATOR_OUT: case CAIRO_OPERATOR_ATOP: case CAIRO_OPERATOR_DEST: case CAIRO_OPERATOR_DEST_OVER: case CAIRO_OPERATOR_DEST_IN: case CAIRO_OPERATOR_DEST_OUT: case CAIRO_OPERATOR_DEST_ATOP: case CAIRO_OPERATOR_XOR: case CAIRO_OPERATOR_ADD: default: if (_glitz_ensure_target (dst->surface)) return CAIRO_INT_STATUS_UNSUPPORTED; src = (cairo_glitz_surface_t *) _cairo_surface_create_similar_solid (&dst->base, CAIRO_CONTENT_COLOR_ALPHA, 1, 1, (cairo_color_t *) color, NULL); if (src->base.status) return src->base.status; glitz_surface_set_fill (src->surface, GLITZ_FILL_REPEAT); while (n_rects--) { glitz_composite (_glitz_operator (op), src->surface, NULL, dst->surface, 0, 0, 0, 0, rects->x, rects->y, rects->width, rects->height); rects++; } cairo_surface_destroy (&src->base); break; } if (glitz_surface_get_status (dst->surface) == GLITZ_STATUS_NOT_SUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_glitz_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int n_traps) { cairo_pattern_union_t tmp_src_pattern; cairo_pattern_t *src_pattern; cairo_glitz_surface_attributes_t attributes; cairo_glitz_surface_t *dst = abstract_dst; cairo_glitz_surface_t *src; cairo_glitz_surface_t *mask = NULL; glitz_buffer_t *buffer = NULL; void *data = NULL; cairo_int_status_t status; unsigned short alpha; if (antialias != CAIRO_ANTIALIAS_DEFAULT && antialias != CAIRO_ANTIALIAS_GRAY) return CAIRO_INT_STATUS_UNSUPPORTED; if (dst->base.status) return dst->base.status; if (op == CAIRO_OPERATOR_SATURATE) return CAIRO_INT_STATUS_UNSUPPORTED; if (_glitz_ensure_target (dst->surface)) return CAIRO_INT_STATUS_UNSUPPORTED; if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { status = _cairo_pattern_init_copy (&tmp_src_pattern.base, pattern); if (status) return status; status = _cairo_glitz_pattern_acquire_surface (&tmp_src_pattern.base, dst, src_x, src_y, width, height, &src, &attributes); src_pattern = &tmp_src_pattern.base; } else { status = _cairo_glitz_pattern_acquire_surface (pattern, dst, src_x, src_y, width, height, &src, &attributes); src_pattern = pattern; } alpha = 0xffff; if (status) return status; if (op == CAIRO_OPERATOR_ADD || n_traps <= 1) { static const glitz_color_t clear_black = { 0, 0, 0, 0 }; glitz_color_t color; glitz_geometry_format_t format; int n_trap_added; int offset = 0; int data_size = 0; int size = 30 * n_traps; /* just a guess */ format.vertex.primitive = GLITZ_PRIMITIVE_QUADS; format.vertex.type = GLITZ_DATA_TYPE_FLOAT; format.vertex.bytes_per_vertex = 3 * sizeof (glitz_float_t); format.vertex.attributes = GLITZ_VERTEX_ATTRIBUTE_MASK_COORD_MASK; format.vertex.mask.type = GLITZ_DATA_TYPE_FLOAT; format.vertex.mask.size = GLITZ_COORDINATE_SIZE_X; format.vertex.mask.offset = 2 * sizeof (glitz_float_t); mask = (cairo_glitz_surface_t *) _cairo_glitz_surface_create_similar (&dst->base, CAIRO_CONTENT_ALPHA, 2, 1); if (mask->base.status) { _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); if (src_pattern == &tmp_src_pattern.base) _cairo_pattern_fini (&tmp_src_pattern.base); return mask->base.status; } color.red = color.green = color.blue = color.alpha = 0xffff; glitz_set_rectangle (mask->surface, &clear_black, 0, 0, 1, 1); glitz_set_rectangle (mask->surface, &color, 1, 0, 1, 1); glitz_surface_set_fill (mask->surface, GLITZ_FILL_NEAREST); glitz_surface_set_filter (mask->surface, GLITZ_FILTER_BILINEAR, NULL, 0); size *= format.vertex.bytes_per_vertex; while (n_traps) { if (data_size < size) { void *p; data_size = size; p = realloc (data, data_size); if (!p) { _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); if (src_pattern == &tmp_src_pattern.base) _cairo_pattern_fini (&tmp_src_pattern.base); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } data = p; if (buffer) glitz_buffer_destroy (buffer); buffer = glitz_buffer_create_for_data (data); if (!buffer) { free (data); _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); if (src_pattern == &tmp_src_pattern.base) _cairo_pattern_fini (&tmp_src_pattern.base); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } offset += glitz_add_trapezoids (buffer, offset, size - offset, format.vertex.type, mask->surface, (glitz_trapezoid_t *) traps, n_traps, &n_trap_added); n_traps -= n_trap_added; traps += n_trap_added; size *= 2; } glitz_set_geometry (dst->surface, GLITZ_GEOMETRY_TYPE_VERTEX, &format, buffer); glitz_set_array (dst->surface, 0, 3, offset / format.vertex.bytes_per_vertex, 0, 0); } else { cairo_image_surface_t *image; unsigned char *ptr; int stride; stride = (width + 3) & -4; data = calloc (stride, height); if (!data) { _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); if (src_pattern == &tmp_src_pattern.base) _cairo_pattern_fini (&tmp_src_pattern.base); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* using negative stride */ ptr = (unsigned char *) data + stride * (height - 1); image = (cairo_image_surface_t *) cairo_image_surface_create_for_data (ptr, CAIRO_FORMAT_A8, width, height, -stride); if (image->base.status) { cairo_surface_destroy (&src->base); free (data); return image->base.status; } pixman_add_trapezoids (image->pixman_image, -dst_x, -dst_y, n_traps, (pixman_trapezoid_t *) traps); mask = (cairo_glitz_surface_t *) _cairo_surface_create_similar_scratch (&dst->base, CAIRO_CONTENT_ALPHA, width, height); if (mask->base.status) { _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); free (data); cairo_surface_destroy (&image->base); return mask->base.status; } status = _cairo_glitz_surface_set_image (mask, image, 0, 0, width, height, 0, 0); cairo_surface_destroy(&image->base); if (status) return status; } _cairo_glitz_surface_set_attributes (src, &attributes); glitz_composite (_glitz_operator (op), src->surface, mask->surface, dst->surface, src_x + attributes.base.x_offset, src_y + attributes.base.y_offset, 0, 0, dst_x, dst_y, width, height); if (attributes.n_params) free (attributes.params); glitz_set_geometry (dst->surface, GLITZ_GEOMETRY_TYPE_NONE, NULL, NULL); if (buffer) glitz_buffer_destroy (buffer); free (data); _cairo_glitz_pattern_release_surface (src_pattern, src, &attributes); if (src_pattern == &tmp_src_pattern.base) _cairo_pattern_fini (&tmp_src_pattern.base); if (mask) cairo_surface_destroy (&mask->base); if (glitz_surface_get_status (dst->surface) == GLITZ_STATUS_NOT_SUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_glitz_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_glitz_surface_t *surface = abstract_surface; if (region) { glitz_box_t *box; int n; cairo_status_t status; if (!surface->has_clip) { _cairo_region_init (&surface->clip); surface->has_clip = TRUE; } status = _cairo_region_copy (&surface->clip, region); if (status) { _cairo_region_fini (&surface->clip); surface->has_clip = FALSE; return status; } status = _cairo_glitz_get_boxes_from_region (&surface->clip, &box, &n); if (status) { _cairo_region_fini (&surface->clip); surface->has_clip = FALSE; return status; } glitz_surface_set_clip_region (surface->surface, 0, 0, box, n); free (box); } else { glitz_surface_set_clip_region (surface->surface, 0, 0, NULL, 0); if (surface->has_clip) { _cairo_region_fini (&surface->clip); surface->has_clip = FALSE; } } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_glitz_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_glitz_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; rectangle->width = glitz_surface_get_width (surface->surface); rectangle->height = glitz_surface_get_height (surface->surface); return CAIRO_STATUS_SUCCESS; } #define CAIRO_GLITZ_AREA_AVAILABLE 0 #define CAIRO_GLITZ_AREA_DIVIDED 1 #define CAIRO_GLITZ_AREA_OCCUPIED 2 typedef struct _cairo_glitz_root_area cairo_glitz_root_area_t; typedef struct _cairo_glitz_area { int state; int level; int x, y; int width, height; struct _cairo_glitz_area *area[4]; cairo_glitz_root_area_t *root; void *closure; } cairo_glitz_area_t; static cairo_glitz_area_t _empty_area = { 0, 0, 0, 0, 0, 0, { NULL, NULL, NULL, NULL }, NULL, NULL }; typedef struct _cairo_glitz_area_funcs { cairo_status_t (*move_in) (cairo_glitz_area_t *area, void *closure); void (*move_out) (cairo_glitz_area_t *area, void *closure); int (*compare_score) (cairo_glitz_area_t *area, void *closure1, void *closure2); } cairo_glitz_area_funcs_t; struct _cairo_glitz_root_area { int max_level; int width, height; cairo_glitz_area_t *area; const cairo_glitz_area_funcs_t *funcs; }; static cairo_status_t _cairo_glitz_area_move_in (cairo_glitz_area_t *area, void *closure) { area->closure = closure; area->state = CAIRO_GLITZ_AREA_OCCUPIED; return (*area->root->funcs->move_in) (area, area->closure); } static void _cairo_glitz_area_move_out (cairo_glitz_area_t *area) { if (area->root) { (*area->root->funcs->move_out) (area, area->closure); area->closure = NULL; area->state = CAIRO_GLITZ_AREA_AVAILABLE; } } static cairo_glitz_area_t * _cairo_glitz_area_create (cairo_glitz_root_area_t *root, int level, int x, int y, int width, int height) { cairo_glitz_area_t *area; int n = 4; area = malloc (sizeof (cairo_glitz_area_t)); if (!area) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } area->level = level; area->x = x; area->y = y; area->width = width; area->height = height; area->root = root; area->closure = NULL; area->state = CAIRO_GLITZ_AREA_AVAILABLE; while (n--) area->area[n] = NULL; return area; } static void _cairo_glitz_area_destroy (cairo_glitz_area_t *area) { if (area == NULL) return; if (area->state == CAIRO_GLITZ_AREA_OCCUPIED) { _cairo_glitz_area_move_out (area); } else { int n = 4; while (n--) _cairo_glitz_area_destroy (area->area[n]); } free (area); } static cairo_glitz_area_t * _cairo_glitz_area_get_top_scored_sub_area (cairo_glitz_area_t *area) { if (!area) return NULL; switch (area->state) { case CAIRO_GLITZ_AREA_OCCUPIED: return area; case CAIRO_GLITZ_AREA_AVAILABLE: break; case CAIRO_GLITZ_AREA_DIVIDED: { cairo_glitz_area_t *tmp, *top = NULL; int i; for (i = 0; i < 4; i++) { tmp = _cairo_glitz_area_get_top_scored_sub_area (area->area[i]); if (tmp && top) { if ((*area->root->funcs->compare_score) (tmp, tmp->closure, top->closure) > 0) top = tmp; } else if (tmp) { top = tmp; } } return top; } } return NULL; } static cairo_int_status_t _cairo_glitz_area_find (cairo_glitz_area_t *area, int width, int height, cairo_bool_t kick_out, void *closure) { cairo_status_t status; if (area->width < width || area->height < height) return CAIRO_INT_STATUS_UNSUPPORTED; switch (area->state) { case CAIRO_GLITZ_AREA_OCCUPIED: if (kick_out) { if ((*area->root->funcs->compare_score) (area, area->closure, closure) >= 0) return CAIRO_INT_STATUS_UNSUPPORTED; _cairo_glitz_area_move_out (area); } else { return CAIRO_INT_STATUS_UNSUPPORTED; } /* fall-through */ case CAIRO_GLITZ_AREA_AVAILABLE: { if (area->level == area->root->max_level || (area->width == width && area->height == height)) { return _cairo_glitz_area_move_in (area, closure); } else { int dx[4], dy[4], w[4], h[4], i; dx[0] = dx[2] = dy[0] = dy[1] = 0; w[0] = w[2] = dx[1] = dx[3] = width; h[0] = h[1] = dy[2] = dy[3] = height; w[1] = w[3] = area->width - width; h[2] = h[3] = area->height - height; for (i = 0; i < 2; i++) { if (w[i]) area->area[i] = _cairo_glitz_area_create (area->root, area->level + 1, area->x + dx[i], area->y + dy[i], w[i], h[i]); } for (; i < 4; i++) { if (w[i] && h[i]) area->area[i] = _cairo_glitz_area_create (area->root, area->level + 1, area->x + dx[i], area->y + dy[i], w[i], h[i]); } area->state = CAIRO_GLITZ_AREA_DIVIDED; status = _cairo_glitz_area_find (area->area[0], width, height, kick_out, closure); if (status == CAIRO_STATUS_SUCCESS) return CAIRO_STATUS_SUCCESS; } } break; case CAIRO_GLITZ_AREA_DIVIDED: { cairo_glitz_area_t *to_area; int i, rejected = FALSE; for (i = 0; i < 4; i++) { if (area->area[i]) { if (area->area[i]->width >= width && area->area[i]->height >= height) { status = _cairo_glitz_area_find (area->area[i], width, height, kick_out, closure); if (status == CAIRO_STATUS_SUCCESS) return CAIRO_STATUS_SUCCESS; rejected = TRUE; } } } if (rejected) return CAIRO_INT_STATUS_UNSUPPORTED; to_area = _cairo_glitz_area_get_top_scored_sub_area (area); if (to_area) { if (kick_out) { if ((*area->root->funcs->compare_score) (to_area, to_area->closure, closure) >= 0) return CAIRO_INT_STATUS_UNSUPPORTED; } else { return CAIRO_INT_STATUS_UNSUPPORTED; } } for (i = 0; i < 4; i++) { _cairo_glitz_area_destroy (area->area[i]); area->area[i] = NULL; } area->closure = NULL; area->state = CAIRO_GLITZ_AREA_AVAILABLE; status = _cairo_glitz_area_find (area, width, height, TRUE, closure); if (status == CAIRO_STATUS_SUCCESS) return CAIRO_STATUS_SUCCESS; } break; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_status_t _cairo_glitz_root_area_init (cairo_glitz_root_area_t *root, int max_level, int width, int height, const cairo_glitz_area_funcs_t *funcs) { root->max_level = max_level; root->funcs = funcs; root->area = _cairo_glitz_area_create (root, 0, 0, 0, width, height); if (!root->area) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } static void _cairo_glitz_root_area_fini (cairo_glitz_root_area_t *root) { _cairo_glitz_area_destroy (root->area); } typedef struct _cairo_glitz_surface_font_private { cairo_glitz_root_area_t root; glitz_surface_t *surface; } cairo_glitz_surface_font_private_t; typedef struct _cairo_glitz_surface_glyph_private { cairo_glitz_area_t *area; cairo_bool_t locked; cairo_point_double_t p1, p2; } cairo_glitz_surface_glyph_private_t; static cairo_status_t _cairo_glitz_glyph_move_in (cairo_glitz_area_t *area, void *closure) { cairo_glitz_surface_glyph_private_t *glyph_private = closure; glyph_private->area = area; return CAIRO_STATUS_SUCCESS; } static void _cairo_glitz_glyph_move_out (cairo_glitz_area_t *area, void *closure) { cairo_glitz_surface_glyph_private_t *glyph_private = closure; glyph_private->area = NULL; } static int _cairo_glitz_glyph_compare (cairo_glitz_area_t *area, void *closure1, void *closure2) { cairo_glitz_surface_glyph_private_t *glyph_private = closure1; if (glyph_private->locked) return 1; return -1; } static const cairo_glitz_area_funcs_t _cairo_glitz_area_funcs = { _cairo_glitz_glyph_move_in, _cairo_glitz_glyph_move_out, _cairo_glitz_glyph_compare }; #define GLYPH_CACHE_TEXTURE_SIZE 512 #define GLYPH_CACHE_MAX_LEVEL 64 #define GLYPH_CACHE_MAX_HEIGHT 96 #define GLYPH_CACHE_MAX_WIDTH 96 #define WRITE_VEC2(ptr, _x, _y) \ *(ptr)++ = (_x); \ *(ptr)++ = (_y) #define WRITE_BOX(ptr, _vx1, _vy1, _vx2, _vy2, p1, p2) \ WRITE_VEC2 (ptr, _vx1, _vy1); \ WRITE_VEC2 (ptr, (p1)->x, (p2)->y); \ WRITE_VEC2 (ptr, _vx2, _vy1); \ WRITE_VEC2 (ptr, (p2)->x, (p2)->y); \ WRITE_VEC2 (ptr, _vx2, _vy2); \ WRITE_VEC2 (ptr, (p2)->x, (p1)->y); \ WRITE_VEC2 (ptr, _vx1, _vy2); \ WRITE_VEC2 (ptr, (p1)->x, (p1)->y) static cairo_status_t _cairo_glitz_surface_font_init (cairo_glitz_surface_t *surface, cairo_scaled_font_t *scaled_font, cairo_format_t format) { cairo_glitz_surface_font_private_t *font_private; glitz_drawable_t *drawable; glitz_format_t *surface_format = NULL; cairo_int_status_t status; drawable = glitz_surface_get_drawable (surface->surface); switch (format) { case CAIRO_FORMAT_A1: case CAIRO_FORMAT_A8: surface_format = glitz_find_standard_format (drawable, GLITZ_STANDARD_A8); break; case CAIRO_FORMAT_RGB24: ASSERT_NOT_REACHED; break; case CAIRO_FORMAT_ARGB32: surface_format = glitz_find_standard_format (drawable, GLITZ_STANDARD_ARGB32); default: break; } if (!surface_format) return CAIRO_INT_STATUS_UNSUPPORTED; font_private = malloc (sizeof (cairo_glitz_surface_font_private_t)); if (!font_private) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font_private->surface = glitz_surface_create (drawable, surface_format, GLYPH_CACHE_TEXTURE_SIZE, GLYPH_CACHE_TEXTURE_SIZE, 0, NULL); if (font_private->surface == NULL) { free (font_private); return CAIRO_INT_STATUS_UNSUPPORTED; } if (format == CAIRO_FORMAT_ARGB32) glitz_surface_set_component_alpha (font_private->surface, 1); status = _cairo_glitz_root_area_init (&font_private->root, GLYPH_CACHE_MAX_LEVEL, GLYPH_CACHE_TEXTURE_SIZE, GLYPH_CACHE_TEXTURE_SIZE, &_cairo_glitz_area_funcs); if (status != CAIRO_STATUS_SUCCESS) { glitz_surface_destroy (font_private->surface); free (font_private); return status; } scaled_font->surface_private = font_private; scaled_font->surface_backend = _cairo_glitz_surface_get_backend (); return CAIRO_STATUS_SUCCESS; } static void _cairo_glitz_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font) { cairo_glitz_surface_font_private_t *font_private; font_private = scaled_font->surface_private; if (font_private) { _cairo_glitz_root_area_fini (&font_private->root); glitz_surface_destroy (font_private->surface); free (font_private); } } static void _cairo_glitz_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font) { cairo_glitz_surface_glyph_private_t *glyph_private; glyph_private = scaled_glyph->surface_private; if (glyph_private) { if (glyph_private->area) _cairo_glitz_area_move_out (glyph_private->area); free (glyph_private); } } #define FIXED_TO_FLOAT(f) (((glitz_float_t) (f)) / 65536) static cairo_status_t _cairo_glitz_surface_add_glyph (cairo_glitz_surface_t *surface, cairo_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph) { cairo_image_surface_t *glyph_surface = scaled_glyph->surface; cairo_glitz_surface_font_private_t *font_private; cairo_glitz_surface_glyph_private_t *glyph_private; glitz_point_fixed_t p1, p2; glitz_pixel_format_t pf; glitz_buffer_t *buffer; unsigned int bpp, am, rm, gm, bm; cairo_int_status_t status; glyph_private = scaled_glyph->surface_private; if (glyph_private == NULL) { glyph_private = malloc (sizeof (cairo_glitz_surface_glyph_private_t)); if (!glyph_private) return _cairo_error (CAIRO_STATUS_NO_MEMORY); glyph_private->area = NULL; glyph_private->locked = FALSE; scaled_glyph->surface_private = (void *) glyph_private; } if (glyph_surface->width > GLYPH_CACHE_MAX_WIDTH || glyph_surface->height > GLYPH_CACHE_MAX_HEIGHT) return CAIRO_STATUS_SUCCESS; if (scaled_font->surface_private == NULL) { status = _cairo_glitz_surface_font_init (surface, scaled_font, glyph_surface->format); if (status) return status; } font_private = scaled_font->surface_private; if (glyph_surface->width == 0 || glyph_surface->height == 0) { glyph_private->area = &_empty_area; return CAIRO_STATUS_SUCCESS; } if (_cairo_glitz_area_find (font_private->root.area, glyph_surface->width, glyph_surface->height, FALSE, glyph_private)) { if (_cairo_glitz_area_find (font_private->root.area, glyph_surface->width, glyph_surface->height, TRUE, glyph_private)) return CAIRO_STATUS_SUCCESS; } buffer = glitz_buffer_create_for_data (glyph_surface->data); if (!buffer) { _cairo_glitz_area_move_out (glyph_private->area); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } cairo_format_get_masks (glyph_surface->format, &bpp, &am, &rm, &gm, &bm); pf.fourcc = GLITZ_FOURCC_RGB; pf.masks.bpp = bpp; pf.masks.alpha_mask = am; pf.masks.red_mask = rm; pf.masks.green_mask = gm; pf.masks.blue_mask = bm; pf.bytes_per_line = glyph_surface->stride; pf.scanline_order = GLITZ_PIXEL_SCANLINE_ORDER_BOTTOM_UP; pf.xoffset = 0; pf.skip_lines = 0; glitz_set_pixels (font_private->surface, glyph_private->area->x, glyph_private->area->y, glyph_surface->width, glyph_surface->height, &pf, buffer); glitz_buffer_destroy (buffer); p1.x = glyph_private->area->x << 16; p1.y = glyph_private->area->y << 16; p2.x = (glyph_private->area->x + glyph_surface->width) << 16; p2.y = (glyph_private->area->y + glyph_surface->height) << 16; glitz_surface_translate_point (font_private->surface, &p1, &p1); glitz_surface_translate_point (font_private->surface, &p2, &p2); glyph_private->p1.x = FIXED_TO_FLOAT (p1.x); glyph_private->p1.y = FIXED_TO_FLOAT (p1.y); glyph_private->p2.x = FIXED_TO_FLOAT (p2.x); glyph_private->p2.y = FIXED_TO_FLOAT (p2.y); return CAIRO_STATUS_SUCCESS; } #define N_STACK_BUF 256 static cairo_int_status_t _cairo_glitz_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_surface, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs) { cairo_glitz_surface_attributes_t attributes; cairo_glitz_surface_glyph_private_t *glyph_private; cairo_glitz_surface_t *dst = abstract_surface; cairo_glitz_surface_t *src; cairo_scaled_glyph_t *stack_scaled_glyphs[N_STACK_BUF]; cairo_scaled_glyph_t **scaled_glyphs; glitz_float_t stack_vertices[N_STACK_BUF * 16]; glitz_float_t *vertices; glitz_buffer_t *buffer; cairo_int_status_t status; int x_offset, y_offset; int i, cached_glyphs = 0; int remaining_glyps = num_glyphs; glitz_float_t x1, y1, x2, y2; static const glitz_vertex_format_t format = { GLITZ_PRIMITIVE_QUADS, GLITZ_DATA_TYPE_FLOAT, sizeof (glitz_float_t) * 4, GLITZ_VERTEX_ATTRIBUTE_MASK_COORD_MASK, { 0 }, { GLITZ_DATA_TYPE_FLOAT, GLITZ_COORDINATE_SIZE_XY, sizeof (glitz_float_t) * 2, } }; if (scaled_font->surface_backend != NULL && scaled_font->surface_backend != _cairo_glitz_surface_get_backend ()) return CAIRO_INT_STATUS_UNSUPPORTED; if (op == CAIRO_OPERATOR_SATURATE) return CAIRO_INT_STATUS_UNSUPPORTED; if (_glitz_ensure_target (dst->surface)) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_glitz_pattern_acquire_surface (pattern, dst, src_x, src_y, width, height, &src, &attributes); if (status) return status; _cairo_glitz_surface_set_attributes (src, &attributes); if (num_glyphs > N_STACK_BUF) { char *data; size_t size1, size2; if ((size_t)num_glyphs >= INT32_MAX / sizeof(void*) || (size_t)num_glyphs >= INT32_MAX / sizeof(glitz_float_t) || ((size_t)num_glyphs * sizeof(glitz_float_t)) >= INT32_MAX / 16) goto FAIL1; size1 = num_glyphs * sizeof(void *); size2 = num_glyphs * sizeof(glitz_float_t) * 16; if (size1 >= INT32_MAX - size2) goto FAIL1; data = malloc (size1 + size2); if (!data) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); goto FAIL1; } scaled_glyphs = (cairo_scaled_glyph_t **) data; vertices = (glitz_float_t *) (data + num_glyphs * sizeof (void *)); } else { scaled_glyphs = stack_scaled_glyphs; vertices = stack_vertices; } buffer = glitz_buffer_create_for_data (vertices); if (!buffer) goto FAIL2; _cairo_scaled_font_freeze_cache (scaled_font); for (i = 0; i < num_glyphs; i++) { status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyphs[i]); if (status != CAIRO_STATUS_SUCCESS) { num_glyphs = i; goto UNLOCK; } glyph_private = scaled_glyphs[i]->surface_private; if (!glyph_private || !glyph_private->area) { status = _cairo_glitz_surface_add_glyph (dst, scaled_font, scaled_glyphs[i]); if (status != CAIRO_STATUS_SUCCESS) { num_glyphs = i; goto UNLOCK; } } glyph_private = scaled_glyphs[i]->surface_private; if (glyph_private && glyph_private->area) { remaining_glyps--; if (glyph_private->area->width) { x_offset = scaled_glyphs[i]->surface->base.device_transform.x0; y_offset = scaled_glyphs[i]->surface->base.device_transform.y0; x1 = _cairo_lround (glyphs[i].x - x_offset); y1 = _cairo_lround (glyphs[i].y - y_offset); x2 = x1 + glyph_private->area->width; y2 = y1 + glyph_private->area->height; WRITE_BOX (vertices, x1, y1, x2, y2, &glyph_private->p1, &glyph_private->p2); glyph_private->locked = TRUE; cached_glyphs++; } } } if (remaining_glyps) { cairo_surface_t *image; cairo_glitz_surface_t *clone; for (i = 0; i < num_glyphs; i++) { glyph_private = scaled_glyphs[i]->surface_private; if (!glyph_private || !glyph_private->area) { int glyph_width, glyph_height; image = &scaled_glyphs[i]->surface->base; glyph_width = scaled_glyphs[i]->surface->width; glyph_height = scaled_glyphs[i]->surface->height; status = _cairo_glitz_surface_clone_similar (abstract_surface, image, 0, 0, glyph_width, glyph_height, (cairo_surface_t **) &clone); if (status) goto UNLOCK; x_offset = scaled_glyphs[i]->surface->base.device_transform.x0; y_offset = scaled_glyphs[i]->surface->base.device_transform.y0; x1 = _cairo_lround (glyphs[i].x - x_offset); y1 = _cairo_lround (glyphs[i].y - y_offset); glitz_composite (_glitz_operator (op), src->surface, clone->surface, dst->surface, src_x + attributes.base.x_offset + x1, src_y + attributes.base.y_offset + y1, 0, 0, x1, y1, glyph_width, glyph_height); cairo_surface_destroy (&clone->base); if (glitz_surface_get_status (dst->surface) == GLITZ_STATUS_NOT_SUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto UNLOCK; } } } } if (cached_glyphs) { cairo_glitz_surface_font_private_t *font_private; glitz_set_geometry (dst->surface, GLITZ_GEOMETRY_TYPE_VERTEX, (glitz_geometry_format_t *) &format, buffer); glitz_set_array (dst->surface, 0, 4, cached_glyphs * 4, 0, 0); font_private = scaled_font->surface_private; glitz_composite (_glitz_operator (op), src->surface, font_private->surface, dst->surface, src_x + attributes.base.x_offset, src_y + attributes.base.y_offset, 0, 0, dst_x, dst_y, width, height); glitz_set_geometry (dst->surface, GLITZ_GEOMETRY_TYPE_NONE, NULL, NULL); } UNLOCK: if (cached_glyphs) { for (i = 0; i < num_glyphs; i++) { glyph_private = scaled_glyphs[i]->surface_private; if (glyph_private) glyph_private->locked = FALSE; } } _cairo_scaled_font_thaw_cache (scaled_font); glitz_buffer_destroy (buffer); FAIL2: if (num_glyphs > N_STACK_BUF) free (scaled_glyphs); FAIL1: if (attributes.n_params) free (attributes.params); _cairo_glitz_pattern_release_surface (pattern, src, &attributes); if (status) return status; if (glitz_surface_get_status (dst->surface) == GLITZ_STATUS_NOT_SUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_glitz_surface_flush (void *abstract_surface) { cairo_glitz_surface_t *surface = abstract_surface; glitz_surface_flush (surface->surface); return CAIRO_STATUS_SUCCESS; } static cairo_bool_t _cairo_glitz_surface_is_similar (void *surface_a, void *surface_b, cairo_content_t content) { cairo_glitz_surface_t *a = (cairo_glitz_surface_t *) surface_a; cairo_glitz_surface_t *b = (cairo_glitz_surface_t *) surface_b; glitz_drawable_t *drawable_a = glitz_surface_get_drawable (a->surface); glitz_drawable_t *drawable_b = glitz_surface_get_drawable (b->surface); return drawable_a == drawable_b; } static cairo_status_t _cairo_glitz_surface_reset (void *abstract_surface) { cairo_glitz_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_glitz_surface_set_clip_region (surface, NULL); if (status) return status; return CAIRO_STATUS_SUCCESS; } static const cairo_surface_backend_t cairo_glitz_surface_backend = { CAIRO_SURFACE_TYPE_GLITZ, _cairo_glitz_surface_create_similar, _cairo_glitz_surface_finish, _cairo_glitz_surface_acquire_source_image, _cairo_glitz_surface_release_source_image, _cairo_glitz_surface_acquire_dest_image, _cairo_glitz_surface_release_dest_image, _cairo_glitz_surface_clone_similar, _cairo_glitz_surface_composite, _cairo_glitz_surface_fill_rectangles, _cairo_glitz_surface_composite_trapezoids, NULL, /* copy_page */ NULL, /* show_page */ _cairo_glitz_surface_set_clip_region, NULL, /* intersect_clip_path */ _cairo_glitz_surface_get_extents, _cairo_glitz_surface_old_show_glyphs, NULL, /* get_font_options */ _cairo_glitz_surface_flush, NULL, /* mark_dirty_rectangle */ _cairo_glitz_surface_scaled_font_fini, _cairo_glitz_surface_scaled_glyph_fini, NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ NULL, /* show_glyphs */ NULL, /* snapshot */ _cairo_glitz_surface_is_similar, _cairo_glitz_surface_reset }; static const cairo_surface_backend_t * _cairo_glitz_surface_get_backend (void) { return &cairo_glitz_surface_backend; } static cairo_content_t _glitz_format_to_content (glitz_format_t * format) { assert (format->color.fourcc == GLITZ_FOURCC_RGB); if (format->color.alpha_size != 0) { if (format->color.red_size != 0 && format->color.green_size != 0 && format->color.blue_size != 0) return CAIRO_CONTENT_COLOR_ALPHA; else return CAIRO_CONTENT_ALPHA; } return CAIRO_CONTENT_COLOR; } cairo_surface_t * cairo_glitz_surface_create (glitz_surface_t *surface) { cairo_glitz_surface_t *crsurface; glitz_format_t *format; if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NULL_POINTER)); crsurface = malloc (sizeof (cairo_glitz_surface_t)); if (crsurface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); format = glitz_surface_get_format (surface); _cairo_surface_init (&crsurface->base, &cairo_glitz_surface_backend, _glitz_format_to_content(format)); glitz_surface_reference (surface); crsurface->surface = surface; crsurface->format = format; crsurface->has_clip = FALSE; return (cairo_surface_t *) crsurface; } slim_hidden_def (cairo_glitz_surface_create); libgdiplus-2.11/cairo/src/cairo-win32-font.c0000664000175000017500000017404712225470167015572 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): */ #define WIN32_LEAN_AND_MEAN /* We require Windows 2000 features such as GetGlyphIndices */ #if !defined(WINVER) || (WINVER < 0x0500) # define WINVER 0x0500 #endif #if !defined(_WIN32_WINNT) || (_WIN32_WINNT < 0x0500) # define _WIN32_WINNT 0x0500 #endif #include "cairoint.h" #include "cairo-win32-private.h" #ifndef SPI_GETFONTSMOOTHINGTYPE #define SPI_GETFONTSMOOTHINGTYPE 0x200a #endif #ifndef FE_FONTSMOOTHINGCLEARTYPE #define FE_FONTSMOOTHINGCLEARTYPE 2 #endif #ifndef CLEARTYPE_QUALITY #define CLEARTYPE_QUALITY 5 #endif #ifndef TT_PRIM_CSPLINE #define TT_PRIM_CSPLINE 3 #endif #define CMAP_TAG 0x70616d63 const cairo_scaled_font_backend_t cairo_win32_scaled_font_backend; typedef struct { cairo_scaled_font_t base; LOGFONTW logfont; BYTE quality; /* We do drawing and metrics computation in a "logical space" which * is similar to font space, except that it is scaled by a factor * of the (desired font size) * (WIN32_FONT_LOGICAL_SCALE). The multiplication * by WIN32_FONT_LOGICAL_SCALE allows for sub-pixel precision. */ double logical_scale; /* The size we should actually request the font at from Windows; differs * from the logical_scale because it is quantized for orthogonal * transformations */ double logical_size; /* Transformations from device <=> logical space */ cairo_matrix_t logical_to_device; cairo_matrix_t device_to_logical; /* We special case combinations of 90-degree-rotations, scales and * flips ... that is transformations that take the axes to the * axes. If preserve_axes is true, then swap_axes/swap_x/swap_y * encode the 8 possibilities for orientation (4 rotation angles with * and without a flip), and scale_x, scale_y the scale components. */ cairo_bool_t preserve_axes; cairo_bool_t swap_axes; cairo_bool_t swap_x; cairo_bool_t swap_y; double x_scale; double y_scale; /* The size of the design unit of the font */ int em_square; HFONT scaled_hfont; HFONT unscaled_hfont; cairo_bool_t is_bitmap; cairo_bool_t is_type1; cairo_bool_t delete_scaled_hfont; } cairo_win32_scaled_font_t; static cairo_status_t _cairo_win32_scaled_font_set_metrics (cairo_win32_scaled_font_t *scaled_font); static cairo_status_t _cairo_win32_scaled_font_init_glyph_metrics (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph); static cairo_status_t _cairo_win32_scaled_font_init_glyph_surface (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph); static cairo_status_t _cairo_win32_scaled_font_init_glyph_path (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph); #define NEARLY_ZERO(d) (fabs(d) < (1. / 65536.)) static cairo_status_t _compute_transform (cairo_win32_scaled_font_t *scaled_font, cairo_matrix_t *sc) { cairo_status_t status; if (NEARLY_ZERO (sc->yx) && NEARLY_ZERO (sc->xy)) { scaled_font->preserve_axes = TRUE; scaled_font->x_scale = sc->xx; scaled_font->swap_x = (sc->xx < 0); scaled_font->y_scale = sc->yy; scaled_font->swap_y = (sc->yy < 0); scaled_font->swap_axes = FALSE; } else if (NEARLY_ZERO (sc->xx) && NEARLY_ZERO (sc->yy)) { scaled_font->preserve_axes = TRUE; scaled_font->x_scale = sc->yx; scaled_font->swap_x = (sc->yx < 0); scaled_font->y_scale = sc->xy; scaled_font->swap_y = (sc->xy < 0); scaled_font->swap_axes = TRUE; } else { scaled_font->preserve_axes = FALSE; scaled_font->swap_x = scaled_font->swap_y = scaled_font->swap_axes = FALSE; } if (scaled_font->preserve_axes) { if (scaled_font->swap_x) scaled_font->x_scale = - scaled_font->x_scale; if (scaled_font->swap_y) scaled_font->y_scale = - scaled_font->y_scale; scaled_font->logical_scale = WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale; scaled_font->logical_size = WIN32_FONT_LOGICAL_SCALE * _cairo_lround (scaled_font->y_scale); } /* The font matrix has x and y "scale" components which we extract and * use as character scale values. */ cairo_matrix_init (&scaled_font->logical_to_device, sc->xx, sc->yx, sc->xy, sc->yy, 0, 0); if (!scaled_font->preserve_axes) { status = _cairo_matrix_compute_scale_factors (&scaled_font->logical_to_device, &scaled_font->x_scale, &scaled_font->y_scale, TRUE); /* XXX: Handle vertical text */ if (status) return status; scaled_font->logical_size = _cairo_lround (WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale); scaled_font->logical_scale = WIN32_FONT_LOGICAL_SCALE * scaled_font->y_scale; } cairo_matrix_scale (&scaled_font->logical_to_device, 1.0 / scaled_font->logical_scale, 1.0 / scaled_font->logical_scale); scaled_font->device_to_logical = scaled_font->logical_to_device; status = cairo_matrix_invert (&scaled_font->device_to_logical); if (status) cairo_matrix_init_identity (&scaled_font->device_to_logical); return CAIRO_STATUS_SUCCESS; } static cairo_bool_t _have_cleartype_quality (void) { OSVERSIONINFO version_info; version_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (!GetVersionEx (&version_info)) { _cairo_win32_print_gdi_error ("_have_cleartype_quality"); return FALSE; } return (version_info.dwMajorVersion > 5 || (version_info.dwMajorVersion == 5 && version_info.dwMinorVersion >= 1)); /* XP or newer */ } static BYTE _get_system_quality (void) { BOOL font_smoothing; UINT smoothing_type; if (!SystemParametersInfo (SPI_GETFONTSMOOTHING, 0, &font_smoothing, 0)) { _cairo_win32_print_gdi_error ("_get_system_quality"); return DEFAULT_QUALITY; } if (font_smoothing) { if (_have_cleartype_quality ()) { if (!SystemParametersInfo (SPI_GETFONTSMOOTHINGTYPE, 0, &smoothing_type, 0)) { _cairo_win32_print_gdi_error ("_get_system_quality"); return DEFAULT_QUALITY; } if (smoothing_type == FE_FONTSMOOTHINGCLEARTYPE) return CLEARTYPE_QUALITY; } return ANTIALIASED_QUALITY; } else { return DEFAULT_QUALITY; } } /* If face_hfont is non-%NULL then font_matrix must be a simple scale by some * factor S, ctm must be the identity, logfont->lfHeight must be -S, * logfont->lfWidth, logfont->lfEscapement, logfont->lfOrientation must * all be 0, and face_hfont is the result of calling CreateFontIndirectW on * logfont. */ static cairo_status_t _win32_scaled_font_create (LOGFONTW *logfont, HFONT face_hfont, cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **font_out) { cairo_win32_scaled_font_t *f; cairo_matrix_t scale; cairo_status_t status; f = malloc (sizeof(cairo_win32_scaled_font_t)); if (f == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); f->logfont = *logfont; /* We don't have any control over the hinting style or subpixel * order in the Win32 font API, so we ignore those parts of * cairo_font_options_t. We use the 'antialias' field to set * the 'quality'. * * XXX: The other option we could pay attention to, but don't * here is the hint_metrics options. */ if (options->antialias == CAIRO_ANTIALIAS_DEFAULT) f->quality = _get_system_quality (); else { switch (options->antialias) { case CAIRO_ANTIALIAS_NONE: f->quality = NONANTIALIASED_QUALITY; break; case CAIRO_ANTIALIAS_GRAY: f->quality = ANTIALIASED_QUALITY; break; case CAIRO_ANTIALIAS_SUBPIXEL: if (_have_cleartype_quality ()) f->quality = CLEARTYPE_QUALITY; else f->quality = ANTIALIASED_QUALITY; break; case CAIRO_ANTIALIAS_DEFAULT: ASSERT_NOT_REACHED; } } f->em_square = 0; f->scaled_hfont = NULL; f->unscaled_hfont = NULL; if (f->quality == logfont->lfQuality || (logfont->lfQuality == DEFAULT_QUALITY && options->antialias == CAIRO_ANTIALIAS_DEFAULT)) { /* If face_hfont is non-NULL, then we can use it to avoid creating our * own --- because the constraints on face_hfont mentioned above * guarantee it was created in exactly the same way that * _win32_scaled_font_get_scaled_hfont would create it. */ f->scaled_hfont = face_hfont; } /* don't delete the hfont if we're using the one passed in to us */ f->delete_scaled_hfont = !f->scaled_hfont; cairo_matrix_multiply (&scale, font_matrix, ctm); status = _compute_transform (f, &scale); if (status) goto FAIL; status = _cairo_scaled_font_init (&f->base, font_face, font_matrix, ctm, options, &cairo_win32_scaled_font_backend); if (status) goto FAIL; status = _cairo_win32_scaled_font_set_metrics (f); if (status) { _cairo_scaled_font_fini (&f->base); goto FAIL; } *font_out = &f->base; return CAIRO_STATUS_SUCCESS; FAIL: free (f); return status; } static cairo_status_t _win32_scaled_font_set_world_transform (cairo_win32_scaled_font_t *scaled_font, HDC hdc) { XFORM xform; _cairo_matrix_to_win32_xform (&scaled_font->logical_to_device, &xform); if (!SetWorldTransform (hdc, &xform)) return _cairo_win32_print_gdi_error ("_win32_scaled_font_set_world_transform"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _win32_scaled_font_set_identity_transform (HDC hdc) { if (!ModifyWorldTransform (hdc, NULL, MWT_IDENTITY)) return _cairo_win32_print_gdi_error ("_win32_scaled_font_set_identity_transform"); return CAIRO_STATUS_SUCCESS; } static HDC _get_global_font_dc (void) { static HDC hdc; if (!hdc) { hdc = CreateCompatibleDC (NULL); if (!hdc) { _cairo_win32_print_gdi_error ("_get_global_font_dc"); return NULL; } if (!SetGraphicsMode (hdc, GM_ADVANCED)) { _cairo_win32_print_gdi_error ("_get_global_font_dc"); DeleteDC (hdc); return NULL; } } return hdc; } static HFONT _win32_scaled_font_get_scaled_hfont (cairo_win32_scaled_font_t *scaled_font) { if (!scaled_font->scaled_hfont) { LOGFONTW logfont = scaled_font->logfont; logfont.lfHeight = -scaled_font->logical_size; logfont.lfWidth = 0; logfont.lfEscapement = 0; logfont.lfOrientation = 0; logfont.lfQuality = scaled_font->quality; scaled_font->scaled_hfont = CreateFontIndirectW (&logfont); if (!scaled_font->scaled_hfont) { _cairo_win32_print_gdi_error ("_win32_scaled_font_get_scaled_hfont"); return NULL; } } return scaled_font->scaled_hfont; } static HFONT _win32_scaled_font_get_unscaled_hfont (cairo_win32_scaled_font_t *scaled_font, HDC hdc) { if (!scaled_font->unscaled_hfont) { OUTLINETEXTMETRIC *otm; unsigned int otm_size; HFONT scaled_hfont; LOGFONTW logfont; scaled_hfont = _win32_scaled_font_get_scaled_hfont (scaled_font); if (!scaled_hfont) return NULL; if (!SelectObject (hdc, scaled_hfont)) { _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:SelectObject"); return NULL; } otm_size = GetOutlineTextMetrics (hdc, 0, NULL); if (!otm_size) { _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:GetOutlineTextMetrics"); return NULL; } otm = malloc (otm_size); if (!otm) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } if (!GetOutlineTextMetrics (hdc, otm_size, otm)) { _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:GetOutlineTextMetrics"); free (otm); return NULL; } scaled_font->em_square = otm->otmEMSquare; free (otm); logfont = scaled_font->logfont; logfont.lfHeight = -scaled_font->em_square; logfont.lfWidth = 0; logfont.lfEscapement = 0; logfont.lfOrientation = 0; logfont.lfQuality = scaled_font->quality; scaled_font->unscaled_hfont = CreateFontIndirectW (&logfont); if (!scaled_font->unscaled_hfont) { _cairo_win32_print_gdi_error ("_win32_scaled_font_get_unscaled_hfont:CreateIndirect"); return NULL; } } return scaled_font->unscaled_hfont; } static cairo_status_t _cairo_win32_scaled_font_select_unscaled_font (cairo_scaled_font_t *scaled_font, HDC hdc) { cairo_status_t status; HFONT hfont; HFONT old_hfont = NULL; hfont = _win32_scaled_font_get_unscaled_hfont ((cairo_win32_scaled_font_t *)scaled_font, hdc); if (!hfont) return _cairo_error (CAIRO_STATUS_NO_MEMORY); old_hfont = SelectObject (hdc, hfont); if (!old_hfont) return _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_select_unscaled_font"); status = _win32_scaled_font_set_identity_transform (hdc); if (status) { SelectObject (hdc, old_hfont); return status; } SetMapMode (hdc, MM_TEXT); return CAIRO_STATUS_SUCCESS; } static void _cairo_win32_scaled_font_done_unscaled_font (cairo_scaled_font_t *scaled_font) { } /* implement the font backend interface */ static cairo_status_t _cairo_win32_scaled_font_create_toy (cairo_toy_font_face_t *toy_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font_out) { LOGFONTW logfont; uint16_t *face_name; int face_name_len; cairo_status_t status; status = _cairo_utf8_to_utf16 (toy_face->family, -1, &face_name, &face_name_len); if (status) return status; if (face_name_len > LF_FACESIZE - 1) { free (face_name); return _cairo_error (CAIRO_STATUS_INVALID_STRING); } memcpy (logfont.lfFaceName, face_name, sizeof (uint16_t) * (face_name_len + 1)); free (face_name); logfont.lfHeight = 0; /* filled in later */ logfont.lfWidth = 0; /* filled in later */ logfont.lfEscapement = 0; /* filled in later */ logfont.lfOrientation = 0; /* filled in later */ switch (toy_face->weight) { case CAIRO_FONT_WEIGHT_NORMAL: default: logfont.lfWeight = FW_NORMAL; break; case CAIRO_FONT_WEIGHT_BOLD: logfont.lfWeight = FW_BOLD; break; } switch (toy_face->slant) { case CAIRO_FONT_SLANT_NORMAL: default: logfont.lfItalic = FALSE; break; case CAIRO_FONT_SLANT_ITALIC: case CAIRO_FONT_SLANT_OBLIQUE: logfont.lfItalic = TRUE; break; } logfont.lfUnderline = FALSE; logfont.lfStrikeOut = FALSE; /* The docs for LOGFONT discourage using this, since the * interpretation is locale-specific, but it's not clear what * would be a better alternative. */ logfont.lfCharSet = DEFAULT_CHARSET; logfont.lfOutPrecision = OUT_DEFAULT_PRECIS; logfont.lfClipPrecision = CLIP_DEFAULT_PRECIS; logfont.lfQuality = DEFAULT_QUALITY; /* filled in later */ logfont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE; if (!logfont.lfFaceName) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _win32_scaled_font_create (&logfont, NULL, &toy_face->base, font_matrix, ctm, options, scaled_font_out); } static void _cairo_win32_scaled_font_fini (void *abstract_font) { cairo_win32_scaled_font_t *scaled_font = abstract_font; if (scaled_font == NULL) return; if (scaled_font->scaled_hfont && scaled_font->delete_scaled_hfont) DeleteObject (scaled_font->scaled_hfont); if (scaled_font->unscaled_hfont) DeleteObject (scaled_font->unscaled_hfont); } static cairo_int_status_t _cairo_win32_scaled_font_type1_text_to_glyphs (cairo_win32_scaled_font_t *scaled_font, double x, double y, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs) { uint16_t *utf16; int n16; int i; WORD *glyph_indices = NULL; cairo_status_t status = CAIRO_STATUS_SUCCESS; double x_pos, y_pos; HDC hdc = NULL; cairo_matrix_t mat; status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16); if (status) return status; glyph_indices = _cairo_malloc_ab (n16 + 1, sizeof (WORD)); if (!glyph_indices) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL1; } hdc = _get_global_font_dc (); if (!hdc) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL2; } status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) goto FAIL2; if (GetGlyphIndicesW (hdc, utf16, n16, glyph_indices, 0) == GDI_ERROR) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_type1_text_to_glyphs:GetGlyphIndicesW"); goto FAIL2; } *num_glyphs = n16; *glyphs = _cairo_malloc_ab (n16, sizeof (cairo_glyph_t)); if (!*glyphs) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL2; } x_pos = x; y_pos = y; mat = scaled_font->base.ctm; cairo_matrix_invert (&mat); for (i = 0; i < n16; i++) { cairo_scaled_glyph_t *scaled_glyph; (*glyphs)[i].index = glyph_indices[i]; (*glyphs)[i].x = x_pos; (*glyphs)[i].y = y_pos; status = _cairo_scaled_glyph_lookup (&scaled_font->base, glyph_indices[i], CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); if (status) { free (*glyphs); goto FAIL2; } x = scaled_glyph->x_advance; y = scaled_glyph->y_advance; cairo_matrix_transform_distance (&mat, &x, &y); x_pos += x; y_pos += y; } cairo_win32_scaled_font_done_font (&scaled_font->base); FAIL2: free (glyph_indices); FAIL1: free (utf16); return status; } static cairo_int_status_t _cairo_win32_scaled_font_text_to_glyphs (void *abstract_font, double x, double y, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs) { cairo_win32_scaled_font_t *scaled_font = abstract_font; uint16_t *utf16; int n16; GCP_RESULTSW gcp_results; unsigned int buffer_size, i; WCHAR *glyph_indices = NULL; int *dx = NULL; cairo_status_t status = CAIRO_STATUS_SUCCESS; double x_pos, y_pos; double x_incr, y_incr; HDC hdc = NULL; /* GetCharacterPlacement() returns utf16 instead of glyph indices * for Type 1 fonts. Use GetGlyphIndices for Type 1 fonts. */ if (scaled_font->is_type1) return _cairo_win32_scaled_font_type1_text_to_glyphs (scaled_font, x, y, utf8, glyphs, num_glyphs); /* Compute a vector in user space along the baseline of length one logical space unit */ x_incr = 1; y_incr = 0; cairo_matrix_transform_distance (&scaled_font->base.font_matrix, &x_incr, &y_incr); x_incr /= scaled_font->logical_scale; y_incr /= scaled_font->logical_scale; status = _cairo_utf8_to_utf16 (utf8, -1, &utf16, &n16); if (status) return status; gcp_results.lStructSize = sizeof (GCP_RESULTS); gcp_results.lpOutString = NULL; gcp_results.lpOrder = NULL; gcp_results.lpCaretPos = NULL; gcp_results.lpClass = NULL; buffer_size = MAX (n16 * 1.2, 16); /* Initially guess number of chars plus a few */ if (buffer_size > INT_MAX) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL1; } hdc = _get_global_font_dc (); if (!hdc) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL1; } status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) goto FAIL1; while (TRUE) { if (glyph_indices) { free (glyph_indices); glyph_indices = NULL; } if (dx) { free (dx); dx = NULL; } glyph_indices = _cairo_malloc_ab (buffer_size, sizeof (WCHAR)); dx = _cairo_malloc_ab (buffer_size, sizeof (int)); if (!glyph_indices || !dx) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL2; } gcp_results.nGlyphs = buffer_size; gcp_results.lpDx = dx; gcp_results.lpGlyphs = glyph_indices; if (!GetCharacterPlacementW (hdc, utf16, n16, 0, &gcp_results, GCP_DIACRITIC | GCP_LIGATE | GCP_GLYPHSHAPE | GCP_REORDER)) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_text_to_glyphs"); goto FAIL2; } if (gcp_results.lpDx && gcp_results.lpGlyphs) break; /* Too small a buffer, try again */ buffer_size *= 1.5; if (buffer_size > INT_MAX) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL2; } } *num_glyphs = gcp_results.nGlyphs; *glyphs = _cairo_malloc_ab (gcp_results.nGlyphs, sizeof (cairo_glyph_t)); if (!*glyphs) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL2; } x_pos = x; y_pos = y; for (i = 0; i < gcp_results.nGlyphs; i++) { (*glyphs)[i].index = glyph_indices[i]; (*glyphs)[i].x = x_pos ; (*glyphs)[i].y = y_pos; x_pos += x_incr * dx[i]; y_pos += y_incr * dx[i]; } FAIL2: if (glyph_indices) free (glyph_indices); if (dx) free (dx); cairo_win32_scaled_font_done_font (&scaled_font->base); FAIL1: free (utf16); return status; } static cairo_status_t _cairo_win32_scaled_font_set_metrics (cairo_win32_scaled_font_t *scaled_font) { cairo_status_t status; cairo_font_extents_t extents; TEXTMETRIC metrics; HDC hdc; hdc = _get_global_font_dc (); if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (scaled_font->preserve_axes || scaled_font->base.options.hint_metrics == CAIRO_HINT_METRICS_OFF) { /* For 90-degree rotations (including 0), we get the metrics * from the GDI in logical space, then convert back to font space */ status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) return status; GetTextMetrics (hdc, &metrics); cairo_win32_scaled_font_done_font (&scaled_font->base); extents.ascent = metrics.tmAscent / scaled_font->logical_scale; extents.descent = metrics.tmDescent / scaled_font->logical_scale; extents.height = (metrics.tmHeight + metrics.tmExternalLeading) / scaled_font->logical_scale; extents.max_x_advance = metrics.tmMaxCharWidth / scaled_font->logical_scale; extents.max_y_advance = 0; } else { /* For all other transformations, we use the design metrics * of the font. The GDI results from GetTextMetrics() on a * transformed font are inexplicably large and we want to * avoid them. */ status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); if (status) return status; GetTextMetrics (hdc, &metrics); _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); extents.ascent = (double)metrics.tmAscent / scaled_font->em_square; extents.descent = (double)metrics.tmDescent / scaled_font->em_square; extents.height = (double)(metrics.tmHeight + metrics.tmExternalLeading) / scaled_font->em_square; extents.max_x_advance = (double)(metrics.tmMaxCharWidth) / scaled_font->em_square; extents.max_y_advance = 0; } scaled_font->is_bitmap = !(metrics.tmPitchAndFamily & TMPF_VECTOR); /* Need to determine if this is a Type 1 font for the special * handling in _text_to_glyphs. Unlike TrueType or OpenType, * Type1 fonts do not have a "cmap" table (or any other table). * However GetFontData() will retrieve a Type1 font when * requesting that GetFontData() retrieve data from the start of * the file. This is to distinguish Type1 from stroke fonts such * as "Script" and "Modern". The TMPF_TRUETYPE test is redundant * but improves performance for the most common fonts. */ scaled_font->is_type1 = FALSE; if (!(metrics.tmPitchAndFamily & TMPF_TRUETYPE) && (metrics.tmPitchAndFamily & TMPF_VECTOR)) { if ((GetFontData (hdc, CMAP_TAG, 0, NULL, 0) == GDI_ERROR) && (GetFontData (hdc, 0, 0, NULL, 0) != GDI_ERROR)) { scaled_font->is_type1 = TRUE; } } return _cairo_scaled_font_set_metrics (&scaled_font->base, &extents); } static cairo_status_t _cairo_win32_scaled_font_init_glyph_metrics (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph) { static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 } }; GLYPHMETRICS metrics; cairo_status_t status; cairo_text_extents_t extents; HDC hdc; hdc = _get_global_font_dc (); if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (scaled_font->is_bitmap) { /* GetGlyphOutline will not work. Assume that the glyph does not extend outside the font box. */ cairo_font_extents_t font_extents; INT width = 0; UINT charIndex = _cairo_scaled_glyph_index (scaled_glyph); cairo_scaled_font_extents (&scaled_font->base, &font_extents); status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (!status) { if (!GetCharWidth32(hdc, charIndex, charIndex, &width)) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_init_glyph_metrics:GetCharWidth32"); width = 0; } } cairo_win32_scaled_font_done_font (&scaled_font->base); extents.x_bearing = 0; extents.y_bearing = -font_extents.ascent / scaled_font->y_scale; extents.width = width / scaled_font->x_scale; extents.height = (font_extents.ascent + font_extents.descent) / scaled_font->y_scale; extents.x_advance = extents.width; extents.y_advance = 0; } else if (scaled_font->preserve_axes && scaled_font->base.options.hint_style != CAIRO_HINT_METRICS_OFF) { /* If we aren't rotating / skewing the axes, then we get the metrics * from the GDI in device space and convert to font space. */ status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) return status; if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), GGO_METRICS | GGO_GLYPH_INDEX, &metrics, 0, NULL, &matrix) == GDI_ERROR) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_init_glyph_metrics:GetGlyphOutlineW"); memset (&metrics, 0, sizeof (GLYPHMETRICS)); } cairo_win32_scaled_font_done_font (&scaled_font->base); if (scaled_font->swap_axes) { extents.x_bearing = - metrics.gmptGlyphOrigin.y / scaled_font->y_scale; extents.y_bearing = metrics.gmptGlyphOrigin.x / scaled_font->x_scale; extents.width = metrics.gmBlackBoxY / scaled_font->y_scale; extents.height = metrics.gmBlackBoxX / scaled_font->x_scale; extents.x_advance = metrics.gmCellIncY / scaled_font->x_scale; extents.y_advance = metrics.gmCellIncX / scaled_font->y_scale; } else { extents.x_bearing = metrics.gmptGlyphOrigin.x / scaled_font->x_scale; extents.y_bearing = - metrics.gmptGlyphOrigin.y / scaled_font->y_scale; extents.width = metrics.gmBlackBoxX / scaled_font->x_scale; extents.height = metrics.gmBlackBoxY / scaled_font->y_scale; extents.x_advance = metrics.gmCellIncX / scaled_font->x_scale; extents.y_advance = metrics.gmCellIncY / scaled_font->y_scale; } if (scaled_font->swap_x) { extents.x_bearing = (- extents.x_bearing - extents.width); extents.x_advance = - extents.x_advance; } if (scaled_font->swap_y) { extents.y_bearing = (- extents.y_bearing - extents.height); extents.y_advance = - extents.y_advance; } } else { /* For all other transformations, we use the design metrics * of the font. */ status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), GGO_METRICS | GGO_GLYPH_INDEX, &metrics, 0, NULL, &matrix) == GDI_ERROR) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_init_glyph_metrics:GetGlyphOutlineW"); memset (&metrics, 0, sizeof (GLYPHMETRICS)); } _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); extents.x_bearing = (double)metrics.gmptGlyphOrigin.x / scaled_font->em_square; extents.y_bearing = - (double)metrics.gmptGlyphOrigin.y / scaled_font->em_square; extents.width = (double)metrics.gmBlackBoxX / scaled_font->em_square; extents.height = (double)metrics.gmBlackBoxY / scaled_font->em_square; extents.x_advance = (double)metrics.gmCellIncX / scaled_font->em_square; extents.y_advance = (double)metrics.gmCellIncY / scaled_font->em_square; } _cairo_scaled_glyph_set_metrics (scaled_glyph, &scaled_font->base, &extents); return CAIRO_STATUS_SUCCESS; } /* Not currently used code, but may be useful in the future if we add * back the capability to the scaled font backend interface to get the * actual device space bbox rather than computing it from the * font-space metrics. */ #if 0 static cairo_status_t _cairo_win32_scaled_font_glyph_bbox (void *abstract_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_box_t *bbox) { static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, 1 } }; cairo_win32_scaled_font_t *scaled_font = abstract_font; int x1 = 0, x2 = 0, y1 = 0, y2 = 0; if (num_glyphs > 0) { HDC hdc = _get_global_font_dc (); GLYPHMETRICS metrics; cairo_status_t status; int i; if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) return status; for (i = 0; i < num_glyphs; i++) { int x = _cairo_lround (glyphs[i].x); int y = _cairo_lround (glyphs[i].y); GetGlyphOutlineW (hdc, glyphs[i].index, GGO_METRICS | GGO_GLYPH_INDEX, &metrics, 0, NULL, &matrix); if (i == 0 || x1 > x + metrics.gmptGlyphOrigin.x) x1 = x + metrics.gmptGlyphOrigin.x; if (i == 0 || y1 > y - metrics.gmptGlyphOrigin.y) y1 = y - metrics.gmptGlyphOrigin.y; if (i == 0 || x2 < x + metrics.gmptGlyphOrigin.x + (int)metrics.gmBlackBoxX) x2 = x + metrics.gmptGlyphOrigin.x + (int)metrics.gmBlackBoxX; if (i == 0 || y2 < y - metrics.gmptGlyphOrigin.y + (int)metrics.gmBlackBoxY) y2 = y - metrics.gmptGlyphOrigin.y + (int)metrics.gmBlackBoxY; } cairo_win32_scaled_font_done_font (&scaled_font->base); } bbox->p1.x = _cairo_fixed_from_int (x1); bbox->p1.y = _cairo_fixed_from_int (y1); bbox->p2.x = _cairo_fixed_from_int (x2); bbox->p2.y = _cairo_fixed_from_int (y2); return CAIRO_STATUS_SUCCESS; } #endif typedef struct { cairo_win32_scaled_font_t *scaled_font; HDC hdc; cairo_array_t glyphs; cairo_array_t dx; int start_x; int last_x; int last_y; } cairo_glyph_state_t; static void _start_glyphs (cairo_glyph_state_t *state, cairo_win32_scaled_font_t *scaled_font, HDC hdc) { state->hdc = hdc; state->scaled_font = scaled_font; _cairo_array_init (&state->glyphs, sizeof (WCHAR)); _cairo_array_init (&state->dx, sizeof (int)); } static cairo_status_t _flush_glyphs (cairo_glyph_state_t *state) { cairo_status_t status; int dx = 0; WCHAR * elements; int * dx_elements; status = _cairo_array_append (&state->dx, &dx); if (status) return status; elements = _cairo_array_index (&state->glyphs, 0); dx_elements = _cairo_array_index (&state->dx, 0); if (!ExtTextOutW (state->hdc, state->start_x, state->last_y, ETO_GLYPH_INDEX, NULL, elements, state->glyphs.num_elements, dx_elements)) { return _cairo_win32_print_gdi_error ("_flush_glyphs"); } _cairo_array_truncate (&state->glyphs, 0); _cairo_array_truncate (&state->dx, 0); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _add_glyph (cairo_glyph_state_t *state, unsigned long index, double device_x, double device_y) { cairo_status_t status; double user_x = device_x; double user_y = device_y; WCHAR glyph_index = index; int logical_x, logical_y; cairo_matrix_transform_point (&state->scaled_font->device_to_logical, &user_x, &user_y); logical_x = _cairo_lround (user_x); logical_y = _cairo_lround (user_y); if (state->glyphs.num_elements > 0) { int dx; if (logical_y != state->last_y) { status = _flush_glyphs (state); if (status) return status; state->start_x = logical_x; } dx = logical_x - state->last_x; status = _cairo_array_append (&state->dx, &dx); if (status) return status; } else { state->start_x = logical_x; } state->last_x = logical_x; state->last_y = logical_y; status = _cairo_array_append (&state->glyphs, &glyph_index); if (status) return status; return CAIRO_STATUS_SUCCESS; } static void _finish_glyphs (cairo_glyph_state_t *state) { /* ignore errors as we only call _finish_glyphs on the error path */ _flush_glyphs (state); _cairo_array_fini (&state->glyphs); _cairo_array_fini (&state->dx); } static cairo_status_t _draw_glyphs_on_surface (cairo_win32_surface_t *surface, cairo_win32_scaled_font_t *scaled_font, COLORREF color, int x_offset, int y_offset, const cairo_glyph_t *glyphs, int num_glyphs) { cairo_glyph_state_t state; cairo_status_t status = CAIRO_STATUS_SUCCESS; int i; if (!SaveDC (surface->dc)) return _cairo_win32_print_gdi_error ("_draw_glyphs_on_surface:SaveDC"); status = cairo_win32_scaled_font_select_font (&scaled_font->base, surface->dc); if (status) goto FAIL1; SetTextColor (surface->dc, color); SetTextAlign (surface->dc, TA_BASELINE | TA_LEFT); SetBkMode (surface->dc, TRANSPARENT); _start_glyphs (&state, scaled_font, surface->dc); for (i = 0; i < num_glyphs; i++) { status = _add_glyph (&state, glyphs[i].index, glyphs[i].x - x_offset, glyphs[i].y - y_offset); if (status) goto FAIL2; } FAIL2: _finish_glyphs (&state); cairo_win32_scaled_font_done_font (&scaled_font->base); FAIL1: RestoreDC (surface->dc, -1); return status; } /* Duplicate the green channel of a 4-channel mask in the alpha channel, then * invert the whole mask. */ static void _compute_argb32_mask_alpha (cairo_win32_surface_t *mask_surface) { cairo_image_surface_t *image = (cairo_image_surface_t *)mask_surface->image; int i, j; for (i = 0; i < image->height; i++) { uint32_t *p = (uint32_t *) (image->data + i * image->stride); for (j = 0; j < image->width; j++) { *p = 0xffffffff ^ (*p | ((*p & 0x0000ff00) << 16)); p++; } } } /* Invert a mask */ static void _invert_argb32_mask (cairo_win32_surface_t *mask_surface) { cairo_image_surface_t *image = (cairo_image_surface_t *)mask_surface->image; int i, j; for (i = 0; i < image->height; i++) { uint32_t *p = (uint32_t *) (image->data + i * image->stride); for (j = 0; j < image->width; j++) { *p = 0xffffffff ^ *p; p++; } } } /* Compute an alpha-mask from a monochrome RGB24 image */ static cairo_surface_t * _compute_a8_mask (cairo_win32_surface_t *mask_surface) { cairo_image_surface_t *image24 = (cairo_image_surface_t *)mask_surface->image; cairo_image_surface_t *image8; int i, j; image8 = (cairo_image_surface_t *)cairo_image_surface_create (CAIRO_FORMAT_A8, image24->width, image24->height); if (image8->base.status) return NULL; for (i = 0; i < image24->height; i++) { uint32_t *p = (uint32_t *) (image24->data + i * image24->stride); unsigned char *q = (unsigned char *) (image8->data + i * image8->stride); for (j = 0; j < image24->width; j++) { *q = 255 - ((*p & 0x0000ff00) >> 8); p++; q++; } } return &image8->base; } static cairo_int_status_t _cairo_win32_scaled_font_glyph_init (void *abstract_font, cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_glyph_info_t info) { cairo_win32_scaled_font_t *scaled_font = abstract_font; cairo_status_t status; if ((info & CAIRO_SCALED_GLYPH_INFO_METRICS) != 0) { status = _cairo_win32_scaled_font_init_glyph_metrics (scaled_font, scaled_glyph); if (status) return status; } if (info & CAIRO_SCALED_GLYPH_INFO_SURFACE) { status = _cairo_win32_scaled_font_init_glyph_surface (scaled_font, scaled_glyph); if (status) return status; } if ((info & CAIRO_SCALED_GLYPH_INFO_PATH) != 0) { status = _cairo_win32_scaled_font_init_glyph_path (scaled_font, scaled_glyph); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_win32_scaled_font_show_glyphs (void *abstract_font, cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *generic_surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs) { cairo_win32_scaled_font_t *scaled_font = abstract_font; cairo_win32_surface_t *surface = (cairo_win32_surface_t *)generic_surface; cairo_status_t status; if (width == 0 || height == 0) return CAIRO_STATUS_SUCCESS; if (_cairo_surface_is_win32 (generic_surface) && surface->format == CAIRO_FORMAT_RGB24 && op == CAIRO_OPERATOR_OVER && _cairo_pattern_is_opaque_solid (pattern)) { cairo_solid_pattern_t *solid_pattern = (cairo_solid_pattern_t *)pattern; /* When compositing OVER on a GDI-understood surface, with a * solid opaque color, we can just call ExtTextOut directly. */ COLORREF new_color; new_color = RGB (((int)solid_pattern->color.red_short) >> 8, ((int)solid_pattern->color.green_short) >> 8, ((int)solid_pattern->color.blue_short) >> 8); status = _draw_glyphs_on_surface (surface, scaled_font, new_color, 0, 0, glyphs, num_glyphs); return status; } else { /* Otherwise, we need to draw using software fallbacks. We create a mask * surface by drawing the the glyphs onto a DIB, black-on-white then * inverting. GDI outputs gamma-corrected images so inverted black-on-white * is very different from white-on-black. We favor the more common * case where the final output is dark-on-light. */ cairo_win32_surface_t *tmp_surface; cairo_surface_t *mask_surface; cairo_surface_pattern_t mask; RECT r; tmp_surface = (cairo_win32_surface_t *)cairo_win32_surface_create_with_dib (CAIRO_FORMAT_ARGB32, width, height); if (tmp_surface->base.status) return tmp_surface->base.status; r.left = 0; r.top = 0; r.right = width; r.bottom = height; FillRect (tmp_surface->dc, &r, GetStockObject (WHITE_BRUSH)); status = _draw_glyphs_on_surface (tmp_surface, scaled_font, RGB (0, 0, 0), dest_x, dest_y, glyphs, num_glyphs); if (status) { cairo_surface_destroy (&tmp_surface->base); return status; } if (scaled_font->quality == CLEARTYPE_QUALITY) { /* For ClearType, we need a 4-channel mask. If we are compositing on * a surface with alpha, we need to compute the alpha channel of * the mask (we just copy the green channel). But for a destination * surface without alpha the alpha channel of the mask is ignored */ if (surface->format != CAIRO_FORMAT_RGB24) _compute_argb32_mask_alpha (tmp_surface); else _invert_argb32_mask (tmp_surface); mask_surface = &tmp_surface->base; /* XXX: Hacky, should expose this in cairo_image_surface */ pixman_image_set_component_alpha (((cairo_image_surface_t *)tmp_surface->image)->pixman_image, TRUE); } else { mask_surface = _compute_a8_mask (tmp_surface); cairo_surface_destroy (&tmp_surface->base); if (!mask_surface) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* For op == OVER, no-cleartype, a possible optimization here is to * draw onto an intermediate ARGB32 surface and alpha-blend that with the * destination */ _cairo_pattern_init_for_surface (&mask, mask_surface); status = _cairo_surface_composite (op, pattern, &mask.base, &surface->base, source_x, source_y, 0, 0, dest_x, dest_y, width, height); _cairo_pattern_fini (&mask.base); cairo_surface_destroy (mask_surface); return status; } } static cairo_int_status_t _cairo_win32_scaled_font_load_truetype_table (void *abstract_font, unsigned long tag, long offset, unsigned char *buffer, unsigned long *length) { HDC hdc; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_win32_scaled_font_t *scaled_font = abstract_font; hdc = _get_global_font_dc (); if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); tag = (tag&0x000000ff)<<24 | (tag&0x0000ff00)<<8 | (tag&0x00ff0000)>>8 | (tag&0xff000000)>>24; status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); *length = GetFontData (hdc, tag, offset, buffer, *length); if (*length == GDI_ERROR) status = CAIRO_INT_STATUS_UNSUPPORTED; _cairo_win32_scaled_font_done_unscaled_font (&scaled_font->base); return status; } static cairo_int_status_t _cairo_win32_scaled_font_map_glyphs_to_unicode (void *abstract_font, cairo_scaled_font_subset_t *font_subset) { cairo_win32_scaled_font_t *scaled_font = abstract_font; GLYPHSET *glyph_set; uint16_t *utf16 = NULL; WORD *glyph_indices = NULL; HDC hdc = NULL; int res; unsigned int i, j, k, count, num_glyphs; cairo_status_t status = CAIRO_STATUS_SUCCESS; hdc = _get_global_font_dc (); if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); if (status) return status; res = GetFontUnicodeRanges(hdc, NULL); if (res == 0) { status = _cairo_win32_print_gdi_error ( "_cairo_win32_scaled_font_map_glyphs_to_unicode:GetFontUnicodeRanges"); goto fail1; } glyph_set = malloc (res); if (glyph_set == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } res = GetFontUnicodeRanges(hdc, glyph_set); if (res == 0) { status = _cairo_win32_print_gdi_error ( "_cairo_win32_scaled_font_map_glyphs_to_unicode:GetFontUnicodeRanges"); goto fail2; } count = font_subset->num_glyphs; for (i = 0; i < glyph_set->cRanges && count > 0; i++) { num_glyphs = glyph_set->ranges[i].cGlyphs; utf16 = _cairo_malloc_ab (num_glyphs + 1, sizeof (uint16_t)); if (utf16 == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } glyph_indices = _cairo_malloc_ab (num_glyphs + 1, sizeof (WORD)); if (glyph_indices == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } for (j = 0; j < num_glyphs; j++) utf16[j] = glyph_set->ranges[i].wcLow + j; utf16[j] = 0; if (GetGlyphIndicesW (hdc, utf16, num_glyphs, glyph_indices, 0) == GDI_ERROR) { status = _cairo_win32_print_gdi_error ( "_cairo_win32_scaled_font_map_glyphs_to_unicode:GetGlyphIndicesW"); goto fail2; } for (j = 0; j < num_glyphs; j++) { for (k = 0; k < font_subset->num_glyphs; k++) { if (font_subset->glyphs[k] == glyph_indices[j]) { font_subset->to_unicode[k] = utf16[j]; count--; break; } } } free (glyph_indices); glyph_indices = NULL; free (utf16); utf16= NULL; } fail2: if (glyph_indices) free (glyph_indices); if (utf16) free (utf16); free (glyph_set); fail1: cairo_win32_scaled_font_done_font (&scaled_font->base); return status; } static cairo_status_t _cairo_win32_scaled_font_init_glyph_surface (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_glyph_t glyph; cairo_win32_surface_t *surface; cairo_t *cr; cairo_surface_t *image; int width, height; int x1, y1, x2, y2; x1 = _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.x); y1 = _cairo_fixed_integer_floor (scaled_glyph->bbox.p1.y); x2 = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.x); y2 = _cairo_fixed_integer_ceil (scaled_glyph->bbox.p2.y); width = x2 - x1; height = y2 - y1; surface = (cairo_win32_surface_t *) cairo_win32_surface_create_with_dib (CAIRO_FORMAT_RGB24, width, height); cr = cairo_create((cairo_surface_t *)surface); cairo_set_source_rgb (cr, 1, 1, 1); cairo_paint (cr); cairo_destroy(cr); glyph.index = _cairo_scaled_glyph_index (scaled_glyph); glyph.x = -x1; glyph.y = -y1; status = _draw_glyphs_on_surface (surface, scaled_font, RGB(0,0,0), 0, 0, &glyph, 1); GdiFlush(); image = _compute_a8_mask (surface); cairo_surface_set_device_offset ((cairo_surface_t *)image, -x1, -y1); _cairo_scaled_glyph_set_surface (scaled_glyph, &scaled_font->base, (cairo_image_surface_t*)image); cairo_surface_destroy (&surface->base); return status; } static void _cairo_win32_transform_FIXED_to_fixed (cairo_matrix_t *matrix, FIXED Fx, FIXED Fy, cairo_fixed_t *fx, cairo_fixed_t *fy) { double x = Fx.value + Fx.fract / 65536.0; double y = Fy.value + Fy.fract / 65536.0; cairo_matrix_transform_point (matrix, &x, &y); *fx = _cairo_fixed_from_double (x); *fy = _cairo_fixed_from_double (y); } static cairo_status_t _cairo_win32_scaled_font_init_glyph_path (cairo_win32_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph) { static const MAT2 matrix = { { 0, 1 }, { 0, 0 }, { 0, 0 }, { 0, -1 } }; cairo_status_t status; GLYPHMETRICS metrics; HDC hdc; DWORD bytesGlyph; unsigned char *buffer, *ptr; cairo_path_fixed_t *path; cairo_matrix_t transform; cairo_fixed_t x, y; if (scaled_font->is_bitmap) return CAIRO_INT_STATUS_UNSUPPORTED; hdc = _get_global_font_dc (); if (!hdc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); path = _cairo_path_fixed_create (); if (!path) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (scaled_font->base.options.hint_style == CAIRO_HINT_STYLE_NONE) { status = _cairo_win32_scaled_font_select_unscaled_font (&scaled_font->base, hdc); transform = scaled_font->base.scale; cairo_matrix_scale (&transform, 1.0/scaled_font->em_square, 1.0/scaled_font->em_square); } else { status = cairo_win32_scaled_font_select_font (&scaled_font->base, hdc); cairo_matrix_init_identity(&transform); } if (status) goto CLEANUP_PATH; bytesGlyph = GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), GGO_NATIVE | GGO_GLYPH_INDEX, &metrics, 0, NULL, &matrix); if (bytesGlyph == GDI_ERROR) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_glyph_path"); goto CLEANUP_FONT; } ptr = buffer = malloc (bytesGlyph); if (!buffer) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_FONT; } if (GetGlyphOutlineW (hdc, _cairo_scaled_glyph_index (scaled_glyph), GGO_NATIVE | GGO_GLYPH_INDEX, &metrics, bytesGlyph, buffer, &matrix) == GDI_ERROR) { status = _cairo_win32_print_gdi_error ("_cairo_win32_scaled_font_glyph_path"); goto CLEANUP_BUFFER; } while (ptr < buffer + bytesGlyph) { TTPOLYGONHEADER *header = (TTPOLYGONHEADER *)ptr; unsigned char *endPoly = ptr + header->cb; ptr += sizeof (TTPOLYGONHEADER); _cairo_win32_transform_FIXED_to_fixed (&transform, header->pfxStart.x, header->pfxStart.y, &x, &y); status = _cairo_path_fixed_move_to (path, x, y); if (status) goto CLEANUP_BUFFER; while (ptr < endPoly) { TTPOLYCURVE *curve = (TTPOLYCURVE *)ptr; POINTFX *points = curve->apfx; int i; switch (curve->wType) { case TT_PRIM_LINE: for (i = 0; i < curve->cpfx; i++) { _cairo_win32_transform_FIXED_to_fixed (&transform, points[i].x, points[i].y, &x, &y); status = _cairo_path_fixed_line_to (path, x, y); if (status) goto CLEANUP_BUFFER; } break; case TT_PRIM_QSPLINE: for (i = 0; i < curve->cpfx - 1; i++) { cairo_fixed_t p1x, p1y, p2x, p2y, cx, cy, c1x, c1y, c2x, c2y; if (! _cairo_path_fixed_get_current_point (path, &p1x, &p1y)) goto CLEANUP_BUFFER; _cairo_win32_transform_FIXED_to_fixed (&transform, points[i].x, points[i].y, &cx, &cy); if (i + 1 == curve->cpfx - 1) { _cairo_win32_transform_FIXED_to_fixed (&transform, points[i + 1].x, points[i + 1].y, &p2x, &p2y); } else { /* records with more than one curve use interpolation for control points, per http://support.microsoft.com/kb/q87115/ */ _cairo_win32_transform_FIXED_to_fixed (&transform, points[i + 1].x, points[i + 1].y, &x, &y); p2x = (cx + x) / 2; p2y = (cy + y) / 2; } c1x = 2 * cx / 3 + p1x / 3; c1y = 2 * cy / 3 + p1y / 3; c2x = 2 * cx / 3 + p2x / 3; c2y = 2 * cy / 3 + p2y / 3; status = _cairo_path_fixed_curve_to (path, c1x, c1y, c2x, c2y, p2x, p2y); if (status) goto CLEANUP_BUFFER; } break; case TT_PRIM_CSPLINE: for (i = 0; i < curve->cpfx - 2; i += 2) { cairo_fixed_t x1, y1, x2, y2; _cairo_win32_transform_FIXED_to_fixed (&transform, points[i].x, points[i].y, &x, &y); _cairo_win32_transform_FIXED_to_fixed (&transform, points[i + 1].x, points[i + 1].y, &x1, &y1); _cairo_win32_transform_FIXED_to_fixed (&transform, points[i + 2].x, points[i + 2].y, &x2, &y2); status = _cairo_path_fixed_curve_to (path, x, y, x1, y1, x2, y2); if (status) goto CLEANUP_BUFFER; } break; } ptr += sizeof(TTPOLYCURVE) + sizeof (POINTFX) * (curve->cpfx - 1); } status = _cairo_path_fixed_close_path (path); if (status) goto CLEANUP_BUFFER; } _cairo_scaled_glyph_set_path (scaled_glyph, &scaled_font->base, path); CLEANUP_BUFFER: free (buffer); CLEANUP_FONT: cairo_win32_scaled_font_done_font (&scaled_font->base); CLEANUP_PATH: if (status != CAIRO_STATUS_SUCCESS) _cairo_path_fixed_destroy (path); return status; } const cairo_scaled_font_backend_t cairo_win32_scaled_font_backend = { CAIRO_FONT_TYPE_WIN32, _cairo_win32_scaled_font_create_toy, _cairo_win32_scaled_font_fini, _cairo_win32_scaled_font_glyph_init, _cairo_win32_scaled_font_text_to_glyphs, NULL, /* ucs4_to_index */ _cairo_win32_scaled_font_show_glyphs, _cairo_win32_scaled_font_load_truetype_table, _cairo_win32_scaled_font_map_glyphs_to_unicode, }; /* #cairo_win32_font_face_t */ typedef struct _cairo_win32_font_face cairo_win32_font_face_t; /* If hfont is non-%NULL then logfont->lfHeight must be -S for some S, * logfont->lfWidth, logfont->lfEscapement, logfont->lfOrientation must * all be 0, and hfont is the result of calling CreateFontIndirectW on * logfont. */ struct _cairo_win32_font_face { cairo_font_face_t base; LOGFONTW logfont; HFONT hfont; }; /* implement the platform-specific interface */ static void _cairo_win32_font_face_destroy (void *abstract_face) { } static cairo_bool_t _is_scale (const cairo_matrix_t *matrix, double scale) { return matrix->xx == scale && matrix->yy == scale && matrix->xy == 0. && matrix->yx == 0. && matrix->x0 == 0. && matrix->y0 == 0.; } static cairo_status_t _cairo_win32_font_face_scaled_font_create (void *abstract_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **font) { HFONT hfont = NULL; cairo_win32_font_face_t *font_face = abstract_face; if (font_face->hfont) { /* Check whether it's OK to go ahead and use the font-face's HFONT. */ if (_is_scale (ctm, 1.) && _is_scale (font_matrix, -font_face->logfont.lfHeight)) { hfont = font_face->hfont; } } return _win32_scaled_font_create (&font_face->logfont, hfont, &font_face->base, font_matrix, ctm, options, font); } static const cairo_font_face_backend_t _cairo_win32_font_face_backend = { CAIRO_FONT_TYPE_WIN32, _cairo_win32_font_face_destroy, _cairo_win32_font_face_scaled_font_create }; /** * cairo_win32_font_face_create_for_logfontw_hfont: * @logfont: A #LOGFONTW structure specifying the font to use. * If hfont is null then the lfHeight, lfWidth, lfOrientation and lfEscapement * fields of this structure are ignored. Otherwise lfWidth, lfOrientation and * lfEscapement must be zero. * @font: An #HFONT that can be used when the font matrix is a scale by * -lfHeight and the CTM is identity. * * Creates a new font for the Win32 font backend based on a * #LOGFONT. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). * The #cairo_scaled_font_t * returned from cairo_scaled_font_create() is also for the Win32 backend * and can be used with functions such as cairo_win32_scaled_font_select_font(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. **/ cairo_font_face_t * cairo_win32_font_face_create_for_logfontw_hfont (LOGFONTW *logfont, HFONT font) { cairo_win32_font_face_t *font_face; font_face = malloc (sizeof (cairo_win32_font_face_t)); if (!font_face) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_face_t *)&_cairo_font_face_nil; } font_face->logfont = *logfont; font_face->hfont = font; _cairo_font_face_init (&font_face->base, &_cairo_win32_font_face_backend); return &font_face->base; } /** * cairo_win32_font_face_create_for_logfontw: * @logfont: A #LOGFONTW structure specifying the font to use. * The lfHeight, lfWidth, lfOrientation and lfEscapement * fields of this structure are ignored. * * Creates a new font for the Win32 font backend based on a * #LOGFONT. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). * The #cairo_scaled_font_t * returned from cairo_scaled_font_create() is also for the Win32 backend * and can be used with functions such as cairo_win32_scaled_font_select_font(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. **/ cairo_font_face_t * cairo_win32_font_face_create_for_logfontw (LOGFONTW *logfont) { return cairo_win32_font_face_create_for_logfontw_hfont (logfont, NULL); } /** * cairo_win32_font_face_create_for_hfont: * @font: An #HFONT structure specifying the font to use. * * Creates a new font for the Win32 font backend based on a * #HFONT. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). * The #cairo_scaled_font_t * returned from cairo_scaled_font_create() is also for the Win32 backend * and can be used with functions such as cairo_win32_scaled_font_select_font(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. **/ cairo_font_face_t * cairo_win32_font_face_create_for_hfont (HFONT font) { LOGFONTW logfont; GetObjectW (font, sizeof(logfont), &logfont); if (logfont.lfEscapement != 0 || logfont.lfOrientation != 0 || logfont.lfWidth != 0) { /* We can't use this font because that optimization requires that * lfEscapement, lfOrientation and lfWidth be zero. */ font = NULL; } return cairo_win32_font_face_create_for_logfontw_hfont (&logfont, font); } /** * cairo_win32_scaled_font_select_font: * @scaled_font: A #cairo_scaled_font_t from the Win32 font backend. Such an * object can be created with cairo_win32_scaled_font_create_for_logfontw(). * @hdc: a device context * * Selects the font into the given device context and changes the * map mode and world transformation of the device context to match * that of the font. This function is intended for use when using * layout APIs such as Uniscribe to do text layout with the * cairo font. After finishing using the device context, you must call * cairo_win32_scaled_font_done_font() to release any resources allocated * by this function. * * See cairo_win32_scaled_font_get_metrics_factor() for converting logical * coordinates from the device context to font space. * * Normally, calls to SaveDC() and RestoreDC() would be made around * the use of this function to preserve the original graphics state. * * Return value: %CAIRO_STATUS_SUCCESS if the operation succeeded. * otherwise an error such as %CAIRO_STATUS_NO_MEMORY and * the device context is unchanged. **/ cairo_status_t cairo_win32_scaled_font_select_font (cairo_scaled_font_t *scaled_font, HDC hdc) { cairo_status_t status; HFONT hfont; HFONT old_hfont = NULL; int old_mode; if (scaled_font->status) return scaled_font->status; hfont = _win32_scaled_font_get_scaled_hfont ((cairo_win32_scaled_font_t *)scaled_font); if (!hfont) return _cairo_error (CAIRO_STATUS_NO_MEMORY); old_hfont = SelectObject (hdc, hfont); if (!old_hfont) return _cairo_win32_print_gdi_error ("cairo_win32_scaled_font_select_font:SelectObject"); old_mode = SetGraphicsMode (hdc, GM_ADVANCED); if (!old_mode) { status = _cairo_win32_print_gdi_error ("cairo_win32_scaled_font_select_font:SetGraphicsMode"); SelectObject (hdc, old_hfont); return status; } status = _win32_scaled_font_set_world_transform ((cairo_win32_scaled_font_t *)scaled_font, hdc); if (status) { SetGraphicsMode (hdc, old_mode); SelectObject (hdc, old_hfont); return status; } SetMapMode (hdc, MM_TEXT); return CAIRO_STATUS_SUCCESS; } /** * cairo_win32_scaled_font_done_font: * @scaled_font: A scaled font from the Win32 font backend. * * Releases any resources allocated by cairo_win32_scaled_font_select_font() **/ void cairo_win32_scaled_font_done_font (cairo_scaled_font_t *scaled_font) { } /** * cairo_win32_scaled_font_get_metrics_factor: * @scaled_font: a scaled font from the Win32 font backend * * Gets a scale factor between logical coordinates in the coordinate * space used by cairo_win32_scaled_font_select_font() (that is, the * coordinate system used by the Windows functions to return metrics) and * font space coordinates. * * Return value: factor to multiply logical units by to get font space * coordinates. **/ double cairo_win32_scaled_font_get_metrics_factor (cairo_scaled_font_t *scaled_font) { return 1. / ((cairo_win32_scaled_font_t *)scaled_font)->logical_scale; } /** * cairo_win32_scaled_font_get_logical_to_device: * @scaled_font: a scaled font from the Win32 font backend * @logical_to_device: matrix to return * * Gets the transformation mapping the logical space used by @scaled_font * to device space. * * Since: 1.4 **/ void cairo_win32_scaled_font_get_logical_to_device (cairo_scaled_font_t *scaled_font, cairo_matrix_t *logical_to_device) { cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; *logical_to_device = win_font->logical_to_device; } /** * cairo_win32_scaled_font_get_device_to_logical: * @scaled_font: a scaled font from the Win32 font backend * @device_to_logical: matrix to return * * Gets the transformation mapping device space to the logical space * used by @scaled_font. * * Since: 1.4 **/ void cairo_win32_scaled_font_get_device_to_logical (cairo_scaled_font_t *scaled_font, cairo_matrix_t *device_to_logical) { cairo_win32_scaled_font_t *win_font = (cairo_win32_scaled_font_t *)scaled_font; *device_to_logical = win_font->device_to_logical; } libgdiplus-2.11/cairo/src/cairo-meta-surface-private.h0000664000175000017500000001323712225470167017706 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg * Adrian Johnson */ #ifndef CAIRO_META_SURFACE_H #define CAIRO_META_SURFACE_H #include "cairoint.h" #include "cairo-path-fixed-private.h" typedef enum { /* The 5 basic drawing operations. */ CAIRO_COMMAND_PAINT, CAIRO_COMMAND_MASK, CAIRO_COMMAND_STROKE, CAIRO_COMMAND_FILL, CAIRO_COMMAND_SHOW_GLYPHS, /* Other junk. For most of these, we should be able to assert that * they never get called except as part of fallbacks for the 5 * basic drawing operations (which we implement already so the * fallbacks should never get triggered). So the plan is to * eliminate as many of these as possible. */ CAIRO_COMMAND_INTERSECT_CLIP_PATH } cairo_command_type_t; typedef enum { CAIRO_META_REGION_ALL, CAIRO_META_REGION_NATIVE, CAIRO_META_REGION_IMAGE_FALLBACK } cairo_meta_region_type_t; typedef struct _cairo_command_header { cairo_command_type_t type; cairo_meta_region_type_t region; } cairo_command_header_t; typedef struct _cairo_command_paint { cairo_command_header_t header; cairo_operator_t op; cairo_pattern_union_t source; } cairo_command_paint_t; typedef struct _cairo_command_mask { cairo_command_header_t header; cairo_operator_t op; cairo_pattern_union_t source; cairo_pattern_union_t mask; } cairo_command_mask_t; typedef struct _cairo_command_stroke { cairo_command_header_t header; cairo_operator_t op; cairo_pattern_union_t source; cairo_path_fixed_t path; cairo_stroke_style_t style; cairo_matrix_t ctm; cairo_matrix_t ctm_inverse; double tolerance; cairo_antialias_t antialias; } cairo_command_stroke_t; typedef struct _cairo_command_fill { cairo_command_header_t header; cairo_operator_t op; cairo_pattern_union_t source; cairo_path_fixed_t path; cairo_fill_rule_t fill_rule; double tolerance; cairo_antialias_t antialias; } cairo_command_fill_t; typedef struct _cairo_command_show_glyphs { cairo_command_header_t header; cairo_operator_t op; cairo_pattern_union_t source; cairo_glyph_t *glyphs; unsigned int num_glyphs; cairo_scaled_font_t *scaled_font; } cairo_command_show_glyphs_t; typedef struct _cairo_command_intersect_clip_path { cairo_command_header_t header; cairo_path_fixed_t *path_pointer; cairo_path_fixed_t path; cairo_fill_rule_t fill_rule; double tolerance; cairo_antialias_t antialias; } cairo_command_intersect_clip_path_t; typedef union _cairo_command { cairo_command_header_t header; /* The 5 basic drawing operations. */ cairo_command_paint_t paint; cairo_command_mask_t mask; cairo_command_stroke_t stroke; cairo_command_fill_t fill; cairo_command_show_glyphs_t show_glyphs; /* The other junk. */ cairo_command_intersect_clip_path_t intersect_clip_path; } cairo_command_t; typedef struct _cairo_meta_surface { cairo_surface_t base; cairo_content_t content; /* A meta-surface is logically unbounded, but when used as a * source we need to render it to an image, so we need a size at * which to create that image. */ int width_pixels; int height_pixels; cairo_array_t commands; cairo_surface_t *commands_owner; cairo_bool_t is_clipped; int replay_start_idx; } cairo_meta_surface_t; cairo_private cairo_surface_t * _cairo_meta_surface_create (cairo_content_t content, int width_pixels, int height_pixels); cairo_private cairo_status_t _cairo_meta_surface_replay (cairo_surface_t *surface, cairo_surface_t *target); cairo_private cairo_status_t _cairo_meta_surface_replay_analyze_meta_pattern (cairo_surface_t *surface, cairo_surface_t *target); cairo_private cairo_status_t _cairo_meta_surface_replay_and_create_regions (cairo_surface_t *surface, cairo_surface_t *target); cairo_private cairo_status_t _cairo_meta_surface_replay_region (cairo_surface_t *surface, cairo_surface_t *target, cairo_meta_region_type_t region); cairo_private cairo_bool_t _cairo_surface_is_meta (const cairo_surface_t *surface); #endif /* CAIRO_META_SURFACE_H */ libgdiplus-2.11/cairo/src/test-paginated-surface.c0000664000175000017500000002447412225470167017126 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ /* This isn't a "real" surface, but just something to be used by the * test suite to help exercise the paginated-surface paths in cairo. * * The defining feature of this backend is that it uses a paginated * surface to record all operations, and then replays everything to an * image surface. * * It's possible that this code might serve as a good starting point * for someone working on bringing up a new paginated-surface-based * backend. */ #include "cairoint.h" #include "test-paginated-surface.h" #include "cairo-paginated-private.h" typedef struct _test_paginated_surface { cairo_surface_t base; cairo_surface_t *target; cairo_paginated_mode_t paginated_mode; } test_paginated_surface_t; static const cairo_surface_backend_t test_paginated_surface_backend; static const cairo_paginated_surface_backend_t test_paginated_surface_paginated_backend; cairo_surface_t * _cairo_test_paginated_surface_create_for_data (unsigned char *data, cairo_content_t content, int width, int height, int stride) { cairo_status_t status; cairo_surface_t *target; cairo_surface_t *paginated; test_paginated_surface_t *surface; target = _cairo_image_surface_create_for_data_with_content (data, content, width, height, stride); status = cairo_surface_status (target); if (status) return target; surface = malloc (sizeof (test_paginated_surface_t)); if (surface == NULL) { cairo_surface_destroy (target); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } _cairo_surface_init (&surface->base, &test_paginated_surface_backend, content); surface->target = target; paginated = _cairo_paginated_surface_create (&surface->base, content, width, height, &test_paginated_surface_paginated_backend); if (paginated->status) { cairo_surface_destroy (target); free (surface); } return paginated; } static cairo_status_t _test_paginated_surface_finish (void *abstract_surface) { test_paginated_surface_t *surface = abstract_surface; cairo_surface_destroy (surface->target); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _test_paginated_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { test_paginated_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; /* XXX: The whole surface backend clipping interface is a giant * disaster right now. In particular, its uncleanness shows up * when trying to implement one surface that wraps another one (as * we are doing here). * * Here are two of the problems that show up: * * 1. The most critical piece of information in all this stuff, * the "clip" isn't getting passed to the backend * functions. Instead the generic surface layer is caching that as * surface->clip. This is a problem for surfaces like this one * that do wrapping. Our base surface will have the clip set, but * our target's surface will not. * * 2. We're here in our backend's set_clip_region function, and we * want to call into our target surface's set_clip_region. * Generally, we would do this by calling an equivalent * _cairo_surface function, but _cairo_surface_set_clip_region * does not have the same signature/semantics, (it has the * clip_serial stuff as well). * * We kludge around each of these by manually copying the clip * object from our base surface into the target's base surface * (yuck!) and by reaching directly into the image surface's * set_clip_region instead of calling into the generic * _cairo_surface_set_clip_region (double yuck!). */ surface->target->clip = surface->base.clip; return _cairo_image_surface_set_clip_region (surface->target, region); } static cairo_int_status_t _test_paginated_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { test_paginated_surface_t *surface = abstract_surface; return _cairo_surface_get_extents (surface->target, rectangle); } static cairo_int_status_t _test_paginated_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { test_paginated_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; return _cairo_surface_paint (surface->target, op, source); } static cairo_int_status_t _test_paginated_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { test_paginated_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; return _cairo_surface_mask (surface->target, op, source, mask); } static cairo_int_status_t _test_paginated_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { test_paginated_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; return _cairo_surface_stroke (surface->target, op, source, path, style, ctm, ctm_inverse, tolerance, antialias); } static cairo_int_status_t _test_paginated_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { test_paginated_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; return _cairo_surface_fill (surface->target, op, source, path, fill_rule, tolerance, antialias); } static cairo_int_status_t _test_paginated_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { test_paginated_surface_t *surface = abstract_surface; cairo_int_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return CAIRO_STATUS_SUCCESS; /* Since this is a "wrapping" surface, we're calling back into * _cairo_surface_show_glyphs from within a call to the same. * Since _cairo_surface_show_glyphs acquires a mutex, we release * and re-acquire the mutex around this nested call. * * Yes, this is ugly, but we consider it pragmatic as compared to * adding locking code to all 18 surface-backend-specific * show_glyphs functions, (which would get less testing and likely * lead to bugs). */ CAIRO_MUTEX_UNLOCK (scaled_font->mutex); status = _cairo_surface_show_glyphs (surface->target, op, source, glyphs, num_glyphs, scaled_font); CAIRO_MUTEX_LOCK (scaled_font->mutex); return status; } static void _test_paginated_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t mode) { test_paginated_surface_t *surface = abstract_surface; surface->paginated_mode = mode; } static const cairo_surface_backend_t test_paginated_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED, /* Since we are a paginated user, we get to regard most of the * surface backend interface as historical cruft and ignore it. */ NULL, /* create_similar */ _test_paginated_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ _test_paginated_surface_set_clip_region, NULL, /* intersect_clip_path */ _test_paginated_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ /* Here is the more "modern" section of the surface backend * interface which is mostly just drawing functions */ _test_paginated_surface_paint, _test_paginated_surface_mask, _test_paginated_surface_stroke, _test_paginated_surface_fill, _test_paginated_surface_show_glyphs, NULL /* snapshot */ }; static const cairo_paginated_surface_backend_t test_paginated_surface_paginated_backend = { NULL, /* start_page */ _test_paginated_surface_set_paginated_mode }; libgdiplus-2.11/cairo/src/cairoint.h0000664000175000017500000021622612225470167014402 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ /* * These definitions are solely for use by the implementation of cairo * and constitute no kind of standard. If you need any of these * functions, please drop me a note. Either the library needs new * functionality, or there's a way to do what you need using the * existing published interfaces. cworth@cworth.org */ #ifndef _CAIROINT_H_ #define _CAIROINT_H_ #include "cairo-embed.h" #if HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #ifdef _MSC_VER #define _USE_MATH_DEFINES #endif #include #include #include #include "cairo.h" #include #include "cairo-compiler-private.h" CAIRO_BEGIN_DECLS #ifdef _WIN32 cairo_private FILE * _cairo_win32_tmpfile (void); #define tmpfile() _cairo_win32_tmpfile() #endif #undef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #undef MAX #define MAX(a, b) ((a) > (b) ? (a) : (b)) #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_SQRT2 #define M_SQRT2 1.41421356237309504880 #endif #ifndef M_SQRT1_2 #define M_SQRT1_2 0.707106781186547524400844362104849039 #endif #undef ARRAY_LENGTH #define ARRAY_LENGTH(__array) ((int) (sizeof (__array) / sizeof (__array[0]))) /* This has to be updated whenever #cairo_status_t is extended. That's * a bit of a pain, but it should be easy to always catch as long as * one adds a new test case to test a trigger of the new status value. */ #define CAIRO_STATUS_LAST_STATUS CAIRO_STATUS_INVALID_STRIDE /* Size in bytes of buffer to use off the stack per functions. * Mostly used by text functions. For larger allocations, they'll * malloc(). */ #ifndef CAIRO_STACK_BUFFER_SIZE #define CAIRO_STACK_BUFFER_SIZE (512 * sizeof (int)) #endif #define CAIRO_STACK_ARRAY_LENGTH(T) (CAIRO_STACK_BUFFER_SIZE / sizeof(T)) #define ASSERT_NOT_REACHED \ do { \ static const int NOT_REACHED = 0; \ assert (NOT_REACHED); \ } while (0) #define CAIRO_ALPHA_IS_OPAQUE(alpha) ((alpha) >= ((double)0xff00 / (double)0xffff)) #define CAIRO_ALPHA_SHORT_IS_OPAQUE(alpha) ((alpha) >= 0xff00) #define CAIRO_ALPHA_IS_ZERO(alpha) ((alpha) <= 0.0) #define CAIRO_COLOR_IS_OPAQUE(color) CAIRO_ALPHA_SHORT_IS_OPAQUE ((color)->alpha_short) /* Reverse the bits in a byte with 7 operations (no 64-bit): * Devised by Sean Anderson, July 13, 2001. * Source: http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits */ #define CAIRO_BITSWAP8(c) ((((c) * 0x0802LU & 0x22110LU) | ((c) * 0x8020LU & 0x88440LU)) * 0x10101LU >> 16) /* Return the number of 1 bits in mask. * * GCC 3.4 supports a "population count" builtin, which on many targets is * implemented with a single instruction. There is a fallback definition * in libgcc in case a target does not have one, which should be just as * good as the open-coded solution below, (which is "HACKMEM 169"). */ static inline int _cairo_popcount (uint32_t mask) { #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) return __builtin_popcount (mask); #else register int y; y = (mask >> 1) &033333333333; y = mask - y - ((y >>1) & 033333333333); return (((y + (y >> 3)) & 030707070707) % 077); #endif } #ifdef WORDS_BIGENDIAN #define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) (c) #else #define CAIRO_BITSWAP8_IF_LITTLE_ENDIAN(c) CAIRO_BITSWAP8(c) #endif #ifdef WORDS_BIGENDIAN #define cpu_to_be16(v) (v) #define be16_to_cpu(v) (v) #define cpu_to_be32(v) (v) #define be32_to_cpu(v) (v) #else static inline uint16_t cpu_to_be16(uint16_t v) { return (v << 8) | (v >> 8); } static inline uint16_t be16_to_cpu(uint16_t v) { return cpu_to_be16 (v); } static inline uint32_t cpu_to_be32(uint32_t v) { return (cpu_to_be16 (v) << 16) | cpu_to_be16 (v >> 16); } static inline uint32_t be32_to_cpu(uint32_t v) { return cpu_to_be32 (v); } #endif #include "cairo-types-private.h" #include "cairo-cache-private.h" #include "cairo-reference-count-private.h" cairo_private void _cairo_box_round_to_rectangle (cairo_box_t *box, cairo_rectangle_int_t *rectangle); cairo_private void _cairo_rectangle_intersect (cairo_rectangle_int_t *dest, cairo_rectangle_int_t *src); cairo_private cairo_bool_t _cairo_box_intersects_line_segment (cairo_box_t *box, cairo_line_t *line); cairo_private cairo_bool_t _cairo_box_contains_point (cairo_box_t *box, cairo_point_t *point); /* cairo_array.c structures and functions */ cairo_private void _cairo_array_init (cairo_array_t *array, int element_size); cairo_private void _cairo_array_init_snapshot (cairo_array_t *array, const cairo_array_t *other); cairo_private void _cairo_array_fini (cairo_array_t *array); cairo_private cairo_status_t _cairo_array_grow_by (cairo_array_t *array, unsigned int additional); cairo_private void _cairo_array_truncate (cairo_array_t *array, unsigned int num_elements); cairo_private cairo_status_t _cairo_array_append (cairo_array_t *array, const void *element); cairo_private cairo_status_t _cairo_array_append_multiple (cairo_array_t *array, const void *elements, int num_elements); cairo_private cairo_status_t _cairo_array_allocate (cairo_array_t *array, unsigned int num_elements, void **elements); cairo_private void * _cairo_array_index (cairo_array_t *array, unsigned int index); cairo_private void _cairo_array_copy_element (cairo_array_t *array, int index, void *dst); cairo_private int _cairo_array_num_elements (cairo_array_t *array); cairo_private int _cairo_array_size (cairo_array_t *array); cairo_private void _cairo_user_data_array_init (cairo_user_data_array_t *array); cairo_private void _cairo_user_data_array_fini (cairo_user_data_array_t *array); cairo_private void * _cairo_user_data_array_get_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key); cairo_private cairo_status_t _cairo_user_data_array_set_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); cairo_private unsigned long _cairo_hash_string (const char *c); typedef struct _cairo_unscaled_font_backend cairo_unscaled_font_backend_t; /* * A #cairo_unscaled_font_t is just an opaque handle we use in the * glyph cache. */ typedef struct _cairo_unscaled_font { cairo_hash_entry_t hash_entry; cairo_reference_count_t ref_count; const cairo_unscaled_font_backend_t *backend; } cairo_unscaled_font_t; typedef struct _cairo_scaled_glyph { cairo_cache_entry_t cache_entry; /* hash is glyph index */ cairo_scaled_font_t *scaled_font; /* font the glyph lives in */ cairo_text_extents_t metrics; /* user-space metrics */ cairo_box_t bbox; /* device-space bounds */ int16_t x_advance; /* device-space rounded X advance */ int16_t y_advance; /* device-space rounded Y advance */ cairo_image_surface_t *surface; /* device-space image */ cairo_path_fixed_t *path; /* device-space outline */ void *surface_private; /* for the surface backend */ } cairo_scaled_glyph_t; #define _cairo_scaled_glyph_index(g) ((g)->cache_entry.hash) #define _cairo_scaled_glyph_set_index(g,i) ((g)->cache_entry.hash = (i)) #include "cairo-scaled-font-private.h" struct _cairo_font_face { /* hash_entry must be first */ cairo_hash_entry_t hash_entry; cairo_status_t status; cairo_reference_count_t ref_count; cairo_user_data_array_t user_data; const cairo_font_face_backend_t *backend; }; cairo_private void _cairo_font_reset_static_data (void); cairo_private void _cairo_ft_font_reset_static_data (void); /* the font backend interface */ struct _cairo_unscaled_font_backend { void (*destroy) (void *unscaled_font); }; /* #cairo_toy_font_face_t - simple family/slant/weight font faces used for * the built-in font API */ typedef struct _cairo_toy_font_face { cairo_font_face_t base; const char *family; cairo_bool_t owns_family; cairo_font_slant_t slant; cairo_font_weight_t weight; } cairo_toy_font_face_t; typedef enum _cairo_scaled_glyph_info { CAIRO_SCALED_GLYPH_INFO_METRICS = (1 << 0), CAIRO_SCALED_GLYPH_INFO_SURFACE = (1 << 1), CAIRO_SCALED_GLYPH_INFO_PATH = (1 << 2) } cairo_scaled_glyph_info_t; typedef struct _cairo_scaled_font_subset { cairo_scaled_font_t *scaled_font; unsigned int font_id; unsigned int subset_id; /* Index of glyphs array is subset_glyph_index. * Value of glyphs array is scaled_font_glyph_index. */ unsigned long *glyphs; unsigned long *to_unicode; char **glyph_names; unsigned int num_glyphs; cairo_bool_t is_composite; } cairo_scaled_font_subset_t; struct _cairo_scaled_font_backend { cairo_font_type_t type; cairo_warn cairo_status_t (*create_toy) (cairo_toy_font_face_t *toy_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font); void (*fini) (void *scaled_font); cairo_warn cairo_int_status_t (*scaled_glyph_init) (void *scaled_font, cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_glyph_info_t info); /* A backend only needs to implement this or ucs4_to_index(), not * both. This allows the backend to do something more sophisticated * then just converting characters one by one. */ cairo_warn cairo_int_status_t (*text_to_glyphs) (void *scaled_font, double x, double y, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs); unsigned long (*ucs4_to_index) (void *scaled_font, uint32_t ucs4); cairo_warn cairo_int_status_t (*show_glyphs) (void *scaled_font, cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs); cairo_warn cairo_int_status_t (*load_truetype_table)(void *scaled_font, unsigned long tag, long offset, unsigned char *buffer, unsigned long *length); cairo_warn cairo_int_status_t (*map_glyphs_to_unicode)(void *scaled_font, cairo_scaled_font_subset_t *font_subset); }; struct _cairo_font_face_backend { cairo_font_type_t type; /* The destroy() function is allowed to resurrect the font face * by re-referencing. This is needed for the FreeType backend. */ void (*destroy) (void *font_face); cairo_warn cairo_status_t (*scaled_font_create) (void *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font); }; /* concrete font backends */ #if CAIRO_HAS_FT_FONT extern const cairo_private struct _cairo_scaled_font_backend cairo_ft_scaled_font_backend; #endif #if CAIRO_HAS_WIN32_FONT extern const cairo_private struct _cairo_scaled_font_backend cairo_win32_scaled_font_backend; #endif #if CAIRO_HAS_QUARTZ_FONT extern const cairo_private struct _cairo_scaled_font_backend cairo_quartz_scaled_font_backend; #endif struct _cairo_surface_backend { cairo_surface_type_t type; cairo_surface_t * (*create_similar) (void *surface, cairo_content_t content, int width, int height); cairo_warn cairo_status_t (*finish) (void *surface); cairo_warn cairo_status_t (*acquire_source_image) (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra); void (*release_source_image) (void *abstract_surface, cairo_image_surface_t *image, void *image_extra); cairo_warn cairo_status_t (*acquire_dest_image) (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra); void (*release_dest_image) (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra); /* Create a new surface (@clone_out) with the following * characteristics: * * 1. It is as compatible as possible with @surface (in terms of * efficiency) * * 2. It has the same size as @src * * 3. It has the same contents as @src within the given rectangle. */ cairo_warn cairo_status_t (*clone_similar) (void *surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out); /* XXX: dst should be the first argument for consistency */ cairo_warn cairo_int_status_t (*composite) (cairo_operator_t op, cairo_pattern_t *src, cairo_pattern_t *mask, void *dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); cairo_warn cairo_int_status_t (*fill_rectangles) (void *surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects); /* XXX: dst should be the first argument for consistency */ cairo_warn cairo_int_status_t (*composite_trapezoids) (cairo_operator_t op, cairo_pattern_t *pattern, void *dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps); cairo_warn cairo_int_status_t (*copy_page) (void *surface); cairo_warn cairo_int_status_t (*show_page) (void *surface); /* Set given region as the clip region for the surface, replacing * any previously set clip region. Passing in a NULL region will * clear the surface clip region. * * The surface is expected to store the clip region and clip all * following drawing operations against it until the clip region * is cleared of replaced by another clip region. * * Cairo will call this function whenever a clip path can be * represented as a device pixel aligned set of rectangles. When * this is not possible, cairo will use mask surfaces for * clipping. */ cairo_warn cairo_int_status_t (*set_clip_region) (void *surface, cairo_region_t *region); /* Intersect the given path against the clip path currently set in * the surface, using the given fill_rule and tolerance, and set * the result as the new clipping path for the surface. Passing * in a NULL path will clear the surface clipping path. * * The surface is expected to store the resulting clip path and * clip all following drawing operations against it until the clip * path cleared or intersected with a new path. * * If a surface implements this function, set_clip_region() will * never be called and should not be implemented. If this * function is not implemented cairo will use set_clip_region() * (if available) and mask surfaces for clipping. */ cairo_warn cairo_int_status_t (*intersect_clip_path) (void *dst, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias); /* Get the extents of the current surface. For many surface types * this will be as simple as { x=0, y=0, width=surface->width, * height=surface->height}. * * This function need not take account of any clipping from * set_clip_region since the generic version of set_clip_region * saves those, and the generic get_clip_extents will only call * into the specific surface->get_extents if there is no current * clip. */ cairo_warn cairo_int_status_t (*get_extents) (void *surface, cairo_rectangle_int_t *rectangle); /* * This is an optional entry to let the surface manage its own glyph * resources. If null, render against this surface, using image * surfaces as glyphs. */ cairo_warn cairo_int_status_t (*old_show_glyphs) (cairo_scaled_font_t *font, cairo_operator_t op, cairo_pattern_t *pattern, void *surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs); void (*get_font_options) (void *surface, cairo_font_options_t *options); cairo_warn cairo_status_t (*flush) (void *surface); cairo_warn cairo_status_t (*mark_dirty_rectangle) (void *surface, int x, int y, int width, int height); void (*scaled_font_fini) (cairo_scaled_font_t *scaled_font); void (*scaled_glyph_fini) (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font); /* OK, I'm starting over somewhat by defining the 5 top-level * drawing operators for the surface backend here with consistent * naming and argument-order conventions. */ cairo_warn cairo_int_status_t (*paint) (void *surface, cairo_operator_t op, cairo_pattern_t *source); cairo_warn cairo_int_status_t (*mask) (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask); cairo_warn cairo_int_status_t (*stroke) (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias); cairo_warn cairo_int_status_t (*fill) (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias); cairo_warn cairo_int_status_t (*show_glyphs) (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); cairo_surface_t * (*snapshot) (void *surface); cairo_bool_t (*is_similar) (void *surface_a, void *surface_b, cairo_content_t content); cairo_warn cairo_status_t (*reset) (void *surface); cairo_warn cairo_int_status_t (*fill_stroke) (void *surface, cairo_operator_t fill_op, cairo_pattern_t *fill_source, cairo_fill_rule_t fill_rule, double fill_tolerance, cairo_antialias_t fill_antialias, cairo_path_fixed_t *path, cairo_operator_t stroke_op, cairo_pattern_t *stroke_source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double stroke_tolerance, cairo_antialias_t stroke_antialias); }; #include "cairo-surface-private.h" struct _cairo_image_surface { cairo_surface_t base; pixman_format_code_t pixman_format; cairo_format_t format; unsigned char *data; cairo_bool_t owns_data; cairo_bool_t has_clip; cairo_image_transparency_t transparency; int width; int height; int stride; int depth; pixman_image_t *pixman_image; }; extern const cairo_private cairo_surface_backend_t cairo_image_surface_backend; /* XXX: Right now, the _cairo_color structure puts unpremultiplied color in the doubles and premultiplied color in the shorts. Yes, this is crazy insane, (but at least we don't export this madness). I'm still working on a cleaner API, but in the meantime, at least this does prevent precision loss in color when changing alpha. */ struct _cairo_color { double red; double green; double blue; double alpha; unsigned short red_short; unsigned short green_short; unsigned short blue_short; unsigned short alpha_short; }; #define CAIRO_EXTEND_SURFACE_DEFAULT CAIRO_EXTEND_NONE #define CAIRO_EXTEND_GRADIENT_DEFAULT CAIRO_EXTEND_PAD #define CAIRO_FILTER_DEFAULT CAIRO_FILTER_GOOD struct _cairo_pattern { cairo_pattern_type_t type; cairo_reference_count_t ref_count; cairo_status_t status; cairo_user_data_array_t user_data; cairo_matrix_t matrix; cairo_filter_t filter; cairo_extend_t extend; }; typedef struct _cairo_solid_pattern { cairo_pattern_t base; cairo_color_t color; cairo_content_t content; } cairo_solid_pattern_t; extern const cairo_private cairo_solid_pattern_t _cairo_pattern_nil; extern const cairo_private cairo_solid_pattern_t cairo_pattern_none; typedef struct _cairo_surface_pattern { cairo_pattern_t base; cairo_surface_t *surface; } cairo_surface_pattern_t; typedef struct _cairo_gradient_stop { double offset; cairo_color_t color; } cairo_gradient_stop_t; typedef struct _cairo_gradient_pattern { cairo_pattern_t base; unsigned int n_stops; unsigned int stops_size; cairo_gradient_stop_t *stops; cairo_gradient_stop_t stops_embedded[2]; } cairo_gradient_pattern_t; typedef struct _cairo_linear_pattern { cairo_gradient_pattern_t base; cairo_point_t p1; cairo_point_t p2; } cairo_linear_pattern_t; typedef struct _cairo_radial_pattern { cairo_gradient_pattern_t base; cairo_point_t c1; cairo_fixed_t r1; cairo_point_t c2; cairo_fixed_t r2; } cairo_radial_pattern_t; typedef union { cairo_gradient_pattern_t base; cairo_linear_pattern_t linear; cairo_radial_pattern_t radial; } cairo_gradient_pattern_union_t; typedef union { cairo_pattern_t base; cairo_solid_pattern_t solid; cairo_surface_pattern_t surface; cairo_gradient_pattern_union_t gradient; } cairo_pattern_union_t; typedef struct _cairo_surface_attributes { cairo_matrix_t matrix; cairo_extend_t extend; cairo_filter_t filter; int x_offset; int y_offset; cairo_bool_t acquired; void *extra; } cairo_surface_attributes_t; typedef struct _cairo_traps { cairo_status_t status; cairo_box_t extents; int num_traps; int traps_size; cairo_trapezoid_t *traps; cairo_trapezoid_t traps_embedded[1]; cairo_bool_t has_limits; cairo_box_t limits; } cairo_traps_t; #define CAIRO_FONT_SLANT_DEFAULT CAIRO_FONT_SLANT_NORMAL #define CAIRO_FONT_WEIGHT_DEFAULT CAIRO_FONT_WEIGHT_NORMAL #define CAIRO_WIN32_FONT_FAMILY_DEFAULT "Arial" #define CAIRO_QUARTZ_FONT_FAMILY_DEFAULT "Helvetica" #define CAIRO_FT_FONT_FAMILY_DEFAULT "" #if CAIRO_HAS_WIN32_FONT #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_WIN32_FONT_FAMILY_DEFAULT #define CAIRO_SCALED_FONT_BACKEND_DEFAULT &cairo_win32_scaled_font_backend #elif CAIRO_HAS_QUARTZ_FONT #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_QUARTZ_FONT_FAMILY_DEFAULT #define CAIRO_SCALED_FONT_BACKEND_DEFAULT &cairo_quartz_scaled_font_backend #elif CAIRO_HAS_FT_FONT #define CAIRO_FONT_FAMILY_DEFAULT CAIRO_FT_FONT_FAMILY_DEFAULT #define CAIRO_SCALED_FONT_BACKEND_DEFAULT &cairo_ft_scaled_font_backend #else /* Paranoia: this should have been caught by configure. */ #error No font backends are available. #endif #define CAIRO_GSTATE_OPERATOR_DEFAULT CAIRO_OPERATOR_OVER #define CAIRO_GSTATE_TOLERANCE_DEFAULT 0.1 #define CAIRO_GSTATE_FILL_RULE_DEFAULT CAIRO_FILL_RULE_WINDING #define CAIRO_GSTATE_LINE_WIDTH_DEFAULT 2.0 #define CAIRO_GSTATE_LINE_CAP_DEFAULT CAIRO_LINE_CAP_BUTT #define CAIRO_GSTATE_LINE_JOIN_DEFAULT CAIRO_LINE_JOIN_MITER #define CAIRO_GSTATE_MITER_LIMIT_DEFAULT 10.0 #define CAIRO_GSTATE_DEFAULT_FONT_SIZE 10.0 #define CAIRO_SURFACE_RESOLUTION_DEFAULT 72.0 #define CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT 300.0 typedef struct _cairo_gstate cairo_gstate_t; typedef struct _cairo_stroke_face { cairo_point_t ccw; cairo_point_t point; cairo_point_t cw; cairo_slope_t dev_vector; cairo_point_double_t usr_vector; } cairo_stroke_face_t; /* cairo.c */ cairo_private void _cairo_restrict_value (double *value, double min, double max); cairo_private int _cairo_lround (double d); /* cairo_gstate.c */ cairo_private cairo_status_t _cairo_gstate_init (cairo_gstate_t *gstate, cairo_surface_t *target); cairo_private void _cairo_gstate_fini (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_save (cairo_gstate_t **gstate); cairo_private cairo_status_t _cairo_gstate_restore (cairo_gstate_t **gstate); cairo_private cairo_bool_t _cairo_gstate_is_redirected (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_redirect_target (cairo_gstate_t *gstate, cairo_surface_t *child); cairo_private cairo_surface_t * _cairo_gstate_get_target (cairo_gstate_t *gstate); cairo_private cairo_surface_t * _cairo_gstate_get_parent_target (cairo_gstate_t *gstate); cairo_private cairo_surface_t * _cairo_gstate_get_original_target (cairo_gstate_t *gstate); cairo_private cairo_clip_t * _cairo_gstate_get_clip (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_source (cairo_gstate_t *gstate, cairo_pattern_t *source); cairo_private cairo_pattern_t * _cairo_gstate_get_source (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_operator (cairo_gstate_t *gstate, cairo_operator_t op); cairo_private cairo_operator_t _cairo_gstate_get_operator (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_tolerance (cairo_gstate_t *gstate, double tolerance); cairo_private double _cairo_gstate_get_tolerance (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule); cairo_private cairo_fill_rule_t _cairo_gstate_get_fill_rule (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width); cairo_private double _cairo_gstate_get_line_width (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap); cairo_private cairo_line_cap_t _cairo_gstate_get_line_cap (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join); cairo_private cairo_line_join_t _cairo_gstate_get_line_join (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_set_dash (cairo_gstate_t *gstate, const double *dash, int num_dashes, double offset); cairo_private void _cairo_gstate_get_dash (cairo_gstate_t *gstate, double *dash, int *num_dashes, double *offset); cairo_private cairo_status_t _cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit); cairo_private double _cairo_gstate_get_miter_limit (cairo_gstate_t *gstate); cairo_private void _cairo_gstate_get_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix); cairo_private cairo_status_t _cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty); cairo_private cairo_status_t _cairo_gstate_scale (cairo_gstate_t *gstate, double sx, double sy); cairo_private cairo_status_t _cairo_gstate_rotate (cairo_gstate_t *gstate, double angle); cairo_private cairo_status_t _cairo_gstate_transform (cairo_gstate_t *gstate, const cairo_matrix_t *matrix); cairo_private cairo_status_t _cairo_gstate_set_matrix (cairo_gstate_t *gstate, const cairo_matrix_t *matrix); cairo_private void _cairo_gstate_identity_matrix (cairo_gstate_t *gstate); cairo_private void _cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y); cairo_private void _cairo_gstate_user_to_device_distance (cairo_gstate_t *gstate, double *dx, double *dy); cairo_private void _cairo_gstate_device_to_user (cairo_gstate_t *gstate, double *x, double *y); cairo_private void _cairo_gstate_device_to_user_distance (cairo_gstate_t *gstate, double *dx, double *dy); cairo_private void _cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y); cairo_private void _cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y); cairo_private void _cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2, cairo_bool_t *is_tight); cairo_private cairo_status_t _cairo_gstate_path_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2); cairo_private cairo_status_t _cairo_gstate_paint (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_mask (cairo_gstate_t *gstate, cairo_pattern_t *mask); cairo_private cairo_status_t _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_gstate_copy_page (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_show_page (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_stroke_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2); cairo_private cairo_status_t _cairo_gstate_fill_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2); cairo_private cairo_status_t _cairo_gstate_in_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double x, double y, cairo_bool_t *inside_ret); cairo_private cairo_status_t _cairo_gstate_in_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double x, double y, cairo_bool_t *inside_ret); cairo_private cairo_status_t _cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_gstate_reset_clip (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_clip_extents (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2); cairo_private cairo_rectangle_list_t* _cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate); cairo_private cairo_status_t _cairo_gstate_show_surface (cairo_gstate_t *gstate, cairo_surface_t *surface, double x, double y, double width, double height); cairo_private cairo_status_t _cairo_gstate_select_font_face (cairo_gstate_t *gstate, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight); cairo_private cairo_status_t _cairo_gstate_set_font_size (cairo_gstate_t *gstate, double size); cairo_private void _cairo_gstate_get_font_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix); cairo_private cairo_status_t _cairo_gstate_set_font_matrix (cairo_gstate_t *gstate, const cairo_matrix_t *matrix); cairo_private void _cairo_gstate_get_font_options (cairo_gstate_t *gstate, cairo_font_options_t *options); cairo_private void _cairo_gstate_set_font_options (cairo_gstate_t *gstate, const cairo_font_options_t *options); cairo_private cairo_status_t _cairo_gstate_get_font_face (cairo_gstate_t *gstate, cairo_font_face_t **font_face); cairo_private cairo_status_t _cairo_gstate_get_scaled_font (cairo_gstate_t *gstate, cairo_scaled_font_t **scaled_font); cairo_private cairo_status_t _cairo_gstate_get_font_extents (cairo_gstate_t *gstate, cairo_font_extents_t *extents); cairo_private cairo_status_t _cairo_gstate_set_font_face (cairo_gstate_t *gstate, cairo_font_face_t *font_face); cairo_private cairo_status_t _cairo_gstate_text_to_glyphs (cairo_gstate_t *font, const char *utf8, double x, double y, cairo_glyph_t **glyphs, int *num_glyphs); cairo_private cairo_status_t _cairo_gstate_glyph_extents (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents); cairo_private cairo_status_t _cairo_gstate_show_glyphs (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs); cairo_private cairo_status_t _cairo_gstate_glyph_path (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_path_fixed_t *path); cairo_private cairo_bool_t _cairo_operator_bounded_by_mask (cairo_operator_t op); cairo_private cairo_bool_t _cairo_operator_bounded_by_source (cairo_operator_t op); /* cairo_color.c */ cairo_private const cairo_color_t * _cairo_stock_color (cairo_stock_t stock); #define CAIRO_COLOR_WHITE _cairo_stock_color (CAIRO_STOCK_WHITE) #define CAIRO_COLOR_BLACK _cairo_stock_color (CAIRO_STOCK_BLACK) #define CAIRO_COLOR_TRANSPARENT _cairo_stock_color (CAIRO_STOCK_TRANSPARENT) cairo_private uint16_t _cairo_color_double_to_short (double d); cairo_private void _cairo_color_init (cairo_color_t *color); cairo_private void _cairo_color_init_rgb (cairo_color_t *color, double red, double green, double blue); cairo_private void _cairo_color_init_rgba (cairo_color_t *color, double red, double green, double blue, double alpha); cairo_private void _cairo_color_multiply_alpha (cairo_color_t *color, double alpha); cairo_private void _cairo_color_get_rgba (cairo_color_t *color, double *red, double *green, double *blue, double *alpha); cairo_private void _cairo_color_get_rgba_premultiplied (cairo_color_t *color, double *red, double *green, double *blue, double *alpha); cairo_private cairo_bool_t _cairo_color_equal (const cairo_color_t *color_a, const cairo_color_t *color_b); /* cairo-font-face.c */ cairo_private void _cairo_scaled_font_freeze_cache (cairo_scaled_font_t *scaled_font); cairo_private void _cairo_scaled_font_thaw_cache (cairo_scaled_font_t *scaled_font); cairo_private void _cairo_scaled_font_reset_cache (cairo_scaled_font_t *scaled_font); cairo_private cairo_status_t _cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font, cairo_status_t status); cairo_private cairo_scaled_font_t * _cairo_scaled_font_create_in_error (cairo_status_t status); cairo_private void _cairo_scaled_font_reset_static_data (void); extern const cairo_private cairo_font_face_t _cairo_font_face_nil; cairo_private void _cairo_font_face_init (cairo_font_face_t *font_face, const cairo_font_face_backend_t *backend); cairo_private cairo_status_t _cairo_font_face_set_error (cairo_font_face_t *font_face, cairo_status_t status); cairo_private cairo_font_face_t * _cairo_toy_font_face_create (const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight); cairo_private void _cairo_unscaled_font_init (cairo_unscaled_font_t *font, const cairo_unscaled_font_backend_t *backend); cairo_private_no_warn cairo_unscaled_font_t * _cairo_unscaled_font_reference (cairo_unscaled_font_t *font); cairo_private void _cairo_unscaled_font_destroy (cairo_unscaled_font_t *font); /* cairo-font-options.c */ cairo_private void _cairo_font_options_init_default (cairo_font_options_t *options); cairo_private void _cairo_font_options_init_copy (cairo_font_options_t *options, const cairo_font_options_t *other); /* cairo_hull.c */ cairo_private cairo_status_t _cairo_hull_compute (cairo_pen_vertex_t *vertices, int *num_vertices); /* cairo-lzw.c */ cairo_private unsigned char * _cairo_lzw_compress (unsigned char *data, unsigned long *size_in_out); /* cairo_path.c */ cairo_private void _cairo_path_fixed_init (cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_path_fixed_init_copy (cairo_path_fixed_t *path, cairo_path_fixed_t *other); cairo_private cairo_bool_t _cairo_path_fixed_is_equal (cairo_path_fixed_t *path, cairo_path_fixed_t *other); cairo_private cairo_path_fixed_t * _cairo_path_fixed_create (void); cairo_private void _cairo_path_fixed_fini (cairo_path_fixed_t *path); cairo_private void _cairo_path_fixed_destroy (cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_path_fixed_move_to (cairo_path_fixed_t *path, cairo_fixed_t x, cairo_fixed_t y); cairo_private void _cairo_path_fixed_new_sub_path (cairo_path_fixed_t *path); cairo_private cairo_status_t _cairo_path_fixed_rel_move_to (cairo_path_fixed_t *path, cairo_fixed_t dx, cairo_fixed_t dy); cairo_private cairo_status_t _cairo_path_fixed_line_to (cairo_path_fixed_t *path, cairo_fixed_t x, cairo_fixed_t y); cairo_private cairo_status_t _cairo_path_fixed_rel_line_to (cairo_path_fixed_t *path, cairo_fixed_t dx, cairo_fixed_t dy); cairo_private cairo_status_t _cairo_path_fixed_curve_to (cairo_path_fixed_t *path, cairo_fixed_t x0, cairo_fixed_t y0, cairo_fixed_t x1, cairo_fixed_t y1, cairo_fixed_t x2, cairo_fixed_t y2); cairo_private cairo_status_t _cairo_path_fixed_rel_curve_to (cairo_path_fixed_t *path, cairo_fixed_t dx0, cairo_fixed_t dy0, cairo_fixed_t dx1, cairo_fixed_t dy1, cairo_fixed_t dx2, cairo_fixed_t dy2); cairo_private cairo_status_t _cairo_path_fixed_close_path (cairo_path_fixed_t *path); cairo_private cairo_bool_t _cairo_path_fixed_get_current_point (cairo_path_fixed_t *path, cairo_fixed_t *x, cairo_fixed_t *y); typedef cairo_status_t (cairo_path_fixed_move_to_func_t) (void *closure, cairo_point_t *point); typedef cairo_status_t (cairo_path_fixed_line_to_func_t) (void *closure, cairo_point_t *point); typedef cairo_status_t (cairo_path_fixed_curve_to_func_t) (void *closure, cairo_point_t *p0, cairo_point_t *p1, cairo_point_t *p2); typedef cairo_status_t (cairo_path_fixed_close_path_func_t) (void *closure); cairo_private cairo_status_t _cairo_path_fixed_interpret (cairo_path_fixed_t *path, cairo_direction_t dir, cairo_path_fixed_move_to_func_t *move_to, cairo_path_fixed_line_to_func_t *line_to, cairo_path_fixed_curve_to_func_t *curve_to, cairo_path_fixed_close_path_func_t *close_path, void *closure); cairo_private cairo_status_t _cairo_path_fixed_interpret_flat (cairo_path_fixed_t *path, cairo_direction_t dir, cairo_path_fixed_move_to_func_t *move_to, cairo_path_fixed_line_to_func_t *line_to, cairo_path_fixed_close_path_func_t *close_path, void *closure, double tolerance); cairo_private cairo_status_t _cairo_path_fixed_bounds (cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2, double tolerance); cairo_private void _cairo_path_fixed_device_transform (cairo_path_fixed_t *path, cairo_matrix_t *device_transform); cairo_private cairo_bool_t _cairo_path_fixed_is_empty (cairo_path_fixed_t *path); cairo_private cairo_bool_t _cairo_path_fixed_is_box (cairo_path_fixed_t *path, cairo_box_t *box); cairo_private cairo_bool_t _cairo_path_fixed_is_rectangle (cairo_path_fixed_t *path, cairo_box_t *box); /* cairo_path_fill.c */ cairo_private cairo_status_t _cairo_path_fixed_fill_to_traps (cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_traps_t *traps); /* cairo_path_stroke.c */ cairo_private cairo_status_t _cairo_path_fixed_stroke_to_traps (cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_traps_t *traps); /* cairo-scaled-font.c */ cairo_private cairo_status_t _cairo_scaled_font_init (cairo_scaled_font_t *scaled_font, cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, const cairo_scaled_font_backend_t *backend); cairo_private cairo_status_t _cairo_scaled_font_set_metrics (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *fs_metrics); cairo_private void _cairo_scaled_font_fini (cairo_scaled_font_t *scaled_font); cairo_private cairo_status_t _cairo_scaled_font_font_extents (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *extents); cairo_private cairo_status_t _cairo_scaled_font_text_to_glyphs (cairo_scaled_font_t *scaled_font, double x, double y, const char *utf8, cairo_glyph_t **glyphs, int *num_glyphs); cairo_private cairo_status_t _cairo_scaled_font_glyph_device_extents (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_rectangle_int_t *extents); cairo_private cairo_status_t _cairo_scaled_font_show_glyphs (cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_pattern_t *source, cairo_surface_t *surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs); cairo_private cairo_status_t _cairo_scaled_font_glyph_path (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_path_fixed_t *path); cairo_private void _cairo_scaled_glyph_set_metrics (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_text_extents_t *fs_metrics); cairo_private void _cairo_scaled_glyph_set_surface (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_image_surface_t *surface); cairo_private void _cairo_scaled_glyph_set_path (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font, cairo_path_fixed_t *path); cairo_private cairo_int_status_t _cairo_scaled_glyph_lookup (cairo_scaled_font_t *scaled_font, unsigned long index, cairo_scaled_glyph_info_t info, cairo_scaled_glyph_t **scaled_glyph_ret); cairo_private void _cairo_scaled_font_map_destroy (void); /* cairo-stroke-style.c */ cairo_private void _cairo_stroke_style_init (cairo_stroke_style_t *style); cairo_private cairo_status_t _cairo_stroke_style_init_copy (cairo_stroke_style_t *style, cairo_stroke_style_t *other); cairo_private void _cairo_stroke_style_fini (cairo_stroke_style_t *style); cairo_private void _cairo_stroke_style_max_distance_from_path (const cairo_stroke_style_t *style, const cairo_matrix_t *ctm, double *dx, double *dy); /* cairo-surface.c */ cairo_private cairo_surface_t * _cairo_surface_create_in_error (cairo_status_t status); cairo_private cairo_status_t _cairo_surface_set_error (cairo_surface_t *surface, cairo_status_t status); cairo_private void _cairo_surface_set_resolution (cairo_surface_t *surface, double x_res, double y_res); cairo_private cairo_surface_t * _cairo_surface_create_similar_scratch (cairo_surface_t *other, cairo_content_t content, int width, int height); /* Note: the color_pattern argument is optional - if provided it will reuse * that pattern instead of creating a very short-lived fresh solid pattern */ cairo_private cairo_surface_t * _cairo_surface_create_similar_solid (cairo_surface_t *other, cairo_content_t content, int width, int height, const cairo_color_t *color, cairo_pattern_t *color_pattern); cairo_private void _cairo_surface_init (cairo_surface_t *surface, const cairo_surface_backend_t *backend, cairo_content_t content); cairo_private void _cairo_surface_set_font_options (cairo_surface_t *surface, cairo_font_options_t *options); cairo_private cairo_clip_mode_t _cairo_surface_get_clip_mode (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_surface_composite (cairo_operator_t op, cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); cairo_private cairo_status_t _cairo_surface_fill_rectangle (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, int x, int y, int width, int height); cairo_private cairo_status_t _cairo_surface_fill_region (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_region_t *region); cairo_private cairo_status_t _cairo_surface_fill_rectangles (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects); cairo_private cairo_status_t _cairo_surface_paint (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source); cairo_private cairo_status_t _cairo_surface_mask (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask); cairo_private cairo_status_t _cairo_surface_fill_stroke (cairo_surface_t *surface, cairo_operator_t fill_op, cairo_pattern_t *fill_source, cairo_fill_rule_t fill_rule, double fill_tolerance, cairo_antialias_t fill_antialias, cairo_path_fixed_t *path, cairo_operator_t stroke_op, cairo_pattern_t *stroke_source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double stroke_tolerance, cairo_antialias_t stroke_antialias); cairo_private cairo_status_t _cairo_surface_stroke (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias); cairo_private cairo_status_t _cairo_surface_fill (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias); cairo_private cairo_status_t _cairo_surface_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); cairo_private cairo_status_t _cairo_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int ntraps); cairo_private cairo_status_t _cairo_surface_acquire_source_image (cairo_surface_t *surface, cairo_image_surface_t **image_out, void **image_extra); cairo_private void _cairo_surface_release_source_image (cairo_surface_t *surface, cairo_image_surface_t *image, void *image_extra); cairo_private cairo_status_t _cairo_surface_acquire_dest_image (cairo_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra); cairo_private void _cairo_surface_release_dest_image (cairo_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra); cairo_private cairo_status_t _cairo_surface_clone_similar (cairo_surface_t *surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out); cairo_private cairo_surface_t * _cairo_surface_snapshot (cairo_surface_t *surface); cairo_private cairo_bool_t _cairo_surface_is_similar (cairo_surface_t *surface_a, cairo_surface_t *surface_b, cairo_content_t content); cairo_private cairo_status_t _cairo_surface_reset (cairo_surface_t *surface); cairo_private unsigned int _cairo_surface_get_current_clip_serial (cairo_surface_t *surface); cairo_private unsigned int _cairo_surface_allocate_clip_serial (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_surface_reset_clip (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_surface_set_clip_region (cairo_surface_t *surface, cairo_region_t *region, unsigned int serial); cairo_private cairo_int_status_t _cairo_surface_intersect_clip_path (cairo_surface_t *surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias); cairo_private cairo_clip_t * _cairo_surface_get_clip (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_surface_set_clip (cairo_surface_t *surface, cairo_clip_t *clip); cairo_private cairo_status_t _cairo_surface_get_extents (cairo_surface_t *surface, cairo_rectangle_int_t *rectangle); cairo_private cairo_status_t _cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *surface, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs); cairo_private cairo_status_t _cairo_surface_composite_fixup_unbounded (cairo_surface_t *dst, cairo_surface_attributes_t *src_attr, int src_width, int src_height, cairo_surface_attributes_t *mask_attr, int mask_width, int mask_height, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); cairo_private cairo_status_t _cairo_surface_composite_shape_fixup_unbounded (cairo_surface_t *dst, cairo_surface_attributes_t *src_attr, int src_width, int src_height, int mask_width, int mask_height, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); cairo_private cairo_bool_t _cairo_surface_is_opaque (const cairo_surface_t *surface); cairo_private void _cairo_surface_set_device_scale (cairo_surface_t *surface, double sx, double sy); cairo_private cairo_bool_t _cairo_surface_has_device_transform (cairo_surface_t *surface); /* cairo_image_surface.c */ /* XXX: In cairo 1.2.0 we added a new %CAIRO_FORMAT_RGB16_565 but * neglected to adjust this macro. The net effect is that it's * impossible to externally create an image surface with this * format. This is perhaps a good thing since we also neglected to fix * up things like cairo_surface_write_to_png() for the new format * (-Wswitch-enum will tell you where). Is it obvious that format was * added in haste? * * The reason for the new format was to allow the xlib backend to be * used on X servers with a 565 visual. So the new format did its job * for that, even without being considered "valid" for the sake of * things like cairo_image_surface_create(). * * Since 1.2.0 we ran into the same situtation with X servers with BGR * visuals. This time we invented #cairo_internal_format_t instead, * (see it for more discussion). * * The punchline is that %CAIRO_FORMAT_VALID must not conside any * internal format to be valid. Also we need to decide if the * RGB16_565 should be moved to instead be an internal format. If so, * this macro need not change for it. (We probably will need to leave * an RGB16_565 value in the header files for the sake of code that * might have that value in it.) * * If we do decide to start fully supporting RGB16_565 as an external * format, then %CAIRO_FORMAT_VALID needs to be adjusted to include * it. But that should not happen before all necessary code is fixed * to support it (at least cairo_surface_write_to_png() and a few spots * in cairo-xlib-surface.c--again see -Wswitch-enum). */ #define CAIRO_FORMAT_INVALID ((unsigned int) -1) #define CAIRO_FORMAT_VALID(format) ((format) <= CAIRO_FORMAT_A1) /* pixman-required stride alignment in bytes. */ #define CAIRO_STRIDE_ALIGNMENT (sizeof (uint32_t)) #define CAIRO_STRIDE_FOR_WIDTH_BPP(w,bpp) \ (((bpp)*(w)+7)/8 + CAIRO_STRIDE_ALIGNMENT-1) & ~(CAIRO_STRIDE_ALIGNMENT-1) #define CAIRO_CONTENT_VALID(content) ((content) && \ (((content) & ~(CAIRO_CONTENT_COLOR | \ CAIRO_CONTENT_ALPHA | \ CAIRO_CONTENT_COLOR_ALPHA))\ == 0)) cairo_private int _cairo_format_bits_per_pixel (cairo_format_t format); cairo_private cairo_format_t _cairo_format_from_content (cairo_content_t content); cairo_private cairo_content_t _cairo_content_from_format (cairo_format_t format); cairo_private cairo_surface_t * _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, pixman_format_code_t pixman_format); cairo_private cairo_int_status_t _pixman_format_from_masks (cairo_format_masks_t *masks, pixman_format_code_t *format_ret); cairo_private void _pixman_format_to_masks (pixman_format_code_t pixman_format, cairo_format_masks_t *masks); cairo_private cairo_surface_t * _cairo_image_surface_create_with_pixman_format (unsigned char *data, pixman_format_code_t pixman_format, int width, int height, int stride); cairo_private cairo_surface_t * _cairo_image_surface_create_with_masks (unsigned char *data, cairo_format_masks_t *format, int width, int height, int stride); cairo_private cairo_surface_t * _cairo_image_surface_create_with_content (cairo_content_t content, int width, int height); cairo_private cairo_surface_t * _cairo_image_surface_create_for_data_with_content (unsigned char *data, cairo_content_t content, int width, int height, int stride); cairo_private void _cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface); /* XXX: It's a nasty kludge that this appears here. Backend functions * like this should really be static. But we're doing this to work * around some general defects in the backend clipping interfaces, * (see some notes in test-paginated-surface.c). * * I want to fix the real defects, but it's "hard" as they touch many * backends, so doing that will require synchronizing several backend * maintainers. */ cairo_private cairo_int_status_t _cairo_image_surface_set_clip_region (void *abstract_surface, cairo_region_t *region); cairo_private cairo_image_surface_t * _cairo_image_surface_clone (cairo_image_surface_t *surface, cairo_format_t format); cairo_private cairo_image_transparency_t _cairo_image_analyze_transparency (cairo_image_surface_t *image); cairo_private cairo_bool_t _cairo_surface_is_image (const cairo_surface_t *surface); cairo_private cairo_bool_t _cairo_surface_is_meta (const cairo_surface_t *surface); /* cairo_pen.c */ cairo_private cairo_status_t _cairo_pen_init (cairo_pen_t *pen, double radius, double tolerance, cairo_matrix_t *ctm); cairo_private void _cairo_pen_init_empty (cairo_pen_t *pen); cairo_private cairo_status_t _cairo_pen_init_copy (cairo_pen_t *pen, cairo_pen_t *other); cairo_private void _cairo_pen_fini (cairo_pen_t *pen); cairo_private cairo_status_t _cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points); cairo_private cairo_status_t _cairo_pen_add_points_for_slopes (cairo_pen_t *pen, cairo_point_t *a, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d); cairo_private void _cairo_pen_find_active_cw_vertex_index (cairo_pen_t *pen, cairo_slope_t *slope, int *active); cairo_private void _cairo_pen_find_active_ccw_vertex_index (cairo_pen_t *pen, cairo_slope_t *slope, int *active); cairo_private cairo_status_t _cairo_pen_stroke_spline (cairo_pen_t *pen, cairo_spline_t *spline, double tolerance, cairo_traps_t *traps); /* cairo_polygon.c */ cairo_private void _cairo_polygon_init (cairo_polygon_t *polygon); cairo_private void _cairo_polygon_fini (cairo_polygon_t *polygon); cairo_private cairo_status_t _cairo_polygon_status (cairo_polygon_t *polygon); cairo_private void _cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_point_t *p2); cairo_private void _cairo_polygon_move_to (cairo_polygon_t *polygon, cairo_point_t *point); cairo_private void _cairo_polygon_line_to (cairo_polygon_t *polygon, cairo_point_t *point); cairo_private void _cairo_polygon_close (cairo_polygon_t *polygon); /* cairo_spline.c */ cairo_private cairo_int_status_t _cairo_spline_init (cairo_spline_t *spline, const cairo_point_t *a, const cairo_point_t *b, const cairo_point_t *c, const cairo_point_t *d); cairo_private cairo_status_t _cairo_spline_decompose (cairo_spline_t *spline, double tolerance); cairo_private void _cairo_spline_fini (cairo_spline_t *spline); /* cairo_matrix.c */ cairo_private void _cairo_matrix_get_affine (const cairo_matrix_t *matrix, double *xx, double *yx, double *xy, double *yy, double *x0, double *y0); cairo_private void _cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix, double *x1, double *y1, double *x2, double *y2, cairo_bool_t *is_tight); cairo_private cairo_bool_t _cairo_matrix_is_invertible (const cairo_matrix_t *matrix); cairo_private void _cairo_matrix_compute_determinant (const cairo_matrix_t *matrix, double *det); cairo_private cairo_status_t _cairo_matrix_compute_scale_factors (const cairo_matrix_t *matrix, double *sx, double *sy, int x_major); cairo_private cairo_bool_t _cairo_matrix_is_identity (const cairo_matrix_t *matrix); cairo_private cairo_bool_t _cairo_matrix_is_translation (const cairo_matrix_t *matrix); cairo_private cairo_bool_t _cairo_matrix_is_integer_translation(const cairo_matrix_t *matrix, int *itx, int *ity); cairo_private double _cairo_matrix_transformed_circle_major_axis(cairo_matrix_t *matrix, double radius); cairo_private void _cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, pixman_transform_t *pixman_transform); /* cairo_traps.c */ cairo_private void _cairo_traps_init (cairo_traps_t *traps); cairo_private void _cairo_traps_limit (cairo_traps_t *traps, cairo_box_t *limits); cairo_private cairo_bool_t _cairo_traps_get_limit (cairo_traps_t *traps, cairo_box_t *limits); cairo_private cairo_status_t _cairo_traps_init_box (cairo_traps_t *traps, cairo_box_t *box); cairo_private void _cairo_traps_fini (cairo_traps_t *traps); cairo_private cairo_status_t _cairo_traps_status (cairo_traps_t *traps); cairo_private void _cairo_traps_translate (cairo_traps_t *traps, int x, int y); cairo_private cairo_status_t _cairo_traps_tessellate_triangle (cairo_traps_t *traps, cairo_point_t t[3]); cairo_private cairo_status_t _cairo_traps_tessellate_convex_quad (cairo_traps_t *traps, cairo_point_t q[4]); cairo_private cairo_status_t _cairo_traps_tessellate_polygon (cairo_traps_t *traps, cairo_polygon_t *poly, cairo_fill_rule_t fill_rule); cairo_private void _cairo_traps_add_trap_from_points (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom, cairo_point_t left_p1, cairo_point_t left_p2, cairo_point_t right_p1, cairo_point_t right_p2); cairo_private cairo_status_t _cairo_bentley_ottmann_tessellate_polygon (cairo_traps_t *traps, cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule); cairo_private int _cairo_traps_contain (cairo_traps_t *traps, double x, double y); cairo_private void _cairo_traps_extents (cairo_traps_t *traps, cairo_box_t *extents); cairo_private cairo_int_status_t _cairo_traps_extract_region (cairo_traps_t *tr, cairo_region_t *region); cairo_private void _cairo_trapezoid_array_translate_and_scale (cairo_trapezoid_t *offset_traps, cairo_trapezoid_t *src_traps, int num_traps, double tx, double ty, double sx, double sy); /* cairo_slope.c */ cairo_private void _cairo_slope_init (cairo_slope_t *slope, cairo_point_t *a, cairo_point_t *b); cairo_private int _cairo_slope_compare (cairo_slope_t *a, cairo_slope_t *b); /* cairo_pattern.c */ cairo_private cairo_status_t _cairo_pattern_create_copy (cairo_pattern_t **pattern, const cairo_pattern_t *other); cairo_private cairo_status_t _cairo_pattern_init_copy (cairo_pattern_t *pattern, const cairo_pattern_t *other); cairo_private void _cairo_pattern_init_solid (cairo_solid_pattern_t *pattern, const cairo_color_t *color, cairo_content_t content); cairo_private void _cairo_pattern_init_for_surface (cairo_surface_pattern_t *pattern, cairo_surface_t *surface); cairo_private void _cairo_pattern_init_linear (cairo_linear_pattern_t *pattern, double x0, double y0, double x1, double y1); cairo_private void _cairo_pattern_init_radial (cairo_radial_pattern_t *pattern, double cx0, double cy0, double radius0, double cx1, double cy1, double radius1); cairo_private void _cairo_pattern_fini (cairo_pattern_t *pattern); cairo_private cairo_pattern_t * _cairo_pattern_create_solid (const cairo_color_t *color, cairo_content_t content); cairo_private void _cairo_pattern_transform (cairo_pattern_t *pattern, const cairo_matrix_t *ctm_inverse); cairo_private cairo_bool_t _cairo_pattern_is_opaque_solid (const cairo_pattern_t *pattern); cairo_private cairo_bool_t _cairo_pattern_is_opaque (const cairo_pattern_t *abstract_pattern); cairo_private cairo_int_status_t _cairo_pattern_acquire_surface (cairo_pattern_t *pattern, cairo_surface_t *dst, int x, int y, unsigned int width, unsigned int height, cairo_surface_t **surface_out, cairo_surface_attributes_t *attributes); cairo_private void _cairo_pattern_release_surface (cairo_pattern_t *pattern, cairo_surface_t *surface, cairo_surface_attributes_t *attributes); cairo_private cairo_int_status_t _cairo_pattern_acquire_surfaces (cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, unsigned int width, unsigned int height, cairo_surface_t **src_out, cairo_surface_t **mask_out, cairo_surface_attributes_t *src_attributes, cairo_surface_attributes_t *mask_attributes); cairo_private cairo_status_t _cairo_pattern_get_extents (cairo_pattern_t *pattern, cairo_rectangle_int_t *extents); cairo_private void _cairo_pattern_reset_static_data (void); cairo_private cairo_status_t _cairo_gstate_set_antialias (cairo_gstate_t *gstate, cairo_antialias_t antialias); cairo_private cairo_antialias_t _cairo_gstate_get_antialias (cairo_gstate_t *gstate); /* cairo-region.c */ #include "cairo-region-private.h" /* cairo_unicode.c */ cairo_private cairo_status_t _cairo_utf8_to_ucs4 (const unsigned char *str, int len, uint32_t **result, int *items_written); #if CAIRO_HAS_WIN32_FONT+0 || CAIRO_HAS_QUARTZ_FONT+0 # define CAIRO_HAS_UTF8_TO_UTF16 1 #endif #if CAIRO_HAS_UTF8_TO_UTF16 cairo_private cairo_status_t _cairo_utf8_to_utf16 (const unsigned char *str, int len, uint16_t **result, int *items_written); #endif cairo_private cairo_status_t _cairo_error (cairo_status_t status); /* hide compiler warnings when discarding the return value */ #define _cairo_error_throw(status) do { \ cairo_status_t status__ = _cairo_error (status); \ (void) status__; \ } while (0) /* Avoid unnecessary PLT entries. */ slim_hidden_proto (cairo_clip_preserve); slim_hidden_proto (cairo_close_path); slim_hidden_proto (cairo_create); slim_hidden_proto (cairo_curve_to); slim_hidden_proto (cairo_destroy); slim_hidden_proto (cairo_fill_preserve); slim_hidden_proto (cairo_font_face_destroy); slim_hidden_proto_no_warn (cairo_font_face_reference); slim_hidden_proto (cairo_font_options_create); slim_hidden_proto (cairo_font_options_destroy); slim_hidden_proto (cairo_font_options_equal); slim_hidden_proto (cairo_font_options_hash); slim_hidden_proto (cairo_font_options_merge); slim_hidden_proto (cairo_font_options_set_antialias); slim_hidden_proto (cairo_font_options_set_hint_metrics); slim_hidden_proto (cairo_font_options_set_hint_style); slim_hidden_proto (cairo_font_options_set_subpixel_order); slim_hidden_proto (cairo_font_options_status); slim_hidden_proto (cairo_get_current_point); slim_hidden_proto (cairo_get_matrix); slim_hidden_proto (cairo_get_tolerance); slim_hidden_proto (cairo_image_surface_create); slim_hidden_proto (cairo_image_surface_create_for_data); slim_hidden_proto (cairo_image_surface_get_data); slim_hidden_proto (cairo_image_surface_get_height); slim_hidden_proto (cairo_image_surface_get_stride); slim_hidden_proto (cairo_image_surface_get_width); slim_hidden_proto (cairo_format_stride_for_width); slim_hidden_proto (cairo_line_to); slim_hidden_proto (cairo_mask); slim_hidden_proto (cairo_matrix_init); slim_hidden_proto (cairo_matrix_init_identity); slim_hidden_proto (cairo_matrix_init_rotate); slim_hidden_proto (cairo_matrix_init_scale); slim_hidden_proto (cairo_matrix_init_translate); slim_hidden_proto (cairo_matrix_invert); slim_hidden_proto (cairo_matrix_multiply); slim_hidden_proto (cairo_matrix_scale); slim_hidden_proto (cairo_matrix_transform_distance); slim_hidden_proto (cairo_matrix_transform_point); slim_hidden_proto (cairo_matrix_translate); slim_hidden_proto (cairo_move_to); slim_hidden_proto (cairo_new_path); slim_hidden_proto (cairo_paint); slim_hidden_proto (cairo_path_extents); slim_hidden_proto (cairo_pattern_create_for_surface); slim_hidden_proto (cairo_pattern_create_rgb); slim_hidden_proto (cairo_pattern_create_rgba); slim_hidden_proto (cairo_pattern_destroy); slim_hidden_proto (cairo_pattern_get_extend); slim_hidden_proto (cairo_pattern_get_type); slim_hidden_proto_no_warn (cairo_pattern_reference); slim_hidden_proto (cairo_pattern_set_matrix); slim_hidden_proto (cairo_pattern_status); slim_hidden_proto (cairo_pop_group); slim_hidden_proto (cairo_pop_group_to_source); slim_hidden_proto (cairo_push_group); slim_hidden_proto (cairo_push_group_with_content); slim_hidden_proto (cairo_rel_line_to); slim_hidden_proto (cairo_restore); slim_hidden_proto (cairo_save); slim_hidden_proto (cairo_scale); slim_hidden_proto (cairo_scaled_font_create); slim_hidden_proto (cairo_scaled_font_destroy); slim_hidden_proto (cairo_scaled_font_extents); slim_hidden_proto (cairo_scaled_font_get_ctm); slim_hidden_proto (cairo_scaled_font_get_font_face); slim_hidden_proto (cairo_scaled_font_get_font_matrix); slim_hidden_proto (cairo_scaled_font_get_font_options); slim_hidden_proto (cairo_scaled_font_glyph_extents); slim_hidden_proto_no_warn (cairo_scaled_font_reference); slim_hidden_proto (cairo_scaled_font_status); slim_hidden_proto (cairo_set_operator); slim_hidden_proto (cairo_set_source); slim_hidden_proto (cairo_set_source_surface); slim_hidden_proto (cairo_status); slim_hidden_proto (cairo_stroke_preserve); slim_hidden_proto (cairo_surface_create_similar); slim_hidden_proto (cairo_surface_destroy); slim_hidden_proto (cairo_surface_finish); slim_hidden_proto (cairo_surface_get_content); slim_hidden_proto (cairo_surface_get_device_offset); slim_hidden_proto (cairo_surface_get_font_options); slim_hidden_proto (cairo_surface_get_type); slim_hidden_proto (cairo_surface_mark_dirty_rectangle); slim_hidden_proto_no_warn (cairo_surface_reference); slim_hidden_proto (cairo_surface_set_device_offset); slim_hidden_proto (cairo_surface_set_fallback_resolution); slim_hidden_proto (cairo_surface_copy_page); slim_hidden_proto (cairo_surface_show_page); slim_hidden_proto (cairo_surface_status); slim_hidden_proto (cairo_version_string); #if CAIRO_HAS_PNG_FUNCTIONS slim_hidden_proto (cairo_surface_write_to_png_stream); #endif CAIRO_END_DECLS #include "cairo-mutex-private.h" #include "cairo-fixed-private.h" #include "cairo-wideint-private.h" #include "cairo-malloc-private.h" #include "cairo-hash-private.h" #endif libgdiplus-2.11/cairo/src/cairo-freelist.c0000664000175000017500000000437712225470167015477 00000000000000/* * Copyright © 2006 Joonas Pihlaja * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "cairoint.h" #include "cairo-freelist-private.h" void _cairo_freelist_init (cairo_freelist_t *freelist, unsigned nodesize) { memset (freelist, 0, sizeof(cairo_freelist_t)); freelist->nodesize = nodesize; } void _cairo_freelist_fini (cairo_freelist_t *freelist) { cairo_freelist_node_t *node = freelist->first_free_node; while (node) { cairo_freelist_node_t *next = node->next; free (node); node = next; } } void * _cairo_freelist_alloc (cairo_freelist_t *freelist) { if (freelist->first_free_node) { cairo_freelist_node_t *node = freelist->first_free_node; freelist->first_free_node = node->next; return (void*)node; } return malloc (freelist->nodesize); } void * _cairo_freelist_calloc (cairo_freelist_t *freelist) { void *node = _cairo_freelist_alloc (freelist); if (node) memset (node, 0, freelist->nodesize); return node; } void _cairo_freelist_free (cairo_freelist_t *freelist, void *voidnode) { cairo_freelist_node_t *node = voidnode; if (node) { node->next = freelist->first_free_node; freelist->first_free_node = node; } } libgdiplus-2.11/cairo/src/cairo-xlib-xrender-private.h0000664000175000017500000006275012225470167017741 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. */ #ifndef CAIRO_XLIB_XRENDER_PRIVATE_H #define CAIRO_XLIB_XRENDER_PRIVATE_H #if CAIRO_HAS_XLIB_XRENDER_SURFACE #include "cairo-xlib-xrender.h" #include #include #else /* !CAIRO_HAS_XLIB_XRENDER_SURFACE */ /* Provide dummy symbols and macros to get it compile and take the fallback * route, just like as if Xrender is not available in the server at run-time. */ /* Functions */ #define CONSUME(a) +(((void)(a)),0) #define CONSUME2(a,b) CONSUME((a,b)) #define CONSUME3(a,b,c) CONSUME((a,b,c)) #define CONSUME4(a,b,c,d) CONSUME((a,b,c,d)) #define CONSUME5(a,b,c,d,e) CONSUME((a,b,c,d,e)) #define CONSUME6(a,b,c,d,e,f) CONSUME((a,b,c,d,e,f)) #define CONSUME7(a,b,c,d,e,f,g) CONSUME((a,b,c,d,e,f,g)) #define CONSUME8(a,b,c,d,e,f,g,h) CONSUME((a,b,c,d,e,f,g,h)) #define CONSUME9(a,b,c,d,e,f,g,h,i) CONSUME((a,b,c,d,e,f,g,h,i)) #define CONSUME10(a,b,c,d,e,f,g,h,i,j) CONSUME((a,b,c,d,e,f,g,h,i,j)) #define CONSUME11(a,b,c,d,e,f,g,h,i,j,k) CONSUME((a,b,c,d,e,f,g,h,i,j,k)) #define CONSUME12(a,b,c,d,e,f,g,h,i,j,k,l) CONSUME((a,b,c,d,e,f,g,h,i,j,k,l)) #define CONSUME13(a,b,c,d,e,f,g,h,i,j,k,l,m) CONSUME((a,b,c,d,e,f,g,h,i,j,k,l,m)) /* for when functions are not called */ static void (CONSUME2)() {} static void (CONSUME4)() {} static void (CONSUME11)() {} #define XRenderQueryExtension 0 CONSUME3 #define XRenderQueryVersion 0 CONSUME3 #define XRenderQueryFormats 0 CONSUME1 #define XRenderQuerySubpixelOrder 0 CONSUME2 #define XRenderSetSubpixelOrder 0 CONSUME3 #define XRenderFindVisualFormat NULL CONSUME2 #define XRenderFindFormat NULL CONSUME4 #define XRenderFindStandardFormat NULL CONSUME2 #define XRenderQueryPictIndexValues NULL CONSUME2 #define XRenderCreatePicture 0 CONSUME5 #define XRenderChangePicture CONSUME4 #define XRenderSetPictureClipRectangles CONSUME6 #define XRenderSetPictureClipRegion CONSUME3 #define XRenderSetPictureTransform CONSUME3 #define XRenderFreePicture CONSUME2 #define XRenderComposite CONSUME13 #define XRenderCreateGlyphSet 0 CONSUME2 #define XRenderReferenceGlyphSet 0 CONSUME2 #define XRenderFreeGlyphSet CONSUME2 #define XRenderAddGlyphs CONSUME7 #define XRenderFreeGlyphs CONSUME4 #define XRenderCompositeString8 CONSUME12 #define XRenderCompositeString16 CONSUME12 #define XRenderCompositeString32 CONSUME12 #define XRenderCompositeText8 CONSUME11 #define XRenderCompositeText16 CONSUME11 #define XRenderCompositeText32 CONSUME11 #define XRenderFillRectangle CONSUME8 #define XRenderFillRectangles CONSUME6 #define XRenderCompositeTrapezoids CONSUME9 #define XRenderCompositeTriangles CONSUME9 #define XRenderCompositeTriStrip CONSUME9 #define XRenderCompositeTriFan CONSUME9 #define XRenderCompositeDoublePoly CONSUME12 #define XRenderParseColor 0 CONSUME3 #define XRenderCreateCursor 0 CONSUME4 #define XRenderQueryFilters NULL CONSUME2 #define XRenderSetPictureFilter CONSUME5 #define XRenderCreateAnimCursor 0 CONSUME3 #define XRenderAddTraps CONSUME6 #define XRenderCreateSolidFill 0 CONSUME2 #define XRenderCreateLinearGradient 0 CONSUME5 #define XRenderCreateRadialGradient 0 CONSUME5 #define XRenderCreateConicalGradient 0 CONSUME5 #define cairo_xlib_surface_create_with_xrender_format NULL CONSUME6 /* The rest of this file is copied from various Xrender header files, with * the following copyright/license information: * * Copyright © 2000 SuSE, Inc. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of SuSE not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. SuSE makes no representations about the * suitability of this software for any purpose. It is provided "as is" * without express or implied warranty. * * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * * Author: Keith Packard, SuSE, Inc. */ /* Copied from X11/extensions/render.h */ typedef unsigned long Glyph; typedef unsigned long GlyphSet; typedef unsigned long Picture; typedef unsigned long PictFormat; #define BadPictFormat 0 #define BadPicture 1 #define BadPictOp 2 #define BadGlyphSet 3 #define BadGlyph 4 #define RenderNumberErrors (BadGlyph+1) #define PictTypeIndexed 0 #define PictTypeDirect 1 #define PictOpMinimum 0 #define PictOpClear 0 #define PictOpSrc 1 #define PictOpDst 2 #define PictOpOver 3 #define PictOpOverReverse 4 #define PictOpIn 5 #define PictOpInReverse 6 #define PictOpOut 7 #define PictOpOutReverse 8 #define PictOpAtop 9 #define PictOpAtopReverse 10 #define PictOpXor 11 #define PictOpAdd 12 #define PictOpSaturate 13 #define PictOpMaximum 13 /* * Operators only available in version 0.2 */ #define PictOpDisjointMinimum 0x10 #define PictOpDisjointClear 0x10 #define PictOpDisjointSrc 0x11 #define PictOpDisjointDst 0x12 #define PictOpDisjointOver 0x13 #define PictOpDisjointOverReverse 0x14 #define PictOpDisjointIn 0x15 #define PictOpDisjointInReverse 0x16 #define PictOpDisjointOut 0x17 #define PictOpDisjointOutReverse 0x18 #define PictOpDisjointAtop 0x19 #define PictOpDisjointAtopReverse 0x1a #define PictOpDisjointXor 0x1b #define PictOpDisjointMaximum 0x1b #define PictOpConjointMinimum 0x20 #define PictOpConjointClear 0x20 #define PictOpConjointSrc 0x21 #define PictOpConjointDst 0x22 #define PictOpConjointOver 0x23 #define PictOpConjointOverReverse 0x24 #define PictOpConjointIn 0x25 #define PictOpConjointInReverse 0x26 #define PictOpConjointOut 0x27 #define PictOpConjointOutReverse 0x28 #define PictOpConjointAtop 0x29 #define PictOpConjointAtopReverse 0x2a #define PictOpConjointXor 0x2b #define PictOpConjointMaximum 0x2b #define PolyEdgeSharp 0 #define PolyEdgeSmooth 1 #define PolyModePrecise 0 #define PolyModeImprecise 1 #define CPRepeat (1 << 0) #define CPAlphaMap (1 << 1) #define CPAlphaXOrigin (1 << 2) #define CPAlphaYOrigin (1 << 3) #define CPClipXOrigin (1 << 4) #define CPClipYOrigin (1 << 5) #define CPClipMask (1 << 6) #define CPGraphicsExposure (1 << 7) #define CPSubwindowMode (1 << 8) #define CPPolyEdge (1 << 9) #define CPPolyMode (1 << 10) #define CPDither (1 << 11) #define CPComponentAlpha (1 << 12) #define CPLastBit 12 /* Filters included in 0.6 */ #define FilterNearest "nearest" #define FilterBilinear "bilinear" /* Filters included in 0.10 */ #define FilterConvolution "convolution" #define FilterFast "fast" #define FilterGood "good" #define FilterBest "best" #define FilterAliasNone -1 /* Subpixel orders included in 0.6 */ #define SubPixelUnknown 0 #define SubPixelHorizontalRGB 1 #define SubPixelHorizontalBGR 2 #define SubPixelVerticalRGB 3 #define SubPixelVerticalBGR 4 #define SubPixelNone 5 /* Extended repeat attributes included in 0.10 */ #define RepeatNone 0 #define RepeatNormal 1 #define RepeatPad 2 #define RepeatReflect 3 /* Copied from X11/extensions/Xrender.h */ typedef struct { short red; short redMask; short green; short greenMask; short blue; short blueMask; short alpha; short alphaMask; } XRenderDirectFormat; typedef struct { PictFormat id; int type; int depth; XRenderDirectFormat direct; Colormap colormap; } XRenderPictFormat; #define PictFormatID (1 << 0) #define PictFormatType (1 << 1) #define PictFormatDepth (1 << 2) #define PictFormatRed (1 << 3) #define PictFormatRedMask (1 << 4) #define PictFormatGreen (1 << 5) #define PictFormatGreenMask (1 << 6) #define PictFormatBlue (1 << 7) #define PictFormatBlueMask (1 << 8) #define PictFormatAlpha (1 << 9) #define PictFormatAlphaMask (1 << 10) #define PictFormatColormap (1 << 11) typedef struct _XRenderPictureAttributes { int repeat; Picture alpha_map; int alpha_x_origin; int alpha_y_origin; int clip_x_origin; int clip_y_origin; Pixmap clip_mask; Bool graphics_exposures; int subwindow_mode; int poly_edge; int poly_mode; Atom dither; Bool component_alpha; } XRenderPictureAttributes; typedef struct { unsigned short red; unsigned short green; unsigned short blue; unsigned short alpha; } XRenderColor; typedef struct _XGlyphInfo { unsigned short width; unsigned short height; short x; short y; short xOff; short yOff; } XGlyphInfo; typedef struct _XGlyphElt8 { GlyphSet glyphset; _Xconst char *chars; int nchars; int xOff; int yOff; } XGlyphElt8; typedef struct _XGlyphElt16 { GlyphSet glyphset; _Xconst unsigned short *chars; int nchars; int xOff; int yOff; } XGlyphElt16; typedef struct _XGlyphElt32 { GlyphSet glyphset; _Xconst unsigned int *chars; int nchars; int xOff; int yOff; } XGlyphElt32; typedef double XDouble; typedef struct _XPointDouble { XDouble x, y; } XPointDouble; #define XDoubleToFixed(f) ((XFixed) ((f) * 65536)) #define XFixedToDouble(f) (((XDouble) (f)) / 65536) typedef int XFixed; typedef struct _XPointFixed { XFixed x, y; } XPointFixed; typedef struct _XLineFixed { XPointFixed p1, p2; } XLineFixed; typedef struct _XTriangle { XPointFixed p1, p2, p3; } XTriangle; typedef struct _XCircle { XFixed x; XFixed y; XFixed radius; } XCircle; typedef struct _XTrapezoid { XFixed top, bottom; XLineFixed left, right; } XTrapezoid; typedef struct _XTransform { XFixed matrix[3][3]; } XTransform; typedef struct _XFilters { int nfilter; char **filter; int nalias; short *alias; } XFilters; typedef struct _XIndexValue { unsigned long pixel; unsigned short red, green, blue, alpha; } XIndexValue; typedef struct _XAnimCursor { Cursor cursor; unsigned long delay; } XAnimCursor; typedef struct _XSpanFix { XFixed left, right, y; } XSpanFix; typedef struct _XTrap { XSpanFix top, bottom; } XTrap; typedef struct _XLinearGradient { XPointFixed p1; XPointFixed p2; } XLinearGradient; typedef struct _XRadialGradient { XCircle inner; XCircle outer; } XRadialGradient; typedef struct _XConicalGradient { XPointFixed center; XFixed angle; /* in degrees */ } XConicalGradient; #define PictStandardARGB32 0 #define PictStandardRGB24 1 #define PictStandardA8 2 #define PictStandardA4 3 #define PictStandardA1 4 #define PictStandardNUM 5 /* Copied from X11/extensions/renderproto.h */ #include #define Window CARD32 #define Drawable CARD32 #define Font CARD32 #define Pixmap CARD32 #define Cursor CARD32 #define Colormap CARD32 #define GContext CARD32 #define Atom CARD32 #define VisualID CARD32 #define Time CARD32 #define KeyCode CARD8 #define KeySym CARD32 #define Picture CARD32 #define PictFormat CARD32 #define Fixed INT32 #define Glyphset CARD32 #define Glyph CARD32 /* * data structures */ typedef struct { CARD16 red B16; CARD16 redMask B16; CARD16 green B16; CARD16 greenMask B16; CARD16 blue B16; CARD16 blueMask B16; CARD16 alpha B16; CARD16 alphaMask B16; } xDirectFormat; #define sz_xDirectFormat 16 typedef struct { PictFormat id B32; CARD8 type; CARD8 depth; CARD16 pad1 B16; xDirectFormat direct; Colormap colormap; } xPictFormInfo; #define sz_xPictFormInfo 28 typedef struct { VisualID visual; PictFormat format; } xPictVisual; #define sz_xPictVisual 8 typedef struct { CARD8 depth; CARD8 pad1; CARD16 nPictVisuals B16; CARD32 pad2 B32; } xPictDepth; #define sz_xPictDepth 8 typedef struct { CARD32 nDepth B32; PictFormat fallback B32; } xPictScreen; #define sz_xPictScreen 8 typedef struct { CARD32 pixel B32; CARD16 red B16; CARD16 green B16; CARD16 blue B16; CARD16 alpha B16; } xIndexValue; #define sz_xIndexValue 12 typedef struct { CARD16 red B16; CARD16 green B16; CARD16 blue B16; CARD16 alpha B16; } xRenderColor; #define sz_xRenderColor 8 typedef struct { Fixed x B32; Fixed y B32; } xPointFixed; #define sz_xPointFixed 8 typedef struct { xPointFixed p1; xPointFixed p2; } xLineFixed; #define sz_xLineFixed 16 typedef struct { xPointFixed p1, p2, p3; } xTriangle; #define sz_xTriangle 24 typedef struct { Fixed top B32; Fixed bottom B32; xLineFixed left; xLineFixed right; } xTrapezoid; #define sz_xTrapezoid 40 typedef struct { CARD16 width B16; CARD16 height B16; INT16 x B16; INT16 y B16; INT16 xOff B16; INT16 yOff B16; } xGlyphInfo; #define sz_xGlyphInfo 12 typedef struct { CARD8 len; CARD8 pad1; CARD16 pad2; INT16 deltax; INT16 deltay; } xGlyphElt; #define sz_xGlyphElt 8 typedef struct { Fixed l, r, y; } xSpanFix; #define sz_xSpanFix 12 typedef struct { xSpanFix top, bot; } xTrap; #define sz_xTrap 24 /* * requests and replies */ typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD32 majorVersion B32; CARD32 minorVersion B32; } xRenderQueryVersionReq; #define sz_xRenderQueryVersionReq 12 typedef struct { BYTE type; /* X_Reply */ BYTE pad1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 majorVersion B32; CARD32 minorVersion B32; CARD32 pad2 B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; } xRenderQueryVersionReply; #define sz_xRenderQueryVersionReply 32 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; } xRenderQueryPictFormatsReq; #define sz_xRenderQueryPictFormatsReq 4 typedef struct { BYTE type; /* X_Reply */ BYTE pad1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 numFormats B32; CARD32 numScreens B32; CARD32 numDepths B32; CARD32 numVisuals B32; CARD32 numSubpixel B32; /* Version 0.6 */ CARD32 pad5 B32; } xRenderQueryPictFormatsReply; #define sz_xRenderQueryPictFormatsReply 32 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; PictFormat format B32; } xRenderQueryPictIndexValuesReq; #define sz_xRenderQueryPictIndexValuesReq 8 typedef struct { BYTE type; /* X_Reply */ BYTE pad1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 numIndexValues; CARD32 pad2 B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; CARD32 pad6 B32; } xRenderQueryPictIndexValuesReply; #define sz_xRenderQueryPictIndexValuesReply 32 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture pid B32; Drawable drawable B32; PictFormat format B32; CARD32 mask B32; } xRenderCreatePictureReq; #define sz_xRenderCreatePictureReq 20 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture B32; CARD32 mask B32; } xRenderChangePictureReq; #define sz_xRenderChangePictureReq 12 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture B32; INT16 xOrigin B16; INT16 yOrigin B16; } xRenderSetPictureClipRectanglesReq; #define sz_xRenderSetPictureClipRectanglesReq 12 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture B32; } xRenderFreePictureReq; #define sz_xRenderFreePictureReq 8 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture mask B32; Picture dst B32; INT16 xSrc B16; INT16 ySrc B16; INT16 xMask B16; INT16 yMask B16; INT16 xDst B16; INT16 yDst B16; CARD16 width B16; CARD16 height B16; } xRenderCompositeReq; #define sz_xRenderCompositeReq 36 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture src B32; Picture dst B32; CARD32 colorScale B32; CARD32 alphaScale B32; INT16 xSrc B16; INT16 ySrc B16; INT16 xDst B16; INT16 yDst B16; CARD16 width B16; CARD16 height B16; } xRenderScaleReq; #define sz_xRenderScaleReq 32 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture dst B32; PictFormat maskFormat B32; INT16 xSrc B16; INT16 ySrc B16; } xRenderTrapezoidsReq; #define sz_xRenderTrapezoidsReq 24 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture dst B32; PictFormat maskFormat B32; INT16 xSrc B16; INT16 ySrc B16; } xRenderTrianglesReq; #define sz_xRenderTrianglesReq 24 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture dst B32; PictFormat maskFormat B32; INT16 xSrc B16; INT16 ySrc B16; } xRenderTriStripReq; #define sz_xRenderTriStripReq 24 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture dst B32; PictFormat maskFormat B32; INT16 xSrc B16; INT16 ySrc B16; } xRenderTriFanReq; #define sz_xRenderTriFanReq 24 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Glyphset gsid B32; PictFormat format B32; } xRenderCreateGlyphSetReq; #define sz_xRenderCreateGlyphSetReq 12 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Glyphset gsid B32; Glyphset existing B32; } xRenderReferenceGlyphSetReq; #define sz_xRenderReferenceGlyphSetReq 24 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Glyphset glyphset B32; } xRenderFreeGlyphSetReq; #define sz_xRenderFreeGlyphSetReq 8 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Glyphset glyphset B32; CARD32 nglyphs; } xRenderAddGlyphsReq; #define sz_xRenderAddGlyphsReq 12 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Glyphset glyphset B32; } xRenderFreeGlyphsReq; #define sz_xRenderFreeGlyphsReq 8 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture src B32; Picture dst B32; PictFormat maskFormat B32; Glyphset glyphset B32; INT16 xSrc B16; INT16 ySrc B16; } xRenderCompositeGlyphsReq, xRenderCompositeGlyphs8Req, xRenderCompositeGlyphs16Req, xRenderCompositeGlyphs32Req; #define sz_xRenderCompositeGlyphs8Req 28 #define sz_xRenderCompositeGlyphs16Req 28 #define sz_xRenderCompositeGlyphs32Req 28 /* 0.1 and higher */ typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; CARD8 op; CARD8 pad1; CARD16 pad2 B16; Picture dst B32; xRenderColor color; } xRenderFillRectanglesReq; #define sz_xRenderFillRectanglesReq 20 /* 0.5 and higher */ typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Cursor cid B32; Picture src B32; CARD16 x B16; CARD16 y B16; } xRenderCreateCursorReq; #define sz_xRenderCreateCursorReq 16 /* 0.6 and higher */ /* * This can't use an array because 32-bit values may be in bitfields */ typedef struct { Fixed matrix11 B32; Fixed matrix12 B32; Fixed matrix13 B32; Fixed matrix21 B32; Fixed matrix22 B32; Fixed matrix23 B32; Fixed matrix31 B32; Fixed matrix32 B32; Fixed matrix33 B32; } xRenderTransform; #define sz_xRenderTransform 36 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture B32; xRenderTransform transform; } xRenderSetPictureTransformReq; #define sz_xRenderSetPictureTransformReq 44 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Drawable drawable B32; } xRenderQueryFiltersReq; #define sz_xRenderQueryFiltersReq 8 typedef struct { BYTE type; /* X_Reply */ BYTE pad1; CARD16 sequenceNumber B16; CARD32 length B32; CARD32 numAliases B32; /* LISTofCARD16 */ CARD32 numFilters B32; /* LISTofSTRING8 */ CARD32 pad2 B32; CARD32 pad3 B32; CARD32 pad4 B32; CARD32 pad5 B32; } xRenderQueryFiltersReply; #define sz_xRenderQueryFiltersReply 32 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture B32; CARD16 nbytes B16; /* number of bytes in name */ CARD16 pad B16; } xRenderSetPictureFilterReq; #define sz_xRenderSetPictureFilterReq 12 /* 0.8 and higher */ typedef struct { Cursor cursor B32; CARD32 delay B32; } xAnimCursorElt; #define sz_xAnimCursorElt 8 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Cursor cid B32; } xRenderCreateAnimCursorReq; #define sz_xRenderCreateAnimCursorReq 8 /* 0.9 and higher */ typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture picture; INT16 xOff B16; INT16 yOff B16; } xRenderAddTrapsReq; #define sz_xRenderAddTrapsReq 12 /* 0.10 and higher */ typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture pid B32; xRenderColor color; } xRenderCreateSolidFillReq; #define sz_xRenderCreateSolidFillReq 16 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture pid B32; xPointFixed p1; xPointFixed p2; CARD32 nStops; } xRenderCreateLinearGradientReq; #define sz_xRenderCreateLinearGradientReq 28 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture pid B32; xPointFixed inner; xPointFixed outer; Fixed inner_radius; Fixed outer_radius; CARD32 nStops; } xRenderCreateRadialGradientReq; #define sz_xRenderCreateRadialGradientReq 36 typedef struct { CARD8 reqType; CARD8 renderReqType; CARD16 length B16; Picture pid B32; xPointFixed center; Fixed angle; /* in degrees */ CARD32 nStops; } xRenderCreateConicalGradientReq; #define sz_xRenderCreateConicalGradientReq 24 #undef Window #undef Drawable #undef Font #undef Pixmap #undef Cursor #undef Colormap #undef GContext #undef Atom #undef VisualID #undef Time #undef KeyCode #undef KeySym #undef Picture #undef PictFormat #undef Fixed #undef Glyphset #undef Glyph #endif /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ #endif /* CAIRO_XLIB_XRENDER_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-pdf-surface-private.h0000664000175000017500000001116512225470167017527 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2006 Red Hat, Inc * Copyright © 2007, 2008 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Carl Worth * Adrian Johnson */ #ifndef CAIRO_PDF_SURFACE_PRIVATE_H #define CAIRO_PDF_SURFACE_PRIVATE_H #include "cairo-pdf.h" #include "cairo-surface-private.h" #include "cairo-pdf-operators-private.h" #include "cairo-path-fixed-private.h" typedef struct _cairo_pdf_resource { unsigned int id; } cairo_pdf_resource_t; typedef struct _cairo_pdf_group_resources { cairo_array_t alphas; cairo_array_t smasks; cairo_array_t patterns; cairo_array_t xobjects; cairo_array_t fonts; } cairo_pdf_group_resources_t; typedef struct _cairo_pdf_pattern { double width; double height; cairo_pattern_t *pattern; cairo_pdf_resource_t pattern_res; cairo_pdf_resource_t gstate_res; } cairo_pdf_pattern_t; typedef enum _cairo_pdf_operation { PDF_PAINT, PDF_MASK, PDF_FILL, PDF_STROKE, PDF_SHOW_GLYPHS } cairo_pdf_operation_t; typedef struct _cairo_pdf_smask_group { double width; double height; cairo_pdf_resource_t group_res; cairo_pdf_operation_t operation; cairo_pattern_t *source; cairo_pdf_resource_t source_res; cairo_pattern_t *mask; cairo_path_fixed_t path; cairo_fill_rule_t fill_rule; cairo_stroke_style_t *style; cairo_matrix_t ctm; cairo_matrix_t ctm_inverse; cairo_glyph_t *glyphs; int num_glyphs; cairo_scaled_font_t *scaled_font; } cairo_pdf_smask_group_t; typedef struct _cairo_pdf_surface cairo_pdf_surface_t; struct _cairo_pdf_surface { cairo_surface_t base; /* Prefer the name "output" here to avoid confusion over the * structure within a PDF document known as a "stream". */ cairo_output_stream_t *output; double width; double height; cairo_matrix_t cairo_to_pdf; cairo_array_t objects; cairo_array_t pages; cairo_array_t rgb_linear_functions; cairo_array_t alpha_linear_functions; cairo_array_t patterns; cairo_array_t smask_groups; cairo_array_t knockout_group; cairo_scaled_font_subsets_t *font_subsets; cairo_array_t fonts; cairo_pdf_resource_t next_available_resource; cairo_pdf_resource_t pages_resource; cairo_bool_t compress_content; cairo_pdf_resource_t content; cairo_pdf_resource_t content_resources; cairo_pdf_group_resources_t resources; cairo_bool_t has_fallback_images; struct { cairo_bool_t active; cairo_pdf_resource_t self; cairo_pdf_resource_t length; long start_offset; cairo_bool_t compressed; cairo_output_stream_t *old_output; } pdf_stream; struct { cairo_bool_t active; cairo_output_stream_t *stream; cairo_output_stream_t *mem_stream; cairo_output_stream_t *old_output; cairo_pdf_resource_t resource; cairo_bool_t is_knockout; } group_stream; cairo_pdf_operators_t pdf_operators; cairo_paginated_mode_t paginated_mode; cairo_bool_t select_pattern_gstate_saved; cairo_bool_t force_fallbacks; cairo_surface_t *paginated_surface; }; #endif /* CAIRO_PDF_SURFACE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-paginated-surface.c0000664000175000017500000004740012225470167017236 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth * Keith Packard * Adrian Johnson */ /* The paginated surface layer exists to provide as much code sharing * as possible for the various paginated surface backends in cairo * (PostScript, PDF, etc.). See cairo-paginated-private.h for * more details on how it works and how to use it. */ #include "cairoint.h" #include "cairo-paginated-private.h" #include "cairo-paginated-surface-private.h" #include "cairo-meta-surface-private.h" #include "cairo-analysis-surface-private.h" static const cairo_surface_backend_t cairo_paginated_surface_backend; static cairo_int_status_t _cairo_paginated_surface_show_page (void *abstract_surface); static cairo_surface_t * _cairo_paginated_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { cairo_paginated_surface_t *surface = abstract_surface; return cairo_surface_create_similar (surface->target, content, width, height); } /* XXX The integer width,height here should be doubles and all uses updated */ cairo_surface_t * _cairo_paginated_surface_create (cairo_surface_t *target, cairo_content_t content, int width, int height, const cairo_paginated_surface_backend_t *backend) { cairo_paginated_surface_t *surface; cairo_status_t status; surface = malloc (sizeof (cairo_paginated_surface_t)); if (surface == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } _cairo_surface_init (&surface->base, &cairo_paginated_surface_backend, content); /* Override surface->base.type with target's type so we don't leak * evidence of the paginated wrapper out to the user. */ surface->base.type = cairo_surface_get_type (target); surface->target = target; surface->content = content; surface->width = width; surface->height = height; surface->backend = backend; surface->meta = _cairo_meta_surface_create (content, width, height); status = cairo_surface_status (surface->meta); if (status) goto FAIL_CLEANUP_SURFACE; surface->page_num = 1; surface->page_is_blank = TRUE; return &surface->base; FAIL_CLEANUP_SURFACE: free (surface); FAIL: return _cairo_surface_create_in_error (status); } cairo_bool_t _cairo_surface_is_paginated (cairo_surface_t *surface) { return surface->backend == &cairo_paginated_surface_backend; } cairo_surface_t * _cairo_paginated_surface_get_target (cairo_surface_t *surface) { cairo_paginated_surface_t *paginated_surface; assert (_cairo_surface_is_paginated (surface)); paginated_surface = (cairo_paginated_surface_t *) surface; return paginated_surface->target; } cairo_status_t _cairo_paginated_surface_set_size (cairo_surface_t *surface, int width, int height) { cairo_paginated_surface_t *paginated_surface; cairo_status_t status; assert (_cairo_surface_is_paginated (surface)); paginated_surface = (cairo_paginated_surface_t *) surface; paginated_surface->width = width; paginated_surface->height = height; cairo_surface_destroy (paginated_surface->meta); paginated_surface->meta = _cairo_meta_surface_create (paginated_surface->content, width, height); status = cairo_surface_status (paginated_surface->meta); if (status) return _cairo_surface_set_error (surface, status); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_paginated_surface_finish (void *abstract_surface) { cairo_paginated_surface_t *surface = abstract_surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; if (surface->page_is_blank == FALSE || surface->page_num == 1) { cairo_surface_show_page (abstract_surface); status = cairo_surface_status (abstract_surface); } if (status == CAIRO_STATUS_SUCCESS) { cairo_surface_finish (surface->target); status = cairo_surface_status (surface->target); } if (status == CAIRO_STATUS_SUCCESS) { cairo_surface_finish (surface->meta); status = cairo_surface_status (surface->meta); } cairo_surface_destroy (surface->target); cairo_surface_destroy (surface->meta); return status; } static cairo_surface_t * _cairo_paginated_surface_create_image_surface (void *abstract_surface, int width, int height) { cairo_paginated_surface_t *surface = abstract_surface; cairo_surface_t *image; cairo_font_options_t options; image = _cairo_image_surface_create_with_content (surface->content, width, height); cairo_surface_get_font_options (&surface->base, &options); _cairo_surface_set_font_options (image, &options); return image; } static cairo_status_t _cairo_paginated_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_paginated_surface_t *surface = abstract_surface; cairo_surface_t *image; cairo_status_t status; cairo_rectangle_int_t extents; status = _cairo_surface_get_extents (surface->target, &extents); if (status) return status; image = _cairo_paginated_surface_create_image_surface (surface, extents.width, extents.height); status = _cairo_meta_surface_replay (surface->meta, image); if (status) { cairo_surface_destroy (image); return status; } *image_out = (cairo_image_surface_t*) image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_paginated_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy (&image->base); } static cairo_int_status_t _paint_fallback_image (cairo_paginated_surface_t *surface, cairo_box_int_t *box) { double x_scale = surface->base.x_fallback_resolution / surface->target->x_resolution; double y_scale = surface->base.y_fallback_resolution / surface->target->y_resolution; cairo_matrix_t matrix; int x, y, width, height; cairo_status_t status; cairo_surface_t *image; cairo_pattern_t *pattern; x = box->p1.x; y = box->p1.y; width = box->p2.x - x; height = box->p2.y - y; image = _cairo_paginated_surface_create_image_surface (surface, ceil (width * x_scale), ceil (height * y_scale)); _cairo_surface_set_device_scale (image, x_scale, y_scale); /* set_device_offset just sets the x0/y0 components of the matrix; * so we have to do the scaling manually. */ cairo_surface_set_device_offset (image, -x*x_scale, -y*y_scale); status = _cairo_meta_surface_replay (surface->meta, image); if (status) goto CLEANUP_IMAGE; pattern = cairo_pattern_create_for_surface (image); cairo_matrix_init (&matrix, x_scale, 0, 0, y_scale, -x*x_scale, -y*y_scale); cairo_pattern_set_matrix (pattern, &matrix); status = _cairo_surface_paint (surface->target, CAIRO_OPERATOR_SOURCE, pattern); cairo_pattern_destroy (pattern); CLEANUP_IMAGE: cairo_surface_destroy (image); return status; } static cairo_int_status_t _paint_page (cairo_paginated_surface_t *surface) { cairo_surface_t *analysis; cairo_status_t status; cairo_bool_t has_supported, has_page_fallback, has_finegrained_fallback; if (surface->target->status) return surface->target->status; analysis = _cairo_analysis_surface_create (surface->target, surface->width, surface->height); if (analysis->status) return _cairo_surface_set_error (surface->target, analysis->status); surface->backend->set_paginated_mode (surface->target, CAIRO_PAGINATED_MODE_ANALYZE); status = _cairo_meta_surface_replay_and_create_regions (surface->meta, analysis); if (status || analysis->status) { if (status == CAIRO_STATUS_SUCCESS) status = analysis->status; goto FAIL; } if (surface->backend->set_bounding_box) { cairo_box_t bbox; _cairo_analysis_surface_get_bounding_box (analysis, &bbox); status = surface->backend->set_bounding_box (surface->target, &bbox); if (status) goto FAIL; } surface->backend->set_paginated_mode (surface->target, CAIRO_PAGINATED_MODE_RENDER); /* Finer grained fallbacks are currently only supported for some * surface types */ switch (surface->target->type) { case CAIRO_SURFACE_TYPE_PDF: case CAIRO_SURFACE_TYPE_PS: case CAIRO_SURFACE_TYPE_WIN32_PRINTING: has_supported = _cairo_analysis_surface_has_supported (analysis); has_page_fallback = FALSE; has_finegrained_fallback = _cairo_analysis_surface_has_unsupported (analysis); break; case CAIRO_SURFACE_TYPE_IMAGE: case CAIRO_SURFACE_TYPE_XLIB: case CAIRO_SURFACE_TYPE_XCB: case CAIRO_SURFACE_TYPE_GLITZ: case CAIRO_SURFACE_TYPE_QUARTZ: case CAIRO_SURFACE_TYPE_QUARTZ_IMAGE: case CAIRO_SURFACE_TYPE_WIN32: case CAIRO_SURFACE_TYPE_BEOS: case CAIRO_SURFACE_TYPE_DIRECTFB: case CAIRO_SURFACE_TYPE_SVG: case CAIRO_SURFACE_TYPE_OS2: default: if (_cairo_analysis_surface_has_unsupported (analysis)) { has_supported = FALSE; has_page_fallback = TRUE; } else { has_supported = TRUE; has_page_fallback = FALSE; } has_finegrained_fallback = FALSE; break; } if (has_supported) { status = _cairo_meta_surface_replay_region (surface->meta, surface->target, CAIRO_META_REGION_NATIVE); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); if (status) goto FAIL; } if (has_page_fallback) { cairo_box_int_t box; box.p1.x = 0; box.p1.y = 0; box.p2.x = surface->width; box.p2.y = surface->height; status = _paint_fallback_image (surface, &box); if (status) goto FAIL; } if (has_finegrained_fallback) { cairo_region_t *region; cairo_box_int_t *boxes; int num_boxes, i; surface->backend->set_paginated_mode (surface->target, CAIRO_PAGINATED_MODE_FALLBACK); /* Reset clip region before drawing the fall back images */ status = _cairo_surface_intersect_clip_path (surface->target, NULL, CAIRO_FILL_RULE_WINDING, CAIRO_GSTATE_TOLERANCE_DEFAULT, CAIRO_ANTIALIAS_DEFAULT); if (status) goto FAIL; region = _cairo_analysis_surface_get_unsupported (analysis); status = _cairo_region_get_boxes (region, &num_boxes, &boxes); if (status) goto FAIL; for (i = 0; i < num_boxes; i++) { status = _paint_fallback_image (surface, &boxes[i]); if (status) { _cairo_region_boxes_fini (region, boxes); goto FAIL; } } _cairo_region_boxes_fini (region, boxes); } FAIL: cairo_surface_destroy (analysis); return _cairo_surface_set_error (surface->target, status); } static cairo_status_t _start_page (cairo_paginated_surface_t *surface) { if (surface->target->status) return surface->target->status; if (! surface->backend->start_page) return CAIRO_STATUS_SUCCESS; return _cairo_surface_set_error (surface->target, surface->backend->start_page (surface->target)); } static cairo_int_status_t _cairo_paginated_surface_copy_page (void *abstract_surface) { cairo_status_t status; cairo_paginated_surface_t *surface = abstract_surface; status = _start_page (surface); if (status) return status; status = _paint_page (surface); if (status) return status; surface->page_num++; /* XXX: It might make sense to add some suport here for calling * cairo_surface_copy_page on the target surface. It would be an * optimization for the output, but the interaction with image * fallbacks gets tricky. For now, we just let the target see a * show_page and we implement the copying by simply not destroying * the meta-surface. */ cairo_surface_show_page (surface->target); return cairo_surface_status (surface->target); } static cairo_int_status_t _cairo_paginated_surface_show_page (void *abstract_surface) { cairo_status_t status; cairo_paginated_surface_t *surface = abstract_surface; status = _start_page (surface); if (status) return status; status = _paint_page (surface); if (status) return status; cairo_surface_show_page (surface->target); status = cairo_surface_status (surface->target); if (status) return status; status = cairo_surface_status (surface->meta); if (status) return status; cairo_surface_destroy (surface->meta); surface->meta = _cairo_meta_surface_create (surface->content, surface->width, surface->height); status = cairo_surface_status (surface->meta); if (status) return status; surface->page_num++; surface->page_is_blank = TRUE; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_paginated_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_paginated_surface_t *surface = abstract_surface; return _cairo_surface_intersect_clip_path (surface->meta, path, fill_rule, tolerance, antialias); } static cairo_int_status_t _cairo_paginated_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_paginated_surface_t *surface = abstract_surface; return _cairo_surface_get_extents (surface->target, rectangle); } static void _cairo_paginated_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { cairo_paginated_surface_t *surface = abstract_surface; cairo_surface_get_font_options (surface->target, options); } static cairo_int_status_t _cairo_paginated_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_paginated_surface_t *surface = abstract_surface; /* Optimize away erasing of nothing. */ if (surface->page_is_blank && op == CAIRO_OPERATOR_CLEAR) return CAIRO_STATUS_SUCCESS; surface->page_is_blank = FALSE; return _cairo_surface_paint (surface->meta, op, source); } static cairo_int_status_t _cairo_paginated_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_paginated_surface_t *surface = abstract_surface; return _cairo_surface_mask (surface->meta, op, source, mask); } static cairo_int_status_t _cairo_paginated_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_paginated_surface_t *surface = abstract_surface; /* Optimize away erasing of nothing. */ if (surface->page_is_blank && op == CAIRO_OPERATOR_CLEAR) return CAIRO_STATUS_SUCCESS; surface->page_is_blank = FALSE; return _cairo_surface_stroke (surface->meta, op, source, path, style, ctm, ctm_inverse, tolerance, antialias); } static cairo_int_status_t _cairo_paginated_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_paginated_surface_t *surface = abstract_surface; /* Optimize away erasing of nothing. */ if (surface->page_is_blank && op == CAIRO_OPERATOR_CLEAR) return CAIRO_STATUS_SUCCESS; surface->page_is_blank = FALSE; return _cairo_surface_fill (surface->meta, op, source, path, fill_rule, tolerance, antialias); } static cairo_int_status_t _cairo_paginated_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_paginated_surface_t *surface = abstract_surface; cairo_int_status_t status; /* Optimize away erasing of nothing. */ if (surface->page_is_blank && op == CAIRO_OPERATOR_CLEAR) return CAIRO_STATUS_SUCCESS; surface->page_is_blank = FALSE; /* Since this is a "wrapping" surface, we're calling back into * _cairo_surface_show_glyphs from within a call to the same. * Since _cairo_surface_show_glyphs acquires a mutex, we release * and re-acquire the mutex around this nested call. * * Yes, this is ugly, but we consider it pragmatic as compared to * adding locking code to all 18 surface-backend-specific * show_glyphs functions, (which would get less testing and likely * lead to bugs). */ CAIRO_MUTEX_UNLOCK (scaled_font->mutex); status = _cairo_surface_show_glyphs (surface->meta, op, source, glyphs, num_glyphs, scaled_font); CAIRO_MUTEX_LOCK (scaled_font->mutex); return status; } static cairo_surface_t * _cairo_paginated_surface_snapshot (void *abstract_other) { cairo_paginated_surface_t *other = abstract_other; return _cairo_surface_snapshot (other->meta); } static const cairo_surface_backend_t cairo_paginated_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED, _cairo_paginated_surface_create_similar, _cairo_paginated_surface_finish, _cairo_paginated_surface_acquire_source_image, _cairo_paginated_surface_release_source_image, NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ _cairo_paginated_surface_copy_page, _cairo_paginated_surface_show_page, NULL, /* set_clip_region */ _cairo_paginated_surface_intersect_clip_path, _cairo_paginated_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_paginated_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ _cairo_paginated_surface_paint, _cairo_paginated_surface_mask, _cairo_paginated_surface_stroke, _cairo_paginated_surface_fill, _cairo_paginated_surface_show_glyphs, _cairo_paginated_surface_snapshot }; libgdiplus-2.11/cairo/src/cairo-wideint.c0000664000175000017500000004517612225470167015327 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith R. Packard */ #include "cairoint.h" #if HAVE_UINT64_T #define _cairo_uint32s_to_uint64(h,l) ((uint64_t) (h) << 32 | (l)) cairo_uquorem64_t _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den) { cairo_uquorem64_t qr; qr.quo = num / den; qr.rem = num % den; return qr; } #else cairo_uint64_t _cairo_uint32_to_uint64 (uint32_t i) { cairo_uint64_t q; q.lo = i; q.hi = 0; return q; } cairo_int64_t _cairo_int32_to_int64 (int32_t i) { cairo_uint64_t q; q.lo = i; q.hi = i < 0 ? -1 : 0; return q; } static cairo_uint64_t _cairo_uint32s_to_uint64 (uint32_t h, uint32_t l) { cairo_uint64_t q; q.lo = l; q.hi = h; return q; } cairo_uint64_t _cairo_uint64_add (cairo_uint64_t a, cairo_uint64_t b) { cairo_uint64_t s; s.hi = a.hi + b.hi; s.lo = a.lo + b.lo; if (s.lo < a.lo) s.hi++; return s; } cairo_uint64_t _cairo_uint64_sub (cairo_uint64_t a, cairo_uint64_t b) { cairo_uint64_t s; s.hi = a.hi - b.hi; s.lo = a.lo - b.lo; if (s.lo > a.lo) s.hi--; return s; } #define uint32_lo(i) ((i) & 0xffff) #define uint32_hi(i) ((i) >> 16) #define uint32_carry16 ((1) << 16) cairo_uint64_t _cairo_uint32x32_64_mul (uint32_t a, uint32_t b) { cairo_uint64_t s; uint16_t ah, al, bh, bl; uint32_t r0, r1, r2, r3; al = uint32_lo (a); ah = uint32_hi (a); bl = uint32_lo (b); bh = uint32_hi (b); r0 = (uint32_t) al * bl; r1 = (uint32_t) al * bh; r2 = (uint32_t) ah * bl; r3 = (uint32_t) ah * bh; r1 += uint32_hi(r0); /* no carry possible */ r1 += r2; /* but this can carry */ if (r1 < r2) /* check */ r3 += uint32_carry16; s.hi = r3 + uint32_hi(r1); s.lo = (uint32_lo (r1) << 16) + uint32_lo (r0); return s; } cairo_int64_t _cairo_int32x32_64_mul (int32_t a, int32_t b) { cairo_int64_t s; s = _cairo_uint32x32_64_mul ((uint32_t) a, (uint32_t) b); if (a < 0) s.hi -= b; if (b < 0) s.hi -= a; return s; } cairo_uint64_t _cairo_uint64_mul (cairo_uint64_t a, cairo_uint64_t b) { cairo_uint64_t s; s = _cairo_uint32x32_64_mul (a.lo, b.lo); s.hi += a.lo * b.hi + a.hi * b.lo; return s; } cairo_uint64_t _cairo_uint64_lsl (cairo_uint64_t a, int shift) { if (shift >= 32) { a.hi = a.lo; a.lo = 0; shift -= 32; } if (shift) { a.hi = a.hi << shift | a.lo >> (32 - shift); a.lo = a.lo << shift; } return a; } cairo_uint64_t _cairo_uint64_rsl (cairo_uint64_t a, int shift) { if (shift >= 32) { a.lo = a.hi; a.hi = 0; shift -= 32; } if (shift) { a.lo = a.lo >> shift | a.hi << (32 - shift); a.hi = a.hi >> shift; } return a; } #define _cairo_uint32_rsa(a,n) ((uint32_t) (((int32_t) (a)) >> (n))) cairo_int64_t _cairo_uint64_rsa (cairo_int64_t a, int shift) { if (shift >= 32) { a.lo = a.hi; a.hi = _cairo_uint32_rsa (a.hi, 31); shift -= 32; } if (shift) { a.lo = a.lo >> shift | a.hi << (32 - shift); a.hi = _cairo_uint32_rsa (a.hi, shift); } return a; } int _cairo_uint64_lt (cairo_uint64_t a, cairo_uint64_t b) { return (a.hi < b.hi || (a.hi == b.hi && a.lo < b.lo)); } int _cairo_uint64_eq (cairo_uint64_t a, cairo_uint64_t b) { return a.hi == b.hi && a.lo == b.lo; } int _cairo_int64_lt (cairo_int64_t a, cairo_int64_t b) { if (_cairo_int64_negative (a) && !_cairo_int64_negative (b)) return 1; if (!_cairo_int64_negative (a) && _cairo_int64_negative (b)) return 0; return _cairo_uint64_lt (a, b); } cairo_uint64_t _cairo_uint64_not (cairo_uint64_t a) { a.lo = ~a.lo; a.hi = ~a.hi; return a; } cairo_uint64_t _cairo_uint64_negate (cairo_uint64_t a) { a.lo = ~a.lo; a.hi = ~a.hi; if (++a.lo == 0) ++a.hi; return a; } /* * Simple bit-at-a-time divide. */ cairo_uquorem64_t _cairo_uint64_divrem (cairo_uint64_t num, cairo_uint64_t den) { cairo_uquorem64_t qr; cairo_uint64_t bit; cairo_uint64_t quo; bit = _cairo_uint32_to_uint64 (1); /* normalize to make den >= num, but not overflow */ while (_cairo_uint64_lt (den, num) && (den.hi & 0x80000000) == 0) { bit = _cairo_uint64_lsl (bit, 1); den = _cairo_uint64_lsl (den, 1); } quo = _cairo_uint32_to_uint64 (0); /* generate quotient, one bit at a time */ while (bit.hi | bit.lo) { if (_cairo_uint64_le (den, num)) { num = _cairo_uint64_sub (num, den); quo = _cairo_uint64_add (quo, bit); } bit = _cairo_uint64_rsl (bit, 1); den = _cairo_uint64_rsl (den, 1); } qr.quo = quo; qr.rem = num; return qr; } #endif /* !HAVE_UINT64_T */ cairo_quorem64_t _cairo_int64_divrem (cairo_int64_t num, cairo_int64_t den) { int num_neg = _cairo_int64_negative (num); int den_neg = _cairo_int64_negative (den); cairo_uquorem64_t uqr; cairo_quorem64_t qr; if (num_neg) num = _cairo_int64_negate (num); if (den_neg) den = _cairo_int64_negate (den); uqr = _cairo_uint64_divrem (num, den); if (num_neg) qr.rem = _cairo_int64_negate (uqr.rem); else qr.rem = uqr.rem; if (num_neg != den_neg) qr.quo = (cairo_int64_t) _cairo_int64_negate (uqr.quo); else qr.quo = (cairo_int64_t) uqr.quo; return qr; } #if HAVE_UINT128_T cairo_uquorem128_t _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den) { cairo_uquorem128_t qr; qr.quo = num / den; qr.rem = num % den; return qr; } #else cairo_uint128_t _cairo_uint32_to_uint128 (uint32_t i) { cairo_uint128_t q; q.lo = _cairo_uint32_to_uint64 (i); q.hi = _cairo_uint32_to_uint64 (0); return q; } cairo_int128_t _cairo_int32_to_int128 (int32_t i) { cairo_int128_t q; q.lo = _cairo_int32_to_int64 (i); q.hi = _cairo_int32_to_int64 (i < 0 ? -1 : 0); return q; } cairo_uint128_t _cairo_uint64_to_uint128 (cairo_uint64_t i) { cairo_uint128_t q; q.lo = i; q.hi = _cairo_uint32_to_uint64 (0); return q; } cairo_int128_t _cairo_int64_to_int128 (cairo_int64_t i) { cairo_int128_t q; q.lo = i; q.hi = _cairo_int32_to_int64 (_cairo_int64_negative(i) ? -1 : 0); return q; } cairo_uint128_t _cairo_uint128_add (cairo_uint128_t a, cairo_uint128_t b) { cairo_uint128_t s; s.hi = _cairo_uint64_add (a.hi, b.hi); s.lo = _cairo_uint64_add (a.lo, b.lo); if (_cairo_uint64_lt (s.lo, a.lo)) s.hi = _cairo_uint64_add (s.hi, _cairo_uint32_to_uint64 (1)); return s; } cairo_uint128_t _cairo_uint128_sub (cairo_uint128_t a, cairo_uint128_t b) { cairo_uint128_t s; s.hi = _cairo_uint64_sub (a.hi, b.hi); s.lo = _cairo_uint64_sub (a.lo, b.lo); if (_cairo_uint64_gt (s.lo, a.lo)) s.hi = _cairo_uint64_sub (s.hi, _cairo_uint32_to_uint64(1)); return s; } #if HAVE_UINT64_T #define uint64_lo32(i) ((i) & 0xffffffff) #define uint64_hi32(i) ((i) >> 32) #define uint64_lo(i) ((i) & 0xffffffff) #define uint64_hi(i) ((i) >> 32) #define uint64_shift32(i) ((i) << 32) #define uint64_carry32 (((uint64_t) 1) << 32) #else #define uint64_lo32(i) ((i).lo) #define uint64_hi32(i) ((i).hi) static cairo_uint64_t uint64_lo (cairo_uint64_t i) { cairo_uint64_t s; s.lo = i.lo; s.hi = 0; return s; } static cairo_uint64_t uint64_hi (cairo_uint64_t i) { cairo_uint64_t s; s.lo = i.hi; s.hi = 0; return s; } static cairo_uint64_t uint64_shift32 (cairo_uint64_t i) { cairo_uint64_t s; s.lo = 0; s.hi = i.lo; return s; } static const cairo_uint64_t uint64_carry32 = { 0, 1 }; #endif cairo_uint128_t _cairo_uint64x64_128_mul (cairo_uint64_t a, cairo_uint64_t b) { cairo_uint128_t s; uint32_t ah, al, bh, bl; cairo_uint64_t r0, r1, r2, r3; al = uint64_lo32 (a); ah = uint64_hi32 (a); bl = uint64_lo32 (b); bh = uint64_hi32 (b); r0 = _cairo_uint32x32_64_mul (al, bl); r1 = _cairo_uint32x32_64_mul (al, bh); r2 = _cairo_uint32x32_64_mul (ah, bl); r3 = _cairo_uint32x32_64_mul (ah, bh); r1 = _cairo_uint64_add (r1, uint64_hi (r0)); /* no carry possible */ r1 = _cairo_uint64_add (r1, r2); /* but this can carry */ if (_cairo_uint64_lt (r1, r2)) /* check */ r3 = _cairo_uint64_add (r3, uint64_carry32); s.hi = _cairo_uint64_add (r3, uint64_hi(r1)); s.lo = _cairo_uint64_add (uint64_shift32 (r1), uint64_lo (r0)); return s; } cairo_int128_t _cairo_int64x64_128_mul (cairo_int64_t a, cairo_int64_t b) { cairo_int128_t s; s = _cairo_uint64x64_128_mul (_cairo_int64_to_uint64(a), _cairo_int64_to_uint64(b)); if (_cairo_int64_negative (a)) s.hi = _cairo_uint64_sub (s.hi, _cairo_int64_to_uint64 (b)); if (_cairo_int64_negative (b)) s.hi = _cairo_uint64_sub (s.hi, _cairo_int64_to_uint64 (a)); return s; } cairo_uint128_t _cairo_uint128_mul (cairo_uint128_t a, cairo_uint128_t b) { cairo_uint128_t s; s = _cairo_uint64x64_128_mul (a.lo, b.lo); s.hi = _cairo_uint64_add (s.hi, _cairo_uint64_mul (a.lo, b.hi)); s.hi = _cairo_uint64_add (s.hi, _cairo_uint64_mul (a.hi, b.lo)); return s; } cairo_uint128_t _cairo_uint128_lsl (cairo_uint128_t a, int shift) { if (shift >= 64) { a.hi = a.lo; a.lo = _cairo_uint32_to_uint64 (0); shift -= 64; } if (shift) { a.hi = _cairo_uint64_add (_cairo_uint64_lsl (a.hi, shift), _cairo_uint64_rsl (a.lo, (64 - shift))); a.lo = _cairo_uint64_lsl (a.lo, shift); } return a; } cairo_uint128_t _cairo_uint128_rsl (cairo_uint128_t a, int shift) { if (shift >= 64) { a.lo = a.hi; a.hi = _cairo_uint32_to_uint64 (0); shift -= 64; } if (shift) { a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift), _cairo_uint64_lsl (a.hi, (64 - shift))); a.hi = _cairo_uint64_rsl (a.hi, shift); } return a; } cairo_uint128_t _cairo_uint128_rsa (cairo_int128_t a, int shift) { if (shift >= 64) { a.lo = a.hi; a.hi = _cairo_uint64_rsa (a.hi, 64-1); shift -= 64; } if (shift) { a.lo = _cairo_uint64_add (_cairo_uint64_rsl (a.lo, shift), _cairo_uint64_lsl (a.hi, (64 - shift))); a.hi = _cairo_uint64_rsa (a.hi, shift); } return a; } int _cairo_uint128_lt (cairo_uint128_t a, cairo_uint128_t b) { return (_cairo_uint64_lt (a.hi, b.hi) || (_cairo_uint64_eq (a.hi, b.hi) && _cairo_uint64_lt (a.lo, b.lo))); } int _cairo_int128_lt (cairo_int128_t a, cairo_int128_t b) { if (_cairo_int128_negative (a) && !_cairo_int128_negative (b)) return 1; if (!_cairo_int128_negative (a) && _cairo_int128_negative (b)) return 0; return _cairo_uint128_lt (a, b); } int _cairo_uint128_eq (cairo_uint128_t a, cairo_uint128_t b) { return (_cairo_uint64_eq (a.hi, b.hi) && _cairo_uint64_eq (a.lo, b.lo)); } #if HAVE_UINT64_T #define _cairo_msbset64(q) (q & ((uint64_t) 1 << 63)) #else #define _cairo_msbset64(q) (q.hi & ((uint32_t) 1 << 31)) #endif cairo_uquorem128_t _cairo_uint128_divrem (cairo_uint128_t num, cairo_uint128_t den) { cairo_uquorem128_t qr; cairo_uint128_t bit; cairo_uint128_t quo; bit = _cairo_uint32_to_uint128 (1); /* normalize to make den >= num, but not overflow */ while (_cairo_uint128_lt (den, num) && !_cairo_msbset64(den.hi)) { bit = _cairo_uint128_lsl (bit, 1); den = _cairo_uint128_lsl (den, 1); } quo = _cairo_uint32_to_uint128 (0); /* generate quotient, one bit at a time */ while (_cairo_uint128_ne (bit, _cairo_uint32_to_uint128(0))) { if (_cairo_uint128_le (den, num)) { num = _cairo_uint128_sub (num, den); quo = _cairo_uint128_add (quo, bit); } bit = _cairo_uint128_rsl (bit, 1); den = _cairo_uint128_rsl (den, 1); } qr.quo = quo; qr.rem = num; return qr; } cairo_int128_t _cairo_int128_negate (cairo_int128_t a) { a.lo = _cairo_uint64_not (a.lo); a.hi = _cairo_uint64_not (a.hi); return _cairo_uint128_add (a, _cairo_uint32_to_uint128 (1)); } cairo_int128_t _cairo_int128_not (cairo_int128_t a) { a.lo = _cairo_uint64_not (a.lo); a.hi = _cairo_uint64_not (a.hi); return a; } #endif /* !HAVE_UINT128_T */ cairo_quorem128_t _cairo_int128_divrem (cairo_int128_t num, cairo_int128_t den) { int num_neg = _cairo_int128_negative (num); int den_neg = _cairo_int128_negative (den); cairo_uquorem128_t uqr; cairo_quorem128_t qr; if (num_neg) num = _cairo_int128_negate (num); if (den_neg) den = _cairo_int128_negate (den); uqr = _cairo_uint128_divrem (num, den); if (num_neg) qr.rem = _cairo_int128_negate (uqr.rem); else qr.rem = uqr.rem; if (num_neg != den_neg) qr.quo = _cairo_int128_negate (uqr.quo); else qr.quo = uqr.quo; return qr; } /** * _cairo_uint_96by64_32x64_divrem: * * Compute a 32 bit quotient and 64 bit remainder of a 96 bit unsigned * dividend and 64 bit divisor. If the quotient doesn't fit into 32 * bits then the returned remainder is equal to the divisor, and the * quotient is the largest representable 64 bit integer. It is an * error to call this function with the high 32 bits of @num being * non-zero. */ cairo_uquorem64_t _cairo_uint_96by64_32x64_divrem (cairo_uint128_t num, cairo_uint64_t den) { cairo_uquorem64_t result; cairo_uint64_t B = _cairo_uint32s_to_uint64 (1, 0); /* These are the high 64 bits of the *96* bit numerator. We're * going to represent the numerator as xB + y, where x is a 64, * and y is a 32 bit number. */ cairo_uint64_t x = _cairo_uint128_to_uint64 (_cairo_uint128_rsl(num, 32)); /* Initialise the result to indicate overflow. */ result.quo = _cairo_uint32s_to_uint64 (-1U, -1U); result.rem = den; /* Don't bother if the quotient is going to overflow. */ if (_cairo_uint64_ge (x, den)) { return /* overflow */ result; } if (_cairo_uint64_lt (x, B)) { /* When the final quotient is known to fit in 32 bits, then * num < 2^64 if and only if den < 2^32. */ return _cairo_uint64_divrem (_cairo_uint128_to_uint64 (num), den); } else { /* Denominator is >= 2^32. the numerator is >= 2^64, and the * division won't overflow: need two divrems. Write the * numerator and denominator as * * num = xB + y x : 64 bits, y : 32 bits * den = uB + v u, v : 32 bits */ uint32_t y = _cairo_uint128_to_uint32 (num); uint32_t u = uint64_hi32 (den); uint32_t v = _cairo_uint64_to_uint32 (den); /* Compute a lower bound approximate quotient of num/den * from x/(u+1). Then we have * * x = q(u+1) + r ; q : 32 bits, r <= u : 32 bits. * * xB + y = q(u+1)B + (rB+y) * = q(uB + B + v - v) + (rB+y) * = q(uB + v) + qB - qv + (rB+y) * = q(uB + v) + q(B-v) + (rB+y) * * The true quotient of num/den then is q plus the * contribution of q(B-v) + (rB+y). The main contribution * comes from the term q(B-v), with the term (rB+y) only * contributing at most one part. * * The term q(B-v) must fit into 64 bits, since q fits into 32 * bits on account of being a lower bound to the true * quotient, and as B-v <= 2^32, we may safely use a single * 64/64 bit division to find its contribution. */ cairo_uquorem64_t quorem; cairo_uint64_t remainder; /* will contain final remainder */ uint32_t quotient; /* will contain final quotient. */ uint32_t q; uint32_t r; /* Approximate quotient by dividing the high 64 bits of num by * u+1. Watch out for overflow of u+1. */ if (u+1) { quorem = _cairo_uint64_divrem (x, _cairo_uint32_to_uint64 (u+1)); q = _cairo_uint64_to_uint32 (quorem.quo); r = _cairo_uint64_to_uint32 (quorem.rem); } else { q = uint64_hi32 (x); r = _cairo_uint64_to_uint32 (x); } quotient = q; /* Add the main term's contribution to quotient. Note B-v = * -v as an uint32 (unless v = 0) */ if (v) quorem = _cairo_uint64_divrem (_cairo_uint32x32_64_mul (q, -v), den); else quorem = _cairo_uint64_divrem (_cairo_uint32s_to_uint64 (q, 0), den); quotient += _cairo_uint64_to_uint32 (quorem.quo); /* Add the contribution of the subterm and start computing the * true remainder. */ remainder = _cairo_uint32s_to_uint64 (r, y); if (_cairo_uint64_ge (remainder, den)) { remainder = _cairo_uint64_sub (remainder, den); quotient++; } /* Add the contribution of the main term's remainder. The * funky test here checks that remainder + main_rem >= den, * taking into account overflow of the addition. */ remainder = _cairo_uint64_add (remainder, quorem.rem); if (_cairo_uint64_ge (remainder, den) || _cairo_uint64_lt (remainder, quorem.rem)) { remainder = _cairo_uint64_sub (remainder, den); quotient++; } result.quo = _cairo_uint32_to_uint64 (quotient); result.rem = remainder; } return result; } cairo_quorem64_t _cairo_int_96by64_32x64_divrem (cairo_int128_t num, cairo_int64_t den) { int num_neg = _cairo_int128_negative (num); int den_neg = _cairo_int64_negative (den); cairo_uint64_t nonneg_den; cairo_uquorem64_t uqr; cairo_quorem64_t qr; if (num_neg) num = _cairo_int128_negate (num); if (den_neg) nonneg_den = _cairo_int64_negate (den); else nonneg_den = den; uqr = _cairo_uint_96by64_32x64_divrem (num, nonneg_den); if (_cairo_uint64_eq (uqr.rem, nonneg_den)) { /* bail on overflow. */ qr.quo = _cairo_uint32s_to_uint64 (0x7FFFFFFF, -1U);; qr.rem = den; return qr; } if (num_neg) qr.rem = _cairo_int64_negate (uqr.rem); else qr.rem = uqr.rem; if (num_neg != den_neg) qr.quo = _cairo_int64_negate (uqr.quo); else qr.quo = uqr.quo; return qr; } libgdiplus-2.11/cairo/src/cairo-png.c0000664000175000017500000004376212225470167014447 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Kristian Høgsberg * Chris Wilson */ #include "cairoint.h" #include #include /* Unpremultiplies data and converts native endian ARGB => RGBA bytes */ static void unpremultiply_data (png_structp png, png_row_infop row_info, png_bytep data) { unsigned int i; for (i = 0; i < row_info->rowbytes; i += 4) { uint8_t *b = &data[i]; uint32_t pixel; uint8_t alpha; memcpy (&pixel, b, sizeof (uint32_t)); alpha = (pixel & 0xff000000) >> 24; if (alpha == 0) { b[0] = b[1] = b[2] = b[3] = 0; } else { b[0] = (((pixel & 0xff0000) >> 16) * 255 + alpha / 2) / alpha; b[1] = (((pixel & 0x00ff00) >> 8) * 255 + alpha / 2) / alpha; b[2] = (((pixel & 0x0000ff) >> 0) * 255 + alpha / 2) / alpha; b[3] = alpha; } } } /* Converts native endian xRGB => RGBx bytes */ static void convert_data_to_bytes (png_structp png, png_row_infop row_info, png_bytep data) { unsigned int i; for (i = 0; i < row_info->rowbytes; i += 4) { uint8_t *b = &data[i]; uint32_t pixel; memcpy (&pixel, b, sizeof (uint32_t)); b[0] = (pixel & 0xff0000) >> 16; b[1] = (pixel & 0x00ff00) >> 8; b[2] = (pixel & 0x0000ff) >> 0; b[3] = 0; } } /* Use a couple of simple error callbacks that do not print anything to * stderr and rely on the user to check for errors via the #cairo_status_t * return. */ static void png_simple_error_callback (png_structp png, png_const_charp error_msg) { cairo_status_t *error = png_get_error_ptr (png); /* default to the most likely error */ if (*error == CAIRO_STATUS_SUCCESS) *error = _cairo_error (CAIRO_STATUS_NO_MEMORY); #ifdef PNG_SETJMP_SUPPORTED longjmp (png_jmpbuf (png), 1); #endif /* if we get here, then we have to choice but to abort ... */ } static void png_simple_warning_callback (png_structp png, png_const_charp error_msg) { cairo_status_t *error = png_get_error_ptr (png); /* default to the most likely error */ if (*error == CAIRO_STATUS_SUCCESS) *error = _cairo_error (CAIRO_STATUS_NO_MEMORY); /* png does not expect to abort and will try to tidy up after a warning */ } static cairo_status_t write_png (cairo_surface_t *surface, png_rw_ptr write_func, void *closure) { int i; cairo_status_t status; cairo_image_surface_t *image; void *image_extra; png_struct *png; png_info *info; png_time pt; png_byte **volatile rows = NULL; png_color_16 white; int png_color_type; int depth; status = _cairo_surface_acquire_source_image (surface, &image, &image_extra); if (status == CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); else if (status) return status; /* PNG complains about "Image width or height is zero in IHDR" */ if (image->width == 0 || image->height == 0) { status = _cairo_error (CAIRO_STATUS_WRITE_ERROR); goto BAIL1; } rows = _cairo_malloc_ab (image->height, sizeof (png_byte*)); if (rows == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL1; } for (i = 0; i < image->height; i++) rows[i] = (png_byte *) image->data + i * image->stride; png = png_create_write_struct (PNG_LIBPNG_VER_STRING, &status, png_simple_error_callback, png_simple_warning_callback); if (png == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL2; } info = png_create_info_struct (png); if (info == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL3; } #ifdef PNG_SETJMP_SUPPORTED if (setjmp (png_jmpbuf (png))) goto BAIL3; #endif png_set_write_fn (png, closure, write_func, NULL); switch (image->format) { case CAIRO_FORMAT_ARGB32: depth = 8; png_color_type = PNG_COLOR_TYPE_RGB_ALPHA; break; case CAIRO_FORMAT_RGB24: depth = 8; png_color_type = PNG_COLOR_TYPE_RGB; break; case CAIRO_FORMAT_A8: depth = 8; png_color_type = PNG_COLOR_TYPE_GRAY; break; case CAIRO_FORMAT_A1: depth = 1; png_color_type = PNG_COLOR_TYPE_GRAY; break; default: status = _cairo_error (CAIRO_STATUS_INVALID_FORMAT); goto BAIL3; } png_set_IHDR (png, info, image->width, image->height, depth, png_color_type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); white.gray = (1 << depth) - 1; white.red = white.blue = white.green = white.gray; png_set_bKGD (png, info, &white); png_convert_from_time_t (&pt, time (NULL)); png_set_tIME (png, info, &pt); /* We have to call png_write_info() before setting up the write * transformation, since it stores data internally in 'png' * that is needed for the write transformation functions to work. */ png_write_info (png, info); if (image->format == CAIRO_FORMAT_ARGB32) png_set_write_user_transform_fn (png, unpremultiply_data); else if (image->format == CAIRO_FORMAT_RGB24) png_set_write_user_transform_fn (png, convert_data_to_bytes); if (image->format == CAIRO_FORMAT_RGB24) png_set_filler (png, 0, PNG_FILLER_AFTER); png_write_image (png, rows); png_write_end (png, info); BAIL3: png_destroy_write_struct (&png, &info); BAIL2: free (rows); BAIL1: _cairo_surface_release_source_image (surface, image, image_extra); return status; } static void stdio_write_func (png_structp png, png_bytep data, png_size_t size) { FILE *fp; fp = png_get_io_ptr (png); while (size) { size_t ret = fwrite (data, 1, size, fp); size -= ret; data += ret; if (size && ferror (fp)) { cairo_status_t *error = png_get_error_ptr (png); if (*error == CAIRO_STATUS_SUCCESS) *error = _cairo_error (CAIRO_STATUS_WRITE_ERROR); png_error (png, NULL); } } } /** * cairo_surface_write_to_png: * @surface: a #cairo_surface_t with pixel contents * @filename: the name of a file to write to * * Writes the contents of @surface to a new file @filename as a PNG * image. * * Return value: %CAIRO_STATUS_SUCCESS if the PNG file was written * successfully. Otherwise, %CAIRO_STATUS_NO_MEMORY if memory could not * be allocated for the operation or * CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have * pixel contents, or %CAIRO_STATUS_WRITE_ERROR if an I/O error occurs * while attempting to write the file. **/ cairo_status_t cairo_surface_write_to_png (cairo_surface_t *surface, const char *filename) { FILE *fp; cairo_status_t status; if (surface->status) return surface->status; if (surface->finished) return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); fp = fopen (filename, "wb"); if (fp == NULL) { switch (errno) { case ENOMEM: return _cairo_error (CAIRO_STATUS_NO_MEMORY); default: return _cairo_error (CAIRO_STATUS_WRITE_ERROR); } } status = write_png (surface, stdio_write_func, fp); if (fclose (fp) && status == CAIRO_STATUS_SUCCESS) status = _cairo_error (CAIRO_STATUS_WRITE_ERROR); return status; } struct png_write_closure_t { cairo_write_func_t write_func; void *closure; }; static void stream_write_func (png_structp png, png_bytep data, png_size_t size) { cairo_status_t status; struct png_write_closure_t *png_closure; png_closure = png_get_io_ptr (png); status = png_closure->write_func (png_closure->closure, data, size); if (status) { cairo_status_t *error = png_get_error_ptr (png); if (*error == CAIRO_STATUS_SUCCESS) *error = status; png_error (png, NULL); } } /** * cairo_surface_write_to_png_stream: * @surface: a #cairo_surface_t with pixel contents * @write_func: a #cairo_write_func_t * @closure: closure data for the write function * * Writes the image surface to the write function. * * Return value: %CAIRO_STATUS_SUCCESS if the PNG file was written * successfully. Otherwise, %CAIRO_STATUS_NO_MEMORY is returned if * memory could not be allocated for the operation, * CAIRO_STATUS_SURFACE_TYPE_MISMATCH if the surface does not have * pixel contents. **/ cairo_status_t cairo_surface_write_to_png_stream (cairo_surface_t *surface, cairo_write_func_t write_func, void *closure) { struct png_write_closure_t png_closure; png_closure.write_func = write_func; png_closure.closure = closure; return write_png (surface, stream_write_func, &png_closure); } slim_hidden_def (cairo_surface_write_to_png_stream); static inline int multiply_alpha (int alpha, int color) { int temp = (alpha * color) + 0x80; return ((temp + (temp >> 8)) >> 8); } /* Premultiplies data and converts RGBA bytes => native endian */ static void premultiply_data (png_structp png, png_row_infop row_info, png_bytep data) { unsigned int i; for (i = 0; i < row_info->rowbytes; i += 4) { uint8_t *base = &data[i]; uint8_t alpha = base[3]; uint32_t p; if (alpha == 0) { p = 0; } else { uint8_t red = base[0]; uint8_t green = base[1]; uint8_t blue = base[2]; if (alpha != 0xff) { red = multiply_alpha (alpha, red); green = multiply_alpha (alpha, green); blue = multiply_alpha (alpha, blue); } p = (alpha << 24) | (red << 16) | (green << 8) | (blue << 0); } memcpy (base, &p, sizeof (uint32_t)); } } /* Converts RGBx bytes to native endian xRGB */ static void convert_bytes_to_data (png_structp png, png_row_infop row_info, png_bytep data) { unsigned int i; for (i = 0; i < row_info->rowbytes; i += 4) { uint8_t *base = &data[i]; uint8_t red = base[0]; uint8_t green = base[1]; uint8_t blue = base[2]; uint32_t pixel; pixel = (0xff << 24) | (red << 16) | (green << 8) | (blue << 0); memcpy (base, &pixel, sizeof (uint32_t)); } } static cairo_surface_t * read_png (png_rw_ptr read_func, void *closure) { cairo_surface_t *surface; png_struct *png = NULL; png_info *info; png_byte *data = NULL; png_byte **row_pointers = NULL; png_uint_32 png_width, png_height; int depth, color_type, interlace, stride; unsigned int i; cairo_format_t format; cairo_status_t status; /* XXX: Perhaps we'll want some other error handlers? */ png = png_create_read_struct (PNG_LIBPNG_VER_STRING, &status, png_simple_error_callback, png_simple_warning_callback); if (png == NULL) { surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto BAIL; } info = png_create_info_struct (png); if (info == NULL) { surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto BAIL; } png_set_read_fn (png, closure, read_func); status = CAIRO_STATUS_SUCCESS; #ifdef PNG_SETJMP_SUPPORTED if (setjmp (png_jmpbuf (png))) { surface = _cairo_surface_create_in_error (status); goto BAIL; } #endif png_read_info (png, info); png_get_IHDR (png, info, &png_width, &png_height, &depth, &color_type, &interlace, NULL, NULL); if (status) { /* catch any early warnings */ surface = _cairo_surface_create_in_error (status); goto BAIL; } /* convert palette/gray image to rgb */ if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb (png); /* expand gray bit depth if needed */ if (color_type == PNG_COLOR_TYPE_GRAY) { #if PNG_LIBPNG_VER >= 10209 png_set_expand_gray_1_2_4_to_8 (png); #else png_set_gray_1_2_4_to_8 (png); #endif } /* transform transparency to alpha */ if (png_get_valid (png, info, PNG_INFO_tRNS)) png_set_tRNS_to_alpha (png); if (depth == 16) png_set_strip_16 (png); if (depth < 8) png_set_packing (png); /* convert grayscale to RGB */ if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { png_set_gray_to_rgb (png); } if (interlace != PNG_INTERLACE_NONE) png_set_interlace_handling (png); switch (color_type) { default: case PNG_COLOR_TYPE_GRAY_ALPHA: case PNG_COLOR_TYPE_RGB_ALPHA: format = CAIRO_FORMAT_ARGB32; png_set_read_user_transform_fn (png, premultiply_data); break; case PNG_COLOR_TYPE_GRAY: case PNG_COLOR_TYPE_PALETTE: case PNG_COLOR_TYPE_RGB: format = CAIRO_FORMAT_RGB24; png_set_read_user_transform_fn (png, convert_bytes_to_data); png_set_filler (png, 0xff, PNG_FILLER_AFTER); break; } png_read_update_info (png, info); stride = cairo_format_stride_for_width (format, png_width); if (stride < 0) { surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); goto BAIL; } data = _cairo_malloc_ab (png_height, stride); if (data == NULL) { surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto BAIL; } row_pointers = _cairo_malloc_ab (png_height, sizeof (char *)); if (row_pointers == NULL) { surface = _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); goto BAIL; } for (i = 0; i < png_height; i++) row_pointers[i] = &data[i * stride]; png_read_image (png, row_pointers); png_read_end (png, info); if (status) { /* catch any late warnings - probably hit an error already */ surface = _cairo_surface_create_in_error (status); goto BAIL; } surface = cairo_image_surface_create_for_data (data, format, png_width, png_height, stride); if (surface->status) goto BAIL; _cairo_image_surface_assume_ownership_of_data ((cairo_image_surface_t*)surface); data = NULL; BAIL: if (row_pointers) free (row_pointers); if (data) free (data); if (png) png_destroy_read_struct (&png, &info, NULL); return surface; } static void stdio_read_func (png_structp png, png_bytep data, png_size_t size) { FILE *fp; fp = png_get_io_ptr (png); while (size) { size_t ret = fread (data, 1, size, fp); size -= ret; data += ret; if (size && (feof (fp) || ferror (fp))) { cairo_status_t *error = png_get_error_ptr (png); if (*error == CAIRO_STATUS_SUCCESS) *error = _cairo_error (CAIRO_STATUS_READ_ERROR); png_error (png, NULL); } } } /** * cairo_image_surface_create_from_png: * @filename: name of PNG file to load * * Creates a new image surface and initializes the contents to the * given PNG file. * * Return value: a new #cairo_surface_t initialized with the contents * of the PNG file, or a "nil" surface if any error occurred. A nil * surface can be checked for with cairo_surface_status(surface) which * may return one of the following values: * * CAIRO_STATUS_NO_MEMORY * CAIRO_STATUS_FILE_NOT_FOUND * CAIRO_STATUS_READ_ERROR **/ cairo_surface_t * cairo_image_surface_create_from_png (const char *filename) { FILE *fp; cairo_surface_t *surface; fp = fopen (filename, "rb"); if (fp == NULL) { cairo_status_t status; switch (errno) { case ENOMEM: status = _cairo_error (CAIRO_STATUS_NO_MEMORY); break; case ENOENT: status = _cairo_error (CAIRO_STATUS_FILE_NOT_FOUND); break; default: status = _cairo_error (CAIRO_STATUS_READ_ERROR); break; } return _cairo_surface_create_in_error (status); } surface = read_png (stdio_read_func, fp); fclose (fp); return surface; } struct png_read_closure_t { cairo_read_func_t read_func; void *closure; }; static void stream_read_func (png_structp png, png_bytep data, png_size_t size) { cairo_status_t status; struct png_read_closure_t *png_closure; png_closure = png_get_io_ptr (png); status = png_closure->read_func (png_closure->closure, data, size); if (status) { cairo_status_t *error = png_get_error_ptr (png); if (*error == CAIRO_STATUS_SUCCESS) *error = status; png_error (png, NULL); } } /** * cairo_image_surface_create_from_png_stream: * @read_func: function called to read the data of the file * @closure: data to pass to @read_func. * * Creates a new image surface from PNG data read incrementally * via the @read_func function. * * Return value: a new #cairo_surface_t initialized with the contents * of the PNG file or %NULL if the data read is not a valid PNG image or * memory could not be allocated for the operation. **/ cairo_surface_t * cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, void *closure) { struct png_read_closure_t png_closure; png_closure.read_func = read_func; png_closure.closure = closure; return read_png (stream_read_func, &png_closure); } libgdiplus-2.11/cairo/src/Makefile.am0000664000175000017500000002646612225470167014462 00000000000000backend_pkgconfigs = cairo_base_headers = cairo.h cairo-embed.h cairo_base_sources = \ cairo.c \ cairo.h \ cairo-private.h \ cairo-arc.c \ cairo-arc-private.h \ cairo-array.c \ cairo-atomic.c \ cairo-atomic-private.h \ cairo-base85-stream.c \ cairo-bentley-ottmann.c \ cairo-cache.c \ cairo-clip.c \ cairo-clip-private.h \ cairo-color.c \ cairo-compiler-private.h \ cairo-debug.c \ cairo-fixed.c \ cairo-font-face.c \ cairo-font-options.c \ cairo-freelist.c \ cairo-freelist-private.h \ cairo-gstate.c \ cairo-gstate-private.h \ cairo-hash.c \ cairo-hash-private.h \ cairo-hull.c \ cairo-image-surface.c \ cairo-lzw.c \ cairo-misc.c \ cairo-malloc-private.h \ cairo-matrix.c \ cairo-mutex.c \ cairo-mutex-private.h \ cairo-mutex-type-private.h \ cairo-path.c \ cairo-path-private.h \ cairo-path-bounds.c \ cairo-path-fill.c \ cairo-path-fixed.c \ cairo-path-fixed-private.h \ cairo-path-stroke.c \ cairo-pen.c \ cairo-polygon.c \ cairo-rectangle.c \ cairo-reference-count-private.h \ cairo-region.c \ cairo-region-private.h \ cairo-scaled-font.c \ cairo-scaled-font-private.h \ cairo-skiplist.c \ cairo-skiplist-private.h \ cairo-slope.c \ cairo-spline.c \ cairo-stroke-style.c \ cairo-surface.c \ cairo-surface-fallback.c \ cairo-surface-fallback-private.h \ cairo-surface-private.h \ cairo-traps.c \ cairo-pattern.c \ cairo-unicode.c \ cairo-output-stream.c \ cairo-output-stream-private.h \ cairo-wideint.c \ cairo-wideint-private.h \ cairo-wideint-type-private.h \ cairo-meta-surface.c \ cairo-meta-surface-private.h \ cairo-paginated-private.h \ cairo-paginated-surface.c \ cairo-paginated-surface-private.h \ cairo-analysis-surface.c \ cairo-analysis-surface-private.h \ cairoint.h cairo_all_sources = $(cairo_base_sources) $(cairo_base_headers) cairo_headers = $(cairo_base_headers) cairo_sources = $(cairo_base_sources) font_subset_sources_base = \ cairo-cff-subset.c \ cairo-truetype-subset.c \ cairo-type1-fallback.c \ cairo-type1-private.h \ cairo-truetype-subset-private.h \ cairo-scaled-font-subsets.c \ cairo-scaled-font-subsets-private.h cairo_all_sources += $(font_subset_sources_base) font_subset_sources_ft = cairo-type1-subset.c cairo_all_sources += $(font_subset_sources_ft) font_subset_sources = $(font_subset_sources_base) if CAIRO_HAS_FT_FONT font_subset_sources += $(font_subset_sources_ft) endif ps_headers = cairo-ps.h ps_sources = cairo-ps-surface.c cairo-ps-surface-private.h cairo_all_sources += $(ps_headers) $(ps_sources) if CAIRO_HAS_PS_SURFACE libcairo_font_subset_sources = $(font_subset_sources) cairo_headers += $(ps_headers) cairo_sources += $(ps_sources) backend_pkgconfigs += cairo-ps.pc endif pdf_headers = cairo-pdf.h pdf_sources = cairo-pdf-surface.c cairo-pdf-surface-private.h \ cairo-pdf-operators.c cairo-pdf-operators-private.h \ cairo-deflate-stream.c cairo_all_sources += $(pdf_headers) $(pdf_sources) if CAIRO_HAS_PDF_SURFACE libcairo_font_subset_sources = $(font_subset_sources) cairo_headers += $(pdf_headers) cairo_sources += $(pdf_sources) backend_pkgconfigs += cairo-pdf.pc endif png_sources = cairo-png.c cairo_all_sources += $(png_sources) if CAIRO_HAS_PNG_FUNCTIONS cairo_sources += $(png_sources) backend_pkgconfigs += cairo-png.pc endif svg_headers = cairo-svg.h svg_sources = cairo-svg-surface.c cairo-svg-surface-private.h cairo_all_sources += $(svg_headers) $(svg_sources) if CAIRO_HAS_SVG_SURFACE libcairo_font_subset_sources = $(font_subset_sources) cairo_headers += $(svg_headers) cairo_sources += $(svg_sources) backend_pkgconfigs += cairo-svg.pc endif cairo_sources += $(libcairo_font_subset_sources) test_sources = test-fallback-surface.c test-fallback-surface.h \ test-meta-surface.c test-meta-surface.h \ test-paginated-surface.c test-paginated-surface.h cairo_all_sources += $(test_sources) if CAIRO_HAS_TEST_SURFACES cairo_sources += $(test_sources) endif xlib_headers = cairo-xlib.h xlib_sources = cairo-xlib-surface.c \ cairo-xlib-surface-private.h \ cairo-xlib-display.c \ cairo-xlib-screen.c \ cairo-xlib-visual.c \ cairo-xlib-private.h \ cairo-xlib-xrender-private.h cairo_all_sources += $(xlib_headers) $(xlib_sources) if CAIRO_HAS_XLIB_SURFACE cairo_headers += $(xlib_headers) cairo_sources += $(xlib_sources) backend_pkgconfigs += cairo-xlib.pc endif xlib_xrender_headers = cairo-xlib-xrender.h cairo_all_sources += $(xlib_xrender_headers) if CAIRO_HAS_XLIB_XRENDER_SURFACE cairo_headers += $(xlib_xrender_headers) backend_pkgconfigs += cairo-xlib-xrender.pc endif xcb_headers = cairo-xcb.h cairo-xcb-xrender.h xcb_sources = cairo-xcb-surface.c cairo_all_sources += $(xcb_headers) $(xcb_sources) if CAIRO_HAS_XCB_SURFACE cairo_headers += $(xcb_headers) cairo_sources += $(xcb_sources) backend_pkgconfigs += cairo-xcb.pc endif quartz_headers = cairo-quartz.h quartz_sources = cairo-quartz-surface.c cairo-quartz-image-surface.c cairo-quartz-private.h cairo_all_sources += $(quartz_headers) $(quartz_sources) if CAIRO_HAS_QUARTZ_SURFACE cairo_headers += $(quartz_headers) cairo_sources += $(quartz_sources) backend_pkgconfigs += cairo-quartz.pc endif if CAIRO_HAS_QUARTZ_IMAGE_SURFACE cairo_headers += cairo-quartz-image.h backend_pkgconfigs += cairo-quartz-image.pc endif quartz_font_sources = cairo-quartz-font.c cairo_all_sources += $(quartz_font_sources) if CAIRO_HAS_QUARTZ_FONT cairo_sources += $(quartz_font_sources) endif os_win32_sources = cairo-win32.c cairo_all_sources += $(os_win32_sources) if OS_WIN32 cairo_sources += $(os_win32_sources) export_symbols = -export-symbols cairo.def cairo_def_dependency = cairo.def endif win32_headers = cairo-win32.h win32_sources = cairo-win32-surface.c cairo-win32-printing-surface.c cairo-win32-private.h cairo_all_sources += $(win32_headers) $(win32_sources) if CAIRO_HAS_WIN32_SURFACE cairo_headers += $(win32_headers) cairo_sources += $(win32_sources) backend_pkgconfigs += cairo-win32.pc endif win32_font_sources = cairo-win32-font.c cairo_all_sources += $(win32_font_sources) if CAIRO_HAS_WIN32_FONT cairo_sources += $(win32_font_sources) backend_pkgconfigs += cairo-win32-font.pc endif os2_headers = cairo-os2.h os2_sources = cairo-os2-surface.c cairo-os2-private.h cairo_all_sources += $(os2_headers) $(os2_sources) if CAIRO_HAS_OS2_SURFACE cairo_headers += $(os2_headers) cairo_sources += $(os2_sources) backend_pkgconfigs += cairo-os2.pc endif beos_headers = cairo-beos.h beos_sources = cairo-beos-surface.cpp cairo_all_sources += $(beos_headers) $(beos_sources) if CAIRO_HAS_BEOS_SURFACE cairo_headers += $(beos_headers) backend_pkgconfigs += cairo-beos.pc #noinst_LTLIBRARIES = libcairo_beos.la #libcairo_beos_la_SOURCES = $(libcairo_beos_sources) # BeOS system headers trigger this warning #libcairo_beos_la_CXXFLAGS = -Wno-multichar endif glitz_headers = cairo-glitz.h glitz_sources = cairo-glitz-surface.c cairo-glitz-private.h cairo_all_sources += $(glitz_headers) $(glitz_sources) if CAIRO_HAS_GLITZ_SURFACE cairo_headers += $(glitz_headers) cairo_sources += $(glitz_sources) backend_pkgconfigs += cairo-glitz.pc endif directfb_headers = cairo-directfb.h directfb_sources = cairo-directfb-surface.c cairo_all_sources += $(directfb_headers) $(directfb_sources) if CAIRO_HAS_DIRECTFB_SURFACE cairo_headers += $(directfb_headers) cairo_sources += $(directfb_sources) backend_pkgconfigs += cairo-directfb.pc endif ft_headers = cairo-ft.h ft_sources = cairo-ft-font.c cairo-ft-private.h cairo_all_sources += $(ft_headers) $(ft_sources) if CAIRO_HAS_FT_FONT cairo_headers += $(ft_headers) cairo_sources += $(ft_sources) backend_pkgconfigs += cairo-ft.pc endif # These names match automake style variable definition conventions so # without these lines, automake will complain during the handling of # the libcairo_la_LIBADD below. (The INCLUDES is an autoconf only # term and automake does not care about it) FONTCONFIG_LIBS=@FONTCONFIG_LIBS@ XRENDER_LIBS=@XRENDER_LIBS@ cairoincludedir = $(includedir)/cairo noinst_HEADERS = \ cairo-deprecated.h \ $(cairo_headers) nodist_noinst_HEADERS = \ cairo-features.h noinst_LTLIBRARIES = libcairo.la # source files that cannot be passed to compiler directly. # mostly when they depend recursively on cairoint.h. that is, # cairoint.h includes them in the middle. cairo_special_sources = \ cairo-cache-private.h \ cairo-fixed-private.h \ cairo-fixed-type-private.h \ cairo-mutex-list-private.h \ cairo-types-private.h libcairo_la_SOURCES = \ $(cairo_sources) \ $(cairo_special_sources) cairo_all_source_file = \ $(cairo_all_sources) \ $(cairo_special_sources) libcairo_la_LDFLAGS = -version-info @VERSION_INFO@ -no-undefined $(export_symbols) libcairo_la_CFLAGS = -I$(srcdir) $(CAIRO_CFLAGS) libcairo_la_LIBADD = $(CAIRO_LIBS) $(CAIRO_LDADD) libcairo_la_DEPENDENCIES = $(cairo_def_dependency) pkgconfigdir = $(libdir)/pkgconfig noinst_DATA = cairo.pc $(backend_pkgconfigs) DISTCLEANFILES = $(backend_pkgconfigs) EXTRA_DIST = cairo-backend.pc.in $(backend_pkgconfigs): $(top_srcdir)/configure cd $(top_builddir) && ./config.status --recheck $(top_builddir)/config.h: $(top_srcdir)/config.h.in cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) config.h DISTCLEANFILES += cairo-features.h cairo-no-features.h cairo-features.h cairo-no-features.h: cd $(top_builddir) && ./config.status src/$@ CLEANFILES = cairo.def cairo.def: $(cairo_headers) cairo-features.h @echo Generating $@ @(echo EXPORTS; \ (cd $(srcdir); cat $(cairo_headers) || echo 'cairo_ERROR ()' ) | \ grep -v -E '^# *include' | \ ( gcc -include cairo-features.h -E - || echo 'cairo_ERROR ()' ) | \ grep -E '^cairo_.* \(' | \ sed -e 's/[ ].*//' | \ sort; \ echo LIBRARY libcairo-$(LT_CURRENT_MINUS_AGE).dll; \ ) >$@ @ ! grep -q cairo_ERROR $@ || ($(RM) $@; false) install-data-local: @if test -f "$(DESTDIR)$(includedir)/cairo.h" || test -f "$(DESTDIR)$(includedir)/cairo-features.h" ; then \ echo "****************************************************************" ; \ echo "*** Error: Old headers found. You should remove the following" ; \ echo "*** files and then type 'make install' again." ; \ ls $(includedir)/cairo*.h ; \ echo "****************************************************************" ; \ false ; \ fi TESTS_ENVIRONMENT = srcdir="$(srcdir)" MAKE="$(MAKE)" cairo_all_source_file="$(cairo_all_source_file)" TESTS = check-def.sh check-plt.sh check-headers.sh check-cairoint.sh check-doc-syntax.sh EXTRA_DIST += $(TESTS) check-has-hidden-symbols.c DISTCLEANFILES += check-has-hidden-symbols.i # The pre-processed result is used by check-{def,plt}.sh to determine whether # cairo has been compiled with symbol hiding. .c.i: $(noinst_HEADERS) $(nodist_noinst_HEADERS) cairoint.h $(top_builddir)/config.h $(CPP) -DHAVE_CONFIG_H -I$(top_builddir) -I. $(libcairo_la_CFLAGS) $< -o $@ SPARSE = sparse sparse: @status=true; for f in $(cairo_sources); do \ echo sparse $$f; \ $(SPARSE) -I$(top_builddir) $(libcairo_la_CFLAGS) -DHAVE_CONFIG_H $$f || status=false; \ done; $$status SPLINT = splint -badflag splint: @status=true; for f in $(cairo_sources); do \ test "$$f" = "`echo "$$f" | sed 's/[.]h$$//'`" || continue; \ echo sparse $$f; \ $(SPLINT) -I$(top_builddir) $(libcairo_la_CFLAGS) -DHAVE_CONFIG_H $$f || status=false; \ done; $$status EXTRA_DIST += Makefile.win32 libgdiplus-2.11/cairo/src/cairo-svg-surface.c0000664000175000017500000022723612225470167016110 00000000000000/* vim: set sw=4 sts=4: -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2005-2007 Emmanuel Pacaud * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Emmanuel Pacaud * Carl Worth */ #define _BSD_SOURCE /* for snprintf() */ #include "cairoint.h" #include "cairo-svg.h" #include "cairo-svg-surface-private.h" #include "cairo-path-fixed-private.h" #include "cairo-meta-surface-private.h" #include "cairo-paginated-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-output-stream-private.h" typedef struct cairo_svg_page cairo_svg_page_t; static const int invalid_pattern_id = -1; static const cairo_svg_version_t _cairo_svg_versions[] = { CAIRO_SVG_VERSION_1_1, CAIRO_SVG_VERSION_1_2 }; #define CAIRO_SVG_VERSION_LAST ARRAY_LENGTH (_cairo_svg_versions) static cairo_bool_t _cairo_svg_version_has_page_set_support (cairo_svg_version_t version) { return version > CAIRO_SVG_VERSION_1_1; } static const char * _cairo_svg_version_strings[CAIRO_SVG_VERSION_LAST] = { "SVG 1.1", "SVG 1.2" }; static const char * _cairo_svg_internal_version_strings[CAIRO_SVG_VERSION_LAST] = { "1.1", "1.2" }; struct cairo_svg_page { unsigned int surface_id; unsigned int clip_level; cairo_output_stream_t *xml_node; }; struct cairo_svg_document { cairo_output_stream_t *output_stream; unsigned long refcount; cairo_surface_t *owner; cairo_bool_t finished; double width; double height; cairo_output_stream_t *xml_node_defs; cairo_output_stream_t *xml_node_glyphs; unsigned int surface_id; unsigned int linear_pattern_id; unsigned int radial_pattern_id; unsigned int pattern_id; unsigned int filter_id; unsigned int clip_id; unsigned int mask_id; cairo_bool_t alpha_filter; cairo_array_t meta_snapshots; cairo_svg_version_t svg_version; cairo_scaled_font_subsets_t *font_subsets; }; typedef struct { unsigned int id; cairo_meta_surface_t *meta; } cairo_meta_snapshot_t; static cairo_status_t _cairo_svg_document_create (cairo_output_stream_t *stream, double width, double height, cairo_svg_version_t version, cairo_svg_document_t **document_out); static cairo_status_t _cairo_svg_document_destroy (cairo_svg_document_t *document); static cairo_status_t _cairo_svg_document_finish (cairo_svg_document_t *document); static cairo_svg_document_t * _cairo_svg_document_reference (cairo_svg_document_t *document); static unsigned int _cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document); static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, cairo_content_t content, double width, double height); static cairo_surface_t * _cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, double width, double height, cairo_svg_version_t version); static const cairo_surface_backend_t cairo_svg_surface_backend; static const cairo_paginated_surface_backend_t cairo_svg_surface_paginated_backend; /** * cairo_svg_surface_create_for_stream: * @write_func: a #cairo_write_func_t to accept the output data * @closure: the closure argument for @write_func * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a SVG surface of the specified size in points to be written * incrementally to the stream represented by @write_func and @closure. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 */ cairo_surface_t * cairo_svg_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width, double height) { cairo_output_stream_t *stream; stream = _cairo_output_stream_create (write_func, NULL, closure); if (_cairo_output_stream_get_status (stream)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); return _cairo_svg_surface_create_for_stream_internal (stream, width, height, CAIRO_SVG_VERSION_1_1); } /** * cairo_svg_surface_create: * @filename: a filename for the SVG output (must be writable) * @width_in_points: width of the surface, in points (1 point == 1/72.0 inch) * @height_in_points: height of the surface, in points (1 point == 1/72.0 inch) * * Creates a SVG surface of the specified size in points to be written * to @filename. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. * * Since: 1.2 **/ cairo_surface_t * cairo_svg_surface_create (const char *filename, double width, double height) { cairo_output_stream_t *stream; stream = _cairo_output_stream_create_for_filename (filename); if (_cairo_output_stream_get_status (stream)) return _cairo_surface_create_in_error (_cairo_output_stream_destroy (stream)); return _cairo_svg_surface_create_for_stream_internal (stream, width, height, CAIRO_SVG_VERSION_1_1); } static cairo_bool_t _cairo_surface_is_svg (cairo_surface_t *surface) { return surface->backend == &cairo_svg_surface_backend; } /* If the abstract_surface is a paginated surface, and that paginated * surface's target is a svg_surface, then set svg_surface to that * target. Otherwise return %CAIRO_STATUS_SURFACE_TYPE_MISMATCH. */ static cairo_status_t _extract_svg_surface (cairo_surface_t *surface, cairo_svg_surface_t **svg_surface) { cairo_surface_t *target; if (surface->status) return surface->status; if (! _cairo_surface_is_paginated (surface)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); target = _cairo_paginated_surface_get_target (surface); if (target->status) return target->status; if (! _cairo_surface_is_svg (target)) return _cairo_error (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); *svg_surface = (cairo_svg_surface_t *) target; return CAIRO_STATUS_SUCCESS; } /** * cairo_svg_surface_restrict_to_version: * @surface: a SVG #cairo_surface_t * @version: SVG version * * Restricts the generated SVG file to @version. See cairo_svg_get_versions() * for a list of available version values that can be used here. * * This function should only be called before any drawing operations * have been performed on the given surface. The simplest way to do * this is to call this function immediately after creating the * surface. * * Since: 1.2 **/ void cairo_svg_surface_restrict_to_version (cairo_surface_t *abstract_surface, cairo_svg_version_t version) { cairo_svg_surface_t *surface = NULL; /* hide compiler warning */ cairo_status_t status; status = _extract_svg_surface (abstract_surface, &surface); if (status) { status = _cairo_surface_set_error (abstract_surface, status); return; } if (version < CAIRO_SVG_VERSION_LAST) surface->document->svg_version = version; } /** * cairo_svg_get_versions: * @versions: supported version list * @num_versions: list length * * Used to retrieve the list of supported versions. See * cairo_svg_surface_restrict_to_version(). * * Since: 1.2 **/ void cairo_svg_get_versions (cairo_svg_version_t const **versions, int *num_versions) { if (versions != NULL) *versions = _cairo_svg_versions; if (num_versions != NULL) *num_versions = CAIRO_SVG_VERSION_LAST; } /** * cairo_svg_version_to_string: * @version: a version id * * Get the string representation of the given @version id. This function * will return %NULL if @version isn't valid. See cairo_svg_get_versions() * for a way to get the list of valid version ids. * * Return value: the string associated to given version. * * Since: 1.2 **/ const char * cairo_svg_version_to_string (cairo_svg_version_t version) { if (version >= CAIRO_SVG_VERSION_LAST) return NULL; return _cairo_svg_version_strings[version]; } static cairo_surface_t * _cairo_svg_surface_create_for_document (cairo_svg_document_t *document, cairo_content_t content, double width, double height) { cairo_svg_surface_t *surface; cairo_surface_t *paginated; cairo_status_t status, status_ignored; surface = malloc (sizeof (cairo_svg_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&surface->base, &cairo_svg_surface_backend, content); surface->width = width; surface->height = height; surface->document = _cairo_svg_document_reference (document); surface->clip_level = 0; surface->id = document->surface_id++; surface->base_clip = document->clip_id++; surface->is_base_clip_emitted = FALSE; surface->xml_node = _cairo_memory_stream_create (); status = _cairo_output_stream_get_status (surface->xml_node); if (status) goto CLEANUP; _cairo_array_init (&surface->page_set, sizeof (cairo_svg_page_t)); if (content == CAIRO_CONTENT_COLOR) { _cairo_output_stream_printf (surface->xml_node, "\n", width, height); status = _cairo_output_stream_get_status (surface->xml_node); if (status) goto CLEANUP; } surface->paginated_mode = CAIRO_PAGINATED_MODE_ANALYZE; surface->force_fallbacks = FALSE; surface->content = content; paginated = _cairo_paginated_surface_create (&surface->base, surface->content, surface->width, surface->height, &cairo_svg_surface_paginated_backend); status = paginated->status; if (status == CAIRO_STATUS_SUCCESS) return paginated; /* ignore status as we are on the error path */ CLEANUP: status_ignored = _cairo_output_stream_destroy (surface->xml_node); status_ignored = _cairo_svg_document_destroy (document); free (surface); return _cairo_surface_create_in_error (status); } static cairo_surface_t * _cairo_svg_surface_create_for_stream_internal (cairo_output_stream_t *stream, double width, double height, cairo_svg_version_t version) { cairo_svg_document_t *document = NULL; /* silence compiler */ cairo_surface_t *surface; cairo_status_t status; status = _cairo_svg_document_create (stream, width, height, version, &document); if (status) { surface = _cairo_surface_create_in_error (status); /* consume the output stream on behalf of caller */ status = _cairo_output_stream_destroy (stream); return surface; } surface = _cairo_svg_surface_create_for_document (document, CAIRO_CONTENT_COLOR_ALPHA, width, height); if (surface->status) { status = _cairo_svg_document_destroy (document); return surface; } document->owner = surface; status = _cairo_svg_document_destroy (document); /* the ref count should be 2 at this point */ assert (status == CAIRO_STATUS_SUCCESS); return surface; } static cairo_svg_page_t * _cairo_svg_surface_store_page (cairo_svg_surface_t *surface) { unsigned int i; cairo_svg_page_t page; cairo_output_stream_t *stream; cairo_status_t status; stream = _cairo_memory_stream_create (); if (_cairo_output_stream_get_status (stream)) { status = _cairo_output_stream_destroy (stream); return NULL; } page.surface_id = surface->id; page.clip_level = surface->clip_level; page.xml_node = surface->xml_node; if (_cairo_array_append (&surface->page_set, &page)) { status = _cairo_output_stream_destroy (stream); return NULL; } surface->xml_node = stream; surface->clip_level = 0; for (i = 0; i < page.clip_level; i++) _cairo_output_stream_printf (page.xml_node, "\n"); return _cairo_array_index (&surface->page_set, surface->page_set.num_elements - 1); } static cairo_int_status_t _cairo_svg_surface_copy_page (void *abstract_surface) { cairo_svg_surface_t *surface = abstract_surface; cairo_svg_page_t *page; page = _cairo_svg_surface_store_page (surface); if (page == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_memory_stream_copy (page->xml_node, surface->xml_node); surface->clip_level = page->clip_level; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_show_page (void *abstract_surface) { cairo_svg_surface_t *surface = abstract_surface; if (_cairo_svg_surface_store_page (surface) == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } static void _cairo_svg_surface_emit_transform (cairo_output_stream_t *output, char const *attribute_str, const cairo_matrix_t *object_matrix, const cairo_matrix_t *parent_matrix) { cairo_matrix_t matrix = *object_matrix; if (parent_matrix != NULL) cairo_matrix_multiply (&matrix, &matrix, parent_matrix); if (!_cairo_matrix_is_identity (&matrix)) _cairo_output_stream_printf (output, "%s=\"matrix(%f,%f,%f,%f,%f,%f)\"", attribute_str, matrix.xx, matrix.yx, matrix.xy, matrix.yy, matrix.x0, matrix.y0); } typedef struct { cairo_output_stream_t *output; cairo_matrix_t *ctm_inverse; } svg_path_info_t; static cairo_status_t _cairo_svg_path_move_to (void *closure, cairo_point_t *point) { svg_path_info_t *info = closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); if (info->ctm_inverse) cairo_matrix_transform_point (info->ctm_inverse, &x, &y); _cairo_output_stream_printf (info->output, "M %f %f ", x, y); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_path_line_to (void *closure, cairo_point_t *point) { svg_path_info_t *info = closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); if (info->ctm_inverse) cairo_matrix_transform_point (info->ctm_inverse, &x, &y); _cairo_output_stream_printf (info->output, "L %f %f ", x, y); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_path_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { svg_path_info_t *info = closure; double bx = _cairo_fixed_to_double (b->x); double by = _cairo_fixed_to_double (b->y); double cx = _cairo_fixed_to_double (c->x); double cy = _cairo_fixed_to_double (c->y); double dx = _cairo_fixed_to_double (d->x); double dy = _cairo_fixed_to_double (d->y); if (info->ctm_inverse) { cairo_matrix_transform_point (info->ctm_inverse, &bx, &by); cairo_matrix_transform_point (info->ctm_inverse, &cx, &cy); cairo_matrix_transform_point (info->ctm_inverse, &dx, &dy); } _cairo_output_stream_printf (info->output, "C %f %f %f %f %f %f ", bx, by, cx, cy, dx, dy); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_path_close_path (void *closure) { svg_path_info_t *info = closure; _cairo_output_stream_printf (info->output, "Z "); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_path (cairo_output_stream_t *output, cairo_path_fixed_t *path, cairo_matrix_t *ctm_inverse) { cairo_status_t status; svg_path_info_t info; _cairo_output_stream_printf (output, "d=\""); info.output = output; info.ctm_inverse = ctm_inverse; status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_svg_path_move_to, _cairo_svg_path_line_to, _cairo_svg_path_curve_to, _cairo_svg_path_close_path, &info); if (status) return status; _cairo_output_stream_printf (output, "\""); return status; } static cairo_int_status_t _cairo_svg_document_emit_outline_glyph_data (cairo_svg_document_t *document, cairo_scaled_font_t *scaled_font, unsigned long glyph_index) { cairo_scaled_glyph_t *scaled_glyph; cairo_int_status_t status; status = _cairo_scaled_glyph_lookup (scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS| CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); if (status) return status; _cairo_output_stream_printf (document->xml_node_glyphs, "xml_node_glyphs, scaled_glyph->path, NULL); if (status) return status; _cairo_output_stream_printf (document->xml_node_glyphs, "/>\n"); return status; } static cairo_int_status_t _cairo_svg_document_emit_bitmap_glyph_data (cairo_svg_document_t *document, cairo_scaled_font_t *scaled_font, unsigned long glyph_index) { cairo_image_surface_t *image; cairo_scaled_glyph_t *scaled_glyph; cairo_status_t status; unsigned char *row, *byte; int rows, cols; int x, y, bit; status = _cairo_scaled_glyph_lookup (scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS| CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status) return status; image = scaled_glyph->surface; if (image->format != CAIRO_FORMAT_A1) { image = _cairo_image_surface_clone (image, CAIRO_FORMAT_A1); if (cairo_surface_status (&image->base)) return cairo_surface_status (&image->base); } _cairo_output_stream_printf (document->xml_node_glyphs, "xml_node_glyphs, " transform", &image->base.device_transform_inverse, NULL); _cairo_output_stream_printf (document->xml_node_glyphs, ">/n"); for (y = 0, row = image->data, rows = image->height; rows; row += image->stride, rows--, y++) { for (x = 0, byte = row, cols = (image->width + 7) / 8; cols; byte++, cols--) { unsigned char output_byte = CAIRO_BITSWAP8_IF_LITTLE_ENDIAN (*byte); for (bit = 7; bit >= 0 && x < image->width; bit--, x++) { if (output_byte & (1 << bit)) { _cairo_output_stream_printf (document->xml_node_glyphs, "\n", x, y); } } } } _cairo_output_stream_printf (document->xml_node_glyphs, "\n"); if (image != scaled_glyph->surface) cairo_surface_destroy (&image->base); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_document_emit_glyph (cairo_svg_document_t *document, cairo_scaled_font_t *scaled_font, unsigned long scaled_font_glyph_index, unsigned int font_id, unsigned int subset_glyph_index) { cairo_status_t status; _cairo_output_stream_printf (document->xml_node_glyphs, "\n", font_id, subset_glyph_index); status = _cairo_svg_document_emit_outline_glyph_data (document, scaled_font, scaled_font_glyph_index); if (status == CAIRO_INT_STATUS_UNSUPPORTED) status = _cairo_svg_document_emit_bitmap_glyph_data (document, scaled_font, scaled_font_glyph_index); if (status) return status; _cairo_output_stream_printf (document->xml_node_glyphs, "\n"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_document_emit_font_subset (cairo_scaled_font_subset_t *font_subset, void *closure) { cairo_svg_document_t *document = closure; unsigned int i; cairo_status_t status = CAIRO_STATUS_SUCCESS; for (i = 0; i < font_subset->num_glyphs; i++) { status = _cairo_svg_document_emit_glyph (document, font_subset->scaled_font, font_subset->glyphs[i], font_subset->font_id, i); if (status) break; } return status; } static cairo_status_t _cairo_svg_document_emit_font_subsets (cairo_svg_document_t *document) { cairo_status_t status; status = _cairo_scaled_font_subsets_foreach_scaled (document->font_subsets, _cairo_svg_document_emit_font_subset, document); _cairo_scaled_font_subsets_destroy (document->font_subsets); document->font_subsets = NULL; return status; } static cairo_bool_t cairo_svg_force_fallbacks = FALSE; static cairo_int_status_t _cairo_svg_surface_analyze_operation (cairo_svg_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern) { cairo_svg_document_t *document = surface->document; if (cairo_svg_force_fallbacks) return FALSE; /* SVG doesn't support extend reflect for image pattern */ if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE && pattern->extend == CAIRO_EXTEND_REFLECT) return CAIRO_INT_STATUS_UNSUPPORTED; if (document->svg_version >= CAIRO_SVG_VERSION_1_2) return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_OVER) return CAIRO_STATUS_SUCCESS; /* The SOURCE operator is only supported if there is nothing * painted underneath. */ if (op == CAIRO_OPERATOR_SOURCE) return CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY; return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_int_status_t _cairo_svg_surface_operation_supported (cairo_svg_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern) { if (_cairo_svg_surface_analyze_operation (surface, op, pattern) != CAIRO_INT_STATUS_UNSUPPORTED) { return TRUE; } else { return FALSE; } } static cairo_surface_t * _cairo_svg_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); } static cairo_status_t _cairo_svg_surface_finish (void *abstract_surface) { cairo_status_t status, status2; cairo_svg_surface_t *surface = abstract_surface; cairo_svg_document_t *document = surface->document; cairo_svg_page_t *page; unsigned int i; if (_cairo_paginated_surface_get_target (document->owner) == &surface->base) status = _cairo_svg_document_finish (document); else status = CAIRO_STATUS_SUCCESS; if (surface->xml_node != NULL) { status2 = _cairo_output_stream_destroy (surface->xml_node); if (status == CAIRO_STATUS_SUCCESS) status = status2; } for (i = 0; i < surface->page_set.num_elements; i++) { page = _cairo_array_index (&surface->page_set, i); status2 = _cairo_output_stream_destroy (page->xml_node); if (status == CAIRO_STATUS_SUCCESS) status = status2; } _cairo_array_fini (&surface->page_set); status2 = _cairo_svg_document_destroy (document); if (status == CAIRO_STATUS_SUCCESS) status = status2; return status; } static void _cairo_svg_surface_emit_alpha_filter (cairo_svg_document_t *document) { if (document->alpha_filter) return; _cairo_output_stream_printf (document->xml_node_defs, "\n" " \n" "\n"); document->alpha_filter = TRUE; } typedef struct { cairo_output_stream_t *output; unsigned int in_mem; unsigned char src[3]; unsigned char dst[5]; unsigned int trailing; } base64_write_closure_t; static char const *base64_table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static cairo_status_t base64_write_func (void *closure, const unsigned char *data, unsigned int length) { base64_write_closure_t *info = (base64_write_closure_t *) closure; unsigned int i; unsigned char *src, *dst; dst = info->dst; src = info->src; if (info->in_mem + length < 3) { for (i = 0; i < length; i++) { src[i + info->in_mem] = *data; data++; } info->in_mem += length; return CAIRO_STATUS_SUCCESS; } while (info->in_mem + length >= 3) { for (i = 0; i < 3 - info->in_mem; i++) { src[i + info->in_mem] = *data; data++; length--; } dst[0] = base64_table[src[0] >> 2]; dst[1] = base64_table[(src[0] & 0x03) << 4 | src[1] >> 4]; dst[2] = base64_table[(src[1] & 0x0f) << 2 | src[2] >> 6]; dst[3] = base64_table[src[2] & 0xfc >> 2]; /* Special case for the last missing bits */ switch (info->trailing) { case 2: dst[2] = '='; case 1: dst[3] = '='; default: break; } _cairo_output_stream_write (info->output, dst, 4); info->in_mem = 0; } for (i = 0; i < length; i++) { src[i] = *data; data++; } info->in_mem = length; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_surface_base64_encode (cairo_surface_t *surface, cairo_output_stream_t *output) { cairo_status_t status; base64_write_closure_t info; unsigned int i; info.output = output; info.in_mem = 0; info.trailing = 0; memset (info.dst, '\x0', 5); _cairo_output_stream_printf (info.output, "data:image/png;base64,"); status = cairo_surface_write_to_png_stream (surface, base64_write_func, (void *) &info); if (status) return status; if (info.in_mem > 0) { for (i = info.in_mem; i < 3; i++) info.src[i] = '\x0'; info.trailing = 3 - info.in_mem; info.in_mem = 3; status = base64_write_func (&info, NULL, 0); } return status; } static cairo_status_t _cairo_svg_surface_emit_composite_image_pattern (cairo_output_stream_t *output, cairo_svg_surface_t *svg_surface, cairo_surface_pattern_t *pattern, int pattern_id, const cairo_matrix_t *parent_matrix, const char *extra_attributes) { cairo_surface_t *surface; cairo_surface_attributes_t surface_attr; cairo_rectangle_int_t extents; cairo_status_t status; cairo_matrix_t p2u; status = _cairo_pattern_acquire_surface ((cairo_pattern_t *)pattern, (cairo_surface_t *)svg_surface, 0, 0, (unsigned int)-1, (unsigned int)-1, &surface, &surface_attr); if (status) return status; status = _cairo_surface_get_extents (surface, &extents); if (status) goto FAIL; p2u = pattern->base.matrix; status = cairo_matrix_invert (&p2u); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); if (pattern_id != invalid_pattern_id) { _cairo_output_stream_printf (output, "\n"); } _cairo_output_stream_printf (output, " \n"); if (pattern_id != invalid_pattern_id) _cairo_output_stream_printf (output, "\n"); FAIL: _cairo_pattern_release_surface ((cairo_pattern_t *)pattern, surface, &surface_attr); return status; } static cairo_status_t _cairo_svg_surface_emit_meta_surface (cairo_svg_document_t *document, cairo_meta_surface_t *surface, int *id) { cairo_status_t status; cairo_surface_t *paginated_surface; cairo_svg_surface_t *svg_surface; cairo_meta_snapshot_t new_snapshot; cairo_array_t *page_set; cairo_output_stream_t *contents; cairo_meta_surface_t *meta; cairo_meta_snapshot_t *snapshot; unsigned int num_elements; unsigned int i; /* search in already emitted meta snapshots */ num_elements = document->meta_snapshots.num_elements; for (i = 0; i < num_elements; i++) { snapshot = _cairo_array_index (&document->meta_snapshots, i); meta = snapshot->meta; if (meta->commands.num_elements == surface->commands.num_elements && _cairo_array_index (&meta->commands, 0) == _cairo_array_index (&surface->commands, 0)) { *id = snapshot->id; return CAIRO_STATUS_SUCCESS; } } meta = (cairo_meta_surface_t *) _cairo_surface_snapshot (&surface->base); paginated_surface = _cairo_svg_surface_create_for_document (document, meta->content, meta->width_pixels, meta->height_pixels); if (paginated_surface->status) { cairo_surface_destroy (&meta->base); return paginated_surface->status; } svg_surface = (cairo_svg_surface_t *) _cairo_paginated_surface_get_target (paginated_surface); cairo_surface_set_fallback_resolution (paginated_surface, document->owner->x_fallback_resolution, document->owner->y_fallback_resolution); status = _cairo_meta_surface_replay (&meta->base, paginated_surface); if (status) { cairo_surface_destroy (&meta->base); cairo_surface_destroy (paginated_surface); return status; } cairo_surface_show_page (paginated_surface); status = cairo_surface_status (paginated_surface); if (status) { cairo_surface_destroy (&meta->base); cairo_surface_destroy (paginated_surface); return status; } new_snapshot.meta = meta; new_snapshot.id = svg_surface->id; status = _cairo_array_append (&document->meta_snapshots, &new_snapshot); if (status) { cairo_surface_destroy (&meta->base); cairo_surface_destroy (paginated_surface); return status; } if (!svg_surface->is_base_clip_emitted) { svg_surface->is_base_clip_emitted = TRUE; _cairo_output_stream_printf (document->xml_node_defs, "\n" " \n" "\n", svg_surface->base_clip, svg_surface->width, svg_surface->height); } if (meta->content == CAIRO_CONTENT_ALPHA) { _cairo_svg_surface_emit_alpha_filter (document); _cairo_output_stream_printf (document->xml_node_defs, "\n", svg_surface->id, svg_surface->base_clip); } else { _cairo_output_stream_printf (document->xml_node_defs, "\n", svg_surface->id, svg_surface->base_clip); } contents = svg_surface->xml_node; page_set = &svg_surface->page_set; if (_cairo_memory_stream_length (contents) > 0) { if (_cairo_svg_surface_store_page (svg_surface) == NULL) { cairo_surface_destroy (paginated_surface); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } if (page_set->num_elements > 0) { cairo_svg_page_t *page; page = _cairo_array_index (page_set, page_set->num_elements - 1); _cairo_memory_stream_copy (page->xml_node, document->xml_node_defs); } _cairo_output_stream_printf (document->xml_node_defs, "\n"); *id = new_snapshot.id; status = cairo_surface_status (paginated_surface); cairo_surface_destroy (paginated_surface); /* FIXME: cairo_paginated_surface doesn't take a ref to the * passed in target surface so we can't call destroy here. * cairo_paginated_surface should be fixed, but for now just * work around it. */ /* cairo_surface_destroy (svg_surface); */ return status; } static cairo_status_t _cairo_svg_surface_emit_composite_meta_pattern (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_surface_pattern_t *pattern, int pattern_id, const cairo_matrix_t *parent_matrix, const char *extra_attributes) { cairo_svg_document_t *document = surface->document; cairo_meta_surface_t *meta_surface; cairo_matrix_t p2u; cairo_status_t status; int id = 0; p2u = pattern->base.matrix; status = cairo_matrix_invert (&p2u); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); meta_surface = (cairo_meta_surface_t *) pattern->surface; status = _cairo_svg_surface_emit_meta_surface (document, meta_surface, &id); if (status) return status; if (pattern_id != invalid_pattern_id) { _cairo_output_stream_printf (output, "width_pixels, meta_surface->height_pixels); _cairo_svg_surface_emit_transform (output, " patternTransform", &p2u, parent_matrix); _cairo_output_stream_printf (output, ">\n"); } _cairo_output_stream_printf (output, "\n"); if (pattern_id != invalid_pattern_id) _cairo_output_stream_printf (output, "\n"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_composite_pattern (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_surface_pattern_t *pattern, int pattern_id, const cairo_matrix_t *parent_matrix, const char *extra_attributes) { if (_cairo_surface_is_meta (pattern->surface)) { return _cairo_svg_surface_emit_composite_meta_pattern (output, surface, pattern, pattern_id, parent_matrix, extra_attributes); } return _cairo_svg_surface_emit_composite_image_pattern (output, surface, pattern, pattern_id, parent_matrix, extra_attributes); } static void _cairo_svg_surface_emit_operator (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_operator_t op) { char const *op_str[] = { "clear", "src", "src-over", "src-in", "src-out", "src-atop", "dst", "dst-over", "dst-in", "dst-out", "dst-atop", "xor", "plus", "color-dodge" /* FIXME: saturate ? */ }; if (surface->document->svg_version >= CAIRO_SVG_VERSION_1_2) _cairo_output_stream_printf (output, "comp-op: %s; ", op_str[op]); } static cairo_status_t _cairo_svg_surface_emit_solid_pattern (cairo_svg_surface_t *surface, cairo_solid_pattern_t *pattern, cairo_output_stream_t *style, cairo_bool_t is_stroke) { _cairo_output_stream_printf (style, is_stroke ? "stroke: rgb(%f%%,%f%%,%f%%); stroke-opacity: %f;": "fill: rgb(%f%%,%f%%,%f%%); fill-opacity: %f;", pattern->color.red * 100.0, pattern->color.green * 100.0, pattern->color.blue * 100.0, pattern->color.alpha); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_surface_pattern (cairo_svg_surface_t *surface, cairo_surface_pattern_t *pattern, cairo_output_stream_t *style, cairo_bool_t is_stroke, const cairo_matrix_t *parent_matrix) { cairo_svg_document_t *document = surface->document; cairo_status_t status; int pattern_id; pattern_id = document->pattern_id++; status = _cairo_svg_surface_emit_composite_pattern (document->xml_node_defs, surface, pattern, pattern_id, parent_matrix, NULL); if (status) return status; _cairo_output_stream_printf (style, "%s: url(#pattern%d);", is_stroke ? "stroke" : "fill", pattern_id); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_pattern_stops (cairo_output_stream_t *output, cairo_gradient_pattern_t const *pattern, double start_offset, cairo_bool_t reverse_stops, cairo_bool_t emulate_reflect) { cairo_gradient_stop_t *stops; double offset; unsigned int n_stops; unsigned int i; if (pattern->n_stops < 1) return CAIRO_STATUS_SUCCESS; if (pattern->n_stops == 1) { _cairo_output_stream_printf (output, "\n", pattern->stops[0].offset, pattern->stops[0].color.red * 100.0, pattern->stops[0].color.green * 100.0, pattern->stops[0].color.blue * 100.0, pattern->stops[0].color.alpha); return CAIRO_STATUS_SUCCESS; } if (emulate_reflect || reverse_stops) { n_stops = emulate_reflect ? pattern->n_stops * 2 - 2: pattern->n_stops; stops = _cairo_malloc_ab (n_stops, sizeof (cairo_gradient_stop_t)); if (stops == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < pattern->n_stops; i++) { if (reverse_stops) { stops[i] = pattern->stops[pattern->n_stops - i - 1]; stops[i].offset = 1.0 - stops[i].offset; } else stops[i] = pattern->stops[i]; if (emulate_reflect) { stops[i].offset /= 2; if (i > 0 && i < (pattern->n_stops - 1)) { if (reverse_stops) { stops[i + pattern->n_stops - 1] = pattern->stops[i]; stops[i + pattern->n_stops - 1].offset = 0.5 + 0.5 * stops[i + pattern->n_stops - 1].offset; } else { stops[i + pattern->n_stops - 1] = pattern->stops[pattern->n_stops - i - 1]; stops[i + pattern->n_stops - 1].offset = 1 - 0.5 * stops[i + pattern->n_stops - 1].offset; } } } } } else { n_stops = pattern->n_stops; stops = pattern->stops; } if (start_offset >= 0.0) for (i = 0; i < n_stops; i++) { offset = start_offset + (1 - start_offset ) * stops[i].offset; _cairo_output_stream_printf (output, "\n", offset, stops[i].color.red * 100.0, stops[i].color.green * 100.0, stops[i].color.blue * 100.0, stops[i].color.alpha); } else { cairo_bool_t found = FALSE; unsigned int offset_index; cairo_color_t offset_color_start, offset_color_stop; for (i = 0; i < n_stops; i++) { if (stops[i].offset >= -start_offset) { if (i > 0) { if (stops[i].offset != stops[i-1].offset) { double x0, x1; cairo_color_t *color0, *color1; x0 = stops[i-1].offset; x1 = stops[i].offset; color0 = &stops[i-1].color; color1 = &stops[i].color; offset_color_start.red = color0->red + (color1->red - color0->red) * (-start_offset - x0) / (x1 - x0); offset_color_start.green = color0->green + (color1->green - color0->green) * (-start_offset - x0) / (x1 - x0); offset_color_start.blue = color0->blue + (color1->blue - color0->blue) * (-start_offset - x0) / (x1 - x0); offset_color_start.alpha = color0->alpha + (color1->alpha - color0->alpha) * (-start_offset - x0) / (x1 - x0); offset_color_stop = offset_color_start; } else { offset_color_stop = stops[i-1].color; offset_color_start = stops[i].color; } } else offset_color_stop = offset_color_start = stops[i].color; offset_index = i; found = TRUE; break; } } if (!found) { offset_index = n_stops - 1; offset_color_stop = offset_color_start = stops[offset_index].color; } _cairo_output_stream_printf (output, "\n", offset_color_start.red * 100.0, offset_color_start.green * 100.0, offset_color_start.blue * 100.0, offset_color_start.alpha); for (i = offset_index; i < n_stops; i++) { _cairo_output_stream_printf (output, "\n", stops[i].offset + start_offset, stops[i].color.red * 100.0, stops[i].color.green * 100.0, stops[i].color.blue * 100.0, stops[i].color.alpha); } for (i = 0; i < offset_index; i++) { _cairo_output_stream_printf (output, "\n", 1.0 + stops[i].offset + start_offset, stops[i].color.red * 100.0, stops[i].color.green * 100.0, stops[i].color.blue * 100.0, stops[i].color.alpha); } _cairo_output_stream_printf (output, "\n", offset_color_stop.red * 100.0, offset_color_stop.green * 100.0, offset_color_stop.blue * 100.0, offset_color_stop.alpha); } if (reverse_stops || emulate_reflect) free (stops); return CAIRO_STATUS_SUCCESS; } static void _cairo_svg_surface_emit_pattern_extend (cairo_output_stream_t *output, cairo_pattern_t *pattern) { switch (pattern->extend) { case CAIRO_EXTEND_REPEAT: _cairo_output_stream_printf (output, "spreadMethod=\"repeat\" "); break; case CAIRO_EXTEND_REFLECT: _cairo_output_stream_printf (output, "spreadMethod=\"reflect\" "); break; case CAIRO_EXTEND_NONE: case CAIRO_EXTEND_PAD: break; } } static cairo_status_t _cairo_svg_surface_emit_linear_pattern (cairo_svg_surface_t *surface, cairo_linear_pattern_t *pattern, cairo_output_stream_t *style, cairo_bool_t is_stroke, const cairo_matrix_t *parent_matrix) { cairo_svg_document_t *document = surface->document; double x0, y0, x1, y1; cairo_matrix_t p2u; cairo_status_t status; p2u = pattern->base.base.matrix; status = cairo_matrix_invert (&p2u); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); x0 = _cairo_fixed_to_double (pattern->p1.x); y0 = _cairo_fixed_to_double (pattern->p1.y); x1 = _cairo_fixed_to_double (pattern->p2.x); y1 = _cairo_fixed_to_double (pattern->p2.y); _cairo_output_stream_printf (document->xml_node_defs, "linear_pattern_id, x0, y0, x1, y1); _cairo_svg_surface_emit_pattern_extend (document->xml_node_defs, &pattern->base.base), _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); _cairo_output_stream_printf (document->xml_node_defs, ">\n"); status = _cairo_svg_surface_emit_pattern_stops (document->xml_node_defs, &pattern->base, 0.0, FALSE, FALSE); if (status) return status; _cairo_output_stream_printf (document->xml_node_defs, "\n"); _cairo_output_stream_printf (style, "%s: url(#linear%d);", is_stroke ? "stroke" : "fill", document->linear_pattern_id); document->linear_pattern_id++; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_radial_pattern (cairo_svg_surface_t *surface, cairo_radial_pattern_t *pattern, cairo_output_stream_t *style, cairo_bool_t is_stroke, const cairo_matrix_t *parent_matrix) { cairo_svg_document_t *document = surface->document; cairo_matrix_t p2u; cairo_extend_t extend; double x0, y0, x1, y1, r0, r1; double fx, fy; cairo_bool_t reverse_stops; cairo_status_t status; cairo_point_t *c0, *c1; cairo_fixed_t radius0, radius1; extend = pattern->base.base.extend; if (pattern->r1 < pattern->r2) { c0 = &pattern->c1; c1 = &pattern->c2; radius0 = pattern->r1; radius1 = pattern->r2; reverse_stops = FALSE; } else { c0 = &pattern->c2; c1 = &pattern->c1; radius0 = pattern->r2; radius1 = pattern->r1; reverse_stops = TRUE; } x0 = _cairo_fixed_to_double (c0->x); y0 = _cairo_fixed_to_double (c0->y); r0 = _cairo_fixed_to_double (radius0); x1 = _cairo_fixed_to_double (c1->x); y1 = _cairo_fixed_to_double (c1->y); r1 = _cairo_fixed_to_double (radius1); p2u = pattern->base.base.matrix; status = cairo_matrix_invert (&p2u); /* cairo_pattern_set_matrix ensures the matrix is invertible */ assert (status == CAIRO_STATUS_SUCCESS); if (pattern->r1 == pattern->r2) { unsigned int n_stops = pattern->base.n_stops; _cairo_output_stream_printf (document->xml_node_defs, "radial_pattern_id, x1, y1, x1, y1, r1); _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); _cairo_output_stream_printf (document->xml_node_defs, ">\n"); if (extend == CAIRO_EXTEND_NONE || n_stops < 1) _cairo_output_stream_printf (document->xml_node_defs, "\n"); else { _cairo_output_stream_printf (document->xml_node_defs, "\n", pattern->base.stops[0].color.red * 100.0, pattern->base.stops[0].color.green * 100.0, pattern->base.stops[0].color.blue * 100.0, pattern->base.stops[0].color.alpha); if (n_stops > 1) _cairo_output_stream_printf (document->xml_node_defs, "\n", pattern->base.stops[n_stops - 1].color.red * 100.0, pattern->base.stops[n_stops - 1].color.green * 100.0, pattern->base.stops[n_stops - 1].color.blue * 100.0, pattern->base.stops[n_stops - 1].color.alpha); } } else { double offset, r, x, y; cairo_bool_t emulate_reflect = FALSE; fx = (r1 * x0 - r0 * x1) / (r1 - r0); fy = (r1 * y0 - r0 * y1) / (r1 - r0); /* SVG doesn't support the inner circle and use instead a gradient focal. * That means we need to emulate the cairo behaviour by processing the * cairo gradient stops. * The CAIRO_EXTENT_NONE and CAIRO_EXTENT_PAD modes are quite easy to handle, * it's just a matter of stop position translation and calculation of * the corresponding SVG radial gradient focal. * The CAIRO_EXTENT_REFLECT and CAIRO_EXTEND_REPEAT modes require to compute a new * radial gradient, with an new outer circle, equal to r1 - r0 in the CAIRO_EXTEND_REPEAT * case, and 2 * (r1 - r0) in the CAIRO_EXTENT_REFLECT case, and a new gradient stop * list that maps to the original cairo stop list. */ if ((extend == CAIRO_EXTEND_REFLECT || extend == CAIRO_EXTEND_REPEAT) && r0 > 0.0) { double r_org = r1; if (extend == CAIRO_EXTEND_REFLECT) { r1 = 2 * r1 - r0; emulate_reflect = TRUE; } offset = fmod (r1, r1 - r0) / (r1 - r0) - 1.0; r = r1 - r0; /* New position of outer circle. */ x = r * (x1 - fx) / r_org + fx; y = r * (y1 - fy) / r_org + fy; x1 = x; y1 = y; r1 = r; r0 = 0.0; } else { offset = r0 / r1; } _cairo_output_stream_printf (document->xml_node_defs, "radial_pattern_id, x1, y1, fx, fy, r1); if (emulate_reflect) _cairo_output_stream_printf (document->xml_node_defs, "spreadMethod=\"repeat\" "); else _cairo_svg_surface_emit_pattern_extend (document->xml_node_defs, &pattern->base.base); _cairo_svg_surface_emit_transform (document->xml_node_defs, "gradientTransform", &p2u, parent_matrix); _cairo_output_stream_printf (document->xml_node_defs, ">\n"); /* To support cairo's EXTEND_NONE, (for which SVG has no similar * notion), we add transparent color stops on either end of the * user-provided stops. */ if (extend == CAIRO_EXTEND_NONE) { _cairo_output_stream_printf (document->xml_node_defs, "\n"); if (r0 != 0.0) _cairo_output_stream_printf (document->xml_node_defs, "\n", r0 / r1); } status = _cairo_svg_surface_emit_pattern_stops (document->xml_node_defs, &pattern->base, offset, reverse_stops, emulate_reflect); if (status) return status; if (pattern->base.base.extend == CAIRO_EXTEND_NONE) _cairo_output_stream_printf (document->xml_node_defs, "\n"); } _cairo_output_stream_printf (document->xml_node_defs, "\n"); _cairo_output_stream_printf (style, "%s: url(#radial%d);", is_stroke ? "stroke" : "fill", document->radial_pattern_id); document->radial_pattern_id++; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_pattern (cairo_svg_surface_t *surface, cairo_pattern_t *pattern, cairo_output_stream_t *output, cairo_bool_t is_stroke, const cairo_matrix_t *parent_matrix) { switch (pattern->type) { case CAIRO_PATTERN_TYPE_SOLID: return _cairo_svg_surface_emit_solid_pattern (surface, (cairo_solid_pattern_t *) pattern, output, is_stroke); case CAIRO_PATTERN_TYPE_SURFACE: return _cairo_svg_surface_emit_surface_pattern (surface, (cairo_surface_pattern_t *) pattern, output, is_stroke, parent_matrix); case CAIRO_PATTERN_TYPE_LINEAR: return _cairo_svg_surface_emit_linear_pattern (surface, (cairo_linear_pattern_t *) pattern, output, is_stroke, parent_matrix); case CAIRO_PATTERN_TYPE_RADIAL: return _cairo_svg_surface_emit_radial_pattern (surface, (cairo_radial_pattern_t *) pattern, output, is_stroke, parent_matrix); } return _cairo_error (CAIRO_STATUS_PATTERN_TYPE_MISMATCH); } static cairo_status_t _cairo_svg_surface_emit_fill_style (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_fill_rule_t fill_rule, cairo_matrix_t *parent_matrix) { _cairo_output_stream_printf (output, "fill-rule: %s; ", fill_rule == CAIRO_FILL_RULE_EVEN_ODD ? "evenodd" : "nonzero"); _cairo_svg_surface_emit_operator (output, surface, op); return _cairo_svg_surface_emit_pattern (surface, source, output, FALSE, parent_matrix); } static cairo_status_t _cairo_svg_surface_emit_stroke_style (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *parent_matrix) { cairo_status_t status; const char *line_cap, *line_join; unsigned int i; switch (stroke_style->line_cap) { case CAIRO_LINE_CAP_BUTT: line_cap = "butt"; break; case CAIRO_LINE_CAP_ROUND: line_cap = "round"; break; case CAIRO_LINE_CAP_SQUARE: line_cap = "square"; break; default: ASSERT_NOT_REACHED; } switch (stroke_style->line_join) { case CAIRO_LINE_JOIN_MITER: line_join = "miter"; break; case CAIRO_LINE_JOIN_ROUND: line_join = "round"; break; case CAIRO_LINE_JOIN_BEVEL: line_join = "bevel"; break; default: ASSERT_NOT_REACHED; } _cairo_output_stream_printf (output, "stroke-width: %f; " "stroke-linecap: %s; " "stroke-linejoin: %s; ", stroke_style->line_width, line_cap, line_join); status = _cairo_svg_surface_emit_pattern (surface, source, output, TRUE, parent_matrix); if (status) return status; _cairo_svg_surface_emit_operator (output, surface, op); if (stroke_style->num_dashes > 0) { _cairo_output_stream_printf (output, "stroke-dasharray: "); for (i = 0; i < stroke_style->num_dashes; i++) { _cairo_output_stream_printf (output, "%f", stroke_style->dash[i]); if (i + 1 < stroke_style->num_dashes) _cairo_output_stream_printf (output, ","); else _cairo_output_stream_printf (output, "; "); } if (stroke_style->dash_offset != 0.0) { _cairo_output_stream_printf (output, "stroke-dashoffset: %f; ", stroke_style->dash_offset); } } _cairo_output_stream_printf (output, "stroke-miterlimit: %f; ", stroke_style->miter_limit); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_fill_stroke (void *abstract_surface, cairo_operator_t fill_op, cairo_pattern_t *fill_source, cairo_fill_rule_t fill_rule, double fill_tolerance, cairo_antialias_t fill_antialias, cairo_path_fixed_t *path, cairo_operator_t stroke_op, cairo_pattern_t *stroke_source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double stroke_tolerance, cairo_antialias_t stroke_antialias) { cairo_svg_surface_t *surface = abstract_surface; cairo_status_t status; _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, fill_op, fill_source, fill_rule, stroke_ctm_inverse); if (status) return status; status = _cairo_svg_surface_emit_stroke_style (surface->xml_node, surface, stroke_op, stroke_source, stroke_style, stroke_ctm_inverse); if (status) return status; _cairo_output_stream_printf (surface->xml_node, "\" "); status = _cairo_svg_surface_emit_path (surface->xml_node, path, stroke_ctm_inverse); if (status) return status; _cairo_svg_surface_emit_transform (surface->xml_node, " transform", stroke_ctm, NULL); _cairo_output_stream_printf (surface->xml_node, "/>\n"); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_svg_surface_t *surface = abstract_surface; cairo_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, source); assert (_cairo_svg_surface_operation_supported (surface, op, source)); _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, op, source, fill_rule, NULL); if (status) return status; _cairo_output_stream_printf (surface->xml_node, "\" "); status = _cairo_svg_surface_emit_path (surface->xml_node, path, NULL); if (status) return status; _cairo_output_stream_printf (surface->xml_node, "/>\n"); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_svg_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; /* XXX: The conversion to integers here is pretty bogus, (not to * mention the aribitray limitation of width to a short(!). We * may need to come up with a better interface for get_size. */ rectangle->width = (int) ceil (surface->width); rectangle->height = (int) ceil (surface->height); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_svg_surface_emit_paint (cairo_output_stream_t *output, cairo_svg_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, const char *extra_attributes) { cairo_status_t status; if (source->type == CAIRO_PATTERN_TYPE_SURFACE && source->extend == CAIRO_EXTEND_NONE) return _cairo_svg_surface_emit_composite_pattern (output, surface, (cairo_surface_pattern_t *) source, invalid_pattern_id, NULL, extra_attributes); _cairo_output_stream_printf (output, "width, surface->height); _cairo_svg_surface_emit_operator (output, surface, op); status = _cairo_svg_surface_emit_pattern (surface, source, output, FALSE, NULL); if (status) return status; _cairo_output_stream_printf (output, " stroke: none;\""); if (extra_attributes) _cairo_output_stream_printf (output, " %s", extra_attributes); _cairo_output_stream_printf (output, "/>\n"); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_status_t status; cairo_svg_surface_t *surface = abstract_surface; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, source); /* XXX: It would be nice to be able to assert this condition * here. But, we actually allow one 'cheat' that is used when * painting the final image-based fallbacks. The final fallbacks * do have alpha which we support by blending with white. This is * possible only because there is nothing between the fallback * images and the paper, nor is anything painted above. */ /* assert (_cairo_svg_surface_operation_supported (surface, op, source)); */ /* Emulation of clear and source operators, when no clipping region * is defined. We just delete existing content of surface root node, * and exit early if operator is clear. * XXX: optimization of SOURCE operator doesn't work, since analyze * above always return FALSE. In order to make it work, we need a way * to know if there's an active clipping path. * Optimization of CLEAR works because of a test in paginated surface, * and an optimiszation in meta surface. */ if (surface->clip_level == 0 && (op == CAIRO_OPERATOR_CLEAR || op == CAIRO_OPERATOR_SOURCE)) { status = _cairo_output_stream_destroy (surface->xml_node); if (status) { surface->xml_node = NULL; return status; } surface->xml_node = _cairo_memory_stream_create (); if (_cairo_output_stream_get_status (surface->xml_node)) { status = _cairo_output_stream_destroy (surface->xml_node); surface->xml_node = NULL; return status; } if (op == CAIRO_OPERATOR_CLEAR) { if (surface->content == CAIRO_CONTENT_COLOR) { _cairo_output_stream_printf (surface->xml_node, "\n", surface->width, surface->height); } return CAIRO_STATUS_SUCCESS; } } return _cairo_svg_surface_emit_paint (surface->xml_node, surface, op, source, NULL); } static cairo_int_status_t _cairo_svg_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_status_t status; cairo_svg_surface_t *surface = abstract_surface; cairo_svg_document_t *document = surface->document; cairo_output_stream_t *mask_stream; char buffer[64]; cairo_bool_t discard_filter = FALSE; unsigned int mask_id; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, source); assert (_cairo_svg_surface_operation_supported (surface, op, source)); if (cairo_pattern_get_type (mask) == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t*) mask; cairo_content_t content = cairo_surface_get_content (surface_pattern->surface); if (content == CAIRO_CONTENT_ALPHA) discard_filter = TRUE; } if (!discard_filter) _cairo_svg_surface_emit_alpha_filter (document); /* _cairo_svg_surface_emit_paint() will output a pattern definition to * document->xml_node_defs so we need to write the mask element to * a temporary stream and then copy that to xml_node_defs. */ mask_stream = _cairo_memory_stream_create (); if (_cairo_output_stream_get_status (mask_stream)) return _cairo_output_stream_destroy (mask_stream); mask_id = _cairo_svg_document_allocate_mask_id (document); _cairo_output_stream_printf (mask_stream, "\n" "%s", mask_id, discard_filter ? "" : " \n"); status = _cairo_svg_surface_emit_paint (mask_stream, surface, op, mask, NULL); if (status) { cairo_status_t ignore = _cairo_output_stream_destroy (mask_stream); return status; (void) ignore; } _cairo_output_stream_printf (mask_stream, "%s" "\n", discard_filter ? "" : " \n"); _cairo_memory_stream_copy (mask_stream, document->xml_node_defs); status = _cairo_output_stream_destroy (mask_stream); if (status) return status; snprintf (buffer, sizeof buffer, "mask=\"url(#mask%d)\"", mask_id); status = _cairo_svg_surface_emit_paint (surface->xml_node, surface, op, source, buffer); if (status) return status; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_stroke (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_svg_surface_t *surface = abstract_dst; cairo_status_t status; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, source); assert (_cairo_svg_surface_operation_supported (surface, op, source)); _cairo_output_stream_printf (surface->xml_node, "xml_node, surface, op, source, stroke_style, ctm_inverse); if (status) return status; _cairo_output_stream_printf (surface->xml_node, "\" "); status = _cairo_svg_surface_emit_path (surface->xml_node, path, ctm_inverse); if (status) return status; _cairo_svg_surface_emit_transform (surface->xml_node, " transform", ctm, NULL); _cairo_output_stream_printf (surface->xml_node, "/>\n"); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_svg_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_svg_surface_t *surface = abstract_surface; cairo_svg_document_t *document = surface->document; cairo_path_fixed_t path; cairo_status_t status; cairo_scaled_font_subsets_glyph_t subset_glyph; int i; if (surface->paginated_mode == CAIRO_PAGINATED_MODE_ANALYZE) return _cairo_svg_surface_analyze_operation (surface, op, pattern); assert (_cairo_svg_surface_operation_supported (surface, op, pattern)); if (num_glyphs <= 0) return CAIRO_STATUS_SUCCESS; /* FIXME it's probably possible to apply a pattern of a gradient to * a group of symbols, but I don't know how yet. Gradients or patterns * are translated by x and y properties of use element. */ if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) goto FALLBACK; _cairo_output_stream_printf (surface->xml_node, "xml_node, FALSE, NULL); if (status) return status; _cairo_output_stream_printf (surface->xml_node, "\">\n"); for (i = 0; i < num_glyphs; i++) { status = _cairo_scaled_font_subsets_map_glyph (document->font_subsets, scaled_font, glyphs[i].index, &subset_glyph); if (status == CAIRO_INT_STATUS_UNSUPPORTED) { _cairo_output_stream_printf (surface->xml_node, "\n"); glyphs += i; num_glyphs -= i; goto FALLBACK; } if (status) return status; _cairo_output_stream_printf (surface->xml_node, " \n", subset_glyph.font_id, subset_glyph.subset_glyph_index, glyphs[i].x, glyphs[i].y); } _cairo_output_stream_printf (surface->xml_node, "\n"); return CAIRO_STATUS_SUCCESS; FALLBACK: _cairo_path_fixed_init (&path); status = _cairo_scaled_font_glyph_path (scaled_font,(cairo_glyph_t *) glyphs, num_glyphs, &path); if (status) { _cairo_path_fixed_fini (&path); return status; } status = _cairo_svg_surface_fill (abstract_surface, op, pattern, &path, CAIRO_FILL_RULE_WINDING, 0.0, CAIRO_ANTIALIAS_SUBPIXEL); _cairo_path_fixed_fini (&path); return status; } static cairo_int_status_t _cairo_svg_surface_intersect_clip_path (void *dst, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_svg_surface_t *surface = dst; cairo_svg_document_t *document = surface->document; cairo_status_t status; unsigned int i; if (path == NULL) { for (i = 0; i < surface->clip_level; i++) _cairo_output_stream_printf (surface->xml_node, "\n"); surface->clip_level = 0; return CAIRO_STATUS_SUCCESS; } _cairo_output_stream_printf (document->xml_node_defs, "\n" " clip_id); status = _cairo_svg_surface_emit_path (document->xml_node_defs, path, NULL); if (status) return status; _cairo_output_stream_printf (document->xml_node_defs, "/>\n" "\n"); _cairo_output_stream_printf (surface->xml_node, "\n", document->clip_id, fill_rule == CAIRO_FILL_RULE_EVEN_ODD ? "evenodd" : "nonzero"); document->clip_id++; surface->clip_level++; return CAIRO_STATUS_SUCCESS; } static void _cairo_svg_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { _cairo_font_options_init_default (options); cairo_font_options_set_hint_style (options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_OFF); cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_GRAY); } static const cairo_surface_backend_t cairo_svg_surface_backend = { CAIRO_SURFACE_TYPE_SVG, _cairo_svg_surface_create_similar, _cairo_svg_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* _cairo_svg_surface_composite, */ NULL, /* _cairo_svg_surface_fill_rectangles, */ NULL, /* _cairo_svg_surface_composite_trapezoids,*/ _cairo_svg_surface_copy_page, _cairo_svg_surface_show_page, NULL, /* set_clip_region */ _cairo_svg_surface_intersect_clip_path, _cairo_svg_surface_get_extents, NULL, /* _cairo_svg_surface_old_show_glyphs, */ _cairo_svg_surface_get_font_options, NULL, /* flush */ NULL, /* mark dirty rectangle */ NULL, /* scaled font fini */ NULL, /* scaled glyph fini */ _cairo_svg_surface_paint, _cairo_svg_surface_mask, _cairo_svg_surface_stroke, _cairo_svg_surface_fill, _cairo_svg_surface_show_glyphs, NULL, /* snapshot */ NULL, /* is_similar */ NULL, /* reset */ _cairo_svg_surface_fill_stroke }; static cairo_status_t _cairo_svg_document_create (cairo_output_stream_t *output_stream, double width, double height, cairo_svg_version_t version, cairo_svg_document_t **document_out) { cairo_svg_document_t *document; cairo_status_t status, status_ignored; if (output_stream->status) return output_stream->status; document = malloc (sizeof (cairo_svg_document_t)); if (document == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); /* The use of defs for font glyphs imposes no per-subset limit. */ document->font_subsets = _cairo_scaled_font_subsets_create_scaled (); if (document->font_subsets == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_DOCUMENT; } document->output_stream = output_stream; document->refcount = 1; document->owner = NULL; document->finished = FALSE; document->width = width; document->height = height; document->surface_id = 0; document->linear_pattern_id = 0; document->radial_pattern_id = 0; document->pattern_id = 0; document->filter_id = 0; document->clip_id = 0; document->mask_id = 0; document->xml_node_defs = _cairo_memory_stream_create (); status = _cairo_output_stream_get_status (document->xml_node_defs); if (status) goto CLEANUP_NODE_DEFS; document->xml_node_glyphs = _cairo_memory_stream_create (); status = _cairo_output_stream_get_status (document->xml_node_glyphs); if (status) goto CLEANUP_NODE_GLYPHS; document->alpha_filter = FALSE; _cairo_array_init (&document->meta_snapshots, sizeof (cairo_meta_snapshot_t)); document->svg_version = version; *document_out = document; return CAIRO_STATUS_SUCCESS; CLEANUP_NODE_GLYPHS: status_ignored = _cairo_output_stream_destroy (document->xml_node_glyphs); CLEANUP_NODE_DEFS: status_ignored = _cairo_output_stream_destroy (document->xml_node_defs); _cairo_scaled_font_subsets_destroy (document->font_subsets); CLEANUP_DOCUMENT: free (document); return status; } static cairo_svg_document_t * _cairo_svg_document_reference (cairo_svg_document_t *document) { document->refcount++; return document; } static unsigned int _cairo_svg_document_allocate_mask_id (cairo_svg_document_t *document) { return document->mask_id++; } static cairo_status_t _cairo_svg_document_destroy (cairo_svg_document_t *document) { cairo_status_t status; document->refcount--; if (document->refcount > 0) return CAIRO_STATUS_SUCCESS; status = _cairo_svg_document_finish (document); free (document); return status; } static cairo_status_t _cairo_svg_document_finish (cairo_svg_document_t *document) { cairo_status_t status, status2; cairo_output_stream_t *output = document->output_stream; cairo_meta_snapshot_t *snapshot; cairo_svg_page_t *page; unsigned int i; if (document->finished) return CAIRO_STATUS_SUCCESS; _cairo_output_stream_printf (output, "\n" "\n", document->width, document->height, document->width, document->height, _cairo_svg_internal_version_strings [document->svg_version]); status = _cairo_svg_document_emit_font_subsets (document); if (_cairo_memory_stream_length (document->xml_node_glyphs) > 0 || _cairo_memory_stream_length (document->xml_node_defs) > 0) { _cairo_output_stream_printf (output, "\n"); if (_cairo_memory_stream_length (document->xml_node_glyphs) > 0) { _cairo_output_stream_printf (output, "\n"); _cairo_memory_stream_copy (document->xml_node_glyphs, output); _cairo_output_stream_printf (output, "\n"); } _cairo_memory_stream_copy (document->xml_node_defs, output); _cairo_output_stream_printf (output, "\n"); } if (document->owner != NULL) { cairo_svg_surface_t *surface; surface = (cairo_svg_surface_t *) _cairo_paginated_surface_get_target (document->owner); if (surface->xml_node != NULL && _cairo_memory_stream_length (surface->xml_node) > 0) { if (_cairo_svg_surface_store_page (surface) == NULL) { if (status == CAIRO_STATUS_SUCCESS) status = _cairo_error (CAIRO_STATUS_NO_MEMORY); } } if (surface->page_set.num_elements > 1 && _cairo_svg_version_has_page_set_support (document->svg_version)) { _cairo_output_stream_printf (output, "\n"); for (i = 0; i < surface->page_set.num_elements; i++) { page = _cairo_array_index (&surface->page_set, i); _cairo_output_stream_printf (output, "\n"); _cairo_output_stream_printf (output, "\n", page->surface_id); _cairo_memory_stream_copy (page->xml_node, output); _cairo_output_stream_printf (output, "\n\n"); } _cairo_output_stream_printf (output, "\n"); } else if (surface->page_set.num_elements > 0) { page = _cairo_array_index (&surface->page_set, surface->page_set.num_elements - 1); _cairo_output_stream_printf (output, "\n", page->surface_id); _cairo_memory_stream_copy (page->xml_node, output); _cairo_output_stream_printf (output, "\n"); } } _cairo_output_stream_printf (output, "\n"); status2 = _cairo_output_stream_destroy (document->xml_node_glyphs); if (status == CAIRO_STATUS_SUCCESS) status = status2; status2 = _cairo_output_stream_destroy (document->xml_node_defs); if (status == CAIRO_STATUS_SUCCESS) status = status2; status2 = _cairo_output_stream_destroy (output); if (status == CAIRO_STATUS_SUCCESS) status = status2; for (i = 0; i < document->meta_snapshots.num_elements; i++) { snapshot = _cairo_array_index (&document->meta_snapshots, i); status2 = cairo_surface_status (&snapshot->meta->base); cairo_surface_destroy (&snapshot->meta->base); if (status == CAIRO_STATUS_SUCCESS) status = status2; } _cairo_array_fini (&document->meta_snapshots); document->finished = TRUE; return status; } static void _cairo_svg_surface_set_paginated_mode (void *abstract_surface, cairo_paginated_mode_t paginated_mode) { cairo_svg_surface_t *surface = abstract_surface; surface->paginated_mode = paginated_mode; } static const cairo_paginated_surface_backend_t cairo_svg_surface_paginated_backend = { NULL /*_cairo_svg_surface_start_page*/, _cairo_svg_surface_set_paginated_mode }; libgdiplus-2.11/cairo/src/cairo-malloc-private.h0000664000175000017500000001206612225470167016600 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_MALLOC_PRIVATE_H #define CAIRO_MALLOC_PRIVATE_H #include "cairo-wideint-private.h" /** * _cairo_malloc: * @size: size in bytes * * Allocate @size memory using malloc(). * The memory should be freed using free(). * malloc is skipped, if 0 bytes are requested, and %NULL will be returned. * * Return value: A pointer to the newly allocated memory, or %NULL in * case of malloc() failure or size is 0. */ #define _cairo_malloc(size) \ ((size) ? malloc((unsigned) (size)) : NULL) /** * _cairo_malloc_ab: * @n: number of elements to allocate * @size: size of each element * * Allocates @n*@size memory using _cairo_malloc(), taking care to not * overflow when doing the multiplication. Behaves much like * calloc(), except that the returned memory is not set to zero. * The memory should be freed using free(). * * @size should be a constant so that the compiler can optimize * out a constant division. * * Return value: A pointer to the newly allocated memory, or %NULL in * case of malloc() failure or overflow. */ #define _cairo_malloc_ab(a, size) \ ((size) && (unsigned) (a) >= INT32_MAX / (unsigned) (size) ? NULL : \ _cairo_malloc((unsigned) (a) * (unsigned) (size))) /** * _cairo_realloc_ab: * @ptr: original pointer to block of memory to be resized * @n: number of elements to allocate * @size: size of each element * * Reallocates @ptr a block of @n*@size memory using realloc(), taking * care to not overflow when doing the multiplication. The memory * should be freed using free(). * * @size should be a constant so that the compiler can optimize * out a constant division. * * Return value: A pointer to the newly allocated memory, or %NULL in * case of realloc() failure or overflow (whereupon the original block * of memory * is left untouched). */ #define _cairo_realloc_ab(ptr, a, size) \ ((size) && (unsigned) (a) >= INT32_MAX / (unsigned) (size) ? NULL : \ realloc(ptr, (unsigned) (a) * (unsigned) (size))) /** * _cairo_malloc_abc: * @n: first factor of number of elements to allocate * @b: second factor of number of elements to allocate * @size: size of each element * * Allocates @n*@b*@size memory using _cairo_malloc(), taking care to not * overflow when doing the multiplication. Behaves like * _cairo_malloc_ab(). The memory should be freed using free(). * * @size should be a constant so that the compiler can optimize * out a constant division. * * Return value: A pointer to the newly allocated memory, or %NULL in * case of malloc() failure or overflow. */ #define _cairo_malloc_abc(a, b, size) \ ((b) && (unsigned) (a) >= INT32_MAX / (unsigned) (b) ? NULL : \ (size) && (unsigned) ((a)*(b)) >= INT32_MAX / (unsigned) (size) ? NULL : \ _cairo_malloc((unsigned) (a) * (unsigned) (b) * (unsigned) (size))) /** * _cairo_malloc_ab_plus_c: * @n: number of elements to allocate * @size: size of each element * @k: additional size to allocate * * Allocates @n*@ksize+@k memory using _cairo_malloc(), taking care to not * overflow when doing the arithmetic. Behaves like * _cairo_malloc_ab(). The memory should be freed using free(). * * Return value: A pointer to the newly allocated memory, or %NULL in * case of malloc() failure or overflow. */ #define _cairo_malloc_ab_plus_c(n, size, k) \ ((size) && (unsigned) (n) >= INT32_MAX / (unsigned) (size) ? NULL : \ (unsigned) (k) >= INT32_MAX - (unsigned) (n) * (unsigned) (size) ? NULL : \ _cairo_malloc((unsigned) (n) * (unsigned) (size) + (unsigned) (k))) #endif /* CAIRO_MALLOC_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-surface-fallback-private.h0000664000175000017500000001054712225470167020520 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_SURFACE_FALLBACK_PRIVATE_H #define CAIRO_SURFACE_FALLBACK_PRIVATE_H #include "cairoint.h" cairo_private cairo_status_t _cairo_surface_fallback_paint (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source); cairo_private cairo_status_t _cairo_surface_fallback_mask (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask); cairo_private cairo_status_t _cairo_surface_fallback_stroke (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias); cairo_private cairo_status_t _cairo_surface_fallback_fill (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias); cairo_private cairo_status_t _cairo_surface_fallback_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); cairo_private cairo_surface_t * _cairo_surface_fallback_snapshot (cairo_surface_t *surface); cairo_private cairo_status_t _cairo_surface_fallback_composite (cairo_operator_t op, cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height); cairo_private cairo_status_t _cairo_surface_fallback_fill_rectangles (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects); cairo_private cairo_status_t _cairo_surface_fallback_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps); cairo_private cairo_status_t _cairo_surface_fallback_clone_similar (cairo_surface_t *surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out); #endif libgdiplus-2.11/cairo/src/cairo-lzw.c0000664000175000017500000002717212225470167014474 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" typedef struct _lzw_buf { cairo_status_t status; unsigned char *data; int data_size; int num_data; uint32_t pending; unsigned int pending_bits; } lzw_buf_t; /* An lzw_buf_t is a simple, growable chunk of memory for holding * variable-size objects of up to 16 bits each. * * Initialize an lzw_buf_t to the given size in bytes. * * To store objects into the lzw_buf_t, call _lzw_buf_store_bits and * when finished, call _lzw_buf_store_pending, (which flushes out the * last few bits that hadn't yet made a complete byte yet). * * Instead of returning failure from any functions, lzw_buf_t provides * a status value that the caller can query, (and should query at * least once when done with the object). The status value will be * either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY; */ static void _lzw_buf_init (lzw_buf_t *buf, int size) { if (size == 0) size = 16; buf->status = CAIRO_STATUS_SUCCESS; buf->data_size = size; buf->num_data = 0; buf->pending = 0; buf->pending_bits = 0; buf->data = malloc (size); if (buf->data == NULL) { buf->data_size = 0; buf->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return; } } /* Increase the buffer size by doubling. * * Returns %CAIRO_STATUS_SUCCESS or CAIRO_STATUS_NO_MEMORY */ static cairo_status_t _lzw_buf_grow (lzw_buf_t *buf) { int new_size = buf->data_size * 2; unsigned char *new_data; if (buf->status) return buf->status; new_data = NULL; /* check for integer overflow */ if (new_size / 2 == buf->data_size) new_data = realloc (buf->data, new_size); if (new_data == NULL) { free (buf->data); buf->data_size = 0; buf->status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return buf->status; } buf->data = new_data; buf->data_size = new_size; return CAIRO_STATUS_SUCCESS; } /* Store the lowest num_bits bits of values into buf. * * Note: The bits of value above size_in_bits must be 0, (so don't lie * about the size). * * See also _lzw_buf_store_pending which must be called after the last * call to _lzw_buf_store_bits. * * Sets buf->status to either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY. */ static void _lzw_buf_store_bits (lzw_buf_t *buf, uint16_t value, int num_bits) { cairo_status_t status; assert (value <= (1 << num_bits) - 1); if (buf->status) return; buf->pending = (buf->pending << num_bits) | value; buf->pending_bits += num_bits; while (buf->pending_bits >= 8) { if (buf->num_data >= buf->data_size) { status = _lzw_buf_grow (buf); if (status) return; } buf->data[buf->num_data++] = buf->pending >> (buf->pending_bits - 8); buf->pending_bits -= 8; } } /* Store the last remaining pending bits into the buffer. * * Note: This function must be called after the last call to * _lzw_buf_store_bits. * * Sets buf->status to either %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY. */ static void _lzw_buf_store_pending (lzw_buf_t *buf) { cairo_status_t status; if (buf->status) return; if (buf->pending_bits == 0) return; assert (buf->pending_bits < 8); if (buf->num_data >= buf->data_size) { status = _lzw_buf_grow (buf); if (status) return; } buf->data[buf->num_data++] = buf->pending << (8 - buf->pending_bits); buf->pending_bits = 0; } /* LZW defines a few magic code values */ #define LZW_CODE_CLEAR_TABLE 256 #define LZW_CODE_EOD 257 #define LZW_CODE_FIRST 258 /* We pack three separate values into a symbol as follows: * * 12 bits (31 down to 20): CODE: code value used to represent this symbol * 12 bits (19 down to 8): PREV: previous code value in chain * 8 bits ( 7 down to 0): NEXT: next byte value in chain */ typedef uint32_t lzw_symbol_t; #define LZW_SYMBOL_SET(sym, prev, next) ((sym) = ((prev) << 8)|(next)) #define LZW_SYMBOL_SET_CODE(sym, code, prev, next) ((sym) = ((code << 20)|(prev) << 8)|(next)) #define LZW_SYMBOL_GET_CODE(sym) (((sym) >> 20)) #define LZW_SYMBOL_GET_PREV(sym) (((sym) >> 8) & 0x7ff) #define LZW_SYMBOL_GET_BYTE(sym) (((sym) >> 0) & 0x0ff) /* The PREV+NEXT fields can be seen as the key used to fetch values * from the hash table, while the code is the value fetched. */ #define LZW_SYMBOL_KEY_MASK 0x000fffff /* Since code values are only stored starting with 258 we can safely * use a zero value to represent free slots in the hash table. */ #define LZW_SYMBOL_FREE 0x00000000 /* These really aren't very free for modifying. First, the PostScript * specification sets the 9-12 bit range. Second, the encoding of * lzw_symbol_t above also relies on 2 of LZW_BITS_MAX plus one byte * fitting within 32 bits. * * But other than that, the LZW compression scheme could function with * more bits per code. */ #define LZW_BITS_MIN 9 #define LZW_BITS_MAX 12 #define LZW_BITS_BOUNDARY(bits) ((1<<(bits))-1) #define LZW_MAX_SYMBOLS (1<table, 0, LZW_SYMBOL_TABLE_SIZE * sizeof (lzw_symbol_t)); } /* Lookup a symbol in the symbol table. The PREV and NEXT fields of * symbol form the key for the lookup. * * If successful, then this function returns %TRUE and slot_ret will be * left pointing at the result that will have the CODE field of * interest. * * If the lookup fails, then this function returns %FALSE and slot_ret * will be pointing at the location in the table to which a new CODE * value should be stored along with PREV and NEXT. */ static cairo_bool_t _lzw_symbol_table_lookup (lzw_symbol_table_t *table, lzw_symbol_t symbol, lzw_symbol_t **slot_ret) { /* The algorithm here is identical to that in cairo-hash.c. We * copy it here to allow for a rather more efficient * implementation due to several circumstances that do not apply * to the more general case: * * 1) We have a known bound on the total number of symbols, so we * have a fixed-size table without any copying when growing * * 2) We never delete any entries, so we don't need to * support/check for DEAD entries during lookup. * * 3) The object fits in 32 bits so we store each object in its * entirety within the table rather than storing objects * externally and putting pointers in the table, (which here * would just double the storage requirements and have negative * impacts on memory locality). */ int i, idx, step, hash = symbol & LZW_SYMBOL_KEY_MASK; lzw_symbol_t candidate; idx = hash % LZW_SYMBOL_MOD1; step = 0; *slot_ret = NULL; for (i = 0; i < LZW_SYMBOL_TABLE_SIZE; i++) { candidate = table->table[idx]; if (candidate == LZW_SYMBOL_FREE) { *slot_ret = &table->table[idx]; return FALSE; } else /* candidate is LIVE */ { if ((candidate & LZW_SYMBOL_KEY_MASK) == (symbol & LZW_SYMBOL_KEY_MASK)) { *slot_ret = &table->table[idx]; return TRUE; } } if (step == 0) { step = hash % LZW_SYMBOL_MOD2; if (step == 0) step = 1; } idx += step; if (idx >= LZW_SYMBOL_TABLE_SIZE) idx -= LZW_SYMBOL_TABLE_SIZE; } return FALSE; } /* Compress a bytestream using the LZW algorithm. * * This is an original implementation based on reading the * specification of the LZWDecode filter in the PostScript Language * Reference. The free parameters in the LZW algorithm are set to the * values mandated by PostScript, (symbols encoded with widths from 9 * to 12 bits). * * This function returns a pointer to a newly allocated buffer holding * the compressed data, or %NULL if an out-of-memory situation * occurs. * * Notice that any one of the _lzw_buf functions called here could * trigger an out-of-memory condition. But lzw_buf_t uses cairo's * shutdown-on-error idiom, so it's safe to continue to call into * lzw_buf without having to check for errors, (until a final check at * the end). */ unsigned char * _cairo_lzw_compress (unsigned char *data, unsigned long *size_in_out) { int bytes_remaining = *size_in_out; lzw_buf_t buf; lzw_symbol_table_t table; lzw_symbol_t symbol, *slot = NULL; /* just to squelch a warning */ int code_next = LZW_CODE_FIRST; int code_bits = LZW_BITS_MIN; int prev, next = 0; /* just to squelch a warning */ if (*size_in_out == 0) return NULL; _lzw_buf_init (&buf, *size_in_out); _lzw_symbol_table_init (&table); /* The LZW header is a clear table code. */ _lzw_buf_store_bits (&buf, LZW_CODE_CLEAR_TABLE, code_bits); while (1) { /* Find the longest existing code in the symbol table that * matches the current input, if any. */ prev = *data++; bytes_remaining--; if (bytes_remaining) { do { next = *data++; bytes_remaining--; LZW_SYMBOL_SET (symbol, prev, next); if (_lzw_symbol_table_lookup (&table, symbol, &slot)) prev = LZW_SYMBOL_GET_CODE (*slot); } while (bytes_remaining && *slot != LZW_SYMBOL_FREE); if (*slot == LZW_SYMBOL_FREE) { data--; bytes_remaining++; } } /* Write the code into the output. This is either a byte read * directly from the input, or a code from the last successful * lookup. */ _lzw_buf_store_bits (&buf, prev, code_bits); if (bytes_remaining == 0) break; LZW_SYMBOL_SET_CODE (*slot, code_next++, prev, next); if (code_next > LZW_BITS_BOUNDARY(code_bits)) { code_bits++; if (code_bits > LZW_BITS_MAX) { _lzw_symbol_table_init (&table); _lzw_buf_store_bits (&buf, LZW_CODE_CLEAR_TABLE, code_bits - 1); code_bits = LZW_BITS_MIN; code_next = LZW_CODE_FIRST; } } } /* The LZW footer is an end-of-data code. */ _lzw_buf_store_bits (&buf, LZW_CODE_EOD, code_bits); _lzw_buf_store_pending (&buf); /* See if we ever ran out of memory while writing to buf. */ if (buf.status == CAIRO_STATUS_NO_MEMORY) { *size_in_out = 0; return NULL; } assert (buf.status == CAIRO_STATUS_SUCCESS); *size_in_out = buf.num_data; return buf.data; } libgdiplus-2.11/cairo/src/cairo-pdf-operators.c0000664000175000017500000007370712225470167016452 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2006 Red Hat, Inc * Copyright © 2007, 2008 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Carl Worth * Adrian Johnson */ #include "cairoint.h" #include "cairo-pdf-operators-private.h" #include "cairo-path-fixed-private.h" #include "cairo-output-stream-private.h" #include "cairo-scaled-font-subsets-private.h" #include void _cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators, cairo_output_stream_t *stream, cairo_matrix_t *cairo_to_pdf, cairo_scaled_font_subsets_t *font_subsets) { pdf_operators->stream = stream; pdf_operators->cairo_to_pdf = *cairo_to_pdf; pdf_operators->font_subsets = font_subsets; pdf_operators->use_font_subset = NULL; pdf_operators->use_font_subset_closure = NULL; } void _cairo_pdf_operators_fini (cairo_pdf_operators_t *pdf_operators) { } void _cairo_pdf_operators_set_font_subsets_callback (cairo_pdf_operators_t *pdf_operators, cairo_pdf_operators_use_font_subset_t use_font_subset, void *closure) { pdf_operators->use_font_subset = use_font_subset; pdf_operators->use_font_subset_closure = closure; } void _cairo_pdf_operators_set_stream (cairo_pdf_operators_t *pdf_operators, cairo_output_stream_t *stream) { pdf_operators->stream = stream; } void _cairo_pdf_operators_set_cairo_to_pdf_matrix (cairo_pdf_operators_t *pdf_operators, cairo_matrix_t *cairo_to_pdf) { pdf_operators->cairo_to_pdf = *cairo_to_pdf; } /* A word wrap stream can be used as a filter to do word wrapping on * top of an existing output stream. The word wrapping is quite * simple, using isspace to determine characters that separate * words. Any word that will cause the column count exceed the given * max_column will have a '\n' character emitted before it. * * The stream is careful to maintain integrity for words that cross * the boundary from one call to write to the next. * * Note: This stream does not guarantee that the output will never * exceed max_column. In particular, if a single word is larger than * max_column it will not be broken up. */ typedef struct _word_wrap_stream { cairo_output_stream_t base; cairo_output_stream_t *output; int max_column; int column; cairo_bool_t last_write_was_space; cairo_bool_t in_hexstring; cairo_bool_t empty_hexstring; } word_wrap_stream_t; static int _count_word_up_to (const unsigned char *s, int length) { int word = 0; while (length--) { if (! (isspace (*s) || *s == '<')) { s++; word++; } else { return word; } } return word; } /* Count up to either the end of the ASCII hexstring or the number * of columns remaining. */ static int _count_hexstring_up_to (const unsigned char *s, int length, int columns) { int word = 0; while (length--) { if (*s++ != '>') word++; else return word; columns--; if (columns < 0 && word > 1) return word; } return word; } static cairo_status_t _word_wrap_stream_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { word_wrap_stream_t *stream = (word_wrap_stream_t *) base; cairo_bool_t newline; int word; while (length) { if (*data == '<') { stream->in_hexstring = TRUE; stream->empty_hexstring = TRUE; stream->last_write_was_space = FALSE; data++; length--; _cairo_output_stream_printf (stream->output, "<"); stream->column++; } else if (*data == '>') { stream->in_hexstring = FALSE; stream->last_write_was_space = FALSE; data++; length--; _cairo_output_stream_printf (stream->output, ">"); stream->column++; } else if (isspace (*data)) { newline = (*data == '\n' || *data == '\r'); if (! newline && stream->column >= stream->max_column) { _cairo_output_stream_printf (stream->output, "\n"); stream->column = 0; } _cairo_output_stream_write (stream->output, data, 1); data++; length--; if (newline) { stream->column = 0; } else stream->column++; stream->last_write_was_space = TRUE; } else { if (stream->in_hexstring) { word = _count_hexstring_up_to (data, length, MAX (stream->max_column - stream->column, 0)); } else { word = _count_word_up_to (data, length); } /* Don't wrap if this word is a continuation of a non hex * string word from a previous call to write. */ if (stream->column + word >= stream->max_column) { if (stream->last_write_was_space || (stream->in_hexstring && !stream->empty_hexstring)) { _cairo_output_stream_printf (stream->output, "\n"); stream->column = 0; } } _cairo_output_stream_write (stream->output, data, word); data += word; length -= word; stream->column += word; stream->last_write_was_space = FALSE; if (stream->in_hexstring) stream->empty_hexstring = FALSE; } } return _cairo_output_stream_get_status (stream->output); } static cairo_status_t _word_wrap_stream_close (cairo_output_stream_t *base) { word_wrap_stream_t *stream = (word_wrap_stream_t *) base; return _cairo_output_stream_get_status (stream->output); } static cairo_output_stream_t * _word_wrap_stream_create (cairo_output_stream_t *output, int max_column) { word_wrap_stream_t *stream; if (output->status) return _cairo_output_stream_create_in_error (output->status); stream = malloc (sizeof (word_wrap_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, _word_wrap_stream_write, _word_wrap_stream_close); stream->output = output; stream->max_column = max_column; stream->column = 0; stream->last_write_was_space = FALSE; stream->in_hexstring = FALSE; stream->empty_hexstring = TRUE; return &stream->base; } typedef struct _pdf_path_info { cairo_output_stream_t *output; cairo_matrix_t *path_transform; cairo_line_cap_t line_cap; cairo_point_t last_move_to_point; cairo_bool_t has_sub_path; } pdf_path_info_t; static cairo_status_t _cairo_pdf_path_move_to (void *closure, cairo_point_t *point) { pdf_path_info_t *info = closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); info->last_move_to_point = *point; info->has_sub_path = FALSE; cairo_matrix_transform_point (info->path_transform, &x, &y); _cairo_output_stream_printf (info->output, "%g %g m ", x, y); return _cairo_output_stream_get_status (info->output); } static cairo_status_t _cairo_pdf_path_line_to (void *closure, cairo_point_t *point) { pdf_path_info_t *info = closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); if (info->line_cap != CAIRO_LINE_CAP_ROUND && ! info->has_sub_path && point->x == info->last_move_to_point.x && point->y == info->last_move_to_point.y) { return CAIRO_STATUS_SUCCESS; } info->has_sub_path = TRUE; cairo_matrix_transform_point (info->path_transform, &x, &y); _cairo_output_stream_printf (info->output, "%g %g l ", x, y); return _cairo_output_stream_get_status (info->output); } static cairo_status_t _cairo_pdf_path_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { pdf_path_info_t *info = closure; double bx = _cairo_fixed_to_double (b->x); double by = _cairo_fixed_to_double (b->y); double cx = _cairo_fixed_to_double (c->x); double cy = _cairo_fixed_to_double (c->y); double dx = _cairo_fixed_to_double (d->x); double dy = _cairo_fixed_to_double (d->y); info->has_sub_path = TRUE; cairo_matrix_transform_point (info->path_transform, &bx, &by); cairo_matrix_transform_point (info->path_transform, &cx, &cy); cairo_matrix_transform_point (info->path_transform, &dx, &dy); _cairo_output_stream_printf (info->output, "%g %g %g %g %g %g c ", bx, by, cx, cy, dx, dy); return _cairo_output_stream_get_status (info->output); } static cairo_status_t _cairo_pdf_path_close_path (void *closure) { pdf_path_info_t *info = closure; if (info->line_cap != CAIRO_LINE_CAP_ROUND && ! info->has_sub_path) { return CAIRO_STATUS_SUCCESS; } _cairo_output_stream_printf (info->output, "h\n"); return _cairo_output_stream_get_status (info->output); } static cairo_status_t _cairo_pdf_path_rectangle (pdf_path_info_t *info, cairo_box_t *box) { double x1 = _cairo_fixed_to_double (box->p1.x); double y1 = _cairo_fixed_to_double (box->p1.y); double x2 = _cairo_fixed_to_double (box->p2.x); double y2 = _cairo_fixed_to_double (box->p2.y); cairo_matrix_transform_point (info->path_transform, &x1, &y1); cairo_matrix_transform_point (info->path_transform, &x2, &y2); _cairo_output_stream_printf (info->output, "%g %g %g %g re ", x1, y1, x2 - x1, y2 - y1); return _cairo_output_stream_get_status (info->output); } /* The line cap value is needed to workaround the fact that PostScript * and PDF semantics for stroking degenerate sub-paths do not match * cairo semantics. (PostScript draws something for any line cap * value, while cairo draws something only for round caps). * * When using this function to emit a path to be filled, rather than * stroked, simply pass %CAIRO_LINE_CAP_ROUND which will guarantee that * the stroke workaround will not modify the path being emitted. */ static cairo_status_t _cairo_pdf_operators_emit_path (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_matrix_t *path_transform, cairo_line_cap_t line_cap) { cairo_output_stream_t *word_wrap; cairo_status_t status, status2; pdf_path_info_t info; cairo_box_t box; word_wrap = _word_wrap_stream_create (pdf_operators->stream, 72); status = _cairo_output_stream_get_status (word_wrap); if (status) return _cairo_output_stream_destroy (word_wrap); info.output = word_wrap; info.path_transform = path_transform; info.line_cap = line_cap; if (_cairo_path_fixed_is_rectangle (path, &box)) { status = _cairo_pdf_path_rectangle (&info, &box); } else { status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_pdf_path_move_to, _cairo_pdf_path_line_to, _cairo_pdf_path_curve_to, _cairo_pdf_path_close_path, &info); } status2 = _cairo_output_stream_destroy (word_wrap); if (status == CAIRO_STATUS_SUCCESS) status = status2; return status; } cairo_int_status_t _cairo_pdf_operators_clip (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule) { const char *pdf_operator; cairo_status_t status; if (! path->has_current_point) { /* construct an empty path */ _cairo_output_stream_printf (pdf_operators->stream, "0 0 m "); } else { status = _cairo_pdf_operators_emit_path (pdf_operators, path, &pdf_operators->cairo_to_pdf, CAIRO_LINE_CAP_ROUND); if (status) return status; } switch (fill_rule) { case CAIRO_FILL_RULE_WINDING: pdf_operator = "W"; break; case CAIRO_FILL_RULE_EVEN_ODD: pdf_operator = "W*"; break; default: ASSERT_NOT_REACHED; } _cairo_output_stream_printf (pdf_operators->stream, "%s n\n", pdf_operator); return _cairo_output_stream_get_status (pdf_operators->stream); } static int _cairo_pdf_line_cap (cairo_line_cap_t cap) { switch (cap) { case CAIRO_LINE_CAP_BUTT: return 0; case CAIRO_LINE_CAP_ROUND: return 1; case CAIRO_LINE_CAP_SQUARE: return 2; default: ASSERT_NOT_REACHED; return 0; } } static int _cairo_pdf_line_join (cairo_line_join_t join) { switch (join) { case CAIRO_LINE_JOIN_MITER: return 0; case CAIRO_LINE_JOIN_ROUND: return 1; case CAIRO_LINE_JOIN_BEVEL: return 2; default: ASSERT_NOT_REACHED; return 0; } } static cairo_int_status_t _cairo_pdf_operators_emit_stroke_style (cairo_pdf_operators_t *pdf_operators, cairo_stroke_style_t *style, double scale) { double *dash = style->dash; int num_dashes = style->num_dashes; double dash_offset = style->dash_offset; /* PostScript has "special needs" when it comes to zero-length * dash segments with butt caps. It apparently (at least * according to ghostscript) draws hairlines for this * case. That's not what the cairo semantics want, so we first * touch up the array to eliminate any 0.0 values that will * result in "on" segments. */ if (num_dashes && style->line_cap == CAIRO_LINE_CAP_BUTT) { int i; /* If there's an odd number of dash values they will each get * interpreted as both on and off. So we first explicitly * expand the array to remove the duplicate usage so that we * can modify some of the values. */ if (num_dashes % 2) { dash = _cairo_malloc_abc (num_dashes, 2, sizeof (double)); if (dash == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (dash, style->dash, num_dashes * sizeof (double)); memcpy (dash + num_dashes, style->dash, num_dashes * sizeof (double)); num_dashes *= 2; } for (i = 0; i < num_dashes; i += 2) { if (dash[i] == 0.0) { /* If we're at the front of the list, we first rotate * two elements from the end of the list to the front * of the list before folding away the 0.0. Or, if * there are only two dash elements, then there is * nothing at all to draw. */ if (i == 0) { double last_two[2]; if (num_dashes == 2) { if (dash != style->dash) free (dash); return CAIRO_INT_STATUS_NOTHING_TO_DO; } /* The cases of num_dashes == 0, 1, or 3 elements * cannot exist, so the rotation of 2 elements * will always be safe */ memcpy (last_two, dash + num_dashes - 2, sizeof (last_two)); memmove (dash + 2, dash, (num_dashes - 2) * sizeof (double)); memcpy (dash, last_two, sizeof (last_two)); dash_offset += dash[0] + dash[1]; i = 2; } dash[i-1] += dash[i+1]; num_dashes -= 2; memmove (dash + i, dash + i + 2, (num_dashes - i) * sizeof (double)); /* If we might have just rotated, it's possible that * we rotated a 0.0 value to the front of the list. * Set i to -2 so it will get incremented to 0. */ if (i == 2) i = -2; } } } _cairo_output_stream_printf (pdf_operators->stream, "%f w\n", style->line_width * scale); _cairo_output_stream_printf (pdf_operators->stream, "%d J\n", _cairo_pdf_line_cap (style->line_cap)); _cairo_output_stream_printf (pdf_operators->stream, "%d j\n", _cairo_pdf_line_join (style->line_join)); if (num_dashes) { int d; _cairo_output_stream_printf (pdf_operators->stream, "["); for (d = 0; d < num_dashes; d++) _cairo_output_stream_printf (pdf_operators->stream, " %f", dash[d] * scale); _cairo_output_stream_printf (pdf_operators->stream, "] %f d\n", dash_offset * scale); } else { _cairo_output_stream_printf (pdf_operators->stream, "[] 0.0 d\n"); } if (dash != style->dash) free (dash); _cairo_output_stream_printf (pdf_operators->stream, "%f M ", style->miter_limit < 1.0 ? 1.0 : style->miter_limit); return _cairo_output_stream_get_status (pdf_operators->stream); } /* Scale the matrix so the largest absolute value of the non * translation components is 1.0. Return the scale required to restore * the matrix to the original values. * * eg the matrix [ 100 0 0 50 20 10 ] * * is rescaled to [ 1 0 0 0.5 0.2 0.1 ] * and the scale returned is 100 */ static void _cairo_matrix_factor_out_scale (cairo_matrix_t *m, double *scale) { double s; s = fabs (m->xx); if (fabs (m->xy) > s) s = fabs (m->xy); if (fabs (m->yx) > s) s = fabs (m->yx); if (fabs (m->yy) > s) s = fabs (m->yy); *scale = s; s = 1.0/s; cairo_matrix_scale (m, s, s); } static cairo_int_status_t _cairo_pdf_operators_emit_stroke (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, const char *pdf_operator) { cairo_status_t status; cairo_matrix_t m, path_transform; cairo_bool_t has_ctm = TRUE; double scale = 1.0; /* Optimize away the stroke ctm when it does not affect the * stroke. There are other ctm cases that could be optimized * however this is the most common. */ if (fabs(ctm->xx) == 1.0 && fabs(ctm->yy) == 1.0 && fabs(ctm->xy) == 0.0 && fabs(ctm->yx) == 0.0) { has_ctm = FALSE; } /* The PDF CTM is transformed to the user space CTM when stroking * so the corect pen shape will be used. This also requires that * the path be transformed to user space when emitted. The * conversion of path coordinates to user space may cause rounding * errors. For example the device space point (1.234, 3.142) when * transformed to a user space CTM of [100 0 0 100 0 0] will be * emitted as (0.012, 0.031). * * To avoid the rounding problem we scale the user space CTM * matrix so that all the non translation components of the matrix * are <= 1. The line width and and dashes are scaled by the * inverse of the scale applied to the CTM. This maintains the * shape of the stroke pen while keeping the user space CTM within * the range that maximizes the precision of the emitted path. */ if (has_ctm) { m = *ctm; /* Zero out the translation since it does not affect the pen * shape however it may cause unnecessary digits to be emitted. */ m.x0 = 0.0; m.y0 = 0.0; _cairo_matrix_factor_out_scale (&m, &scale); path_transform = m; status = cairo_matrix_invert (&path_transform); if (status) return status; cairo_matrix_multiply (&m, &m, &pdf_operators->cairo_to_pdf); } status = _cairo_pdf_operators_emit_stroke_style (pdf_operators, style, scale); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return CAIRO_STATUS_SUCCESS; if (status) return status; if (has_ctm) { _cairo_output_stream_printf (pdf_operators->stream, "q %f %f %f %f %f %f cm\n", m.xx, m.yx, m.xy, m.yy, m.x0, m.y0); } else { path_transform = pdf_operators->cairo_to_pdf; } status = _cairo_pdf_operators_emit_path (pdf_operators, path, &path_transform, style->line_cap); if (status) return status; _cairo_output_stream_printf (pdf_operators->stream, "%s", pdf_operator); if (has_ctm) _cairo_output_stream_printf (pdf_operators->stream, " Q"); _cairo_output_stream_printf (pdf_operators->stream, "\n"); return _cairo_output_stream_get_status (pdf_operators->stream); } cairo_int_status_t _cairo_pdf_operators_stroke (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse) { return _cairo_pdf_operators_emit_stroke (pdf_operators, path, style, ctm, ctm_inverse, "S"); } cairo_int_status_t _cairo_pdf_operators_fill (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule) { const char *pdf_operator; cairo_status_t status; status = _cairo_pdf_operators_emit_path (pdf_operators, path, &pdf_operators->cairo_to_pdf, CAIRO_LINE_CAP_ROUND); if (status) return status; switch (fill_rule) { case CAIRO_FILL_RULE_WINDING: pdf_operator = "f"; break; case CAIRO_FILL_RULE_EVEN_ODD: pdf_operator = "f*"; break; default: ASSERT_NOT_REACHED; } _cairo_output_stream_printf (pdf_operators->stream, "%s\n", pdf_operator); return _cairo_output_stream_get_status (pdf_operators->stream); } cairo_int_status_t _cairo_pdf_operators_fill_stroke (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse) { const char *operator; switch (fill_rule) { case CAIRO_FILL_RULE_WINDING: operator = "B"; break; case CAIRO_FILL_RULE_EVEN_ODD: operator = "B*"; break; default: ASSERT_NOT_REACHED; } return _cairo_pdf_operators_emit_stroke (pdf_operators, path, style, ctm, ctm_inverse, operator); } #define GLYPH_POSITION_TOLERANCE 0.001 cairo_int_status_t _cairo_pdf_operators_show_glyphs (cairo_pdf_operators_t *pdf_operators, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { unsigned int current_subset_id = (unsigned int)-1; cairo_scaled_font_subsets_glyph_t subset_glyph; cairo_bool_t diagonal, in_TJ; cairo_status_t status, status_ignored; double Tlm_x = 0, Tlm_y = 0; double Tm_x = 0, y; int i, hex_width; cairo_output_stream_t *word_wrap_stream; for (i = 0; i < num_glyphs; i++) cairo_matrix_transform_point (&pdf_operators->cairo_to_pdf, &glyphs[i].x, &glyphs[i].y); word_wrap_stream = _word_wrap_stream_create (pdf_operators->stream, 72); status = _cairo_output_stream_get_status (word_wrap_stream); if (status) return _cairo_output_stream_destroy (word_wrap_stream); _cairo_output_stream_printf (word_wrap_stream, "BT\n"); if (scaled_font->scale.xy == 0.0 && scaled_font->scale.yx == 0.0) diagonal = TRUE; else diagonal = FALSE; in_TJ = FALSE; for (i = 0; i < num_glyphs; i++) { status = _cairo_scaled_font_subsets_map_glyph (pdf_operators->font_subsets, scaled_font, glyphs[i].index, &subset_glyph); if (status) { status_ignored = _cairo_output_stream_destroy (word_wrap_stream); return status; } if (subset_glyph.is_composite) hex_width = 4; else hex_width = 2; if (subset_glyph.is_scaled == FALSE) { y = 0.0; cairo_matrix_transform_distance (&scaled_font->scale, &subset_glyph.x_advance, &y); } if (subset_glyph.subset_id != current_subset_id) { if (in_TJ) { _cairo_output_stream_printf (word_wrap_stream, ">] TJ\n"); in_TJ = FALSE; } _cairo_output_stream_printf (word_wrap_stream, "/f-%d-%d 1 Tf\n", subset_glyph.font_id, subset_glyph.subset_id); if (pdf_operators->use_font_subset) { status = pdf_operators->use_font_subset (subset_glyph.font_id, subset_glyph.subset_id, pdf_operators->use_font_subset_closure); if (status) { status_ignored = _cairo_output_stream_destroy (word_wrap_stream); return status; } } } if (subset_glyph.subset_id != current_subset_id || !diagonal) { _cairo_output_stream_printf (word_wrap_stream, "%f %f %f %f %f %f Tm\n", scaled_font->scale.xx, -scaled_font->scale.yx, -scaled_font->scale.xy, scaled_font->scale.yy, glyphs[i].x, glyphs[i].y); current_subset_id = subset_glyph.subset_id; Tlm_x = glyphs[i].x; Tlm_y = glyphs[i].y; Tm_x = Tlm_x; } if (diagonal) { if (i < num_glyphs - 1 && fabs((glyphs[i].y - glyphs[i+1].y)/scaled_font->scale.yy) < GLYPH_POSITION_TOLERANCE && fabs((glyphs[i].x - glyphs[i+1].x)/scaled_font->scale.xx) < 10) { if (!in_TJ) { if (i != 0) { _cairo_output_stream_printf (word_wrap_stream, "%f %f Td\n", (glyphs[i].x - Tlm_x)/scaled_font->scale.xx, (glyphs[i].y - Tlm_y)/scaled_font->scale.yy); Tlm_x = glyphs[i].x; Tlm_y = glyphs[i].y; Tm_x = Tlm_x; } _cairo_output_stream_printf (word_wrap_stream, "[<%0*x", hex_width, subset_glyph.subset_glyph_index); Tm_x += subset_glyph.x_advance; in_TJ = TRUE; } else { if (fabs((glyphs[i].x - Tm_x)/scaled_font->scale.xx) > GLYPH_POSITION_TOLERANCE) { double delta = glyphs[i].x - Tm_x; int rounded_delta; delta = -1000.0*delta/scaled_font->scale.xx; /* As the delta is in 1/1000 of a unit of text * space, rounding to an integer should still * provide sufficient precision. We round the * delta before adding to Tm_x so that we keep * track of the accumulated rounding error in * the PDF interpreter and compensate for it * when calculating subsequent deltas. */ rounded_delta = _cairo_lround (delta); if (rounded_delta != 0) { _cairo_output_stream_printf (word_wrap_stream, "> %d <", rounded_delta); } /* Convert the rounded delta back to cairo * space before adding to the current text * position. */ delta = rounded_delta*scaled_font->scale.xx/-1000.0; Tm_x += delta; } _cairo_output_stream_printf (word_wrap_stream, "%0*x", hex_width, subset_glyph.subset_glyph_index); Tm_x += subset_glyph.x_advance; } } else { if (in_TJ) { if (fabs((glyphs[i].x - Tm_x)/scaled_font->scale.xx) > GLYPH_POSITION_TOLERANCE) { double delta = glyphs[i].x - Tm_x; int rounded_delta; delta = -1000.0*delta/scaled_font->scale.xx; rounded_delta = _cairo_lround (delta); if (rounded_delta != 0) { _cairo_output_stream_printf (word_wrap_stream, "> %d <", rounded_delta); } delta = rounded_delta*scaled_font->scale.xx/-1000.0; Tm_x += delta; } _cairo_output_stream_printf (word_wrap_stream, "%0*x>] TJ\n", hex_width, subset_glyph.subset_glyph_index); Tm_x += subset_glyph.x_advance; in_TJ = FALSE; } else { if (i != 0) { _cairo_output_stream_printf (word_wrap_stream, "%f %f Td ", (glyphs[i].x - Tlm_x)/scaled_font->scale.xx, (glyphs[i].y - Tlm_y)/scaled_font->scale.yy); Tlm_x = glyphs[i].x; Tlm_y = glyphs[i].y; Tm_x = Tlm_x; } _cairo_output_stream_printf (word_wrap_stream, "<%0*x> Tj ", hex_width, subset_glyph.subset_glyph_index); Tm_x += subset_glyph.x_advance; } } } else { _cairo_output_stream_printf (word_wrap_stream, "<%0*x> Tj\n", hex_width, subset_glyph.subset_glyph_index); } } _cairo_output_stream_printf (word_wrap_stream, "ET\n"); status = _cairo_output_stream_destroy (word_wrap_stream); if (status) return status; return _cairo_output_stream_get_status (pdf_operators->stream); } libgdiplus-2.11/cairo/src/cairo-path-private.h0000664000175000017500000000402312225470167016257 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_PATH_PRIVATE_H #define CAIRO_PATH_PRIVATE_H #include "cairoint.h" cairo_private cairo_path_t * _cairo_path_create (cairo_path_fixed_t *path, cairo_gstate_t *gstate); cairo_private cairo_path_t * _cairo_path_create_flat (cairo_path_fixed_t *path, cairo_gstate_t *gstate); cairo_private cairo_path_t * _cairo_path_create_in_error (cairo_status_t status); cairo_private cairo_status_t _cairo_path_append_to_context (const cairo_path_t *path, cairo_t *cr); #endif /* CAIRO_PATH_DATA_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-types-private.h0000664000175000017500000002270712225470167016500 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_TYPES_PRIVATE_H #define CAIRO_TYPES_PRIVATE_H /* This is the only header file not including cairoint.h. It only contains * typedefs.*/ #include "cairo.h" #include "cairo-fixed-type-private.h" typedef struct _cairo_array cairo_array_t; typedef struct _cairo_hash_table cairo_hash_table_t; typedef struct _cairo_cache cairo_cache_t; typedef struct _cairo_hash_entry cairo_hash_entry_t; typedef struct _cairo_surface_backend cairo_surface_backend_t; typedef struct _cairo_clip cairo_clip_t; typedef struct _cairo_output_stream cairo_output_stream_t; typedef struct _cairo_scaled_font_subsets cairo_scaled_font_subsets_t; typedef struct _cairo_paginated_surface_backend cairo_paginated_surface_backend_t; typedef struct _cairo_scaled_font_backend cairo_scaled_font_backend_t; typedef struct _cairo_font_face_backend cairo_font_face_backend_t; typedef struct _cairo_xlib_screen_info cairo_xlib_screen_info_t; typedef cairo_array_t cairo_user_data_array_t; /** * cairo_hash_entry_t: * * A #cairo_hash_entry_t contains both a key and a value for * #cairo_hash_table_t. User-derived types for #cairo_hash_entry_t must * be type-compatible with this structure (eg. they must have an * unsigned long as the first parameter. The easiest way to get this * is to use: * * typedef _my_entry { * cairo_hash_entry_t base; * ... Remainder of key and value fields here .. * } my_entry_t; * * which then allows a pointer to my_entry_t to be passed to any of * the #cairo_hash_table_t functions as follows without requiring a cast: * * _cairo_hash_table_insert (hash_table, &my_entry->base); * * IMPORTANT: The caller is reponsible for initializing * my_entry->base.hash with a hash code derived from the key. The * essential property of the hash code is that keys_equal must never * return %TRUE for two keys that have different hashes. The best hash * code will reduce the frequency of two keys with the same code for * which keys_equal returns %FALSE. * * Which parts of the entry make up the "key" and which part make up * the value are entirely up to the caller, (as determined by the * computation going into base.hash as well as the keys_equal * function). A few of the #cairo_hash_table_t functions accept an entry * which will be used exclusively as a "key", (indicated by a * parameter name of key). In these cases, the value-related fields of * the entry need not be initialized if so desired. **/ struct _cairo_hash_entry { unsigned long hash; }; struct _cairo_array { unsigned int size; unsigned int num_elements; unsigned int element_size; char **elements; cairo_bool_t is_snapshot; }; struct _cairo_font_options { cairo_antialias_t antialias; cairo_subpixel_order_t subpixel_order; cairo_hint_style_t hint_style; cairo_hint_metrics_t hint_metrics; }; struct _cairo_cache { cairo_hash_table_t *hash_table; cairo_destroy_func_t entry_destroy; unsigned long max_size; unsigned long size; int freeze_count; }; typedef enum _cairo_paginated_mode { CAIRO_PAGINATED_MODE_ANALYZE, /* analyze page regions */ CAIRO_PAGINATED_MODE_RENDER, /* render page contents */ CAIRO_PAGINATED_MODE_FALLBACK /* paint fallback images */ } cairo_paginated_mode_t; /* Sure wish C had a real enum type so that this would be distinct from cairo_status_t. Oh well, without that, I'll use this bogus 1000 offset */ typedef enum _cairo_int_status { CAIRO_INT_STATUS_DEGENERATE = 1000, CAIRO_INT_STATUS_UNSUPPORTED, CAIRO_INT_STATUS_NOTHING_TO_DO, CAIRO_INT_STATUS_CACHE_EMPTY, CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY, CAIRO_INT_STATUS_IMAGE_FALLBACK, CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN } cairo_int_status_t; typedef enum _cairo_internal_surface_type { CAIRO_INTERNAL_SURFACE_TYPE_META = 0x1000, CAIRO_INTERNAL_SURFACE_TYPE_PAGINATED, CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS, CAIRO_INTERNAL_SURFACE_TYPE_TEST_META, CAIRO_INTERNAL_SURFACE_TYPE_TEST_FALLBACK, CAIRO_INTERNAL_SURFACE_TYPE_TEST_PAGINATED } cairo_internal_surface_type_t; typedef struct _cairo_region cairo_region_t; typedef struct _cairo_point { cairo_fixed_t x; cairo_fixed_t y; } cairo_point_t; typedef struct _cairo_slope { cairo_fixed_t dx; cairo_fixed_t dy; } cairo_slope_t, cairo_distance_t; typedef struct _cairo_point_double { double x; double y; } cairo_point_double_t; typedef struct _cairo_distance_double { double dx; double dy; } cairo_distance_double_t; typedef struct _cairo_line { cairo_point_t p1; cairo_point_t p2; } cairo_line_t, cairo_box_t; typedef struct _cairo_trapezoid { cairo_fixed_t top, bottom; cairo_line_t left, right; } cairo_trapezoid_t; struct _cairo_rectangle_int16 { int16_t x, y; uint16_t width, height; }; struct _cairo_rectangle_int32 { int32_t x, y; uint32_t width, height; }; typedef struct _cairo_rectangle_int16 cairo_glyph_size_t; struct _cairo_point_int16 { int16_t x, y; }; struct _cairo_point_int32 { int32_t x, y; }; #if CAIRO_FIXED_BITS == 32 && CAIRO_FIXED_FRAC_BITS >= 16 typedef struct _cairo_rectangle_int16 cairo_rectangle_int_t; typedef struct _cairo_point_int16 cairo_point_int_t; #define CAIRO_RECT_INT_MIN INT16_MIN #define CAIRO_RECT_INT_MAX INT16_MAX #elif CAIRO_FIXED_BITS == 32 typedef struct _cairo_rectangle_int32 cairo_rectangle_int_t; typedef struct _cairo_point_int32 cairo_point_int_t; #define CAIRO_RECT_INT_MIN INT32_MIN #define CAIRO_RECT_INT_MAX INT32_MAX #else #error Not sure how to pick a cairo_rectangle_int_t and cairo_point_int_t for your CAIRO_FIXED_BITS! #endif typedef struct _cairo_box_int { cairo_point_int_t p1; cairo_point_int_t p2; } cairo_box_int_t; typedef enum _cairo_direction { CAIRO_DIRECTION_FORWARD, CAIRO_DIRECTION_REVERSE } cairo_direction_t; typedef struct _cairo_path_fixed cairo_path_fixed_t; typedef enum _cairo_clip_mode { CAIRO_CLIP_MODE_PATH, CAIRO_CLIP_MODE_REGION, CAIRO_CLIP_MODE_MASK } cairo_clip_mode_t; typedef struct _cairo_clip_path cairo_clip_path_t; typedef struct _cairo_edge { cairo_line_t edge; int clockWise; cairo_fixed_t current_x; } cairo_edge_t; typedef struct _cairo_polygon { cairo_status_t status; cairo_point_t first_point; cairo_point_t current_point; cairo_bool_t has_current_point; int num_edges; int edges_size; cairo_edge_t *edges; cairo_edge_t edges_embedded[8]; } cairo_polygon_t; typedef struct _cairo_spline_knots { cairo_point_t a, b, c, d; } cairo_spline_knots_t; typedef struct _cairo_spline { cairo_spline_knots_t knots; cairo_slope_t initial_slope; cairo_slope_t final_slope; int num_points; int points_size; cairo_point_t *points; cairo_point_t points_embedded[8]; } cairo_spline_t; typedef struct _cairo_pen_vertex { cairo_point_t point; cairo_slope_t slope_ccw; cairo_slope_t slope_cw; } cairo_pen_vertex_t; typedef struct _cairo_pen { double radius; double tolerance; cairo_pen_vertex_t *vertices; int num_vertices; } cairo_pen_t; typedef struct _cairo_color cairo_color_t; typedef struct _cairo_image_surface cairo_image_surface_t; typedef struct _cairo_stroke_style { double line_width; cairo_line_cap_t line_cap; cairo_line_join_t line_join; double miter_limit; double *dash; unsigned int num_dashes; double dash_offset; } cairo_stroke_style_t; typedef struct _cairo_format_masks { int bpp; unsigned long alpha_mask; unsigned long red_mask; unsigned long green_mask; unsigned long blue_mask; } cairo_format_masks_t; typedef enum { CAIRO_STOCK_WHITE, CAIRO_STOCK_BLACK, CAIRO_STOCK_TRANSPARENT } cairo_stock_t; typedef enum _cairo_image_transparency { CAIRO_IMAGE_IS_OPAQUE, CAIRO_IMAGE_HAS_BILEVEL_ALPHA, CAIRO_IMAGE_HAS_ALPHA, CAIRO_IMAGE_UNKNOWN } cairo_image_transparency_t; #endif /* CAIRO_TYPES_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-arc.c0000664000175000017500000002042412225470167014416 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-arc-private.h" /* Spline deviation from the circle in radius would be given by: error = sqrt (x**2 + y**2) - 1 A simpler error function to work with is: e = x**2 + y**2 - 1 From "Good approximation of circles by curvature-continuous Bezier curves", Tor Dokken and Morten Daehlen, Computer Aided Geometric Design 8 (1990) 22-41, we learn: abs (max(e)) = 4/27 * sin**6(angle/4) / cos**2(angle/4) and abs (error) =~ 1/2 * e Of course, this error value applies only for the particular spline approximation that is used in _cairo_gstate_arc_segment. */ static double _arc_error_normalized (double angle) { return 2.0/27.0 * pow (sin (angle / 4), 6) / pow (cos (angle / 4), 2); } static double _arc_max_angle_for_tolerance_normalized (double tolerance) { double angle, error; int i; /* Use table lookup to reduce search time in most cases. */ struct { double angle; double error; } table[] = { { M_PI / 1.0, 0.0185185185185185036127 }, { M_PI / 2.0, 0.000272567143730179811158 }, { M_PI / 3.0, 2.38647043651461047433e-05 }, { M_PI / 4.0, 4.2455377443222443279e-06 }, { M_PI / 5.0, 1.11281001494389081528e-06 }, { M_PI / 6.0, 3.72662000942734705475e-07 }, { M_PI / 7.0, 1.47783685574284411325e-07 }, { M_PI / 8.0, 6.63240432022601149057e-08 }, { M_PI / 9.0, 3.2715520137536980553e-08 }, { M_PI / 10.0, 1.73863223499021216974e-08 }, { M_PI / 11.0, 9.81410988043554039085e-09 }, }; int table_size = ARRAY_LENGTH (table); for (i = 0; i < table_size; i++) if (table[i].error < tolerance) return table[i].angle; ++i; do { angle = M_PI / i++; error = _arc_error_normalized (angle); } while (error > tolerance); return angle; } static int _arc_segments_needed (double angle, double radius, cairo_matrix_t *ctm, double tolerance) { double major_axis, max_angle; /* the error is amplified by at most the length of the * major axis of the circle; see cairo-pen.c for a more detailed analysis * of this. */ major_axis = _cairo_matrix_transformed_circle_major_axis (ctm, radius); max_angle = _arc_max_angle_for_tolerance_normalized (tolerance / major_axis); return (int) ceil (angle / max_angle); } /* We want to draw a single spline approximating a circular arc radius R from angle A to angle B. Since we want a symmetric spline that matches the endpoints of the arc in position and slope, we know that the spline control points must be: (R * cos(A), R * sin(A)) (R * cos(A) - h * sin(A), R * sin(A) + h * cos (A)) (R * cos(B) + h * sin(B), R * sin(B) - h * cos (B)) (R * cos(B), R * sin(B)) for some value of h. "Approximation of circular arcs by cubic poynomials", Michael Goldapp, Computer Aided Geometric Design 8 (1991) 227-238, provides various values of h along with error analysis for each. From that paper, a very practical value of h is: h = 4/3 * tan(angle/4) This value does not give the spline with minimal error, but it does provide a very good approximation, (6th-order convergence), and the error expression is quite simple, (see the comment for _arc_error_normalized). */ static void _cairo_arc_segment (cairo_t *cr, double xc, double yc, double radius, double angle_A, double angle_B) { double r_sin_A, r_cos_A; double r_sin_B, r_cos_B; double h; r_sin_A = radius * sin (angle_A); r_cos_A = radius * cos (angle_A); r_sin_B = radius * sin (angle_B); r_cos_B = radius * cos (angle_B); h = 4.0/3.0 * tan ((angle_B - angle_A) / 4.0); cairo_curve_to (cr, xc + r_cos_A - h * r_sin_A, yc + r_sin_A + h * r_cos_A, xc + r_cos_B + h * r_sin_B, yc + r_sin_B - h * r_cos_B, xc + r_cos_B, yc + r_sin_B); } static void _cairo_arc_in_direction (cairo_t *cr, double xc, double yc, double radius, double angle_min, double angle_max, cairo_direction_t dir) { while (angle_max - angle_min > 4 * M_PI) angle_max -= 2 * M_PI; /* Recurse if drawing arc larger than pi */ if (angle_max - angle_min > M_PI) { double angle_mid = angle_min + (angle_max - angle_min) / 2.0; /* XXX: Something tells me this block could be condensed. */ if (dir == CAIRO_DIRECTION_FORWARD) { _cairo_arc_in_direction (cr, xc, yc, radius, angle_min, angle_mid, dir); _cairo_arc_in_direction (cr, xc, yc, radius, angle_mid, angle_max, dir); } else { _cairo_arc_in_direction (cr, xc, yc, radius, angle_mid, angle_max, dir); _cairo_arc_in_direction (cr, xc, yc, radius, angle_min, angle_mid, dir); } } else { cairo_matrix_t ctm; int i, segments; double angle, angle_step; cairo_get_matrix (cr, &ctm); segments = _arc_segments_needed (angle_max - angle_min, radius, &ctm, cairo_get_tolerance (cr)); angle_step = (angle_max - angle_min) / (double) segments; if (dir == CAIRO_DIRECTION_FORWARD) { angle = angle_min; } else { angle = angle_max; angle_step = - angle_step; } for (i = 0; i < segments; i++, angle += angle_step) { _cairo_arc_segment (cr, xc, yc, radius, angle, angle + angle_step); } } } /** * _cairo_arc_path * @cr: a cairo context * @xc: X position of the center of the arc * @yc: Y position of the center of the arc * @radius: the radius of the arc * @angle1: the start angle, in radians * @angle2: the end angle, in radians * * Compute a path for the given arc and append it onto the current * path within @cr. The arc will be accurate within the current * tolerance and given the current transformation. **/ void _cairo_arc_path (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) { _cairo_arc_in_direction (cr, xc, yc, radius, angle1, angle2, CAIRO_DIRECTION_FORWARD); } /** * _cairo_arc_path_negative: * @xc: X position of the center of the arc * @yc: Y position of the center of the arc * @radius: the radius of the arc * @angle1: the start angle, in radians * @angle2: the end angle, in radians * @ctm: the current transformation matrix * @tolerance: the current tolerance value * @path: the path onto which the arc will be appended * * Compute a path for the given arc (defined in the negative * direction) and append it onto the current path within @cr. The arc * will be accurate within the current tolerance and given the current * transformation. **/ void _cairo_arc_path_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) { _cairo_arc_in_direction (cr, xc, yc, radius, angle2, angle1, CAIRO_DIRECTION_REVERSE); } libgdiplus-2.11/cairo/src/test-meta-surface.h0000664000175000017500000000332512225470167016115 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #ifndef TEST_META_SURFACE_H #define TEST_META_SURFACE_H #include "cairo.h" CAIRO_BEGIN_DECLS cairo_surface_t * _cairo_test_meta_surface_create (cairo_content_t content, int width, int height); CAIRO_END_DECLS #endif /* TEST_META_SURFACE_H */ libgdiplus-2.11/cairo/src/cairo-directfb-surface.c0000664000175000017500000017241312225470167017067 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Michael Emmel * Claudio Ciccani */ #include "cairoint.h" #include "cairo-directfb.h" #include #include #include #include #include #include /* * Rectangle works fine. * Bugs 361377, 359553, 359243 in Gnome BTS are caused * by GDK/DirectFB, not by Cairo/DirectFB. */ #define DFB_RECTANGLES 1 /* * Composite works fine. */ #define DFB_COMPOSITE 1 /* * CompositeTrapezoids works (without antialiasing). */ #define DFB_COMPOSITE_TRAPEZOIDS 0 /* * ShowGlyphs works fine. */ #define DFB_SHOW_GLYPHS 1 D_DEBUG_DOMAIN (Cairo_DirectFB, "Cairo/DirectFB", "Cairo DirectFB backend"); /*****************************************************************************/ typedef struct _cairo_directfb_surface { cairo_surface_t base; cairo_format_t format; cairo_content_t content; IDirectFB *dfb; IDirectFBSurface *dfbsurface; IDirectFBSurface *tmpsurface; /* color buffer */ cairo_surface_t *color; DFBRegion *clips; int n_clips; int width; int height; cairo_bool_t local; } cairo_directfb_surface_t; typedef struct _cairo_directfb_font_cache { IDirectFB *dfb; IDirectFBSurface *dfbsurface; int width; int height; /* coordinates within the surface * of the last loaded glyph */ int x; int y; } cairo_directfb_font_cache_t; static cairo_surface_backend_t cairo_directfb_surface_backend; /*****************************************************************************/ static int _directfb_argb_font = 0; /*****************************************************************************/ #define RUN_CLIPPED( surface, clip, func ) {\ if ((surface)->clips) {\ int k;\ for (k = 0; k < (surface)->n_clips; k++) {\ if (clip) {\ DFBRegion reg = (surface)->clips[k];\ DFBRegion *cli = (clip);\ if (reg.x2 < cli->x1 || reg.y2 < cli->y1 ||\ reg.x1 > cli->x2 || reg.y1 > cli->y2)\ continue;\ if (reg.x1 < cli->x1)\ reg.x1 = cli->x1;\ if (reg.y1 < cli->y1)\ reg.y1 = cli->y1;\ if (reg.x2 > cli->x2)\ reg.x2 = cli->x2;\ if (reg.y2 > cli->y2)\ reg.y2 = cli->y2;\ (surface)->dfbsurface->SetClip ((surface)->dfbsurface, ®);\ }\ else {\ (surface)->dfbsurface->SetClip ((surface)->dfbsurface,\ &(surface)->clips[k]);\ }\ func;\ }\ }\ else {\ (surface)->dfbsurface->SetClip ((surface)->dfbsurface, clip);\ func;\ }\ } #define TRANSFORM_POINT2X( m, x, y, ret_x, ret_y ) {\ double _x = (x);\ double _y = (y);\ (ret_x) = (_x * (m).xx + (m).x0);\ (ret_y) = (_y * (m).yy + (m).y0);\ } #define TRANSFORM_POINT3X( m, x, y, ret_x, ret_y ) {\ double _x = (x);\ double _y = (y);\ (ret_x) = (_x * (m).xx + _y * (m).xy + (m).x0);\ (ret_y) = (_x * (m).yx + _y * (m).yy + (m).y0);\ } /* XXX: A1 has a different bits ordering in cairo. * Probably we should drop it. */ static cairo_content_t _directfb_format_to_content (DFBSurfacePixelFormat format) { if (DFB_PIXELFORMAT_HAS_ALPHA(format)) { if (DFB_COLOR_BITS_PER_PIXEL(format)) return CAIRO_CONTENT_COLOR_ALPHA; return CAIRO_CONTENT_ALPHA; } return CAIRO_CONTENT_COLOR; } static inline DFBSurfacePixelFormat _cairo_to_directfb_format (cairo_format_t format) { switch (format) { case CAIRO_FORMAT_RGB24: return DSPF_RGB32; case CAIRO_FORMAT_ARGB32: return DSPF_ARGB; case CAIRO_FORMAT_A8: return DSPF_A8; case CAIRO_FORMAT_A1: return DSPF_A1; default: break; } return -1; } static inline cairo_format_t _directfb_to_cairo_format (DFBSurfacePixelFormat format) { switch (format) { case DSPF_RGB32: return CAIRO_FORMAT_RGB24; case DSPF_ARGB: return CAIRO_FORMAT_ARGB32; case DSPF_A8: return CAIRO_FORMAT_A8; case DSPF_A1: return CAIRO_FORMAT_A1; default: break; } return -1; } static cairo_status_t _directfb_get_operator (cairo_operator_t operator, DFBSurfaceBlendFunction *ret_srcblend, DFBSurfaceBlendFunction *ret_dstblend ) { DFBSurfaceBlendFunction srcblend = DSBF_ONE; DFBSurfaceBlendFunction dstblend = DSBF_ZERO; switch (operator) { case CAIRO_OPERATOR_CLEAR: srcblend = DSBF_ZERO; dstblend = DSBF_ZERO; break; case CAIRO_OPERATOR_SOURCE: srcblend = DSBF_ONE; dstblend = DSBF_ZERO; break; case CAIRO_OPERATOR_OVER: srcblend = DSBF_ONE; dstblend = DSBF_INVSRCALPHA; break; case CAIRO_OPERATOR_IN: srcblend = DSBF_DESTALPHA; dstblend = DSBF_ZERO; break; case CAIRO_OPERATOR_OUT: srcblend = DSBF_INVDESTALPHA; dstblend = DSBF_ZERO; break; case CAIRO_OPERATOR_ATOP: srcblend = DSBF_DESTALPHA; dstblend = DSBF_INVSRCALPHA; break; case CAIRO_OPERATOR_DEST: srcblend = DSBF_ZERO; dstblend = DSBF_ONE; break; case CAIRO_OPERATOR_DEST_OVER: srcblend = DSBF_INVDESTALPHA; dstblend = DSBF_ONE; break; case CAIRO_OPERATOR_DEST_IN: srcblend = DSBF_ZERO; dstblend = DSBF_SRCALPHA; break; case CAIRO_OPERATOR_DEST_OUT: srcblend = DSBF_ZERO; dstblend = DSBF_INVSRCALPHA; break; case CAIRO_OPERATOR_DEST_ATOP: srcblend = DSBF_INVDESTALPHA; dstblend = DSBF_SRCALPHA; break; case CAIRO_OPERATOR_XOR: srcblend = DSBF_INVDESTALPHA; dstblend = DSBF_INVSRCALPHA; break; case CAIRO_OPERATOR_ADD: srcblend = DSBF_ONE; dstblend = DSBF_ONE; break; case CAIRO_OPERATOR_SATURATE: srcblend = DSBF_SRCALPHASAT; dstblend = DSBF_ONE; break; default: return CAIRO_INT_STATUS_UNSUPPORTED; } if (ret_srcblend) *ret_srcblend = srcblend; if (ret_dstblend) *ret_dstblend = dstblend; return CAIRO_STATUS_SUCCESS; } static IDirectFBSurface* _directfb_buffer_surface_create (IDirectFB *dfb, DFBSurfacePixelFormat format, int width, int height) { IDirectFBSurface *buffer; DFBSurfaceDescription dsc; DFBResult ret; dsc.flags = DSDESC_WIDTH | DSDESC_HEIGHT | DSDESC_PIXELFORMAT; dsc.width = width; dsc.height = height; dsc.pixelformat = format; ret = dfb->CreateSurface (dfb, &dsc, &buffer); if (ret) { DirectFBError ("IDirectFB::CreateSurface()", ret); return NULL; } return buffer; } static cairo_status_t _directfb_acquire_surface (cairo_directfb_surface_t *surface, cairo_rectangle_int_t *intrest_rec, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra, DFBSurfaceLockFlags lock_flags) { IDirectFBSurface *buffer = NULL; DFBRectangle source_rect; cairo_format_t cairo_format; void *data; int pitch; if (surface->format == (cairo_format_t) -1) { DFBSurfaceCapabilities caps; if (intrest_rec) { source_rect.x = intrest_rec->x; source_rect.y = intrest_rec->y; source_rect.w = intrest_rec->width; source_rect.h = intrest_rec->height; } else { source_rect.x = 0; source_rect.y = 0; surface->dfbsurface->GetSize (surface->dfbsurface, &source_rect.w, &source_rect.h); } if (surface->tmpsurface) { int w, h; surface->tmpsurface->GetSize (surface->tmpsurface, &w, &h); if (w < source_rect.w || h < source_rect.h) { surface->tmpsurface->Release (surface->tmpsurface); surface->tmpsurface = NULL; } } cairo_format = _cairo_format_from_content (surface->content); if (!surface->tmpsurface) { D_DEBUG_AT (Cairo_DirectFB, "Allocating buffer for surface %p.\n", surface); surface->tmpsurface = _directfb_buffer_surface_create (surface->dfb, _cairo_to_directfb_format (cairo_format), source_rect.w, source_rect.h); if (!surface->tmpsurface) goto ERROR; } buffer = surface->tmpsurface; surface->dfbsurface->GetCapabilities (surface->dfbsurface, &caps); if (caps & DSCAPS_FLIPPING) { DFBRegion region = { .x1 = source_rect.x, .y1 = source_rect.y, .x2 = source_rect.x + source_rect.w - 1, .y2 = source_rect.y + source_rect.h - 1 }; surface->dfbsurface->Flip (surface->dfbsurface, ®ion, DSFLIP_BLIT); } buffer->Blit (buffer, surface->dfbsurface, &source_rect, 0, 0); } else { /*might be a subsurface get the offset*/ surface->dfbsurface->GetVisibleRectangle (surface->dfbsurface, &source_rect); cairo_format = surface->format; buffer = surface->dfbsurface; } *image_extra = buffer; if (buffer->Lock (buffer, lock_flags, &data, &pitch)) { D_DEBUG_AT (Cairo_DirectFB, "Couldn't lock surface!\n"); goto ERROR; } *image_out = (cairo_image_surface_t *) cairo_image_surface_create_for_data (data, cairo_format, source_rect.w, source_rect.h, pitch); if (*image_out == NULL) goto ERROR; if (image_rect_out) { image_rect_out->x = source_rect.x; image_rect_out->y = source_rect.y; image_rect_out->width = source_rect.w; image_rect_out->height = source_rect.h; } else { /* lock for read */ cairo_surface_t *sur = &((*image_out)->base); /* might be a subsurface */ if (buffer == surface->dfbsurface) cairo_surface_set_device_offset (sur, source_rect.x, source_rect.y); } return CAIRO_STATUS_SUCCESS; ERROR: *image_extra = NULL; if (buffer) { buffer->Unlock (buffer); if (buffer != surface->dfbsurface) buffer->Release (buffer); } return _cairo_error (CAIRO_STATUS_NO_MEMORY); } static cairo_surface_t * _cairo_directfb_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { cairo_directfb_surface_t *source = abstract_src; cairo_directfb_surface_t *surface; cairo_format_t format; D_DEBUG_AT (Cairo_DirectFB, "%s( src=%p, content=0x%x, width=%d, height=%d).\n", __FUNCTION__, source, content, width, height); width = (width <= 0) ? 1 : width; height = (height<= 0) ? 1 : height; format = _cairo_format_from_content (content); surface = calloc (1, sizeof(cairo_directfb_surface_t)); if (!surface) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } surface->dfb = source->dfb; if (width < 8 || height < 8) { IDirectFBSurface *tmp; /* Some cards (e.g. Matrox) don't support surfaces smaller than 8x8 */ tmp = _directfb_buffer_surface_create (surface->dfb, _cairo_to_directfb_format (format), MAX (width, 8), MAX (height, 8)); if (tmp) { DFBRectangle rect = { .x=0, .y=0, .w=width, .h=height }; tmp->GetSubSurface (tmp, &rect, &surface->dfbsurface); tmp->Release (tmp); } } else { surface->dfbsurface = _directfb_buffer_surface_create (surface->dfb, _cairo_to_directfb_format (format), width, height); } if (!surface->dfbsurface) { D_ASSERT (surface->dfbsurface != NULL); free (surface); return NULL; } _cairo_surface_init (&surface->base, &cairo_directfb_surface_backend, content); surface->format = format; surface->content = content; surface->width = width; surface->height = height; surface->local = true; return &surface->base; } static cairo_status_t _cairo_directfb_surface_finish (void *data) { cairo_directfb_surface_t *surface = (cairo_directfb_surface_t *)data; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p ).\n", __FUNCTION__, surface); if (surface->clips) { free (surface->clips); surface->clips = NULL; surface->n_clips = 0; } if (surface->color) { cairo_surface_destroy (surface->color); surface->color = NULL; } if (surface->tmpsurface) { surface->tmpsurface->Release (surface->tmpsurface); surface->tmpsurface = NULL; } if (surface->dfbsurface) { surface->dfbsurface->Release (surface->dfbsurface); surface->dfbsurface = NULL; } if (surface->dfb) surface->dfb = NULL; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_directfb_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_directfb_surface_t *surface = abstract_surface; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p ).\n", __FUNCTION__, surface); return _directfb_acquire_surface (surface, NULL, image_out, NULL, image_extra, DSLF_READ); } static void _cairo_directfb_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_directfb_surface_t *surface = abstract_surface; IDirectFBSurface *buffer = image_extra; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p ).\n", __FUNCTION__, surface); buffer->Unlock (buffer); cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_directfb_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { cairo_directfb_surface_t *surface = abstract_surface; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p, interest_rect={ %d %d %d %d } ).\n", __FUNCTION__, surface, interest_rect ? interest_rect->x : 0, interest_rect ? interest_rect->y : 0, interest_rect ? interest_rect->width : surface->width, interest_rect ? interest_rect->height : surface->height); return _directfb_acquire_surface (surface, interest_rect, image_out, image_rect_out, image_extra, DSLF_READ | DSLF_WRITE); } static void _cairo_directfb_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_directfb_surface_t *surface = abstract_surface; IDirectFBSurface *buffer = image_extra; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p ).\n", __FUNCTION__, surface); buffer->Unlock (buffer); if (surface->dfbsurface != buffer) { DFBRegion region = { .x1 = interest_rect->x, .y1 = interest_rect->y, .x2 = interest_rect->x+interest_rect->width-1, .y2 = interest_rect->y+interest_rect->height-1 }; surface->dfbsurface->SetClip (surface->dfbsurface, ®ion); surface->dfbsurface->SetBlittingFlags (surface->dfbsurface, DSBLIT_NOFX); surface->dfbsurface->Blit (surface->dfbsurface, buffer, NULL, image_rect->x, image_rect->y); } cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_directfb_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_directfb_surface_t *surface = abstract_surface; cairo_directfb_surface_t *clone; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p, src=%p ).\n", __FUNCTION__, surface, src); if (src->backend == surface->base.backend) { cairo_surface_reference (src); *clone_out = src; return CAIRO_STATUS_SUCCESS; } else if (_cairo_surface_is_image (src)) { cairo_image_surface_t *image_src = (cairo_image_surface_t *) src; unsigned char *dst, *src = image_src->data; int pitch; int i, j; DFBResult ret; clone = (cairo_directfb_surface_t *) _cairo_directfb_surface_create_similar (surface, _cairo_content_from_format (image_src->format), image_src->width, image_src->height); if (!clone) return _cairo_error (CAIRO_STATUS_NO_MEMORY); ret = clone->dfbsurface->Lock (clone->dfbsurface, DSLF_WRITE, (void *)&dst, &pitch); if (ret) { DirectFBError ("IDirectFBSurface::Lock()", ret); cairo_surface_destroy ((cairo_surface_t *)clone); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } dst += pitch * src_y; src += image_src->stride * src_y; if (image_src->format == CAIRO_FORMAT_A1) { /* A1 -> A8 */ for (i = 0; i < height; i++) { for (j = src_x; j < src_x + width; j++) dst[j] = (src[j>>3] & (1 << (j&7))) ? 0xff : 0x00; dst += pitch; src += image_src->stride; } } else { int len; if (image_src->format == CAIRO_FORMAT_A8) { dst += src_x; src += src_x; len = width; } else { dst += src_x * 4; src += src_x * 4; len = width * 4; } for (i = 0; i < height; i++) { direct_memcpy (dst, src, len); dst += pitch; src += image_src->stride; } } clone->dfbsurface->Unlock (clone->dfbsurface); *clone_out = &clone->base; return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } #if DFB_COMPOSITE || DFB_COMPOSITE_TRAPEZOIDS static cairo_int_status_t _directfb_prepare_composite (cairo_directfb_surface_t *dst, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, cairo_operator_t op, int *src_x, int *src_y, int *mask_x, int *mask_y, unsigned int width, unsigned int height, cairo_directfb_surface_t **ret_src, cairo_surface_attributes_t *ret_src_attr) { cairo_directfb_surface_t *src; cairo_surface_attributes_t src_attr; cairo_status_t ret; DFBSurfaceBlittingFlags flags; DFBSurfaceBlendFunction sblend; DFBSurfaceBlendFunction dblend; DFBColor color; if (_directfb_get_operator (op, &sblend, &dblend)) return CAIRO_INT_STATUS_UNSUPPORTED; if (mask_pattern) { cairo_solid_pattern_t *pattern; if (mask_pattern->type != CAIRO_PATTERN_TYPE_SOLID) { cairo_pattern_t *tmp; int tmp_x, tmp_y; if (src_pattern->type != CAIRO_PATTERN_TYPE_SOLID || sblend == DSBF_INVDESTALPHA) /* Doesn't work correctly */ return CAIRO_INT_STATUS_UNSUPPORTED; D_DEBUG_AT (Cairo_DirectFB, "Replacing src pattern by mask pattern.\n"); tmp = src_pattern; tmp_x = *src_x; tmp_y = *src_y; src_pattern = mask_pattern; *src_x = *mask_x; *src_y = *mask_y; mask_pattern = tmp; *mask_x = tmp_x; *mask_y = tmp_y; if (sblend == DSBF_ONE) { sblend = DSBF_SRCALPHA; /*dblend = DSBF_INVSRCALPHA;*/ } } pattern = (cairo_solid_pattern_t *)mask_pattern; color.a = pattern->color.alpha_short >> 8; color.r = pattern->color.red_short >> 8; color.g = pattern->color.green_short >> 8; color.b = pattern->color.blue_short >> 8; } else { color.a = color.r = color.g = color.b = 0xff; } if (src_pattern->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_solid_pattern_t *pattern = (cairo_solid_pattern_t *)src_pattern; if (!dst->color) { dst->color = _cairo_directfb_surface_create_similar (dst, CAIRO_CONTENT_COLOR_ALPHA, 1, 1); if (!dst->color) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } src = (cairo_directfb_surface_t *)dst->color; src->dfbsurface->Clear (src->dfbsurface, pattern->color.red_short >> 8, pattern->color.green_short >> 8, pattern->color.blue_short >> 8, pattern->color.alpha_short >> 8); src_attr.matrix = src_pattern->matrix; src_attr.extend = CAIRO_EXTEND_NONE; src_attr.filter = CAIRO_FILTER_NEAREST; src_attr.x_offset = src_attr.y_offset = 0; } else { ret = _cairo_pattern_acquire_surface (src_pattern, &dst->base, *src_x, *src_y, width, height, (cairo_surface_t **)&src, &src_attr); if (ret) return ret; } if (src->content == CAIRO_CONTENT_COLOR) { if (sblend == DSBF_SRCALPHA) sblend = DSBF_ONE; else if (sblend == DSBF_INVSRCALPHA) sblend = DSBF_ZERO; if (dblend == DSBF_SRCALPHA) dblend = DSBF_ONE; else if (dblend == DSBF_INVSRCALPHA) dblend = DSBF_ZERO; } if (dst->content == CAIRO_CONTENT_COLOR) { if (sblend == DSBF_DESTALPHA) sblend = DSBF_ONE; else if (sblend == DSBF_INVDESTALPHA) sblend = DSBF_ZERO; if (dblend == DSBF_DESTALPHA) dblend = DSBF_ONE; else if (dblend == DSBF_INVDESTALPHA) dblend = DSBF_ZERO; } flags = (sblend == DSBF_ONE && dblend == DSBF_ZERO) ? DSBLIT_NOFX : DSBLIT_BLEND_ALPHACHANNEL; if (color.a != 0xff) flags |= DSBLIT_BLEND_COLORALPHA; if (color.r != 0xff || color.g != 0xff || color.b != 0xff) flags |= DSBLIT_COLORIZE; dst->dfbsurface->SetBlittingFlags (dst->dfbsurface, flags); if (flags & (DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_BLEND_COLORALPHA)) { dst->dfbsurface->SetSrcBlendFunction (dst->dfbsurface, sblend); dst->dfbsurface->SetDstBlendFunction (dst->dfbsurface, dblend); } if (flags & (DSBLIT_BLEND_COLORALPHA | DSBLIT_COLORIZE)) dst->dfbsurface->SetColor (dst->dfbsurface, color.r, color.g, color.b, color.a); *ret_src = src; *ret_src_attr = src_attr; return CAIRO_STATUS_SUCCESS; } static void _directfb_finish_composite (cairo_directfb_surface_t *dst, cairo_pattern_t *src_pattern, cairo_surface_t *src, cairo_surface_attributes_t *src_attr) { if (src != dst->color) _cairo_pattern_release_surface (src_pattern, src, src_attr); } #endif /* DFB_COMPOSITE || DFB_COMPOSITE_TRAPEZOIDS */ #if DFB_COMPOSITE static DFBAccelerationMask _directfb_categorize_operation (cairo_surface_attributes_t *src_attr) { cairo_matrix_t *m = &src_attr->matrix; if (m->xy != 0 || m->yx != 0 || m->xx < 0 || m->yy < 0) { if (src_attr->extend != CAIRO_EXTEND_NONE) return DFXL_NONE; return DFXL_TEXTRIANGLES; } if (m->xx != 1 || m->yy != 1) { if (src_attr->extend != CAIRO_EXTEND_NONE) return DFXL_NONE; return DFXL_STRETCHBLIT; } if (src_attr->extend != CAIRO_EXTEND_NONE && src_attr->extend != CAIRO_EXTEND_REPEAT) return DFXL_NONE; return DFXL_BLIT; } static cairo_int_status_t _cairo_directfb_surface_composite (cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_directfb_surface_t *dst = abstract_dst; cairo_directfb_surface_t *src; cairo_surface_attributes_t src_attr; DFBAccelerationMask accel, mask; cairo_int_status_t ret; D_DEBUG_AT (Cairo_DirectFB, "%s( op=%d, src_pattern=%p, mask_pattern=%p, dst=%p," " src_x=%d, src_y=%d, mask_x=%d, mask_y=%d, dst_x=%d," " dst_y=%d, width=%u, height=%u ).\n", __FUNCTION__, op, src_pattern, mask_pattern, dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); ret = _directfb_prepare_composite (dst, src_pattern, mask_pattern, op, &src_x, &src_y, &mask_x, &mask_y, width, height, &src, &src_attr); if (ret) return ret; accel = _directfb_categorize_operation (&src_attr); dst->dfbsurface->GetAccelerationMask (dst->dfbsurface, src->dfbsurface, &mask); if (!(mask & accel)) { D_DEBUG_AT (Cairo_DirectFB, "No acceleration (%08x)!\n", accel); if (accel != DFXL_BLIT) { _directfb_finish_composite (dst, src_pattern, &src->base, &src_attr); return CAIRO_INT_STATUS_UNSUPPORTED; } } src_x += src_attr.x_offset; src_y += src_attr.y_offset; switch (accel) { case DFXL_BLIT: { DFBRectangle sr; sr.x = src_x + _cairo_lround (src_attr.matrix.x0); sr.y = src_y + _cairo_lround (src_attr.matrix.y0); sr.w = width; sr.h = height; if (src_attr.extend == CAIRO_EXTEND_NONE) { D_DEBUG_AT (Cairo_DirectFB, "Running Blit().\n"); RUN_CLIPPED( dst, NULL, dst->dfbsurface->Blit (dst->dfbsurface, src->dfbsurface, &sr, dst_x, dst_y)); } else if (src_attr.extend == CAIRO_EXTEND_REPEAT) { DFBRegion clip; clip.x1 = dst_x; clip.y1 = dst_y; clip.x2 = dst_x + width - 1; clip.y2 = dst_y + height - 1; D_DEBUG_AT (Cairo_DirectFB, "Running TileBlit().\n"); RUN_CLIPPED( dst, &clip, dst->dfbsurface->TileBlit (dst->dfbsurface, src->dfbsurface, &sr, dst_x, dst_y)); } } break; case DFXL_STRETCHBLIT: { DFBRectangle sr, dr; double x1, y1, x2, y2; TRANSFORM_POINT2X (src_attr.matrix, src_x, src_y, x1, y1); TRANSFORM_POINT2X (src_attr.matrix, src_x+width, src_y+height, x2, y2); sr.x = _cairo_lround (x1); sr.y = _cairo_lround (y1); sr.w = _cairo_lround (x2-x1); sr.h = _cairo_lround (y2-y1); dr.x = dst_x; dr.y = dst_y; dr.w = width; dr.h = height; D_DEBUG_AT (Cairo_DirectFB, "Running StretchBlit().\n"); RUN_CLIPPED (dst, NULL, dst->dfbsurface->StretchBlit (dst->dfbsurface, src->dfbsurface, &sr, &dr)); } break; case DFXL_TEXTRIANGLES: { DFBRegion clip; DFBVertex v[4]; float x1, y1, x2, y2; int w, h; if (cairo_matrix_invert (&src_attr.matrix) != CAIRO_STATUS_SUCCESS) { ret = CAIRO_INT_STATUS_UNSUPPORTED; break; } x1 = src_attr.x_offset; y1 = src_attr.y_offset; x2 = src->width - x1; y2 = src->height - y1; src->dfbsurface->GetSize (src->dfbsurface, &w, &h); TRANSFORM_POINT3X (src_attr.matrix, x1, y1, v[0].x, v[0].y); v[0].z = 0; v[0].w = 1; v[0].s = x1 / w; v[0].t = y1 / h; TRANSFORM_POINT3X (src_attr.matrix, x2, y1, v[1].x, v[1].y); v[1].z = 0; v[1].w = 1; v[1].s = x2 / w; v[1].t = y1 / h; TRANSFORM_POINT3X (src_attr.matrix, x2, y2, v[2].x, v[2].y); v[2].z = 0; v[2].w = 1; v[2].s = x2 / w; v[2].t = y2 / h; TRANSFORM_POINT3X (src_attr.matrix, x1, y2, v[3].x, v[3].y); v[3].z = 0; v[3].w = 1; v[3].s = x1 / w; v[3].t = y2 / h; clip.x1 = dst_x; clip.y1 = dst_y; clip.x2 = dst_x + width - 1; clip.y2 = dst_y + height - 1; D_DEBUG_AT (Cairo_DirectFB, "Running TextureTriangles().\n"); RUN_CLIPPED (dst, &clip, dst->dfbsurface->TextureTriangles (dst->dfbsurface, src->dfbsurface, v, NULL, 4, DTTF_FAN)); } break; default: D_BUG ("Unexpected operation"); break; } _directfb_finish_composite (dst, src_pattern, &src->base, &src_attr); return ret; } #endif /* DFB_COMPOSITE */ #if DFB_RECTANGLES static cairo_int_status_t _cairo_directfb_surface_fill_rectangles (void *abstract_surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int n_rects) { cairo_directfb_surface_t *dst = abstract_surface; DFBSurfaceDrawingFlags flags; DFBSurfaceBlendFunction sblend; DFBSurfaceBlendFunction dblend; DFBRectangle r[n_rects]; int i; D_DEBUG_AT (Cairo_DirectFB, "%s( dst=%p, op=%d, color=%p, rects=%p, n_rects=%d ).\n", __FUNCTION__, dst, op, color, rects, n_rects); if (_directfb_get_operator (op, &sblend, &dblend)) return CAIRO_INT_STATUS_UNSUPPORTED; if (color->alpha_short >= 0xff00) { if (sblend == DSBF_SRCALPHA) sblend = DSBF_ONE; else if (sblend == DSBF_INVSRCALPHA) sblend = DSBF_ZERO; if (dblend == DSBF_SRCALPHA) dblend = DSBF_ONE; else if (dblend == DSBF_INVSRCALPHA) dblend = DSBF_ZERO; } if (dst->content == CAIRO_CONTENT_COLOR) { if (sblend == DSBF_DESTALPHA) sblend = DSBF_ONE; else if (sblend == DSBF_INVDESTALPHA) sblend = DSBF_ZERO; if (dblend == DSBF_DESTALPHA) dblend = DSBF_ONE; else if (dblend == DSBF_INVDESTALPHA) dblend = DSBF_ZERO; } flags = (sblend == DSBF_ONE && dblend == DSBF_ZERO) ? DSDRAW_NOFX : DSDRAW_BLEND; dst->dfbsurface->SetDrawingFlags (dst->dfbsurface, flags); if (flags & DSDRAW_BLEND) { dst->dfbsurface->SetSrcBlendFunction (dst->dfbsurface, sblend); dst->dfbsurface->SetDstBlendFunction (dst->dfbsurface, dblend); } dst->dfbsurface->SetColor (dst->dfbsurface, color->red_short >> 8, color->green_short >> 8, color->blue_short >> 8, color->alpha_short >> 8 ); for (i = 0; i < n_rects; i++) { r[i].x = rects[i].x; r[i].y = rects[i].y; r[i].w = rects[i].width; r[i].h = rects[i].height; } RUN_CLIPPED (dst, NULL, dst->dfbsurface->FillRectangles (dst->dfbsurface, r, n_rects)); return CAIRO_STATUS_SUCCESS; } #endif #if DFB_COMPOSITE_TRAPEZOIDS static cairo_int_status_t _cairo_directfb_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps ) { cairo_directfb_surface_t *dst = abstract_dst; cairo_directfb_surface_t *src; cairo_surface_attributes_t src_attr; cairo_status_t ret; DFBAccelerationMask accel; D_DEBUG_AT (Cairo_DirectFB, "%s( op=%d, pattern=%p, dst=%p, antialias=%d," " src_x=%d, src_y=%d, dst_x=%d, dst_y=%d," " width=%u, height=%u, traps=%p, num_traps=%d ).\n", __FUNCTION__, op, pattern, dst, antialias, src_x, src_y, dst_x, dst_y, width, height, traps, num_traps); if (antialias != CAIRO_ANTIALIAS_NONE) return CAIRO_INT_STATUS_UNSUPPORTED; /* Textures are not supported yet. */ if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) return CAIRO_INT_STATUS_UNSUPPORTED; ret = _directfb_prepare_composite (dst, pattern, NULL, op, &src_x, &src_y, NULL, NULL, width, height, &src, &src_attr); if (ret) return ret; dst->dfbsurface->GetAccelerationMask (dst->dfbsurface, src->dfbsurface, &accel); ret = CAIRO_INT_STATUS_UNSUPPORTED; if (accel & DFXL_TEXTRIANGLES) { DFBVertex vertex[6*num_traps]; DFBVertex *v = &vertex[0]; int n; #define ADD_TRI(id, x1, y1, s1, t1, x2, y2, s2, t2, x3, y3, s3, t3) {\ const int p = (id)*3;\ v[p+0].x=(x1); v[p+0].y=(y1); v[p+0].z=0; v[p+0].w=1; v[p+0].s=(s1); v[p+0].t=(t1);\ v[p+1].x=(x2); v[p+1].y=(y2); v[p+1].z=0; v[p+1].w=1; v[p+1].s=(s2); v[p+1].t=(t2);\ v[p+2].x=(x3); v[p+2].y=(y3); v[p+2].z=0; v[p+2].w=1; v[p+2].s=(s3); v[p+2].t=(t3);\ } for (n = 0; num_traps; num_traps--) { float lx1, ly1, lx2, ly2; float rx1, ry1, rx2, ry2; /* XXX: Do we need to validate the trapezoid? */ lx1 = traps->left.p1.x/65536.0; ly1 = traps->left.p1.y/65536.0; lx2 = traps->left.p2.x/65536.0; ly2 = traps->left.p2.y/65536.0; rx1 = traps->right.p1.x/65536.0; ry1 = traps->right.p1.y/65536.0; rx2 = traps->right.p2.x/65536.0; ry2 = traps->right.p2.y/65536.0; if (traps->left.p1.y < traps->top) { float y = traps->top/65536.0; if (lx2 != lx1) lx1 = (y - ly1) * (lx2 - lx1) / (ly2 - ly1) + lx1; ly1 = y; } if (traps->left.p2.y > traps->bottom) { float y = traps->bottom/65536.0; if (lx2 != lx1) lx2 = (y - ly1) * (lx2 - lx1) / (ly2 - ly1) + lx1; ly2 = y; } if (traps->right.p1.y < traps->top) { float y = traps->top/65536.0; if (rx2 != rx1) rx1 = (y - ry1) * (rx2 - rx1) / (ry2 - ry1) + rx1; ry1 = y; } if (traps->right.p2.y > traps->bottom) { float y = traps->bottom/65536.0; if (rx2 != rx1) rx2 = (y - ry1) * (rx2 - rx1) / (ry2 - ry1) + rx1; ry2 = y; } if (lx1 == rx1 && ly1 == ry1) { ADD_TRI (0, lx2, ly2, 0, 0, lx1, ly1, 0, 0, rx2, ry2, 0, 0 ); v += 3; n += 3; } else if (lx2 == rx2 && ly2 == ry2) { ADD_TRI (0, lx1, ly1, 0, 0, lx2, ly2, 0, 0, rx1, ry1, 0, 0 ); v += 3; n += 3; } else { ADD_TRI (0, lx1, ly1, 0, 0, rx1, ry1, 0, 0, lx2, ly2, 0, 0); ADD_TRI (1, lx2, ly2, 0, 0, rx1, ry1, 0, 0, rx2, ry2, 0, 0); v += 6; n += 6; } traps++; } #undef ADD_TRI D_DEBUG_AT (Cairo_DirectFB, "Running TextureTriangles().\n"); RUN_CLIPPED (dst, NULL, dst->dfbsurface->TextureTriangles (dst->dfbsurface, src->dfbsurface, vertex, NULL, n, DTTF_LIST)); ret = CAIRO_STATUS_SUCCESS; } _directfb_finish_composite (dst, pattern, &src->base, &src_attr); return ret; } #endif /* DFB_COMPOSITE_TRAPEZOIDS */ static cairo_int_status_t _cairo_directfb_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_directfb_surface_t *surface = abstract_surface; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p, region=%p ).\n", __FUNCTION__, surface, region); if (region) { cairo_box_int_t *boxes; int n_boxes; cairo_status_t status; int i; status = _cairo_region_get_boxes (region, &n_boxes, &boxes); if (status) return status; if (surface->n_clips != n_boxes) { if (surface->clips) free (surface->clips); surface->clips = _cairo_malloc_ab (n_boxes, sizeof(DFBRegion)); if (!surface->clips) { surface->n_clips = 0; _cairo_region_boxes_fini (region, boxes); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } surface->n_clips = n_boxes; } for (i = 0; i < n_boxes; i++) { surface->clips[i].x1 = boxes[i].p1.x; surface->clips[i].y1 = boxes[i].p1.y; surface->clips[i].x2 = boxes[i].p2.x; surface->clips[i].y2 = boxes[i].p2.y; } _cairo_region_boxes_fini (region, boxes); } else { if (surface->clips) { free (surface->clips); surface->clips = NULL; surface->n_clips = 0; } } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_directfb_abstract_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_directfb_surface_t *surface = abstract_surface; D_DEBUG_AT (Cairo_DirectFB, "%s( surface=%p, rectangle=%p ).\n", __FUNCTION__, surface, rectangle); if (rectangle) { if (!surface->local) { surface->dfbsurface->GetSize (surface->dfbsurface, &surface->width, &surface->height); } rectangle->x = 0; rectangle->y = 0; rectangle->width = surface->width; rectangle->height = surface->height; } return CAIRO_STATUS_SUCCESS; } #if DFB_SHOW_GLYPHS static cairo_directfb_font_cache_t* _directfb_allocate_font_cache (IDirectFB *dfb, int width, int height) { cairo_directfb_font_cache_t *cache; cache = calloc (1, sizeof(cairo_directfb_font_cache_t)); if (!cache) return NULL; cache->dfb = dfb; cache->dfbsurface = _directfb_buffer_surface_create (dfb, _directfb_argb_font ? DSPF_ARGB : DSPF_A8, width, height); if (!cache->dfbsurface) { free (cache); return NULL; } cache->width = width; cache->height = height; return cache; } static void _directfb_destroy_font_cache (cairo_directfb_font_cache_t *cache) { cache->dfbsurface->Release (cache->dfbsurface); free (cache); } static cairo_status_t _directfb_acquire_font_cache (cairo_directfb_surface_t *surface, cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_directfb_font_cache_t **ret_cache, DFBRectangle *rects, DFBPoint *points, int *ret_num ) { cairo_status_t ret; cairo_scaled_glyph_t *chars[num_glyphs]; int num_chars = 0; cairo_directfb_font_cache_t *cache = NULL; int n = 0; int x = 0; int y = 0; int w = 8; int h = 8; int i; if (scaled_font->surface_private) { cache = scaled_font->surface_private; x = cache->x; y = cache->y; } for (i = 0; i < num_glyphs; i++) { cairo_scaled_glyph_t *scaled_glyph; cairo_image_surface_t *img; ret = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (ret) return ret; img = scaled_glyph->surface; switch (img->format) { case CAIRO_FORMAT_A1: case CAIRO_FORMAT_A8: case CAIRO_FORMAT_ARGB32: break; default: D_DEBUG_AT (Cairo_DirectFB, "Unsupported font format %d!\n", img->format); return CAIRO_INT_STATUS_UNSUPPORTED; } points[n].x = _cairo_lround (glyphs[i].x - img->base.device_transform.x0); points[n].y = _cairo_lround (glyphs[i].y - img->base.device_transform.y0); if (points[n].x >= surface->width || points[n].y >= surface->height || points[n].x+img->width <= 0 || points[n].y+img->height <= 0) continue; if (!scaled_glyph->surface_private) { DFBRectangle *rect; if (x+img->width > 2048) { x = 0; y = h; h = 0; } rects[n].x = x; rects[n].y = y; rects[n].w = img->width; rects[n].h = img->height; x += img->width; h = MAX (h, img->height); w = MAX (w, x); /* Remember glyph location */ rect = malloc (sizeof(DFBRectangle)); if (!rect) return _cairo_error (CAIRO_STATUS_NO_MEMORY); *rect = rects[n]; scaled_glyph->surface_private = rect; chars[num_chars++] = scaled_glyph; /*D_DEBUG_AT (Cairo_DirectFB, "Glyph %lu will be loaded at (%d,%d).\n", glyphs[i].index, rects[n].x, rects[n].y);*/ } else { rects[n] = *((DFBRectangle *)scaled_glyph->surface_private); /*D_DEBUG_AT (Cairo_DirectFB, "Glyph %lu already loaded at (%d,%d).\n", glyphs[i].index, rects[n].x, rects[n].y);*/ } n++; } if (!n) return CAIRO_INT_STATUS_NOTHING_TO_DO; h += y; w = MAX (w, 8); h = MAX (h, 8); if (cache) { if (cache->width < w || cache->height < h) { cairo_directfb_font_cache_t *new_cache; w = MAX (w, cache->width); h = MAX (h, cache->height); D_DEBUG_AT (Cairo_DirectFB, "Reallocating font cache (%dx%d).\n", w, h); new_cache = _directfb_allocate_font_cache (surface->dfb, w, h); if (!new_cache) return _cairo_error (CAIRO_STATUS_NO_MEMORY); new_cache->dfbsurface->Blit (new_cache->dfbsurface, cache->dfbsurface, NULL, 0, 0); _directfb_destroy_font_cache (cache); scaled_font->surface_private = cache = new_cache; } } else { D_DEBUG_AT (Cairo_DirectFB, "Allocating font cache (%dx%d).\n", w, h); cache = _directfb_allocate_font_cache (surface->dfb, w, h); if (!cache) return _cairo_error (CAIRO_STATUS_NO_MEMORY); scaled_font->surface_backend = &cairo_directfb_surface_backend; scaled_font->surface_private = cache; } if (num_chars) { unsigned char *data; int pitch; if (cache->dfbsurface->Lock (cache->dfbsurface, DSLF_WRITE, (void *)&data, &pitch)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < num_chars; i++) { cairo_image_surface_t *img = chars[i]->surface; DFBRectangle *rect = chars[i]->surface_private; unsigned char *dst = data; unsigned char *src = img->data; int j; dst += rect->y * pitch + (_directfb_argb_font ? (rect->x<<2) : rect->x); if (img->format == CAIRO_FORMAT_A1) { for (h = rect->h; h; h--) { if (_directfb_argb_font) { for (j = 0; j < rect->w; j++) ((uint32_t *)dst)[j] = (src[j>>3] & (1 << (j&7))) ? 0xffffffff : 0; } else { for (j = 0; j < rect->w; j++) dst[j] = (src[j>>3] & (1 << (j&7))) ? 0xff : 0; } dst += pitch; src += img->stride; } } else if (img->format == CAIRO_FORMAT_A8) { for (h = rect->h; h; h--) { if (_directfb_argb_font) { for (j = 0; j < rect->w; j++) ((uint32_t *)dst)[j] = src[j] * 0x01010101; } else { direct_memcpy (dst, src, rect->w); } dst += pitch; src += img->stride; } } else { /* ARGB32 */ for (h = rect->h; h; h--) { if (_directfb_argb_font) { direct_memcpy (dst, src, rect->w<<2); } else { for (j = 0; j < rect->w; j++) dst[j] = ((uint32_t *)src)[j] >> 24; } dst += pitch; src += img->stride; } } } cache->dfbsurface->Unlock (cache->dfbsurface); } cache->x = x; cache->y = y; *ret_cache = cache; *ret_num = n; return CAIRO_STATUS_SUCCESS; } static void _cairo_directfb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font) { cairo_directfb_font_cache_t *cache = scaled_font->surface_private; D_DEBUG_AT (Cairo_DirectFB, "%s( scaled_font=%p ).\n", __FUNCTION__, scaled_font); if (cache) { _directfb_destroy_font_cache (cache); scaled_font->surface_private = NULL; } } static void _cairo_directfb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font) { D_DEBUG_AT (Cairo_DirectFB, "%s( scaled_glyph=%p, scaled_font=%p ).\n", __FUNCTION__, scaled_glyph, scaled_font); if (scaled_glyph->surface_private) { free (scaled_glyph->surface_private); scaled_glyph->surface_private = NULL; } } static cairo_int_status_t _cairo_directfb_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_directfb_surface_t *dst = abstract_dst; cairo_directfb_font_cache_t *cache; cairo_status_t ret; DFBSurfaceBlittingFlags flags; DFBSurfaceBlendFunction sblend; DFBSurfaceBlendFunction dblend; DFBColor color; DFBRectangle rects[num_glyphs]; DFBPoint points[num_glyphs]; int num; D_DEBUG_AT (Cairo_DirectFB, "%s( dst=%p, op=%d, pattern=%p, glyphs=%p, num_glyphs=%d, scaled_font=%p ).\n", __FUNCTION__, dst, op, pattern, glyphs, num_glyphs, scaled_font); if (pattern->type != CAIRO_PATTERN_TYPE_SOLID) return CAIRO_INT_STATUS_UNSUPPORTED; if (_directfb_get_operator (op, &sblend, &dblend) || sblend == DSBF_DESTALPHA || sblend == DSBF_INVDESTALPHA) return CAIRO_INT_STATUS_UNSUPPORTED; ret = _directfb_acquire_font_cache (dst, scaled_font, glyphs, num_glyphs, &cache, &rects[0], &points[0], &num); if (ret) { if (ret == CAIRO_INT_STATUS_NOTHING_TO_DO) ret = CAIRO_STATUS_SUCCESS; return ret; } color.a = ((cairo_solid_pattern_t *)pattern)->color.alpha_short >> 8; color.r = ((cairo_solid_pattern_t *)pattern)->color.red_short >> 8; color.g = ((cairo_solid_pattern_t *)pattern)->color.green_short >> 8; color.b = ((cairo_solid_pattern_t *)pattern)->color.blue_short >> 8; flags = DSBLIT_BLEND_ALPHACHANNEL | DSBLIT_COLORIZE; if (color.a != 0xff) flags |= DSBLIT_BLEND_COLORALPHA; if (!_directfb_argb_font) { if (sblend == DSBF_ONE) { sblend = DSBF_SRCALPHA; if (dblend == DSBF_ZERO) dblend = DSBF_INVSRCALPHA; } } dst->dfbsurface->SetBlittingFlags (dst->dfbsurface, flags); dst->dfbsurface->SetSrcBlendFunction (dst->dfbsurface, sblend); dst->dfbsurface->SetDstBlendFunction (dst->dfbsurface, dblend); dst->dfbsurface->SetColor (dst->dfbsurface, color.r, color.g, color.b, color.a); D_DEBUG_AT (Cairo_DirectFB, "Running BatchBlit().\n"); RUN_CLIPPED (dst, NULL, dst->dfbsurface->BatchBlit (dst->dfbsurface, cache->dfbsurface, rects, points, num)); return CAIRO_STATUS_SUCCESS; } #endif /* DFB_SHOW_GLYPHS */ static cairo_bool_t _cairo_directfb_surface_is_similar (void *surface_a, void *surface_b, cairo_content_t content) { cairo_directfb_surface_t *a = (cairo_directfb_surface_t *) surface_a; cairo_directfb_surface_t *b = (cairo_directfb_surface_t *) surface_b; return a->dfb == b->dfb; } static cairo_surface_backend_t cairo_directfb_surface_backend = { CAIRO_SURFACE_TYPE_DIRECTFB, /*type*/ _cairo_directfb_surface_create_similar,/*create_similar*/ _cairo_directfb_surface_finish, /*finish*/ _cairo_directfb_surface_acquire_source_image,/*acquire_source_image*/ _cairo_directfb_surface_release_source_image,/*release_source_image*/ _cairo_directfb_surface_acquire_dest_image,/*acquire_dest_image*/ _cairo_directfb_surface_release_dest_image,/*release_dest_image*/ _cairo_directfb_surface_clone_similar,/*clone_similar*/ #if DFB_COMPOSITE _cairo_directfb_surface_composite,/*composite*/ #else NULL,/*composite*/ #endif #if DFB_RECTANGLES _cairo_directfb_surface_fill_rectangles,/*fill_rectangles*/ #else NULL,/*fill_rectangles*/ #endif #if DFB_COMPOSITE_TRAPEZOIDS _cairo_directfb_surface_composite_trapezoids,/*composite_trapezoids*/ #else NULL,/*composite_trapezoids*/ #endif NULL, /* copy_page */ NULL, /* show_page */ _cairo_directfb_surface_set_clip_region,/* set_clip_region */ NULL, /* intersect_clip_path */ _cairo_directfb_abstract_surface_get_extents,/* get_extents */ NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ #if DFB_SHOW_GLYPHS _cairo_directfb_surface_scaled_font_fini,/* scaled_font_fini */ _cairo_directfb_surface_scaled_glyph_fini,/* scaled_glyph_fini */ #else NULL, NULL, #endif NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ #if DFB_SHOW_GLYPHS _cairo_directfb_surface_show_glyphs,/* show_glyphs */ #else NULL, /* show_glyphs */ #endif NULL, /* snapshot */ _cairo_directfb_surface_is_similar, NULL /* reset */ }; static void cairo_directfb_surface_backend_init (IDirectFB *dfb) { static int done = 0; if (done) return; if (getenv ("CAIRO_DIRECTFB_NO_ACCEL")) { #if DFB_RECTANGLES cairo_directfb_surface_backend.fill_rectangles = NULL; #endif #if DFB_COMPOSITE cairo_directfb_surface_backend.composite = NULL; #endif #if DFB_COMPOSITE_TRAPEZOIDS cairo_directfb_surface_backend.composite_trapezoids = NULL; #endif #if DFB_SHOW_GLYPHS cairo_directfb_surface_backend.scaled_font_fini = NULL; cairo_directfb_surface_backend.scaled_glyph_fini = NULL; cairo_directfb_surface_backend.show_glyphs = NULL; #endif D_DEBUG_AT (Cairo_DirectFB, "Acceleration disabled.\n"); } else { DFBGraphicsDeviceDescription dsc; dfb->GetDeviceDescription (dfb, &dsc); #if DFB_COMPOSITE if (!(dsc.acceleration_mask & DFXL_BLIT)) cairo_directfb_surface_backend.composite = NULL; #endif #if DFB_COMPOSITE_TRAPEZOIDS if (!(dsc.acceleration_mask & DFXL_TEXTRIANGLES)) cairo_directfb_surface_backend.composite_trapezoids = NULL; #endif } if (getenv ("CAIRO_DIRECTFB_ARGB_FONT")) { _directfb_argb_font = 1; D_DEBUG_AT (Cairo_DirectFB, "Using ARGB fonts.\n"); } done = 1; } cairo_surface_t * cairo_directfb_surface_create (IDirectFB *dfb, IDirectFBSurface *dfbsurface) { cairo_directfb_surface_t *surface; DFBSurfacePixelFormat format; D_ASSERT (dfb != NULL); D_ASSERT (dfbsurface != NULL); cairo_directfb_surface_backend_init (dfb); surface = calloc (1, sizeof(cairo_directfb_surface_t)); if (!surface) return NULL; dfbsurface->AddRef (dfbsurface); dfbsurface->GetPixelFormat (dfbsurface, &format); dfbsurface->GetSize (dfbsurface, &surface->width, &surface->height); surface->dfb = dfb; surface->dfbsurface = dfbsurface; surface->format = _directfb_to_cairo_format (format); surface->content = _directfb_format_to_content (format); _cairo_surface_init (&surface->base, &cairo_directfb_surface_backend, surface->content); return &surface->base; } libgdiplus-2.11/cairo/src/cairo-xcb-surface.c0000664000175000017500000022766612225470167016074 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-xcb.h" #include "cairo-xcb-xrender.h" #include "cairo-clip-private.h" #include #define AllPlanes ((unsigned long)~0L) slim_hidden_proto (cairo_xcb_surface_create_with_xrender_format); /* * Instead of taking two round trips for each blending request, * assume that if a particular drawable fails GetImage that it will * fail for a "while"; use temporary pixmaps to avoid the errors */ #define CAIRO_ASSUME_PIXMAP 20 typedef struct cairo_xcb_surface { cairo_surface_t base; xcb_connection_t *dpy; xcb_screen_t *screen; xcb_gcontext_t gc; xcb_drawable_t drawable; cairo_bool_t owns_pixmap; xcb_visualtype_t *visual; int use_pixmap; int render_major; int render_minor; int width; int height; int depth; cairo_bool_t have_clip_rects; xcb_rectangle_t *clip_rects; int num_clip_rects; xcb_render_picture_t src_picture, dst_picture; xcb_render_pictforminfo_t xrender_format; } cairo_xcb_surface_t; #define CAIRO_SURFACE_RENDER_AT_LEAST(surface, major, minor) \ (((surface)->render_major > major) || \ (((surface)->render_major == major) && ((surface)->render_minor >= minor))) #define CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_COMPOSITE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_COMPOSITE_TEXT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1) #define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1) #define CAIRO_SURFACE_RENDER_HAS_DISJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2) #define CAIRO_SURFACE_RENDER_HAS_CONJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2) #define CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRIANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRISTRIP(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRIFAN(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 6) #define CAIRO_SURFACE_RENDER_HAS_FILTERS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 6) static void _cairo_xcb_surface_ensure_gc (cairo_xcb_surface_t *surface); static int _CAIRO_FORMAT_DEPTH (cairo_format_t format) { switch (format) { case CAIRO_FORMAT_A1: return 1; case CAIRO_FORMAT_A8: return 8; case CAIRO_FORMAT_RGB24: return 24; case CAIRO_FORMAT_ARGB32: default: return 32; } } static xcb_render_pictforminfo_t * _CAIRO_FORMAT_TO_XRENDER_FORMAT(xcb_connection_t *dpy, cairo_format_t format) { xcb_pict_standard_t std_format; switch (format) { case CAIRO_FORMAT_A1: std_format = XCB_PICT_STANDARD_A_1; break; case CAIRO_FORMAT_A8: std_format = XCB_PICT_STANDARD_A_8; break; case CAIRO_FORMAT_RGB24: std_format = XCB_PICT_STANDARD_RGB_24; break; case CAIRO_FORMAT_ARGB32: default: std_format = XCB_PICT_STANDARD_ARGB_32; break; } return xcb_render_util_find_standard_format (xcb_render_util_query_formats (dpy), std_format); } static cairo_content_t _xcb_render_format_to_content (xcb_render_pictforminfo_t *xrender_format) { cairo_bool_t xrender_format_has_alpha; cairo_bool_t xrender_format_has_color; /* This only happens when using a non-Render server. Let's punt * and say there's no alpha here. */ if (xrender_format == NULL) return CAIRO_CONTENT_COLOR; xrender_format_has_alpha = (xrender_format->direct.alpha_mask != 0); xrender_format_has_color = (xrender_format->direct.red_mask != 0 || xrender_format->direct.green_mask != 0 || xrender_format->direct.blue_mask != 0); if (xrender_format_has_alpha) if (xrender_format_has_color) return CAIRO_CONTENT_COLOR_ALPHA; else return CAIRO_CONTENT_ALPHA; else return CAIRO_CONTENT_COLOR; } static cairo_surface_t * _cairo_xcb_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { cairo_xcb_surface_t *src = abstract_src; xcb_connection_t *dpy = src->dpy; xcb_pixmap_t pixmap; cairo_xcb_surface_t *surface; cairo_format_t format = _cairo_format_from_content (content); xcb_render_pictforminfo_t *xrender_format; /* As a good first approximation, if the display doesn't have COMPOSITE, * we're better off using image surfaces for all temporary operations */ if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE (src)) { return cairo_image_surface_create (format, width, height); } pixmap = xcb_generate_id (dpy); xcb_create_pixmap (dpy, _CAIRO_FORMAT_DEPTH (format), pixmap, src->drawable, width <= 0 ? 1 : width, height <= 0 ? 1 : height); xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (dpy, format); /* XXX: what to do if xrender_format is null? */ surface = (cairo_xcb_surface_t *) cairo_xcb_surface_create_with_xrender_format (dpy, pixmap, src->screen, xrender_format, width, height); if (surface->base.status) return surface; surface->owns_pixmap = TRUE; return &surface->base; } static cairo_status_t _cairo_xcb_surface_finish (void *abstract_surface) { cairo_xcb_surface_t *surface = abstract_surface; if (surface->dst_picture != XCB_NONE) xcb_render_free_picture (surface->dpy, surface->dst_picture); if (surface->src_picture != XCB_NONE) xcb_render_free_picture (surface->dpy, surface->src_picture); if (surface->owns_pixmap) xcb_free_pixmap (surface->dpy, surface->drawable); if (surface->gc != XCB_NONE) xcb_free_gc (surface->dpy, surface->gc); free (surface->clip_rects); surface->dpy = NULL; return CAIRO_STATUS_SUCCESS; } static int _bits_per_pixel(xcb_connection_t *c, int depth) { xcb_format_t *fmt = xcb_setup_pixmap_formats(xcb_get_setup(c)); xcb_format_t *fmtend = fmt + xcb_setup_pixmap_formats_length(xcb_get_setup(c)); for(; fmt != fmtend; ++fmt) if(fmt->depth == depth) return fmt->bits_per_pixel; if(depth <= 4) return 4; if(depth <= 8) return 8; if(depth <= 16) return 16; return 32; } static int _bytes_per_line(xcb_connection_t *c, int width, int bpp) { int bitmap_pad = xcb_get_setup(c)->bitmap_format_scanline_pad; return ((bpp * width + bitmap_pad - 1) & -bitmap_pad) >> 3; } static cairo_bool_t _CAIRO_MASK_FORMAT (cairo_format_masks_t *masks, cairo_format_t *format) { switch (masks->bpp) { case 32: if (masks->alpha_mask == 0xff000000 && masks->red_mask == 0x00ff0000 && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { *format = CAIRO_FORMAT_ARGB32; return TRUE; } if (masks->alpha_mask == 0x00000000 && masks->red_mask == 0x00ff0000 && masks->green_mask == 0x0000ff00 && masks->blue_mask == 0x000000ff) { *format = CAIRO_FORMAT_RGB24; return TRUE; } break; case 8: if (masks->alpha_mask == 0xff) { *format = CAIRO_FORMAT_A8; return TRUE; } break; case 1: if (masks->alpha_mask == 0x1) { *format = CAIRO_FORMAT_A1; return TRUE; } break; } return FALSE; } static cairo_status_t _get_image_surface (cairo_xcb_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect) { cairo_image_surface_t *image; xcb_get_image_reply_t *imagerep; int bpp, bytes_per_line; short x1, y1, x2, y2; unsigned char *data; cairo_format_masks_t masks; cairo_format_t format; x1 = 0; y1 = 0; x2 = surface->width; y2 = surface->height; if (interest_rect) { cairo_rectangle_int_t rect; rect.x = interest_rect->x; rect.y = interest_rect->y; rect.width = interest_rect->width; rect.height = interest_rect->height; if (rect.x > x1) x1 = rect.x; if (rect.y > y1) y1 = rect.y; if (rect.x + rect.width < x2) x2 = rect.x + rect.width; if (rect.y + rect.height < y2) y2 = rect.y + rect.height; if (x1 >= x2 || y1 >= y2) { *image_out = NULL; return CAIRO_STATUS_SUCCESS; } } if (image_rect) { image_rect->x = x1; image_rect->y = y1; image_rect->width = x2 - x1; image_rect->height = y2 - y1; } /* XXX: This should try to use the XShm extension if available */ if (surface->use_pixmap == 0) { xcb_generic_error_t *error; imagerep = xcb_get_image_reply(surface->dpy, xcb_get_image(surface->dpy, XCB_IMAGE_FORMAT_Z_PIXMAP, surface->drawable, x1, y1, x2 - x1, y2 - y1, AllPlanes), &error); /* If we get an error, the surface must have been a window, * so retry with the safe code path. */ if (error) surface->use_pixmap = CAIRO_ASSUME_PIXMAP; } else { surface->use_pixmap--; imagerep = NULL; } if (!imagerep) { /* xcb_get_image_t from a window is dangerous because it can * produce errors if the window is unmapped or partially * outside the screen. We could check for errors and * retry, but to keep things simple, we just create a * temporary pixmap */ xcb_pixmap_t pixmap; pixmap = xcb_generate_id (surface->dpy); xcb_create_pixmap (surface->dpy, surface->depth, pixmap, surface->drawable, x2 - x1, y2 - y1); _cairo_xcb_surface_ensure_gc (surface); xcb_copy_area (surface->dpy, surface->drawable, pixmap, surface->gc, x1, y1, 0, 0, x2 - x1, y2 - y1); imagerep = xcb_get_image_reply(surface->dpy, xcb_get_image(surface->dpy, XCB_IMAGE_FORMAT_Z_PIXMAP, pixmap, x1, y1, x2 - x1, y2 - y1, AllPlanes), 0); xcb_free_pixmap (surface->dpy, pixmap); } if (!imagerep) return _cairo_error (CAIRO_STATUS_NO_MEMORY); bpp = _bits_per_pixel(surface->dpy, imagerep->depth); bytes_per_line = _bytes_per_line(surface->dpy, surface->width, bpp); data = _cairo_malloc_ab (surface->height, bytes_per_line); if (data == NULL) { free (imagerep); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } memcpy (data, xcb_get_image_data (imagerep), bytes_per_line * surface->height); free (imagerep); /* * Compute the pixel format masks from either an xcb_visualtype_t or * a xcb_render_pctforminfo_t, failing we assume the drawable is an * alpha-only pixmap as it could only have been created that way * through the cairo_xlib_surface_create_for_bitmap function. */ if (surface->visual) { masks.bpp = bpp; masks.alpha_mask = 0; masks.red_mask = surface->visual->red_mask; masks.green_mask = surface->visual->green_mask; masks.blue_mask = surface->visual->blue_mask; } else if (surface->xrender_format.id != XCB_NONE) { masks.bpp = bpp; masks.red_mask = (unsigned long)surface->xrender_format.direct.red_mask << surface->xrender_format.direct.red_shift; masks.green_mask = (unsigned long)surface->xrender_format.direct.green_mask << surface->xrender_format.direct.green_shift; masks.blue_mask = (unsigned long)surface->xrender_format.direct.blue_mask << surface->xrender_format.direct.blue_shift; masks.alpha_mask = (unsigned long)surface->xrender_format.direct.alpha_mask << surface->xrender_format.direct.alpha_shift; } else { masks.bpp = bpp; masks.red_mask = 0; masks.green_mask = 0; masks.blue_mask = 0; if (surface->depth < 32) masks.alpha_mask = (1 << surface->depth) - 1; else masks.alpha_mask = 0xffffffff; } /* * Prefer to use a standard pixman format instead of the * general masks case. */ if (_CAIRO_MASK_FORMAT (&masks, &format)) { image = (cairo_image_surface_t *) cairo_image_surface_create_for_data (data, format, x2 - x1, y2 - y1, bytes_per_line); if (image->base.status) goto FAIL; } else { /* * XXX This can't work. We must convert the data to one of the * supported pixman formats. Pixman needs another function * which takes data in an arbitrary format and converts it * to something supported by that library. */ image = (cairo_image_surface_t *) _cairo_image_surface_create_with_masks (data, &masks, x2 - x1, y2 - y1, bytes_per_line); if (image->base.status) goto FAIL; } /* Let the surface take ownership of the data */ _cairo_image_surface_assume_ownership_of_data (image); *image_out = image; return CAIRO_STATUS_SUCCESS; FAIL: free (data); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } static void _cairo_xcb_surface_ensure_src_picture (cairo_xcb_surface_t *surface) { if (!surface->src_picture) { surface->src_picture = xcb_generate_id(surface->dpy); xcb_render_create_picture (surface->dpy, surface->src_picture, surface->drawable, surface->xrender_format.id, 0, NULL); } } static void _cairo_xcb_surface_set_picture_clip_rects (cairo_xcb_surface_t *surface) { if (surface->have_clip_rects) xcb_render_set_picture_clip_rectangles (surface->dpy, surface->dst_picture, 0, 0, surface->num_clip_rects, surface->clip_rects); } static void _cairo_xcb_surface_set_gc_clip_rects (cairo_xcb_surface_t *surface) { if (surface->have_clip_rects) xcb_set_clip_rectangles(surface->dpy, XCB_CLIP_ORDERING_YX_SORTED, surface->gc, 0, 0, surface->num_clip_rects, surface->clip_rects ); } static void _cairo_xcb_surface_ensure_dst_picture (cairo_xcb_surface_t *surface) { if (!surface->dst_picture) { surface->dst_picture = xcb_generate_id(surface->dpy); xcb_render_create_picture (surface->dpy, surface->dst_picture, surface->drawable, surface->xrender_format.id, 0, NULL); _cairo_xcb_surface_set_picture_clip_rects (surface); } } static void _cairo_xcb_surface_ensure_gc (cairo_xcb_surface_t *surface) { if (surface->gc) return; surface->gc = xcb_generate_id(surface->dpy); xcb_create_gc (surface->dpy, surface->gc, surface->drawable, 0, 0); _cairo_xcb_surface_set_gc_clip_rects(surface); } static cairo_status_t _draw_image_surface (cairo_xcb_surface_t *surface, cairo_image_surface_t *image, int src_x, int src_y, int width, int height, int dst_x, int dst_y) { int bpp, bpl; uint32_t data_len; uint8_t *data, left_pad=0; /* equivalent of XPutImage(..., src_x,src_y, dst_x,dst_y, width,height); */ /* XXX: assumes image and surface formats and depths are the same */ /* XXX: assumes depth is a multiple of 8 (not bitmap) */ /* fit src_{x,y,width,height} within image->{0,0,width,height} */ if (src_x < 0) { width += src_x; src_x = 0; } if (src_y < 0) { height += src_y; src_y = 0; } if (width + src_x > image->width) width = image->width - src_x; if (height + src_y > image->height) height = image->height - src_y; if (width <= 0 || height <= 0) return CAIRO_STATUS_SUCCESS; bpp = _bits_per_pixel(surface->dpy, image->depth); /* XXX: could use bpl = image->stride? */ bpl = _bytes_per_line(surface->dpy, image->width, bpp); if (src_x == 0 && width == image->width) { /* can work in-place */ data_len = height * bpl; data = image->data + src_y * bpl; } else { /* must copy {src_x,src_y,width,height} into new data */ int line = 0; uint8_t *data_line, *image_line; int data_bpl = _bytes_per_line(surface->dpy, width, bpp); data_len = height * data_bpl; data_line = data = malloc(data_len); if (data == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); image_line = image->data + src_y * bpl + (src_x * bpp / 8); while (line++ < height) { memcpy(data_line, image_line, data_bpl); data_line += data_bpl; image_line += bpl; } } _cairo_xcb_surface_ensure_gc (surface); xcb_put_image (surface->dpy, XCB_IMAGE_FORMAT_Z_PIXMAP, surface->drawable, surface->gc, width, height, dst_x, dst_y, left_pad, image->depth, data_len, data); if (data < image->data || data >= image->data + image->height * bpl) free(data); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xcb_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_xcb_surface_t *surface = abstract_surface; cairo_image_surface_t *image; cairo_status_t status; status = _get_image_surface (surface, NULL, &image, NULL); if (status) return status; *image_out = image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_xcb_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_xcb_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { cairo_xcb_surface_t *surface = abstract_surface; cairo_image_surface_t *image; cairo_status_t status; status = _get_image_surface (surface, interest_rect, &image, image_rect_out); if (status) return status; *image_out = image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_xcb_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_xcb_surface_t *surface = abstract_surface; /* ignore errors */ _draw_image_surface (surface, image, 0, 0, image->width, image->height, image_rect->x, image_rect->y); cairo_surface_destroy (&image->base); } /* * Return whether two xcb surfaces share the same * screen. Both core and Render drawing require this * when using multiple drawables in an operation. */ static cairo_bool_t _cairo_xcb_surface_same_screen (cairo_xcb_surface_t *dst, cairo_xcb_surface_t *src) { return dst->dpy == src->dpy && dst->screen == src->screen; } static cairo_status_t _cairo_xcb_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_xcb_surface_t *surface = abstract_surface; cairo_xcb_surface_t *clone; if (src->backend == surface->base.backend ) { cairo_xcb_surface_t *xcb_src = (cairo_xcb_surface_t *)src; if (_cairo_xcb_surface_same_screen(surface, xcb_src)) { *clone_out = cairo_surface_reference (src); return CAIRO_STATUS_SUCCESS; } } else if (_cairo_surface_is_image (src)) { cairo_image_surface_t *image_src = (cairo_image_surface_t *)src; cairo_content_t content = _cairo_content_from_format (image_src->format); if (surface->base.status) return surface->base.status; clone = (cairo_xcb_surface_t *) _cairo_xcb_surface_create_similar (surface, content, image_src->width, image_src->height); if (clone->base.status) return clone->base.status; _draw_image_surface (clone, image_src, src_x, src_y, width, height, src_x, src_y); *clone_out = &clone->base; return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_status_t _cairo_xcb_surface_set_matrix (cairo_xcb_surface_t *surface, cairo_matrix_t *matrix) { xcb_render_transform_t xtransform; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; xtransform.matrix11 = _cairo_fixed_16_16_from_double (matrix->xx); xtransform.matrix12 = _cairo_fixed_16_16_from_double (matrix->xy); xtransform.matrix13 = _cairo_fixed_16_16_from_double (matrix->x0); xtransform.matrix21 = _cairo_fixed_16_16_from_double (matrix->yx); xtransform.matrix22 = _cairo_fixed_16_16_from_double (matrix->yy); xtransform.matrix23 = _cairo_fixed_16_16_from_double (matrix->y0); xtransform.matrix31 = 0; xtransform.matrix32 = 0; xtransform.matrix33 = 1 << 16; if (!CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM (surface)) { static const xcb_render_transform_t identity = { 1 << 16, 0x00000, 0x00000, 0x00000, 1 << 16, 0x00000, 0x00000, 0x00000, 1 << 16 }; if (memcmp (&xtransform, &identity, sizeof (xcb_render_transform_t)) == 0) return CAIRO_STATUS_SUCCESS; return CAIRO_INT_STATUS_UNSUPPORTED; } xcb_render_set_picture_transform (surface->dpy, surface->src_picture, xtransform); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xcb_surface_set_filter (cairo_xcb_surface_t *surface, cairo_filter_t filter) { const char *render_filter; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; if (!CAIRO_SURFACE_RENDER_HAS_FILTERS (surface)) { if (filter == CAIRO_FILTER_FAST || filter == CAIRO_FILTER_NEAREST) return CAIRO_STATUS_SUCCESS; return CAIRO_INT_STATUS_UNSUPPORTED; } switch (filter) { case CAIRO_FILTER_FAST: render_filter = "fast"; break; case CAIRO_FILTER_GOOD: render_filter = "good"; break; case CAIRO_FILTER_BEST: render_filter = "best"; break; case CAIRO_FILTER_NEAREST: render_filter = "nearest"; break; case CAIRO_FILTER_BILINEAR: render_filter = "bilinear"; break; case CAIRO_FILTER_GAUSSIAN: default: render_filter = "best"; break; } xcb_render_set_picture_filter(surface->dpy, surface->src_picture, strlen(render_filter), render_filter, 0, NULL); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xcb_surface_set_repeat (cairo_xcb_surface_t *surface, int repeat) { uint32_t mask = XCB_RENDER_CP_REPEAT; uint32_t pa[] = { repeat }; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; xcb_render_change_picture (surface->dpy, surface->src_picture, mask, pa); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_xcb_surface_set_attributes (cairo_xcb_surface_t *surface, cairo_surface_attributes_t *attributes) { cairo_int_status_t status; _cairo_xcb_surface_ensure_src_picture (surface); status = _cairo_xcb_surface_set_matrix (surface, &attributes->matrix); if (status) return status; switch (attributes->extend) { case CAIRO_EXTEND_NONE: _cairo_xcb_surface_set_repeat (surface, 0); break; case CAIRO_EXTEND_REPEAT: _cairo_xcb_surface_set_repeat (surface, 1); break; case CAIRO_EXTEND_REFLECT: case CAIRO_EXTEND_PAD: return CAIRO_INT_STATUS_UNSUPPORTED; } status = _cairo_xcb_surface_set_filter (surface, attributes->filter); if (status) return status; return CAIRO_STATUS_SUCCESS; } /* Checks whether we can can directly draw from src to dst with * the core protocol: either with CopyArea or using src as a * a tile in a GC. */ static cairo_bool_t _surfaces_compatible (cairo_xcb_surface_t *dst, cairo_xcb_surface_t *src) { /* same screen */ if (!_cairo_xcb_surface_same_screen (dst, src)) return FALSE; /* same depth (for core) */ if (src->depth != dst->depth) return FALSE; /* if Render is supported, match picture formats */ if (src->xrender_format.id != XCB_NONE && src->xrender_format.id == dst->xrender_format.id) return TRUE; /* Without Render, match visuals instead */ if (src->visual == dst->visual) return TRUE; return FALSE; } static cairo_bool_t _surface_has_alpha (cairo_xcb_surface_t *surface) { if (surface->xrender_format.id != XCB_NONE) { if (surface->xrender_format.type == XCB_RENDER_PICT_TYPE_DIRECT && surface->xrender_format.direct.alpha_mask != 0) return TRUE; else return FALSE; } else { /* In the no-render case, we never have alpha */ return FALSE; } } /* Returns true if the given operator and source-alpha combination * requires alpha compositing to complete. */ static cairo_bool_t _operator_needs_alpha_composite (cairo_operator_t op, cairo_bool_t surface_has_alpha) { if (op == CAIRO_OPERATOR_SOURCE || (!surface_has_alpha && (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ATOP || op == CAIRO_OPERATOR_IN))) return FALSE; return TRUE; } /* There is a bug in most older X servers with compositing using a * untransformed repeating source pattern when the source is in off-screen * video memory, and another with repeated transformed images using a * general transform matrix. When these bugs could be triggered, we need a * fallback: in the common case where we have no transformation and the * source and destination have the same format/visual, we can do the * operation using the core protocol for the first bug, otherwise, we need * a software fallback. * * We can also often optimize a compositing operation by calling XCopyArea * for some common cases where there is no alpha compositing to be done. * We figure that out here as well. */ typedef enum { DO_RENDER, /* use render */ DO_XCOPYAREA, /* core protocol XCopyArea optimization/fallback */ DO_XTILE, /* core protocol XSetTile optimization/fallback */ DO_UNSUPPORTED /* software fallback */ } composite_operation_t; /* Initial check for the render bugs; we need to recheck for the * offscreen-memory bug after we turn patterns into surfaces, since that * may introduce a repeating pattern for gradient patterns. We don't need * to check for the repeat+transform bug because gradient surfaces aren't * transformed. * * All we do here is reject cases where we *know* are going to * hit the bug and won't be able to use a core protocol fallback. */ static composite_operation_t _categorize_composite_operation (cairo_xcb_surface_t *dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_bool_t have_mask) { #if XXX_BUGGY_REPEAT if (!dst->buggy_repeat) return DO_RENDER; if (src_pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *)src_pattern; if (_cairo_matrix_is_integer_translation (&src_pattern->matrix, NULL, NULL) && src_pattern->extend == CAIRO_EXTEND_REPEAT) { /* This is the case where we have the bug involving * untransformed repeating source patterns with off-screen * video memory; reject some cases where a core protocol * fallback is impossible. */ if (have_mask || !(op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_OVER)) return DO_UNSUPPORTED; if (_cairo_surface_is_xcb (surface_pattern->surface)) { cairo_xcb_surface_t *src = (cairo_xcb_surface_t *)surface_pattern->surface; if (op == CAIRO_OPERATOR_OVER && _surface_has_alpha (src)) return DO_UNSUPPORTED; /* If these are on the same screen but otherwise incompatible, * make a copy as core drawing can't cross depths and doesn't * work rightacross visuals of the same depth */ if (_cairo_xcb_surface_same_screen (dst, src) && !_surfaces_compatible (dst, src)) return DO_UNSUPPORTED; } } /* Check for the other bug involving repeat patterns with general * transforms. */ if (!_cairo_matrix_is_integer_translation (&src_pattern->matrix, NULL, NULL) && src_pattern->extend == CAIRO_EXTEND_REPEAT) return DO_UNSUPPORTED; } #endif return DO_RENDER; } /* Recheck for composite-repeat once we've turned patterns into Xlib surfaces * If we end up returning DO_UNSUPPORTED here, we're throwing away work we * did to turn gradients into a pattern, but most of the time we can handle * that case with core protocol fallback. * * Also check here if we can just use XCopyArea, instead of going through * Render. */ static composite_operation_t _recategorize_composite_operation (cairo_xcb_surface_t *dst, cairo_operator_t op, cairo_xcb_surface_t *src, cairo_surface_attributes_t *src_attr, cairo_bool_t have_mask) { cairo_bool_t is_integer_translation = _cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL); cairo_bool_t needs_alpha_composite = _operator_needs_alpha_composite (op, _surface_has_alpha (src)); if (!have_mask && is_integer_translation && src_attr->extend == CAIRO_EXTEND_NONE && !needs_alpha_composite && _surfaces_compatible(src, dst)) { return DO_XCOPYAREA; } #if XXX_BUGGY_REPEAT if (!dst->buggy_repeat) return DO_RENDER; if (is_integer_translation && src_attr->extend == CAIRO_EXTEND_REPEAT && (src->width != 1 || src->height != 1)) { if (!have_mask && !needs_alpha_composite && _surfaces_compatible (dst, src)) { return DO_XTILE; } return DO_UNSUPPORTED; } #endif return DO_RENDER; } static int _render_operator (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: return XCB_RENDER_PICT_OP_CLEAR; case CAIRO_OPERATOR_SOURCE: return XCB_RENDER_PICT_OP_SRC; case CAIRO_OPERATOR_DEST: return XCB_RENDER_PICT_OP_DST; case CAIRO_OPERATOR_OVER: return XCB_RENDER_PICT_OP_OVER; case CAIRO_OPERATOR_DEST_OVER: return XCB_RENDER_PICT_OP_OVER_REVERSE; case CAIRO_OPERATOR_IN: return XCB_RENDER_PICT_OP_IN; case CAIRO_OPERATOR_DEST_IN: return XCB_RENDER_PICT_OP_IN_REVERSE; case CAIRO_OPERATOR_OUT: return XCB_RENDER_PICT_OP_OUT; case CAIRO_OPERATOR_DEST_OUT: return XCB_RENDER_PICT_OP_OUT_REVERSE; case CAIRO_OPERATOR_ATOP: return XCB_RENDER_PICT_OP_ATOP; case CAIRO_OPERATOR_DEST_ATOP: return XCB_RENDER_PICT_OP_ATOP_REVERSE; case CAIRO_OPERATOR_XOR: return XCB_RENDER_PICT_OP_XOR; case CAIRO_OPERATOR_ADD: return XCB_RENDER_PICT_OP_ADD; case CAIRO_OPERATOR_SATURATE: return XCB_RENDER_PICT_OP_SATURATE; default: return XCB_RENDER_PICT_OP_OVER; } } static cairo_int_status_t _cairo_xcb_surface_composite (cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_surface_attributes_t src_attr, mask_attr; cairo_xcb_surface_t *dst = abstract_dst; cairo_xcb_surface_t *src; cairo_xcb_surface_t *mask; cairo_int_status_t status; composite_operation_t operation; int itx, ity; if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, src_pattern, mask_pattern != NULL); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_pattern_acquire_surfaces (src_pattern, mask_pattern, &dst->base, src_x, src_y, mask_x, mask_y, width, height, (cairo_surface_t **) &src, (cairo_surface_t **) &mask, &src_attr, &mask_attr); if (status) return status; operation = _recategorize_composite_operation (dst, op, src, &src_attr, mask_pattern != NULL); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } status = _cairo_xcb_surface_set_attributes (src, &src_attr); if (status) goto BAIL; switch (operation) { case DO_RENDER: _cairo_xcb_surface_ensure_dst_picture (dst); if (mask) { status = _cairo_xcb_surface_set_attributes (mask, &mask_attr); if (status) goto BAIL; xcb_render_composite (dst->dpy, _render_operator (op), src->src_picture, mask->src_picture, dst->dst_picture, src_x + src_attr.x_offset, src_y + src_attr.y_offset, mask_x + mask_attr.x_offset, mask_y + mask_attr.y_offset, dst_x, dst_y, width, height); } else { static xcb_render_picture_t maskpict = { XCB_NONE }; xcb_render_composite (dst->dpy, _render_operator (op), src->src_picture, maskpict, dst->dst_picture, src_x + src_attr.x_offset, src_y + src_attr.y_offset, 0, 0, dst_x, dst_y, width, height); } break; case DO_XCOPYAREA: _cairo_xcb_surface_ensure_gc (dst); xcb_copy_area (dst->dpy, src->drawable, dst->drawable, dst->gc, src_x + src_attr.x_offset, src_y + src_attr.y_offset, dst_x, dst_y, width, height); break; case DO_XTILE: /* This case is only used for bug fallbacks, though it is theoretically * applicable to the case where we don't have the RENDER extension as * well. * * We've checked that we have a repeating unscaled source in * _recategorize_composite_operation. */ _cairo_xcb_surface_ensure_gc (dst); _cairo_matrix_is_integer_translation (&src_attr.matrix, &itx, &ity); { uint32_t mask = XCB_GC_FILL_STYLE | XCB_GC_TILE | XCB_GC_TILE_STIPPLE_ORIGIN_X | XCB_GC_TILE_STIPPLE_ORIGIN_Y; uint32_t values[] = { XCB_FILL_STYLE_TILED, src->drawable, - (itx + src_attr.x_offset), - (ity + src_attr.y_offset) }; xcb_rectangle_t rect = { dst_x, dst_y, width, height }; xcb_change_gc( dst->dpy, dst->gc, mask, values ); xcb_poly_fill_rectangle(dst->dpy, dst->drawable, dst->gc, 1, &rect); } break; case DO_UNSUPPORTED: default: ASSERT_NOT_REACHED; } if (!_cairo_operator_bounded_by_source (op)) status = _cairo_surface_composite_fixup_unbounded (&dst->base, &src_attr, src->width, src->height, mask ? &mask_attr : NULL, mask ? mask->width : 0, mask ? mask->height : 0, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); BAIL: if (mask) _cairo_pattern_release_surface (mask_pattern, &mask->base, &mask_attr); _cairo_pattern_release_surface (src_pattern, &src->base, &src_attr); return status; } static cairo_int_status_t _cairo_xcb_surface_fill_rectangles (void *abstract_surface, cairo_operator_t op, const cairo_color_t * color, cairo_rectangle_int_t *rects, int num_rects) { cairo_xcb_surface_t *surface = abstract_surface; xcb_render_color_t render_color; xcb_rectangle_t static_xrects[16]; xcb_rectangle_t *xrects = static_xrects; int i; if (!CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE (surface)) return CAIRO_INT_STATUS_UNSUPPORTED; render_color.red = color->red_short; render_color.green = color->green_short; render_color.blue = color->blue_short; render_color.alpha = color->alpha_short; if (num_rects > ARRAY_LENGTH(static_xrects)) { xrects = _cairo_malloc_ab (num_rects, sizeof(xcb_rectangle_t)); if (xrects == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < num_rects; i++) { xrects[i].x = rects[i].x; xrects[i].y = rects[i].y; xrects[i].width = rects[i].width; xrects[i].height = rects[i].height; } _cairo_xcb_surface_ensure_dst_picture (surface); xcb_render_fill_rectangles (surface->dpy, _render_operator (op), surface->dst_picture, render_color, num_rects, xrects); if (xrects != static_xrects) free(xrects); return CAIRO_STATUS_SUCCESS; } /* Creates an A8 picture of size @width x @height, initialized with @color */ static xcb_render_picture_t _create_a8_picture (cairo_xcb_surface_t *surface, xcb_render_color_t *color, int width, int height, cairo_bool_t repeat) { uint32_t values[] = { TRUE }; uint32_t mask = repeat ? XCB_RENDER_CP_REPEAT : 0; xcb_pixmap_t pixmap = xcb_generate_id (surface->dpy); xcb_render_picture_t picture = xcb_generate_id (surface->dpy); xcb_render_pictforminfo_t *format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (surface->dpy, CAIRO_FORMAT_A8); xcb_rectangle_t rect = { 0, 0, width, height }; xcb_create_pixmap (surface->dpy, 8, pixmap, surface->drawable, width <= 0 ? 1 : width, height <= 0 ? 1 : height); xcb_render_create_picture (surface->dpy, picture, pixmap, format->id, mask, values); xcb_render_fill_rectangles (surface->dpy, XCB_RENDER_PICT_OP_SRC, picture, *color, 1, &rect); xcb_free_pixmap (surface->dpy, pixmap); return picture; } /* Creates a temporary mask for the trapezoids covering the area * [@dst_x, @dst_y, @width, @height] of the destination surface. */ static xcb_render_picture_t _create_trapezoid_mask (cairo_xcb_surface_t *dst, cairo_trapezoid_t *traps, int num_traps, int dst_x, int dst_y, int width, int height, xcb_render_pictforminfo_t *pict_format) { xcb_render_color_t transparent = { 0, 0, 0, 0 }; xcb_render_color_t solid = { 0xffff, 0xffff, 0xffff, 0xffff }; xcb_render_picture_t mask_picture, solid_picture; xcb_render_trapezoid_t *offset_traps; int i; /* This would be considerably simpler using XRenderAddTraps(), but since * we are only using this in the unbounded-operator case, we stick with * XRenderCompositeTrapezoids, which is available on older versions * of RENDER rather than conditionalizing. We should still hit an * optimization that avoids creating another intermediate surface on * the servers that have XRenderAddTraps(). */ mask_picture = _create_a8_picture (dst, &transparent, width, height, FALSE); solid_picture = _create_a8_picture (dst, &solid, width, height, TRUE); offset_traps = _cairo_malloc_ab (num_traps, sizeof (xcb_render_trapezoid_t)); if (!offset_traps) { _cairo_error (CAIRO_STATUS_NO_MEMORY); return XCB_NONE; } for (i = 0; i < num_traps; i++) { offset_traps[i].top = _cairo_fixed_to_16_16(traps[i].top) - 0x10000 * dst_y; offset_traps[i].bottom = _cairo_fixed_to_16_16(traps[i].bottom) - 0x10000 * dst_y; offset_traps[i].left.p1.x = _cairo_fixed_to_16_16(traps[i].left.p1.x) - 0x10000 * dst_x; offset_traps[i].left.p1.y = _cairo_fixed_to_16_16(traps[i].left.p1.y) - 0x10000 * dst_y; offset_traps[i].left.p2.x = _cairo_fixed_to_16_16(traps[i].left.p2.x) - 0x10000 * dst_x; offset_traps[i].left.p2.y = _cairo_fixed_to_16_16(traps[i].left.p2.y) - 0x10000 * dst_y; offset_traps[i].right.p1.x = _cairo_fixed_to_16_16(traps[i].right.p1.x) - 0x10000 * dst_x; offset_traps[i].right.p1.y = _cairo_fixed_to_16_16(traps[i].right.p1.y) - 0x10000 * dst_y; offset_traps[i].right.p2.x = _cairo_fixed_to_16_16(traps[i].right.p2.x) - 0x10000 * dst_x; offset_traps[i].right.p2.y = _cairo_fixed_to_16_16(traps[i].right.p2.y) - 0x10000 * dst_y; } xcb_render_trapezoids (dst->dpy, XCB_RENDER_PICT_OP_ADD, solid_picture, mask_picture, pict_format->id, 0, 0, num_traps, offset_traps); xcb_render_free_picture (dst->dpy, solid_picture); free (offset_traps); return mask_picture; } static cairo_int_status_t _cairo_xcb_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps) { cairo_surface_attributes_t attributes; cairo_xcb_surface_t *dst = abstract_dst; cairo_xcb_surface_t *src; cairo_int_status_t status; composite_operation_t operation; int render_reference_x, render_reference_y; int render_src_x, render_src_y; int cairo_format; xcb_render_pictforminfo_t *render_format; if (!CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS (dst)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, pattern, TRUE); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_pattern_acquire_surface (pattern, &dst->base, src_x, src_y, width, height, (cairo_surface_t **) &src, &attributes); if (status) return status; operation = _recategorize_composite_operation (dst, op, src, &attributes, TRUE); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } switch (antialias) { case CAIRO_ANTIALIAS_NONE: cairo_format = CAIRO_FORMAT_A1; break; case CAIRO_ANTIALIAS_GRAY: case CAIRO_ANTIALIAS_SUBPIXEL: case CAIRO_ANTIALIAS_DEFAULT: default: cairo_format = CAIRO_FORMAT_A8; break; } render_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (dst->dpy, cairo_format); /* XXX: what to do if render_format is null? */ if (traps[0].left.p1.y < traps[0].left.p2.y) { render_reference_x = _cairo_fixed_integer_floor (traps[0].left.p1.x); render_reference_y = _cairo_fixed_integer_floor (traps[0].left.p1.y); } else { render_reference_x = _cairo_fixed_integer_floor (traps[0].left.p2.x); render_reference_y = _cairo_fixed_integer_floor (traps[0].left.p2.y); } render_src_x = src_x + render_reference_x - dst_x; render_src_y = src_y + render_reference_y - dst_y; _cairo_xcb_surface_ensure_dst_picture (dst); status = _cairo_xcb_surface_set_attributes (src, &attributes); if (status) goto BAIL; if (!_cairo_operator_bounded_by_mask (op)) { /* xcb_render_composite+trapezoids() creates a mask only large enough for the * trapezoids themselves, but if the operator is unbounded, then we need * to actually composite all the way out to the bounds, so we create * the mask and composite ourselves. There actually would * be benefit to doing this in all cases, since RENDER implementations * will frequently create a too temporary big mask, ignoring destination * bounds and clip. (xcb_render_add_traps() could be used to make creating * the mask somewhat cheaper.) */ xcb_render_picture_t mask_picture = _create_trapezoid_mask (dst, traps, num_traps, dst_x, dst_y, width, height, render_format); if (!mask_picture) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } xcb_render_composite (dst->dpy, _render_operator (op), src->src_picture, mask_picture, dst->dst_picture, src_x + attributes.x_offset, src_y + attributes.y_offset, 0, 0, dst_x, dst_y, width, height); xcb_render_free_picture (dst->dpy, mask_picture); status = _cairo_surface_composite_shape_fixup_unbounded (&dst->base, &attributes, src->width, src->height, width, height, src_x, src_y, 0, 0, dst_x, dst_y, width, height); } else { xcb_render_trapezoid_t xtraps_stack[16]; xcb_render_trapezoid_t *xtraps = xtraps_stack; int i; if (num_traps > ARRAY_LENGTH(xtraps_stack)) { xtraps = _cairo_malloc_ab (num_traps, sizeof(xcb_render_trapezoid_t)); if (xtraps == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } } for (i = 0; i < num_traps; i++) { xtraps[i].top = _cairo_fixed_to_16_16(traps[i].top); xtraps[i].bottom = _cairo_fixed_to_16_16(traps[i].bottom); xtraps[i].left.p1.x = _cairo_fixed_to_16_16(traps[i].left.p1.x); xtraps[i].left.p1.y = _cairo_fixed_to_16_16(traps[i].left.p1.y); xtraps[i].left.p2.x = _cairo_fixed_to_16_16(traps[i].left.p2.x); xtraps[i].left.p2.y = _cairo_fixed_to_16_16(traps[i].left.p2.y); xtraps[i].right.p1.x = _cairo_fixed_to_16_16(traps[i].right.p1.x); xtraps[i].right.p1.y = _cairo_fixed_to_16_16(traps[i].right.p1.y); xtraps[i].right.p2.x = _cairo_fixed_to_16_16(traps[i].right.p2.x); xtraps[i].right.p2.y = _cairo_fixed_to_16_16(traps[i].right.p2.y); } xcb_render_trapezoids (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, render_format->id, render_src_x + attributes.x_offset, render_src_y + attributes.y_offset, num_traps, xtraps); if (xtraps != xtraps_stack) free(xtraps); } BAIL: _cairo_pattern_release_surface (pattern, &src->base, &attributes); return status; } static cairo_int_status_t _cairo_xcb_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_xcb_surface_t *surface = abstract_surface; if (surface->clip_rects) { free (surface->clip_rects); surface->clip_rects = NULL; } surface->have_clip_rects = FALSE; surface->num_clip_rects = 0; if (region == NULL) { uint32_t none[] = { XCB_NONE }; if (surface->gc) xcb_change_gc (surface->dpy, surface->gc, XCB_GC_CLIP_MASK, none); if (surface->xrender_format.id != XCB_NONE && surface->dst_picture) xcb_render_change_picture (surface->dpy, surface->dst_picture, XCB_RENDER_CP_CLIP_MASK, none); } else { cairo_box_int_t *boxes; cairo_status_t status; xcb_rectangle_t *rects = NULL; int n_boxes, i; status = _cairo_region_get_boxes (region, &n_boxes, &boxes); if (status) return status; if (n_boxes > 0) { rects = _cairo_malloc_ab (n_boxes, sizeof(xcb_rectangle_t)); if (rects == NULL) { _cairo_region_boxes_fini (region, boxes); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } else { rects = NULL; } for (i = 0; i < n_boxes; i++) { rects[i].x = boxes[i].p1.x; rects[i].y = boxes[i].p1.y; rects[i].width = boxes[i].p2.x - boxes[i].p1.x; rects[i].height = boxes[i].p2.y - boxes[i].p1.y; } _cairo_region_boxes_fini (region, boxes); surface->have_clip_rects = TRUE; surface->clip_rects = rects; surface->num_clip_rects = n_boxes; if (surface->gc) _cairo_xcb_surface_set_gc_clip_rects (surface); if (surface->dst_picture) _cairo_xcb_surface_set_picture_clip_rects (surface); } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_xcb_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_xcb_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; rectangle->width = surface->width; rectangle->height = surface->height; return CAIRO_STATUS_SUCCESS; } /* XXX: _cairo_xcb_surface_get_font_options */ static void _cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); static void _cairo_xcb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font); static cairo_int_status_t _cairo_xcb_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); static cairo_bool_t _cairo_xcb_surface_is_similar (void *surface_a, void *surface_b, cairo_content_t content) { cairo_xcb_surface_t *a = surface_a; cairo_xcb_surface_t *b = surface_b; xcb_render_pictforminfo_t *xrender_format; if (! _cairo_xcb_surface_same_screen (a, b)) return FALSE; /* now check that the target is a similar format */ xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (b->dpy, _cairo_format_from_content (content)); return a->xrender_format.id == xrender_format->id; } static cairo_status_t _cairo_xcb_surface_reset (void *abstract_surface) { cairo_xcb_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_xcb_surface_set_clip_region (surface, NULL); if (status) return status; return CAIRO_STATUS_SUCCESS; } /* XXX: move this to the bottom of the file, XCB and Xlib */ static const cairo_surface_backend_t cairo_xcb_surface_backend = { CAIRO_SURFACE_TYPE_XCB, _cairo_xcb_surface_create_similar, _cairo_xcb_surface_finish, _cairo_xcb_surface_acquire_source_image, _cairo_xcb_surface_release_source_image, _cairo_xcb_surface_acquire_dest_image, _cairo_xcb_surface_release_dest_image, _cairo_xcb_surface_clone_similar, _cairo_xcb_surface_composite, _cairo_xcb_surface_fill_rectangles, _cairo_xcb_surface_composite_trapezoids, NULL, /* copy_page */ NULL, /* show_page */ _cairo_xcb_surface_set_clip_region, NULL, /* intersect_clip_path */ _cairo_xcb_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ _cairo_xcb_surface_scaled_font_fini, _cairo_xcb_surface_scaled_glyph_fini, NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ _cairo_xcb_surface_show_glyphs, NULL, /* snapshot */ _cairo_xcb_surface_is_similar, _cairo_xcb_surface_reset }; /** * _cairo_surface_is_xcb: * @surface: a #cairo_surface_t * * Checks if a surface is a #cairo_xcb_surface_t * * Return value: True if the surface is an xcb surface **/ static cairo_bool_t _cairo_surface_is_xcb (cairo_surface_t *surface) { return surface->backend == &cairo_xcb_surface_backend; } static cairo_surface_t * _cairo_xcb_surface_create_internal (xcb_connection_t *dpy, xcb_drawable_t drawable, xcb_screen_t *screen, xcb_visualtype_t *visual, xcb_render_pictforminfo_t *xrender_format, int width, int height, int depth) { cairo_xcb_surface_t *surface; const xcb_render_query_version_reply_t *r; surface = malloc (sizeof (cairo_xcb_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); if (xrender_format) { depth = xrender_format->depth; } else if (visual) { xcb_depth_iterator_t depths; xcb_visualtype_iterator_t visuals; /* This is ugly, but we have to walk over all visuals * for the screen to find the depth. */ depths = xcb_screen_allowed_depths_iterator(screen); for(; depths.rem; xcb_depth_next(&depths)) { visuals = xcb_depth_visuals_iterator(depths.data); for(; visuals.rem; xcb_visualtype_next(&visuals)) { if(visuals.data->visual_id == visual->visual_id) { depth = depths.data->depth; goto found; } } } found: ; } r = xcb_render_util_query_version(dpy); if (r) { surface->render_major = r->major_version; surface->render_minor = r->minor_version; } else { surface->render_major = -1; surface->render_minor = -1; } if (CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE (surface)) { if (!xrender_format) { if (visual) { const xcb_render_query_pict_formats_reply_t *formats; xcb_render_pictvisual_t *pict_visual; formats = xcb_render_util_query_formats (dpy); pict_visual = xcb_render_util_find_visual_format (formats, visual->visual_id); if (pict_visual) { xcb_render_pictforminfo_t template; template.id = pict_visual->format; xrender_format = xcb_render_util_find_format (formats, XCB_PICT_FORMAT_ID, &template, 0); } } else if (depth == 1) { xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (dpy, CAIRO_FORMAT_A1); } } } else { xrender_format = NULL; } _cairo_surface_init (&surface->base, &cairo_xcb_surface_backend, _xcb_render_format_to_content (xrender_format)); surface->dpy = dpy; surface->gc = XCB_NONE; surface->drawable = drawable; surface->screen = screen; surface->owns_pixmap = FALSE; surface->use_pixmap = 0; surface->width = width; surface->height = height; /* XXX: set buggy_repeat based on ServerVendor and VendorRelease */ surface->dst_picture = XCB_NONE; surface->src_picture = XCB_NONE; surface->visual = visual; surface->xrender_format.id = XCB_NONE; if (xrender_format) surface->xrender_format = *xrender_format; surface->depth = depth; surface->have_clip_rects = FALSE; surface->clip_rects = NULL; surface->num_clip_rects = 0; return (cairo_surface_t *) surface; } static xcb_screen_t * _cairo_xcb_screen_from_visual (xcb_connection_t *c, xcb_visualtype_t *visual) { xcb_depth_iterator_t d; xcb_screen_iterator_t s = xcb_setup_roots_iterator(xcb_get_setup(c)); for (; s.rem; xcb_screen_next(&s)) { if (s.data->root_visual == visual->visual_id) return s.data; d = xcb_screen_allowed_depths_iterator(s.data); for (; d.rem; xcb_depth_next(&d)) { xcb_visualtype_iterator_t v = xcb_depth_visuals_iterator(d.data); for (; v.rem; xcb_visualtype_next(&v)) { if (v.data->visual_id == visual->visual_id) return s.data; } } } return NULL; } /** * cairo_xcb_surface_create: * @c: an XCB connection * @drawable: an XCB drawable * @visual: the visual to use for drawing to @drawable. The depth * of the visual must match the depth of the drawable. * Currently, only TrueColor visuals are fully supported. * @width: the current width of @drawable. * @height: the current height of @drawable. * * Creates an XCB surface that draws to the given drawable. * The way that colors are represented in the drawable is specified * by the provided visual. * * Note: If @drawable is a window, then the function * cairo_xcb_surface_set_size must be called whenever the size of the * window changes. * * Return value: the newly created surface **/ cairo_surface_t * cairo_xcb_surface_create (xcb_connection_t *c, xcb_drawable_t drawable, xcb_visualtype_t *visual, int width, int height) { xcb_screen_t *screen = _cairo_xcb_screen_from_visual (c, visual); if (screen == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); return _cairo_xcb_surface_create_internal (c, drawable, screen, visual, NULL, width, height, 0); } /** * cairo_xcb_surface_create_for_bitmap: * @c: an XCB connection * @bitmap: an XCB Pixmap (a depth-1 pixmap) * @screen: an XCB Screen * @width: the current width of @bitmap * @height: the current height of @bitmap * * Creates an XCB surface that draws to the given bitmap. * This will be drawn to as a %CAIRO_FORMAT_A1 object. * * Return value: the newly created surface **/ cairo_surface_t * cairo_xcb_surface_create_for_bitmap (xcb_connection_t *c, xcb_pixmap_t bitmap, xcb_screen_t *screen, int width, int height) { return _cairo_xcb_surface_create_internal (c, bitmap, screen, NULL, NULL, width, height, 1); } /** * cairo_xcb_surface_create_with_xrender_format: * @c: an XCB connection * @drawable: an XCB drawable * @screen: the XCB screen associated with @drawable * @format: the picture format to use for drawing to @drawable. The * depth of @format mush match the depth of the drawable. * @width: the current width of @drawable * @height: the current height of @drawable * * Creates an XCB surface that draws to the given drawable. * The way that colors are represented in the drawable is specified * by the provided picture format. * * Note: If @drawable is a Window, then the function * cairo_xcb_surface_set_size must be called whenever the size of the * window changes. * * Return value: the newly created surface. **/ cairo_surface_t * cairo_xcb_surface_create_with_xrender_format (xcb_connection_t *c, xcb_drawable_t drawable, xcb_screen_t *screen, xcb_render_pictforminfo_t *format, int width, int height) { return _cairo_xcb_surface_create_internal (c, drawable, screen, NULL, format, width, height, 0); } slim_hidden_def (cairo_xcb_surface_create_with_xrender_format); /** * cairo_xcb_surface_set_size: * @surface: a #cairo_surface_t for the XCB backend * @width: the new width of the surface * @height: the new height of the surface * * Informs cairo of the new size of the XCB drawable underlying the * surface. For a surface created for a window (rather than a pixmap), * this function must be called each time the size of the window * changes. (For a subwindow, you are normally resizing the window * yourself, but for a toplevel window, it is necessary to listen for * ConfigureNotify events.) * * A pixmap can never change size, so it is never necessary to call * this function on a surface created for a pixmap. **/ void cairo_xcb_surface_set_size (cairo_surface_t *abstract_surface, int width, int height) { cairo_xcb_surface_t *surface = (cairo_xcb_surface_t *) abstract_surface; if (! _cairo_surface_is_xcb (abstract_surface)) { _cairo_surface_set_error (abstract_surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return; } surface->width = width; surface->height = height; } /* * Glyph rendering support */ typedef struct _cairo_xcb_surface_font_private { xcb_connection_t *dpy; xcb_render_glyphset_t glyphset; cairo_format_t format; xcb_render_pictforminfo_t *xrender_format; } cairo_xcb_surface_font_private_t; static cairo_status_t _cairo_xcb_surface_font_init (xcb_connection_t *dpy, cairo_scaled_font_t *scaled_font, cairo_format_t format) { cairo_xcb_surface_font_private_t *font_private; font_private = malloc (sizeof (cairo_xcb_surface_font_private_t)); if (!font_private) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font_private->dpy = dpy; font_private->format = format; font_private->xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT(dpy, format); font_private->glyphset = xcb_generate_id(dpy); xcb_render_create_glyph_set (dpy, font_private->glyphset, font_private->xrender_format->id); scaled_font->surface_private = font_private; scaled_font->surface_backend = &cairo_xcb_surface_backend; return CAIRO_STATUS_SUCCESS; } static void _cairo_xcb_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font) { cairo_xcb_surface_font_private_t *font_private = scaled_font->surface_private; if (font_private) { xcb_render_free_glyph_set (font_private->dpy, font_private->glyphset); free (font_private); } } static void _cairo_xcb_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font) { cairo_xcb_surface_font_private_t *font_private = scaled_font->surface_private; if (font_private != NULL && scaled_glyph->surface_private != NULL) { xcb_render_glyph_t glyph_index = _cairo_scaled_glyph_index(scaled_glyph); xcb_render_free_glyphs (font_private->dpy, font_private->glyphset, 1, &glyph_index); } } static cairo_bool_t _native_byte_order_lsb (void) { int x = 1; return *((char *) &x) == 1; } static cairo_status_t _cairo_xcb_surface_add_glyph (xcb_connection_t *dpy, cairo_scaled_font_t *scaled_font, cairo_scaled_glyph_t *scaled_glyph) { xcb_render_glyphinfo_t glyph_info; xcb_render_glyph_t glyph_index; unsigned char *data; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_xcb_surface_font_private_t *font_private; cairo_image_surface_t *glyph_surface = scaled_glyph->surface; if (scaled_font->surface_private == NULL) { status = _cairo_xcb_surface_font_init (dpy, scaled_font, glyph_surface->format); if (status) return status; } font_private = scaled_font->surface_private; /* If the glyph format does not match the font format, then we * create a temporary surface for the glyph image with the font's * format. */ if (glyph_surface->format != font_private->format) { cairo_t *cr; cairo_surface_t *tmp_surface; double x_offset, y_offset; tmp_surface = cairo_image_surface_create (font_private->format, glyph_surface->width, glyph_surface->height); cr = cairo_create (tmp_surface); cairo_surface_get_device_offset (&glyph_surface->base, &x_offset, &y_offset); cairo_set_source_surface (cr, &glyph_surface->base, x_offset, y_offset); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); tmp_surface->device_transform = glyph_surface->base.device_transform; tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; glyph_surface = (cairo_image_surface_t *) tmp_surface; if (status) goto BAIL; } /* XXX: FRAGILE: We're ignore device_transform scaling here. A bug? */ glyph_info.x = _cairo_lround (glyph_surface->base.device_transform.x0); glyph_info.y = _cairo_lround (glyph_surface->base.device_transform.y0); glyph_info.width = glyph_surface->width; glyph_info.height = glyph_surface->height; glyph_info.x_off = 0; glyph_info.y_off = 0; data = glyph_surface->data; /* flip formats around */ switch (scaled_glyph->surface->format) { case CAIRO_FORMAT_A1: /* local bitmaps are always stored with bit == byte */ if (_native_byte_order_lsb() != (xcb_get_setup(dpy)->bitmap_format_bit_order == XCB_IMAGE_ORDER_LSB_FIRST)) { int c = glyph_surface->stride * glyph_surface->height; unsigned char *d; unsigned char *new, *n; new = malloc (c); if (!new) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } n = new; d = data; while (c--) { char b = *d++; b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); *n++ = b; } data = new; } break; case CAIRO_FORMAT_A8: break; case CAIRO_FORMAT_ARGB32: if (_native_byte_order_lsb() != (xcb_get_setup(dpy)->image_byte_order == XCB_IMAGE_ORDER_LSB_FIRST)) { unsigned int c = glyph_surface->stride * glyph_surface->height; unsigned char *d; unsigned char *new, *n; new = malloc (c); if (new == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } n = new; d = data; while (c >= 4) { n[3] = d[0]; n[2] = d[1]; n[1] = d[2]; n[0] = d[3]; d += 4; n += 4; c -= 4; } data = new; } break; case CAIRO_FORMAT_RGB24: default: ASSERT_NOT_REACHED; break; } /* XXX assume X server wants pixman padding. Xft assumes this as well */ glyph_index = _cairo_scaled_glyph_index (scaled_glyph); xcb_render_add_glyphs (dpy, font_private->glyphset, 1, &glyph_index, &glyph_info, glyph_surface->stride * glyph_surface->height, data); if (data != glyph_surface->data) free (data); BAIL: if (glyph_surface != scaled_glyph->surface) cairo_surface_destroy (&glyph_surface->base); return status; } #define N_STACK_BUF 1024 static cairo_status_t _cairo_xcb_surface_show_glyphs_8 (cairo_xcb_surface_t *dst, cairo_operator_t op, cairo_xcb_surface_t *src, int src_x_offset, int src_y_offset, const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_xcb_surface_font_private_t *font_private = scaled_font->surface_private; xcb_render_util_composite_text_stream_t *stream; int i; int thisX, thisY; int lastX = 0, lastY = 0; uint8_t glyph; stream = xcb_render_util_composite_text_stream (font_private->glyphset, num_glyphs, 0); for (i = 0; i < num_glyphs; ++i) { thisX = _cairo_lround (glyphs[i].x); thisY = _cairo_lround (glyphs[i].y); glyph = glyphs[i].index; xcb_render_util_glyphs_8 (stream, thisX - lastX, thisY - lastY, 1, &glyph); lastX = thisX; lastY = thisY; } xcb_render_util_composite_text (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, font_private->xrender_format->id, src_x_offset + _cairo_lround (glyphs[0].x), src_y_offset + _cairo_lround (glyphs[0].y), stream); xcb_render_util_composite_text_free (stream); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xcb_surface_show_glyphs_16 (cairo_xcb_surface_t *dst, cairo_operator_t op, cairo_xcb_surface_t *src, int src_x_offset, int src_y_offset, const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_xcb_surface_font_private_t *font_private = scaled_font->surface_private; xcb_render_util_composite_text_stream_t *stream; int i; int thisX, thisY; int lastX = 0, lastY = 0; uint16_t glyph; stream = xcb_render_util_composite_text_stream (font_private->glyphset, num_glyphs, 0); for (i = 0; i < num_glyphs; ++i) { thisX = _cairo_lround (glyphs[i].x); thisY = _cairo_lround (glyphs[i].y); glyph = glyphs[i].index; xcb_render_util_glyphs_16 (stream, thisX - lastX, thisY - lastY, 1, &glyph); lastX = thisX; lastY = thisY; } xcb_render_util_composite_text (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, font_private->xrender_format->id, src_x_offset + _cairo_lround (glyphs[0].x), src_y_offset + _cairo_lround (glyphs[0].y), stream); xcb_render_util_composite_text_free (stream); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xcb_surface_show_glyphs_32 (cairo_xcb_surface_t *dst, cairo_operator_t op, cairo_xcb_surface_t *src, int src_x_offset, int src_y_offset, const cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_xcb_surface_font_private_t *font_private = scaled_font->surface_private; xcb_render_util_composite_text_stream_t *stream; int i; int thisX, thisY; int lastX = 0, lastY = 0; uint32_t glyph; stream = xcb_render_util_composite_text_stream (font_private->glyphset, num_glyphs, 0); for (i = 0; i < num_glyphs; ++i) { thisX = _cairo_lround (glyphs[i].x); thisY = _cairo_lround (glyphs[i].y); glyph = glyphs[i].index; xcb_render_util_glyphs_32 (stream, thisX - lastX, thisY - lastY, 1, &glyph); lastX = thisX; lastY = thisY; } xcb_render_util_composite_text (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, font_private->xrender_format->id, src_x_offset + _cairo_lround (glyphs[0].x), src_y_offset + _cairo_lround (glyphs[0].y), stream); xcb_render_util_composite_text_free (stream); return CAIRO_STATUS_SUCCESS; } typedef cairo_status_t (*cairo_xcb_surface_show_glyphs_func_t) (cairo_xcb_surface_t *, cairo_operator_t, cairo_xcb_surface_t *, int, int, const cairo_glyph_t *, int, cairo_scaled_font_t *); static cairo_int_status_t _cairo_xcb_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; cairo_xcb_surface_t *dst = abstract_dst; composite_operation_t operation; cairo_surface_attributes_t attributes; cairo_xcb_surface_t *src = NULL; cairo_glyph_t *output_glyphs; const cairo_glyph_t *glyphs_chunk; int glyphs_remaining, chunk_size, max_chunk_size; cairo_scaled_glyph_t *scaled_glyph; cairo_xcb_surface_font_private_t *font_private; int i, o; unsigned long max_index = 0; cairo_xcb_surface_show_glyphs_func_t show_glyphs_func; cairo_pattern_union_t solid_pattern; if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE_TEXT (dst) || dst->xrender_format.id == XCB_NONE) return CAIRO_INT_STATUS_UNSUPPORTED; /* Just let unbounded operators go through the fallback code * instead of trying to do the fixups here */ if (!_cairo_operator_bounded_by_mask (op)) return CAIRO_INT_STATUS_UNSUPPORTED; /* Render <= 0.10 seems to have a bug with PictOpSrc and glyphs -- * the solid source seems to be multiplied by the glyph mask, and * then the entire thing is copied to the destination surface, * including the fully transparent "background" of the rectangular * glyph surface. */ if (op == CAIRO_OPERATOR_SOURCE && !CAIRO_SURFACE_RENDER_AT_LEAST(dst, 0, 11)) return CAIRO_INT_STATUS_UNSUPPORTED; /* We can only use our code if we either have no clip or * have a real native clip region set. If we're using * fallback clip masking, we have to go through the full * fallback path. */ if (dst->base.clip && (dst->base.clip->mode != CAIRO_CLIP_MODE_REGION || dst->base.clip->surface != NULL)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, src_pattern, TRUE); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; font_private = scaled_font->surface_private; if ((scaled_font->surface_backend != NULL && scaled_font->surface_backend != &cairo_xcb_surface_backend) || (font_private != NULL && font_private->dpy != dst->dpy)) return CAIRO_INT_STATUS_UNSUPPORTED; /* We make a copy of the glyphs so that we can elide any size-zero * glyphs to workaround an X server bug, (present in at least Xorg * 7.1 without EXA). */ output_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); if (output_glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); /* After passing all those tests, we're now committed to rendering * these glyphs or to fail trying. We first upload any glyphs to * the X server that it doesn't have already, then we draw * them. We tie into the scaled_font's glyph cache and remove * glyphs from the X server when they are ejected from the * scaled_font cache. Because of this we first freeze the * scaled_font's cache so that we don't cause any of our glyphs to * be ejected and removed from the X server before we have a * chance to render them. */ _cairo_scaled_font_freeze_cache (scaled_font); /* PictOpClear doesn't seem to work with CompositeText; it seems to ignore * the mask (the glyphs). This code below was executed as a side effect * of going through the _clip_and_composite fallback code for old_show_glyphs, * so PictOpClear was never used with CompositeText before. */ if (op == CAIRO_OPERATOR_CLEAR) { _cairo_pattern_init_solid (&solid_pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); src_pattern = &solid_pattern.base; op = CAIRO_OPERATOR_DEST_OUT; } if (src_pattern->type == CAIRO_PATTERN_TYPE_SOLID) { status = _cairo_pattern_acquire_surface (src_pattern, &dst->base, 0, 0, 1, 1, (cairo_surface_t **) &src, &attributes); } else { cairo_rectangle_int_t glyph_extents; status = _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, &glyph_extents); if (status) goto BAIL; status = _cairo_pattern_acquire_surface (src_pattern, &dst->base, glyph_extents.x, glyph_extents.y, glyph_extents.width, glyph_extents.height, (cairo_surface_t **) &src, &attributes); } if (status) goto BAIL; operation = _recategorize_composite_operation (dst, op, src, &attributes, TRUE); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } status = _cairo_xcb_surface_set_attributes (src, &attributes); if (status) goto BAIL; /* Send all unsent glyphs to the server, and count the max of the glyph indices */ for (i = 0, o = 0; i < num_glyphs; i++) { if (glyphs[i].index > max_index) max_index = glyphs[i].index; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_SURFACE, &scaled_glyph); if (status != CAIRO_STATUS_SUCCESS) goto BAIL; /* Don't put any size-zero glyphs into output_glyphs to avoid * an X server bug which stops rendering glyphs after the * first size-zero glyph. */ if (scaled_glyph->surface->width && scaled_glyph->surface->height) { output_glyphs[o++] = glyphs[i]; if (scaled_glyph->surface_private == NULL) { _cairo_xcb_surface_add_glyph (dst->dpy, scaled_font, scaled_glyph); scaled_glyph->surface_private = (void *) 1; } } } num_glyphs = o; _cairo_xcb_surface_ensure_dst_picture (dst); max_chunk_size = xcb_get_maximum_request_length (dst->dpy); if (max_index < 256) { /* XXX: these are all the same size! (28) */ max_chunk_size -= sizeof(xcb_render_composite_glyphs_8_request_t); show_glyphs_func = _cairo_xcb_surface_show_glyphs_8; } else if (max_index < 65536) { max_chunk_size -= sizeof(xcb_render_composite_glyphs_16_request_t); show_glyphs_func = _cairo_xcb_surface_show_glyphs_16; } else { max_chunk_size -= sizeof(xcb_render_composite_glyphs_32_request_t); show_glyphs_func = _cairo_xcb_surface_show_glyphs_32; } /* XXX: I think this is wrong; this is only the header size (2 longs) */ /* but should also include the glyph (1 long) */ /* max_chunk_size /= sz_xGlyphElt; */ max_chunk_size /= 3*sizeof(uint32_t); for (glyphs_remaining = num_glyphs, glyphs_chunk = output_glyphs; glyphs_remaining; glyphs_remaining -= chunk_size, glyphs_chunk += chunk_size) { chunk_size = MIN (glyphs_remaining, max_chunk_size); status = show_glyphs_func (dst, op, src, attributes.x_offset, attributes.y_offset, glyphs_chunk, chunk_size, scaled_font); if (status != CAIRO_STATUS_SUCCESS) break; } BAIL: _cairo_scaled_font_thaw_cache (scaled_font); free (output_glyphs); if (src) _cairo_pattern_release_surface (src_pattern, &src->base, &attributes); if (src_pattern == &solid_pattern.base) _cairo_pattern_fini (&solid_pattern.base); return status; } libgdiplus-2.11/cairo/src/cairo-skiplist-private.h0000664000175000017500000001041012225470167017162 00000000000000/* * Copyright © 2006 Keith Packard * Copyright © 2006 Carl Worth * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef SKIPLIST_H #define SKIPLIST_H #include "cairoint.h" /* * Skip lists are described in detail here: * * http://citeseer.ist.psu.edu/pugh90skip.html */ /* Note that random_level() called from alloc_node_for_level() depends on * this being not more than 16. */ #define MAX_LEVEL 15 /* Returns the index of the free-list to use for a node at level 'level' */ #define FREELIST_FOR_LEVEL(level) (((level) - 1) / 2) /* Returns the maximum level that uses the same free-list as 'level' does */ #define FREELIST_MAX_LEVEL_FOR(level) (((level) + 1) & ~1) #define MAX_FREELIST_LEVEL (FREELIST_FOR_LEVEL (MAX_LEVEL - 1) + 1) /* * Skip list element. In order to use the skip list, the caller must * generate a structure for list elements that has as its final member * a skip_elt_t, (which will be allocated with variable size). * * The caller must also pass the size of the structure to * _cairo_skip_list_init. */ typedef struct _skip_elt { int prev_index; struct _skip_elt *prev; struct _skip_elt *next[1]; } skip_elt_t; #define SKIP_LIST_ELT_TO_DATA(type, elt) ((type *) ((char *) (elt) - (sizeof (type) - sizeof (skip_elt_t)))) typedef int (*cairo_skip_list_compare_t) (void *list, void *a, void *b); typedef struct _skip_list { cairo_skip_list_compare_t compare; size_t elt_size; size_t data_size; skip_elt_t *chains[MAX_LEVEL]; skip_elt_t *freelists[MAX_FREELIST_LEVEL]; int max_level; } cairo_skip_list_t; /* Initialize a new skip list. The compare function accepts a pointer * to the list as well as pointers to two elements. The function must * return a value greater than zero, zero, or less then 0 if the first * element is considered respectively greater than, equal to, or less * than the second element. The size of each object, (as computed by * sizeof) is passed for elt_size. Note that the structure used for * list elements must have as its final member a skip_elt_t */ cairo_private void _cairo_skip_list_init (cairo_skip_list_t *list, cairo_skip_list_compare_t compare, size_t elt_size); /* Deallocate resources associated with a skip list and all elements * in it. (XXX: currently this simply deletes all elements.) */ cairo_private void _cairo_skip_list_fini (cairo_skip_list_t *list); /* Insert a new element into the list at the correct sort order as * determined by compare. If unique is true, then duplicate elements * are ignored and the already inserted element is returned. * Otherwise data will be copied (elt_size bytes from via * memcpy) and the new element is returned. */ cairo_private void * _cairo_skip_list_insert (cairo_skip_list_t *list, void *data, int unique); /* Find an element which compare considers equal to */ cairo_private void * _cairo_skip_list_find (cairo_skip_list_t *list, void *data); /* Delete an element which compare considers equal to */ cairo_private void _cairo_skip_list_delete (cairo_skip_list_t *list, void *data); /* Delete the given element from the list. */ cairo_private void _cairo_skip_list_delete_given (cairo_skip_list_t *list, skip_elt_t *given); #endif libgdiplus-2.11/cairo/src/cairo-spline.c0000664000175000017500000002001512225470167015137 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" static cairo_status_t _cairo_spline_grow (cairo_spline_t *spline); static cairo_status_t _cairo_spline_add_point (cairo_spline_t *spline, const cairo_point_t *point); static void _lerp_half (const cairo_point_t *a, const cairo_point_t *b, cairo_point_t *result); static void _de_casteljau (cairo_spline_knots_t *s1, cairo_spline_knots_t *s2); static double _cairo_spline_error_squared (const cairo_spline_knots_t *spline); static cairo_status_t _cairo_spline_decompose_into (cairo_spline_knots_t *spline, double tolerance_squared, cairo_spline_t *result); cairo_int_status_t _cairo_spline_init (cairo_spline_t *spline, const cairo_point_t *a, const cairo_point_t *b, const cairo_point_t *c, const cairo_point_t *d) { spline->knots.a = *a; spline->knots.b = *b; spline->knots.c = *c; spline->knots.d = *d; if (a->x != b->x || a->y != b->y) _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.b); else if (a->x != c->x || a->y != c->y) _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.c); else if (a->x != d->x || a->y != d->y) _cairo_slope_init (&spline->initial_slope, &spline->knots.a, &spline->knots.d); else return CAIRO_INT_STATUS_DEGENERATE; if (c->x != d->x || c->y != d->y) _cairo_slope_init (&spline->final_slope, &spline->knots.c, &spline->knots.d); else if (b->x != d->x || b->y != d->y) _cairo_slope_init (&spline->final_slope, &spline->knots.b, &spline->knots.d); else _cairo_slope_init (&spline->final_slope, &spline->knots.a, &spline->knots.d); spline->points = spline->points_embedded; spline->points_size = ARRAY_LENGTH (spline->points_embedded); spline->num_points = 0; return CAIRO_STATUS_SUCCESS; } void _cairo_spline_fini (cairo_spline_t *spline) { if (spline->points != spline->points_embedded) free (spline->points); spline->points = spline->points_embedded; spline->points_size = ARRAY_LENGTH (spline->points_embedded); spline->num_points = 0; } /* make room for at least one more point */ static cairo_status_t _cairo_spline_grow (cairo_spline_t *spline) { cairo_point_t *new_points; int old_size = spline->points_size; int new_size = 2 * MAX (old_size, 16); assert (spline->num_points <= spline->points_size); if (spline->points == spline->points_embedded) { new_points = _cairo_malloc_ab (new_size, sizeof (cairo_point_t)); if (new_points) memcpy (new_points, spline->points, old_size * sizeof (cairo_point_t)); } else { new_points = _cairo_realloc_ab (spline->points, new_size, sizeof (cairo_point_t)); } if (new_points == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); spline->points = new_points; spline->points_size = new_size; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_spline_add_point (cairo_spline_t *spline, const cairo_point_t *point) { cairo_status_t status; cairo_point_t *prev; if (spline->num_points) { prev = &spline->points[spline->num_points - 1]; if (prev->x == point->x && prev->y == point->y) return CAIRO_STATUS_SUCCESS; } if (spline->num_points >= spline->points_size) { status = _cairo_spline_grow (spline); if (status) return status; } spline->points[spline->num_points] = *point; spline->num_points++; return CAIRO_STATUS_SUCCESS; } static void _lerp_half (const cairo_point_t *a, const cairo_point_t *b, cairo_point_t *result) { result->x = a->x + ((b->x - a->x) >> 1); result->y = a->y + ((b->y - a->y) >> 1); } static void _de_casteljau (cairo_spline_knots_t *s1, cairo_spline_knots_t *s2) { cairo_point_t ab, bc, cd; cairo_point_t abbc, bccd; cairo_point_t final; _lerp_half (&s1->a, &s1->b, &ab); _lerp_half (&s1->b, &s1->c, &bc); _lerp_half (&s1->c, &s1->d, &cd); _lerp_half (&ab, &bc, &abbc); _lerp_half (&bc, &cd, &bccd); _lerp_half (&abbc, &bccd, &final); s2->a = final; s2->b = bccd; s2->c = cd; s2->d = s1->d; s1->b = ab; s1->c = abbc; s1->d = final; } /* Return an upper bound on the error (squared) that could result from * approximating a spline as a line segment connecting the two endpoints. */ static double _cairo_spline_error_squared (const cairo_spline_knots_t *knots) { double bdx, bdy, berr; double cdx, cdy, cerr; /* Intersection point (px): * px = p1 + u(p2 - p1) * (p - px) ∙ (p2 - p1) = 0 * Thus: * u = ((p - p1) ∙ (p2 - p1)) / ∥p2 - p1∥²; */ bdx = _cairo_fixed_to_double (knots->b.x - knots->a.x); bdy = _cairo_fixed_to_double (knots->b.y - knots->a.y); cdx = _cairo_fixed_to_double (knots->c.x - knots->a.x); cdy = _cairo_fixed_to_double (knots->c.y - knots->a.y); if (knots->a.x != knots->d.x || knots->a.y != knots->d.y) { double dx, dy, u, v; dx = _cairo_fixed_to_double (knots->d.x - knots->a.x); dy = _cairo_fixed_to_double (knots->d.y - knots->a.y); v = dx * dx + dy * dy; u = bdx * dx + bdy * dy; if (u <= 0) { /* bdx -= 0; * bdy -= 0; */ } else if (u >= v) { bdx -= dx; bdy -= dy; } else { bdx -= u/v * dx; bdy -= u/v * dy; } u = cdx * dx + cdy * dy; if (u <= 0) { /* cdx -= 0; * cdy -= 0; */ } else if (u >= v) { cdx -= dx; cdy -= dy; } else { cdx -= u/v * dx; cdy -= u/v * dy; } } berr = bdx * bdx + bdy * bdy; cerr = cdx * cdx + cdy * cdy; if (berr > cerr) return berr; else return cerr; } static cairo_status_t _cairo_spline_decompose_into (cairo_spline_knots_t *s1, double tolerance_squared, cairo_spline_t *result) { cairo_spline_knots_t s2; cairo_status_t status; if (_cairo_spline_error_squared (s1) < tolerance_squared) return _cairo_spline_add_point (result, &s1->a); _de_casteljau (s1, &s2); status = _cairo_spline_decompose_into (s1, tolerance_squared, result); if (status) return status; status = _cairo_spline_decompose_into (&s2, tolerance_squared, result); if (status) return status; return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_spline_decompose (cairo_spline_t *spline, double tolerance) { cairo_status_t status; cairo_spline_knots_t s1; /* reset the spline, but keep the buffer */ spline->num_points = 0; s1 = spline->knots; status = _cairo_spline_decompose_into (&s1, tolerance * tolerance, spline); if (status) return status; status = _cairo_spline_add_point (spline, &spline->knots.d); if (status) return status; return CAIRO_STATUS_SUCCESS; } libgdiplus-2.11/cairo/src/cairo.pc.in0000664000175000017500000000045212225470167014437 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: cairo Description: Multi-platform 2D graphics library Version: @VERSION@ @PKGCONFIG_REQUIRES@: @CAIRO_REQUIRES@ Libs: -L${libdir} -lcairo Libs.private: @CAIRO_NONPKGCONFIG_LIBS@ Cflags: -I${includedir}/cairo libgdiplus-2.11/cairo/src/cairo-type1-subset.c0000664000175000017500000011472012225470167016221 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg */ /* * Useful links: * http://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" #include "cairo-type1-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-output-stream-private.h" /* XXX: Eventually, we need to handle other font backends */ #include "cairo-ft-private.h" #include #include FT_FREETYPE_H #include FT_OUTLINE_H #include FT_TYPE1_TABLES_H #include typedef struct _cairo_type1_font_subset { cairo_scaled_font_subset_t *scaled_font_subset; struct { cairo_unscaled_font_t *unscaled_font; unsigned int font_id; char *base_font; unsigned int num_glyphs; long x_min, y_min, x_max, y_max; long ascent, descent; const char *data; unsigned long header_size; unsigned long data_size; unsigned long trailer_size; } base; FT_Face face; int num_glyphs; struct { int subset_index; int width; char *name; } *glyphs; cairo_output_stream_t *output; cairo_array_t contents; const char *rd, *nd; char *type1_data; unsigned int type1_length; char *type1_end; char *header_segment; int header_segment_size; char *eexec_segment; int eexec_segment_size; cairo_bool_t eexec_segment_is_ascii; char *cleartext; char *cleartext_end; int header_size; unsigned short eexec_key; cairo_bool_t hex_encode; int hex_column; } cairo_type1_font_subset_t; static cairo_status_t _cairo_type1_font_subset_create (cairo_unscaled_font_t *unscaled_font, cairo_type1_font_subset_t **subset_return, cairo_bool_t hex_encode) { cairo_ft_unscaled_font_t *ft_unscaled_font; cairo_status_t status; FT_Face face; PS_FontInfoRec font_info; cairo_type1_font_subset_t *font; int i, j; ft_unscaled_font = (cairo_ft_unscaled_font_t *) unscaled_font; face = _cairo_ft_unscaled_font_lock_face (ft_unscaled_font); if (face == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (FT_Get_PS_Font_Info(face, &font_info) != 0) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto fail1; } /* OpenType/CFF fonts also have a PS_FontInfoRec */ #if HAVE_FT_LOAD_SFNT_TABLE if (FT_IS_SFNT (face)) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto fail1; } #endif font = calloc (sizeof (cairo_type1_font_subset_t), 1); if (font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } font->base.unscaled_font = _cairo_unscaled_font_reference (unscaled_font); font->base.num_glyphs = face->num_glyphs; font->base.x_min = face->bbox.xMin; font->base.y_min = face->bbox.yMin; font->base.x_max = face->bbox.xMax; font->base.y_max = face->bbox.yMax; font->base.ascent = face->ascender; font->base.descent = face->descender; if (face->family_name) { font->base.base_font = strdup (face->family_name); if (font->base.base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } for (i = 0, j = 0; font->base.base_font[j]; j++) { if (font->base.base_font[j] == ' ') continue; font->base.base_font[i++] = font->base.base_font[j]; } font->base.base_font[i] = '\0'; } font->glyphs = calloc (face->num_glyphs, sizeof font->glyphs[0]); if (font->glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } font->hex_encode = hex_encode; font->num_glyphs = 0; for (i = 0; i < face->num_glyphs; i++) font->glyphs[i].subset_index = -1; _cairo_array_init (&font->contents, sizeof (char)); _cairo_ft_unscaled_font_unlock_face (ft_unscaled_font); *subset_return = font; return CAIRO_STATUS_SUCCESS; fail3: if (font->base.base_font) free (font->base.base_font); fail2: _cairo_unscaled_font_destroy (unscaled_font); free (font); fail1: _cairo_ft_unscaled_font_unlock_face (ft_unscaled_font); return status; } static void cairo_type1_font_subset_use_glyph (cairo_type1_font_subset_t *font, int glyph) { if (font->glyphs[glyph].subset_index >= 0) return; font->glyphs[glyph].subset_index = font->num_glyphs++; } static cairo_bool_t is_ps_delimiter(int c) { static const char delimiters[] = "()[]{}<>/% \t\r\n"; return strchr (delimiters, c) != NULL; } static const char * find_token (const char *buffer, const char *end, const char *token) { int i, length; /* FIXME: find substring really must be find_token */ if (buffer == NULL) return NULL; length = strlen (token); for (i = 0; buffer + i < end - length + 1; i++) if (memcmp (buffer + i, token, length) == 0) if ((i == 0 || token[0] == '/' || is_ps_delimiter(buffer[i - 1])) && (buffer + i == end - length || is_ps_delimiter(buffer[i + length]))) return buffer + i; return NULL; } static cairo_status_t cairo_type1_font_subset_find_segments (cairo_type1_font_subset_t *font) { unsigned char *p; const char *eexec_token; int size; p = (unsigned char *) font->type1_data; font->type1_end = font->type1_data + font->type1_length; if (p[0] == 0x80 && p[1] == 0x01) { font->header_segment_size = p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); font->header_segment = (char *) p + 6; p += 6 + font->header_segment_size; font->eexec_segment_size = p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); font->eexec_segment = (char *) p + 6; font->eexec_segment_is_ascii = (p[1] == 1); p += 6 + font->eexec_segment_size; while (p < (unsigned char *) (font->type1_end) && p[1] != 0x03) { size = p[2] | (p[3] << 8) | (p[4] << 16) | (p[5] << 24); p += 6 + size; } font->type1_end = (char *) p; } else { eexec_token = find_token ((char *) p, font->type1_end, "eexec"); if (eexec_token == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; font->header_segment_size = eexec_token - (char *) p + strlen ("eexec\n"); font->header_segment = (char *) p; font->eexec_segment_size = font->type1_length - font->header_segment_size; font->eexec_segment = (char *) p + font->header_segment_size; font->eexec_segment_is_ascii = TRUE; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_type1_font_subset_write_header (cairo_type1_font_subset_t *font, const char *name) { const char *start, *end, *segment_end; unsigned int i; segment_end = font->header_segment + font->header_segment_size; start = find_token (font->header_segment, segment_end, "/FontName"); if (start == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; _cairo_output_stream_write (font->output, font->header_segment, start - font->header_segment); _cairo_output_stream_printf (font->output, "/FontName /%s def", name); end = find_token (start, segment_end, "def"); if (end == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; end += 3; start = find_token (end, segment_end, "/Encoding"); if (start == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; _cairo_output_stream_write (font->output, end, start - end); _cairo_output_stream_printf (font->output, "/Encoding 256 array\n" "0 1 255 {1 index exch /.notdef put} for\n"); for (i = 1; i < font->base.num_glyphs; i++) { if (font->glyphs[i].subset_index < 0) continue; _cairo_output_stream_printf (font->output, "dup %d /%s put\n", font->glyphs[i].subset_index, font->glyphs[i].name); } _cairo_output_stream_printf (font->output, "readonly def"); end = find_token (start, segment_end, "def"); if (end == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; end += 3; _cairo_output_stream_write (font->output, end, segment_end - end); return font->output->status; } static int hex_to_int (int ch) { if (ch <= '9') return ch - '0'; else if (ch <= 'F') return ch - 'A' + 10; else return ch - 'a' + 10; } static cairo_status_t cairo_type1_font_subset_write_encrypted (cairo_type1_font_subset_t *font, const char *data, unsigned int length) { const unsigned char *in, *end; int c, p; static const char hex_digits[16] = "0123456789abcdef"; char digits[3]; in = (const unsigned char *) data; end = (const unsigned char *) data + length; while (in < end) { p = *in++; c = p ^ (font->eexec_key >> 8); font->eexec_key = (c + font->eexec_key) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; if (font->hex_encode) { digits[0] = hex_digits[c >> 4]; digits[1] = hex_digits[c & 0x0f]; digits[2] = '\n'; font->hex_column += 2; if (font->hex_column == 78) { _cairo_output_stream_write (font->output, digits, 3); font->hex_column = 0; } else { _cairo_output_stream_write (font->output, digits, 2); } } else { digits[0] = c; _cairo_output_stream_write (font->output, digits, 1); } } return font->output->status; } static cairo_status_t cairo_type1_font_subset_decrypt_eexec_segment (cairo_type1_font_subset_t *font) { unsigned short r = CAIRO_TYPE1_PRIVATE_DICT_KEY; unsigned char *in, *end; char *out; int c, p; in = (unsigned char *) font->eexec_segment; end = (unsigned char *) in + font->eexec_segment_size; font->cleartext = malloc (font->eexec_segment_size); if (font->cleartext == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); out = font->cleartext; while (in < end) { if (font->eexec_segment_is_ascii) { c = *in++; if (isspace (c)) continue; c = (hex_to_int (c) << 4) | hex_to_int (*in++); } else { c = *in++; } p = c ^ (r >> 8); r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; *out++ = p; } font->cleartext_end = out; return CAIRO_STATUS_SUCCESS; } static const char * skip_token (const char *p, const char *end) { while (p < end && isspace(*p)) p++; while (p < end && !isspace(*p)) p++; if (p == end) return NULL; return p; } static int cairo_type1_font_subset_lookup_glyph (cairo_type1_font_subset_t *font, const char *glyph_name, int length) { unsigned int i; for (i = 0; i < font->base.num_glyphs; i++) { if (font->glyphs[i].name && strncmp (font->glyphs[i].name, glyph_name, length) == 0 && font->glyphs[i].name[length] == '\0') return i; } return -1; } static cairo_status_t cairo_type1_font_subset_get_glyph_names_and_widths (cairo_type1_font_subset_t *font) { unsigned int i; char buffer[256]; FT_Error error; /* Get glyph names and width using the freetype API */ for (i = 0; i < font->base.num_glyphs; i++) { if (font->glyphs[i].name != NULL) continue; error = FT_Load_Glyph (font->face, i, FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_TRANSFORM); if (error != 0) { printf ("could not load glyph %d\n", i); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } font->glyphs[i].width = font->face->glyph->metrics.horiAdvance; error = FT_Get_Glyph_Name(font->face, i, buffer, sizeof buffer); if (error != 0) { printf ("could not get glyph name for glyph %d\n", i); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } font->glyphs[i].name = strdup (buffer); if (font->glyphs[i].name == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } return CAIRO_STATUS_SUCCESS; } static void cairo_type1_font_subset_decrypt_charstring (const unsigned char *in, int size, unsigned char *out) { unsigned short r = CAIRO_TYPE1_CHARSTRING_KEY; int c, p, i; for (i = 0; i < size; i++) { c = *in++; p = c ^ (r >> 8); r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; *out++ = p; } } static const unsigned char * cairo_type1_font_subset_decode_integer (const unsigned char *p, int *integer) { if (*p <= 246) { *integer = *p++ - 139; } else if (*p <= 250) { *integer = (p[0] - 247) * 256 + p[1] + 108; p += 2; } else if (*p <= 254) { *integer = -(p[0] - 251) * 256 - p[1] - 108; p += 2; } else { *integer = (p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4]; p += 5; } return p; } #if 0 /* * The two tables that follow are generated using this perl code: */ @encoding = ( /* 0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 16 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 32 */ "space", "exclam", "quotedbl", "numbersign", "dollar", "percent", "ampersand", "quoteright", "parenleft", "parenright", "asterisk", "plus", "comma", "hyphen", "period", "slash", /* 48 */ "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "colon", "semicolon", "less", "equal", "greater", "question", /* 64 */ "at", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", /* 80 */ "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bracketleft", "backslash", "bracketright", "asciicircum", "underscore", /* 96 */ "quoteleft", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", /* 112 */ "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "braceleft", "bar", "braceright", "asciitilde", NULL, /* 128 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 144 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 160 */ NULL, "exclamdown", "cent", "sterling", "fraction", "yen", "florin", "section", "currency", "quotesingle", "quotedblleft", "guillemotleft", "guilsinglleft","guilsinglright","fi", "fl", /* 176 */ NULL, "endash", "dagger", "daggerdbl", "periodcentered",NULL, "paragraph", "bullet", "quotesinglbase","quotedblbase","quotedblright","guillemotright", "ellipsis", "perthousand", NULL, "questiondown", /* 192 */ NULL, "grave", "acute", "circumflex", "tilde", "macron", "breve", "dotaccent", "dieresis", NULL, "ring", "cedilla", NULL, "hungarumlaut", "ogonek", "caron", /* 208 */ "emdash", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 224 */ NULL, "AE", NULL, "ordfeminine", NULL, NULL, NULL, NULL, "Lslash", "Oslash", "OE", "ordmasculine", NULL, NULL, NULL, NULL, /* 240 */ NULL, "ae", NULL, NULL, NULL, "dotlessi", NULL, NULL, "lslash", "oslash", "oe", "germandbls", NULL, NULL, NULL, NULL ); print "static const char ps_standard_encoding_symbol[] = {\n"; $s = qq( "\\0"); for $sym (@encoding) { if (! ($sym eq NULL)) { $ss = qq( "$sym\\0"); if (length($s) + length($ss) > 78) { print qq( $s\n); $s = ""; } $s .= $ss; } } print qq( $s\n); print "};\n\n"; print "static const int16_t ps_standard_encoding_offset[256] = {\n"; $offset = 1; $s = qq(); for $sym (@encoding) { if (! ($sym eq NULL)) { $ss = qq( $offset/*$sym*/,); $offset += length($sym) + 1; } else { $ss = qq( 0,); } if (length($s) + length($ss) > 78) { print qq( $s\n); $s = ""; } $s .= $ss; } print qq( $s\n); print "};\n"; exit; #endif static const char ps_standard_encoding_symbol[] = { "\0" "space\0" "exclam\0" "quotedbl\0" "numbersign\0" "dollar\0" "percent\0" "ampersand\0" "quoteright\0" "parenleft\0" "parenright\0" "asterisk\0" "plus\0" "comma\0" "hyphen\0" "period\0" "slash\0" "zero\0" "one\0" "two\0" "three\0" "four\0" "five\0" "six\0" "seven\0" "eight\0" "nine\0" "colon\0" "semicolon\0" "less\0" "equal\0" "greater\0" "question\0" "at\0" "A\0" "B\0" "C\0" "D\0" "E\0" "F\0" "G\0" "H\0" "I\0" "J\0" "K\0" "L\0" "M\0" "N\0" "O\0" "P\0" "Q\0" "R\0" "S\0" "T\0" "U\0" "V\0" "W\0" "X\0" "Y\0" "Z\0" "bracketleft\0" "backslash\0" "bracketright\0" "asciicircum\0" "underscore\0" "quoteleft\0" "a\0" "b\0" "c\0" "d\0" "e\0" "f\0" "g\0" "h\0" "i\0" "j\0" "k\0" "l\0" "m\0" "n\0" "o\0" "p\0" "q\0" "r\0" "s\0" "t\0" "u\0" "v\0" "w\0" "x\0" "y\0" "z\0" "braceleft\0" "bar\0" "braceright\0" "asciitilde\0" "exclamdown\0" "cent\0" "sterling\0" "fraction\0" "yen\0" "florin\0" "section\0" "currency\0" "quotesingle\0" "quotedblleft\0" "guillemotleft\0" "guilsinglleft\0" "guilsinglright\0" "fi\0" "fl\0" "endash\0" "dagger\0" "daggerdbl\0" "periodcentered\0" "paragraph\0" "bullet\0" "quotesinglbase\0" "quotedblbase\0" "quotedblright\0" "guillemotright\0" "ellipsis\0" "perthousand\0" "questiondown\0" "grave\0" "acute\0" "circumflex\0" "tilde\0" "macron\0" "breve\0" "dotaccent\0" "dieresis\0" "ring\0" "cedilla\0" "hungarumlaut\0" "ogonek\0" "caron\0" "emdash\0" "AE\0" "ordfeminine\0" "Lslash\0" "Oslash\0" "OE\0" "ordmasculine\0" "ae\0" "dotlessi\0" "lslash\0" "oslash\0" "oe\0" "germandbls\0" }; static const int16_t ps_standard_encoding_offset[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1/*space*/, 7/*exclam*/, 14/*quotedbl*/, 23/*numbersign*/, 34/*dollar*/, 41/*percent*/, 49/*ampersand*/, 59/*quoteright*/, 70/*parenleft*/, 80/*parenright*/, 91/*asterisk*/, 100/*plus*/, 105/*comma*/, 111/*hyphen*/, 118/*period*/, 125/*slash*/, 131/*zero*/, 136/*one*/, 140/*two*/, 144/*three*/, 150/*four*/, 155/*five*/, 160/*six*/, 164/*seven*/, 170/*eight*/, 176/*nine*/, 181/*colon*/, 187/*semicolon*/, 197/*less*/, 202/*equal*/, 208/*greater*/, 216/*question*/, 225/*at*/, 228/*A*/, 230/*B*/, 232/*C*/, 234/*D*/, 236/*E*/, 238/*F*/, 240/*G*/, 242/*H*/, 244/*I*/, 246/*J*/, 248/*K*/, 250/*L*/, 252/*M*/, 254/*N*/, 256/*O*/, 258/*P*/, 260/*Q*/, 262/*R*/, 264/*S*/, 266/*T*/, 268/*U*/, 270/*V*/, 272/*W*/, 274/*X*/, 276/*Y*/, 278/*Z*/, 280/*bracketleft*/, 292/*backslash*/, 302/*bracketright*/, 315/*asciicircum*/, 327/*underscore*/, 338/*quoteleft*/, 348/*a*/, 350/*b*/, 352/*c*/, 354/*d*/, 356/*e*/, 358/*f*/, 360/*g*/, 362/*h*/, 364/*i*/, 366/*j*/, 368/*k*/, 370/*l*/, 372/*m*/, 374/*n*/, 376/*o*/, 378/*p*/, 380/*q*/, 382/*r*/, 384/*s*/, 386/*t*/, 388/*u*/, 390/*v*/, 392/*w*/, 394/*x*/, 396/*y*/, 398/*z*/, 400/*braceleft*/, 410/*bar*/, 414/*braceright*/, 425/*asciitilde*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436/*exclamdown*/, 447/*cent*/, 452/*sterling*/, 461/*fraction*/, 470/*yen*/, 474/*florin*/, 481/*section*/, 489/*currency*/, 498/*quotesingle*/, 510/*quotedblleft*/, 523/*guillemotleft*/, 537/*guilsinglleft*/, 551/*guilsinglright*/, 566/*fi*/, 569/*fl*/, 0, 572/*endash*/, 579/*dagger*/, 586/*daggerdbl*/, 596/*periodcentered*/, 0, 611/*paragraph*/, 621/*bullet*/, 628/*quotesinglbase*/, 643/*quotedblbase*/, 656/*quotedblright*/, 670/*guillemotright*/, 685/*ellipsis*/, 694/*perthousand*/, 0, 706/*questiondown*/, 0, 719/*grave*/, 725/*acute*/, 731/*circumflex*/, 742/*tilde*/, 748/*macron*/, 755/*breve*/, 761/*dotaccent*/, 771/*dieresis*/, 0, 780/*ring*/, 785/*cedilla*/, 0, 793/*hungarumlaut*/, 806/*ogonek*/, 813/*caron*/, 819/*emdash*/, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 826/*AE*/, 0, 829/*ordfeminine*/, 0, 0, 0, 0, 841/*Lslash*/, 848/*Oslash*/, 855/*OE*/, 858/*ordmasculine*/, 0, 0, 0, 0, 0, 871/*ae*/, 0, 0, 0, 874/*dotlessi*/, 0, 0, 883/*lslash*/, 890/*oslash*/, 897/*oe*/, 900/*germandbls*/, 0, 0, 0, 0, }; #define ps_standard_encoding(index) ((index) ? ps_standard_encoding_symbol+ps_standard_encoding_offset[(index)] : NULL) static cairo_status_t use_standard_encoding_glyph (cairo_type1_font_subset_t *font, int index) { const char *glyph_name; if (index < 0 || index > 255) return CAIRO_STATUS_SUCCESS; glyph_name = ps_standard_encoding(index); if (glyph_name == NULL) return CAIRO_STATUS_SUCCESS; index = cairo_type1_font_subset_lookup_glyph (font, glyph_name, strlen(glyph_name)); if (index < 0) return CAIRO_INT_STATUS_UNSUPPORTED; cairo_type1_font_subset_use_glyph (font, index); return CAIRO_STATUS_SUCCESS; } #define TYPE1_CHARSTRING_COMMAND_ESCAPE (12) #define TYPE1_CHARSTRING_COMMAND_SEAC (32 + 6) static cairo_status_t cairo_type1_font_subset_look_for_seac(cairo_type1_font_subset_t *font, const char *name, int name_length, const char *encrypted_charstring, int encrypted_charstring_length) { cairo_status_t status; unsigned char *charstring; const unsigned char *end; const unsigned char *p; int stack[5], sp, value; int command; charstring = malloc (encrypted_charstring_length); if (charstring == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); cairo_type1_font_subset_decrypt_charstring ((const unsigned char *) encrypted_charstring, encrypted_charstring_length, charstring); end = charstring + encrypted_charstring_length; p = charstring + 4; sp = 0; while (p < end) { if (*p < 32) { command = *p++; if (command == TYPE1_CHARSTRING_COMMAND_ESCAPE) command = 32 + *p++; switch (command) { case TYPE1_CHARSTRING_COMMAND_SEAC: /* The seac command takes five integer arguments. The * last two are glyph indices into the PS standard * encoding give the names of the glyphs that this * glyph is composed from. All we need to do is to * make sure those glyphs are present in the subset * under their standard names. */ status = use_standard_encoding_glyph (font, stack[3]); if (status) return status; status = use_standard_encoding_glyph (font, stack[4]); if (status) return status; sp = 0; break; default: sp = 0; break; } } else { /* integer argument */ p = cairo_type1_font_subset_decode_integer (p, &value); if (sp < 5) stack[sp++] = value; } } free (charstring); return CAIRO_STATUS_SUCCESS; } static cairo_status_t write_used_glyphs (cairo_type1_font_subset_t *font, const char *name, int name_length, const char *charstring, int charstring_length) { cairo_status_t status; char buffer[256]; int length; length = snprintf (buffer, sizeof buffer, "/%.*s %d %s ", name_length, name, charstring_length, font->rd); status = cairo_type1_font_subset_write_encrypted (font, buffer, length); if (status) return status; status = cairo_type1_font_subset_write_encrypted (font, charstring, charstring_length); if (status) return status; length = snprintf (buffer, sizeof buffer, "%s\n", font->nd); status = cairo_type1_font_subset_write_encrypted (font, buffer, length); if (status) return status; return CAIRO_STATUS_SUCCESS; } typedef cairo_status_t (*glyph_func_t) (cairo_type1_font_subset_t *font, const char *name, int name_length, const char *charstring, int charstring_length); static cairo_status_t cairo_type1_font_subset_for_each_glyph (cairo_type1_font_subset_t *font, const char *dict_start, const char *dict_end, glyph_func_t func, const char **dict_out) { int charstring_length, name_length, glyph_index; const char *p, *charstring, *name; char *end; /* We're looking at '/' in the name of the first glyph. The glyph * definitions are on the form: * * /name 23 RD <23 binary bytes> ND * * or alternatively using -| and |- instead of RD and ND. * * We parse the glyph name and see if it is in the subset. If it * is, we call the specified callback with the glyph name and * glyph data, otherwise we just skip it. We need to parse * through a glyph definition; we can't just find the next '/', * since the binary data could contain a '/'. */ p = dict_start; while (*p == '/') { name = p + 1; p = skip_token (p, dict_end); name_length = p - name; charstring_length = strtol (p, &end, 10); if (p == end) return CAIRO_INT_STATUS_UNSUPPORTED; /* Skip past -| or RD to binary data. There is exactly one space * between the -| or RD token and the encrypted data, thus '+ 1'. */ charstring = skip_token (end, dict_end) + 1; /* Skip binary data and |- or ND token. */ p = skip_token (charstring + charstring_length, dict_end); while (p < dict_end && isspace(*p)) p++; /* In case any of the skip_token() calls above reached EOF, p will * be equal to dict_end. */ if (p == dict_end) return CAIRO_INT_STATUS_UNSUPPORTED; glyph_index = cairo_type1_font_subset_lookup_glyph (font, name, name_length); if (font->glyphs[glyph_index].subset_index >= 0) { cairo_status_t status = func (font, name, name_length, charstring, charstring_length); if (status) return status; } } *dict_out = p; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_type1_font_subset_write_private_dict (cairo_type1_font_subset_t *font, const char *name) { cairo_status_t status; const char *p, *charstrings, *dict_start; const char *closefile_token; char buffer[32], *glyph_count_end; int num_charstrings, length; /* The private dict holds hint information, common subroutines and * the actual glyph definitions (charstrings). * * FIXME: update this comment. * * What we do here is scan directly the /CharString token, which * marks the beginning of the glyph definitions. Then we parse * through the glyph definitions and weed out the glyphs not in * our subset. Everything else before and after the glyph * definitions is copied verbatim to the output. It might be * worthwile to figure out which of the common subroutines are * used by the glyphs in the subset and get rid of the rest. */ /* FIXME: The /Subrs array contains binary data and could * conceivably have "/CharStrings" in it, so we might need to skip * this more cleverly. */ charstrings = find_token (font->cleartext, font->cleartext_end, "/CharStrings"); if (charstrings == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; /* Scan past /CharStrings and the integer following it. */ p = charstrings + strlen ("/CharStrings"); num_charstrings = strtol (p, &glyph_count_end, 10); if (p == glyph_count_end) return CAIRO_INT_STATUS_UNSUPPORTED; /* Look for a '/' which marks the beginning of the first glyph * definition. */ for (p = glyph_count_end; p < font->cleartext_end; p++) if (*p == '/') break; if (p == font->cleartext_end) return CAIRO_INT_STATUS_UNSUPPORTED; dict_start = p; status = cairo_type1_font_subset_get_glyph_names_and_widths (font); if (status) return status; /* Now that we have the private dictionary broken down in * sections, do the first pass through the glyph definitions to * figure out which subrs and othersubrs are use and which extra * glyphs may be required by the seac operator. */ status = cairo_type1_font_subset_for_each_glyph (font, dict_start, font->cleartext_end, cairo_type1_font_subset_look_for_seac, &p); if (status) return status; closefile_token = find_token (p, font->cleartext_end, "closefile"); if (closefile_token == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; status = cairo_type1_font_subset_get_glyph_names_and_widths (font); if (status) return status; /* We're ready to start outputting. First write the header, * i.e. the public part of the font dict.*/ status = cairo_type1_font_subset_write_header (font, name); if (status) return status; font->base.header_size = _cairo_output_stream_get_position (font->output); /* Start outputting the private dict. First output everything up * to the /CharStrings token. */ status = cairo_type1_font_subset_write_encrypted (font, font->cleartext, charstrings - font->cleartext); if (status) return status; /* Write out new charstring count */ length = snprintf (buffer, sizeof buffer, "/CharStrings %d", font->num_glyphs); status = cairo_type1_font_subset_write_encrypted (font, buffer, length); if (status) return status; /* Write out text between the charstring count and the first * charstring definition */ status = cairo_type1_font_subset_write_encrypted (font, glyph_count_end, dict_start - glyph_count_end); if (status) return status; /* Write out the charstring definitions for each of the glyphs in * the subset. */ status = cairo_type1_font_subset_for_each_glyph (font, dict_start, font->cleartext_end, write_used_glyphs, &p); if (status) return status; /* Output what's left between the end of the glyph definitions and * the end of the private dict to the output. */ status = cairo_type1_font_subset_write_encrypted (font, p, closefile_token - p + strlen ("closefile") + 1); if (status) return status; _cairo_output_stream_write (font->output, "\n", 1); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_type1_font_subset_write_trailer(cairo_type1_font_subset_t *font) { const char *cleartomark_token; int i; static const char zeros[65] = "0000000000000000000000000000000000000000000000000000000000000000\n"; /* Some fonts have conditional save/restore around the entire font * dict, so we need to retain whatever postscript code that may * come after 'cleartomark'. */ for (i = 0; i < 8; i++) _cairo_output_stream_write (font->output, zeros, sizeof zeros); cleartomark_token = find_token (font->type1_data, font->type1_end, "cleartomark"); if (cleartomark_token == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; _cairo_output_stream_write (font->output, cleartomark_token, font->type1_end - cleartomark_token); /* some fonts do not have a newline at the end of the last line */ _cairo_output_stream_printf (font->output, "\n"); return CAIRO_STATUS_SUCCESS; } static cairo_status_t type1_font_write (void *closure, const unsigned char *data, unsigned int length) { cairo_type1_font_subset_t *font = closure; return _cairo_array_append_multiple (&font->contents, data, length); } static cairo_status_t cairo_type1_font_subset_write (cairo_type1_font_subset_t *font, const char *name) { cairo_status_t status; status = cairo_type1_font_subset_find_segments (font); if (status) return status; status = cairo_type1_font_subset_decrypt_eexec_segment (font); if (status) return status; /* Determine which glyph definition delimiters to use. */ if (find_token (font->cleartext, font->cleartext_end, "/-|") != NULL) { font->rd = "-|"; font->nd = "|-"; } else if (find_token (font->cleartext, font->cleartext_end, "/RD") != NULL) { font->rd = "RD"; font->nd = "ND"; } else { /* Don't know *what* kind of font this is... */ return CAIRO_INT_STATUS_UNSUPPORTED; } font->eexec_key = CAIRO_TYPE1_PRIVATE_DICT_KEY; font->hex_column = 0; status = cairo_type1_font_subset_write_private_dict (font, name); if (status) return status; font->base.data_size = _cairo_output_stream_get_position (font->output) - font->base.header_size; status = cairo_type1_font_subset_write_trailer (font); if (status) return status; font->base.trailer_size = _cairo_output_stream_get_position (font->output) - font->base.header_size - font->base.data_size; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_type1_font_subset_generate (void *abstract_font, const char *name) { cairo_type1_font_subset_t *font = abstract_font; cairo_ft_unscaled_font_t *ft_unscaled_font; unsigned long ret; cairo_status_t status; ft_unscaled_font = (cairo_ft_unscaled_font_t *) font->base.unscaled_font; font->face = _cairo_ft_unscaled_font_lock_face (ft_unscaled_font); if (font->face == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->type1_length = font->face->stream->size; font->type1_data = malloc (font->type1_length); if (font->type1_data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail; } if (font->face->stream->read) { ret = font->face->stream->read (font->face->stream, 0, (unsigned char *) font->type1_data, font->type1_length); if (ret != font->type1_length) { status = _cairo_error (CAIRO_STATUS_READ_ERROR); goto fail; } } else { memcpy (font->type1_data, font->face->stream->base, font->type1_length); } status = _cairo_array_grow_by (&font->contents, 4096); if (status) goto fail; font->output = _cairo_output_stream_create (type1_font_write, NULL, font); if (_cairo_output_stream_get_status (font->output)) { status = _cairo_output_stream_destroy (font->output); goto fail; } status = cairo_type1_font_subset_write (font, name); if (status) goto fail; font->base.data = _cairo_array_index (&font->contents, 0); fail: _cairo_ft_unscaled_font_unlock_face (ft_unscaled_font); return status; } static void cairo_type1_font_subset_destroy (void *abstract_font) { cairo_type1_font_subset_t *font = abstract_font; unsigned int i; /* If the subset generation failed, some of the pointers below may * be NULL depending on at which point the error occurred. */ _cairo_array_fini (&font->contents); free (font->type1_data); if (font->glyphs != NULL) for (i = 0; i < font->base.num_glyphs; i++) { free (font->glyphs[i].name); } _cairo_unscaled_font_destroy (font->base.unscaled_font); if (font->base.base_font) free (font->base.base_font); free (font->glyphs); free (font); } cairo_status_t _cairo_type1_subset_init (cairo_type1_subset_t *type1_subset, const char *name, cairo_scaled_font_subset_t *scaled_font_subset, cairo_bool_t hex_encode) { cairo_type1_font_subset_t *font = NULL; /* hide compiler warning */ cairo_status_t status; unsigned long parent_glyph, length; unsigned int i; cairo_unscaled_font_t *unscaled_font; char buf[30]; /* XXX: Need to fix this to work with a general cairo_unscaled_font_t. */ if (!_cairo_scaled_font_is_ft (scaled_font_subset->scaled_font)) return CAIRO_INT_STATUS_UNSUPPORTED; if (_cairo_ft_scaled_font_is_vertical (scaled_font_subset->scaled_font)) return CAIRO_INT_STATUS_UNSUPPORTED; unscaled_font = _cairo_ft_scaled_font_get_unscaled_font (scaled_font_subset->scaled_font); status = _cairo_type1_font_subset_create (unscaled_font, &font, hex_encode); if (status) return status; for (i = 0; i < scaled_font_subset->num_glyphs; i++) { parent_glyph = scaled_font_subset->glyphs[i]; cairo_type1_font_subset_use_glyph (font, parent_glyph); } status = cairo_type1_font_subset_generate (font, name); if (status) goto fail1; if (font->base.base_font) { type1_subset->base_font = strdup (font->base.base_font); } else { snprintf(buf, sizeof (buf), "CairoFont-%u-%u", scaled_font_subset->font_id, scaled_font_subset->subset_id); type1_subset->base_font = strdup (buf); } if (type1_subset->base_font == NULL) goto fail1; type1_subset->widths = calloc (sizeof (int), font->num_glyphs); if (type1_subset->widths == NULL) goto fail2; for (i = 0; i < font->base.num_glyphs; i++) { if (font->glyphs[i].subset_index < 0) continue; type1_subset->widths[font->glyphs[i].subset_index] = font->glyphs[i].width; } type1_subset->x_min = font->base.x_min; type1_subset->y_min = font->base.y_min; type1_subset->x_max = font->base.x_max; type1_subset->y_max = font->base.y_max; type1_subset->ascent = font->base.ascent; type1_subset->descent = font->base.descent; length = font->base.header_size + font->base.data_size + font->base.trailer_size; type1_subset->data = malloc (length); if (type1_subset->data == NULL) goto fail3; memcpy (type1_subset->data, _cairo_array_index (&font->contents, 0), length); type1_subset->header_length = font->base.header_size; type1_subset->data_length = font->base.data_size; type1_subset->trailer_length = font->base.trailer_size; cairo_type1_font_subset_destroy (font); return CAIRO_STATUS_SUCCESS; fail3: free (type1_subset->widths); fail2: free (type1_subset->base_font); fail1: cairo_type1_font_subset_destroy (font); return status; } void _cairo_type1_subset_fini (cairo_type1_subset_t *subset) { free (subset->base_font); free (subset->widths); free (subset->data); } cairo_bool_t _cairo_type1_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font) { cairo_ft_unscaled_font_t *unscaled; FT_Face face; PS_FontInfoRec font_info; cairo_bool_t is_type1 = FALSE; if (!_cairo_scaled_font_is_ft (scaled_font)) return FALSE; unscaled = (cairo_ft_unscaled_font_t *) _cairo_ft_scaled_font_get_unscaled_font (scaled_font); face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return FALSE; if (FT_Get_PS_Font_Info(face, &font_info) == 0) is_type1 = TRUE; /* OpenType/CFF fonts also have a PS_FontInfoRec */ #if HAVE_FT_LOAD_SFNT_TABLE if (FT_IS_SFNT (face)) is_type1 = FALSE; #endif _cairo_ft_unscaled_font_unlock_face (unscaled); return is_type1; } libgdiplus-2.11/cairo/src/cairo-meta-surface.c0000664000175000017500000006462712225470167016242 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg * Carl Worth * Adrian Johnson */ /* A meta surface is a surface that records all drawing operations at * the highest level of the surface backend interface, (that is, the * level of paint, mask, stroke, fill, and show_glyphs). The meta * surface can then be "replayed" against any target surface with: * * _cairo_meta_surface_replay (meta, target); * * after which the results in target will be identical to the results * that would have been obtained if the original operations applied to * the meta surface had instead been applied to the target surface. * * The recording phase of the meta surface is careful to snapshot all * necessary objects (paths, patterns, etc.), in order to achieve * accurate replay. The efficiency of the meta surface could be * improved by improving the implementation of snapshot for the * various objects. For example, it would be nice to have a * copy-on-write implementation for _cairo_surface_snapshot. */ #include "cairoint.h" #include "cairo-meta-surface-private.h" #include "cairo-clip-private.h" typedef enum { CAIRO_META_REPLAY, CAIRO_META_CREATE_REGIONS } cairo_meta_replay_type_t; static const cairo_surface_backend_t cairo_meta_surface_backend; /* Currently all meta surfaces do have a size which should be passed * in as the maximum size of any target surface against which the * meta-surface will ever be replayed. * * XXX: The naming of "pixels" in the size here is a misnomer. It's * actually a size in whatever device-space units are desired (again, * according to the intended replay target). This should likely also * be changed to use doubles not ints. */ cairo_surface_t * _cairo_meta_surface_create (cairo_content_t content, int width_pixels, int height_pixels) { cairo_meta_surface_t *meta; meta = malloc (sizeof (cairo_meta_surface_t)); if (meta == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&meta->base, &cairo_meta_surface_backend, content); meta->content = content; meta->width_pixels = width_pixels; meta->height_pixels = height_pixels; _cairo_array_init (&meta->commands, sizeof (cairo_command_t *)); meta->commands_owner = NULL; meta->is_clipped = FALSE; meta->replay_start_idx = 0; return &meta->base; } static cairo_surface_t * _cairo_meta_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { return _cairo_meta_surface_create (content, width, height); } static cairo_status_t _cairo_meta_surface_finish (void *abstract_surface) { cairo_meta_surface_t *meta = abstract_surface; cairo_command_t *command; cairo_command_t **elements; int i, num_elements; if (meta->commands_owner) { cairo_surface_destroy (meta->commands_owner); return CAIRO_STATUS_SUCCESS; } num_elements = meta->commands.num_elements; elements = _cairo_array_index (&meta->commands, 0); for (i = 0; i < num_elements; i++) { command = elements[i]; switch (command->header.type) { /* 5 basic drawing operations */ case CAIRO_COMMAND_PAINT: _cairo_pattern_fini (&command->paint.source.base); free (command); break; case CAIRO_COMMAND_MASK: _cairo_pattern_fini (&command->mask.source.base); _cairo_pattern_fini (&command->mask.mask.base); free (command); break; case CAIRO_COMMAND_STROKE: _cairo_pattern_fini (&command->stroke.source.base); _cairo_path_fixed_fini (&command->stroke.path); _cairo_stroke_style_fini (&command->stroke.style); free (command); break; case CAIRO_COMMAND_FILL: _cairo_pattern_fini (&command->fill.source.base); _cairo_path_fixed_fini (&command->fill.path); free (command); break; case CAIRO_COMMAND_SHOW_GLYPHS: _cairo_pattern_fini (&command->show_glyphs.source.base); free (command->show_glyphs.glyphs); cairo_scaled_font_destroy (command->show_glyphs.scaled_font); free (command); break; /* Other junk. */ case CAIRO_COMMAND_INTERSECT_CLIP_PATH: if (command->intersect_clip_path.path_pointer) _cairo_path_fixed_fini (&command->intersect_clip_path.path); free (command); break; default: ASSERT_NOT_REACHED; } } _cairo_array_fini (&meta->commands); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_meta_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_status_t status; cairo_meta_surface_t *surface = abstract_surface; cairo_surface_t *image; image = _cairo_image_surface_create_with_content (surface->content, surface->width_pixels, surface->height_pixels); status = _cairo_meta_surface_replay (&surface->base, image); if (status) { cairo_surface_destroy (image); return status; } *image_out = (cairo_image_surface_t *) image; *image_extra = NULL; return status; } static void _cairo_meta_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy (&image->base); } static cairo_status_t _init_pattern_with_snapshot (cairo_pattern_t *pattern, const cairo_pattern_t *other) { cairo_status_t status; status = _cairo_pattern_init_copy (pattern, other); if (status) return status; if (pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) pattern; cairo_surface_t *surface = surface_pattern->surface; surface_pattern->surface = _cairo_surface_snapshot (surface); cairo_surface_destroy (surface); if (surface_pattern->surface->status) return surface_pattern->surface->status; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_meta_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_status_t status; cairo_meta_surface_t *meta = abstract_surface; cairo_command_paint_t *command; command = malloc (sizeof (cairo_command_paint_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_PAINT; command->header.region = CAIRO_META_REGION_ALL; command->op = op; status = _init_pattern_with_snapshot (&command->source.base, source); if (status) goto CLEANUP_COMMAND; status = _cairo_array_append (&meta->commands, &command); if (status) goto CLEANUP_SOURCE; /* An optimisation that takes care to not replay what was done * before surface is cleared. We don't erase recorded commands * since we may have earlier snapshots of this surface. */ if (op == CAIRO_OPERATOR_CLEAR && !meta->is_clipped) meta->replay_start_idx = meta->commands.num_elements; return CAIRO_STATUS_SUCCESS; CLEANUP_SOURCE: _cairo_pattern_fini (&command->source.base); CLEANUP_COMMAND: free (command); return status; } static cairo_int_status_t _cairo_meta_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_status_t status; cairo_meta_surface_t *meta = abstract_surface; cairo_command_mask_t *command; command = malloc (sizeof (cairo_command_mask_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_MASK; command->header.region = CAIRO_META_REGION_ALL; command->op = op; status = _init_pattern_with_snapshot (&command->source.base, source); if (status) goto CLEANUP_COMMAND; status = _init_pattern_with_snapshot (&command->mask.base, mask); if (status) goto CLEANUP_SOURCE; status = _cairo_array_append (&meta->commands, &command); if (status) goto CLEANUP_MASK; return CAIRO_STATUS_SUCCESS; CLEANUP_MASK: _cairo_pattern_fini (&command->mask.base); CLEANUP_SOURCE: _cairo_pattern_fini (&command->source.base); CLEANUP_COMMAND: free (command); return status; } static cairo_int_status_t _cairo_meta_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_meta_surface_t *meta = abstract_surface; cairo_command_stroke_t *command; command = malloc (sizeof (cairo_command_stroke_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_STROKE; command->header.region = CAIRO_META_REGION_ALL; command->op = op; status = _init_pattern_with_snapshot (&command->source.base, source); if (status) goto CLEANUP_COMMAND; status = _cairo_path_fixed_init_copy (&command->path, path); if (status) goto CLEANUP_SOURCE; status = _cairo_stroke_style_init_copy (&command->style, style); if (status) goto CLEANUP_PATH; command->ctm = *ctm; command->ctm_inverse = *ctm_inverse; command->tolerance = tolerance; command->antialias = antialias; status = _cairo_array_append (&meta->commands, &command); if (status) goto CLEANUP_STYLE; return CAIRO_STATUS_SUCCESS; CLEANUP_STYLE: _cairo_stroke_style_fini (&command->style); CLEANUP_PATH: _cairo_path_fixed_fini (&command->path); CLEANUP_SOURCE: _cairo_pattern_fini (&command->source.base); CLEANUP_COMMAND: free (command); return status; } static cairo_int_status_t _cairo_meta_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_meta_surface_t *meta = abstract_surface; cairo_command_fill_t *command; command = malloc (sizeof (cairo_command_fill_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_FILL; command->header.region = CAIRO_META_REGION_ALL; command->op = op; status = _init_pattern_with_snapshot (&command->source.base, source); if (status) goto CLEANUP_COMMAND; status = _cairo_path_fixed_init_copy (&command->path, path); if (status) goto CLEANUP_SOURCE; command->fill_rule = fill_rule; command->tolerance = tolerance; command->antialias = antialias; status = _cairo_array_append (&meta->commands, &command); if (status) goto CLEANUP_PATH; return CAIRO_STATUS_SUCCESS; CLEANUP_PATH: _cairo_path_fixed_fini (&command->path); CLEANUP_SOURCE: _cairo_pattern_fini (&command->source.base); CLEANUP_COMMAND: free (command); return status; } static cairo_int_status_t _cairo_meta_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_status_t status; cairo_meta_surface_t *meta = abstract_surface; cairo_command_show_glyphs_t *command; command = malloc (sizeof (cairo_command_show_glyphs_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_SHOW_GLYPHS; command->header.region = CAIRO_META_REGION_ALL; command->op = op; status = _init_pattern_with_snapshot (&command->source.base, source); if (status) goto CLEANUP_COMMAND; command->glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); if (command->glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_SOURCE; } memcpy (command->glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); command->num_glyphs = num_glyphs; command->scaled_font = cairo_scaled_font_reference (scaled_font); status = _cairo_array_append (&meta->commands, &command); if (status) goto CLEANUP_SCALED_FONT; return CAIRO_STATUS_SUCCESS; CLEANUP_SCALED_FONT: cairo_scaled_font_destroy (command->scaled_font); free (command->glyphs); CLEANUP_SOURCE: _cairo_pattern_fini (&command->source.base); CLEANUP_COMMAND: free (command); return status; } /** * _cairo_meta_surface_snapshot * @surface: a #cairo_surface_t which must be a meta surface * * Make an immutable copy of @surface. It is an error to call a * surface-modifying function on the result of this function. * * The caller owns the return value and should call * cairo_surface_destroy when finished with it. This function will not * return %NULL, but will return a nil surface instead. * * Return value: The snapshot surface. **/ static cairo_surface_t * _cairo_meta_surface_snapshot (void *abstract_other) { cairo_meta_surface_t *other = abstract_other; cairo_meta_surface_t *meta; meta = malloc (sizeof (cairo_meta_surface_t)); if (meta == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&meta->base, &cairo_meta_surface_backend, other->base.content); meta->base.is_snapshot = TRUE; meta->width_pixels = other->width_pixels; meta->height_pixels = other->height_pixels; meta->replay_start_idx = other->replay_start_idx; meta->content = other->content; _cairo_array_init_snapshot (&meta->commands, &other->commands); meta->commands_owner = cairo_surface_reference (&other->base); return &meta->base; } static cairo_int_status_t _cairo_meta_surface_intersect_clip_path (void *dst, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_meta_surface_t *meta = dst; cairo_command_intersect_clip_path_t *command; cairo_status_t status; command = malloc (sizeof (cairo_command_intersect_clip_path_t)); if (command == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); command->header.type = CAIRO_COMMAND_INTERSECT_CLIP_PATH; command->header.region = CAIRO_META_REGION_ALL; if (path) { status = _cairo_path_fixed_init_copy (&command->path, path); if (status) { free (command); return status; } command->path_pointer = &command->path; meta->is_clipped = TRUE; } else { command->path_pointer = NULL; meta->is_clipped = FALSE; } command->fill_rule = fill_rule; command->tolerance = tolerance; command->antialias = antialias; status = _cairo_array_append (&meta->commands, &command); if (status) { if (path) _cairo_path_fixed_fini (&command->path); free (command); return status; } return CAIRO_STATUS_SUCCESS; } /* Currently, we're using as the "size" of a meta surface the largest * surface size against which the meta-surface is expected to be * replayed, (as passed in to _cairo_meta_surface_create). */ static cairo_int_status_t _cairo_meta_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_meta_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; rectangle->width = surface->width_pixels; rectangle->height = surface->height_pixels; return CAIRO_STATUS_SUCCESS; } /** * _cairo_surface_is_meta: * @surface: a #cairo_surface_t * * Checks if a surface is a #cairo_meta_surface_t * * Return value: %TRUE if the surface is a meta surface **/ cairo_bool_t _cairo_surface_is_meta (const cairo_surface_t *surface) { return surface->backend == &cairo_meta_surface_backend; } static const cairo_surface_backend_t cairo_meta_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_META, _cairo_meta_surface_create_similar, _cairo_meta_surface_finish, _cairo_meta_surface_acquire_source_image, _cairo_meta_surface_release_source_image, NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ _cairo_meta_surface_intersect_clip_path, _cairo_meta_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ /* Here are the 5 basic drawing operations, (which are in some * sense the only things that cairo_meta_surface should need to * implement). */ _cairo_meta_surface_paint, _cairo_meta_surface_mask, _cairo_meta_surface_stroke, _cairo_meta_surface_fill, _cairo_meta_surface_show_glyphs, _cairo_meta_surface_snapshot }; static cairo_path_fixed_t * _cairo_command_get_path (cairo_command_t *command) { switch (command->header.type) { case CAIRO_COMMAND_PAINT: case CAIRO_COMMAND_MASK: case CAIRO_COMMAND_SHOW_GLYPHS: return NULL; case CAIRO_COMMAND_STROKE: return &command->stroke.path; case CAIRO_COMMAND_FILL: return &command->fill.path; case CAIRO_COMMAND_INTERSECT_CLIP_PATH: return command->intersect_clip_path.path_pointer; } ASSERT_NOT_REACHED; return NULL; } static cairo_status_t _cairo_meta_surface_replay_internal (cairo_surface_t *surface, cairo_surface_t *target, cairo_meta_replay_type_t type, cairo_meta_region_type_t region) { cairo_meta_surface_t *meta; cairo_command_t *command, **elements; int i, num_elements; cairo_int_status_t status; cairo_clip_t clip; cairo_bool_t has_device_transform = _cairo_surface_has_device_transform (target); cairo_matrix_t *device_transform = &target->device_transform; cairo_path_fixed_t path_copy, *dev_path; if (surface->status) return surface->status; if (target->status) return _cairo_surface_set_error (surface, target->status); meta = (cairo_meta_surface_t *) surface; status = CAIRO_STATUS_SUCCESS; _cairo_clip_init (&clip, target); num_elements = meta->commands.num_elements; elements = _cairo_array_index (&meta->commands, 0); for (i = meta->replay_start_idx; i < num_elements; i++) { command = elements[i]; if (type == CAIRO_META_REPLAY && region != CAIRO_META_REGION_ALL) { if (command->header.region != region) continue; } /* For all commands except intersect_clip_path, we have to * ensure the current clip gets set on the surface. */ if (command->header.type != CAIRO_COMMAND_INTERSECT_CLIP_PATH) { status = _cairo_surface_set_clip (target, &clip); if (status) break; } dev_path = _cairo_command_get_path (command); if (dev_path && has_device_transform) { status = _cairo_path_fixed_init_copy (&path_copy, dev_path); if (status) break; _cairo_path_fixed_device_transform (&path_copy, device_transform); dev_path = &path_copy; } switch (command->header.type) { case CAIRO_COMMAND_PAINT: status = _cairo_surface_paint (target, command->paint.op, &command->paint.source.base); break; case CAIRO_COMMAND_MASK: status = _cairo_surface_mask (target, command->mask.op, &command->mask.source.base, &command->mask.mask.base); break; case CAIRO_COMMAND_STROKE: { cairo_matrix_t dev_ctm = command->stroke.ctm; cairo_matrix_t dev_ctm_inverse = command->stroke.ctm_inverse; cairo_matrix_t tmp; if (has_device_transform) { cairo_matrix_multiply (&dev_ctm, &dev_ctm, device_transform); tmp = surface->device_transform; status = cairo_matrix_invert (&tmp); assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&dev_ctm_inverse, &tmp, &dev_ctm_inverse); } status = _cairo_surface_stroke (target, command->stroke.op, &command->stroke.source.base, dev_path, &command->stroke.style, &dev_ctm, &dev_ctm_inverse, command->stroke.tolerance, command->stroke.antialias); break; } case CAIRO_COMMAND_FILL: { cairo_command_t *stroke_command; if (type != CAIRO_META_CREATE_REGIONS) stroke_command = (i < num_elements - 1) ? elements[i + 1] : NULL; else stroke_command = NULL; if (stroke_command != NULL && type == CAIRO_META_REPLAY && region != CAIRO_META_REGION_ALL) { if (stroke_command->header.region != region) stroke_command = NULL; } if (stroke_command != NULL && stroke_command->header.type == CAIRO_COMMAND_STROKE && _cairo_path_fixed_is_equal (dev_path, _cairo_command_get_path (stroke_command))) { cairo_matrix_t dev_ctm; cairo_matrix_t dev_ctm_inverse; cairo_matrix_t tmp; dev_ctm = stroke_command->stroke.ctm; dev_ctm_inverse = stroke_command->stroke.ctm_inverse; if (has_device_transform) { cairo_matrix_multiply (&dev_ctm, &dev_ctm, device_transform); tmp = surface->device_transform; status = cairo_matrix_invert (&tmp); assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&dev_ctm_inverse, &tmp, &dev_ctm_inverse); } status = _cairo_surface_fill_stroke (target, command->fill.op, &command->fill.source.base, command->fill.fill_rule, command->fill.tolerance, command->fill.antialias, dev_path, stroke_command->stroke.op, &stroke_command->stroke.source.base, &stroke_command->stroke.style, &dev_ctm, &dev_ctm_inverse, stroke_command->stroke.tolerance, stroke_command->stroke.antialias); i++; } else status = _cairo_surface_fill (target, command->fill.op, &command->fill.source.base, dev_path, command->fill.fill_rule, command->fill.tolerance, command->fill.antialias); break; } case CAIRO_COMMAND_SHOW_GLYPHS: { cairo_glyph_t *glyphs = command->show_glyphs.glyphs; cairo_glyph_t *dev_glyphs; int i, num_glyphs = command->show_glyphs.num_glyphs; /* show_glyphs is special because _cairo_surface_show_glyphs is allowed * to modify the glyph array that's passed in. We must always * copy the array before handing it to the backend. */ dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t)); if (dev_glyphs == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); break; } if (has_device_transform) { for (i = 0; i < num_glyphs; i++) { dev_glyphs[i] = glyphs[i]; cairo_matrix_transform_point (device_transform, &dev_glyphs[i].x, &dev_glyphs[i].y); } } else { memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); } status = _cairo_surface_show_glyphs (target, command->show_glyphs.op, &command->show_glyphs.source.base, dev_glyphs, num_glyphs, command->show_glyphs.scaled_font); free (dev_glyphs); break; } case CAIRO_COMMAND_INTERSECT_CLIP_PATH: /* XXX Meta surface clipping is broken and requires some * cairo-gstate.c rewriting. Work around it for now. */ if (dev_path == NULL) _cairo_clip_reset (&clip); else status = _cairo_clip_clip (&clip, dev_path, command->intersect_clip_path.fill_rule, command->intersect_clip_path.tolerance, command->intersect_clip_path.antialias, target); assert (status == 0); break; default: ASSERT_NOT_REACHED; } if (dev_path == &path_copy) _cairo_path_fixed_fini (&path_copy); if (type == CAIRO_META_CREATE_REGIONS) { if (status == CAIRO_STATUS_SUCCESS) { command->header.region = CAIRO_META_REGION_NATIVE; } else if (status == CAIRO_INT_STATUS_IMAGE_FALLBACK) { command->header.region = CAIRO_META_REGION_IMAGE_FALLBACK; status = CAIRO_STATUS_SUCCESS; } } if (status) break; } _cairo_clip_reset (&clip); return _cairo_surface_set_error (surface, status); } cairo_status_t _cairo_meta_surface_replay (cairo_surface_t *surface, cairo_surface_t *target) { return _cairo_meta_surface_replay_internal (surface, target, CAIRO_META_REPLAY, CAIRO_META_REGION_ALL); } /* Replay meta to surface. When the return status of each operation is * one of %CAIRO_STATUS_SUCCESS, %CAIRO_INT_STATUS_UNSUPPORTED, or * CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY the status of each operation * will be stored in the meta surface. Any other status will abort the * replay and return the status. */ cairo_status_t _cairo_meta_surface_replay_and_create_regions (cairo_surface_t *surface, cairo_surface_t *target) { return _cairo_meta_surface_replay_internal (surface, target, CAIRO_META_CREATE_REGIONS, CAIRO_META_REGION_ALL); } cairo_status_t _cairo_meta_surface_replay_region (cairo_surface_t *surface, cairo_surface_t *target, cairo_meta_region_type_t region) { return _cairo_meta_surface_replay_internal (surface, target, CAIRO_META_REPLAY, region); } libgdiplus-2.11/cairo/src/cairo-type1-private.h0000664000175000017500000000352712225470167016375 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Adrian Johnson */ #ifndef CAIRO_TYPE1_PRIVATE_H #define CAIRO_TYPE1_PRIVATE_H /* Magic constants for the type1 eexec encryption */ #define CAIRO_TYPE1_ENCRYPT_C1 ((unsigned short) 52845) #define CAIRO_TYPE1_ENCRYPT_C2 ((unsigned short) 22719) #define CAIRO_TYPE1_PRIVATE_DICT_KEY ((unsigned short) 55665) #define CAIRO_TYPE1_CHARSTRING_KEY ((unsigned short) 4330) #endif /* CAIRO_TYPE1_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-private.h0000664000175000017500000000356512225470167015337 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_PRIVATE_H #define CAIRO_PRIVATE_H #include "cairo-reference-count-private.h" #include "cairo-gstate-private.h" #include "cairo-path-fixed-private.h" struct _cairo { cairo_reference_count_t ref_count; cairo_status_t status; cairo_user_data_array_t user_data; cairo_gstate_t *gstate; cairo_gstate_t gstate_tail[1]; cairo_path_fixed_t path[1]; }; #endif /* CAIRO_PRIVATE_H */ libgdiplus-2.11/cairo/src/test-fallback-surface.c0000664000175000017500000001630712225470167016725 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ /* This isn't a "real" surface, but just something to be used by the * test suite to test a mythical backend that uses nothing but * fallbacks. * * The defining feature of this backend is that it has as many %NULL * backend function entries as possible. The ones that aren't %NULL are * simply those that must be implemented to have working fallbacks. * (Except for create_similar---fallbacks would work fine without * that---I implemented it here in order to create as many surfaces as * possible of type test_fallback_surface_t during the test suite * run). * * It's possible that this code might serve as a good starting point * for someone working on bringing up a new backend, starting with the * minimal all-fallbacks approach and working up gradually from * there. */ #include "cairoint.h" #include "test-fallback-surface.h" typedef struct _test_fallback_surface { cairo_surface_t base; /* This is a cairo_image_surface to hold the actual contents. */ cairo_surface_t *backing; } test_fallback_surface_t; static const cairo_surface_backend_t test_fallback_surface_backend; slim_hidden_proto (_cairo_test_fallback_surface_create); cairo_surface_t * _cairo_test_fallback_surface_create (cairo_content_t content, int width, int height) { test_fallback_surface_t *surface; cairo_surface_t *backing; backing = _cairo_image_surface_create_with_content (content, width, height); if (cairo_surface_status (backing)) return backing; surface = malloc (sizeof (test_fallback_surface_t)); if (surface == NULL) { cairo_surface_destroy (backing); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } _cairo_surface_init (&surface->base, &test_fallback_surface_backend, content); surface->backing = backing; return &surface->base; } slim_hidden_def (_cairo_test_fallback_surface_create); static cairo_surface_t * _test_fallback_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { assert (CAIRO_CONTENT_VALID (content)); return _cairo_test_fallback_surface_create (content, width, height); } static cairo_status_t _test_fallback_surface_finish (void *abstract_surface) { test_fallback_surface_t *surface = abstract_surface; cairo_surface_destroy (surface->backing); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _test_fallback_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { test_fallback_surface_t *surface = abstract_surface; return _cairo_surface_acquire_source_image (surface->backing, image_out, image_extra); } static void _test_fallback_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { test_fallback_surface_t *surface = abstract_surface; _cairo_surface_release_source_image (surface->backing, image, image_extra); } static cairo_status_t _test_fallback_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { test_fallback_surface_t *surface = abstract_surface; return _cairo_surface_acquire_dest_image (surface->backing, interest_rect, image_out, image_rect_out, image_extra); } static void _test_fallback_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { test_fallback_surface_t *surface = abstract_surface; _cairo_surface_release_dest_image (surface->backing, interest_rect, image, image_rect, image_extra); } static cairo_status_t _test_fallback_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { test_fallback_surface_t *surface = abstract_surface; if (src->backend == surface->base.backend) { *clone_out = cairo_surface_reference (src); return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_int_status_t _test_fallback_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { test_fallback_surface_t *surface = abstract_surface; return _cairo_surface_get_extents (surface->backing, rectangle); } static const cairo_surface_backend_t test_fallback_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_TEST_FALLBACK, _test_fallback_surface_create_similar, _test_fallback_surface_finish, _test_fallback_surface_acquire_source_image, _test_fallback_surface_release_source_image, _test_fallback_surface_acquire_dest_image, _test_fallback_surface_release_dest_image, _test_fallback_surface_clone_similar, NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ NULL, /* intersect_clip_path */ _test_fallback_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ NULL, /* show_glyphs */ NULL /* snapshot */ }; libgdiplus-2.11/cairo/src/cairo-paginated-surface-private.h0000664000175000017500000000501012225470167020702 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #ifndef CAIRO_PAGINATED_SURFACE_H #define CAIRO_PAGINATED_SURFACE_H #include "cairo.h" #include "cairo-surface-private.h" typedef struct _cairo_paginated_surface { cairo_surface_t base; /* The target surface to hold the final result. */ cairo_surface_t *target; cairo_content_t content; /* XXX: These shouldn't actually exist. We inherit this ugliness * from _cairo_meta_surface_create. The width/height parameters * from that function also should not exist. The fix that will * allow us to remove all of these is to fix acquire_source_image * to pass an interest rectangle. */ int width; int height; /* Paginated-surface specific functions for the target */ const cairo_paginated_surface_backend_t *backend; /* A cairo_meta_surface to record all operations. To be replayed * against target, and also against image surface as necessary for * fallbacks. */ cairo_surface_t *meta; int page_num; cairo_bool_t page_is_blank; } cairo_paginated_surface_t; #endif /* CAIRO_PAGINATED_SURFACE_H */ libgdiplus-2.11/cairo/src/cairo-xcb.h0000664000175000017500000000445612225470167014441 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_XCB_H #define CAIRO_XCB_H #include #if CAIRO_HAS_XCB_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_xcb_surface_create (xcb_connection_t *c, xcb_drawable_t drawable, xcb_visualtype_t *visual, int width, int height); cairo_public cairo_surface_t * cairo_xcb_surface_create_for_bitmap (xcb_connection_t *c, xcb_pixmap_t bitmap, xcb_screen_t *screen, int width, int height); cairo_public void cairo_xcb_surface_set_size (cairo_surface_t *surface, int width, int height); CAIRO_END_DECLS #else /* CAIRO_HAS_XCB_SURFACE */ # error Cairo was not compiled with support for the xcb backend #endif /* CAIRO_HAS_XCB_SURFACE */ #endif /* CAIRO_XCB_H */ libgdiplus-2.11/cairo/src/cairo-quartz-surface.c0000664000175000017500000024376512225470167016644 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright � 2006, 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation. * * Contributor(s): * Vladimir Vukicevic */ #include "cairoint.h" #include "cairo-quartz-private.h" #include /* The 10.5 SDK includes a funky new definition of FloatToFixed which * causes all sorts of breakage; so reset to old-style definition */ #ifdef FloatToFixed #undef FloatToFixed #define FloatToFixed(a) ((Fixed)((float)(a) * fixed1)) #endif #include #undef QUARTZ_DEBUG #ifdef QUARTZ_DEBUG #define ND(_x) fprintf _x #else #define ND(_x) do {} while(0) #endif #define IS_EMPTY(s) ((s)->extents.width == 0 || (s)->extents.height == 0) /* This method is private, but it exists. Its params are are exposed * as args to the NS* method, but not as CG. */ enum PrivateCGCompositeMode { kPrivateCGCompositeClear = 0, kPrivateCGCompositeCopy = 1, kPrivateCGCompositeSourceOver = 2, kPrivateCGCompositeSourceIn = 3, kPrivateCGCompositeSourceOut = 4, kPrivateCGCompositeSourceAtop = 5, kPrivateCGCompositeDestinationOver = 6, kPrivateCGCompositeDestinationIn = 7, kPrivateCGCompositeDestinationOut = 8, kPrivateCGCompositeDestinationAtop = 9, kPrivateCGCompositeXOR = 10, kPrivateCGCompositePlusDarker = 11, // (max (0, (1-d) + (1-s))) kPrivateCGCompositePlusLighter = 12, // (min (1, s + d)) }; typedef enum PrivateCGCompositeMode PrivateCGCompositeMode; CG_EXTERN void CGContextSetCompositeOperation (CGContextRef, PrivateCGCompositeMode); CG_EXTERN void CGContextResetCTM (CGContextRef); CG_EXTERN void CGContextSetCTM (CGContextRef, CGAffineTransform); CG_EXTERN void CGContextResetClip (CGContextRef); CG_EXTERN CGSize CGContextGetPatternPhase (CGContextRef); /* We need to work with the 10.3 SDK as well (and 10.3 machines; luckily, 10.3.9 * has all the stuff we care about, just some of it isn't exported in the SDK. */ #ifndef kCGBitmapByteOrder32Host #define USE_10_3_WORKAROUNDS #define kCGBitmapAlphaInfoMask 0x1F #define kCGBitmapByteOrderMask 0x7000 #define kCGBitmapByteOrder32Host 0 typedef uint32_t CGBitmapInfo; /* public in 10.4, present in 10.3.9 */ CG_EXTERN void CGContextReplacePathWithStrokedPath (CGContextRef); CG_EXTERN CGImageRef CGBitmapContextCreateImage (CGContextRef); #endif /* Some of these are present in earlier versions of the OS than where * they are public; others are not public at all (CGContextCopyPath, * CGContextReplacePathWithClipPath, many of the getters, etc.) */ static void (*CGContextClipToMaskPtr) (CGContextRef, CGRect, CGImageRef) = NULL; static void (*CGContextDrawTiledImagePtr) (CGContextRef, CGRect, CGImageRef) = NULL; static unsigned int (*CGContextGetTypePtr) (CGContextRef) = NULL; static void (*CGContextSetShouldAntialiasFontsPtr) (CGContextRef, bool) = NULL; static bool (*CGContextGetShouldAntialiasFontsPtr) (CGContextRef) = NULL; static bool (*CGContextGetShouldSmoothFontsPtr) (CGContextRef) = NULL; static void (*CGContextSetAllowsFontSmoothingPtr) (CGContextRef, bool) = NULL; static bool (*CGContextGetAllowsFontSmoothingPtr) (CGContextRef) = NULL; static CGPathRef (*CGContextCopyPathPtr) (CGContextRef) = NULL; static void (*CGContextReplacePathWithClipPathPtr) (CGContextRef) = NULL; static SInt32 _cairo_quartz_osx_version = 0x0; static cairo_bool_t _cairo_quartz_symbol_lookup_done = FALSE; /* * Utility functions */ #ifdef QUARTZ_DEBUG static void quartz_surface_to_png (cairo_quartz_surface_t *nq, char *dest); static void quartz_image_to_png (CGImageRef, char *dest); #endif static cairo_quartz_surface_t * _cairo_quartz_surface_create_internal (CGContextRef cgContext, cairo_content_t content, unsigned int width, unsigned int height); /* Load all extra symbols */ static void quartz_ensure_symbols(void) { if (_cairo_quartz_symbol_lookup_done) return; CGContextClipToMaskPtr = dlsym(RTLD_DEFAULT, "CGContextClipToMask"); CGContextDrawTiledImagePtr = dlsym(RTLD_DEFAULT, "CGContextDrawTiledImage"); CGContextGetTypePtr = dlsym(RTLD_DEFAULT, "CGContextGetType"); CGContextSetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextSetShouldAntialiasFonts"); CGContextGetShouldAntialiasFontsPtr = dlsym(RTLD_DEFAULT, "CGContextGetShouldAntialiasFonts"); CGContextGetShouldSmoothFontsPtr = dlsym(RTLD_DEFAULT, "CGContextGetShouldSmoothFonts"); CGContextCopyPathPtr = dlsym(RTLD_DEFAULT, "CGContextCopyPath"); CGContextReplacePathWithClipPathPtr = dlsym(RTLD_DEFAULT, "CGContextReplacePathWithClipPath"); CGContextGetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextGetAllowsFontSmoothing"); CGContextSetAllowsFontSmoothingPtr = dlsym(RTLD_DEFAULT, "CGContextSetAllowsFontSmoothing"); if (Gestalt(gestaltSystemVersion, &_cairo_quartz_osx_version) != noErr) { // assume 10.4 _cairo_quartz_osx_version = 0x1040; } _cairo_quartz_symbol_lookup_done = TRUE; } static inline cairo_bool_t _cairo_quartz_is_cgcontext_bitmap_context (CGContextRef cgc) { if (cgc == NULL) return FALSE; if (CGContextGetTypePtr) { /* 4 is the type value of a bitmap context */ if (CGContextGetTypePtr(cgc) == 4) return TRUE; return FALSE; } /* This will cause a (harmless) warning to be printed if called on a non-bitmap context */ return CGBitmapContextGetBitsPerPixel(cgc) != 0; } /* CoreGraphics limitation with flipped CTM surfaces: height must be less than signed 16-bit max */ #define CG_MAX_HEIGHT SHRT_MAX #define CG_MAX_WIDTH USHRT_MAX /* is the desired size of the surface within bounds? */ cairo_bool_t _cairo_quartz_verify_surface_size(int width, int height) { /* hmmm, allow width, height == 0 ? */ if (width < 0 || height < 0) { return FALSE; } if (width > CG_MAX_WIDTH || height > CG_MAX_HEIGHT) { return FALSE; } return TRUE; } /* * Cairo path -> Quartz path conversion helpers */ typedef struct _quartz_stroke { CGContextRef cgContext; cairo_matrix_t *ctm_inverse; } quartz_stroke_t; /* cairo path -> execute in context */ static cairo_status_t _cairo_path_to_quartz_context_move_to (void *closure, cairo_point_t *point) { //ND((stderr, "moveto: %f %f\n", _cairo_fixed_to_double(point->x), _cairo_fixed_to_double(point->y))); quartz_stroke_t *stroke = (quartz_stroke_t *)closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); if (stroke->ctm_inverse) cairo_matrix_transform_point (stroke->ctm_inverse, &x, &y); CGContextMoveToPoint (stroke->cgContext, x, y); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_to_quartz_context_line_to (void *closure, cairo_point_t *point) { //ND((stderr, "lineto: %f %f\n", _cairo_fixed_to_double(point->x), _cairo_fixed_to_double(point->y))); quartz_stroke_t *stroke = (quartz_stroke_t *)closure; double x = _cairo_fixed_to_double (point->x); double y = _cairo_fixed_to_double (point->y); if (stroke->ctm_inverse) cairo_matrix_transform_point (stroke->ctm_inverse, &x, &y); if (CGContextIsPathEmpty (stroke->cgContext)) CGContextMoveToPoint (stroke->cgContext, x, y); else CGContextAddLineToPoint (stroke->cgContext, x, y); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_to_quartz_context_curve_to (void *closure, cairo_point_t *p0, cairo_point_t *p1, cairo_point_t *p2) { //ND( (stderr, "curveto: %f,%f %f,%f %f,%f\n", // _cairo_fixed_to_double(p0->x), _cairo_fixed_to_double(p0->y), // _cairo_fixed_to_double(p1->x), _cairo_fixed_to_double(p1->y), // _cairo_fixed_to_double(p2->x), _cairo_fixed_to_double(p2->y))); quartz_stroke_t *stroke = (quartz_stroke_t *)closure; double x0 = _cairo_fixed_to_double (p0->x); double y0 = _cairo_fixed_to_double (p0->y); double x1 = _cairo_fixed_to_double (p1->x); double y1 = _cairo_fixed_to_double (p1->y); double x2 = _cairo_fixed_to_double (p2->x); double y2 = _cairo_fixed_to_double (p2->y); if (stroke->ctm_inverse) { cairo_matrix_transform_point (stroke->ctm_inverse, &x0, &y0); cairo_matrix_transform_point (stroke->ctm_inverse, &x1, &y1); cairo_matrix_transform_point (stroke->ctm_inverse, &x2, &y2); } CGContextAddCurveToPoint (stroke->cgContext, x0, y0, x1, y1, x2, y2); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_to_quartz_context_close_path (void *closure) { //ND((stderr, "closepath\n")); quartz_stroke_t *stroke = (quartz_stroke_t *)closure; CGContextClosePath (stroke->cgContext); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_quartz_cairo_path_to_quartz_context (cairo_path_fixed_t *path, quartz_stroke_t *stroke) { return _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_path_to_quartz_context_move_to, _cairo_path_to_quartz_context_line_to, _cairo_path_to_quartz_context_curve_to, _cairo_path_to_quartz_context_close_path, stroke); } /* * Misc helpers/callbacks */ static PrivateCGCompositeMode _cairo_quartz_cairo_operator_to_quartz (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: return kPrivateCGCompositeClear; case CAIRO_OPERATOR_SOURCE: return kPrivateCGCompositeCopy; case CAIRO_OPERATOR_OVER: return kPrivateCGCompositeSourceOver; case CAIRO_OPERATOR_IN: /* XXX This doesn't match image output */ return kPrivateCGCompositeSourceIn; case CAIRO_OPERATOR_OUT: /* XXX This doesn't match image output */ return kPrivateCGCompositeSourceOut; case CAIRO_OPERATOR_ATOP: return kPrivateCGCompositeSourceAtop; case CAIRO_OPERATOR_DEST: /* XXX this is handled specially (noop)! */ return kPrivateCGCompositeCopy; case CAIRO_OPERATOR_DEST_OVER: return kPrivateCGCompositeDestinationOver; case CAIRO_OPERATOR_DEST_IN: /* XXX This doesn't match image output */ return kPrivateCGCompositeDestinationIn; case CAIRO_OPERATOR_DEST_OUT: return kPrivateCGCompositeDestinationOut; case CAIRO_OPERATOR_DEST_ATOP: /* XXX This doesn't match image output */ return kPrivateCGCompositeDestinationAtop; case CAIRO_OPERATOR_XOR: return kPrivateCGCompositeXOR; /* This will generate strange results */ case CAIRO_OPERATOR_ADD: return kPrivateCGCompositePlusLighter; case CAIRO_OPERATOR_SATURATE: /* XXX This doesn't match image output for SATURATE; there's no equivalent */ return kPrivateCGCompositePlusDarker; /* ??? */ } return kPrivateCGCompositeCopy; } static inline CGLineCap _cairo_quartz_cairo_line_cap_to_quartz (cairo_line_cap_t ccap) { switch (ccap) { case CAIRO_LINE_CAP_BUTT: return kCGLineCapButt; break; case CAIRO_LINE_CAP_ROUND: return kCGLineCapRound; break; case CAIRO_LINE_CAP_SQUARE: return kCGLineCapSquare; break; } return kCGLineCapButt; } static inline CGLineJoin _cairo_quartz_cairo_line_join_to_quartz (cairo_line_join_t cjoin) { switch (cjoin) { case CAIRO_LINE_JOIN_MITER: return kCGLineJoinMiter; break; case CAIRO_LINE_JOIN_ROUND: return kCGLineJoinRound; break; case CAIRO_LINE_JOIN_BEVEL: return kCGLineJoinBevel; break; } return kCGLineJoinMiter; } static inline CGInterpolationQuality _cairo_quartz_filter_to_quartz (cairo_filter_t filter) { switch (filter) { case CAIRO_FILTER_NEAREST: return kCGInterpolationNone; case CAIRO_FILTER_FAST: return kCGInterpolationLow; case CAIRO_FILTER_BEST: case CAIRO_FILTER_GOOD: case CAIRO_FILTER_BILINEAR: case CAIRO_FILTER_GAUSSIAN: return kCGInterpolationDefault; } return kCGInterpolationDefault; } static inline void _cairo_quartz_cairo_matrix_to_quartz (const cairo_matrix_t *src, CGAffineTransform *dst) { dst->a = src->xx; dst->b = src->yx; dst->c = src->xy; dst->d = src->yy; dst->tx = src->x0; dst->ty = src->y0; } typedef struct { bool isClipping; CGGlyph *cg_glyphs; CGSize *cg_advances; size_t nglyphs; CGAffineTransform textTransform; CGFontRef font; CGPoint origin; } unbounded_show_glyphs_t; typedef struct { CGPathRef cgPath; cairo_fill_rule_t fill_rule; } unbounded_stroke_fill_t; typedef struct { CGImageRef mask; CGAffineTransform maskTransform; } unbounded_mask_t; typedef enum { UNBOUNDED_STROKE_FILL, UNBOUNDED_SHOW_GLYPHS, UNBOUNDED_MASK } unbounded_op_t; typedef struct { unbounded_op_t op; union { unbounded_stroke_fill_t stroke_fill; unbounded_show_glyphs_t show_glyphs; unbounded_mask_t mask; } u; } unbounded_op_data_t; static void _cairo_quartz_fixup_unbounded_operation (cairo_quartz_surface_t *surface, unbounded_op_data_t *op, cairo_antialias_t antialias) { CGColorSpaceRef gray; CGRect clipBox, clipBoxRound; CGContextRef cgc; CGImageRef maskImage; if (!CGContextClipToMaskPtr) return; clipBox = CGContextGetClipBoundingBox (surface->cgContext); clipBoxRound = CGRectIntegral (clipBox); gray = CGColorSpaceCreateDeviceGray (); cgc = CGBitmapContextCreate (NULL, clipBoxRound.size.width, clipBoxRound.size.height, 8, clipBoxRound.size.width, gray, kCGImageAlphaNone); CGColorSpaceRelease (gray); if (!cgc) return; /* We want to mask out whatever we just rendered, so we fill the * surface with white, and then we'll render with black. */ CGContextSetRGBFillColor (cgc, 1.0f, 1.0f, 1.0f, 1.0f); CGContextFillRect (cgc, CGRectMake (0, 0, clipBoxRound.size.width, clipBoxRound.size.height)); CGContextSetRGBFillColor (cgc, 0.0f, 0.0f, 0.0f, 1.0f); CGContextSetShouldAntialias (cgc, (antialias != CAIRO_ANTIALIAS_NONE)); CGContextTranslateCTM (cgc, -clipBoxRound.origin.x, -clipBoxRound.origin.y); /* We need to either render the path that was given to us, or the glyph op */ if (op->op == UNBOUNDED_STROKE_FILL) { CGContextBeginPath (cgc); CGContextAddPath (cgc, op->u.stroke_fill.cgPath); if (op->u.stroke_fill.fill_rule == CAIRO_FILL_RULE_WINDING) CGContextFillPath (cgc); else CGContextEOFillPath (cgc); } else if (op->op == UNBOUNDED_SHOW_GLYPHS) { CGContextSetFont (cgc, op->u.show_glyphs.font); CGContextSetFontSize (cgc, 1.0); CGContextSetTextMatrix (cgc, op->u.show_glyphs.textTransform); CGContextTranslateCTM (cgc, op->u.show_glyphs.origin.x, op->u.show_glyphs.origin.y); if (op->u.show_glyphs.isClipping) { /* Note that the comment in show_glyphs about kCGTextClip * and the text transform still applies here; however, the * cg_advances we have were already transformed, so we * don't have to do anything. */ CGContextSetTextDrawingMode (cgc, kCGTextClip); CGContextSaveGState (cgc); } CGContextShowGlyphsWithAdvances (cgc, op->u.show_glyphs.cg_glyphs, op->u.show_glyphs.cg_advances, op->u.show_glyphs.nglyphs); if (op->u.show_glyphs.isClipping) { CGContextFillRect (cgc, CGRectMake (0.0, 0.0, clipBoxRound.size.width, clipBoxRound.size.height)); CGContextRestoreGState (cgc); } } else if (op->op == UNBOUNDED_MASK) { CGContextSaveGState (cgc); CGContextConcatCTM (cgc, op->u.mask.maskTransform); CGContextClipToMask (cgc, CGRectMake (0.0f, 0.0f, CGImageGetWidth(op->u.mask.mask), CGImageGetHeight(op->u.mask.mask)), op->u.mask.mask); CGContextFillRect (cgc, CGRectMake (0.0, 0.0, clipBoxRound.size.width, clipBoxRound.size.height)); CGContextRestoreGState (cgc); } /* Also mask out the portion of the clipbox that we rounded out, if any */ if (!CGRectEqualToRect (clipBox, clipBoxRound)) { CGContextBeginPath (cgc); CGContextAddRect (cgc, CGRectMake (0.0, 0.0, clipBoxRound.size.width, clipBoxRound.size.height)); CGContextAddRect (cgc, CGRectMake (clipBoxRound.origin.x - clipBox.origin.x, clipBoxRound.origin.y - clipBox.origin.y, clipBox.size.width, clipBox.size.height)); CGContextEOFillPath (cgc); } maskImage = CGBitmapContextCreateImage (cgc); CGContextRelease (cgc); if (!maskImage) return; /* Then render with the mask */ CGContextSaveGState (surface->cgContext); CGContextSetCompositeOperation (surface->cgContext, kPrivateCGCompositeCopy); CGContextClipToMaskPtr (surface->cgContext, clipBoxRound, maskImage); CGImageRelease (maskImage); /* Finally, clear out the entire clipping region through our mask */ CGContextClearRect (surface->cgContext, clipBoxRound); CGContextRestoreGState (surface->cgContext); } /* * Source -> Quartz setup and finish functions */ static void ComputeGradientValue (void *info, const float *in, float *out) { double fdist = *in; cairo_gradient_pattern_t *grad = (cairo_gradient_pattern_t*) info; unsigned int i; /* Put fdist back in the 0.0..1.0 range if we're doing * REPEAT/REFLECT */ if (grad->base.extend == CAIRO_EXTEND_REPEAT) { fdist = fdist - floor(fdist); } else if (grad->base.extend == CAIRO_EXTEND_REFLECT) { fdist = fmod(fabs(fdist), 2.0); if (fdist > 1.0) { fdist = 2.0 - fdist; } } for (i = 0; i < grad->n_stops; i++) { if (grad->stops[i].offset > fdist) break; } if (i == 0 || i == grad->n_stops) { if (i == grad->n_stops) --i; out[0] = grad->stops[i].color.red; out[1] = grad->stops[i].color.green; out[2] = grad->stops[i].color.blue; out[3] = grad->stops[i].color.alpha; } else { float ax = grad->stops[i-1].offset; float bx = grad->stops[i].offset - ax; float bp = (fdist - ax)/bx; float ap = 1.0 - bp; out[0] = grad->stops[i-1].color.red * ap + grad->stops[i].color.red * bp; out[1] = grad->stops[i-1].color.green * ap + grad->stops[i].color.green * bp; out[2] = grad->stops[i-1].color.blue * ap + grad->stops[i].color.blue * bp; out[3] = grad->stops[i-1].color.alpha * ap + grad->stops[i].color.alpha * bp; } } static CGFunctionRef CreateGradientFunction (cairo_gradient_pattern_t *gpat) { float input_value_range[2] = { 0.f, 1.f }; float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; CGFunctionCallbacks callbacks = { 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy }; return CGFunctionCreate (gpat, 1, input_value_range, 4, output_value_ranges, &callbacks); } static CGFunctionRef CreateRepeatingGradientFunction (cairo_quartz_surface_t *surface, cairo_gradient_pattern_t *gpat, CGPoint *start, CGPoint *end, CGAffineTransform matrix) { float input_value_range[2]; float output_value_ranges[8] = { 0.f, 1.f, 0.f, 1.f, 0.f, 1.f, 0.f, 1.f }; CGFunctionCallbacks callbacks = { 0, ComputeGradientValue, (CGFunctionReleaseInfoCallback) cairo_pattern_destroy }; CGPoint mstart, mend; double dx, dy; int x_rep_start = 0, x_rep_end = 0; int y_rep_start = 0, y_rep_end = 0; int rep_start, rep_end; // figure out how many times we'd need to repeat the gradient pattern // to cover the whole (transformed) surface area mstart = CGPointApplyAffineTransform (*start, matrix); mend = CGPointApplyAffineTransform (*end, matrix); dx = fabs (mend.x - mstart.x); dy = fabs (mend.y - mstart.y); if (dx > 1e-6) { x_rep_start = (int) ceil(MIN(mstart.x, mend.x) / dx); x_rep_end = (int) ceil((surface->extents.width - MAX(mstart.x, mend.x)) / dx); if (mend.x < mstart.x) { int swap = x_rep_end; x_rep_end = x_rep_start; x_rep_start = swap; } } if (dy > 1e-6) { y_rep_start = (int) ceil(MIN(mstart.y, mend.y) / dy); y_rep_end = (int) ceil((surface->extents.width - MAX(mstart.y, mend.y)) / dy); if (mend.y < mstart.y) { int swap = y_rep_end; y_rep_end = y_rep_start; y_rep_start = swap; } } rep_start = MAX(x_rep_start, y_rep_start); rep_end = MAX(x_rep_end, y_rep_end); // extend the line between start and end by rep_start times from the start // and rep_end times from the end dx = end->x - start->x; dy = end->y - start->y; start->x = start->x - dx * rep_start; start->y = start->y - dy * rep_start; end->x = end->x + dx * rep_end; end->y = end->y + dy * rep_end; // set the input range for the function -- the function knows how to // map values outside of 0.0 .. 1.0 to that range for REPEAT/REFLECT. input_value_range[0] = 0.0 - 1.0 * rep_start; input_value_range[1] = 1.0 + 1.0 * rep_end; return CGFunctionCreate (gpat, 1, input_value_range, 4, output_value_ranges, &callbacks); } /* Obtain a CGImageRef from a #cairo_surface_t * */ static cairo_status_t _cairo_surface_to_cgimage (cairo_surface_t *target, cairo_surface_t *source, CGImageRef *image_out) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_surface_type_t stype = cairo_surface_get_type (source); cairo_image_surface_t *isurf; CGImageRef image; void *image_extra; if (stype == CAIRO_SURFACE_TYPE_QUARTZ_IMAGE) { cairo_quartz_image_surface_t *surface = (cairo_quartz_image_surface_t *) source; *image_out = CGImageRetain (surface->image); return CAIRO_STATUS_SUCCESS; } if (stype == CAIRO_SURFACE_TYPE_QUARTZ) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) source; if (IS_EMPTY(surface)) { *image_out = NULL; return CAIRO_STATUS_SUCCESS; } if (_cairo_quartz_is_cgcontext_bitmap_context (surface->cgContext)) { *image_out = CGBitmapContextCreateImage (surface->cgContext); if (*image_out) return CAIRO_STATUS_SUCCESS; } } if (stype != CAIRO_SURFACE_TYPE_IMAGE) { status = _cairo_surface_acquire_source_image (source, &isurf, &image_extra); if (status) return status; } else { isurf = (cairo_image_surface_t *) source; } if (isurf->width == 0 || isurf->height == 0) { *image_out = NULL; } else { image = _cairo_quartz_create_cgimage (isurf->format, isurf->width, isurf->height, isurf->stride, isurf->data, TRUE, NULL, NULL, NULL); /* Create a copy to ensure that the CGImageRef doesn't depend on the image surface's backing store */ *image_out = CGImageCreateCopy (image); CGImageRelease (image); } if ((cairo_surface_t*) isurf != source) _cairo_surface_release_source_image (source, isurf, image_extra); return status; } /* Generic #cairo_pattern_t -> CGPattern function */ typedef struct { CGImageRef image; CGRect imageBounds; cairo_bool_t do_reflect; } SurfacePatternDrawInfo; static void SurfacePatternDrawFunc (void *ainfo, CGContextRef context) { SurfacePatternDrawInfo *info = (SurfacePatternDrawInfo*) ainfo; CGContextTranslateCTM (context, 0, info->imageBounds.size.height); CGContextScaleCTM (context, 1, -1); CGContextDrawImage (context, info->imageBounds, info->image); if (info->do_reflect) { /* draw 3 more copies of the image, flipped. * DrawImage draws the image according to the current Y-direction into the rectangle given * (imageBounds); at the time of the first DrawImage above, the origin is at the bottom left * of the base image position, and the Y axis is extending upwards. */ /* Make the y axis extend downwards, and draw a flipped image below */ CGContextScaleCTM (context, 1, -1); CGContextDrawImage (context, info->imageBounds, info->image); /* Shift over to the right, and flip vertically (translation is 2x, * since we'll be flipping and thus rendering the rectangle "backwards" */ CGContextTranslateCTM (context, 2 * info->imageBounds.size.width, 0); CGContextScaleCTM (context, -1, 1); CGContextDrawImage (context, info->imageBounds, info->image); /* Then unflip the Y-axis again, and draw the image above the point. */ CGContextScaleCTM (context, 1, -1); CGContextDrawImage (context, info->imageBounds, info->image); } } static void SurfacePatternReleaseInfoFunc (void *ainfo) { SurfacePatternDrawInfo *info = (SurfacePatternDrawInfo*) ainfo; CGImageRelease (info->image); free (info); } static cairo_int_status_t _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (cairo_quartz_surface_t *dest, cairo_pattern_t *apattern, CGPatternRef *cgpat) { cairo_surface_pattern_t *spattern; cairo_surface_t *pat_surf; cairo_rectangle_int_t extents; CGImageRef image; CGRect pbounds; CGAffineTransform ptransform, stransform; CGPatternCallbacks cb = { 0, SurfacePatternDrawFunc, SurfacePatternReleaseInfoFunc }; SurfacePatternDrawInfo *info; float rw, rh; cairo_status_t status; cairo_matrix_t m; /* SURFACE is the only type we'll handle here */ if (apattern->type != CAIRO_PATTERN_TYPE_SURFACE) return CAIRO_INT_STATUS_UNSUPPORTED; spattern = (cairo_surface_pattern_t *) apattern; pat_surf = spattern->surface; status = _cairo_surface_get_extents (pat_surf, &extents); if (status) return status; status = _cairo_surface_to_cgimage ((cairo_surface_t*) dest, pat_surf, &image); if (status != CAIRO_STATUS_SUCCESS) return CAIRO_INT_STATUS_UNSUPPORTED; if (image == NULL) return CAIRO_INT_STATUS_NOTHING_TO_DO; info = malloc(sizeof(SurfacePatternDrawInfo)); if (!info) return CAIRO_STATUS_NO_MEMORY; /* XXX -- if we're printing, we may need to call CGImageCreateCopy to make sure * that the data will stick around for this image when the printer gets to it. * Otherwise, the underlying data store may disappear from under us! * * _cairo_surface_to_cgimage will copy when it converts non-Quartz surfaces, * since the Quartz surfaces have a higher chance of sticking around. If the * source is a quartz image surface, then it's set up to retain a ref to the * image surface that it's backed by. */ info->image = image; info->imageBounds = CGRectMake (0, 0, extents.width, extents.height); pbounds.origin.x = 0; pbounds.origin.y = 0; if (spattern->base.extend == CAIRO_EXTEND_REFLECT) { pbounds.size.width = 2.0 * extents.width; pbounds.size.height = 2.0 * extents.height; info->do_reflect = TRUE; } else { pbounds.size.width = extents.width; pbounds.size.height = extents.height; } rw = pbounds.size.width; rh = pbounds.size.height; m = spattern->base.matrix; cairo_matrix_invert(&m); _cairo_quartz_cairo_matrix_to_quartz (&m, &stransform); /* The pattern matrix is relative to the bottom left, again; the * incoming cairo pattern matrix is relative to the upper left. * So we take the pattern matrix and the original context matrix, * which gives us the correct base translation/y flip. */ ptransform = CGAffineTransformConcat(stransform, dest->cgContextBaseCTM); #ifdef QUARTZ_DEBUG ND((stderr, " pbounds: %f %f %f %f\n", pbounds.origin.x, pbounds.origin.y, pbounds.size.width, pbounds.size.height)); ND((stderr, " pattern xform: t: %f %f xx: %f xy: %f yx: %f yy: %f\n", ptransform.tx, ptransform.ty, ptransform.a, ptransform.b, ptransform.c, ptransform.d)); CGAffineTransform xform = CGContextGetCTM(dest->cgContext); ND((stderr, " context xform: t: %f %f xx: %f xy: %f yx: %f yy: %f\n", xform.tx, xform.ty, xform.a, xform.b, xform.c, xform.d)); #endif *cgpat = CGPatternCreate (info, pbounds, ptransform, rw, rh, kCGPatternTilingConstantSpacing, /* kCGPatternTilingNoDistortion, */ TRUE, &cb); return CAIRO_STATUS_SUCCESS; } typedef enum { DO_SOLID, DO_SHADING, DO_PATTERN, DO_IMAGE, DO_UNSUPPORTED, DO_NOTHING, DO_TILED_IMAGE } cairo_quartz_action_t; static cairo_quartz_action_t _cairo_quartz_setup_fallback_source (cairo_quartz_surface_t *surface, cairo_pattern_t *source) { CGRect clipBox = CGContextGetClipBoundingBox (surface->cgContext); CGAffineTransform ctm; double x0, y0, w, h; cairo_surface_t *fallback; cairo_t *fallback_cr; CGImageRef img; cairo_status_t status; if (clipBox.size.width == 0.0f || clipBox.size.height == 0.0f) return DO_NOTHING; // the clipBox is in userspace, so: ctm = CGContextGetCTM (surface->cgContext); ctm = CGAffineTransformInvert (ctm); clipBox = CGRectApplyAffineTransform (clipBox, ctm); // get the Y flip right -- the CTM will always have a Y flip in place clipBox.origin.y = surface->extents.height - (clipBox.origin.y + clipBox.size.height); x0 = floor(clipBox.origin.x); y0 = floor(clipBox.origin.y); w = ceil(clipBox.origin.x + clipBox.size.width) - x0; h = ceil(clipBox.origin.y + clipBox.size.height) - y0; /* Create a temporary the size of the clip surface, and position * it so that the device origin coincides with the original surface */ fallback = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, (int) w, (int) h); cairo_surface_set_device_offset (fallback, -x0, -y0); /* Paint the source onto our temporary */ fallback_cr = cairo_create (fallback); cairo_set_operator (fallback_cr, CAIRO_OPERATOR_SOURCE); cairo_set_source (fallback_cr, source); cairo_paint (fallback_cr); cairo_destroy (fallback_cr); status = _cairo_surface_to_cgimage ((cairo_surface_t*) surface, fallback, &img); if (status == CAIRO_STATUS_SUCCESS && img == NULL) return DO_NOTHING; if (status) return DO_UNSUPPORTED; surface->sourceImageRect = CGRectMake (0.0, 0.0, w, h); surface->sourceImage = img; surface->sourceImageSurface = fallback; surface->sourceTransform = CGAffineTransformMakeTranslation (x0, y0); return DO_IMAGE; } static cairo_quartz_action_t _cairo_quartz_setup_linear_source (cairo_quartz_surface_t *surface, cairo_linear_pattern_t *lpat) { cairo_pattern_t *abspat = (cairo_pattern_t *) lpat; cairo_matrix_t mat; CGPoint start, end; CGFunctionRef gradFunc; CGColorSpaceRef rgb; bool extend = abspat->extend == CAIRO_EXTEND_PAD; if (lpat->base.n_stops == 0) { CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); return DO_SOLID; } cairo_pattern_get_matrix (abspat, &mat); cairo_matrix_invert (&mat); _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); rgb = CGColorSpaceCreateDeviceRGB(); start = CGPointMake (_cairo_fixed_to_double (lpat->p1.x), _cairo_fixed_to_double (lpat->p1.y)); end = CGPointMake (_cairo_fixed_to_double (lpat->p2.x), _cairo_fixed_to_double (lpat->p2.y)); // ref will be released by the CGShading's destructor cairo_pattern_reference ((cairo_pattern_t*) lpat); if (abspat->extend == CAIRO_EXTEND_NONE || abspat->extend == CAIRO_EXTEND_PAD) { gradFunc = CreateGradientFunction ((cairo_gradient_pattern_t*) lpat); } else { gradFunc = CreateRepeatingGradientFunction (surface, (cairo_gradient_pattern_t*) lpat, &start, &end, surface->sourceTransform); } surface->sourceShading = CGShadingCreateAxial (rgb, start, end, gradFunc, extend, extend); CGColorSpaceRelease(rgb); CGFunctionRelease(gradFunc); return DO_SHADING; } static cairo_quartz_action_t _cairo_quartz_setup_radial_source (cairo_quartz_surface_t *surface, cairo_radial_pattern_t *rpat) { cairo_pattern_t *abspat = (cairo_pattern_t *)rpat; cairo_matrix_t mat; CGPoint start, end; CGFunctionRef gradFunc; CGColorSpaceRef rgb; bool extend = abspat->extend == CAIRO_EXTEND_PAD; if (rpat->base.n_stops == 0) { CGContextSetRGBStrokeColor (surface->cgContext, 0., 0., 0., 0.); CGContextSetRGBFillColor (surface->cgContext, 0., 0., 0., 0.); return DO_SOLID; } if (abspat->extend == CAIRO_EXTEND_REPEAT || abspat->extend == CAIRO_EXTEND_REFLECT) { /* I started trying to map these to Quartz, but it's much harder * then the linear case (I think it would involve doing multiple * Radial shadings). So, instead, let's just render an image * for pixman to draw the shading into, and use that. */ return _cairo_quartz_setup_fallback_source (surface, (cairo_pattern_t*) rpat); } cairo_pattern_get_matrix (abspat, &mat); cairo_matrix_invert (&mat); _cairo_quartz_cairo_matrix_to_quartz (&mat, &surface->sourceTransform); rgb = CGColorSpaceCreateDeviceRGB(); start = CGPointMake (_cairo_fixed_to_double (rpat->c1.x), _cairo_fixed_to_double (rpat->c1.y)); end = CGPointMake (_cairo_fixed_to_double (rpat->c2.x), _cairo_fixed_to_double (rpat->c2.y)); // ref will be released by the CGShading's destructor cairo_pattern_reference ((cairo_pattern_t*) rpat); gradFunc = CreateGradientFunction ((cairo_gradient_pattern_t*) rpat); surface->sourceShading = CGShadingCreateRadial (rgb, start, _cairo_fixed_to_double (rpat->r1), end, _cairo_fixed_to_double (rpat->r2), gradFunc, extend, extend); CGColorSpaceRelease(rgb); CGFunctionRelease(gradFunc); return DO_SHADING; } static cairo_quartz_action_t _cairo_quartz_setup_source (cairo_quartz_surface_t *surface, cairo_pattern_t *source) { assert (!(surface->sourceImage || surface->sourceShading || surface->sourcePattern)); surface->oldInterpolationQuality = CGContextGetInterpolationQuality (surface->cgContext); CGContextSetInterpolationQuality (surface->cgContext, _cairo_quartz_filter_to_quartz (source->filter)); if (source->type == CAIRO_PATTERN_TYPE_SOLID) { cairo_solid_pattern_t *solid = (cairo_solid_pattern_t *) source; CGContextSetRGBStrokeColor (surface->cgContext, solid->color.red, solid->color.green, solid->color.blue, solid->color.alpha); CGContextSetRGBFillColor (surface->cgContext, solid->color.red, solid->color.green, solid->color.blue, solid->color.alpha); return DO_SOLID; } if (source->type == CAIRO_PATTERN_TYPE_LINEAR) { cairo_linear_pattern_t *lpat = (cairo_linear_pattern_t *)source; return _cairo_quartz_setup_linear_source (surface, lpat); } if (source->type == CAIRO_PATTERN_TYPE_RADIAL) { cairo_radial_pattern_t *rpat = (cairo_radial_pattern_t *)source; return _cairo_quartz_setup_radial_source (surface, rpat); } if (source->type == CAIRO_PATTERN_TYPE_SURFACE && (source->extend == CAIRO_EXTEND_NONE || (CGContextDrawTiledImagePtr && source->extend == CAIRO_EXTEND_REPEAT))) { cairo_surface_pattern_t *spat = (cairo_surface_pattern_t *) source; cairo_surface_t *pat_surf = spat->surface; CGImageRef img; cairo_matrix_t m = spat->base.matrix; cairo_rectangle_int_t extents; cairo_status_t status; CGAffineTransform xform; CGRect srcRect; cairo_fixed_t fw, fh; status = _cairo_surface_to_cgimage ((cairo_surface_t *) surface, pat_surf, &img); if (status == CAIRO_STATUS_SUCCESS && img == NULL) return DO_NOTHING; if (status) return DO_UNSUPPORTED; surface->sourceImage = img; cairo_matrix_invert(&m); _cairo_quartz_cairo_matrix_to_quartz (&m, &surface->sourceTransform); status = _cairo_surface_get_extents (pat_surf, &extents); if (status) return DO_UNSUPPORTED; if (source->extend == CAIRO_EXTEND_NONE) { surface->sourceImageRect = CGRectMake (0, 0, extents.width, extents.height); return DO_IMAGE; } /* Quartz seems to tile images at pixel-aligned regions only -- this * leads to seams if the image doesn't end up scaling to fill the * space exactly. The CGPattern tiling approach doesn't have this * problem. Check if we're going to fill up the space (within some * epsilon), and if not, fall back to the CGPattern type. */ xform = CGAffineTransformConcat (CGContextGetCTM (surface->cgContext), surface->sourceTransform); srcRect = CGRectMake (0, 0, extents.width, extents.height); srcRect = CGRectApplyAffineTransform (srcRect, xform); fw = _cairo_fixed_from_double (srcRect.size.width); fh = _cairo_fixed_from_double (srcRect.size.height); if ((fw & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON && (fh & CAIRO_FIXED_FRAC_MASK) <= CAIRO_FIXED_EPSILON) { /* We're good to use DrawTiledImage, but ensure that * the math works out */ srcRect.size.width = round(srcRect.size.width); srcRect.size.height = round(srcRect.size.height); xform = CGAffineTransformInvert (xform); srcRect = CGRectApplyAffineTransform (srcRect, xform); surface->sourceImageRect = srcRect; return DO_TILED_IMAGE; } /* Fall through to generic SURFACE case */ } if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { float patternAlpha = 1.0f; CGColorSpaceRef patternSpace; CGPatternRef pattern; cairo_int_status_t status; status = _cairo_quartz_cairo_repeating_surface_pattern_to_quartz (surface, source, &pattern); if (status == CAIRO_INT_STATUS_NOTHING_TO_DO) return DO_NOTHING; if (status) return DO_UNSUPPORTED; // Save before we change the pattern, colorspace, etc. so that // we can restore and make sure that quartz releases our // pattern (which may be stack allocated) CGContextSaveGState(surface->cgContext); patternSpace = CGColorSpaceCreatePattern(NULL); CGContextSetFillColorSpace (surface->cgContext, patternSpace); CGContextSetFillPattern (surface->cgContext, pattern, &patternAlpha); CGContextSetStrokeColorSpace (surface->cgContext, patternSpace); CGContextSetStrokePattern (surface->cgContext, pattern, &patternAlpha); CGColorSpaceRelease (patternSpace); /* Quartz likes to munge the pattern phase (as yet unexplained * why); force it to 0,0 as we've already baked in the correct * pattern translation into the pattern matrix */ CGContextSetPatternPhase (surface->cgContext, CGSizeMake(0,0)); surface->sourcePattern = pattern; return DO_PATTERN; } return DO_UNSUPPORTED; } static void _cairo_quartz_teardown_source (cairo_quartz_surface_t *surface, cairo_pattern_t *source) { CGContextSetInterpolationQuality (surface->cgContext, surface->oldInterpolationQuality); if (surface->sourceImage) { CGImageRelease(surface->sourceImage); surface->sourceImage = NULL; cairo_surface_destroy(surface->sourceImageSurface); surface->sourceImageSurface = NULL; } if (surface->sourceShading) { CGShadingRelease(surface->sourceShading); surface->sourceShading = NULL; } if (surface->sourcePattern) { CGPatternRelease(surface->sourcePattern); // To tear down the pattern and colorspace CGContextRestoreGState(surface->cgContext); surface->sourcePattern = NULL; } } /* * get source/dest image implementation */ /* Read the image from the surface's front buffer */ static cairo_int_status_t _cairo_quartz_get_image (cairo_quartz_surface_t *surface, cairo_image_surface_t **image_out) { unsigned char *imageData; cairo_image_surface_t *isurf; if (IS_EMPTY(surface)) { *image_out = (cairo_image_surface_t*) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 0, 0); return CAIRO_STATUS_SUCCESS; } if (surface->imageSurfaceEquiv) { *image_out = (cairo_image_surface_t*) cairo_surface_reference(surface->imageSurfaceEquiv); return CAIRO_STATUS_SUCCESS; } if (_cairo_quartz_is_cgcontext_bitmap_context(surface->cgContext)) { unsigned int stride; unsigned int bitinfo; unsigned int bpc, bpp; CGColorSpaceRef colorspace; unsigned int color_comps; imageData = (unsigned char *) CGBitmapContextGetData(surface->cgContext); #ifdef USE_10_3_WORKAROUNDS bitinfo = CGBitmapContextGetAlphaInfo (surface->cgContext); #else bitinfo = CGBitmapContextGetBitmapInfo (surface->cgContext); #endif stride = CGBitmapContextGetBytesPerRow (surface->cgContext); bpp = CGBitmapContextGetBitsPerPixel (surface->cgContext); bpc = CGBitmapContextGetBitsPerComponent (surface->cgContext); // let's hope they don't add YUV under us colorspace = CGBitmapContextGetColorSpace (surface->cgContext); color_comps = CGColorSpaceGetNumberOfComponents(colorspace); // XXX TODO: We can handle all of these by converting to // pixman masks, including non-native-endian masks if (bpc != 8) return CAIRO_INT_STATUS_UNSUPPORTED; if (bpp != 32 && bpp != 8) return CAIRO_INT_STATUS_UNSUPPORTED; if (color_comps != 3 && color_comps != 1) return CAIRO_INT_STATUS_UNSUPPORTED; if (bpp == 32 && color_comps == 3 && (bitinfo & kCGBitmapAlphaInfoMask) == kCGImageAlphaPremultipliedFirst && (bitinfo & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host) { isurf = (cairo_image_surface_t *) cairo_image_surface_create_for_data (imageData, CAIRO_FORMAT_ARGB32, surface->extents.width, surface->extents.height, stride); } else if (bpp == 32 && color_comps == 3 && (bitinfo & kCGBitmapAlphaInfoMask) == kCGImageAlphaNoneSkipFirst && (bitinfo & kCGBitmapByteOrderMask) == kCGBitmapByteOrder32Host) { isurf = (cairo_image_surface_t *) cairo_image_surface_create_for_data (imageData, CAIRO_FORMAT_RGB24, surface->extents.width, surface->extents.height, stride); } else if (bpp == 8 && color_comps == 1) { isurf = (cairo_image_surface_t *) cairo_image_surface_create_for_data (imageData, CAIRO_FORMAT_A8, surface->extents.width, surface->extents.height, stride); } else { return CAIRO_INT_STATUS_UNSUPPORTED; } } else { return CAIRO_INT_STATUS_UNSUPPORTED; } *image_out = isurf; return CAIRO_STATUS_SUCCESS; } /* * Cairo surface backend implementations */ static cairo_status_t _cairo_quartz_surface_finish (void *abstract_surface) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; ND((stderr, "_cairo_quartz_surface_finish[%p] cgc: %p\n", surface, surface->cgContext)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; /* Restore our saved gstate that we use to reset clipping */ CGContextRestoreGState (surface->cgContext); CGContextRelease (surface->cgContext); surface->cgContext = NULL; if (surface->imageSurfaceEquiv) { cairo_surface_destroy (surface->imageSurfaceEquiv); surface->imageSurfaceEquiv = NULL; } if (surface->imageData) { free (surface->imageData); surface->imageData = NULL; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_quartz_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_int_status_t status; cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; //ND((stderr, "%p _cairo_quartz_surface_acquire_source_image\n", surface)); status = _cairo_quartz_get_image (surface, image_out); if (status) return _cairo_error (CAIRO_STATUS_NO_MEMORY); *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_quartz_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy ((cairo_surface_t *) image); } static cairo_status_t _cairo_quartz_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t status; ND((stderr, "%p _cairo_quartz_surface_acquire_dest_image\n", surface)); status = _cairo_quartz_get_image (surface, image_out); if (status) return _cairo_error (CAIRO_STATUS_NO_MEMORY); *image_rect = surface->extents; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_quartz_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { //cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; //ND((stderr, "%p _cairo_quartz_surface_release_dest_image\n", surface)); cairo_surface_destroy ((cairo_surface_t *) image); } static cairo_surface_t * _cairo_quartz_surface_create_similar (void *abstract_surface, cairo_content_t content, int width, int height) { /*cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface;*/ cairo_format_t format; if (content == CAIRO_CONTENT_COLOR_ALPHA) format = CAIRO_FORMAT_ARGB32; else if (content == CAIRO_CONTENT_COLOR) format = CAIRO_FORMAT_RGB24; else if (content == CAIRO_CONTENT_ALPHA) format = CAIRO_FORMAT_A8; else return NULL; // verify width and height of surface if (!_cairo_quartz_verify_surface_size(width, height)) { _cairo_error (CAIRO_STATUS_NO_MEMORY); return NULL; } return cairo_quartz_surface_create (format, width, height); } static cairo_status_t _cairo_quartz_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_quartz_surface_t *new_surface = NULL; cairo_format_t new_format; CGImageRef quartz_image = NULL; cairo_status_t status; *clone_out = NULL; // verify width and height of surface if (!_cairo_quartz_verify_surface_size(width, height)) { return CAIRO_INT_STATUS_UNSUPPORTED; } if (width == 0 || height == 0) { *clone_out = (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, CAIRO_CONTENT_COLOR_ALPHA, width, height); return CAIRO_STATUS_SUCCESS; } if (src->backend->type == CAIRO_SURFACE_TYPE_QUARTZ) { cairo_quartz_surface_t *qsurf = (cairo_quartz_surface_t *) src; if (IS_EMPTY(qsurf)) { *clone_out = (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, CAIRO_CONTENT_COLOR_ALPHA, qsurf->extents.width, qsurf->extents.height); return CAIRO_STATUS_SUCCESS; } } status = _cairo_surface_to_cgimage ((cairo_surface_t*) abstract_surface, src, &quartz_image); if (status) return CAIRO_INT_STATUS_UNSUPPORTED; new_format = CAIRO_FORMAT_ARGB32; /* assumed */ if (_cairo_surface_is_image (src)) { new_format = ((cairo_image_surface_t *) src)->format; } new_surface = (cairo_quartz_surface_t *) cairo_quartz_surface_create (new_format, width, height); if (quartz_image == NULL) goto FINISH; if (!new_surface || new_surface->base.status) { CGImageRelease (quartz_image); return CAIRO_INT_STATUS_UNSUPPORTED; } CGContextSaveGState (new_surface->cgContext); CGContextSetCompositeOperation (new_surface->cgContext, kPrivateCGCompositeCopy); CGContextTranslateCTM (new_surface->cgContext, -src_x, -src_y); CGContextDrawImage (new_surface->cgContext, CGRectMake (0, 0, CGImageGetWidth(quartz_image), CGImageGetHeight(quartz_image)), quartz_image); CGContextRestoreGState (new_surface->cgContext); CGImageRelease (quartz_image); FINISH: *clone_out = (cairo_surface_t*) new_surface; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *extents) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; *extents = surface->extents; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; cairo_quartz_action_t action; ND((stderr, "%p _cairo_quartz_surface_paint op %d source->type %d\n", surface, op, source->type)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); action = _cairo_quartz_setup_source (surface, source); if (action == DO_SOLID || action == DO_PATTERN) { CGContextFillRect (surface->cgContext, CGRectMake(surface->extents.x, surface->extents.y, surface->extents.width, surface->extents.height)); } else if (action == DO_SHADING) { CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextDrawShading (surface->cgContext, surface->sourceShading); } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { CGContextSaveGState (surface->cgContext); CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); CGContextScaleCTM (surface->cgContext, 1, -1); if (action == DO_IMAGE) CGContextDrawImage (surface->cgContext, surface->sourceImageRect, surface->sourceImage); else CGContextDrawTiledImagePtr (surface->cgContext, surface->sourceImageRect, surface->sourceImage); CGContextRestoreGState (surface->cgContext); } else if (action != DO_NOTHING) { rv = CAIRO_INT_STATUS_UNSUPPORTED; } _cairo_quartz_teardown_source (surface, source); ND((stderr, "-- paint\n")); return rv; } static cairo_int_status_t _cairo_quartz_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; cairo_quartz_action_t action; quartz_stroke_t stroke; cairo_box_t box; CGPathRef path_for_unbounded = NULL; ND((stderr, "%p _cairo_quartz_surface_fill op %d source->type %d\n", surface, op, source->type)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; /* Check whether the path would be a no-op */ /* XXX handle unbounded ops */ if (_cairo_path_fixed_is_empty(path) || (_cairo_path_fixed_is_box(path, &box) && box.p1.x == box.p2.x && box.p1.y == box.p2.y)) { return CAIRO_STATUS_SUCCESS; } CGContextSaveGState (surface->cgContext); CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); action = _cairo_quartz_setup_source (surface, source); CGContextBeginPath (surface->cgContext); stroke.cgContext = surface->cgContext; stroke.ctm_inverse = NULL; rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); if (rv) goto BAIL; if (!_cairo_operator_bounded_by_mask(op) && CGContextCopyPathPtr) path_for_unbounded = CGContextCopyPathPtr (surface->cgContext); if (action == DO_SOLID || action == DO_PATTERN) { if (fill_rule == CAIRO_FILL_RULE_WINDING) CGContextFillPath (surface->cgContext); else CGContextEOFillPath (surface->cgContext); } else if (action == DO_SHADING) { // we have to clip and then paint the shading; we can't fill // with the shading if (fill_rule == CAIRO_FILL_RULE_WINDING) CGContextClip (surface->cgContext); else CGContextEOClip (surface->cgContext); CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextDrawShading (surface->cgContext, surface->sourceShading); } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { if (fill_rule == CAIRO_FILL_RULE_WINDING) CGContextClip (surface->cgContext); else CGContextEOClip (surface->cgContext); CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); CGContextScaleCTM (surface->cgContext, 1, -1); if (action == DO_IMAGE) CGContextDrawImage (surface->cgContext, surface->sourceImageRect, surface->sourceImage); else CGContextDrawTiledImagePtr (surface->cgContext, surface->sourceImageRect, surface->sourceImage); } else if (action != DO_NOTHING) { rv = CAIRO_INT_STATUS_UNSUPPORTED; } BAIL: _cairo_quartz_teardown_source (surface, source); CGContextRestoreGState (surface->cgContext); if (path_for_unbounded) { unbounded_op_data_t ub; ub.op = UNBOUNDED_STROKE_FILL; ub.u.stroke_fill.cgPath = path_for_unbounded; ub.u.stroke_fill.fill_rule = fill_rule; _cairo_quartz_fixup_unbounded_operation (surface, &ub, antialias); CGPathRelease (path_for_unbounded); } ND((stderr, "-- fill\n")); return rv; } static cairo_int_status_t _cairo_quartz_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; cairo_quartz_action_t action; quartz_stroke_t stroke; CGAffineTransform origCTM, strokeTransform; CGPathRef path_for_unbounded = NULL; ND((stderr, "%p _cairo_quartz_surface_stroke op %d source->type %d\n", surface, op, source->type)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; CGContextSaveGState (surface->cgContext); // Turning antialiasing off used to cause misrendering with // single-pixel lines (e.g. 20,10.5 -> 21,10.5 end up being rendered as 2 pixels). // That's been since fixed in at least 10.5, and in the latest 10.4 dot releases. CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); CGContextSetLineWidth (surface->cgContext, style->line_width); CGContextSetLineCap (surface->cgContext, _cairo_quartz_cairo_line_cap_to_quartz (style->line_cap)); CGContextSetLineJoin (surface->cgContext, _cairo_quartz_cairo_line_join_to_quartz (style->line_join)); CGContextSetMiterLimit (surface->cgContext, style->miter_limit); origCTM = CGContextGetCTM (surface->cgContext); _cairo_quartz_cairo_matrix_to_quartz (ctm, &strokeTransform); CGContextConcatCTM (surface->cgContext, strokeTransform); if (style->dash && style->num_dashes) { #define STATIC_DASH 32 float sdash[STATIC_DASH]; float *fdash = sdash; unsigned int max_dashes = style->num_dashes; unsigned int k; if (style->num_dashes%2) max_dashes *= 2; if (max_dashes > STATIC_DASH) fdash = _cairo_malloc_ab (max_dashes, sizeof (float)); if (fdash == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (k = 0; k < max_dashes; k++) fdash[k] = (float) style->dash[k % style->num_dashes]; CGContextSetLineDash (surface->cgContext, style->dash_offset, fdash, max_dashes); if (fdash != sdash) free (fdash); } CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); action = _cairo_quartz_setup_source (surface, source); CGContextBeginPath (surface->cgContext); stroke.cgContext = surface->cgContext; stroke.ctm_inverse = ctm_inverse; rv = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); if (rv) goto BAIL; if (!_cairo_operator_bounded_by_mask (op) && CGContextCopyPathPtr) path_for_unbounded = CGContextCopyPathPtr (surface->cgContext); if (action == DO_SOLID || action == DO_PATTERN) { CGContextStrokePath (surface->cgContext); } else if (action == DO_IMAGE || action == DO_TILED_IMAGE) { CGContextReplacePathWithStrokedPath (surface->cgContext); CGContextClip (surface->cgContext); CGContextSetCTM (surface->cgContext, origCTM); CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); CGContextScaleCTM (surface->cgContext, 1, -1); if (action == DO_IMAGE) CGContextDrawImage (surface->cgContext, surface->sourceImageRect, surface->sourceImage); else CGContextDrawTiledImagePtr (surface->cgContext, surface->sourceImageRect, surface->sourceImage); } else if (action == DO_SHADING) { CGContextReplacePathWithStrokedPath (surface->cgContext); CGContextClip (surface->cgContext); CGContextSetCTM (surface->cgContext, origCTM); CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextDrawShading (surface->cgContext, surface->sourceShading); } else if (action != DO_NOTHING) { rv = CAIRO_INT_STATUS_UNSUPPORTED; } BAIL: _cairo_quartz_teardown_source (surface, source); CGContextRestoreGState (surface->cgContext); if (path_for_unbounded) { unbounded_op_data_t ub; CGContextBeginPath (surface->cgContext); /* recreate the stroke state, but without the CTM, as it's been already baked * into the path. */ CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); CGContextSetLineWidth (surface->cgContext, style->line_width); CGContextSetLineCap (surface->cgContext, _cairo_quartz_cairo_line_cap_to_quartz (style->line_cap)); CGContextSetLineJoin (surface->cgContext, _cairo_quartz_cairo_line_join_to_quartz (style->line_join)); CGContextSetMiterLimit (surface->cgContext, style->miter_limit); CGContextAddPath (surface->cgContext, path_for_unbounded); CGPathRelease (path_for_unbounded); CGContextReplacePathWithStrokedPath (surface->cgContext); path_for_unbounded = CGContextCopyPathPtr (surface->cgContext); ub.op = UNBOUNDED_STROKE_FILL; ub.u.stroke_fill.cgPath = path_for_unbounded; ub.u.stroke_fill.fill_rule = CAIRO_FILL_RULE_WINDING; _cairo_quartz_fixup_unbounded_operation (surface, &ub, antialias); CGPathRelease (path_for_unbounded); } ND((stderr, "-- stroke\n")); return rv; } #if CAIRO_HAS_QUARTZ_FONT static cairo_int_status_t _cairo_quartz_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { CGAffineTransform textTransform, ctm; #define STATIC_BUF_SIZE 64 CGGlyph glyphs_static[STATIC_BUF_SIZE]; CGSize cg_advances_static[STATIC_BUF_SIZE]; CGGlyph *cg_glyphs = &glyphs_static[0]; CGSize *cg_advances = &cg_advances_static[0]; cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; cairo_quartz_action_t action; float xprev, yprev; int i; CGFontRef cgfref = NULL; cairo_bool_t isClipping = FALSE; cairo_bool_t didForceFontSmoothing = FALSE; if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (num_glyphs <= 0) return CAIRO_STATUS_SUCCESS; if (op == CAIRO_OPERATOR_DEST) return CAIRO_STATUS_SUCCESS; if (cairo_scaled_font_get_type (scaled_font) != CAIRO_FONT_TYPE_QUARTZ) return CAIRO_INT_STATUS_UNSUPPORTED; CGContextSaveGState (surface->cgContext); action = _cairo_quartz_setup_source (surface, source); if (action == DO_SOLID || action == DO_PATTERN) { CGContextSetTextDrawingMode (surface->cgContext, kCGTextFill); } else if (action == DO_IMAGE || action == DO_TILED_IMAGE || action == DO_SHADING) { CGContextSetTextDrawingMode (surface->cgContext, kCGTextClip); isClipping = TRUE; } else { if (action != DO_NOTHING) rv = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } CGContextSetCompositeOperation (surface->cgContext, _cairo_quartz_cairo_operator_to_quartz (op)); /* this doesn't addref */ cgfref = _cairo_quartz_scaled_font_get_cg_font_ref (scaled_font); CGContextSetFont (surface->cgContext, cgfref); CGContextSetFontSize (surface->cgContext, 1.0); switch (scaled_font->options.antialias) { case CAIRO_ANTIALIAS_SUBPIXEL: CGContextSetShouldAntialias (surface->cgContext, TRUE); CGContextSetShouldSmoothFonts (surface->cgContext, TRUE); if (CGContextSetAllowsFontSmoothingPtr && !CGContextGetAllowsFontSmoothingPtr (surface->cgContext)) { didForceFontSmoothing = TRUE; CGContextSetAllowsFontSmoothingPtr (surface->cgContext, TRUE); } break; case CAIRO_ANTIALIAS_NONE: CGContextSetShouldAntialias (surface->cgContext, FALSE); break; case CAIRO_ANTIALIAS_GRAY: CGContextSetShouldAntialias (surface->cgContext, TRUE); CGContextSetShouldSmoothFonts (surface->cgContext, FALSE); break; case CAIRO_ANTIALIAS_DEFAULT: /* Don't do anything */ break; } if (num_glyphs > STATIC_BUF_SIZE) { cg_glyphs = (CGGlyph*) _cairo_malloc_ab (num_glyphs, sizeof(CGGlyph)); if (cg_glyphs == NULL) { rv = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } cg_advances = (CGSize*) _cairo_malloc_ab (num_glyphs, sizeof(CGSize)); if (cg_advances == NULL) { rv = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } } textTransform = CGAffineTransformMake (scaled_font->font_matrix.xx, scaled_font->font_matrix.yx, scaled_font->font_matrix.xy, scaled_font->font_matrix.yy, 0., 0.); textTransform = CGAffineTransformScale (textTransform, 1.0, -1.0); textTransform = CGAffineTransformConcat (CGAffineTransformMake(scaled_font->ctm.xx, -scaled_font->ctm.yx, -scaled_font->ctm.xy, scaled_font->ctm.yy, 0., 0.), textTransform); CGContextSetTextMatrix (surface->cgContext, textTransform); /* Convert our glyph positions to glyph advances. We need n-1 advances, * since the advance at index 0 is applied after glyph 0. */ xprev = glyphs[0].x; yprev = glyphs[0].y; cg_glyphs[0] = glyphs[0].index; for (i = 1; i < num_glyphs; i++) { float xf = glyphs[i].x; float yf = glyphs[i].y; cg_glyphs[i] = glyphs[i].index; cg_advances[i-1].width = xf - xprev; cg_advances[i-1].height = yf - yprev; xprev = xf; yprev = yf; } if (_cairo_quartz_osx_version >= 0x1050 && isClipping) { /* If we're clipping, OSX 10.5 (at least as of 10.5.2) has a * bug (apple bug ID #5834794) where the glyph * advances/positions are not transformed by the text matrix * if kCGTextClip is being used. So, we pre-transform here. * 10.4 does not have this problem (as of 10.4.11). */ for (i = 0; i < num_glyphs - 1; i++) cg_advances[i] = CGSizeApplyAffineTransform(cg_advances[i], textTransform); } #if 0 for (i = 0; i < num_glyphs; i++) { ND((stderr, "[%d: %d %f,%f]\n", i, cg_glyphs[i], cg_advances[i].width, cg_advances[i].height)); } #endif /* Translate to the first glyph's position before drawing */ ctm = CGContextGetCTM (surface->cgContext); CGContextTranslateCTM (surface->cgContext, glyphs[0].x, glyphs[0].y); CGContextShowGlyphsWithAdvances (surface->cgContext, cg_glyphs, cg_advances, num_glyphs); CGContextSetCTM (surface->cgContext, ctm); if (action == DO_IMAGE || action == DO_TILED_IMAGE) { CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextTranslateCTM (surface->cgContext, 0, surface->sourceImageRect.size.height); CGContextScaleCTM (surface->cgContext, 1, -1); if (action == DO_IMAGE) CGContextDrawImage (surface->cgContext, surface->sourceImageRect, surface->sourceImage); else CGContextDrawTiledImagePtr (surface->cgContext, surface->sourceImageRect, surface->sourceImage); } else if (action == DO_SHADING) { CGContextConcatCTM (surface->cgContext, surface->sourceTransform); CGContextDrawShading (surface->cgContext, surface->sourceShading); } BAIL: _cairo_quartz_teardown_source (surface, source); if (didForceFontSmoothing) CGContextSetAllowsFontSmoothingPtr (surface->cgContext, FALSE); CGContextRestoreGState (surface->cgContext); if (rv == CAIRO_STATUS_SUCCESS && cgfref && !_cairo_operator_bounded_by_mask (op)) { unbounded_op_data_t ub; ub.op = UNBOUNDED_SHOW_GLYPHS; ub.u.show_glyphs.isClipping = isClipping; ub.u.show_glyphs.cg_glyphs = cg_glyphs; ub.u.show_glyphs.cg_advances = cg_advances; ub.u.show_glyphs.nglyphs = num_glyphs; ub.u.show_glyphs.textTransform = textTransform; ub.u.show_glyphs.font = cgfref; ub.u.show_glyphs.origin = CGPointMake (glyphs[0].x, glyphs[0].y); _cairo_quartz_fixup_unbounded_operation (surface, &ub, scaled_font->options.antialias); } if (cg_advances != &cg_advances_static[0]) { free (cg_advances); } if (cg_glyphs != &glyphs_static[0]) { free (cg_glyphs); } return rv; } #endif /* CAIRO_HAS_QUARTZ_FONT */ static cairo_int_status_t _cairo_quartz_surface_mask_with_surface (cairo_quartz_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_surface_pattern_t *mask) { cairo_rectangle_int_t extents; CGRect rect; CGImageRef img; cairo_surface_t *pat_surf = mask->surface; cairo_status_t status = CAIRO_STATUS_SUCCESS; CGAffineTransform ctm, mask_matrix; status = _cairo_surface_get_extents (pat_surf, &extents); if (status) return status; // everything would be masked out, so do nothing if (extents.width == 0 || extents.height == 0) return CAIRO_STATUS_SUCCESS; status = _cairo_surface_to_cgimage ((cairo_surface_t *) surface, pat_surf, &img); if (status == CAIRO_STATUS_SUCCESS && img == NULL) return CAIRO_STATUS_SUCCESS; if (status) return status; rect = CGRectMake (0.0f, 0.0f, extents.width, extents.height); CGContextSaveGState (surface->cgContext); /* ClipToMask is essentially drawing an image, so we need to flip the CTM * to get the image to appear oriented the right way */ ctm = CGContextGetCTM (surface->cgContext); _cairo_quartz_cairo_matrix_to_quartz (&mask->base.matrix, &mask_matrix); CGContextConcatCTM (surface->cgContext, CGAffineTransformInvert(mask_matrix)); CGContextTranslateCTM (surface->cgContext, 0.0f, rect.size.height); CGContextScaleCTM (surface->cgContext, 1.0f, -1.0f); CGContextClipToMaskPtr (surface->cgContext, rect, img); CGContextSetCTM (surface->cgContext, ctm); status = _cairo_quartz_surface_paint (surface, op, source); CGContextRestoreGState (surface->cgContext); if (!_cairo_operator_bounded_by_mask (op)) { unbounded_op_data_t ub; ub.op = UNBOUNDED_MASK; ub.u.mask.mask = img; ub.u.mask.maskTransform = CGAffineTransformInvert(mask_matrix); _cairo_quartz_fixup_unbounded_operation (surface, &ub, CAIRO_ANTIALIAS_NONE); } CGImageRelease (img); return status; } /* This is somewhat less than ideal, but it gets the job done; * it would be better to avoid calling back into cairo. This * creates a temporary surface to use as the mask. */ static cairo_int_status_t _cairo_quartz_surface_mask_with_generic (cairo_quartz_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { int width = surface->extents.width - surface->extents.x; int height = surface->extents.height - surface->extents.y; cairo_surface_t *gradient_surf = NULL; cairo_t *gradient_surf_cr = NULL; cairo_pattern_union_t surface_pattern; cairo_int_status_t status; /* Render the gradient to a surface */ gradient_surf = cairo_quartz_surface_create (CAIRO_FORMAT_ARGB32, width, height); gradient_surf_cr = cairo_create(gradient_surf); cairo_set_source (gradient_surf_cr, mask); cairo_set_operator (gradient_surf_cr, CAIRO_OPERATOR_SOURCE); cairo_paint (gradient_surf_cr); status = cairo_status (gradient_surf_cr); cairo_destroy (gradient_surf_cr); if (status) goto BAIL; _cairo_pattern_init_for_surface (&surface_pattern.surface, gradient_surf); status = _cairo_quartz_surface_mask_with_surface (surface, op, source, &surface_pattern.surface); _cairo_pattern_fini (&surface_pattern.base); BAIL: if (gradient_surf) cairo_surface_destroy (gradient_surf); return status; } static cairo_int_status_t _cairo_quartz_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; cairo_int_status_t rv = CAIRO_STATUS_SUCCESS; ND((stderr, "%p _cairo_quartz_surface_mask op %d source->type %d mask->type %d\n", surface, op, source->type, mask->type)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (mask->type == CAIRO_PATTERN_TYPE_SOLID) { /* This is easy; we just need to paint with the alpha. */ cairo_solid_pattern_t *solid_mask = (cairo_solid_pattern_t *) mask; CGContextSetAlpha (surface->cgContext, solid_mask->color.alpha); rv = _cairo_quartz_surface_paint (surface, op, source); CGContextSetAlpha (surface->cgContext, 1.0); return rv; } /* If we have CGContextClipToMask, we can do more complex masks */ if (CGContextClipToMaskPtr) { /* For these, we can skip creating a temporary surface, since we already have one */ if (mask->type == CAIRO_PATTERN_TYPE_SURFACE && mask->extend == CAIRO_EXTEND_NONE) return _cairo_quartz_surface_mask_with_surface (surface, op, source, (cairo_surface_pattern_t *) mask); return _cairo_quartz_surface_mask_with_generic (surface, op, source, mask); } /* So, CGContextClipToMask is not present in 10.3.9, so we're * doomed; if we have imageData, we can do fallback, otherwise * just pretend success. */ if (surface->imageData) return CAIRO_INT_STATUS_UNSUPPORTED; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_quartz_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_quartz_surface_t *surface = (cairo_quartz_surface_t *) abstract_surface; quartz_stroke_t stroke; cairo_status_t status; ND((stderr, "%p _cairo_quartz_surface_intersect_clip_path path: %p\n", surface, path)); if (IS_EMPTY(surface)) return CAIRO_STATUS_SUCCESS; if (path == NULL) { /* If we're being asked to reset the clip, we can only do it * by restoring the gstate to our previous saved one, and * saving it again. * * Note that this assumes that ALL quartz surface creation * functions will do a SaveGState first; we do this in create_internal. */ CGContextRestoreGState (surface->cgContext); CGContextSaveGState (surface->cgContext); } else { CGContextBeginPath (surface->cgContext); stroke.cgContext = surface->cgContext; stroke.ctm_inverse = NULL; CGContextSetShouldAntialias (surface->cgContext, (antialias != CAIRO_ANTIALIAS_NONE)); /* path must not be empty. */ CGContextMoveToPoint (surface->cgContext, 0, 0); status = _cairo_quartz_cairo_path_to_quartz_context (path, &stroke); if (status) return status; if (fill_rule == CAIRO_FILL_RULE_WINDING) CGContextClip (surface->cgContext); else CGContextEOClip (surface->cgContext); } ND((stderr, "-- intersect_clip_path\n")); return CAIRO_STATUS_SUCCESS; } // XXXtodo implement show_page; need to figure out how to handle begin/end static const struct _cairo_surface_backend cairo_quartz_surface_backend = { CAIRO_SURFACE_TYPE_QUARTZ, _cairo_quartz_surface_create_similar, _cairo_quartz_surface_finish, _cairo_quartz_surface_acquire_source_image, _cairo_quartz_surface_release_source_image, _cairo_quartz_surface_acquire_dest_image, _cairo_quartz_surface_release_dest_image, _cairo_quartz_surface_clone_similar, NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ _cairo_quartz_surface_intersect_clip_path, _cairo_quartz_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ _cairo_quartz_surface_paint, _cairo_quartz_surface_mask, _cairo_quartz_surface_stroke, _cairo_quartz_surface_fill, #if CAIRO_HAS_QUARTZ_FONT _cairo_quartz_surface_show_glyphs, #else NULL, /* show_glyphs */ #endif NULL, /* snapshot */ NULL, /* is_similar */ NULL, /* reset */ NULL /* fill_stroke */ }; cairo_quartz_surface_t * _cairo_quartz_surface_create_internal (CGContextRef cgContext, cairo_content_t content, unsigned int width, unsigned int height) { cairo_quartz_surface_t *surface; quartz_ensure_symbols(); /* Init the base surface */ surface = malloc(sizeof(cairo_quartz_surface_t)); if (surface == NULL) return (cairo_quartz_surface_t*) _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); memset(surface, 0, sizeof(cairo_quartz_surface_t)); _cairo_surface_init(&surface->base, &cairo_quartz_surface_backend, content); /* Save our extents */ surface->extents.x = surface->extents.y = 0; surface->extents.width = width; surface->extents.height = height; if (IS_EMPTY(surface)) { surface->cgContext = NULL; surface->cgContextBaseCTM = CGAffineTransformIdentity; surface->imageData = NULL; return surface; } /* Save so we can always get back to a known-good CGContext -- this is * required for proper behaviour of intersect_clip_path(NULL) */ CGContextSaveGState (cgContext); surface->cgContext = cgContext; surface->cgContextBaseCTM = CGContextGetCTM (cgContext); surface->imageData = NULL; surface->imageSurfaceEquiv = NULL; return surface; } /** * cairo_quartz_surface_create_for_cg_context * @cgContext: the existing CGContext for which to create the surface * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates a Quartz surface that wraps the given CGContext. The * CGContext is assumed to be in the standard Cairo coordinate space * (that is, with the origin at the upper left and the Y axis * increasing downward). If the CGContext is in the Quartz coordinate * space (with the origin at the bottom left), then it should be * flipped before this function is called. The flip can be accomplished * using a translate and a scale; for example: * * * CGContextTranslateCTM (cgContext, 0.0, height); * CGContextScaleCTM (cgContext, 1.0, -1.0); * * * All Cairo operations are implemented in terms of Quartz operations, * as long as Quartz-compatible elements are used (such as Quartz fonts). * * Return value: the newly created Cairo surface. * * Since: 1.4 **/ cairo_surface_t * cairo_quartz_surface_create_for_cg_context (CGContextRef cgContext, unsigned int width, unsigned int height) { cairo_quartz_surface_t *surf; CGContextRetain (cgContext); surf = _cairo_quartz_surface_create_internal (cgContext, CAIRO_CONTENT_COLOR_ALPHA, width, height); if (surf->base.status) { CGContextRelease (cgContext); // create_internal will have set an error return (cairo_surface_t*) surf; } return (cairo_surface_t *) surf; } /** * cairo_quartz_surface_create * @format: format of pixels in the surface to create * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates a Quartz surface backed by a CGBitmap. The surface is * created using the Device RGB (or Device Gray, for A8) color space. * All Cairo operations, including those that require software * rendering, will succeed on this surface. * * Return value: the newly created surface. * * Since: 1.4 **/ cairo_surface_t * cairo_quartz_surface_create (cairo_format_t format, unsigned int width, unsigned int height) { cairo_quartz_surface_t *surf; CGContextRef cgc; CGColorSpaceRef cgColorspace; CGBitmapInfo bitinfo; void *imageData; int stride; int bitsPerComponent; // verify width and height of surface if (!_cairo_quartz_verify_surface_size(width, height)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); if (width == 0 || height == 0) { return (cairo_surface_t*) _cairo_quartz_surface_create_internal (NULL, _cairo_content_from_format (format), width, height); } if (format == CAIRO_FORMAT_ARGB32 || format == CAIRO_FORMAT_RGB24) { cgColorspace = CGColorSpaceCreateDeviceRGB(); bitinfo = kCGBitmapByteOrder32Host; if (format == CAIRO_FORMAT_ARGB32) bitinfo |= kCGImageAlphaPremultipliedFirst; else bitinfo |= kCGImageAlphaNoneSkipFirst; bitsPerComponent = 8; /* The Apple docs say that for best performance, the stride and the data * pointer should be 16-byte aligned. malloc already aligns to 16-bytes, * so we don't have to anything special on allocation. */ stride = width * 4; stride += (16 - (stride & 15)) & 15; } else if (format == CAIRO_FORMAT_A8) { cgColorspace = CGColorSpaceCreateDeviceGray(); if (width % 4 == 0) stride = width; else stride = (width & ~3) + 4; bitinfo = kCGImageAlphaNone; bitsPerComponent = 8; } else if (format == CAIRO_FORMAT_A1) { /* I don't think we can usefully support this, as defined by * cairo_format_t -- these are 1-bit pixels stored in 32-bit * quantities. */ return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); } else { return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); } imageData = _cairo_malloc_ab (height, stride); if (!imageData) { CGColorSpaceRelease (cgColorspace); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* zero the memory to match the image surface behaviour */ memset (imageData, 0, height * stride); cgc = CGBitmapContextCreate (imageData, width, height, bitsPerComponent, stride, cgColorspace, bitinfo); CGColorSpaceRelease (cgColorspace); if (!cgc) { free (imageData); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } /* flip the Y axis */ CGContextTranslateCTM (cgc, 0.0, height); CGContextScaleCTM (cgc, 1.0, -1.0); surf = _cairo_quartz_surface_create_internal (cgc, _cairo_content_from_format (format), width, height); if (surf->base.status) { CGContextRelease (cgc); free (imageData); // create_internal will have set an error return (cairo_surface_t*) surf; } surf->imageData = imageData; surf->imageSurfaceEquiv = cairo_image_surface_create_for_data (imageData, format, width, height, stride); return (cairo_surface_t *) surf; } /** * cairo_quartz_surface_get_cg_context * @surface: the Cairo Quartz surface * * Returns the CGContextRef that the given Quartz surface is backed * by. * * Return value: the CGContextRef for the given surface. * * Since: 1.4 **/ CGContextRef cairo_quartz_surface_get_cg_context (cairo_surface_t *surface) { cairo_quartz_surface_t *quartz = (cairo_quartz_surface_t*)surface; if (cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_QUARTZ) return NULL; return quartz->cgContext; } /* Debug stuff */ #ifdef QUARTZ_DEBUG #include void ExportCGImageToPNGFile(CGImageRef inImageRef, char* dest) { Handle dataRef = NULL; OSType dataRefType; CFStringRef inPath = CFStringCreateWithCString(NULL, dest, kCFStringEncodingASCII); GraphicsExportComponent grex = 0; unsigned long sizeWritten; ComponentResult result; // create the data reference result = QTNewDataReferenceFromFullPathCFString(inPath, kQTNativeDefaultPathStyle, 0, &dataRef, &dataRefType); if (NULL != dataRef && noErr == result) { // get the PNG exporter result = OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypePNG, &grex); if (grex) { // tell the exporter where to find its source image result = GraphicsExportSetInputCGImage(grex, inImageRef); if (noErr == result) { // tell the exporter where to save the exporter image result = GraphicsExportSetOutputDataReference(grex, dataRef, dataRefType); if (noErr == result) { // write the PNG file result = GraphicsExportDoExport(grex, &sizeWritten); } } // remember to close the component CloseComponent(grex); } // remember to dispose of the data reference handle DisposeHandle(dataRef); } } void quartz_image_to_png (CGImageRef imgref, char *dest) { static int sctr = 0; char sptr[] = "/Users/vladimir/Desktop/barXXXXX.png"; if (dest == NULL) { fprintf (stderr, "** Writing %p to bar%d\n", imgref, sctr); sprintf (sptr, "/Users/vladimir/Desktop/bar%d.png", sctr); sctr++; dest = sptr; } ExportCGImageToPNGFile(imgref, dest); } void quartz_surface_to_png (cairo_quartz_surface_t *nq, char *dest) { static int sctr = 0; char sptr[] = "/Users/vladimir/Desktop/fooXXXXX.png"; if (nq->base.type != CAIRO_SURFACE_TYPE_QUARTZ) { fprintf (stderr, "** quartz_surface_to_png: surface %p isn't quartz!\n", nq); return; } if (dest == NULL) { fprintf (stderr, "** Writing %p to foo%d\n", nq, sctr); sprintf (sptr, "/Users/vladimir/Desktop/foo%d.png", sctr); sctr++; dest = sptr; } CGImageRef imgref = CGBitmapContextCreateImage (nq->cgContext); if (imgref == NULL) { fprintf (stderr, "quartz surface at %p is not a bitmap context!\n", nq); return; } ExportCGImageToPNGFile(imgref, dest); CGImageRelease(imgref); } #endif /* QUARTZ_DEBUG */ libgdiplus-2.11/cairo/src/cairo-cff-subset.c0000664000175000017500000020342212225470167015713 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Adrian Johnson. * * Contributor(s): * Adrian Johnson * Eugeniy Meshcheryakov */ /* * Useful links: * http://www.adobe.com/devnet/font/pdfs/5176.CFF.pdf */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-truetype-subset-private.h" #include /* CFF Dict Operators. If the high byte is 0 the command is encoded * with a single byte. */ #define BASEFONTNAME_OP 0x0c16 #define CIDCOUNT_OP 0x0c22 #define CHARSET_OP 0x000f #define CHARSTRINGS_OP 0x0011 #define COPYRIGHT_OP 0x0c00 #define ENCODING_OP 0x0010 #define FAMILYNAME_OP 0x0003 #define FDARRAY_OP 0x0c24 #define FDSELECT_OP 0x0c25 #define FONTBBOX_OP 0x0005 #define FONTNAME_OP 0x0c26 #define FULLNAME_OP 0x0002 #define LOCAL_SUB_OP 0x0013 #define NOTICE_OP 0x0001 #define POSTSCRIPT_OP 0x0c15 #define PRIVATE_OP 0x0012 #define ROS_OP 0x0c1e #define UNIQUEID_OP 0x000d #define VERSION_OP 0x0000 #define WEIGHT_OP 0x0004 #define XUID_OP 0x000e #define NUM_STD_STRINGS 391 typedef struct _cff_header { uint8_t major; uint8_t minor; uint8_t header_size; uint8_t offset_size; } cff_header_t; typedef struct _cff_index_element { cairo_bool_t is_copy; unsigned char *data; int length; } cff_index_element_t; typedef struct _cff_dict_operator { cairo_hash_entry_t base; unsigned short operator; unsigned char *operand; int operand_length; int operand_offset; } cff_dict_operator_t; typedef struct _cairo_cff_font { cairo_scaled_font_subset_t *scaled_font_subset; const cairo_scaled_font_backend_t *backend; /* Font Data */ unsigned char *data; unsigned long data_length; unsigned char *current_ptr; unsigned char *data_end; cff_header_t *header; char *font_name; cairo_hash_table_t *top_dict; cairo_hash_table_t *private_dict; cairo_array_t strings_index; cairo_array_t charstrings_index; cairo_array_t global_sub_index; cairo_array_t local_sub_index; int num_glyphs; cairo_bool_t is_cid; /* CID Font Data */ int *fdselect; unsigned int num_fontdicts; cairo_hash_table_t **fd_dict; cairo_hash_table_t **fd_private_dict; cairo_array_t *fd_local_sub_index; /* Subsetted Font Data */ char *subset_font_name; cairo_array_t charstrings_subset_index; cairo_array_t strings_subset_index; int *fdselect_subset; unsigned int num_subset_fontdicts; int *fd_subset_map; int *private_dict_offset; cairo_array_t output; /* Subset Metrics */ int *widths; int x_min, y_min, x_max, y_max; int ascent, descent; } cairo_cff_font_t; /* Encoded integer using maximum sized encoding. This is required for * operands that are later modified after encoding. */ static unsigned char * encode_integer_max (unsigned char *p, int i) { *p++ = 29; *p++ = i >> 24; *p++ = (i >> 16) & 0xff; *p++ = (i >> 8) & 0xff; *p++ = i & 0xff; return p; } static unsigned char * encode_integer (unsigned char *p, int i) { if (i >= -107 && i <= 107) { *p++ = i + 139; } else if (i >= 108 && i <= 1131) { i -= 108; *p++ = (i >> 8)+ 247; *p++ = i & 0xff; } else if (i >= -1131 && i <= -108) { i = -i - 108; *p++ = (i >> 8)+ 251; *p++ = i & 0xff; } else if (i >= -32768 && i <= 32767) { *p++ = 28; *p++ = (i >> 8) & 0xff; *p++ = i & 0xff; } else { p = encode_integer_max (p, i); } return p; } static unsigned char * decode_integer (unsigned char *p, int *integer) { if (*p == 28) { *integer = (int)(p[1]<<8 | p[2]); p += 3; } else if (*p == 29) { *integer = (int)((p[1] << 24) | (p[2] << 16) | (p[3] << 8) | p[4]); p += 5; } else if (*p >= 32 && *p <= 246) { *integer = *p++ - 139; } else if (*p <= 250) { *integer = (p[0] - 247) * 256 + p[1] + 108; p += 2; } else if (*p <= 254) { *integer = -(p[0] - 251) * 256 - p[1] - 108; p += 2; } else { *integer = 0; p += 1; } return p; } static unsigned char * decode_operator (unsigned char *p, unsigned short *operator) { unsigned short op = 0; op = *p++; if (op == 12) { op <<= 8; op |= *p++; } *operator = op; return p; } /* return 0 if not an operand */ static int operand_length (unsigned char *p) { unsigned char *begin = p; if (*p == 28) return 3; if (*p == 29) return 5; if (*p >= 32 && *p <= 246) return 1; if (*p >= 247 && *p <= 254) return 2; if (*p == 30) { while ((*p & 0x0f) != 0x0f) p++; return p - begin + 1; } return 0; } static unsigned char * encode_index_offset (unsigned char *p, int offset_size, unsigned long offset) { while (--offset_size >= 0) { p[offset_size] = (unsigned char) (offset & 0xff); offset >>= 8; } return p + offset_size; } static unsigned long decode_index_offset(unsigned char *p, int off_size) { unsigned long offset = 0; while (off_size-- > 0) offset = offset*256 + *p++; return offset; } static void cff_index_init (cairo_array_t *index) { _cairo_array_init (index, sizeof (cff_index_element_t)); } static cairo_int_status_t cff_index_read (cairo_array_t *index, unsigned char **ptr, unsigned char *end_ptr) { cff_index_element_t element; unsigned char *data, *p; cairo_status_t status; int offset_size, count, start, i; int end = 0; p = *ptr; if (p + 2 > end_ptr) return CAIRO_INT_STATUS_UNSUPPORTED; count = be16_to_cpu( *((uint16_t *)p) ); p += 2; if (count > 0) { offset_size = *p++; if (p + (count + 1)*offset_size > end_ptr) return CAIRO_INT_STATUS_UNSUPPORTED; data = p + offset_size*(count + 1) - 1; start = decode_index_offset (p, offset_size); p += offset_size; for (i = 0; i < count; i++) { end = decode_index_offset (p, offset_size); p += offset_size; if (p > end_ptr) return CAIRO_INT_STATUS_UNSUPPORTED; element.length = end - start; element.is_copy = FALSE; element.data = data + start; status = _cairo_array_append (index, &element); if (status) return status; start = end; } p = data + end; } *ptr = p; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cff_index_write (cairo_array_t *index, cairo_array_t *output) { int offset_size; int offset; int num_elem; int i; cff_index_element_t *element; uint16_t count; unsigned char buf[5]; cairo_status_t status; num_elem = _cairo_array_num_elements (index); count = cpu_to_be16 ((uint16_t) num_elem); status = _cairo_array_append_multiple (output, &count, 2); if (status) return status; if (num_elem == 0) return CAIRO_STATUS_SUCCESS; /* Find maximum offset to determine offset size */ offset = 1; for (i = 0; i < num_elem; i++) { element = _cairo_array_index (index, i); offset += element->length; } if (offset < 0x100) offset_size = 1; else if (offset < 0x10000) offset_size = 2; else if (offset < 0x1000000) offset_size = 3; else offset_size = 4; buf[0] = (unsigned char) offset_size; status = _cairo_array_append (output, buf); if (status) return status; offset = 1; encode_index_offset (buf, offset_size, offset); status = _cairo_array_append_multiple (output, buf, offset_size); if (status) return status; for (i = 0; i < num_elem; i++) { element = _cairo_array_index (index, i); offset += element->length; encode_index_offset (buf, offset_size, offset); status = _cairo_array_append_multiple (output, buf, offset_size); if (status) return status; } for (i = 0; i < num_elem; i++) { element = _cairo_array_index (index, i); status = _cairo_array_append_multiple (output, element->data, element->length); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cff_index_append (cairo_array_t *index, unsigned char *object , int length) { cff_index_element_t element; element.length = length; element.is_copy = FALSE; element.data = object; return _cairo_array_append (index, &element); } static cairo_status_t cff_index_append_copy (cairo_array_t *index, const unsigned char *object, unsigned int length) { cff_index_element_t element; cairo_status_t status; element.length = length; element.is_copy = TRUE; element.data = malloc (element.length); if (element.data == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (element.data, object, element.length); status = _cairo_array_append (index, &element); if (status) { free (element.data); return status; } return CAIRO_STATUS_SUCCESS; } static void cff_index_fini (cairo_array_t *index) { cff_index_element_t *element; int i; for (i = 0; i < _cairo_array_num_elements (index); i++) { element = _cairo_array_index (index, i); if (element->is_copy) free (element->data); } _cairo_array_fini (index); } static cairo_bool_t _cairo_cff_dict_equal (const void *key_a, const void *key_b) { const cff_dict_operator_t *op_a = key_a; const cff_dict_operator_t *op_b = key_b; return op_a->operator == op_b->operator; } static cairo_status_t cff_dict_init (cairo_hash_table_t **dict) { *dict = _cairo_hash_table_create (_cairo_cff_dict_equal); if (*dict == NULL) return CAIRO_STATUS_NO_MEMORY; return CAIRO_STATUS_SUCCESS; } static void _cairo_dict_init_key (cff_dict_operator_t *key, int operator) { key->base.hash = (unsigned long) operator; key->operator = operator; } static cairo_status_t cff_dict_create_operator (int operator, unsigned char *operand, int operand_length, cff_dict_operator_t **out) { cff_dict_operator_t *op; op = malloc (sizeof (cff_dict_operator_t)); if (op == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_dict_init_key (op, operator); op->operand = malloc (operand_length); if (op->operand == NULL) { free (op); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } memcpy (op->operand, operand, operand_length); op->operand_length = operand_length; op->operand_offset = -1; *out = op; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cff_dict_read (cairo_hash_table_t *dict, unsigned char *p, int dict_size) { unsigned char *end; cairo_array_t operands; cff_dict_operator_t *op; unsigned short operator; cairo_status_t status = CAIRO_STATUS_SUCCESS; int size; end = p + dict_size; _cairo_array_init (&operands, 1); while (p < end) { size = operand_length (p); if (size != 0) { status = _cairo_array_append_multiple (&operands, p, size); if (status) goto fail; p += size; } else { p = decode_operator (p, &operator); status = cff_dict_create_operator (operator, _cairo_array_index (&operands, 0), _cairo_array_num_elements (&operands), &op); if (status) goto fail; status = _cairo_hash_table_insert (dict, &op->base); if (status) goto fail; _cairo_array_truncate (&operands, 0); } } fail: _cairo_array_fini (&operands); return status; } static void cff_dict_remove (cairo_hash_table_t *dict, unsigned short operator) { cff_dict_operator_t key, *op; _cairo_dict_init_key (&key, operator); if (_cairo_hash_table_lookup (dict, &key.base, (cairo_hash_entry_t **) &op)) { free (op->operand); _cairo_hash_table_remove (dict, (cairo_hash_entry_t *) op); free (op); } } static unsigned char * cff_dict_get_operands (cairo_hash_table_t *dict, unsigned short operator, int *size) { cff_dict_operator_t key, *op; _cairo_dict_init_key (&key, operator); if (_cairo_hash_table_lookup (dict, &key.base, (cairo_hash_entry_t **) &op)) { *size = op->operand_length; return op->operand; } return NULL; } static cairo_status_t cff_dict_set_operands (cairo_hash_table_t *dict, unsigned short operator, unsigned char *operand, int size) { cff_dict_operator_t key, *op; cairo_status_t status; _cairo_dict_init_key (&key, operator); if (_cairo_hash_table_lookup (dict, &key.base, (cairo_hash_entry_t **) &op)) { free (op->operand); op->operand = malloc (size); if (op->operand == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (op->operand, operand, size); op->operand_length = size; } else { status = cff_dict_create_operator (operator, operand, size, &op); if (status) return status; status = _cairo_hash_table_insert (dict, &op->base); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static int cff_dict_get_location (cairo_hash_table_t *dict, unsigned short operator, int *size) { cff_dict_operator_t key, *op; _cairo_dict_init_key (&key, operator); if (_cairo_hash_table_lookup (dict, &key.base, (cairo_hash_entry_t **) &op)) { *size = op->operand_length; return op->operand_offset; } return -1; } typedef struct _dict_write_info { cairo_array_t *output; cairo_status_t status; } dict_write_info_t; static void cairo_dict_write_operator (cff_dict_operator_t *op, dict_write_info_t *write_info) { unsigned char data; op->operand_offset = _cairo_array_num_elements (write_info->output); write_info->status = _cairo_array_append_multiple (write_info->output, op->operand, op->operand_length); if (write_info->status) return; if (op->operator & 0xff00) { data = op->operator >> 8; write_info->status = _cairo_array_append (write_info->output, &data); if (write_info->status) return; } data = op->operator & 0xff; write_info->status = _cairo_array_append (write_info->output, &data); } static void _cairo_dict_collect (void *entry, void *closure) { dict_write_info_t *write_info = closure; cff_dict_operator_t *op = entry; if (write_info->status) return; /* The ROS operator is handled separately in cff_dict_write() */ if (op->operator != ROS_OP) cairo_dict_write_operator (op, write_info); } static cairo_status_t cff_dict_write (cairo_hash_table_t *dict, cairo_array_t *output) { dict_write_info_t write_info; cff_dict_operator_t key, *op; write_info.output = output; write_info.status = CAIRO_STATUS_SUCCESS; /* The CFF specification requires that the Top Dict of CID fonts * begin with the ROS operator. */ _cairo_dict_init_key (&key, ROS_OP); if (_cairo_hash_table_lookup (dict, &key.base, (cairo_hash_entry_t **) &op)) cairo_dict_write_operator (op, &write_info); _cairo_hash_table_foreach (dict, _cairo_dict_collect, &write_info); return write_info.status; } static void cff_dict_fini (cairo_hash_table_t *dict) { cff_dict_operator_t *entry; while (1) { entry = _cairo_hash_table_random_entry (dict, NULL); if (entry == NULL) break; free (entry->operand); _cairo_hash_table_remove (dict, (cairo_hash_entry_t *) entry); free (entry); } _cairo_hash_table_destroy (dict); } static cairo_int_status_t cairo_cff_font_read_header (cairo_cff_font_t *font) { if (font->data_length < sizeof (cff_header_t)) return CAIRO_INT_STATUS_UNSUPPORTED; font->header = (cff_header_t *) font->data; font->current_ptr = font->data + font->header->header_size; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_cff_font_read_name (cairo_cff_font_t *font) { cairo_array_t index; cairo_int_status_t status; /* The original font name is not used in the subset. Read the name * index to skip over it. */ cff_index_init (&index); status = cff_index_read (&index, &font->current_ptr, font->data_end); cff_index_fini (&index); return status; } static cairo_int_status_t cairo_cff_font_read_private_dict (cairo_cff_font_t *font, cairo_hash_table_t *private_dict, cairo_array_t *local_sub_index, unsigned char *ptr, int size) { cairo_int_status_t status; unsigned char buf[10]; unsigned char *end_buf; int offset; int i; unsigned char *operand; unsigned char *p; status = cff_dict_read (private_dict, ptr, size); if (status) return status; operand = cff_dict_get_operands (private_dict, LOCAL_SUB_OP, &i); if (operand) { decode_integer (operand, &offset); p = ptr + offset; status = cff_index_read (local_sub_index, &p, font->data_end); if (status) return status; /* Use maximum sized encoding to reserve space for later modification. */ end_buf = encode_integer_max (buf, 0); status = cff_dict_set_operands (private_dict, LOCAL_SUB_OP, buf, end_buf - buf); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_cff_font_read_fdselect (cairo_cff_font_t *font, unsigned char *p) { int type, num_ranges, first, last, fd, i, j; font->fdselect = calloc (font->num_glyphs, sizeof (int)); if (font->fdselect == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); type = *p++; if (type == 0) { for (i = 0; i < font->num_glyphs; i++) font->fdselect[i] = *p++; } else if (type == 3) { num_ranges = be16_to_cpu( *((uint16_t *)p) ); p += 2; for (i = 0; i < num_ranges; i++) { first = be16_to_cpu( *((uint16_t *)p) ); p += 2; fd = *p++; last = be16_to_cpu( *((uint16_t *)p) ); for (j = first; j < last; j++) font->fdselect[j] = fd; } } else { return CAIRO_INT_STATUS_UNSUPPORTED; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_cff_font_read_cid_fontdict (cairo_cff_font_t *font, unsigned char *ptr) { cairo_array_t index; cff_index_element_t *element; unsigned int i; int size; unsigned char *operand; int offset; cairo_int_status_t status; unsigned char buf[100]; unsigned char *end_buf; cff_index_init (&index); status = cff_index_read (&index, &ptr, font->data_end); if (status) goto fail; font->num_fontdicts = _cairo_array_num_elements (&index); font->fd_dict = calloc (sizeof (cairo_hash_table_t *), font->num_fontdicts); if (font->fd_dict == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail; } font->fd_private_dict = calloc (sizeof (cairo_hash_table_t *), font->num_fontdicts); if (font->fd_private_dict == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail; } font->fd_local_sub_index = calloc (sizeof (cairo_array_t), font->num_fontdicts); if (font->fd_local_sub_index == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail; } for (i = 0; i < font->num_fontdicts; i++) { status = cff_dict_init (&font->fd_dict[i]); if (status) goto fail; element = _cairo_array_index (&index, i); status = cff_dict_read (font->fd_dict[i], element->data, element->length); if (status) goto fail; operand = cff_dict_get_operands (font->fd_dict[i], PRIVATE_OP, &size); if (operand == NULL) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto fail; } operand = decode_integer (operand, &size); decode_integer (operand, &offset); status = cff_dict_init (&font->fd_private_dict[i]); if (status) goto fail; cff_index_init (&font->fd_local_sub_index[i]); status = cairo_cff_font_read_private_dict (font, font->fd_private_dict[i], &font->fd_local_sub_index[i], font->data + offset, size); if (status) goto fail; /* Set integer operand to max value to use max size encoding to reserve * space for any value later */ end_buf = encode_integer_max (buf, 0); end_buf = encode_integer_max (end_buf, 0); status = cff_dict_set_operands (font->fd_dict[i], PRIVATE_OP, buf, end_buf - buf); if (status) goto fail; } return CAIRO_STATUS_SUCCESS; fail: cff_index_fini (&index); return status; } static cairo_int_status_t cairo_cff_font_read_top_dict (cairo_cff_font_t *font) { cairo_array_t index; cff_index_element_t *element; unsigned char buf[20]; unsigned char *end_buf; unsigned char *operand; cairo_int_status_t status; unsigned char *p; int size; int offset; cff_index_init (&index); status = cff_index_read (&index, &font->current_ptr, font->data_end); if (status) goto fail; element = _cairo_array_index (&index, 0); status = cff_dict_read (font->top_dict, element->data, element->length); if (status) goto fail; if (cff_dict_get_operands (font->top_dict, ROS_OP, &size) != NULL) font->is_cid = TRUE; else font->is_cid = FALSE; operand = cff_dict_get_operands (font->top_dict, CHARSTRINGS_OP, &size); decode_integer (operand, &offset); p = font->data + offset; status = cff_index_read (&font->charstrings_index, &p, font->data_end); if (status) goto fail; font->num_glyphs = _cairo_array_num_elements (&font->charstrings_index); if (font->is_cid) { operand = cff_dict_get_operands (font->top_dict, FDSELECT_OP, &size); decode_integer (operand, &offset); status = cairo_cff_font_read_fdselect (font, font->data + offset); if (status) goto fail; operand = cff_dict_get_operands (font->top_dict, FDARRAY_OP, &size); decode_integer (operand, &offset); status = cairo_cff_font_read_cid_fontdict (font, font->data + offset); if (status) goto fail; } else { operand = cff_dict_get_operands (font->top_dict, PRIVATE_OP, &size); operand = decode_integer (operand, &size); decode_integer (operand, &offset); status = cairo_cff_font_read_private_dict (font, font->private_dict, &font->local_sub_index, font->data + offset, size); if (status) goto fail; } /* Use maximum sized encoding to reserve space for later modification. */ end_buf = encode_integer_max (buf, 0); status = cff_dict_set_operands (font->top_dict, CHARSTRINGS_OP, buf, end_buf - buf); if (status) goto fail; status = cff_dict_set_operands (font->top_dict, FDSELECT_OP, buf, end_buf - buf); if (status) goto fail; status = cff_dict_set_operands (font->top_dict, FDARRAY_OP, buf, end_buf - buf); if (status) goto fail; status = cff_dict_set_operands (font->top_dict, CHARSET_OP, buf, end_buf - buf); if (status) goto fail; cff_dict_remove (font->top_dict, ENCODING_OP); cff_dict_remove (font->top_dict, PRIVATE_OP); /* Remove the unique identifier operators as the subsetted font is * not the same is the original font. */ cff_dict_remove (font->top_dict, UNIQUEID_OP); cff_dict_remove (font->top_dict, XUID_OP); fail: cff_index_fini (&index); return status; } static cairo_int_status_t cairo_cff_font_read_strings (cairo_cff_font_t *font) { return cff_index_read (&font->strings_index, &font->current_ptr, font->data_end); } static cairo_int_status_t cairo_cff_font_read_global_subroutines (cairo_cff_font_t *font) { return cff_index_read (&font->global_sub_index, &font->current_ptr, font->data_end); } typedef cairo_int_status_t (*font_read_t) (cairo_cff_font_t *font); static const font_read_t font_read_funcs[] = { cairo_cff_font_read_header, cairo_cff_font_read_name, cairo_cff_font_read_top_dict, cairo_cff_font_read_strings, cairo_cff_font_read_global_subroutines, }; static cairo_int_status_t cairo_cff_font_read_font (cairo_cff_font_t *font) { cairo_int_status_t status; unsigned int i; for (i = 0; i < ARRAY_LENGTH (font_read_funcs); i++) { status = font_read_funcs[i] (font); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_set_ros_strings (cairo_cff_font_t *font) { cairo_status_t status; unsigned char buf[30]; unsigned char *p; int sid1, sid2; const char *registry = "Adobe"; const char *ordering = "Identity"; sid1 = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); status = cff_index_append_copy (&font->strings_subset_index, (unsigned char *)registry, strlen(registry)); if (status) return status; sid2 = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); status = cff_index_append_copy (&font->strings_subset_index, (unsigned char *)ordering, strlen(ordering)); if (status) return status; p = encode_integer (buf, sid1); p = encode_integer (p, sid2); p = encode_integer (p, 0); status = cff_dict_set_operands (font->top_dict, ROS_OP, buf, p - buf); if (status) return status; p = encode_integer (buf, font->scaled_font_subset->num_glyphs); status = cff_dict_set_operands (font->top_dict, CIDCOUNT_OP, buf, p - buf); if (status) return status; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_subset_dict_string(cairo_cff_font_t *font, cairo_hash_table_t *dict, int operator) { int size; unsigned char *p; int sid; unsigned char buf[100]; cff_index_element_t *element; cairo_status_t status; p = cff_dict_get_operands (dict, operator, &size); if (!p) return CAIRO_STATUS_SUCCESS; decode_integer (p, &sid); if (sid < NUM_STD_STRINGS) return CAIRO_STATUS_SUCCESS; element = _cairo_array_index (&font->strings_index, sid - NUM_STD_STRINGS); sid = NUM_STD_STRINGS + _cairo_array_num_elements (&font->strings_subset_index); status = cff_index_append (&font->strings_subset_index, element->data, element->length); if (status) return status; p = encode_integer (buf, sid); status = cff_dict_set_operands (dict, operator, buf, p - buf); if (status) return status; return CAIRO_STATUS_SUCCESS; } static const int dict_strings[] = { VERSION_OP, NOTICE_OP, COPYRIGHT_OP, FULLNAME_OP, FAMILYNAME_OP, WEIGHT_OP, POSTSCRIPT_OP, BASEFONTNAME_OP, FONTNAME_OP, }; static cairo_status_t cairo_cff_font_subset_dict_strings (cairo_cff_font_t *font, cairo_hash_table_t *dict) { cairo_status_t status; unsigned int i; for (i = 0; i < ARRAY_LENGTH (dict_strings); i++) { status = cairo_cff_font_subset_dict_string (font, dict, dict_strings[i]); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_subset_charstrings (cairo_cff_font_t *font) { cff_index_element_t *element; unsigned int i; cairo_status_t status; for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { element = _cairo_array_index (&font->charstrings_index, font->scaled_font_subset->glyphs[i]); status = cff_index_append (&font->charstrings_subset_index, element->data, element->length); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_subset_fontdict (cairo_cff_font_t *font) { unsigned int i; int fd; int *reverse_map; font->fdselect_subset = calloc (font->scaled_font_subset->num_glyphs, sizeof (int)); if (font->fdselect_subset == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->fd_subset_map = calloc (font->num_fontdicts, sizeof (int)); if (font->fd_subset_map == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->private_dict_offset = calloc (font->num_fontdicts, sizeof (int)); if (font->private_dict_offset == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); reverse_map = calloc (font->num_fontdicts, sizeof (int)); if (reverse_map == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < font->num_fontdicts; i++) reverse_map[i] = -1; font->num_subset_fontdicts = 0; for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { fd = font->fdselect[font->scaled_font_subset->glyphs[i]]; if (reverse_map[fd] < 0) { font->fd_subset_map[font->num_subset_fontdicts] = fd; reverse_map[fd] = font->num_subset_fontdicts++; } font->fdselect_subset[i] = reverse_map[fd]; } free (reverse_map); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_create_cid_fontdict (cairo_cff_font_t *font) { unsigned char buf[100]; unsigned char *end_buf; cairo_status_t status; font->num_fontdicts = 1; font->fd_dict = malloc (sizeof (cairo_hash_table_t *)); if (font->fd_dict == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (cff_dict_init (&font->fd_dict[0])) { free (font->fd_dict); font->fd_dict = NULL; font->num_fontdicts = 0; return _cairo_error (CAIRO_STATUS_NO_MEMORY); } font->fd_subset_map = malloc (sizeof (int)); if (font->fd_subset_map == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->private_dict_offset = malloc (sizeof (int)); if (font->private_dict_offset == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->fd_subset_map[0] = 0; font->num_subset_fontdicts = 1; /* Set integer operand to max value to use max size encoding to reserve * space for any value later */ end_buf = encode_integer_max (buf, 0); end_buf = encode_integer_max (end_buf, 0); status = cff_dict_set_operands (font->fd_dict[0], PRIVATE_OP, buf, end_buf - buf); if (status) return status; return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_subset_strings (cairo_cff_font_t *font) { cairo_status_t status; unsigned int i; status = cairo_cff_font_subset_dict_strings (font, font->top_dict); if (status) return status; if (font->is_cid) { for (i = 0; i < font->num_subset_fontdicts; i++) { status = cairo_cff_font_subset_dict_strings (font, font->fd_dict[font->fd_subset_map[i]]); if (status) return status; status = cairo_cff_font_subset_dict_strings (font, font->fd_private_dict[font->fd_subset_map[i]]); if (status) return status; } } else { status = cairo_cff_font_subset_dict_strings (font, font->private_dict); } return status; } static cairo_status_t cairo_cff_font_subset_font (cairo_cff_font_t *font) { cairo_status_t status; status = cairo_cff_font_set_ros_strings (font); if (status) return status; status = cairo_cff_font_subset_charstrings (font); if (status) return status; if (font->is_cid) status = cairo_cff_font_subset_fontdict (font); else status = cairo_cff_font_create_cid_fontdict (font); if (status) return status; status = cairo_cff_font_subset_strings (font); if (status) return status; return status; } /* Set the operand of the specified operator in the (already written) * top dict to point to the current position in the output * array. Operands updated with this function must have previously * been encoded with the 5-byte (max) integer encoding. */ static void cairo_cff_font_set_topdict_operator_to_cur_pos (cairo_cff_font_t *font, int operator) { int cur_pos; int offset; int size; unsigned char buf[10]; unsigned char *buf_end; unsigned char *op_ptr; cur_pos = _cairo_array_num_elements (&font->output); buf_end = encode_integer_max (buf, cur_pos); offset = cff_dict_get_location (font->top_dict, operator, &size); assert (offset > 0); op_ptr = _cairo_array_index (&font->output, offset); memcpy (op_ptr, buf, buf_end - buf); } static cairo_status_t cairo_cff_font_write_header (cairo_cff_font_t *font) { return _cairo_array_append_multiple (&font->output, font->header, font->header->header_size); } static cairo_status_t cairo_cff_font_write_name (cairo_cff_font_t *font) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_array_t index; cff_index_init (&index); status = cff_index_append_copy (&index, (unsigned char *) font->subset_font_name, strlen(font->subset_font_name)); if (status) goto FAIL; status = cff_index_write (&index, &font->output); if (status) goto FAIL; FAIL: cff_index_fini (&index); return status; } static cairo_status_t cairo_cff_font_write_top_dict (cairo_cff_font_t *font) { uint16_t count; unsigned char buf[10]; unsigned char *p; int offset_index; int dict_start, dict_size; int offset_size = 4; cairo_status_t status; /* Write an index containing the top dict */ count = cpu_to_be16 (1); status = _cairo_array_append_multiple (&font->output, &count, 2); if (status) return status; buf[0] = offset_size; status = _cairo_array_append (&font->output, buf); if (status) return status; encode_index_offset (buf, offset_size, 1); status = _cairo_array_append_multiple (&font->output, buf, offset_size); if (status) return status; /* Reserve space for last element of offset array and update after * dict is written */ offset_index = _cairo_array_num_elements (&font->output); status = _cairo_array_append_multiple (&font->output, buf, offset_size); if (status) return status; dict_start = _cairo_array_num_elements (&font->output); status = cff_dict_write (font->top_dict, &font->output); if (status) return status; dict_size = _cairo_array_num_elements (&font->output) - dict_start; encode_index_offset (buf, offset_size, dict_size + 1); p = _cairo_array_index (&font->output, offset_index); memcpy (p, buf, offset_size); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_strings (cairo_cff_font_t *font) { return cff_index_write (&font->strings_subset_index, &font->output); } static cairo_status_t cairo_cff_font_write_global_subrs (cairo_cff_font_t *font) { return cff_index_write (&font->global_sub_index, &font->output); } static cairo_status_t cairo_cff_font_write_fdselect (cairo_cff_font_t *font) { unsigned char data; unsigned int i; cairo_int_status_t status; cairo_cff_font_set_topdict_operator_to_cur_pos (font, FDSELECT_OP); if (font->is_cid) { data = 0; status = _cairo_array_append (&font->output, &data); if (status) return status; for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { data = font->fdselect_subset[i]; status = _cairo_array_append (&font->output, &data); if (status) return status; } } else { unsigned char byte; uint16_t word; status = _cairo_array_grow_by (&font->output, 9); if (status) return status; byte = 3; status = _cairo_array_append (&font->output, &byte); assert (status == CAIRO_STATUS_SUCCESS); word = cpu_to_be16 (1); status = _cairo_array_append_multiple (&font->output, &word, 2); assert (status == CAIRO_STATUS_SUCCESS); word = cpu_to_be16 (0); status = _cairo_array_append_multiple (&font->output, &word, 2); assert (status == CAIRO_STATUS_SUCCESS); byte = 0; status = _cairo_array_append (&font->output, &byte); assert (status == CAIRO_STATUS_SUCCESS); word = cpu_to_be16 (font->scaled_font_subset->num_glyphs); status = _cairo_array_append_multiple (&font->output, &word, 2); assert (status == CAIRO_STATUS_SUCCESS); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_charset (cairo_cff_font_t *font) { unsigned char byte; uint16_t word; cairo_status_t status; cairo_cff_font_set_topdict_operator_to_cur_pos (font, CHARSET_OP); status = _cairo_array_grow_by (&font->output, 5); if (status) return status; byte = 2; status = _cairo_array_append (&font->output, &byte); assert (status == CAIRO_STATUS_SUCCESS); word = cpu_to_be16 (1); status = _cairo_array_append_multiple (&font->output, &word, 2); assert (status == CAIRO_STATUS_SUCCESS); word = cpu_to_be16 (font->scaled_font_subset->num_glyphs - 2); status = _cairo_array_append_multiple (&font->output, &word, 2); assert (status == CAIRO_STATUS_SUCCESS); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_charstrings (cairo_cff_font_t *font) { cairo_cff_font_set_topdict_operator_to_cur_pos (font, CHARSTRINGS_OP); return cff_index_write (&font->charstrings_subset_index, &font->output); } static cairo_status_t cairo_cff_font_write_cid_fontdict (cairo_cff_font_t *font) { unsigned int i; cairo_int_status_t status; uint32_t *offset_array; int offset_base; uint16_t count; uint8_t offset_size = 4; cairo_cff_font_set_topdict_operator_to_cur_pos (font, FDARRAY_OP); count = cpu_to_be16 (font->num_subset_fontdicts); status = _cairo_array_append_multiple (&font->output, &count, sizeof (uint16_t)); if (status) return status; status = _cairo_array_append (&font->output, &offset_size); if (status) return status; status = _cairo_array_allocate (&font->output, (font->num_subset_fontdicts + 1)*offset_size, (void **) &offset_array); if (status) return status; offset_base = _cairo_array_num_elements (&font->output) - 1; *offset_array++ = cpu_to_be32(1); for (i = 0; i < font->num_subset_fontdicts; i++) { status = cff_dict_write (font->fd_dict[font->fd_subset_map[i]], &font->output); if (status) return status; *offset_array++ = cpu_to_be32(_cairo_array_num_elements (&font->output) - offset_base); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_private_dict (cairo_cff_font_t *font, int dict_num, cairo_hash_table_t *parent_dict, cairo_hash_table_t *private_dict) { int offset; int size; unsigned char buf[10]; unsigned char *buf_end; unsigned char *p; cairo_status_t status; /* Write private dict and update offset and size in top dict */ font->private_dict_offset[dict_num] = _cairo_array_num_elements (&font->output); status = cff_dict_write (private_dict, &font->output); if (status) return status; size = _cairo_array_num_elements (&font->output) - font->private_dict_offset[dict_num]; /* private entry has two operands - size and offset */ buf_end = encode_integer_max (buf, size); buf_end = encode_integer_max (buf_end, font->private_dict_offset[dict_num]); offset = cff_dict_get_location (parent_dict, PRIVATE_OP, &size); assert (offset > 0); p = _cairo_array_index (&font->output, offset); memcpy (p, buf, buf_end - buf); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_local_sub (cairo_cff_font_t *font, int dict_num, cairo_hash_table_t *private_dict, cairo_array_t *local_sub_index) { int offset; int size; unsigned char buf[10]; unsigned char *buf_end; unsigned char *p; cairo_status_t status; if (_cairo_array_num_elements (local_sub_index) > 0) { /* Write local subroutines and update offset in private * dict. Local subroutines offset is relative to start of * private dict */ offset = _cairo_array_num_elements (&font->output) - font->private_dict_offset[dict_num]; buf_end = encode_integer_max (buf, offset); offset = cff_dict_get_location (private_dict, LOCAL_SUB_OP, &size); assert (offset > 0); p = _cairo_array_index (&font->output, offset); memcpy (p, buf, buf_end - buf); status = cff_index_write (local_sub_index, &font->output); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_cff_font_write_cid_private_dict_and_local_sub (cairo_cff_font_t *font) { unsigned int i; cairo_int_status_t status; if (font->is_cid) { for (i = 0; i < font->num_subset_fontdicts; i++) { status = cairo_cff_font_write_private_dict ( font, i, font->fd_dict[font->fd_subset_map[i]], font->fd_private_dict[font->fd_subset_map[i]]); if (status) return status; } for (i = 0; i < font->num_subset_fontdicts; i++) { status = cairo_cff_font_write_local_sub ( font, i, font->fd_private_dict[font->fd_subset_map[i]], &font->fd_local_sub_index[font->fd_subset_map[i]]); if (status) return status; } } else { status = cairo_cff_font_write_private_dict (font, 0, font->fd_dict[0], font->private_dict); if (status) return status; status = cairo_cff_font_write_local_sub (font, 0, font->private_dict, &font->local_sub_index); if (status) return status; } return CAIRO_STATUS_SUCCESS; } typedef cairo_status_t (*font_write_t) (cairo_cff_font_t *font); static const font_write_t font_write_funcs[] = { cairo_cff_font_write_header, cairo_cff_font_write_name, cairo_cff_font_write_top_dict, cairo_cff_font_write_strings, cairo_cff_font_write_global_subrs, cairo_cff_font_write_charset, cairo_cff_font_write_fdselect, cairo_cff_font_write_charstrings, cairo_cff_font_write_cid_fontdict, cairo_cff_font_write_cid_private_dict_and_local_sub, }; static cairo_status_t cairo_cff_font_write_subset (cairo_cff_font_t *font) { cairo_int_status_t status; unsigned int i; for (i = 0; i < ARRAY_LENGTH (font_write_funcs); i++) { status = font_write_funcs[i] (font); if (status) return status; } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_cff_font_generate (cairo_cff_font_t *font, const char **data, unsigned long *length) { cairo_int_status_t status; status = cairo_cff_font_read_font (font); if (status) return status; status = cairo_cff_font_subset_font (font); if (status) return status; status = cairo_cff_font_write_subset (font); if (status) return status; *data = _cairo_array_index (&font->output, 0); *length = _cairo_array_num_elements (&font->output); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_cff_font_create_set_widths (cairo_cff_font_t *font) { unsigned long size; unsigned long long_entry_size; unsigned long short_entry_size; unsigned int i; tt_hhea_t hhea; int num_hmetrics; unsigned char buf[10]; int glyph_index; cairo_int_status_t status; size = sizeof (tt_hhea_t); status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hhea, 0, (unsigned char*) &hhea, &size); if (status) return status; num_hmetrics = be16_to_cpu (hhea.num_hmetrics); for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { glyph_index = font->scaled_font_subset->glyphs[i]; long_entry_size = 2 * sizeof (int16_t); short_entry_size = sizeof (int16_t); if (glyph_index < num_hmetrics) { status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hmtx, glyph_index * long_entry_size, buf, &short_entry_size); if (status) return status; } else { status = font->backend->load_truetype_table (font->scaled_font_subset->scaled_font, TT_TAG_hmtx, (num_hmetrics - 1) * long_entry_size, buf, &short_entry_size); if (status) return status; } font->widths[i] = be16_to_cpu (*((int16_t*)buf)); } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_cff_font_create (cairo_scaled_font_subset_t *scaled_font_subset, cairo_cff_font_t **font_return, const char *subset_name) { const cairo_scaled_font_backend_t *backend; cairo_status_t status; cairo_cff_font_t *font; tt_head_t head; tt_hhea_t hhea; tt_name_t *name; tt_name_record_t *record; unsigned long size, data_length; int i, j; backend = scaled_font_subset->scaled_font->backend; if (!backend->load_truetype_table) return CAIRO_INT_STATUS_UNSUPPORTED; data_length = 0; status = backend->load_truetype_table( scaled_font_subset->scaled_font, TT_TAG_CFF, 0, NULL, &data_length); if (status) return status; size = sizeof (tt_head_t); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_head, 0, (unsigned char *) &head, &size); if (status) return status; size = sizeof (tt_hhea_t); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_hhea, 0, (unsigned char *) &hhea, &size); if (status) return status; size = 0; status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_hmtx, 0, NULL, &size); if (status) return status; size = 0; status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_name, 0, NULL, &size); if (status) return status; name = malloc (size); if (name == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = backend->load_truetype_table (scaled_font_subset->scaled_font, TT_TAG_name, 0, (unsigned char *) name, &size); if (status) goto fail1; font = malloc (sizeof (cairo_cff_font_t)); if (font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } font->backend = backend; font->scaled_font_subset = scaled_font_subset; _cairo_array_init (&font->output, sizeof (char)); status = _cairo_array_grow_by (&font->output, 4096); if (status) goto fail2; font->subset_font_name = strdup (subset_name); if (font->subset_font_name == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } font->x_min = (int16_t) be16_to_cpu (head.x_min); font->y_min = (int16_t) be16_to_cpu (head.y_min); font->x_max = (int16_t) be16_to_cpu (head.x_max); font->y_max = (int16_t) be16_to_cpu (head.y_max); font->ascent = (int16_t) be16_to_cpu (hhea.ascender); font->descent = (int16_t) be16_to_cpu (hhea.descender); /* Extract the font name from the name table. At present this * just looks for the Mac platform/Roman encoded font name. It * should be extended to use any suitable font name in the * name table. If the mac/roman font name is not found a * CairoFont-x-y name is created. */ font->font_name = NULL; for (i = 0; i < be16_to_cpu(name->num_records); i++) { record = &(name->records[i]); if ((be16_to_cpu (record->platform) == 1) && (be16_to_cpu (record->encoding) == 0) && (be16_to_cpu (record->name) == 4)) { font->font_name = malloc (be16_to_cpu(record->length) + 1); if (font->font_name) { strncpy(font->font_name, ((char*)name) + be16_to_cpu (name->strings_offset) + be16_to_cpu (record->offset), be16_to_cpu (record->length)); font->font_name[be16_to_cpu (record->length)] = 0; } break; } } if (font->font_name == NULL) { font->font_name = malloc (30); if (font->font_name == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } snprintf(font->font_name, 30, "CairoFont-%u-%u", scaled_font_subset->font_id, scaled_font_subset->subset_id); } for (i = 0, j = 0; font->font_name[j]; j++) { if (font->font_name[j] == ' ') continue; font->font_name[i++] = font->font_name[j]; } font->font_name[i] = '\0'; font->widths = calloc (font->scaled_font_subset->num_glyphs, sizeof (int)); if (font->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail4; } status = cairo_cff_font_create_set_widths (font); if (status) goto fail5; font->data_length = data_length; font->data = malloc (data_length); if (font->data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail5; } status = font->backend->load_truetype_table ( font->scaled_font_subset->scaled_font, TT_TAG_CFF, 0, font->data, &font->data_length); if (status) goto fail6; font->data_end = font->data + font->data_length; status = cff_dict_init (&font->top_dict); if (status) goto fail6; status = cff_dict_init (&font->private_dict); if (status) goto fail7; cff_index_init (&font->strings_index); cff_index_init (&font->charstrings_index); cff_index_init (&font->global_sub_index); cff_index_init (&font->local_sub_index); cff_index_init (&font->charstrings_subset_index); cff_index_init (&font->strings_subset_index); font->fdselect = NULL; font->fd_dict = NULL; font->fd_private_dict = NULL; font->fd_local_sub_index = NULL; font->fdselect_subset = NULL; font->fd_subset_map = NULL; font->private_dict_offset = NULL; free (name); *font_return = font; return CAIRO_STATUS_SUCCESS; fail7: _cairo_hash_table_destroy (font->top_dict); fail6: free (font->data); fail5: free (font->widths); fail4: free (font->font_name); fail3: free (font->subset_font_name); fail2: _cairo_array_fini (&font->output); free (font); fail1: free (name); return status; } static void cairo_cff_font_destroy (cairo_cff_font_t *font) { unsigned int i; free (font->widths); free (font->font_name); free (font->subset_font_name); _cairo_array_fini (&font->output); cff_dict_fini (font->top_dict); cff_dict_fini (font->private_dict); cff_index_fini (&font->strings_index); cff_index_fini (&font->charstrings_index); cff_index_fini (&font->global_sub_index); cff_index_fini (&font->local_sub_index); cff_index_fini (&font->charstrings_subset_index); cff_index_fini (&font->strings_subset_index); /* If we bailed out early as a result of an error some of the * following cairo_cff_font_t members may still be NULL */ if (font->fd_dict) { for (i = 0; i < font->num_fontdicts; i++) { if (font->fd_dict[i]) cff_dict_fini (font->fd_dict[i]); } free (font->fd_dict); } if (font->fd_subset_map) free (font->fd_subset_map); if (font->private_dict_offset) free (font->private_dict_offset); if (font->is_cid) { if (font->fdselect) free (font->fdselect); if (font->fdselect_subset) free (font->fdselect_subset); if (font->fd_private_dict) { for (i = 0; i < font->num_fontdicts; i++) { if (font->fd_private_dict[i]) cff_dict_fini (font->fd_private_dict[i]); } free (font->fd_private_dict); } if (font->fd_local_sub_index) { for (i = 0; i < font->num_fontdicts; i++) cff_index_fini (&font->fd_local_sub_index[i]); free (font->fd_local_sub_index); } } if (font->data) free (font->data); free (font); } cairo_status_t _cairo_cff_subset_init (cairo_cff_subset_t *cff_subset, const char *subset_name, cairo_scaled_font_subset_t *font_subset) { cairo_cff_font_t *font = NULL; /* squelch bogus compiler warning */ cairo_status_t status; const char *data = NULL; /* squelch bogus compiler warning */ unsigned long length = 0; /* squelch bogus compiler warning */ unsigned int i; status = _cairo_cff_font_create (font_subset, &font, subset_name); if (status) return status; status = cairo_cff_font_generate (font, &data, &length); if (status) goto fail1; cff_subset->base_font = strdup (font->font_name); if (cff_subset->base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } cff_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs); if (cff_subset->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) cff_subset->widths[i] = font->widths[i]; cff_subset->x_min = font->x_min; cff_subset->y_min = font->y_min; cff_subset->x_max = font->x_max; cff_subset->y_max = font->y_max; cff_subset->ascent = font->ascent; cff_subset->descent = font->descent; cff_subset->data = malloc (length); if (cff_subset->data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } memcpy (cff_subset->data, data, length); cff_subset->data_length = length; cairo_cff_font_destroy (font); return CAIRO_STATUS_SUCCESS; fail3: free (cff_subset->widths); fail2: free (cff_subset->base_font); fail1: cairo_cff_font_destroy (font); return status; } void _cairo_cff_subset_fini (cairo_cff_subset_t *subset) { free (subset->base_font); free (subset->widths); free (subset->data); } static cairo_int_status_t _cairo_cff_font_fallback_create (cairo_scaled_font_subset_t *scaled_font_subset, cairo_cff_font_t **font_return, const char *subset_name) { cairo_status_t status; cairo_cff_font_t *font; font = malloc (sizeof (cairo_cff_font_t)); if (font == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->backend = NULL; font->scaled_font_subset = scaled_font_subset; _cairo_array_init (&font->output, sizeof (char)); status = _cairo_array_grow_by (&font->output, 4096); if (status) goto fail1; font->subset_font_name = strdup (subset_name); if (font->subset_font_name == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } font->font_name = strdup (subset_name); if (font->subset_font_name == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } font->x_min = 0; font->y_min = 0; font->x_max = 0; font->y_max = 0; font->ascent = 0; font->descent = 0; font->widths = calloc (font->scaled_font_subset->num_glyphs, sizeof (int)); if (font->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } font->data_length = 0; font->data = NULL; font->data_end = NULL; status = cff_dict_init (&font->top_dict); if (status) goto fail4; status = cff_dict_init (&font->private_dict); if (status) goto fail5; cff_index_init (&font->strings_index); cff_index_init (&font->charstrings_index); cff_index_init (&font->global_sub_index); cff_index_init (&font->local_sub_index); cff_index_init (&font->charstrings_subset_index); cff_index_init (&font->strings_subset_index); font->fdselect = NULL; font->fd_dict = NULL; font->fd_private_dict = NULL; font->fd_local_sub_index = NULL; font->fdselect_subset = NULL; font->fd_subset_map = NULL; font->private_dict_offset = NULL; *font_return = font; return CAIRO_STATUS_SUCCESS; fail5: _cairo_hash_table_destroy (font->top_dict); fail4: free (font->widths); fail3: free (font->font_name); fail2: free (font->subset_font_name); fail1: _cairo_array_fini (&font->output); free (font); return status; } static cairo_int_status_t cairo_cff_font_fallback_generate (cairo_cff_font_t *font, cairo_type2_charstrings_t *type2_subset, const char **data, unsigned long *length) { cairo_int_status_t status; cff_header_t header; cairo_array_t *charstring; unsigned char buf[40]; unsigned char *end_buf; unsigned int i; /* Create header */ header.major = 1; header.minor = 0; header.header_size = 4; header.offset_size = 4; font->header = &header; /* Create Top Dict */ font->is_cid = FALSE; end_buf = encode_integer (buf, type2_subset->x_min); end_buf = encode_integer (end_buf, type2_subset->y_min); end_buf = encode_integer (end_buf, type2_subset->x_max); end_buf = encode_integer (end_buf, type2_subset->y_max); status = cff_dict_set_operands (font->top_dict, FONTBBOX_OP, buf, end_buf - buf); if (status) return status; end_buf = encode_integer_max (buf, 0); status = cff_dict_set_operands (font->top_dict, CHARSTRINGS_OP, buf, end_buf - buf); if (status) return status; status = cff_dict_set_operands (font->top_dict, FDSELECT_OP, buf, end_buf - buf); if (status) return status; status = cff_dict_set_operands (font->top_dict, FDARRAY_OP, buf, end_buf - buf); if (status) return status; status = cff_dict_set_operands (font->top_dict, CHARSET_OP, buf, end_buf - buf); if (status) return status; status = cairo_cff_font_set_ros_strings (font); if (status) return status; /* Create CID FD dictionary */ status = cairo_cff_font_create_cid_fontdict (font); if (status) return status; /* Create charstrings */ for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { charstring = _cairo_array_index(&type2_subset->charstrings, i); status = cff_index_append (&font->charstrings_subset_index, _cairo_array_index (charstring, 0), _cairo_array_num_elements (charstring)); if (status) return status; } status = cairo_cff_font_write_subset (font); if (status) return status; *data = _cairo_array_index (&font->output, 0); *length = _cairo_array_num_elements (&font->output); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_cff_fallback_init (cairo_cff_subset_t *cff_subset, const char *subset_name, cairo_scaled_font_subset_t *font_subset) { cairo_cff_font_t *font = NULL; /* squelch bogus compiler warning */ cairo_status_t status; const char *data = NULL; /* squelch bogus compiler warning */ unsigned long length = 0; /* squelch bogus compiler warning */ unsigned int i; cairo_type2_charstrings_t type2_subset; status = _cairo_cff_font_fallback_create (font_subset, &font, subset_name); if (status) return status; status = _cairo_type2_charstrings_init (&type2_subset, font_subset); if (status) goto fail1; status = cairo_cff_font_fallback_generate (font, &type2_subset, &data, &length); if (status) goto fail2; cff_subset->base_font = strdup (font->font_name); if (cff_subset->base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } cff_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs); if (cff_subset->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) cff_subset->widths[i] = type2_subset.widths[i]; cff_subset->x_min = type2_subset.x_min; cff_subset->y_min = type2_subset.y_min; cff_subset->x_max = type2_subset.x_max; cff_subset->y_max = type2_subset.y_max; cff_subset->ascent = type2_subset.y_max; cff_subset->descent = type2_subset.y_min; cff_subset->data = malloc (length); if (cff_subset->data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail4; } memcpy (cff_subset->data, data, length); cff_subset->data_length = length; cff_subset->data_length = length; _cairo_type2_charstrings_fini (&type2_subset); cairo_cff_font_destroy (font); return CAIRO_STATUS_SUCCESS; fail4: free (cff_subset->widths); fail3: free (cff_subset->base_font); fail2: _cairo_type2_charstrings_fini (&type2_subset); fail1: cairo_cff_font_destroy (font); return status; } void _cairo_cff_fallback_fini (cairo_cff_subset_t *subset) { free (subset->base_font); free (subset->widths); free (subset->data); } libgdiplus-2.11/cairo/src/test-meta-surface.c0000664000175000017500000002473112225470167016114 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ /* This isn't a "real" surface, but just something to be used by the * test suite to help exercise the meta-surface paths in cairo. * * The defining feature of this backend is that it uses a meta surface * to record all operations, and then replays everything to an image * surface. * * It's possible that this code might serve as a good starting point * for someone working on bringing up a new meta-surface-based * backend. */ #include "cairoint.h" #include "test-meta-surface.h" #include "cairo-meta-surface-private.h" typedef struct _test_meta_surface { cairo_surface_t base; /* This is a cairo_meta_surface to record all operations. */ cairo_surface_t *meta; /* And this is a cairo_image_surface to hold the final result. */ cairo_surface_t *image; cairo_bool_t image_reflects_meta; } test_meta_surface_t; static const cairo_surface_backend_t test_meta_surface_backend; static cairo_int_status_t _test_meta_surface_show_page (void *abstract_surface); cairo_surface_t * _cairo_test_meta_surface_create (cairo_content_t content, int width, int height) { test_meta_surface_t *surface; cairo_status_t status; surface = malloc (sizeof (test_meta_surface_t)); if (surface == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } _cairo_surface_init (&surface->base, &test_meta_surface_backend, content); surface->meta = _cairo_meta_surface_create (content, width, height); status = cairo_surface_status (surface->meta); if (status) goto FAIL_CLEANUP_SURFACE; surface->image = _cairo_image_surface_create_with_content (content, width, height); status = cairo_surface_status (surface->image); if (status) goto FAIL_CLEANUP_META; surface->image_reflects_meta = FALSE; return &surface->base; FAIL_CLEANUP_META: cairo_surface_destroy (surface->meta); FAIL_CLEANUP_SURFACE: free (surface); FAIL: return _cairo_surface_create_in_error (status); } static cairo_status_t _test_meta_surface_finish (void *abstract_surface) { test_meta_surface_t *surface = abstract_surface; cairo_surface_destroy (surface->meta); cairo_surface_destroy (surface->image); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _test_meta_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { test_meta_surface_t *surface = abstract_surface; cairo_status_t status; if (! surface->image_reflects_meta) { status = _test_meta_surface_show_page (abstract_surface); if (status) return status; } return _cairo_surface_acquire_source_image (surface->image, image_out, image_extra); } static void _test_meta_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { test_meta_surface_t *surface = abstract_surface; _cairo_surface_release_source_image (surface->image, image, image_extra); } static cairo_int_status_t _test_meta_surface_show_page (void *abstract_surface) { test_meta_surface_t *surface = abstract_surface; cairo_status_t status; if (surface->image_reflects_meta) return CAIRO_STATUS_SUCCESS; status = _cairo_meta_surface_replay (surface->meta, surface->image); if (status) return status; surface->image_reflects_meta = TRUE; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _test_meta_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { test_meta_surface_t *surface = abstract_surface; return _cairo_surface_intersect_clip_path (surface->meta, path, fill_rule, tolerance, antialias); } static cairo_int_status_t _test_meta_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { test_meta_surface_t *surface = abstract_surface; surface->image_reflects_meta = FALSE; return _cairo_surface_get_extents (surface->image, rectangle); } static cairo_int_status_t _test_meta_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { test_meta_surface_t *surface = abstract_surface; surface->image_reflects_meta = FALSE; return _cairo_surface_paint (surface->meta, op, source); } static cairo_int_status_t _test_meta_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { test_meta_surface_t *surface = abstract_surface; surface->image_reflects_meta = FALSE; return _cairo_surface_mask (surface->meta, op, source, mask); } static cairo_int_status_t _test_meta_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { test_meta_surface_t *surface = abstract_surface; surface->image_reflects_meta = FALSE; return _cairo_surface_stroke (surface->meta, op, source, path, style, ctm, ctm_inverse, tolerance, antialias); } static cairo_int_status_t _test_meta_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { test_meta_surface_t *surface = abstract_surface; surface->image_reflects_meta = FALSE; return _cairo_surface_fill (surface->meta, op, source, path, fill_rule, tolerance, antialias); } static cairo_int_status_t _test_meta_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { test_meta_surface_t *surface = abstract_surface; cairo_int_status_t status; surface->image_reflects_meta = FALSE; /* Since this is a "wrapping" surface, we're calling back into * _cairo_surface_show_glyphs from within a call to the same. * Since _cairo_surface_show_glyphs acquires a mutex, we release * and re-acquire the mutex around this nested call. * * Yes, this is ugly, but we consider it pragmatic as compared to * adding locking code to all 18 surface-backend-specific * show_glyphs functions, (which would get less testing and likely * lead to bugs). */ CAIRO_MUTEX_UNLOCK (scaled_font->mutex); status = _cairo_surface_show_glyphs (surface->meta, op, source, glyphs, num_glyphs, scaled_font); CAIRO_MUTEX_LOCK (scaled_font->mutex); return status; } static cairo_surface_t * _test_meta_surface_snapshot (void *abstract_other) { test_meta_surface_t *other = abstract_other; cairo_status_t status; /* XXX: Just making a snapshot of other->meta is what we really * want. But this currently triggers a bug somewhere (the "mask" * test from the test suite segfaults). * * For now, we'll create a new image surface and replay onto * that. It would be tempting to replay into other->image and then * return a snapshot of that, but that will cause the self-copy * test to fail, (since our replay will be affected by a clip that * should not have any effect on the use of the resulting snapshot * as a source). */ #if 0 return _cairo_surface_snapshot (other->meta); #else cairo_rectangle_int_t extents; cairo_surface_t *surface; status = _cairo_surface_get_extents (other->image, &extents); if (status) return _cairo_surface_create_in_error (status); surface = cairo_surface_create_similar (other->image, CAIRO_CONTENT_COLOR_ALPHA, extents.width, extents.height); status = _cairo_meta_surface_replay (other->meta, surface); if (status) { cairo_surface_destroy (surface); surface = _cairo_surface_create_in_error (status); } return surface; #endif } static const cairo_surface_backend_t test_meta_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_TEST_META, NULL, /* create_similar */ _test_meta_surface_finish, _test_meta_surface_acquire_source_image, _test_meta_surface_release_source_image, NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ _test_meta_surface_show_page, NULL, /* set_clip_region */ _test_meta_surface_intersect_clip_path, _test_meta_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ _test_meta_surface_paint, _test_meta_surface_mask, _test_meta_surface_stroke, _test_meta_surface_fill, _test_meta_surface_show_glyphs, _test_meta_surface_snapshot }; libgdiplus-2.11/cairo/src/cairo-polygon.c0000664000175000017500000001141612225470167015341 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" /* private functions */ static cairo_status_t _cairo_polygon_grow (cairo_polygon_t *polygon); void _cairo_polygon_init (cairo_polygon_t *polygon) { polygon->status = CAIRO_STATUS_SUCCESS; polygon->num_edges = 0; polygon->edges_size = 0; polygon->edges = NULL; polygon->has_current_point = FALSE; } void _cairo_polygon_fini (cairo_polygon_t *polygon) { if (polygon->edges && polygon->edges != polygon->edges_embedded) free (polygon->edges); polygon->edges = NULL; polygon->edges_size = 0; polygon->num_edges = 0; polygon->has_current_point = FALSE; } cairo_status_t _cairo_polygon_status (cairo_polygon_t *polygon) { return polygon->status; } /* make room for at least one more edge */ static cairo_status_t _cairo_polygon_grow (cairo_polygon_t *polygon) { cairo_edge_t *new_edges; int old_size = polygon->edges_size; int embedded_size = ARRAY_LENGTH (polygon->edges_embedded); int new_size = 2 * MAX (old_size, 16); /* we have a local buffer at polygon->edges_embedded. try to fulfill the request * from there. */ if (old_size < embedded_size) { polygon->edges = polygon->edges_embedded; polygon->edges_size = embedded_size; return CAIRO_STATUS_SUCCESS; } assert (polygon->num_edges <= polygon->edges_size); if (polygon->edges == polygon->edges_embedded) { new_edges = _cairo_malloc_ab (new_size, sizeof (cairo_edge_t)); if (new_edges) memcpy (new_edges, polygon->edges, old_size * sizeof (cairo_edge_t)); } else { new_edges = _cairo_realloc_ab (polygon->edges, new_size, sizeof (cairo_edge_t)); } if (new_edges == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); polygon->edges = new_edges; polygon->edges_size = new_size; return CAIRO_STATUS_SUCCESS; } void _cairo_polygon_add_edge (cairo_polygon_t *polygon, cairo_point_t *p1, cairo_point_t *p2) { cairo_edge_t *edge; if (polygon->status) return; /* drop horizontal edges */ if (p1->y == p2->y) goto DONE; if (polygon->num_edges >= polygon->edges_size) { polygon->status = _cairo_polygon_grow (polygon); if (polygon->status) return; } edge = &polygon->edges[polygon->num_edges]; if (p1->y < p2->y) { edge->edge.p1 = *p1; edge->edge.p2 = *p2; edge->clockWise = 1; } else { edge->edge.p1 = *p2; edge->edge.p2 = *p1; edge->clockWise = 0; } polygon->num_edges++; DONE: _cairo_polygon_move_to (polygon, p2); } void _cairo_polygon_move_to (cairo_polygon_t *polygon, cairo_point_t *point) { if (polygon->status) return; if (! polygon->has_current_point) polygon->first_point = *point; polygon->current_point = *point; polygon->has_current_point = TRUE; } void _cairo_polygon_line_to (cairo_polygon_t *polygon, cairo_point_t *point) { if (polygon->status) return; if (polygon->has_current_point) { _cairo_polygon_add_edge (polygon, &polygon->current_point, point); } else { _cairo_polygon_move_to (polygon, point); } } void _cairo_polygon_close (cairo_polygon_t *polygon) { if (polygon->status) return; if (polygon->has_current_point) { _cairo_polygon_add_edge (polygon, &polygon->current_point, &polygon->first_point); polygon->has_current_point = FALSE; } } libgdiplus-2.11/cairo/src/cairo-truetype-subset-private.h0000664000175000017500000001447312225470167020521 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Kristian Høgsberg * Adrian Johnson */ #ifndef CAIRO_TRUETYPE_SUBSET_PRIVATE_H #define CAIRO_TRUETYPE_SUBSET_PRIVATE_H #include "cairoint.h" /* The structs defined here should strictly follow the TrueType * specification and not be padded. We use only 16-bit integer * in their definition to guarantee that. The fields of type * "FIXED" in the TT spec are broken into two *_1 and *_2 16-bit * parts, and 64-bit members are broken into four. * * The test truetype-tables in the test suite makes sure that * these tables have the right size. Please update that test * if you add new tables/structs that should be packed. */ #define MAKE_TT_TAG(a, b, c, d) (a<<24 | b<<16 | c<<8 | d) #define TT_TAG_CFF MAKE_TT_TAG('C','F','F',' ') #define TT_TAG_cmap MAKE_TT_TAG('c','m','a','p') #define TT_TAG_cvt MAKE_TT_TAG('c','v','t',' ') #define TT_TAG_fpgm MAKE_TT_TAG('f','p','g','m') #define TT_TAG_glyf MAKE_TT_TAG('g','l','y','f') #define TT_TAG_head MAKE_TT_TAG('h','e','a','d') #define TT_TAG_hhea MAKE_TT_TAG('h','h','e','a') #define TT_TAG_hmtx MAKE_TT_TAG('h','m','t','x') #define TT_TAG_loca MAKE_TT_TAG('l','o','c','a') #define TT_TAG_maxp MAKE_TT_TAG('m','a','x','p') #define TT_TAG_name MAKE_TT_TAG('n','a','m','e') #define TT_TAG_post MAKE_TT_TAG('p','o','s','t') #define TT_TAG_prep MAKE_TT_TAG('p','r','e','p') /* All tt_* structs are big-endian */ typedef struct _tt_cmap_index { uint16_t platform; uint16_t encoding; uint32_t offset; } tt_cmap_index_t; typedef struct _tt_cmap { uint16_t version; uint16_t num_tables; tt_cmap_index_t index[1]; } tt_cmap_t; typedef struct _segment_map { uint16_t format; uint16_t length; uint16_t version; uint16_t segCountX2; uint16_t searchRange; uint16_t entrySelector; uint16_t rangeShift; uint16_t endCount[1]; } tt_segment_map_t; typedef struct _tt_head { int16_t version_1; int16_t version_2; int16_t revision_1; int16_t revision_2; uint16_t checksum_1; uint16_t checksum_2; uint16_t magic_1; uint16_t magic_2; uint16_t flags; uint16_t units_per_em; int16_t created_1; int16_t created_2; int16_t created_3; int16_t created_4; int16_t modified_1; int16_t modified_2; int16_t modified_3; int16_t modified_4; int16_t x_min; /* FWORD */ int16_t y_min; /* FWORD */ int16_t x_max; /* FWORD */ int16_t y_max; /* FWORD */ uint16_t mac_style; uint16_t lowest_rec_pppem; int16_t font_direction_hint; int16_t index_to_loc_format; int16_t glyph_data_format; } tt_head_t; typedef struct _tt_hhea { int16_t version_1; int16_t version_2; int16_t ascender; /* FWORD */ int16_t descender; /* FWORD */ int16_t line_gap; /* FWORD */ uint16_t advance_max_width; /* UFWORD */ int16_t min_left_side_bearing; /* FWORD */ int16_t min_right_side_bearing; /* FWORD */ int16_t x_max_extent; /* FWORD */ int16_t caret_slope_rise; int16_t caret_slope_run; int16_t reserved[5]; int16_t metric_data_format; uint16_t num_hmetrics; } tt_hhea_t; typedef struct _tt_maxp { int16_t version_1; int16_t version_2; uint16_t num_glyphs; uint16_t max_points; uint16_t max_contours; uint16_t max_composite_points; uint16_t max_composite_contours; uint16_t max_zones; uint16_t max_twilight_points; uint16_t max_storage; uint16_t max_function_defs; uint16_t max_instruction_defs; uint16_t max_stack_elements; uint16_t max_size_of_instructions; uint16_t max_component_elements; uint16_t max_component_depth; } tt_maxp_t; typedef struct _tt_name_record { uint16_t platform; uint16_t encoding; uint16_t language; uint16_t name; uint16_t length; uint16_t offset; } tt_name_record_t; typedef struct _tt_name { uint16_t format; uint16_t num_records; uint16_t strings_offset; tt_name_record_t records[1]; } tt_name_t; /* composite_glyph_t flags */ #define TT_ARG_1_AND_2_ARE_WORDS 0x0001 #define TT_WE_HAVE_A_SCALE 0x0008 #define TT_MORE_COMPONENTS 0x0020 #define TT_WE_HAVE_AN_X_AND_Y_SCALE 0x0040 #define TT_WE_HAVE_A_TWO_BY_TWO 0x0080 typedef struct _tt_composite_glyph { uint16_t flags; uint16_t index; uint16_t args[7]; /* 1 to 7 arguments depending on value of flags */ } tt_composite_glyph_t; typedef struct _tt_glyph_data { int16_t num_contours; int8_t data[8]; tt_composite_glyph_t glyph; } tt_glyph_data_t; #endif /* CAIRO_TRUETYPE_SUBSET_PRIVATE_H */ libgdiplus-2.11/cairo/src/Makefile.win320000664000175000017500000000561612225470167015021 00000000000000 SUBMAKEFILE = 1 include ../Makefile.win32 DEFFILE = cairo.def srcdir = `pwd` SOURCES = \ cairo-arc.c \ cairo-array.c \ cairo-atomic.c \ cairo-bentley-ottmann.c \ cairo-cache.c \ cairo-clip.c \ cairo-color.c \ cairo-debug.c \ cairo-deflate-stream.c \ cairo-fixed.c \ cairo-font-options.c \ cairo-font-face.c \ cairo-freelist.c \ cairo-gstate.c \ cairo-hash.c \ cairo-hull.c \ cairo-image-surface.c \ cairo-lzw.c \ cairo-matrix.c \ cairo-meta-surface.c \ cairo-misc.c \ cairo-mutex.c \ cairo-output-stream.c \ cairo-path-bounds.c \ cairo-path-fixed.c \ cairo-path-fill.c \ cairo-path-stroke.c \ cairo-path.c \ cairo-pattern.c \ cairo-pdf-surface.c \ cairo-pdf-operators.c \ cairo-pen.c \ cairo-polygon.c \ cairo-png.c \ cairo-rectangle.c \ cairo-region.c \ cairo-scaled-font.c \ cairo-skiplist.c \ cairo-slope.c \ cairo-spline.c \ cairo-stroke-style.c \ cairo-surface-fallback.c \ cairo-surface.c \ cairo-traps.c \ cairo-cff-subset.c \ cairo-truetype-subset.c \ cairo-type1-fallback.c \ cairo-unicode.c \ cairo-wideint.c \ cairo-win32-font.c \ cairo.c \ cairo-svg-surface.c \ cairo-ps-surface.c \ cairo-pdf-surface.c \ cairo-scaled-font-subsets.c \ cairo-paginated-surface.c \ cairo-analysis-surface.c \ cairo-base85-stream.c \ cairo-win32-printing-surface.c \ cairo-win32.c \ $(NULL) STATIC_SOURCES = cairo-win32-surface.c cairo_headers = \ cairo.h \ cairo-pdf.h \ cairo-ps.h \ cairo-svg.h \ cairo-win32.h \ cairo-pdf-test.h \ cairo-ps-test.h \ cairo-scaled-font-test.h \ cairo-svg-test.h \ $(NULL) OBJECTS = $(patsubst %.c, $(CFG)/%.obj, $(SOURCES)) SHARED_OBJECTS = $(patsubst %.c, $(CFG)/%.obj, $(STATIC_SOURCES)) STATIC_OBJECTS = $(patsubst %.c, $(CFG)/%-static.obj, $(STATIC_SOURCES)) all: inform $(CFG)/cairo.dll $(CFG)/cairo-static.lib static: inform $(CFG)/cairo-static.lib dynamic: inform $(CFG)/cairo.dll $(DEFFILE): (echo EXPORTS; \ (cd $(srcdir); cat $(cairo_headers) || echo 'cairo_ERROR ()' ) | \ grep -v -E '^# *include' | \ ( gcc -include cairo-features.h -E - || echo 'cairo_ERROR ()' ) | \ grep -E '^_?cairo_.* \(' | \ sed -e 's/[ ].*//' | \ sort; \ echo LIBRARY cairo.dll; \ ) >$@ @ ! grep -q cairo_ERROR $@ || ($(RM) $@; false) $(CFG)/cairo.dll: $(OBJECTS) $(SHARED_OBJECTS) $(DEFFILE) $(CC) -MD -LD -Fe$@ $(PIXMAN_LIBS) $(OBJECTS) $(SHARED_OBJECTS) -link -DEF:$(DEFFILE) user32.lib gdi32.lib libpng.lib zdll.lib msimg32.lib $(CFG)/cairo-static.lib: $(OBJECTS) $(STATIC_OBJECTS) lib -NOLOGO -OUT:$@ $(PIXMAN_LIBS) $(OBJECTS) $(STATIC_OBJECTS) clean: @rm -f $(CFG)/*.obj $(CFG)/*.dll $(CFG)/*.lib $(CFG)/*.pdb $(CFG)/*.ilk || exit 0 inform: ifneq ($(CFG),release) ifneq ($(CFG),debug) @echo "Invalid configuration "$(CFG)" specified." @echo -n "You must specify a configuration when " @echo "running make, e.g. make CFG=debug" @echo @echo -n "Possible choices for configuration are " @echo "'release' and 'debug'" @exit 1 endif endif libgdiplus-2.11/cairo/src/cairo-cache-private.h0000664000175000017500000001111012225470167016361 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc. * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Keith Packard * Graydon Hoare * Carl Worth */ #ifndef CAIRO_CACHE_PRIVATE_H #define CAIRO_CACHE_PRIVATE_H #include "cairo-compiler-private.h" #include "cairo-types-private.h" /** * cairo_cache_entry_t: * * A #cairo_cache_entry_t contains both a key and a value for * #cairo_cache_t. User-derived types for #cairo_cache_entry_t must * have a #cairo_cache_entry_t as their first field. For example: * * typedef _my_entry { * cairo_cache_entry_t base; * ... Remainder of key and value fields here .. * } my_entry_t; * * which then allows a pointer to my_entry_t to be passed to any of * the #cairo_cache_t functions as follows without requiring a cast: * * _cairo_cache_insert (cache, &my_entry->base, size); * * IMPORTANT: The caller is responsible for initializing * my_entry->base.hash with a hash code derived from the key. The * essential property of the hash code is that keys_equal must never * return %TRUE for two keys that have different hashes. The best hash * code will reduce the frequency of two keys with the same code for * which keys_equal returns %FALSE. * * The user must also initialize my_entry->base.size to indicate * the size of the current entry. What units to use for size is * entirely up to the caller, (though the same units must be used for * the max_size parameter passed to _cairo_cache_create()). If all * entries are close to the same size, the simplest thing to do is to * just use units of "entries", (eg. set size==1 in all entries and * set max_size to the number of entries which you want to be saved * in the cache). * * Which parts of the entry make up the "key" and which part make up * the value are entirely up to the caller, (as determined by the * computation going into base.hash as well as the keys_equal * function). A few of the #cairo_cache_t functions accept an entry which * will be used exclusively as a "key", (indicated by a parameter name * of key). In these cases, the value-related fields of the entry need * not be initialized if so desired. **/ typedef struct _cairo_cache_entry { unsigned long hash; unsigned long size; } cairo_cache_entry_t; typedef cairo_bool_t (*cairo_cache_keys_equal_func_t) (const void *key_a, const void *key_b); typedef void (*cairo_cache_callback_func_t) (void *entry, void *closure); cairo_private cairo_cache_t * _cairo_cache_create (cairo_cache_keys_equal_func_t keys_equal, cairo_destroy_func_t entry_destroy, unsigned long max_size); cairo_private void _cairo_cache_destroy (cairo_cache_t *cache); cairo_private void _cairo_cache_freeze (cairo_cache_t *cache); cairo_private void _cairo_cache_thaw (cairo_cache_t *cache); cairo_private cairo_bool_t _cairo_cache_lookup (cairo_cache_t *cache, cairo_cache_entry_t *key, cairo_cache_entry_t **entry_return); cairo_private cairo_status_t _cairo_cache_insert (cairo_cache_t *cache, cairo_cache_entry_t *entry); cairo_private void _cairo_cache_foreach (cairo_cache_t *cache, cairo_cache_callback_func_t cache_callback, void *closure); #endif libgdiplus-2.11/cairo/src/cairo-mutex-type-private.h0000664000175000017500000001736212225470167017456 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005,2007 Red Hat, Inc. * Copyright © 2007 Mathias Hasselmann * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Mathias Hasselmann * Behdad Esfahbod */ #ifndef CAIRO_MUTEX_TYPE_PRIVATE_H #define CAIRO_MUTEX_TYPE_PRIVATE_H #if HAVE_CONFIG_H #include "config.h" #endif #include CAIRO_BEGIN_DECLS /* A fully qualified no-operation statement */ #define CAIRO_MUTEX_NOOP do {/*no-op*/} while (0) /* And one that evaluates it's argument once */ #define CAIRO_MUTEX_NOOP1(expr) do { if (expr) ; } while (0) /* Cairo mutex implementation: * * Any new mutex implementation needs to do the following: * * - Condition on the right header or feature. Headers are * preferred as eg. you still can use win32 mutex implementation * on a win32 system even if you do not compile the win32 * surface/backend. * * - typedef #cairo_mutex_t to the proper mutex type on your target * system. Note that you may or may not need to use a pointer, * depending on what kinds of initialization your mutex * implementation supports. No trailing semicolon needed. * You should be able to compile the following snippet (don't try * running it): * * cairo_mutex_t _cairo_some_mutex; * * - #define CAIRO_MUTEX_LOCK(mutex) and CAIRO_MUTEX_UNLOCK(mutex) to * proper statement to lock/unlock the mutex object passed in. * You can (and should) assume that the mutex is already * initialized, and is-not-already-locked/is-locked, * respectively. Use the "do { ... } while (0)" idiom if necessary. * No trailing semicolons are needed (in any macro you define here). * You should be able to compile the following snippet: * * cairo_mutex_t _cairo_some_mutex; * * if (1) * %CAIRO_MUTEX_LOCK (_cairo_some_mutex); * else * %CAIRO_MUTEX_UNLOCK (_cairo_some_mutex); * * - #define %CAIRO_MUTEX_NIL_INITIALIZER to something that can * initialize the #cairo_mutex_t type you defined. Most of the * time one of 0, %NULL, or {} works. At this point * you should be able to compile the following snippet: * * cairo_mutex_t _cairo_some_mutex = CAIRO_MUTEX_NIL_INITIALIZER; * * if (1) * %CAIRO_MUTEX_LOCK (_cairo_some_mutex); * else * %CAIRO_MUTEX_UNLOCK (_cairo_some_mutex); * * - If the above code is not enough to initialize a mutex on * your platform, #define CAIRO_MUTEX_INIT(mutex) to statement * to initialize the mutex (allocate resources, etc). Such that * you should be able to compile AND RUN the following snippet: * * cairo_mutex_t _cairo_some_mutex = CAIRO_MUTEX_NIL_INITIALIZER; * * %CAIRO_MUTEX_INIT (_cairo_some_mutex); * * if (1) * %CAIRO_MUTEX_LOCK (_cairo_some_mutex); * else * %CAIRO_MUTEX_UNLOCK (_cairo_some_mutex); * * - If you define CAIRO_MUTEX_INIT(mutex), cairo will use it to * initialize all static mutex'es. If for any reason that should * not happen (eg. %CAIRO_MUTEX_INIT is just a faster way than * what cairo does using %CAIRO_MUTEX_NIL_INITIALIZER), then * #define CAIRO_MUTEX_INITIALIZE() CAIRO_MUTEX_NOOP * * - If your system supports freeing a mutex object (deallocating * resources, etc), then #define CAIRO_MUTEX_FINI(mutex) to do * that. * * - If you define CAIRO_MUTEX_FINI(mutex), cairo will use it to * define a finalizer function to finalize all static mutex'es. * However, it's up to you to call CAIRO_MUTEX_FINALIZE() at * proper places, eg. when the system is unloading the cairo library. * So, if for any reason finalizing static mutex'es is not needed * (eg. you never call %CAIRO_MUTEX_FINALIZE), then * #define CAIRO_MUTEX_FINALIZE() CAIRO_MUTEX_NOOP * * - That is all. If for any reason you think the above API is * not enough to implement #cairo_mutex_t on your system, please * stop and write to the cairo mailing list about it. DO NOT * poke around cairo-mutex-private.h for possible solutions. */ #if CAIRO_NO_MUTEX /* No mutexes */ typedef int cairo_mutex_t; # define CAIRO_MUTEX_INITIALIZE() CAIRO_MUTEX_NOOP # define CAIRO_MUTEX_LOCK(mutex) CAIRO_MUTEX_NOOP1(mutex) # define CAIRO_MUTEX_UNLOCK(mutex) CAIRO_MUTEX_NOOP1(mutex) # define CAIRO_MUTEX_NIL_INITIALIZER 0 #elif HAVE_PTHREAD_H /*******************************************************/ # include typedef pthread_mutex_t cairo_mutex_t; # define CAIRO_MUTEX_LOCK(mutex) pthread_mutex_lock (&(mutex)) # define CAIRO_MUTEX_UNLOCK(mutex) pthread_mutex_unlock (&(mutex)) # define CAIRO_MUTEX_FINI(mutex) pthread_mutex_destroy (&(mutex)) # define CAIRO_MUTEX_FINALIZE() CAIRO_MUTEX_NOOP # define CAIRO_MUTEX_NIL_INITIALIZER PTHREAD_MUTEX_INITIALIZER #elif HAVE_WINDOWS_H /*******************************************************/ # include typedef CRITICAL_SECTION cairo_mutex_t; # define CAIRO_MUTEX_LOCK(mutex) EnterCriticalSection (&(mutex)) # define CAIRO_MUTEX_UNLOCK(mutex) LeaveCriticalSection (&(mutex)) # define CAIRO_MUTEX_INIT(mutex) InitializeCriticalSection (&(mutex)) # define CAIRO_MUTEX_FINI(mutex) DeleteCriticalSection (&(mutex)) # define CAIRO_MUTEX_NIL_INITIALIZER { NULL, 0, 0, NULL, NULL, 0 } #elif defined __OS2__ /******************************************************/ # define INCL_BASE # define INCL_PM # include typedef HMTX cairo_mutex_t; # define CAIRO_MUTEX_LOCK(mutex) DosRequestMutexSem(mutex, SEM_INDEFINITE_WAIT) # define CAIRO_MUTEX_UNLOCK(mutex) DosReleaseMutexSem(mutex) # define CAIRO_MUTEX_INIT(mutex) DosCreateMutexSem (NULL, &(mutex), 0L, FALSE) # define CAIRO_MUTEX_FINI(mutex) DosCloseMutexSem (mutex) # define CAIRO_MUTEX_NIL_INITIALIZER 0 #elif CAIRO_HAS_BEOS_SURFACE /***********************************************/ typedef BLocker* cairo_mutex_t; # define CAIRO_MUTEX_LOCK(mutex) (mutex)->Lock() # define CAIRO_MUTEX_UNLOCK(mutex) (mutex)->Unlock() # define CAIRO_MUTEX_INIT(mutex) (mutex) = new BLocker() # define CAIRO_MUTEX_FINI(mutex) delete (mutex) # define CAIRO_MUTEX_NIL_INITIALIZER NULL #else /**********************************************************************/ # error "XXX: No mutex implementation found. Cairo will not work with multiple threads. Define CAIRO_NO_MUTEX to 1 to acknowledge and accept this limitation and compile cairo without thread-safety support." #endif CAIRO_END_DECLS #endif libgdiplus-2.11/cairo/src/check-has-hidden-symbols.c0000664000175000017500000000006012225470167017315 00000000000000#include "cairoint.h" CAIRO_HAS_HIDDEN_SYMBOLS libgdiplus-2.11/cairo/src/cairo-cache.c0000664000175000017500000002553312225470167014722 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc. * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Keith Packard * Graydon Hoare * Carl Worth */ #include "cairoint.h" static void _cairo_cache_remove (cairo_cache_t *cache, cairo_cache_entry_t *entry); static void _cairo_cache_shrink_to_accommodate (cairo_cache_t *cache, unsigned long additional); static cairo_status_t _cairo_cache_init (cairo_cache_t *cache, cairo_cache_keys_equal_func_t keys_equal, cairo_destroy_func_t entry_destroy, unsigned long max_size) { cache->hash_table = _cairo_hash_table_create (keys_equal); if (cache->hash_table == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); cache->entry_destroy = entry_destroy; cache->max_size = max_size; cache->size = 0; cache->freeze_count = 0; return CAIRO_STATUS_SUCCESS; } static void _cairo_cache_fini (cairo_cache_t *cache) { cairo_cache_entry_t *entry; /* We have to manually remove all entries from the cache ourselves * rather than relying on _cairo_hash_table_destroy() to do that * since otherwise the cache->entry_destroy callback would not get * called on each entry. */ while (1) { entry = _cairo_hash_table_random_entry (cache->hash_table, NULL); if (entry == NULL) break; _cairo_cache_remove (cache, entry); } _cairo_hash_table_destroy (cache->hash_table); cache->size = 0; } /** * _cairo_cache_create: * @keys_equal: a function to return %TRUE if two keys are equal * @entry_destroy: destroy notifier for cache entries * @max_size: the maximum size for this cache * * Creates a new cache using the keys_equal() function to determine * the equality of entries. * * Data is provided to the cache in the form of user-derived version * of #cairo_cache_entry_t. A cache entry must be able to hold hash * code, a size, and the key/value pair being stored in the * cache. Sometimes only the key will be necessary, (as in * _cairo_cache_lookup()), and in these cases the value portion of the * entry need not be initialized. * * The units for max_size can be chosen by the caller, but should be * consistent with the units of the size field of cache entries. When * adding an entry with _cairo_cache_insert() if the total size of * entries in the cache would exceed max_size then entries will be * removed at random until the new entry would fit or the cache is * empty. Then the new entry is inserted. * * There are cases in which the automatic removal of entries is * undesired. If the cache entries have reference counts, then it is a * simple matter to use the reference counts to ensure that entries * continue to live even after being ejected from the cache. However, * in some cases the memory overhead of adding a reference count to * the entry would be objectionable. In such cases, the * _cairo_cache_freeze() and _cairo_cache_thaw() calls can be * used to establish a window during which no automatic removal of * entries will occur. * * Return value: **/ cairo_cache_t * _cairo_cache_create (cairo_cache_keys_equal_func_t keys_equal, cairo_destroy_func_t entry_destroy, unsigned long max_size) { cairo_status_t status; cairo_cache_t *cache; cache = malloc (sizeof (cairo_cache_t)); if (cache == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return NULL; } status = _cairo_cache_init (cache, keys_equal, entry_destroy, max_size); if (status) { free (cache); return NULL; } return cache; } /** * _cairo_cache_destroy: * @cache: a cache to destroy * * Immediately destroys the given cache, freeing all resources * associated with it. As part of this process, the entry_destroy() * function, (as passed to _cairo_cache_create()), will be called for * each entry in the cache. **/ void _cairo_cache_destroy (cairo_cache_t *cache) { _cairo_cache_fini (cache); free (cache); } /** * _cairo_cache_freeze: * @cache: a cache with some precious entries in it (or about to be * added) * * Disable the automatic ejection of entries from the cache. For as * long as the cache is "frozen", calls to _cairo_cache_insert() will * add new entries to the cache regardless of how large the cache * grows. See _cairo_cache_thaw(). * * Note: Multiple calls to _cairo_cache_freeze() will stack, in that * the cache will remain "frozen" until a corresponding number of * calls are made to _cairo_cache_thaw(). **/ void _cairo_cache_freeze (cairo_cache_t *cache) { assert (cache->freeze_count >= 0); cache->freeze_count++; } /** * _cairo_cache_thaw: * @cache: a cache, just after the entries in it have become less * precious * * Cancels the effects of _cairo_cache_freeze(). * * When a number of calls to _cairo_cache_thaw() is made corresponding * to the number of calls to _cairo_cache_freeze() the cache will no * longer be "frozen". If the cache had grown larger than max_size * while frozen, entries will immediately be ejected (by random) from * the cache until the cache is smaller than max_size. Also, the * automatic ejection of entries on _cairo_cache_insert() will resume. **/ void _cairo_cache_thaw (cairo_cache_t *cache) { assert (cache->freeze_count > 0); cache->freeze_count--; if (cache->freeze_count == 0) _cairo_cache_shrink_to_accommodate (cache, 0); } /** * _cairo_cache_lookup: * @cache: a cache * @key: the key of interest * @entry_return: pointer for return value * * Performs a lookup in @cache looking for an entry which has a key * that matches @key, (as determined by the keys_equal() function * passed to _cairo_cache_create()). * * Return value: %TRUE if there is an entry in the cache that matches * @key, (which will now be in *entry_return). %FALSE otherwise, (in * which case *entry_return will be %NULL). **/ cairo_bool_t _cairo_cache_lookup (cairo_cache_t *cache, cairo_cache_entry_t *key, cairo_cache_entry_t **entry_return) { return _cairo_hash_table_lookup (cache->hash_table, (cairo_hash_entry_t *) key, (cairo_hash_entry_t **) entry_return); } /** * _cairo_cache_remove_random: * @cache: a cache * * Remove a random entry from the cache. * * Return value: %CAIRO_STATUS_SUCCESS if an entry was successfully * removed. %CAIRO_INT_STATUS_CACHE_EMPTY if there are no entries that * can be removed. **/ static cairo_int_status_t _cairo_cache_remove_random (cairo_cache_t *cache) { cairo_cache_entry_t *entry; entry = _cairo_hash_table_random_entry (cache->hash_table, NULL); if (entry == NULL) return CAIRO_INT_STATUS_CACHE_EMPTY; _cairo_cache_remove (cache, entry); return CAIRO_STATUS_SUCCESS; } /** * _cairo_cache_shrink_to_accommodate: * @cache: a cache * @additional: additional size requested in bytes * * If cache is not frozen, eject entries randomly until the size of * the cache is at least @additional bytes less than * cache->max_size. That is, make enough room to accommodate a new * entry of size @additional. **/ static void _cairo_cache_shrink_to_accommodate (cairo_cache_t *cache, unsigned long additional) { cairo_int_status_t status; if (cache->freeze_count) return; while (cache->size + additional > cache->max_size) { status = _cairo_cache_remove_random (cache); if (status) { if (status == CAIRO_INT_STATUS_CACHE_EMPTY) return; ASSERT_NOT_REACHED; } } } /** * _cairo_cache_insert: * @cache: a cache * @entry: an entry to be inserted * * Insert @entry into the cache. If an entry exists in the cache with * a matching key, then the old entry will be removed first, (and the * entry_destroy() callback will be called on it). * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if insufficient memory is available. **/ cairo_status_t _cairo_cache_insert (cairo_cache_t *cache, cairo_cache_entry_t *entry) { cairo_status_t status; _cairo_cache_shrink_to_accommodate (cache, entry->size); status = _cairo_hash_table_insert (cache->hash_table, (cairo_hash_entry_t *) entry); if (status) return status; cache->size += entry->size; return CAIRO_STATUS_SUCCESS; } /** * _cairo_cache_remove: * @cache: a cache * @entry: an entry that exists in the cache * * Remove an existing entry from the cache. * * (Note: If any caller wanted access to a non-static version of this * function, an improved version would require only a key rather than * an entry. Fixing that would require fixing _cairo_hash_table_remove * to return (a copy of?) the entry being removed.) **/ static void _cairo_cache_remove (cairo_cache_t *cache, cairo_cache_entry_t *entry) { cache->size -= entry->size; _cairo_hash_table_remove (cache->hash_table, (cairo_hash_entry_t *) entry); if (cache->entry_destroy) cache->entry_destroy (entry); } /** * _cairo_cache_foreach: * @cache: a cache * @cache_callback: function to be called for each entry * @closure: additional argument to be passed to @cache_callback * * Call @cache_callback for each entry in the cache, in a * non-specified order. **/ void _cairo_cache_foreach (cairo_cache_t *cache, cairo_cache_callback_func_t cache_callback, void *closure) { _cairo_hash_table_foreach (cache->hash_table, cache_callback, closure); } unsigned long _cairo_hash_string (const char *c) { /* This is the djb2 hash. */ unsigned long hash = 5381; while (c && *c) hash = ((hash << 5) + hash) + *c++; return hash; } libgdiplus-2.11/cairo/src/cairo-win32-private.h0000664000175000017500000001260112225470167016266 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Owen Taylor */ #ifndef CAIRO_WIN32_PRIVATE_H #define CAIRO_WIN32_PRIVATE_H #include #include #ifndef SHADEBLENDCAPS #define SHADEBLENDCAPS 120 #endif #ifndef SB_NONE #define SB_NONE 0 #endif #define WIN32_FONT_LOGICAL_SCALE 32 typedef struct _cairo_win32_surface { cairo_surface_t base; cairo_format_t format; HDC dc; /* We create off-screen surfaces as DIBs or DDBs, based on what we created * originally*/ HBITMAP bitmap; cairo_bool_t is_dib; /* Used to save the initial 1x1 monochrome bitmap for the DC to * select back into the DC before deleting the DC and our * bitmap. For Windows XP, this doesn't seem to be necessary * ... we can just delete the DC and that automatically unselects * out bitmap. But it's standard practice so apparently is needed * on some versions of Windows. */ HBITMAP saved_dc_bitmap; cairo_surface_t *image; cairo_rectangle_int_t extents; /* Initial clip bits * We need these kept around so that we maintain * whatever clip was set on the original DC at creation * time when cairo is asked to reset the surface clip. */ cairo_rectangle_int_t clip_rect; HRGN initial_clip_rgn; cairo_bool_t had_simple_clip; /* Surface DC flags */ uint32_t flags; /* printing surface bits */ cairo_paginated_mode_t paginated_mode; cairo_content_t content; cairo_bool_t path_empty; cairo_bool_t has_ctm; cairo_matrix_t ctm; HBRUSH brush, old_brush; } cairo_win32_surface_t; /* Surface DC flag values */ enum { /* If this is a surface created for printing or not */ CAIRO_WIN32_SURFACE_FOR_PRINTING = (1<<0), /* Whether the DC is a display DC or not */ CAIRO_WIN32_SURFACE_IS_DISPLAY = (1<<1), /* Whether we can use BitBlt with this surface */ CAIRO_WIN32_SURFACE_CAN_BITBLT = (1<<2), /* Whether we can use AlphaBlend with this surface */ CAIRO_WIN32_SURFACE_CAN_ALPHABLEND = (1<<3), /* Whether we can use StretchBlt with this surface */ CAIRO_WIN32_SURFACE_CAN_STRETCHBLT = (1<<4), /* Whether we can use StretchDIBits with this surface */ CAIRO_WIN32_SURFACE_CAN_STRETCHDIB = (1<<5), /* Whether we can use GradientFill rectangles with this surface */ CAIRO_WIN32_SURFACE_CAN_RECT_GRADIENT = (1<<6), }; cairo_status_t _cairo_win32_print_gdi_error (const char *context); cairo_bool_t _cairo_surface_is_win32 (cairo_surface_t *surface); cairo_bool_t _cairo_surface_is_win32_printing (cairo_surface_t *surface); cairo_status_t _cairo_win32_surface_finish (void *abstract_surface); cairo_int_status_t _cairo_win32_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle); uint32_t _cairo_win32_flags_for_dc (HDC dc); cairo_int_status_t _cairo_win32_surface_show_glyphs (void *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); cairo_surface_t * _cairo_win32_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height); cairo_status_t _cairo_win32_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out); static inline void _cairo_matrix_to_win32_xform (const cairo_matrix_t *m, XFORM *xform) { xform->eM11 = (FLOAT) m->xx; xform->eM21 = (FLOAT) m->xy; xform->eM12 = (FLOAT) m->yx; xform->eM22 = (FLOAT) m->yy; xform->eDx = (FLOAT) m->x0; xform->eDy = (FLOAT) m->y0; } cairo_int_status_t _cairo_win32_save_initial_clip (HDC dc, cairo_win32_surface_t *surface); cairo_int_status_t _cairo_win32_restore_initial_clip (cairo_win32_surface_t *surface); void _cairo_win32_debug_dump_hrgn (HRGN rgn, char *header); #endif /* CAIRO_WIN32_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo.h0000664000175000017500000017457712225470167013703 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_H #define CAIRO_H #include "cairo-embed.h" #include #include CAIRO_BEGIN_DECLS #define CAIRO_VERSION_ENCODE(major, minor, micro) ( \ ((major) * 10000) \ + ((minor) * 100) \ + ((micro) * 1)) #define CAIRO_VERSION CAIRO_VERSION_ENCODE( \ CAIRO_VERSION_MAJOR, \ CAIRO_VERSION_MINOR, \ CAIRO_VERSION_MICRO) cairo_public int cairo_version (void); cairo_public const char* cairo_version_string (void); /** * cairo_bool_t: * * #cairo_bool_t is used for boolean values. Returns of type * #cairo_bool_t will always be either 0 or 1, but testing against * these values explicitly is not encouraged; just use the * value as a boolean condition. * * * if (cairo_in_stroke (cr, x, y)) { * /* do something */ * } * **/ typedef int cairo_bool_t; /** * cairo_t: * * A #cairo_t contains the current state of the rendering device, * including coordinates of yet to be drawn shapes. * * Cairo contexts, as #cairo_t objects are named, are central to * cairo and all drawing with cairo is always done to a #cairo_t * object. * * Memory management of #cairo_t is done with * cairo_reference() and cairo_destroy(). **/ typedef struct _cairo cairo_t; /** * cairo_surface_t: * * A #cairo_surface_t represents an image, either as the destination * of a drawing operation or as source when drawing onto another * surface. To draw to a #cairo_surface_t, create a cairo context * with the surface as the target, using cairo_create(). * * There are different subtypes of #cairo_surface_t for * different drawing backends; for example, cairo_image_surface_create() * creates a bitmap image in memory. * The type of a surface can be queried with cairo_surface_get_type(). * * Memory management of #cairo_surface_t is done with * cairo_surface_reference() and cairo_surface_destroy(). **/ typedef struct _cairo_surface cairo_surface_t; /** * cairo_matrix_t: * @xx: xx component of the affine transformation * @yx: yx component of the affine transformation * @xy: xy component of the affine transformation * @yy: yy component of the affine transformation * @x0: X translation component of the affine transformation * @y0: Y translation component of the affine transformation * * A #cairo_matrix_t holds an affine transformation, such as a scale, * rotation, shear, or a combination of those. The transformation of * a point (x, y) is given by: * * x_new = xx * x + xy * y + x0; * y_new = yx * x + yy * y + y0; * **/ typedef struct _cairo_matrix { double xx; double yx; double xy; double yy; double x0; double y0; } cairo_matrix_t; /** * cairo_pattern_t: * * A #cairo_pattern_t represents a source when drawing onto a * surface. There are different subtypes of #cairo_pattern_t, * for different types of sources; for example, * cairo_pattern_create_rgb() creates a pattern for a solid * opaque color. * * Other than various cairo_pattern_create_type() * functions, some of the pattern types can be implicitly created * using various cairo_set_source_type() functions; * for example cairo_set_source_rgb(). * * The type of a pattern can be queried with cairo_pattern_get_type(). * * Memory management of #cairo_pattern_t is done with * cairo_pattern_reference() and cairo_pattern_destroy(). **/ typedef struct _cairo_pattern cairo_pattern_t; /** * cairo_destroy_func_t: * @data: The data element being destroyed. * * #cairo_destroy_func_t the type of function which is called when a * data element is destroyed. It is passed the pointer to the data * element and should free any memory and resources allocated for it. **/ typedef void (*cairo_destroy_func_t) (void *data); /** * cairo_user_data_key_t: * @unused: not used; ignore. * * #cairo_user_data_key_t is used for attaching user data to cairo * data structures. The actual contents of the struct is never used, * and there is no need to initialize the object; only the unique * address of a #cairo_data_key_t object is used. Typically, you * would just use the address of a static #cairo_data_key_t object. **/ typedef struct _cairo_user_data_key { int unused; } cairo_user_data_key_t; /** * cairo_status_t: * @CAIRO_STATUS_SUCCESS: no error has occurred * @CAIRO_STATUS_NO_MEMORY: out of memory * @CAIRO_STATUS_INVALID_RESTORE: cairo_restore() called without matching cairo_save() * @CAIRO_STATUS_INVALID_POP_GROUP: no saved group to pop * @CAIRO_STATUS_NO_CURRENT_POINT: no current point defined * @CAIRO_STATUS_INVALID_MATRIX: invalid matrix (not invertible) * @CAIRO_STATUS_INVALID_STATUS: invalid value for an input #cairo_status_t * @CAIRO_STATUS_NULL_POINTER: %NULL pointer * @CAIRO_STATUS_INVALID_STRING: input string not valid UTF-8 * @CAIRO_STATUS_INVALID_PATH_DATA: input path data not valid * @CAIRO_STATUS_READ_ERROR: error while reading from input stream * @CAIRO_STATUS_WRITE_ERROR: error while writing to output stream * @CAIRO_STATUS_SURFACE_FINISHED: target surface has been finished * @CAIRO_STATUS_SURFACE_TYPE_MISMATCH: the surface type is not appropriate for the operation * @CAIRO_STATUS_PATTERN_TYPE_MISMATCH: the pattern type is not appropriate for the operation * @CAIRO_STATUS_INVALID_CONTENT: invalid value for an input #cairo_content_t * @CAIRO_STATUS_INVALID_FORMAT: invalid value for an input #cairo_format_t * @CAIRO_STATUS_INVALID_VISUAL: invalid value for an input Visual* * @CAIRO_STATUS_FILE_NOT_FOUND: file not found * @CAIRO_STATUS_INVALID_DASH: invalid value for a dash setting * @CAIRO_STATUS_INVALID_DSC_COMMENT: invalid value for a DSC comment (Since 1.2) * @CAIRO_STATUS_INVALID_INDEX: invalid index passed to getter (Since 1.4) * @CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: clip region not representable in desired format (Since 1.4) * @CAIRO_STATUS_TEMP_FILE_ERROR: error creating or writing to a temporary file (Since 1.6) * @CAIRO_STATUS_INVALID_STRIDE: invalid value for stride (Since 1.6) * * #cairo_status_t is used to indicate errors that can occur when * using Cairo. In some cases it is returned directly by functions. * but when using #cairo_t, the last error, if any, is stored in * the context and can be retrieved with cairo_status(). * * New entries may be added in future versions. Use cairo_status_to_string() * to get a human-readable representation of an error message. **/ typedef enum _cairo_status { CAIRO_STATUS_SUCCESS = 0, CAIRO_STATUS_NO_MEMORY, CAIRO_STATUS_INVALID_RESTORE, CAIRO_STATUS_INVALID_POP_GROUP, CAIRO_STATUS_NO_CURRENT_POINT, CAIRO_STATUS_INVALID_MATRIX, CAIRO_STATUS_INVALID_STATUS, CAIRO_STATUS_NULL_POINTER, CAIRO_STATUS_INVALID_STRING, CAIRO_STATUS_INVALID_PATH_DATA, CAIRO_STATUS_READ_ERROR, CAIRO_STATUS_WRITE_ERROR, CAIRO_STATUS_SURFACE_FINISHED, CAIRO_STATUS_SURFACE_TYPE_MISMATCH, CAIRO_STATUS_PATTERN_TYPE_MISMATCH, CAIRO_STATUS_INVALID_CONTENT, CAIRO_STATUS_INVALID_FORMAT, CAIRO_STATUS_INVALID_VISUAL, CAIRO_STATUS_FILE_NOT_FOUND, CAIRO_STATUS_INVALID_DASH, CAIRO_STATUS_INVALID_DSC_COMMENT, CAIRO_STATUS_INVALID_INDEX, CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, CAIRO_STATUS_TEMP_FILE_ERROR, CAIRO_STATUS_INVALID_STRIDE /* after adding a new error: update CAIRO_STATUS_LAST_STATUS in cairoint.h */ } cairo_status_t; /** * cairo_content_t: * @CAIRO_CONTENT_COLOR: The surface will hold color content only. * @CAIRO_CONTENT_ALPHA: The surface will hold alpha content only. * @CAIRO_CONTENT_COLOR_ALPHA: The surface will hold color and alpha content. * * #cairo_content_t is used to describe the content that a surface will * contain, whether color information, alpha information (translucence * vs. opacity), or both. * * Note: The large values here are designed to keep #cairo_content_t * values distinct from #cairo_format_t values so that the * implementation can detect the error if users confuse the two types. **/ typedef enum _cairo_content { CAIRO_CONTENT_COLOR = 0x1000, CAIRO_CONTENT_ALPHA = 0x2000, CAIRO_CONTENT_COLOR_ALPHA = 0x3000 } cairo_content_t; /** * cairo_write_func_t: * @closure: the output closure * @data: the buffer containing the data to write * @length: the amount of data to write * * #cairo_write_func_t is the type of function which is called when a * backend needs to write data to an output stream. It is passed the * closure which was specified by the user at the time the write * function was registered, the data to write and the length of the * data in bytes. The write function should return * CAIRO_STATUS_SUCCESS if all the data was successfully written, * CAIRO_STATUS_WRITE_ERROR otherwise. * * Returns: the status code of the write operation **/ typedef cairo_status_t (*cairo_write_func_t) (void *closure, const unsigned char *data, unsigned int length); /** * cairo_read_func_t: * @closure: the input closure * @data: the buffer into which to read the data * @length: the amount of data to read * * #cairo_read_func_t is the type of function which is called when a * backend needs to read data from an input stream. It is passed the * closure which was specified by the user at the time the read * function was registered, the buffer to read the data into and the * length of the data in bytes. The read function should return * CAIRO_STATUS_SUCCESS if all the data was successfully read, * CAIRO_STATUS_READ_ERROR otherwise. * * Returns: the status code of the read operation **/ typedef cairo_status_t (*cairo_read_func_t) (void *closure, unsigned char *data, unsigned int length); /* Functions for manipulating state objects */ cairo_public cairo_t * cairo_create (cairo_surface_t *target); cairo_public cairo_t * cairo_reference (cairo_t *cr); cairo_public void cairo_destroy (cairo_t *cr); cairo_public unsigned int cairo_get_reference_count (cairo_t *cr); cairo_public void * cairo_get_user_data (cairo_t *cr, const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_set_user_data (cairo_t *cr, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); cairo_public void cairo_save (cairo_t *cr); cairo_public void cairo_restore (cairo_t *cr); cairo_public void cairo_push_group (cairo_t *cr); cairo_public void cairo_push_group_with_content (cairo_t *cr, cairo_content_t content); cairo_public cairo_pattern_t * cairo_pop_group (cairo_t *cr); cairo_public void cairo_pop_group_to_source (cairo_t *cr); /* Modify state */ /** * cairo_operator_t: * @CAIRO_OPERATOR_CLEAR: clear destination layer (bounded) * @CAIRO_OPERATOR_SOURCE: replace destination layer (bounded) * @CAIRO_OPERATOR_OVER: draw source layer on top of destination layer * (bounded) * @CAIRO_OPERATOR_IN: draw source where there was destination content * (unbounded) * @CAIRO_OPERATOR_OUT: draw source where there was no destination * content (unbounded) * @CAIRO_OPERATOR_ATOP: draw source on top of destination content and * only there * @CAIRO_OPERATOR_DEST: ignore the source * @CAIRO_OPERATOR_DEST_OVER: draw destination on top of source * @CAIRO_OPERATOR_DEST_IN: leave destination only where there was * source content (unbounded) * @CAIRO_OPERATOR_DEST_OUT: leave destination only where there was no * source content * @CAIRO_OPERATOR_DEST_ATOP: leave destination on top of source content * and only there (unbounded) * @CAIRO_OPERATOR_XOR: source and destination are shown where there is only * one of them * @CAIRO_OPERATOR_ADD: source and destination layers are accumulated * @CAIRO_OPERATOR_SATURATE: like over, but assuming source and dest are * disjoint geometries * * #cairo_operator_t is used to set the compositing operator for all cairo * drawing operations. * * The default operator is %CAIRO_OPERATOR_OVER. * * The operators marked as unbounded modify their * destination even outside of the mask layer (that is, their effect is not * bound by the mask layer). However, their effect can still be limited by * way of clipping. * * To keep things simple, the operator descriptions here * document the behavior for when both source and destination are either fully * transparent or fully opaque. The actual implementation works for * translucent layers too. * For a more detailed explanation of the effects of each operator, including * the mathematical definitions, see * http://cairographics.org/operators/. **/ typedef enum _cairo_operator { CAIRO_OPERATOR_CLEAR, CAIRO_OPERATOR_SOURCE, CAIRO_OPERATOR_OVER, CAIRO_OPERATOR_IN, CAIRO_OPERATOR_OUT, CAIRO_OPERATOR_ATOP, CAIRO_OPERATOR_DEST, CAIRO_OPERATOR_DEST_OVER, CAIRO_OPERATOR_DEST_IN, CAIRO_OPERATOR_DEST_OUT, CAIRO_OPERATOR_DEST_ATOP, CAIRO_OPERATOR_XOR, CAIRO_OPERATOR_ADD, CAIRO_OPERATOR_SATURATE } cairo_operator_t; cairo_public void cairo_set_operator (cairo_t *cr, cairo_operator_t op); cairo_public void cairo_set_source (cairo_t *cr, cairo_pattern_t *source); cairo_public void cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue); cairo_public void cairo_set_source_rgba (cairo_t *cr, double red, double green, double blue, double alpha); cairo_public void cairo_set_source_surface (cairo_t *cr, cairo_surface_t *surface, double x, double y); cairo_public void cairo_set_tolerance (cairo_t *cr, double tolerance); /** * cairo_antialias_t: * @CAIRO_ANTIALIAS_DEFAULT: Use the default antialiasing for * the subsystem and target device * @CAIRO_ANTIALIAS_NONE: Use a bilevel alpha mask * @CAIRO_ANTIALIAS_GRAY: Perform single-color antialiasing (using * shades of gray for black text on a white background, for example). * @CAIRO_ANTIALIAS_SUBPIXEL: Perform antialiasing by taking * advantage of the order of subpixel elements on devices * such as LCD panels * * Specifies the type of antialiasing to do when rendering text or shapes. **/ typedef enum _cairo_antialias { CAIRO_ANTIALIAS_DEFAULT, CAIRO_ANTIALIAS_NONE, CAIRO_ANTIALIAS_GRAY, CAIRO_ANTIALIAS_SUBPIXEL } cairo_antialias_t; cairo_public void cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias); /** * cairo_fill_rule_t: * @CAIRO_FILL_RULE_WINDING: If the path crosses the ray from * left-to-right, counts +1. If the path crosses the ray * from right to left, counts -1. (Left and right are determined * from the perspective of looking along the ray from the starting * point.) If the total count is non-zero, the point will be filled. * @CAIRO_FILL_RULE_EVEN_ODD: Counts the total number of * intersections, without regard to the orientation of the contour. If * the total number of intersections is odd, the point will be * filled. * * #cairo_fill_rule_t is used to select how paths are filled. For both * fill rules, whether or not a point is included in the fill is * determined by taking a ray from that point to infinity and looking * at intersections with the path. The ray can be in any direction, * as long as it doesn't pass through the end point of a segment * or have a tricky intersection such as intersecting tangent to the path. * (Note that filling is not actually implemented in this way. This * is just a description of the rule that is applied.) * * The default fill rule is %CAIRO_FILL_RULE_WINDING. * * New entries may be added in future versions. **/ typedef enum _cairo_fill_rule { CAIRO_FILL_RULE_WINDING, CAIRO_FILL_RULE_EVEN_ODD } cairo_fill_rule_t; cairo_public void cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule); cairo_public void cairo_set_line_width (cairo_t *cr, double width); /** * cairo_line_cap_t: * @CAIRO_LINE_CAP_BUTT: start(stop) the line exactly at the start(end) point * @CAIRO_LINE_CAP_ROUND: use a round ending, the center of the circle is the end point * @CAIRO_LINE_CAP_SQUARE: use squared ending, the center of the square is the end point * * Specifies how to render the endpoints of the path when stroking. * * The default line cap style is %CAIRO_LINE_CAP_BUTT. **/ typedef enum _cairo_line_cap { CAIRO_LINE_CAP_BUTT, CAIRO_LINE_CAP_ROUND, CAIRO_LINE_CAP_SQUARE } cairo_line_cap_t; cairo_public void cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap); /** * cairo_line_join_t: * @CAIRO_LINE_JOIN_MITER: use a sharp (angled) corner, see * cairo_set_miter_limit() * @CAIRO_LINE_JOIN_ROUND: use a rounded join, the center of the circle is the * joint point * @CAIRO_LINE_JOIN_BEVEL: use a cut-off join, the join is cut off at half * the line width from the joint point * * Specifies how to render the junction of two lines when stroking. * * The default line join style is %CAIRO_LINE_JOIN_MITER. **/ typedef enum _cairo_line_join { CAIRO_LINE_JOIN_MITER, CAIRO_LINE_JOIN_ROUND, CAIRO_LINE_JOIN_BEVEL } cairo_line_join_t; cairo_public void cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join); cairo_public void cairo_set_dash (cairo_t *cr, const double *dashes, int num_dashes, double offset); cairo_public void cairo_set_miter_limit (cairo_t *cr, double limit); cairo_public void cairo_translate (cairo_t *cr, double tx, double ty); cairo_public void cairo_scale (cairo_t *cr, double sx, double sy); cairo_public void cairo_rotate (cairo_t *cr, double angle); cairo_public void cairo_transform (cairo_t *cr, const cairo_matrix_t *matrix); cairo_public void cairo_set_matrix (cairo_t *cr, const cairo_matrix_t *matrix); cairo_public void cairo_identity_matrix (cairo_t *cr); cairo_public void cairo_user_to_device (cairo_t *cr, double *x, double *y); cairo_public void cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy); cairo_public void cairo_device_to_user (cairo_t *cr, double *x, double *y); cairo_public void cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy); /* Path creation functions */ cairo_public void cairo_new_path (cairo_t *cr); cairo_public void cairo_move_to (cairo_t *cr, double x, double y); cairo_public void cairo_new_sub_path (cairo_t *cr); cairo_public void cairo_line_to (cairo_t *cr, double x, double y); cairo_public void cairo_curve_to (cairo_t *cr, double x1, double y1, double x2, double y2, double x3, double y3); cairo_public void cairo_arc (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); cairo_public void cairo_arc_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); /* XXX: NYI cairo_public void cairo_arc_to (cairo_t *cr, double x1, double y1, double x2, double y2, double radius); */ cairo_public void cairo_rel_move_to (cairo_t *cr, double dx, double dy); cairo_public void cairo_rel_line_to (cairo_t *cr, double dx, double dy); cairo_public void cairo_rel_curve_to (cairo_t *cr, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3); cairo_public void cairo_rectangle (cairo_t *cr, double x, double y, double width, double height); /* XXX: NYI cairo_public void cairo_stroke_to_path (cairo_t *cr); */ cairo_public void cairo_close_path (cairo_t *cr); cairo_public void cairo_path_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); /* Painting functions */ cairo_public void cairo_paint (cairo_t *cr); cairo_public void cairo_paint_with_alpha (cairo_t *cr, double alpha); cairo_public void cairo_mask (cairo_t *cr, cairo_pattern_t *pattern); cairo_public void cairo_mask_surface (cairo_t *cr, cairo_surface_t *surface, double surface_x, double surface_y); cairo_public void cairo_stroke (cairo_t *cr); cairo_public void cairo_stroke_preserve (cairo_t *cr); cairo_public void cairo_fill (cairo_t *cr); cairo_public void cairo_fill_preserve (cairo_t *cr); cairo_public void cairo_copy_page (cairo_t *cr); cairo_public void cairo_show_page (cairo_t *cr); /* Insideness testing */ cairo_public cairo_bool_t cairo_in_stroke (cairo_t *cr, double x, double y); cairo_public cairo_bool_t cairo_in_fill (cairo_t *cr, double x, double y); /* Rectangular extents */ cairo_public void cairo_stroke_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); cairo_public void cairo_fill_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); /* Clipping */ cairo_public void cairo_reset_clip (cairo_t *cr); cairo_public void cairo_clip (cairo_t *cr); cairo_public void cairo_clip_preserve (cairo_t *cr); cairo_public void cairo_clip_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); /** * cairo_rectangle_t: * @x: X coordinate of the left side of the rectangle * @y: Y coordinate of the the top side of the rectangle * @width: width of the rectangle * @height: height of the rectangle * * A data structure for holding a rectangle. * * Since: 1.4 **/ typedef struct _cairo_rectangle { double x, y, width, height; } cairo_rectangle_t; /** * cairo_rectangle_list_t: * @status: Error status of the rectangle list * @rectangles: Array containing the rectangles * @num_rectangles: Number of rectangles in this list * * A data structure for holding a dynamically allocated * array of rectangles. * * Since: 1.4 **/ typedef struct _cairo_rectangle_list { cairo_status_t status; cairo_rectangle_t *rectangles; int num_rectangles; } cairo_rectangle_list_t; cairo_public cairo_rectangle_list_t * cairo_copy_clip_rectangle_list (cairo_t *cr); cairo_public void cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list); /* Font/Text functions */ /** * cairo_scaled_font_t: * * A #cairo_scaled_font_t is a font scaled to a particular size and device * resolution. A #cairo_scaled_font_t is most useful for low-level font * usage where a library or application wants to cache a reference * to a scaled font to speed up the computation of metrics. * * There are various types of scaled fonts, depending on the * font backend they use. The type of a * scaled font can be queried using cairo_scaled_font_get_type(). * * Memory management of #cairo_scaled_font_t is done with * cairo_scaled_font_reference() and cairo_scaled_font_destroy(). **/ typedef struct _cairo_scaled_font cairo_scaled_font_t; /** * cairo_font_face_t: * * A #cairo_font_face_t specifies all aspects of a font other * than the size or font matrix (a font matrix is used to distort * a font by sheering it or scaling it unequally in the two * directions) . A font face can be set on a #cairo_t by using * cairo_set_font_face(); the size and font matrix are set with * cairo_set_font_size() and cairo_set_font_matrix(). * * There are various types of font faces, depending on the * font backend they use. The type of a * font face can be queried using cairo_font_face_get_type(). * * Memory management of #cairo_font_face_t is done with * cairo_font_face_reference() and cairo_font_face_destroy(). **/ typedef struct _cairo_font_face cairo_font_face_t; /** * cairo_glyph_t: * @index: glyph index in the font. The exact interpretation of the * glyph index depends on the font technology being used. * @x: the offset in the X direction between the origin used for * drawing or measuring the string and the origin of this glyph. * @y: the offset in the Y direction between the origin used for * drawing or measuring the string and the origin of this glyph. * * The #cairo_glyph_t structure holds information about a single glyph * when drawing or measuring text. A font is (in simple terms) a * collection of shapes used to draw text. A glyph is one of these * shapes. There can be multiple glyphs for a single character * (alternates to be used in different contexts, for example), or a * glyph can be a ligature of multiple * characters. Cairo doesn't expose any way of converting input text * into glyphs, so in order to use the Cairo interfaces that take * arrays of glyphs, you must directly access the appropriate * underlying font system. * * Note that the offsets given by @x and @y are not cumulative. When * drawing or measuring text, each glyph is individually positioned * with respect to the overall origin **/ typedef struct { unsigned long index; double x; double y; } cairo_glyph_t; /** * cairo_text_extents_t: * @x_bearing: the horizontal distance from the origin to the * leftmost part of the glyphs as drawn. Positive if the * glyphs lie entirely to the right of the origin. * @y_bearing: the vertical distance from the origin to the * topmost part of the glyphs as drawn. Positive only if the * glyphs lie completely below the origin; will usually be * negative. * @width: width of the glyphs as drawn * @height: height of the glyphs as drawn * @x_advance:distance to advance in the X direction * after drawing these glyphs * @y_advance: distance to advance in the Y direction * after drawing these glyphs. Will typically be zero except * for vertical text layout as found in East-Asian languages. * * The #cairo_text_extents_t structure stores the extents of a single * glyph or a string of glyphs in user-space coordinates. Because text * extents are in user-space coordinates, they are mostly, but not * entirely, independent of the current transformation matrix. If you call * cairo_scale(cr, 2.0, 2.0), text will * be drawn twice as big, but the reported text extents will not be * doubled. They will change slightly due to hinting (so you can't * assume that metrics are independent of the transformation matrix), * but otherwise will remain unchanged. **/ typedef struct { double x_bearing; double y_bearing; double width; double height; double x_advance; double y_advance; } cairo_text_extents_t; /** * cairo_font_extents_t: * @ascent: the distance that the font extends above the baseline. * Note that this is not always exactly equal to the maximum * of the extents of all the glyphs in the font, but rather * is picked to express the font designer's intent as to * how the font should align with elements above it. * @descent: the distance that the font extends below the baseline. * This value is positive for typical fonts that include * portions below the baseline. Note that this is not always * exactly equal to the maximum of the extents of all the * glyphs in the font, but rather is picked to express the * font designer's intent as to how the the font should * align with elements below it. * @height: the recommended vertical distance between baselines when * setting consecutive lines of text with the font. This * is greater than @ascent+@descent by a * quantity known as the line spacing * or external leading. When space * is at a premium, most fonts can be set with only * a distance of @ascent+@descent between lines. * @max_x_advance: the maximum distance in the X direction that * the the origin is advanced for any glyph in the font. * @max_y_advance: the maximum distance in the Y direction that * the the origin is advanced for any glyph in the font. * this will be zero for normal fonts used for horizontal * writing. (The scripts of East Asia are sometimes written * vertically.) * * The #cairo_font_extents_t structure stores metric information for * a font. Values are given in the current user-space coordinate * system. * * Because font metrics are in user-space coordinates, they are * mostly, but not entirely, independent of the current transformation * matrix. If you call cairo_scale(cr, 2.0, 2.0), * text will be drawn twice as big, but the reported text extents will * not be doubled. They will change slightly due to hinting (so you * can't assume that metrics are independent of the transformation * matrix), but otherwise will remain unchanged. **/ typedef struct { double ascent; double descent; double height; double max_x_advance; double max_y_advance; } cairo_font_extents_t; /** * cairo_font_slant_t: * @CAIRO_FONT_SLANT_NORMAL: Upright font style * @CAIRO_FONT_SLANT_ITALIC: Italic font style * @CAIRO_FONT_SLANT_OBLIQUE: Oblique font style * * Specifies variants of a font face based on their slant. **/ typedef enum _cairo_font_slant { CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_SLANT_ITALIC, CAIRO_FONT_SLANT_OBLIQUE } cairo_font_slant_t; /** * cairo_font_weight_t: * @CAIRO_FONT_WEIGHT_NORMAL: Normal font weight * @CAIRO_FONT_WEIGHT_BOLD: Bold font weight * * Specifies variants of a font face based on their weight. **/ typedef enum _cairo_font_weight { CAIRO_FONT_WEIGHT_NORMAL, CAIRO_FONT_WEIGHT_BOLD } cairo_font_weight_t; /** * cairo_subpixel_order_t: * @CAIRO_SUBPIXEL_ORDER_DEFAULT: Use the default subpixel order for * for the target device * @CAIRO_SUBPIXEL_ORDER_RGB: Subpixel elements are arranged horizontally * with red at the left * @CAIRO_SUBPIXEL_ORDER_BGR: Subpixel elements are arranged horizontally * with blue at the left * @CAIRO_SUBPIXEL_ORDER_VRGB: Subpixel elements are arranged vertically * with red at the top * @CAIRO_SUBPIXEL_ORDER_VBGR: Subpixel elements are arranged vertically * with blue at the top * * The subpixel order specifies the order of color elements within * each pixel on the display device when rendering with an * antialiasing mode of %CAIRO_ANTIALIAS_SUBPIXEL. **/ typedef enum _cairo_subpixel_order { CAIRO_SUBPIXEL_ORDER_DEFAULT, CAIRO_SUBPIXEL_ORDER_RGB, CAIRO_SUBPIXEL_ORDER_BGR, CAIRO_SUBPIXEL_ORDER_VRGB, CAIRO_SUBPIXEL_ORDER_VBGR } cairo_subpixel_order_t; /** * cairo_hint_style_t: * @CAIRO_HINT_STYLE_DEFAULT: Use the default hint style for * font backend and target device * @CAIRO_HINT_STYLE_NONE: Do not hint outlines * @CAIRO_HINT_STYLE_SLIGHT: Hint outlines slightly to improve * contrast while retaining good fidelity to the original * shapes. * @CAIRO_HINT_STYLE_MEDIUM: Hint outlines with medium strength * giving a compromise between fidelity to the original shapes * and contrast * @CAIRO_HINT_STYLE_FULL: Hint outlines to maximize contrast * * Specifies the type of hinting to do on font outlines. Hinting * is the process of fitting outlines to the pixel grid in order * to improve the appearance of the result. Since hinting outlines * involves distorting them, it also reduces the faithfulness * to the original outline shapes. Not all of the outline hinting * styles are supported by all font backends. * * New entries may be added in future versions. **/ typedef enum _cairo_hint_style { CAIRO_HINT_STYLE_DEFAULT, CAIRO_HINT_STYLE_NONE, CAIRO_HINT_STYLE_SLIGHT, CAIRO_HINT_STYLE_MEDIUM, CAIRO_HINT_STYLE_FULL } cairo_hint_style_t; /** * cairo_hint_metrics_t: * @CAIRO_HINT_METRICS_DEFAULT: Hint metrics in the default * manner for the font backend and target device * @CAIRO_HINT_METRICS_OFF: Do not hint font metrics * @CAIRO_HINT_METRICS_ON: Hint font metrics * * Specifies whether to hint font metrics; hinting font metrics * means quantizing them so that they are integer values in * device space. Doing this improves the consistency of * letter and line spacing, however it also means that text * will be laid out differently at different zoom factors. **/ typedef enum _cairo_hint_metrics { CAIRO_HINT_METRICS_DEFAULT, CAIRO_HINT_METRICS_OFF, CAIRO_HINT_METRICS_ON } cairo_hint_metrics_t; /** * cairo_font_options_t: * * An opaque structure holding all options that are used when * rendering fonts. * * Individual features of a #cairo_font_options_t can be set or * accessed using functions named * cairo_font_options_set_feature_name and * cairo_font_options_get_feature_name, like * cairo_font_options_set_antialias() and * cairo_font_options_get_antialias(). * * New features may be added to a #cairo_font_options_t in the * future. For this reason, cairo_font_options_copy(), * cairo_font_options_equal(), cairo_font_options_merge(), and * cairo_font_options_hash() should be used to copy, check * for equality, merge, or compute a hash value of * #cairo_font_options_t objects. **/ typedef struct _cairo_font_options cairo_font_options_t; cairo_public cairo_font_options_t * cairo_font_options_create (void); cairo_public cairo_font_options_t * cairo_font_options_copy (const cairo_font_options_t *original); cairo_public void cairo_font_options_destroy (cairo_font_options_t *options); cairo_public cairo_status_t cairo_font_options_status (cairo_font_options_t *options); cairo_public void cairo_font_options_merge (cairo_font_options_t *options, const cairo_font_options_t *other); cairo_public cairo_bool_t cairo_font_options_equal (const cairo_font_options_t *options, const cairo_font_options_t *other); cairo_public unsigned long cairo_font_options_hash (const cairo_font_options_t *options); cairo_public void cairo_font_options_set_antialias (cairo_font_options_t *options, cairo_antialias_t antialias); cairo_public cairo_antialias_t cairo_font_options_get_antialias (const cairo_font_options_t *options); cairo_public void cairo_font_options_set_subpixel_order (cairo_font_options_t *options, cairo_subpixel_order_t subpixel_order); cairo_public cairo_subpixel_order_t cairo_font_options_get_subpixel_order (const cairo_font_options_t *options); cairo_public void cairo_font_options_set_hint_style (cairo_font_options_t *options, cairo_hint_style_t hint_style); cairo_public cairo_hint_style_t cairo_font_options_get_hint_style (const cairo_font_options_t *options); cairo_public void cairo_font_options_set_hint_metrics (cairo_font_options_t *options, cairo_hint_metrics_t hint_metrics); cairo_public cairo_hint_metrics_t cairo_font_options_get_hint_metrics (const cairo_font_options_t *options); /* This interface is for dealing with text as text, not caring about the font object inside the the cairo_t. */ cairo_public void cairo_select_font_face (cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight); cairo_public void cairo_set_font_size (cairo_t *cr, double size); cairo_public void cairo_set_font_matrix (cairo_t *cr, const cairo_matrix_t *matrix); cairo_public void cairo_get_font_matrix (cairo_t *cr, cairo_matrix_t *matrix); cairo_public void cairo_set_font_options (cairo_t *cr, const cairo_font_options_t *options); cairo_public void cairo_get_font_options (cairo_t *cr, cairo_font_options_t *options); cairo_public void cairo_set_font_face (cairo_t *cr, cairo_font_face_t *font_face); cairo_public cairo_font_face_t * cairo_get_font_face (cairo_t *cr); cairo_public void cairo_set_scaled_font (cairo_t *cr, const cairo_scaled_font_t *scaled_font); cairo_public cairo_scaled_font_t * cairo_get_scaled_font (cairo_t *cr); cairo_public void cairo_show_text (cairo_t *cr, const char *utf8); cairo_public void cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs); cairo_public void cairo_text_path (cairo_t *cr, const char *utf8); cairo_public void cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs); cairo_public void cairo_text_extents (cairo_t *cr, const char *utf8, cairo_text_extents_t *extents); cairo_public void cairo_glyph_extents (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents); cairo_public void cairo_font_extents (cairo_t *cr, cairo_font_extents_t *extents); /* Generic identifier for a font style */ cairo_public cairo_font_face_t * cairo_font_face_reference (cairo_font_face_t *font_face); cairo_public void cairo_font_face_destroy (cairo_font_face_t *font_face); cairo_public unsigned int cairo_font_face_get_reference_count (cairo_font_face_t *font_face); cairo_public cairo_status_t cairo_font_face_status (cairo_font_face_t *font_face); /** * cairo_font_type_t: * @CAIRO_FONT_TYPE_TOY: The font was created using cairo's toy font api * @CAIRO_FONT_TYPE_FT: The font is of type FreeType * @CAIRO_FONT_TYPE_WIN32: The font is of type Win32 * @CAIRO_FONT_TYPE_QUARTZ: The font is of type Quartz (Since: 1.6) * * #cairo_font_type_t is used to describe the type of a given font * face or scaled font. The font types are also known as "font * backends" within cairo. * * The type of a font face is determined by the function used to * create it, which will generally be of the form * cairo_type_font_face_create. The font face type can be queried * with cairo_font_face_get_type() * * The various #cairo_font_face_t functions can be used with a font face * of any type. * * The type of a scaled font is determined by the type of the font * face passed to cairo_scaled_font_create(). The scaled font type can * be queried with cairo_scaled_font_get_type() * * The various #cairo_scaled_font_t functions can be used with scaled * fonts of any type, but some font backends also provide * type-specific functions that must only be called with a scaled font * of the appropriate type. These functions have names that begin with * cairo_type_scaled_font such as cairo_ft_scaled_font_lock_face(). * * The behavior of calling a type-specific function with a scaled font * of the wrong type is undefined. * * New entries may be added in future versions. * * Since: 1.2 **/ typedef enum _cairo_font_type { CAIRO_FONT_TYPE_TOY, CAIRO_FONT_TYPE_FT, CAIRO_FONT_TYPE_WIN32, CAIRO_FONT_TYPE_QUARTZ } cairo_font_type_t; cairo_public cairo_font_type_t cairo_font_face_get_type (cairo_font_face_t *font_face); cairo_public void * cairo_font_face_get_user_data (cairo_font_face_t *font_face, const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_font_face_set_user_data (cairo_font_face_t *font_face, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); /* Portable interface to general font features. */ cairo_public cairo_scaled_font_t * cairo_scaled_font_create (cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options); cairo_public cairo_scaled_font_t * cairo_scaled_font_reference (cairo_scaled_font_t *scaled_font); cairo_public void cairo_scaled_font_destroy (cairo_scaled_font_t *scaled_font); cairo_public unsigned int cairo_scaled_font_get_reference_count (cairo_scaled_font_t *scaled_font); cairo_public cairo_status_t cairo_scaled_font_status (cairo_scaled_font_t *scaled_font); cairo_public cairo_font_type_t cairo_scaled_font_get_type (cairo_scaled_font_t *scaled_font); cairo_public void * cairo_scaled_font_get_user_data (cairo_scaled_font_t *scaled_font, const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_scaled_font_set_user_data (cairo_scaled_font_t *scaled_font, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); cairo_public void cairo_scaled_font_extents (cairo_scaled_font_t *scaled_font, cairo_font_extents_t *extents); cairo_public void cairo_scaled_font_text_extents (cairo_scaled_font_t *scaled_font, const char *utf8, cairo_text_extents_t *extents); cairo_public void cairo_scaled_font_glyph_extents (cairo_scaled_font_t *scaled_font, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents); cairo_public cairo_font_face_t * cairo_scaled_font_get_font_face (cairo_scaled_font_t *scaled_font); cairo_public void cairo_scaled_font_get_font_matrix (cairo_scaled_font_t *scaled_font, cairo_matrix_t *font_matrix); cairo_public void cairo_scaled_font_get_ctm (cairo_scaled_font_t *scaled_font, cairo_matrix_t *ctm); cairo_public void cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, cairo_font_options_t *options); /* Query functions */ cairo_public cairo_operator_t cairo_get_operator (cairo_t *cr); cairo_public cairo_pattern_t * cairo_get_source (cairo_t *cr); cairo_public double cairo_get_tolerance (cairo_t *cr); cairo_public cairo_antialias_t cairo_get_antialias (cairo_t *cr); cairo_public cairo_bool_t cairo_has_current_point (cairo_t *cr); cairo_public void cairo_get_current_point (cairo_t *cr, double *x, double *y); cairo_public cairo_fill_rule_t cairo_get_fill_rule (cairo_t *cr); cairo_public double cairo_get_line_width (cairo_t *cr); cairo_public cairo_line_cap_t cairo_get_line_cap (cairo_t *cr); cairo_public cairo_line_join_t cairo_get_line_join (cairo_t *cr); cairo_public double cairo_get_miter_limit (cairo_t *cr); cairo_public int cairo_get_dash_count (cairo_t *cr); cairo_public void cairo_get_dash (cairo_t *cr, double *dashes, double *offset); cairo_public void cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix); cairo_public cairo_surface_t * cairo_get_target (cairo_t *cr); cairo_public cairo_surface_t * cairo_get_group_target (cairo_t *cr); /** * cairo_path_data_type_t: * @CAIRO_PATH_MOVE_TO: A move-to operation * @CAIRO_PATH_LINE_TO: A line-to operation * @CAIRO_PATH_CURVE_TO: A curve-to operation * @CAIRO_PATH_CLOSE_PATH: A close-path operation * * #cairo_path_data_t is used to describe the type of one portion * of a path when represented as a #cairo_path_t. * See #cairo_path_data_t for details. **/ typedef enum _cairo_path_data_type { CAIRO_PATH_MOVE_TO, CAIRO_PATH_LINE_TO, CAIRO_PATH_CURVE_TO, CAIRO_PATH_CLOSE_PATH } cairo_path_data_type_t; /** * cairo_path_data_t: * * #cairo_path_data_t is used to represent the path data inside a * #cairo_path_t. * * The data structure is designed to try to balance the demands of * efficiency and ease-of-use. A path is represented as an array of * #cairo_path_data_t, which is a union of headers and points. * * Each portion of the path is represented by one or more elements in * the array, (one header followed by 0 or more points). The length * value of the header is the number of array elements for the current * portion including the header, (ie. length == 1 + # of points), and * where the number of points for each element type is as follows: * * * %CAIRO_PATH_MOVE_TO: 1 point * %CAIRO_PATH_LINE_TO: 1 point * %CAIRO_PATH_CURVE_TO: 3 points * %CAIRO_PATH_CLOSE_PATH: 0 points * * * The semantics and ordering of the coordinate values are consistent * with cairo_move_to(), cairo_line_to(), cairo_curve_to(), and * cairo_close_path(). * * Here is sample code for iterating through a #cairo_path_t: * * * int i; * #cairo_path_t *path; * #cairo_path_data_t *data; *   * path = cairo_copy_path (cr); *   * for (i=0; i < path->num_data; i += path->data[i].header.length) { * data = &path->data[i]; * switch (data->header.type) { * case %CAIRO_PATH_MOVE_TO: * do_move_to_things (data[1].point.x, data[1].point.y); * break; * case %CAIRO_PATH_LINE_TO: * do_line_to_things (data[1].point.x, data[1].point.y); * break; * case %CAIRO_PATH_CURVE_TO: * do_curve_to_things (data[1].point.x, data[1].point.y, * data[2].point.x, data[2].point.y, * data[3].point.x, data[3].point.y); * break; * case %CAIRO_PATH_CLOSE_PATH: * do_close_path_things (); * break; * } * } * cairo_path_destroy (path); * * * As of cairo 1.4, cairo does not mind if there are more elements in * a portion of the path than needed. Such elements can be used by * users of the cairo API to hold extra values in the path data * structure. For this reason, it is recommended that applications * always use data->header.length to * iterate over the path data, instead of hardcoding the number of * elements for each element type. **/ typedef union _cairo_path_data_t cairo_path_data_t; union _cairo_path_data_t { struct { cairo_path_data_type_t type; int length; } header; struct { double x, y; } point; }; /** * cairo_path_t: * @status: the current error status * @data: the elements in the path * @num_data: the number of elements in the data array * * A data structure for holding a path. This data structure serves as * the return value for cairo_copy_path() and * cairo_copy_path_flat() as well the input value for * cairo_append_path(). * * See #cairo_path_data_t for hints on how to iterate over the * actual data within the path. * * The num_data member gives the number of elements in the data * array. This number is larger than the number of independent path * portions (defined in #cairo_path_data_type_t), since the data * includes both headers and coordinates for each portion. **/ typedef struct cairo_path { cairo_status_t status; cairo_path_data_t *data; int num_data; } cairo_path_t; cairo_public cairo_path_t * cairo_copy_path (cairo_t *cr); cairo_public cairo_path_t * cairo_copy_path_flat (cairo_t *cr); cairo_public void cairo_append_path (cairo_t *cr, const cairo_path_t *path); cairo_public void cairo_path_destroy (cairo_path_t *path); /* Error status queries */ cairo_public cairo_status_t cairo_status (cairo_t *cr); cairo_public const char * cairo_status_to_string (cairo_status_t status); /* Surface manipulation */ cairo_public cairo_surface_t * cairo_surface_create_similar (cairo_surface_t *other, cairo_content_t content, int width, int height); cairo_public cairo_surface_t * cairo_surface_reference (cairo_surface_t *surface); cairo_public void cairo_surface_finish (cairo_surface_t *surface); cairo_public void cairo_surface_destroy (cairo_surface_t *surface); cairo_public unsigned int cairo_surface_get_reference_count (cairo_surface_t *surface); cairo_public cairo_status_t cairo_surface_status (cairo_surface_t *surface); /** * cairo_surface_type_t: * @CAIRO_SURFACE_TYPE_IMAGE: The surface is of type image * @CAIRO_SURFACE_TYPE_PDF: The surface is of type pdf * @CAIRO_SURFACE_TYPE_PS: The surface is of type ps * @CAIRO_SURFACE_TYPE_XLIB: The surface is of type xlib * @CAIRO_SURFACE_TYPE_XCB: The surface is of type xcb * @CAIRO_SURFACE_TYPE_GLITZ: The surface is of type glitz * @CAIRO_SURFACE_TYPE_QUARTZ: The surface is of type quartz * @CAIRO_SURFACE_TYPE_WIN32: The surface is of type win32 * @CAIRO_SURFACE_TYPE_BEOS: The surface is of type beos * @CAIRO_SURFACE_TYPE_DIRECTFB: The surface is of type directfb * @CAIRO_SURFACE_TYPE_SVG: The surface is of type svg * @CAIRO_SURFACE_TYPE_OS2: The surface is of type os2 * @CAIRO_SURFACE_TYPE_WIN32_PRINTING: The surface is a win32 printing surface * @CAIRO_SURFACE_TYPE_QUARTZ_IMAGE: The surface is of type quartz_image * * #cairo_surface_type_t is used to describe the type of a given * surface. The surface types are also known as "backends" or "surface * backends" within cairo. * * The type of a surface is determined by the function used to create * it, which will generally be of the form cairo_type_surface_create(), * (though see cairo_surface_create_similar() as well). * * The surface type can be queried with cairo_surface_get_type() * * The various #cairo_surface_t functions can be used with surfaces of * any type, but some backends also provide type-specific functions * that must only be called with a surface of the appropriate * type. These functions have names that begin with * cairo_type_surface such as cairo_image_surface_get_width(). * * The behavior of calling a type-specific function with a surface of * the wrong type is undefined. * * New entries may be added in future versions. * * Since: 1.2 **/ typedef enum _cairo_surface_type { CAIRO_SURFACE_TYPE_IMAGE, CAIRO_SURFACE_TYPE_PDF, CAIRO_SURFACE_TYPE_PS, CAIRO_SURFACE_TYPE_XLIB, CAIRO_SURFACE_TYPE_XCB, CAIRO_SURFACE_TYPE_GLITZ, CAIRO_SURFACE_TYPE_QUARTZ, CAIRO_SURFACE_TYPE_WIN32, CAIRO_SURFACE_TYPE_BEOS, CAIRO_SURFACE_TYPE_DIRECTFB, CAIRO_SURFACE_TYPE_SVG, CAIRO_SURFACE_TYPE_OS2, CAIRO_SURFACE_TYPE_WIN32_PRINTING, CAIRO_SURFACE_TYPE_QUARTZ_IMAGE } cairo_surface_type_t; cairo_public cairo_surface_type_t cairo_surface_get_type (cairo_surface_t *surface); cairo_public cairo_content_t cairo_surface_get_content (cairo_surface_t *surface); #if CAIRO_HAS_PNG_FUNCTIONS cairo_public cairo_status_t cairo_surface_write_to_png (cairo_surface_t *surface, const char *filename); cairo_public cairo_status_t cairo_surface_write_to_png_stream (cairo_surface_t *surface, cairo_write_func_t write_func, void *closure); #endif cairo_public void * cairo_surface_get_user_data (cairo_surface_t *surface, const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_surface_set_user_data (cairo_surface_t *surface, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); cairo_public void cairo_surface_get_font_options (cairo_surface_t *surface, cairo_font_options_t *options); cairo_public void cairo_surface_flush (cairo_surface_t *surface); cairo_public void cairo_surface_mark_dirty (cairo_surface_t *surface); cairo_public void cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, int x, int y, int width, int height); cairo_public void cairo_surface_set_device_offset (cairo_surface_t *surface, double x_offset, double y_offset); cairo_public void cairo_surface_get_device_offset (cairo_surface_t *surface, double *x_offset, double *y_offset); cairo_public void cairo_surface_set_fallback_resolution (cairo_surface_t *surface, double x_pixels_per_inch, double y_pixels_per_inch); cairo_public void cairo_surface_copy_page (cairo_surface_t *surface); cairo_public void cairo_surface_show_page (cairo_surface_t *surface); /* Image-surface functions */ /** * cairo_format_t: * @CAIRO_FORMAT_ARGB32: each pixel is a 32-bit quantity, with * alpha in the upper 8 bits, then red, then green, then blue. * The 32-bit quantities are stored native-endian. Pre-multiplied * alpha is used. (That is, 50% transparent red is 0x80800000, * not 0x80ff0000.) * @CAIRO_FORMAT_RGB24: each pixel is a 32-bit quantity, with * the upper 8 bits unused. Red, Green, and Blue are stored * in the remaining 24 bits in that order. * @CAIRO_FORMAT_A8: each pixel is a 8-bit quantity holding * an alpha value. * @CAIRO_FORMAT_A1: each pixel is a 1-bit quantity holding * an alpha value. Pixels are packed together into 32-bit * quantities. The ordering of the bits matches the * endianess of the platform. On a big-endian machine, the * first pixel is in the uppermost bit, on a little-endian * machine the first pixel is in the least-significant bit. * @CAIRO_FORMAT_RGB16_565: This format value is deprecated. It has * never been properly implemented in cairo and should not be used * by applications. (since 1.2) * * #cairo_format_t is used to identify the memory format of * image data. * * New entries may be added in future versions. **/ typedef enum _cairo_format { CAIRO_FORMAT_ARGB32, CAIRO_FORMAT_RGB24, CAIRO_FORMAT_A8, CAIRO_FORMAT_A1 /* The value of 4 is reserved by a deprecated enum value. * The next format added must have an explicit value of 5. CAIRO_FORMAT_RGB16_565 = 4, */ } cairo_format_t; cairo_public cairo_surface_t * cairo_image_surface_create (cairo_format_t format, int width, int height); cairo_public int cairo_format_stride_for_width (cairo_format_t format, int width); cairo_public cairo_surface_t * cairo_image_surface_create_for_data (unsigned char *data, cairo_format_t format, int width, int height, int stride); cairo_public unsigned char * cairo_image_surface_get_data (cairo_surface_t *surface); cairo_public cairo_format_t cairo_image_surface_get_format (cairo_surface_t *surface); cairo_public int cairo_image_surface_get_width (cairo_surface_t *surface); cairo_public int cairo_image_surface_get_height (cairo_surface_t *surface); cairo_public int cairo_image_surface_get_stride (cairo_surface_t *surface); #if CAIRO_HAS_PNG_FUNCTIONS cairo_public cairo_surface_t * cairo_image_surface_create_from_png (const char *filename); cairo_public cairo_surface_t * cairo_image_surface_create_from_png_stream (cairo_read_func_t read_func, void *closure); #endif /* Pattern creation functions */ cairo_public cairo_pattern_t * cairo_pattern_create_rgb (double red, double green, double blue); cairo_public cairo_pattern_t * cairo_pattern_create_rgba (double red, double green, double blue, double alpha); cairo_public cairo_pattern_t * cairo_pattern_create_for_surface (cairo_surface_t *surface); cairo_public cairo_pattern_t * cairo_pattern_create_linear (double x0, double y0, double x1, double y1); cairo_public cairo_pattern_t * cairo_pattern_create_radial (double cx0, double cy0, double radius0, double cx1, double cy1, double radius1); cairo_public cairo_pattern_t * cairo_pattern_reference (cairo_pattern_t *pattern); cairo_public void cairo_pattern_destroy (cairo_pattern_t *pattern); cairo_public unsigned int cairo_pattern_get_reference_count (cairo_pattern_t *pattern); cairo_public cairo_status_t cairo_pattern_status (cairo_pattern_t *pattern); cairo_public void * cairo_pattern_get_user_data (cairo_pattern_t *pattern, const cairo_user_data_key_t *key); cairo_public cairo_status_t cairo_pattern_set_user_data (cairo_pattern_t *pattern, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy); /** * cairo_pattern_type_t: * @CAIRO_PATTERN_TYPE_SOLID: The pattern is a solid (uniform) * color. It may be opaque or translucent. * @CAIRO_PATTERN_TYPE_SURFACE: The pattern is a based on a surface (an image). * @CAIRO_PATTERN_TYPE_LINEAR: The pattern is a linear gradient. * @CAIRO_PATTERN_TYPE_RADIAL: The pattern is a radial gradient. * * #cairo_pattern_type_t is used to describe the type of a given pattern. * * The type of a pattern is determined by the function used to create * it. The cairo_pattern_create_rgb() and cairo_pattern_create_rgba() * functions create SOLID patterns. The remaining * cairo_pattern_create functions map to pattern types in obvious * ways. * * The pattern type can be queried with cairo_pattern_get_type() * * Most #cairo_pattern_t functions can be called with a pattern of any * type, (though trying to change the extend or filter for a solid * pattern will have no effect). A notable exception is * cairo_pattern_add_color_stop_rgb() and * cairo_pattern_add_color_stop_rgba() which must only be called with * gradient patterns (either LINEAR or RADIAL). Otherwise the pattern * will be shutdown and put into an error state. * * New entries may be added in future versions. * * Since: 1.2 **/ typedef enum _cairo_pattern_type { CAIRO_PATTERN_TYPE_SOLID, CAIRO_PATTERN_TYPE_SURFACE, CAIRO_PATTERN_TYPE_LINEAR, CAIRO_PATTERN_TYPE_RADIAL } cairo_pattern_type_t; cairo_public cairo_pattern_type_t cairo_pattern_get_type (cairo_pattern_t *pattern); cairo_public void cairo_pattern_add_color_stop_rgb (cairo_pattern_t *pattern, double offset, double red, double green, double blue); cairo_public void cairo_pattern_add_color_stop_rgba (cairo_pattern_t *pattern, double offset, double red, double green, double blue, double alpha); cairo_public void cairo_pattern_set_matrix (cairo_pattern_t *pattern, const cairo_matrix_t *matrix); cairo_public void cairo_pattern_get_matrix (cairo_pattern_t *pattern, cairo_matrix_t *matrix); /** * cairo_extend_t: * @CAIRO_EXTEND_NONE: pixels outside of the source pattern * are fully transparent * @CAIRO_EXTEND_REPEAT: the pattern is tiled by repeating * @CAIRO_EXTEND_REFLECT: the pattern is tiled by reflecting * at the edges (Implemented for surface patterns since 1.6) * @CAIRO_EXTEND_PAD: pixels outside of the pattern copy * the closest pixel from the source (Since 1.2; but only * implemented for surface patterns since 1.6) * * #cairo_extend_t is used to describe how pattern color/alpha will be * determined for areas "outside" the pattern's natural area, (for * example, outside the surface bounds or outside the gradient * geometry). * * The default extend mode is %CAIRO_EXTEND_NONE for surface patterns * and %CAIRO_EXTEND_PAD for gradient patterns. * * New entries may be added in future versions. **/ typedef enum _cairo_extend { CAIRO_EXTEND_NONE, CAIRO_EXTEND_REPEAT, CAIRO_EXTEND_REFLECT, CAIRO_EXTEND_PAD } cairo_extend_t; cairo_public void cairo_pattern_set_extend (cairo_pattern_t *pattern, cairo_extend_t extend); cairo_public cairo_extend_t cairo_pattern_get_extend (cairo_pattern_t *pattern); /** * cairo_filter_t: * @CAIRO_FILTER_FAST: A high-performance filter, with quality similar * to %CAIRO_FILTER_NEAREST * @CAIRO_FILTER_GOOD: A reasonable-performance filter, with quality * similar to %CAIRO_FILTER_BILINEAR * @CAIRO_FILTER_BEST: The highest-quality available, performance may * not be suitable for interactive use. * @CAIRO_FILTER_NEAREST: Nearest-neighbor filtering * @CAIRO_FILTER_BILINEAR: Linear interpolation in two dimensions * @CAIRO_FILTER_GAUSSIAN: This filter value is currently * unimplemented, and should not be used in current code. * * #cairo_filter_t is used to indicate what filtering should be * applied when reading pixel values from patterns. See * cairo_pattern_set_source() for indicating the desired filter to be * used with a particular pattern. */ typedef enum _cairo_filter { CAIRO_FILTER_FAST, CAIRO_FILTER_GOOD, CAIRO_FILTER_BEST, CAIRO_FILTER_NEAREST, CAIRO_FILTER_BILINEAR, CAIRO_FILTER_GAUSSIAN } cairo_filter_t; cairo_public void cairo_pattern_set_filter (cairo_pattern_t *pattern, cairo_filter_t filter); cairo_public cairo_filter_t cairo_pattern_get_filter (cairo_pattern_t *pattern); cairo_public cairo_status_t cairo_pattern_get_rgba (cairo_pattern_t *pattern, double *red, double *green, double *blue, double *alpha); cairo_public cairo_status_t cairo_pattern_get_surface (cairo_pattern_t *pattern, cairo_surface_t **surface); cairo_public cairo_status_t cairo_pattern_get_color_stop_rgba (cairo_pattern_t *pattern, int index, double *offset, double *red, double *green, double *blue, double *alpha); cairo_public cairo_status_t cairo_pattern_get_color_stop_count (cairo_pattern_t *pattern, int *count); cairo_public cairo_status_t cairo_pattern_get_linear_points (cairo_pattern_t *pattern, double *x0, double *y0, double *x1, double *y1); cairo_public cairo_status_t cairo_pattern_get_radial_circles (cairo_pattern_t *pattern, double *x0, double *y0, double *r0, double *x1, double *y1, double *r1); /* Matrix functions */ cairo_public void cairo_matrix_init (cairo_matrix_t *matrix, double xx, double yx, double xy, double yy, double x0, double y0); cairo_public void cairo_matrix_init_identity (cairo_matrix_t *matrix); cairo_public void cairo_matrix_init_translate (cairo_matrix_t *matrix, double tx, double ty); cairo_public void cairo_matrix_init_scale (cairo_matrix_t *matrix, double sx, double sy); cairo_public void cairo_matrix_init_rotate (cairo_matrix_t *matrix, double radians); cairo_public void cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty); cairo_public void cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy); cairo_public void cairo_matrix_rotate (cairo_matrix_t *matrix, double radians); cairo_public cairo_status_t cairo_matrix_invert (cairo_matrix_t *matrix); cairo_public void cairo_matrix_multiply (cairo_matrix_t *result, const cairo_matrix_t *a, const cairo_matrix_t *b); cairo_public void cairo_matrix_transform_distance (const cairo_matrix_t *matrix, double *dx, double *dy); cairo_public void cairo_matrix_transform_point (const cairo_matrix_t *matrix, double *x, double *y); /* Functions to be used while debugging (not intended for use in production code) */ cairo_public void cairo_debug_reset_static_data (void); CAIRO_END_DECLS #endif /* CAIRO_H */ libgdiplus-2.11/cairo/src/cairo-compiler-private.h0000664000175000017500000001123312225470167017136 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_COMPILER_PRIVATE_H #define CAIRO_COMPILER_PRIVATE_H CAIRO_BEGIN_DECLS #if __GNUC__ >= 3 && defined(__ELF__) && !defined(__sun) # define slim_hidden_proto(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) cairo_private # define slim_hidden_proto_no_warn(name) slim_hidden_proto1(name, slim_hidden_int_name(name)) cairo_private_no_warn # define slim_hidden_def(name) slim_hidden_def1(name, slim_hidden_int_name(name)) # define slim_hidden_int_name(name) INT_##name # define slim_hidden_proto1(name, internal) \ extern __typeof (name) name \ __asm__ (slim_hidden_asmname (internal)) # define slim_hidden_def1(name, internal) \ extern __typeof (name) EXT_##name __asm__(slim_hidden_asmname(name)) \ __attribute__((__alias__(slim_hidden_asmname(internal)))) # define slim_hidden_ulp slim_hidden_ulp1(__USER_LABEL_PREFIX__) # define slim_hidden_ulp1(x) slim_hidden_ulp2(x) # define slim_hidden_ulp2(x) #x # define slim_hidden_asmname(name) slim_hidden_asmname1(name) # define slim_hidden_asmname1(name) slim_hidden_ulp #name #else # define slim_hidden_proto(name) int _cairo_dummy_prototype(void) # define slim_hidden_proto_no_warn(name) int _cairo_dummy_prototype(void) # define slim_hidden_def(name) int _cairo_dummy_prototype(void) #endif #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) #define CAIRO_PRINTF_FORMAT(fmt_index, va_index) \ __attribute__((__format__(__printf__, fmt_index, va_index))) #else #define CAIRO_PRINTF_FORMAT(fmt_index, va_index) #endif /* slim_internal.h */ #define CAIRO_HAS_HIDDEN_SYMBOLS 1 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun) #define cairo_private_no_warn __attribute__((__visibility__("hidden"))) #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) #define cairo_private_no_warn __hidden #else /* not gcc >= 3.3 and not Sun Studio >= 8 */ #define cairo_private_no_warn #undef CAIRO_HAS_HIDDEN_SYMBOLS #endif #ifndef WARN_UNUSED_RESULT #define WARN_UNUSED_RESULT #endif /* Add attribute(warn_unused_result) if supported */ #define cairo_warn WARN_UNUSED_RESULT #define cairo_private cairo_private_no_warn cairo_warn /* This macro allow us to deprecate a function by providing an alias for the old function name to the new function name. With this macro, binary compatibility is preserved. The macro only works on some platforms --- tough. Meanwhile, new definitions in the public header file break the source code so that it will no longer link against the old symbols. Instead it will give a descriptive error message indicating that the old function has been deprecated by the new function. */ #if __GNUC__ >= 2 && defined(__ELF__) # define CAIRO_FUNCTION_ALIAS(old, new) \ extern __typeof (new) old \ __asm__ ("" #old) \ __attribute__((__alias__("" #new))) #else # define CAIRO_FUNCTION_ALIAS(old, new) #endif #ifndef __GNUC__ #define __attribute__(x) #endif #if defined(__WIN32__) || defined(_MSC_VER) #define snprintf _snprintf #endif #ifdef _MSC_VER #undef inline #define inline __inline #endif #ifdef __STRICT_ANSI__ #undef inline #define inline __inline__ #endif CAIRO_END_DECLS #endif libgdiplus-2.11/cairo/src/cairo-path-fill.c0000664000175000017500000001416512225470167015536 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-path-fixed-private.h" typedef struct cairo_filler { double tolerance; cairo_traps_t *traps; cairo_point_t current_point; cairo_polygon_t polygon; } cairo_filler_t; static void _cairo_filler_init (cairo_filler_t *filler, double tolerance, cairo_traps_t *traps); static void _cairo_filler_fini (cairo_filler_t *filler); static cairo_status_t _cairo_filler_move_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_filler_line_to (void *closure, cairo_point_t *point); static cairo_status_t _cairo_filler_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d); static cairo_status_t _cairo_filler_close_path (void *closure); static void _cairo_filler_init (cairo_filler_t *filler, double tolerance, cairo_traps_t *traps) { filler->tolerance = tolerance; filler->traps = traps; filler->current_point.x = 0; filler->current_point.y = 0; _cairo_polygon_init (&filler->polygon); } static void _cairo_filler_fini (cairo_filler_t *filler) { _cairo_polygon_fini (&filler->polygon); } static cairo_status_t _cairo_filler_move_to (void *closure, cairo_point_t *point) { cairo_filler_t *filler = closure; cairo_polygon_t *polygon = &filler->polygon; _cairo_polygon_close (polygon); _cairo_polygon_move_to (polygon, point); filler->current_point = *point; return _cairo_polygon_status (&filler->polygon); } static cairo_status_t _cairo_filler_line_to (void *closure, cairo_point_t *point) { cairo_filler_t *filler = closure; cairo_polygon_t *polygon = &filler->polygon; _cairo_polygon_line_to (polygon, point); filler->current_point = *point; return _cairo_polygon_status (&filler->polygon); } static cairo_status_t _cairo_filler_curve_to (void *closure, cairo_point_t *b, cairo_point_t *c, cairo_point_t *d) { int i; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_filler_t *filler = closure; cairo_polygon_t *polygon = &filler->polygon; cairo_spline_t spline; status = _cairo_spline_init (&spline, &filler->current_point, b, c, d); if (status == CAIRO_INT_STATUS_DEGENERATE) return CAIRO_STATUS_SUCCESS; status = _cairo_spline_decompose (&spline, filler->tolerance); if (status) goto CLEANUP_SPLINE; for (i = 1; i < spline.num_points; i++) _cairo_polygon_line_to (polygon, &spline.points[i]); CLEANUP_SPLINE: _cairo_spline_fini (&spline); filler->current_point = *d; return status; } static cairo_status_t _cairo_filler_close_path (void *closure) { cairo_filler_t *filler = closure; cairo_polygon_t *polygon = &filler->polygon; _cairo_polygon_close (polygon); return _cairo_polygon_status (polygon); } static cairo_int_status_t _cairo_path_fixed_fill_rectangle (cairo_path_fixed_t *path, cairo_traps_t *traps); cairo_status_t _cairo_path_fixed_fill_to_traps (cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_traps_t *traps) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_filler_t filler; /* Before we do anything else, we use a special-case filler for * a device-axis aligned rectangle if possible. */ status = _cairo_path_fixed_fill_rectangle (path, traps); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; _cairo_filler_init (&filler, tolerance, traps); status = _cairo_path_fixed_interpret (path, CAIRO_DIRECTION_FORWARD, _cairo_filler_move_to, _cairo_filler_line_to, _cairo_filler_curve_to, _cairo_filler_close_path, &filler); if (status) goto BAIL; _cairo_polygon_close (&filler.polygon); status = _cairo_polygon_status (&filler.polygon); if (status) goto BAIL; status = _cairo_bentley_ottmann_tessellate_polygon (filler.traps, &filler.polygon, fill_rule); if (status) goto BAIL; BAIL: _cairo_filler_fini (&filler); return status; } /* This special-case filler supports only a path that describes a * device-axis aligned rectangle. It exists to avoid the overhead of * the general tessellator when drawing very common rectangles. * * If the path described anything but a device-axis aligned rectangle, * this function will return %CAIRO_INT_STATUS_UNSUPPORTED. */ static cairo_int_status_t _cairo_path_fixed_fill_rectangle (cairo_path_fixed_t *path, cairo_traps_t *traps) { if (_cairo_path_fixed_is_box (path, NULL)) { return _cairo_traps_tessellate_convex_quad (traps, path->buf_head.base.points); } return CAIRO_INT_STATUS_UNSUPPORTED; } libgdiplus-2.11/cairo/src/cairo-array.c0000664000175000017500000003165212225470167014774 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Carl Worth */ #include "cairoint.h" /** * _cairo_array_init: * * Initialize a new #cairo_array_t object to store objects each of size * @element_size. * * The #cairo_array_t object provides grow-by-doubling storage. It * never interprets the data passed to it, nor does it provide any * sort of callback mechanism for freeing resources held onto by * stored objects. * * When finished using the array, _cairo_array_fini() should be * called to free resources allocated during use of the array. **/ void _cairo_array_init (cairo_array_t *array, int element_size) { array->size = 0; array->num_elements = 0; array->element_size = element_size; array->elements = NULL; array->is_snapshot = FALSE; } /** * _cairo_array_init_snapshot: * @array: A #cairo_array_t to be initialized as a snapshot * @other: The #cairo_array_t from which to create the snapshot * * Initialize @array as an immutable copy of @other. It is an error to * call an array-modifying function (other than _cairo_array_fini) on * @array after calling this function. **/ void _cairo_array_init_snapshot (cairo_array_t *array, const cairo_array_t *other) { array->size = other->size; array->num_elements = other->num_elements; array->element_size = other->element_size; array->elements = other->elements; array->is_snapshot = TRUE; } /** * _cairo_array_fini: * * Free all resources associated with @array. After this call, @array * should not be used again without a subsequent call to * _cairo_array_init() again first. **/ void _cairo_array_fini (cairo_array_t *array) { if (array->is_snapshot) return; if (array->elements) { free (* array->elements); free (array->elements); } } /** * _cairo_array_grow_by: * * Increase the size of @array (if needed) so that there are at least * @additional free spaces in the array. The actual size of the array * is always increased by doubling as many times as necessary. **/ cairo_status_t _cairo_array_grow_by (cairo_array_t *array, unsigned int additional) { char *new_elements; unsigned int old_size = array->size; unsigned int required_size = array->num_elements + additional; unsigned int new_size; assert (! array->is_snapshot); /* check for integer overflow */ if (required_size > INT_MAX || required_size < array->num_elements) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (required_size <= old_size) return CAIRO_STATUS_SUCCESS; if (old_size == 0) new_size = 1; else new_size = old_size * 2; while (new_size < required_size) new_size = new_size * 2; if (array->elements == NULL) { array->elements = malloc (sizeof (char *)); if (array->elements == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); *array->elements = NULL; } array->size = new_size; new_elements = _cairo_realloc_ab (*array->elements, array->size, array->element_size); if (new_elements == NULL) { array->size = old_size; return _cairo_error (CAIRO_STATUS_NO_MEMORY); } *array->elements = new_elements; return CAIRO_STATUS_SUCCESS; } /** * _cairo_array_truncate: * * Truncate size of the array to @num_elements if less than the * current size. No memory is actually freed. The stored objects * beyond @num_elements are simply "forgotten". **/ void _cairo_array_truncate (cairo_array_t *array, unsigned int num_elements) { assert (! array->is_snapshot); if (num_elements < array->num_elements) array->num_elements = num_elements; } /** * _cairo_array_index: * * Return value: A pointer to object stored at @index. If the * resulting value is assigned to a pointer to an object of the same * element_size as initially passed to _cairo_array_init() then that * pointer may be used for further direct indexing with []. For * example: * * #cairo_array_t array; * double *values; * * _cairo_array_init (&array, sizeof(double)); * ... calls to _cairo_array_append() here ... * * values = _cairo_array_index (&array, 0); * for (i = 0; i < _cairo_array_num_elements (&array); i++) * ... use values[i] here ... **/ void * _cairo_array_index (cairo_array_t *array, unsigned int index) { /* We allow an index of 0 for the no-elements case. * This makes for cleaner calling code which will often look like: * * elements = _cairo_array_index (array, num_elements); * for (i=0; i < num_elements; i++) { * ... use elements[i] here ... * } * * which in the num_elements==0 case gets the NULL pointer here, * but never dereferences it. */ if (index == 0 && array->num_elements == 0) return NULL; assert (index < array->num_elements); return (void *) &(*array->elements)[index * array->element_size]; } /** * _cairo_array_copy_element: * * Copy a single element out of the array from index @index into the * location pointed to by @dst. **/ void _cairo_array_copy_element (cairo_array_t *array, int index, void *dst) { memcpy (dst, _cairo_array_index (array, index), array->element_size); } /** * _cairo_array_append: * * Append a single item onto the array by growing the array by at * least one element, then copying element_size bytes from @element * into the array. The address of the resulting object within the * array can be determined with: * * _cairo_array_index (array, _cairo_array_num_elements (array) - 1); * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the * operation. **/ cairo_status_t _cairo_array_append (cairo_array_t *array, const void *element) { assert (! array->is_snapshot); return _cairo_array_append_multiple (array, element, 1); } /** * _cairo_array_append: * * Append one or more items onto the array by growing the array by * @num_elements, then copying @num_elements * element_size bytes from * @elements into the array. * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the * operation. **/ cairo_status_t _cairo_array_append_multiple (cairo_array_t *array, const void *elements, int num_elements) { cairo_status_t status; void *dest; assert (! array->is_snapshot); status = _cairo_array_allocate (array, num_elements, &dest); if (status) return status; memcpy (dest, elements, num_elements * array->element_size); return CAIRO_STATUS_SUCCESS; } /** * _cairo_array_allocate: * * Allocate space at the end of the array for @num_elements additional * elements, providing the address of the new memory chunk in * @elements. This memory will be unitialized, but will be accounted * for in the return value of _cairo_array_num_elements(). * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if insufficient memory is available for the * operation. **/ cairo_status_t _cairo_array_allocate (cairo_array_t *array, unsigned int num_elements, void **elements) { cairo_status_t status; assert (! array->is_snapshot); status = _cairo_array_grow_by (array, num_elements); if (status) return status; assert (array->num_elements + num_elements <= array->size); *elements = &(*array->elements)[array->num_elements * array->element_size]; array->num_elements += num_elements; return CAIRO_STATUS_SUCCESS; } /** * _cairo_array_num_elements: * * Return value: The number of elements stored in @array. **/ int _cairo_array_num_elements (cairo_array_t *array) { return array->num_elements; } /** * _cairo_array_size: * * Return value: The number of elements for which there is currently * space allocated in array. **/ int _cairo_array_size (cairo_array_t *array) { return array->size; } /* #cairo_user_data_array_t */ typedef struct { const cairo_user_data_key_t *key; void *user_data; cairo_destroy_func_t destroy; } cairo_user_data_slot_t; /** * _cairo_user_data_array_init: * @array: a #cairo_user_data_array_t * * Initializes a #cairo_user_data_array_t structure for future * use. After initialization, the array has no keys. Call * _cairo_user_data_array_fini() to free any allocated memory * when done using the array. **/ void _cairo_user_data_array_init (cairo_user_data_array_t *array) { _cairo_array_init (array, sizeof (cairo_user_data_slot_t)); } /** * _cairo_user_data_array_fini: * @array: a #cairo_user_data_array_t * * Destroys all current keys in the user data array and deallocates * any memory allocated for the array itself. **/ void _cairo_user_data_array_fini (cairo_user_data_array_t *array) { int i, num_slots; cairo_user_data_slot_t *slots; num_slots = array->num_elements; slots = _cairo_array_index (array, 0); for (i = 0; i < num_slots; i++) { if (slots[i].user_data != NULL && slots[i].destroy != NULL) slots[i].destroy (slots[i].user_data); } _cairo_array_fini (array); } /** * _cairo_user_data_array_get_data: * @array: a #cairo_user_data_array_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Returns user data previously attached using the specified * key. If no user data has been attached with the given key this * function returns %NULL. * * Return value: the user data previously attached or %NULL. **/ void * _cairo_user_data_array_get_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key) { int i, num_slots; cairo_user_data_slot_t *slots; /* We allow this to support degenerate objects such as cairo_surface_nil. */ if (array == NULL) return NULL; num_slots = array->num_elements; slots = _cairo_array_index (array, 0); for (i = 0; i < num_slots; i++) { if (slots[i].key == key) return slots[i].user_data; } return NULL; } /** * _cairo_user_data_array_set_data: * @array: a #cairo_user_data_array_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach * @destroy: a #cairo_destroy_func_t which will be called when the * user data array is destroyed or when new user data is attached using the * same key. * * Attaches user data to a user data array. To remove user data, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. **/ cairo_status_t _cairo_user_data_array_set_data (cairo_user_data_array_t *array, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { cairo_status_t status; int i, num_slots; cairo_user_data_slot_t *slots, *slot, new_slot; if (user_data) { new_slot.key = key; new_slot.user_data = user_data; new_slot.destroy = destroy; } else { new_slot.key = NULL; new_slot.user_data = NULL; new_slot.destroy = NULL; } slot = NULL; num_slots = array->num_elements; slots = _cairo_array_index (array, 0); for (i = 0; i < num_slots; i++) { if (slots[i].key == key) { slot = &slots[i]; if (slot->destroy && slot->user_data) slot->destroy (slot->user_data); break; } if (user_data && slots[i].user_data == NULL) { slot = &slots[i]; /* Have to keep searching for an exact match */ } } if (slot) { *slot = new_slot; return CAIRO_STATUS_SUCCESS; } status = _cairo_array_append (array, &new_slot); if (status) return status; return CAIRO_STATUS_SUCCESS; } libgdiplus-2.11/cairo/src/cairo-misc.c0000664000175000017500000003630112225470167014605 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" /** * cairo_status_to_string: * @status: a cairo status * * Provides a human-readable description of a #cairo_status_t. * * Returns: a string representation of the status */ const char * cairo_status_to_string (cairo_status_t status) { switch (status) { case CAIRO_STATUS_SUCCESS: return "success"; case CAIRO_STATUS_NO_MEMORY: return "out of memory"; case CAIRO_STATUS_INVALID_RESTORE: return "cairo_restore without matching cairo_save"; case CAIRO_STATUS_INVALID_POP_GROUP: return "cairo_pop_group without matching cairo_push_group"; case CAIRO_STATUS_NO_CURRENT_POINT: return "no current point defined"; case CAIRO_STATUS_INVALID_MATRIX: return "invalid matrix (not invertible)"; case CAIRO_STATUS_INVALID_STATUS: return "invalid value for an input cairo_status_t"; case CAIRO_STATUS_NULL_POINTER: return "NULL pointer"; case CAIRO_STATUS_INVALID_STRING: return "input string not valid UTF-8"; case CAIRO_STATUS_INVALID_PATH_DATA: return "input path data not valid"; case CAIRO_STATUS_READ_ERROR: return "error while reading from input stream"; case CAIRO_STATUS_WRITE_ERROR: return "error while writing to output stream"; case CAIRO_STATUS_SURFACE_FINISHED: return "the target surface has been finished"; case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: return "the surface type is not appropriate for the operation"; case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: return "the pattern type is not appropriate for the operation"; case CAIRO_STATUS_INVALID_CONTENT: return "invalid value for an input cairo_content_t"; case CAIRO_STATUS_INVALID_FORMAT: return "invalid value for an input cairo_format_t"; case CAIRO_STATUS_INVALID_VISUAL: return "invalid value for an input Visual*"; case CAIRO_STATUS_FILE_NOT_FOUND: return "file not found"; case CAIRO_STATUS_INVALID_DASH: return "invalid value for a dash setting"; case CAIRO_STATUS_INVALID_DSC_COMMENT: return "invalid value for a DSC comment"; case CAIRO_STATUS_INVALID_INDEX: return "invalid index passed to getter"; case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: return "clip region not representable in desired format"; case CAIRO_STATUS_TEMP_FILE_ERROR: return "error creating or writing to a temporary file"; case CAIRO_STATUS_INVALID_STRIDE: return "invalid value for stride"; } return ""; } /** * _cairo_operator_bounded_by_mask: * @op: a #cairo_operator_t * * A bounded operator is one where mask pixel * of zero results in no effect on the destination image. * * Unbounded operators often require special handling; if you, for * example, draw trapezoids with an unbounded operator, the effect * extends past the bounding box of the trapezoids. * * Return value: %TRUE if the operator is bounded by the mask operand **/ cairo_bool_t _cairo_operator_bounded_by_mask (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: case CAIRO_OPERATOR_SOURCE: case CAIRO_OPERATOR_OVER: case CAIRO_OPERATOR_ATOP: case CAIRO_OPERATOR_DEST: case CAIRO_OPERATOR_DEST_OVER: case CAIRO_OPERATOR_DEST_OUT: case CAIRO_OPERATOR_XOR: case CAIRO_OPERATOR_ADD: case CAIRO_OPERATOR_SATURATE: return TRUE; case CAIRO_OPERATOR_OUT: case CAIRO_OPERATOR_IN: case CAIRO_OPERATOR_DEST_IN: case CAIRO_OPERATOR_DEST_ATOP: return FALSE; } ASSERT_NOT_REACHED; return FALSE; } /** * _cairo_operator_bounded_by_source: * @op: a #cairo_operator_t * * A bounded operator is one where source pixels of zero * (in all four components, r, g, b and a) effect no change * in the resulting destination image. * * Unbounded operators often require special handling; if you, for * example, copy a surface with the SOURCE operator, the effect * extends past the bounding box of the source surface. * * Return value: %TRUE if the operator is bounded by the source operand **/ cairo_bool_t _cairo_operator_bounded_by_source (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_OVER: case CAIRO_OPERATOR_ATOP: case CAIRO_OPERATOR_DEST: case CAIRO_OPERATOR_DEST_OVER: case CAIRO_OPERATOR_DEST_OUT: case CAIRO_OPERATOR_XOR: case CAIRO_OPERATOR_ADD: case CAIRO_OPERATOR_SATURATE: return TRUE; case CAIRO_OPERATOR_CLEAR: case CAIRO_OPERATOR_SOURCE: case CAIRO_OPERATOR_OUT: case CAIRO_OPERATOR_IN: case CAIRO_OPERATOR_DEST_IN: case CAIRO_OPERATOR_DEST_ATOP: return FALSE; } ASSERT_NOT_REACHED; return FALSE; } void _cairo_restrict_value (double *value, double min, double max) { if (*value < min) *value = min; else if (*value > max) *value = max; } /* This function is identical to the C99 function lround(), except that it * performs arithmetic rounding (instead of away-from-zero rounding) and * has a valid input range of (INT_MIN, INT_MAX] instead of * [INT_MIN, INT_MAX]. It is much faster on both x86 and FPU-less systems * than other commonly used methods for rounding (lround, round, rint, lrint * or float (d + 0.5)). * * The reason why this function is much faster on x86 than other * methods is due to the fact that it avoids the fldcw instruction. * This instruction incurs a large performance penalty on modern Intel * processors due to how it prevents efficient instruction pipelining. * * The reason why this function is much faster on FPU-less systems is for * an entirely different reason. All common rounding methods involve multiple * floating-point operations. Each one of these operations has to be * emulated in software, which adds up to be a large performance penalty. * This function doesn't perform any floating-point calculations, and thus * avoids this penalty. */ int _cairo_lround (double d) { uint32_t top, shift_amount, output; union { double d; uint64_t ui64; uint32_t ui32[2]; } u; u.d = d; /* If the integer word order doesn't match the float word order, we swap * the words of the input double. This is needed because we will be * treating the whole double as a 64-bit unsigned integer. Notice that we * use WORDS_BIGENDIAN to detect the integer word order, which isn't * exactly correct because WORDS_BIGENDIAN refers to byte order, not word * order. Thus, we are making the assumption that the byte order is the * same as the integer word order which, on the modern machines that we * care about, is OK. */ #if ( defined(FLOAT_WORDS_BIGENDIAN) && !defined(WORDS_BIGENDIAN)) || \ (!defined(FLOAT_WORDS_BIGENDIAN) && defined(WORDS_BIGENDIAN)) { uint32_t temp = u.ui32[0]; u.ui32[0] = u.ui32[1]; u.ui32[1] = temp; } #endif #ifdef WORDS_BIGENDIAN #define MSW (0) /* Most Significant Word */ #define LSW (1) /* Least Significant Word */ #else #define MSW (1) #define LSW (0) #endif /* By shifting the most significant word of the input double to the * right 20 places, we get the very "top" of the double where the exponent * and sign bit lie. */ top = u.ui32[MSW] >> 20; /* Here, we calculate how much we have to shift the mantissa to normalize * it to an integer value. We extract the exponent "top" by masking out the * sign bit, then we calculate the shift amount by subtracting the exponent * from the bias. Notice that the correct bias for 64-bit doubles is * actually 1075, but we use 1053 instead for two reasons: * * 1) To perform rounding later on, we will first need the target * value in a 31.1 fixed-point format. Thus, the bias needs to be one * less: (1075 - 1: 1074). * * 2) To avoid shifting the mantissa as a full 64-bit integer (which is * costly on certain architectures), we break the shift into two parts. * First, the upper and lower parts of the mantissa are shifted * individually by a constant amount that all valid inputs will require * at the very least. This amount is chosen to be 21, because this will * allow the two parts of the mantissa to later be combined into a * single 32-bit representation, on which the remainder of the shift * will be performed. Thus, we decrease the bias by an additional 21: * (1074 - 21: 1053). */ shift_amount = 1053 - (top & 0x7FF); /* We are done with the exponent portion in "top", so here we shift it off * the end. */ top >>= 11; /* Before we perform any operations on the mantissa, we need to OR in * the implicit 1 at the top (see the IEEE-754 spec). We needn't mask * off the sign bit nor the exponent bits because these higher bits won't * make a bit of difference in the rest of our calculations. */ u.ui32[MSW] |= 0x100000; /* If the input double is negative, we have to decrease the mantissa * by a hair. This is an important part of performing arithmetic rounding, * as negative numbers must round towards positive infinity in the * halfwase case of -x.5. Since "top" contains only the sign bit at this * point, we can just decrease the mantissa by the value of "top". */ u.ui64 -= top; /* By decrementing "top", we create a bitmask with a value of either * 0x0 (if the input was negative) or 0xFFFFFFFF (if the input was positive * and thus the unsigned subtraction underflowed) that we'll use later. */ top--; /* Here, we shift the mantissa by the constant value as described above. * We can emulate a 64-bit shift right by 21 through shifting the top 32 * bits left 11 places and ORing in the bottom 32 bits shifted 21 places * to the right. Both parts of the mantissa are now packed into a single * 32-bit integer. Although we severely truncate the lower part in the * process, we still have enough significant bits to perform the conversion * without error (for all valid inputs). */ output = (u.ui32[MSW] << 11) | (u.ui32[LSW] >> 21); /* Next, we perform the shift that converts the X.Y fixed-point number * currently found in "output" to the desired 31.1 fixed-point format * needed for the following rounding step. It is important to consider * all possible values for "shift_amount" at this point: * * - {shift_amount < 0} Since shift_amount is an unsigned integer, it * really can't have a value less than zero. But, if the shift_amount * calculation above caused underflow (which would happen with * input > INT_MAX or input <= INT_MIN) then shift_amount will now be * a very large number, and so this shift will result in complete * garbage. But that's OK, as the input was out of our range, so our * output is undefined. * * - {shift_amount > 31} If the magnitude of the input was very small * (i.e. |input| << 1.0), shift_amount will have a value greater than * 31. Thus, this shift will also result in garbage. After performing * the shift, we will zero-out "output" if this is the case. * * - {0 <= shift_amount < 32} In this case, the shift will properly convert * the mantissa into a 31.1 fixed-point number. */ output >>= shift_amount; /* This is where we perform rounding with the 31.1 fixed-point number. * Since what we're after is arithmetic rounding, we simply add the single * fractional bit into the integer part of "output", and just keep the * integer part. */ output = (output >> 1) + (output & 1); /* Here, we zero-out the result if the magnitude if the input was very small * (as explained in the section above). Notice that all input out of the * valid range is also caught by this condition, which means we produce 0 * for all invalid input, which is a nice side effect. * * The most straightforward way to do this would be: * * if (shift_amount > 31) * output = 0; * * But we can use a little trick to avoid the potential branch. The * expression (shift_amount > 31) will be either 1 or 0, which when * decremented will be either 0x0 or 0xFFFFFFFF (unsigned underflow), * which can be used to conditionally mask away all the bits in "output" * (in the 0x0 case), effectively zeroing it out. Certain, compilers would * have done this for us automatically. */ output &= ((shift_amount > 31) - 1); /* If the input double was a negative number, then we have to negate our * output. The most straightforward way to do this would be: * * if (!top) * output = -output; * * as "top" at this point is either 0x0 (if the input was negative) or * 0xFFFFFFFF (if the input was positive). But, we can use a trick to * avoid the branch. Observe that the following snippet of code has the * same effect as the reference snippet above: * * if (!top) * output = 0 - output; * else * output = output - 0; * * Armed with the bitmask found in "top", we can condense the two statements * into the following: * * output = (output & top) - (output & ~top); * * where, in the case that the input double was negative, "top" will be 0, * and the statement will be equivalent to: * * output = (0) - (output); * * and if the input double was positive, "top" will be 0xFFFFFFFF, and the * statement will be equivalent to: * * output = (output) - (0); * * Which, as pointed out earlier, is equivalent to the original reference * snippet. */ output = (output & top) - (output & ~top); return output; #undef MSW #undef LSW } libgdiplus-2.11/cairo/src/cairo-mutex-list-private.h0000664000175000017500000000407312225470167017443 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2007 Mathias Hasselmann * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * Contributor(s): * Mathias Hasselmann */ CAIRO_MUTEX_DECLARE (_cairo_pattern_solid_pattern_cache_lock); CAIRO_MUTEX_DECLARE (_cairo_pattern_solid_surface_cache_lock); CAIRO_MUTEX_DECLARE (_cairo_font_face_mutex); CAIRO_MUTEX_DECLARE (_cairo_scaled_font_map_mutex); CAIRO_MUTEX_DECLARE (_cairo_scaled_font_error_mutex); #if CAIRO_HAS_FT_FONT CAIRO_MUTEX_DECLARE (_cairo_ft_unscaled_font_map_mutex); #endif #if CAIRO_HAS_XLIB_SURFACE CAIRO_MUTEX_DECLARE (_cairo_xlib_display_mutex); #endif #if !defined (CAIRO_HAS_ATOMIC_OPS) || defined (CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER) CAIRO_MUTEX_DECLARE (_cairo_atomic_mutex); #endif /* Undefine, to err on unintended inclusion */ #undef CAIRO_MUTEX_DECLARE libgdiplus-2.11/cairo/src/cairo-mutex.c0000664000175000017500000000505612225470167015017 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2007 Mathias Hasselmann * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * Contributor(s): * Mathias Hasselmann */ #include "cairoint.h" #define CAIRO_MUTEX_DECLARE(mutex) cairo_mutex_t mutex = CAIRO_MUTEX_NIL_INITIALIZER #include "cairo-mutex-list-private.h" #undef CAIRO_MUTEX_DECLARE #if _CAIRO_MUTEX_USE_STATIC_INITIALIZER || _CAIRO_MUTEX_USE_STATIC_FINALIZER # if _CAIRO_MUTEX_USE_STATIC_INITIALIZER # define _CAIRO_MUTEX_INITIALIZED_DEFAULT_VALUE FALSE # else # define _CAIRO_MUTEX_INITIALIZED_DEFAULT_VALUE TRUE # endif cairo_bool_t _cairo_mutex_initialized = _CAIRO_MUTEX_INITIALIZED_DEFAULT_VALUE; # undef _CAIRO_MUTEX_INITIALIZED_DEFAULT_VALUE #endif #if _CAIRO_MUTEX_USE_STATIC_INITIALIZER void _cairo_mutex_initialize (void) { if (_cairo_mutex_initialized) return; _cairo_mutex_initialized = TRUE; #define CAIRO_MUTEX_DECLARE(mutex) CAIRO_MUTEX_INIT (mutex) #include "cairo-mutex-list-private.h" #undef CAIRO_MUTEX_DECLARE } #endif #if _CAIRO_MUTEX_USE_STATIC_FINALIZER void _cairo_mutex_finalize (void) { if (!_cairo_mutex_initialized) return; _cairo_mutex_initialized = FALSE; #define CAIRO_MUTEX_DECLARE(mutex) CAIRO_MUTEX_FINI (mutex) #include "cairo-mutex-list-private.h" #undef CAIRO_MUTEX_DECLARE } #endif libgdiplus-2.11/cairo/src/cairo-xlib.h0000664000175000017500000000575512225470167014626 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_XLIB_H #define CAIRO_XLIB_H #include #if CAIRO_HAS_XLIB_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_xlib_surface_create (Display *dpy, Drawable drawable, Visual *visual, int width, int height); cairo_public cairo_surface_t * cairo_xlib_surface_create_for_bitmap (Display *dpy, Pixmap bitmap, Screen *screen, int width, int height); cairo_public void cairo_xlib_surface_set_size (cairo_surface_t *surface, int width, int height); cairo_public void cairo_xlib_surface_set_drawable (cairo_surface_t *surface, Drawable drawable, int width, int height); cairo_public Display * cairo_xlib_surface_get_display (cairo_surface_t *surface); cairo_public Drawable cairo_xlib_surface_get_drawable (cairo_surface_t *surface); cairo_public Screen * cairo_xlib_surface_get_screen (cairo_surface_t *surface); cairo_public Visual * cairo_xlib_surface_get_visual (cairo_surface_t *surface); cairo_public int cairo_xlib_surface_get_depth (cairo_surface_t *surface); cairo_public int cairo_xlib_surface_get_width (cairo_surface_t *surface); cairo_public int cairo_xlib_surface_get_height (cairo_surface_t *surface); CAIRO_END_DECLS #else /* CAIRO_HAS_XLIB_SURFACE */ # error Cairo was not compiled with support for the xlib backend #endif /* CAIRO_HAS_XLIB_SURFACE */ #endif /* CAIRO_XLIB_H */ libgdiplus-2.11/cairo/src/cairo-deflate-stream.c0000664000175000017500000001155712225470167016555 00000000000000/* cairo_deflate_stream.c: Output stream abstraction * * Copyright © 2006 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Adrian Johnson. * * Author(s): * Adrian Johnson */ #include "cairoint.h" #include "cairo-output-stream-private.h" #include #define BUFFER_SIZE 16384 typedef struct _cairo_deflate_stream { cairo_output_stream_t base; cairo_output_stream_t *output; z_stream zlib_stream; unsigned char input_buf[BUFFER_SIZE]; unsigned char output_buf[BUFFER_SIZE]; } cairo_deflate_stream_t; static void cairo_deflate_stream_deflate (cairo_deflate_stream_t *stream, cairo_bool_t flush) { int ret; cairo_bool_t finished; do { ret = deflate (&stream->zlib_stream, flush ? Z_FINISH : Z_NO_FLUSH); if (flush || stream->zlib_stream.avail_out == 0) { _cairo_output_stream_write (stream->output, stream->output_buf, BUFFER_SIZE - stream->zlib_stream.avail_out); stream->zlib_stream.next_out = stream->output_buf; stream->zlib_stream.avail_out = BUFFER_SIZE; } finished = TRUE; if (stream->zlib_stream.avail_in != 0) finished = FALSE; if (flush && ret != Z_STREAM_END) finished = FALSE; } while (!finished); stream->zlib_stream.next_in = stream->input_buf; } static cairo_status_t _cairo_deflate_stream_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { cairo_deflate_stream_t *stream = (cairo_deflate_stream_t *) base; unsigned int count; const unsigned char *p = data; while (length) { count = length; if (count > BUFFER_SIZE - stream->zlib_stream.avail_in) count = BUFFER_SIZE - stream->zlib_stream.avail_in; memcpy (stream->input_buf + stream->zlib_stream.avail_in, p, count); p += count; stream->zlib_stream.avail_in += count; length -= count; if (stream->zlib_stream.avail_in == BUFFER_SIZE) cairo_deflate_stream_deflate (stream, FALSE); } return _cairo_output_stream_get_status (stream->output); } static cairo_status_t _cairo_deflate_stream_close (cairo_output_stream_t *base) { cairo_deflate_stream_t *stream = (cairo_deflate_stream_t *) base; cairo_deflate_stream_deflate (stream, TRUE); deflateEnd (&stream->zlib_stream); return _cairo_output_stream_get_status (stream->output); } cairo_output_stream_t * _cairo_deflate_stream_create (cairo_output_stream_t *output) { cairo_deflate_stream_t *stream; if (output->status) return _cairo_output_stream_create_in_error (output->status); stream = malloc (sizeof (cairo_deflate_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, _cairo_deflate_stream_write, _cairo_deflate_stream_close); stream->output = output; stream->zlib_stream.zalloc = Z_NULL; stream->zlib_stream.zfree = Z_NULL; stream->zlib_stream.opaque = Z_NULL; if (deflateInit (&stream->zlib_stream, Z_DEFAULT_COMPRESSION) != Z_OK) { free (stream); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } stream->zlib_stream.next_in = stream->input_buf; stream->zlib_stream.avail_in = 0; stream->zlib_stream.next_out = stream->output_buf; stream->zlib_stream.avail_out = BUFFER_SIZE; return &stream->base; } libgdiplus-2.11/cairo/src/cairo-fixed.c0000664000175000017500000000306612225470167014753 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-fixed-private.h" libgdiplus-2.11/cairo/src/cairo-glitz.h0000664000175000017500000000362312225470167015011 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_GLITZ_H #define CAIRO_GLITZ_H #include #if CAIRO_HAS_GLITZ_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_glitz_surface_create (glitz_surface_t *surface); CAIRO_END_DECLS #else /* CAIRO_HAS_GLITZ_SURFACE */ # error Cairo was not compiled with support for the glitz backend #endif /* CAIRO_HAS_GLITZ_SURFACE */ #endif /* CAIRO_GLITZ_H */ libgdiplus-2.11/cairo/src/cairo-type1-fallback.c0000664000175000017500000007051412225470167016455 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Adrian Johnson */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" #include "cairo-type1-private.h" #include "cairo-scaled-font-subsets-private.h" #include "cairo-path-fixed-private.h" #include "cairo-output-stream-private.h" typedef enum { CAIRO_CHARSTRING_TYPE1, CAIRO_CHARSTRING_TYPE2 } cairo_charstring_type_t; typedef struct _cairo_type1_font { int *widths; cairo_scaled_font_subset_t *scaled_font_subset; cairo_scaled_font_t *type1_scaled_font; cairo_array_t contents; double x_min, y_min, x_max, y_max; const char *data; unsigned long header_size; unsigned long data_size; unsigned long trailer_size; int bbox_position; int bbox_max_chars; cairo_output_stream_t *output; unsigned short eexec_key; cairo_bool_t hex_encode; int hex_column; } cairo_type1_font_t; static cairo_status_t cairo_type1_font_create (cairo_scaled_font_subset_t *scaled_font_subset, cairo_type1_font_t **subset_return, cairo_bool_t hex_encode) { cairo_type1_font_t *font; cairo_font_face_t *font_face; cairo_matrix_t font_matrix; cairo_matrix_t ctm; cairo_font_options_t font_options; cairo_status_t status; font = calloc (1, sizeof (cairo_type1_font_t)); if (font == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); font->widths = calloc (scaled_font_subset->num_glyphs, sizeof (int)); if (font->widths == NULL) { free (font); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } font->scaled_font_subset = scaled_font_subset; font->hex_encode = hex_encode; font_face = cairo_scaled_font_get_font_face (scaled_font_subset->scaled_font); cairo_matrix_init_scale (&font_matrix, 1000, -1000); cairo_matrix_init_identity (&ctm); _cairo_font_options_init_default (&font_options); cairo_font_options_set_hint_style (&font_options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (&font_options, CAIRO_HINT_METRICS_OFF); font->type1_scaled_font = cairo_scaled_font_create (font_face, &font_matrix, &ctm, &font_options); status = font->type1_scaled_font->status; if (status) goto fail; _cairo_array_init (&font->contents, sizeof (unsigned char)); font->output = NULL; *subset_return = font; return CAIRO_STATUS_SUCCESS; fail: free (font->widths); free (font); return status; } /* Charstring commands. If the high byte is 0 the command is encoded * with a single byte. */ #define CHARSTRING_sbw 0x0c07 #define CHARSTRING_rmoveto 0x0015 #define CHARSTRING_rlineto 0x0005 #define CHARSTRING_rcurveto 0x0008 #define CHARSTRING_closepath 0x0009 #define CHARSTRING_endchar 0x000e /* Before calling this function, the caller must allocate sufficient * space in data (see _cairo_array_grow_by). The maximum number of * bytes that will be used is 2. */ static void charstring_encode_command (cairo_array_t *data, int command) { cairo_status_t status; int orig_size; unsigned char buf[5]; unsigned char *p = buf; if (command & 0xff00) *p++ = command >> 8; *p++ = command & 0x00ff; /* Ensure the array doesn't grow, which allows this function to * have no possibility of failure. */ orig_size = _cairo_array_size (data); status = _cairo_array_append_multiple (data, buf, p - buf); assert (status == CAIRO_STATUS_SUCCESS); assert (_cairo_array_size (data) == orig_size); } /* Before calling this function, the caller must allocate sufficient * space in data (see _cairo_array_grow_by). The maximum number of * bytes that will be used is 5. */ static void charstring_encode_integer (cairo_array_t *data, int i, cairo_charstring_type_t type) { cairo_status_t status; int orig_size; unsigned char buf[10]; unsigned char *p = buf; if (i >= -107 && i <= 107) { *p++ = i + 139; } else if (i >= 108 && i <= 1131) { i -= 108; *p++ = (i >> 8)+ 247; *p++ = i & 0xff; } else if (i >= -1131 && i <= -108) { i = -i - 108; *p++ = (i >> 8)+ 251; *p++ = i & 0xff; } else { if (type == CAIRO_CHARSTRING_TYPE1) { *p++ = 0xff; *p++ = i >> 24; *p++ = (i >> 16) & 0xff; *p++ = (i >> 8) & 0xff; *p++ = i & 0xff; } else { *p++ = 0xff; *p++ = (i >> 8) & 0xff; *p++ = i & 0xff; *p++ = 0; *p++ = 0; } } /* Ensure the array doesn't grow, which allows this function to * have no possibility of failure. */ orig_size = _cairo_array_size (data); status = _cairo_array_append_multiple (data, buf, p - buf); assert (status == CAIRO_STATUS_SUCCESS); assert (_cairo_array_size (data) == orig_size); } typedef struct _ps_path_info { cairo_array_t *data; int current_x, current_y; cairo_charstring_type_t type; } t1_path_info_t; static cairo_status_t _charstring_move_to (void *closure, cairo_point_t *point) { t1_path_info_t *path_info = (t1_path_info_t *) closure; int dx, dy; cairo_status_t status; status = _cairo_array_grow_by (path_info->data, 12); if (status) return status; dx = _cairo_fixed_integer_part (point->x) - path_info->current_x; dy = _cairo_fixed_integer_part (point->y) - path_info->current_y; charstring_encode_integer (path_info->data, dx, path_info->type); charstring_encode_integer (path_info->data, dy, path_info->type); path_info->current_x += dx; path_info->current_y += dy; charstring_encode_command (path_info->data, CHARSTRING_rmoveto); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _charstring_line_to (void *closure, cairo_point_t *point) { t1_path_info_t *path_info = (t1_path_info_t *) closure; int dx, dy; cairo_status_t status; status = _cairo_array_grow_by (path_info->data, 12); if (status) return status; dx = _cairo_fixed_integer_part (point->x) - path_info->current_x; dy = _cairo_fixed_integer_part (point->y) - path_info->current_y; charstring_encode_integer (path_info->data, dx, path_info->type); charstring_encode_integer (path_info->data, dy, path_info->type); path_info->current_x += dx; path_info->current_y += dy; charstring_encode_command (path_info->data, CHARSTRING_rlineto); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _charstring_curve_to (void *closure, cairo_point_t *point1, cairo_point_t *point2, cairo_point_t *point3) { t1_path_info_t *path_info = (t1_path_info_t *) closure; int dx1, dy1, dx2, dy2, dx3, dy3; cairo_status_t status; status = _cairo_array_grow_by (path_info->data, 32); if (status) return status; dx1 = _cairo_fixed_integer_part (point1->x) - path_info->current_x; dy1 = _cairo_fixed_integer_part (point1->y) - path_info->current_y; dx2 = _cairo_fixed_integer_part (point2->x) - path_info->current_x - dx1; dy2 = _cairo_fixed_integer_part (point2->y) - path_info->current_y - dy1; dx3 = _cairo_fixed_integer_part (point3->x) - path_info->current_x - dx1 - dx2; dy3 = _cairo_fixed_integer_part (point3->y) - path_info->current_y - dy1 - dy2; charstring_encode_integer (path_info->data, dx1, path_info->type); charstring_encode_integer (path_info->data, dy1, path_info->type); charstring_encode_integer (path_info->data, dx2, path_info->type); charstring_encode_integer (path_info->data, dy2, path_info->type); charstring_encode_integer (path_info->data, dx3, path_info->type); charstring_encode_integer (path_info->data, dy3, path_info->type); path_info->current_x += dx1 + dx2 + dx3; path_info->current_y += dy1 + dy2 + dy3; charstring_encode_command (path_info->data, CHARSTRING_rcurveto); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _charstring_close_path (void *closure) { cairo_status_t status; t1_path_info_t *path_info = (t1_path_info_t *) closure; if (path_info->type == CAIRO_CHARSTRING_TYPE2) return CAIRO_STATUS_SUCCESS; status = _cairo_array_grow_by (path_info->data, 2); if (status) return status; charstring_encode_command (path_info->data, CHARSTRING_closepath); return CAIRO_STATUS_SUCCESS; } static void charstring_encrypt (cairo_array_t *data) { unsigned char *d, *end; uint16_t c, p, r; r = CAIRO_TYPE1_CHARSTRING_KEY; d = (unsigned char *) _cairo_array_index (data, 0); end = d + _cairo_array_num_elements (data); while (d < end) { p = *d; c = p ^ (r >> 8); r = (c + r) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; *d++ = c; } } static cairo_int_status_t cairo_type1_font_create_charstring (cairo_type1_font_t *font, int subset_index, int glyph_index, cairo_charstring_type_t type, cairo_array_t *data) { cairo_int_status_t status; cairo_scaled_glyph_t *scaled_glyph; t1_path_info_t path_info; cairo_text_extents_t *metrics; cairo_bool_t emit_path = TRUE; /* This call may return CAIRO_INT_STATUS_UNSUPPORTED for bitmap fonts. */ status = _cairo_scaled_glyph_lookup (font->type1_scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS| CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); /* It is ok for the .notdef glyph to not have a path available. We * just need the metrics to emit an empty glyph. */ if (glyph_index == 0 && status == CAIRO_INT_STATUS_UNSUPPORTED) { emit_path = FALSE; status = _cairo_scaled_glyph_lookup (font->type1_scaled_font, glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); } if (status) return status; metrics = &scaled_glyph->metrics; if (subset_index == 0) { font->x_min = metrics->x_bearing; font->y_min = metrics->y_bearing; font->x_max = metrics->x_bearing + metrics->width; font->y_max = metrics->y_bearing + metrics->height; } else { if (metrics->x_bearing < font->x_min) font->x_min = metrics->x_bearing; if (metrics->y_bearing < font->y_min) font->y_min = metrics->y_bearing; if (metrics->x_bearing + metrics->width > font->x_max) font->x_max = metrics->x_bearing + metrics->width; if (metrics->y_bearing + metrics->height > font->y_max) font->y_max = metrics->y_bearing + metrics->height; } font->widths[subset_index] = metrics->x_advance; status = _cairo_array_grow_by (data, 30); if (status) return status; if (type == CAIRO_CHARSTRING_TYPE1) { charstring_encode_integer (data, (int) scaled_glyph->metrics.x_bearing, type); charstring_encode_integer (data, (int) scaled_glyph->metrics.y_bearing, type); charstring_encode_integer (data, (int) scaled_glyph->metrics.x_advance, type); charstring_encode_integer (data, (int) scaled_glyph->metrics.y_advance, type); charstring_encode_command (data, CHARSTRING_sbw); path_info.current_x = (int) scaled_glyph->metrics.x_bearing; path_info.current_y = (int) scaled_glyph->metrics.y_bearing; } else { charstring_encode_integer (data, (int) scaled_glyph->metrics.x_advance, type); path_info.current_x = 0; path_info.current_y = 0; } path_info.data = data; path_info.type = type; if (emit_path) { status = _cairo_path_fixed_interpret (scaled_glyph->path, CAIRO_DIRECTION_FORWARD, _charstring_move_to, _charstring_line_to, _charstring_curve_to, _charstring_close_path, &path_info); if (status) return status; } status = _cairo_array_grow_by (data, 1); if (status) return status; charstring_encode_command (path_info.data, CHARSTRING_endchar); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_type1_font_write_charstrings (cairo_type1_font_t *font, cairo_output_stream_t *encrypted_output) { cairo_status_t status; unsigned char zeros[] = { 0, 0, 0, 0 }; cairo_array_t data; unsigned int i; int length; _cairo_array_init (&data, sizeof (unsigned char)); status = _cairo_array_grow_by (&data, 1024); if (status) goto fail; _cairo_output_stream_printf (encrypted_output, "2 index /CharStrings %d dict dup begin\n", font->scaled_font_subset->num_glyphs + 1); for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { _cairo_array_truncate (&data, 0); /* four "random" bytes required by encryption algorithm */ status = _cairo_array_append_multiple (&data, zeros, 4); if (status) goto fail; status = cairo_type1_font_create_charstring (font, i, font->scaled_font_subset->glyphs[i], CAIRO_CHARSTRING_TYPE1, &data); if (status) goto fail; charstring_encrypt (&data); length = _cairo_array_num_elements (&data); if (font->scaled_font_subset->glyph_names != NULL) { _cairo_output_stream_printf (encrypted_output, "/%s %d RD ", font->scaled_font_subset->glyph_names[i], length); } else if (i == 0) { _cairo_output_stream_printf (encrypted_output, "/.notdef %d RD ", length); } else { _cairo_output_stream_printf (encrypted_output, "/g%d %d RD ", i, length); } _cairo_output_stream_write (encrypted_output, _cairo_array_index (&data, 0), length); _cairo_output_stream_printf (encrypted_output, " ND\n"); } fail: _cairo_array_fini (&data); return status; } static void cairo_type1_font_write_header (cairo_type1_font_t *font, const char *name) { unsigned int i; const char spaces[50] = " "; _cairo_output_stream_printf (font->output, "%%!FontType1-1.1 %s 1.0\n" "11 dict begin\n" "/FontName /%s def\n" "/PaintType 0 def\n" "/FontType 1 def\n" "/FontMatrix [0.001 0 0 0.001 0 0] readonly def\n", name, name); /* We don't know the bbox values until after the charstrings have * been generated. Reserve some space and fill in the bbox * later. */ /* Worst case for four signed ints with spaces between each number */ font->bbox_max_chars = 50; _cairo_output_stream_printf (font->output, "/FontBBox {"); font->bbox_position = _cairo_output_stream_get_position (font->output); _cairo_output_stream_write (font->output, spaces, font->bbox_max_chars); _cairo_output_stream_printf (font->output, "} readonly def\n" "/Encoding 256 array\n" "0 1 255 {1 index exch /.notdef put} for\n"); for (i = 1; i < font->scaled_font_subset->num_glyphs; i++) { if (font->scaled_font_subset->glyph_names != NULL) { _cairo_output_stream_printf (font->output, "dup %d /%s put\n", i, font->scaled_font_subset->glyph_names[i]); } else { _cairo_output_stream_printf (font->output, "dup %d /g%d put\n", i, i); } } _cairo_output_stream_printf (font->output, "readonly def\n" "currentdict end\n" "currentfile eexec\n"); } static cairo_status_t cairo_type1_write_stream_encrypted (void *closure, const unsigned char *data, unsigned int length) { const unsigned char *in, *end; uint16_t c, p; static const char hex_digits[16] = "0123456789abcdef"; char digits[3]; cairo_type1_font_t *font = closure; in = (const unsigned char *) data; end = (const unsigned char *) data + length; while (in < end) { p = *in++; c = p ^ (font->eexec_key >> 8); font->eexec_key = (c + font->eexec_key) * CAIRO_TYPE1_ENCRYPT_C1 + CAIRO_TYPE1_ENCRYPT_C2; if (font->hex_encode) { digits[0] = hex_digits[c >> 4]; digits[1] = hex_digits[c & 0x0f]; digits[2] = '\n'; font->hex_column += 2; if (font->hex_column == 78) { _cairo_output_stream_write (font->output, digits, 3); font->hex_column = 0; } else { _cairo_output_stream_write (font->output, digits, 2); } } else { digits[0] = c; _cairo_output_stream_write (font->output, digits, 1); } } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_type1_font_write_private_dict (cairo_type1_font_t *font, const char *name) { cairo_int_status_t status; cairo_status_t status2; cairo_output_stream_t *encrypted_output; font->eexec_key = CAIRO_TYPE1_PRIVATE_DICT_KEY; font->hex_column = 0; encrypted_output = _cairo_output_stream_create ( cairo_type1_write_stream_encrypted, NULL, font); if (_cairo_output_stream_get_status (encrypted_output)) return _cairo_output_stream_destroy (encrypted_output); /* Note: the first four spaces at the start of this private dict * are the four "random" bytes of plaintext required by the * encryption algorithm */ _cairo_output_stream_printf (encrypted_output, " dup /Private 9 dict dup begin\n" "/RD {string currentfile exch readstring pop}" " executeonly def\n" "/ND {noaccess def} executeonly def\n" "/NP {noaccess put} executeonly def\n" "/BlueValues [] def\n" "/MinFeature {16 16} def\n" "/lenIV 4 def\n" "/password 5839 def\n"); status = cairo_type1_font_write_charstrings (font, encrypted_output); if (status) goto fail; _cairo_output_stream_printf (encrypted_output, "end\n" "end\n" "readonly put\n" "noaccess put\n" "dup /FontName get exch definefont pop\n" "mark currentfile closefile\n"); fail: status2 = _cairo_output_stream_destroy (encrypted_output); if (status == CAIRO_STATUS_SUCCESS) status = status2; return status; } static void cairo_type1_font_write_trailer(cairo_type1_font_t *font) { int i; static const char zeros[65] = "0000000000000000000000000000000000000000000000000000000000000000\n"; for (i = 0; i < 8; i++) _cairo_output_stream_write (font->output, zeros, sizeof zeros); _cairo_output_stream_printf (font->output, "cleartomark\n"); } static cairo_status_t cairo_type1_write_stream (void *closure, const unsigned char *data, unsigned int length) { cairo_type1_font_t *font = closure; return _cairo_array_append_multiple (&font->contents, data, length); } static cairo_int_status_t cairo_type1_font_write (cairo_type1_font_t *font, const char *name) { cairo_int_status_t status; cairo_type1_font_write_header (font, name); font->header_size = _cairo_output_stream_get_position (font->output); status = cairo_type1_font_write_private_dict (font, name); if (status) return status; font->data_size = _cairo_output_stream_get_position (font->output) - font->header_size; cairo_type1_font_write_trailer (font); font->trailer_size = _cairo_output_stream_get_position (font->output) - font->header_size - font->data_size; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t cairo_type1_font_generate (cairo_type1_font_t *font, const char *name) { cairo_int_status_t status; status = _cairo_array_grow_by (&font->contents, 4096); if (status) return status; font->output = _cairo_output_stream_create (cairo_type1_write_stream, NULL, font); if (_cairo_output_stream_get_status (font->output)) return _cairo_output_stream_destroy (font->output); status = cairo_type1_font_write (font, name); if (status) return status; font->data = _cairo_array_index (&font->contents, 0); return CAIRO_STATUS_SUCCESS; } static cairo_status_t cairo_type1_font_destroy (cairo_type1_font_t *font) { cairo_status_t status = CAIRO_STATUS_SUCCESS; free (font->widths); cairo_scaled_font_destroy (font->type1_scaled_font); _cairo_array_fini (&font->contents); if (font->output) status = _cairo_output_stream_destroy (font->output); free (font); return status; } static cairo_status_t _cairo_type1_fallback_init_internal (cairo_type1_subset_t *type1_subset, const char *name, cairo_scaled_font_subset_t *scaled_font_subset, cairo_bool_t hex_encode) { cairo_type1_font_t *font; cairo_status_t status; unsigned long length; unsigned int i, len; status = cairo_type1_font_create (scaled_font_subset, &font, hex_encode); if (status) return status; status = cairo_type1_font_generate (font, name); if (status) goto fail1; type1_subset->base_font = strdup (name); if (type1_subset->base_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } type1_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs); if (type1_subset->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail2; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) type1_subset->widths[i] = font->widths[i]; type1_subset->x_min = (int) font->x_min; type1_subset->y_min = (int) font->y_min; type1_subset->x_max = (int) font->x_max; type1_subset->y_max = (int) font->y_max; type1_subset->ascent = (int) font->y_max; type1_subset->descent = (int) font->y_min; length = font->header_size + font->data_size + font->trailer_size; type1_subset->data = malloc (length); if (type1_subset->data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail3; } memcpy (type1_subset->data, _cairo_array_index (&font->contents, 0), length); len = snprintf(type1_subset->data + font->bbox_position, font->bbox_max_chars, "%d %d %d %d", (int)type1_subset->x_min, (int)type1_subset->y_min, (int)type1_subset->x_max, (int)type1_subset->y_max); type1_subset->data[font->bbox_position + len] = ' '; type1_subset->header_length = font->header_size; type1_subset->data_length = font->data_size; type1_subset->trailer_length = font->trailer_size; return cairo_type1_font_destroy (font); fail3: free (type1_subset->widths); fail2: free (type1_subset->base_font); fail1: /* status is already set, ignore further errors */ cairo_type1_font_destroy (font); return status; } cairo_status_t _cairo_type1_fallback_init_binary (cairo_type1_subset_t *type1_subset, const char *name, cairo_scaled_font_subset_t *scaled_font_subset) { return _cairo_type1_fallback_init_internal (type1_subset, name, scaled_font_subset, FALSE); } cairo_status_t _cairo_type1_fallback_init_hex (cairo_type1_subset_t *type1_subset, const char *name, cairo_scaled_font_subset_t *scaled_font_subset) { return _cairo_type1_fallback_init_internal (type1_subset, name, scaled_font_subset, TRUE); } void _cairo_type1_fallback_fini (cairo_type1_subset_t *subset) { free (subset->base_font); free (subset->widths); free (subset->data); } cairo_status_t _cairo_type2_charstrings_init (cairo_type2_charstrings_t *type2_subset, cairo_scaled_font_subset_t *scaled_font_subset) { cairo_type1_font_t *font; cairo_status_t status; unsigned int i; cairo_array_t charstring; status = cairo_type1_font_create (scaled_font_subset, &font, FALSE); if (status) return status; _cairo_array_init (&type2_subset->charstrings, sizeof (cairo_array_t)); type2_subset->widths = calloc (sizeof (int), font->scaled_font_subset->num_glyphs); if (type2_subset->widths == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto fail1; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) { _cairo_array_init (&charstring, sizeof (unsigned char)); status = _cairo_array_grow_by (&charstring, 32); if (status) goto fail2; status = cairo_type1_font_create_charstring (font, i, font->scaled_font_subset->glyphs[i], CAIRO_CHARSTRING_TYPE2, &charstring); if (status) goto fail2; status = _cairo_array_append (&type2_subset->charstrings, &charstring); if (status) goto fail2; } for (i = 0; i < font->scaled_font_subset->num_glyphs; i++) type2_subset->widths[i] = font->widths[i]; type2_subset->x_min = (int) font->x_min; type2_subset->y_min = (int) font->y_min; type2_subset->x_max = (int) font->x_max; type2_subset->y_max = (int) font->y_max; type2_subset->ascent = (int) font->y_max; type2_subset->descent = (int) font->y_min; return cairo_type1_font_destroy (font); fail2: _cairo_array_fini (&charstring); _cairo_type2_charstrings_fini (type2_subset); fail1: cairo_type1_font_destroy (font); return status; } void _cairo_type2_charstrings_fini (cairo_type2_charstrings_t *type2_subset) { unsigned int i, num_charstrings; cairo_array_t *charstring; num_charstrings = _cairo_array_num_elements (&type2_subset->charstrings); for (i = 0; i < num_charstrings; i++) { charstring = _cairo_array_index (&type2_subset->charstrings, i); _cairo_array_fini (charstring); } _cairo_array_fini (&type2_subset->charstrings); free (type2_subset->widths); } libgdiplus-2.11/cairo/src/cairo-os2.h0000664000175000017500000000567212225470167014371 00000000000000/* vim: set sw=4 sts=4 et cin: */ /* cairo - a vector graphics library with display and print output * * Copyright (c) 2005-2006 netlabs.org * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is * Doodle * * Contributor(s): * Peter Weilbacher */ #ifndef _CAIRO_OS2_H_ #define _CAIRO_OS2_H_ #include CAIRO_BEGIN_DECLS /* The OS/2 Specific Cairo API */ cairo_public void cairo_os2_init (void); cairo_public void cairo_os2_fini (void); #if CAIRO_HAS_OS2_SURFACE cairo_public cairo_surface_t * cairo_os2_surface_create (HPS hps_client_window, int width, int height); cairo_public void cairo_os2_surface_set_hwnd (cairo_surface_t *surface, HWND hwnd_client_window); cairo_public int cairo_os2_surface_set_size (cairo_surface_t *surface, int new_width, int new_height, int timeout); cairo_public void cairo_os2_surface_refresh_window (cairo_surface_t *surface, HPS hps_begin_paint, PRECTL prcl_begin_paint_rect); cairo_public void cairo_os2_surface_set_manual_window_refresh (cairo_surface_t *surface, cairo_bool_t manual_refresh); cairo_public cairo_bool_t cairo_os2_surface_get_manual_window_refresh (cairo_surface_t *surface); #else /* CAIRO_HAS_OS2_SURFACE */ # error Cairo was not compiled with support for the OS/2 backend #endif /* CAIRO_HAS_OS2_SURFACE */ CAIRO_END_DECLS #endif /* _CAIRO_OS2_H_ */ libgdiplus-2.11/cairo/src/cairo-base85-stream.c0000664000175000017500000001004412225470167016226 00000000000000/* cairo_output_stream.c: Output stream abstraction * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Author(s): * Kristian Høgsberg */ #include "cairoint.h" #include "cairo-output-stream-private.h" typedef struct _cairo_base85_stream { cairo_output_stream_t base; cairo_output_stream_t *output; unsigned char four_tuple[4]; int pending; } cairo_base85_stream_t; static void _expand_four_tuple_to_five (unsigned char four_tuple[4], unsigned char five_tuple[5], cairo_bool_t *all_zero) { uint32_t value; int digit, i; value = four_tuple[0] << 24 | four_tuple[1] << 16 | four_tuple[2] << 8 | four_tuple[3]; if (all_zero) *all_zero = TRUE; for (i = 0; i < 5; i++) { digit = value % 85; if (digit != 0 && all_zero) *all_zero = FALSE; five_tuple[4-i] = digit + 33; value = value / 85; } } static cairo_status_t _cairo_base85_stream_write (cairo_output_stream_t *base, const unsigned char *data, unsigned int length) { cairo_base85_stream_t *stream = (cairo_base85_stream_t *) base; const unsigned char *ptr = data; unsigned char five_tuple[5]; cairo_bool_t is_zero; while (length) { stream->four_tuple[stream->pending++] = *ptr++; length--; if (stream->pending == 4) { _expand_four_tuple_to_five (stream->four_tuple, five_tuple, &is_zero); if (is_zero) _cairo_output_stream_write (stream->output, "z", 1); else _cairo_output_stream_write (stream->output, five_tuple, 5); stream->pending = 0; } } return _cairo_output_stream_get_status (stream->output); } static cairo_status_t _cairo_base85_stream_close (cairo_output_stream_t *base) { cairo_base85_stream_t *stream = (cairo_base85_stream_t *) base; unsigned char five_tuple[5]; if (stream->pending) { memset (stream->four_tuple + stream->pending, 0, 4 - stream->pending); _expand_four_tuple_to_five (stream->four_tuple, five_tuple, NULL); _cairo_output_stream_write (stream->output, five_tuple, stream->pending + 1); } /* Mark end of base85 data */ _cairo_output_stream_printf (stream->output, "~>"); return _cairo_output_stream_get_status (stream->output); } cairo_output_stream_t * _cairo_base85_stream_create (cairo_output_stream_t *output) { cairo_base85_stream_t *stream; if (output->status) return _cairo_output_stream_create_in_error (output->status); stream = malloc (sizeof (cairo_base85_stream_t)); if (stream == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_output_stream_t *) &_cairo_output_stream_nil; } _cairo_output_stream_init (&stream->base, _cairo_base85_stream_write, _cairo_base85_stream_close); stream->output = output; stream->pending = 0; return &stream->base; } libgdiplus-2.11/cairo/src/cairo-xlib-screen.c0000664000175000017500000003112112225470167016060 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Partially on code from xftdpy.c * * Copyright © 2000 Keith Packard * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that * copyright notice and this permission notice appear in supporting * documentation, and that the name of Keith Packard not be used in * advertising or publicity pertaining to distribution of the software without * specific, written prior permission. Keith Packard makes no * representations about the suitability of this software for any purpose. It * is provided "as is" without express or implied warranty. * * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. */ #include "cairoint.h" #include "cairo-xlib-private.h" #include "cairo-xlib-xrender-private.h" #include static int parse_boolean (const char *v) { char c0, c1; c0 = *v; if (c0 == 't' || c0 == 'T' || c0 == 'y' || c0 == 'Y' || c0 == '1') return 1; if (c0 == 'f' || c0 == 'F' || c0 == 'n' || c0 == 'N' || c0 == '0') return 0; if (c0 == 'o') { c1 = v[1]; if (c1 == 'n' || c1 == 'N') return 1; if (c1 == 'f' || c1 == 'F') return 0; } return -1; } static cairo_bool_t get_boolean_default (Display *dpy, const char *option, cairo_bool_t *value) { char *v; int i; v = XGetDefault (dpy, "Xft", option); if (v) { i = parse_boolean (v); if (i >= 0) { *value = i; return TRUE; } } return FALSE; } static cairo_bool_t get_integer_default (Display *dpy, const char *option, int *value) { int i; char *v, *e; v = XGetDefault (dpy, "Xft", option); if (v) { if (FcNameConstant ((FcChar8 *) v, value)) return TRUE; i = strtol (v, &e, 0); if (e != v) return TRUE; } return FALSE; } /* Old versions of fontconfig didn't have these options */ #ifndef FC_HINT_NONE #define FC_HINT_NONE 0 #define FC_HINT_SLIGHT 1 #define FC_HINT_MEDIUM 2 #define FC_HINT_FULL 3 #endif static void _cairo_xlib_init_screen_font_options (Display *dpy, cairo_xlib_screen_info_t *info) { cairo_bool_t xft_hinting; cairo_bool_t xft_antialias; int xft_hintstyle; int xft_rgba; cairo_antialias_t antialias; cairo_subpixel_order_t subpixel_order; cairo_hint_style_t hint_style; if (!get_boolean_default (dpy, "antialias", &xft_antialias)) xft_antialias = TRUE; if (!get_boolean_default (dpy, "hinting", &xft_hinting)) xft_hinting = TRUE; if (!get_integer_default (dpy, "hintstyle", &xft_hintstyle)) xft_hintstyle = FC_HINT_FULL; if (!get_integer_default (dpy, "rgba", &xft_rgba)) { xft_rgba = FC_RGBA_UNKNOWN; #if RENDER_MAJOR > 0 || RENDER_MINOR >= 6 if (info->has_render) { int render_order = XRenderQuerySubpixelOrder (dpy, XScreenNumberOfScreen (info->screen)); switch (render_order) { default: case SubPixelUnknown: xft_rgba = FC_RGBA_UNKNOWN; break; case SubPixelHorizontalRGB: xft_rgba = FC_RGBA_RGB; break; case SubPixelHorizontalBGR: xft_rgba = FC_RGBA_BGR; break; case SubPixelVerticalRGB: xft_rgba = FC_RGBA_VRGB; break; case SubPixelVerticalBGR: xft_rgba = FC_RGBA_VBGR; break; case SubPixelNone: xft_rgba = FC_RGBA_NONE; break; } } #endif } if (xft_hinting) { switch (xft_hintstyle) { case FC_HINT_NONE: hint_style = CAIRO_HINT_STYLE_NONE; break; case FC_HINT_SLIGHT: hint_style = CAIRO_HINT_STYLE_SLIGHT; break; case FC_HINT_MEDIUM: hint_style = CAIRO_HINT_STYLE_MEDIUM; break; case FC_HINT_FULL: hint_style = CAIRO_HINT_STYLE_FULL; break; default: hint_style = CAIRO_HINT_STYLE_DEFAULT; } } else { hint_style = CAIRO_HINT_STYLE_NONE; } switch (xft_rgba) { case FC_RGBA_RGB: subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; break; case FC_RGBA_BGR: subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; break; case FC_RGBA_VRGB: subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; break; case FC_RGBA_VBGR: subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; break; case FC_RGBA_UNKNOWN: case FC_RGBA_NONE: default: subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; } if (xft_antialias) { if (subpixel_order == CAIRO_SUBPIXEL_ORDER_DEFAULT) antialias = CAIRO_ANTIALIAS_GRAY; else antialias = CAIRO_ANTIALIAS_SUBPIXEL; } else { antialias = CAIRO_ANTIALIAS_NONE; } cairo_font_options_set_hint_style (&info->font_options, hint_style); cairo_font_options_set_antialias (&info->font_options, antialias); cairo_font_options_set_subpixel_order (&info->font_options, subpixel_order); cairo_font_options_set_hint_metrics (&info->font_options, CAIRO_HINT_METRICS_ON); } cairo_xlib_screen_info_t * _cairo_xlib_screen_info_reference (cairo_xlib_screen_info_t *info) { assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&info->ref_count)); _cairo_reference_count_inc (&info->ref_count); return info; } void _cairo_xlib_screen_info_close_display (cairo_xlib_screen_info_t *info) { int i; for (i = 0; i < ARRAY_LENGTH (info->gc); i++) { if (info->gc[i] != NULL) { XFreeGC (info->display->display, info->gc[i]); info->gc[i] = NULL; } } } void _cairo_xlib_screen_info_destroy (cairo_xlib_screen_info_t *info) { cairo_xlib_screen_info_t **prev; cairo_xlib_screen_info_t *list; cairo_xlib_visual_info_t **visuals; int i; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&info->ref_count)); if (! _cairo_reference_count_dec_and_test (&info->ref_count)) return; CAIRO_MUTEX_LOCK (info->display->mutex); for (prev = &info->display->screens; (list = *prev); prev = &list->next) { if (list == info) { *prev = info->next; break; } } visuals = _cairo_array_index (&info->visuals, 0); for (i = 0; i < _cairo_array_num_elements (&info->visuals); i++) _cairo_xlib_visual_info_destroy (info->display->display, visuals[i]); CAIRO_MUTEX_UNLOCK (info->display->mutex); _cairo_xlib_screen_info_close_display (info); _cairo_xlib_display_destroy (info->display); _cairo_array_fini (&info->visuals); free (info); } cairo_xlib_screen_info_t * _cairo_xlib_screen_info_get (Display *dpy, Screen *screen) { cairo_xlib_display_t *display; cairo_xlib_screen_info_t *info = NULL, **prev; display = _cairo_xlib_display_get (dpy); if (display == NULL) return NULL; CAIRO_MUTEX_LOCK (display->mutex); if (display->closed) { CAIRO_MUTEX_UNLOCK (display->mutex); goto DONE; } for (prev = &display->screens; (info = *prev); prev = &(*prev)->next) { if (info->screen == screen) { /* * MRU the list */ if (prev != &display->screens) { *prev = info->next; info->next = display->screens; display->screens = info; } break; } } CAIRO_MUTEX_UNLOCK (display->mutex); if (info != NULL) { info = _cairo_xlib_screen_info_reference (info); } else { info = malloc (sizeof (cairo_xlib_screen_info_t)); if (info != NULL) { CAIRO_REFERENCE_COUNT_INIT (&info->ref_count, 2); /* Add one for display cache */ info->display = _cairo_xlib_display_reference (display); info->screen = screen; info->has_render = FALSE; _cairo_font_options_init_default (&info->font_options); memset (info->gc, 0, sizeof (info->gc)); info->gc_needs_clip_reset = 0; _cairo_array_init (&info->visuals, sizeof (cairo_xlib_visual_info_t*)); if (screen) { int event_base, error_base; info->has_render = (XRenderQueryExtension (dpy, &event_base, &error_base) && (XRenderFindVisualFormat (dpy, DefaultVisual (dpy, DefaultScreen (dpy))) != 0)); _cairo_xlib_init_screen_font_options (dpy, info); } CAIRO_MUTEX_LOCK (display->mutex); info->next = display->screens; display->screens = info; CAIRO_MUTEX_UNLOCK (display->mutex); } } DONE: _cairo_xlib_display_destroy (display); return info; } static int depth_to_index (int depth) { switch(depth){ case 1: return 1; case 8: return 2; case 12: return 3; case 15: return 4; case 16: return 5; case 24: return 6; case 30: return 7; case 32: return 8; } return 0; } GC _cairo_xlib_screen_get_gc (cairo_xlib_screen_info_t *info, int depth) { GC gc; depth = depth_to_index (depth); gc = info->gc[depth]; info->gc[depth] = NULL; if (info->gc_needs_clip_reset & (1 << depth)) { XSetClipMask(info->display->display, gc, None); info->gc_needs_clip_reset &= ~(1 << depth); } return gc; } cairo_status_t _cairo_xlib_screen_put_gc (cairo_xlib_screen_info_t *info, int depth, GC gc, cairo_bool_t reset_clip) { cairo_status_t status = CAIRO_STATUS_SUCCESS; depth = depth_to_index (depth); if (info->gc[depth] != NULL) { status = _cairo_xlib_display_queue_work (info->display, (cairo_xlib_notify_func) XFreeGC, info->gc[depth], NULL); } info->gc[depth] = gc; if (reset_clip) info->gc_needs_clip_reset |= 1 << depth; else info->gc_needs_clip_reset &= ~(1 << depth); return status; } cairo_status_t _cairo_xlib_screen_get_visual_info (cairo_xlib_screen_info_t *info, Visual *visual, cairo_xlib_visual_info_t **out) { cairo_xlib_visual_info_t **visuals, *ret = NULL; cairo_status_t status; int i, n_visuals; CAIRO_MUTEX_LOCK (info->display->mutex); visuals = _cairo_array_index (&info->visuals, 0); n_visuals = _cairo_array_num_elements (&info->visuals); for (i = 0; i < n_visuals; i++) { if (visuals[i]->visualid == visual->visualid) { ret = visuals[i]; break; } } CAIRO_MUTEX_UNLOCK (info->display->mutex); if (ret != NULL) { *out = ret; return CAIRO_STATUS_SUCCESS; } status = _cairo_xlib_visual_info_create (info->display->display, XScreenNumberOfScreen (info->screen), visual->visualid, &ret); if (status) return status; CAIRO_MUTEX_LOCK (info->display->mutex); if (n_visuals != _cairo_array_num_elements (&info->visuals)) { /* check that another thread has not added our visual */ int new_visuals = _cairo_array_num_elements (&info->visuals); visuals = _cairo_array_index (&info->visuals, 0); for (i = n_visuals; i < new_visuals; i++) { if (visuals[i]->visualid == visual->visualid) { _cairo_xlib_visual_info_destroy (info->display->display, ret); ret = visuals[i]; break; } } if (i == new_visuals) status = _cairo_array_append (&info->visuals, &ret); } else status = _cairo_array_append (&info->visuals, &ret); CAIRO_MUTEX_UNLOCK (info->display->mutex); if (status) { _cairo_xlib_visual_info_destroy (info->display->display, ret); return status; } *out = ret; return CAIRO_STATUS_SUCCESS; } libgdiplus-2.11/cairo/src/cairo-surface-private.h0000664000175000017500000000717712225470167016770 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_SURFACE_PRIVATE_H #define CAIRO_SURFACE_PRIVATE_H #include "cairo.h" #include "cairo-types-private.h" #include "cairo-reference-count-private.h" struct _cairo_surface { const cairo_surface_backend_t *backend; /* We allow surfaces to override the backend->type by shoving something * else into surface->type. This is for "wrapper" surfaces that want to * hide their internal type from the user-level API. */ cairo_surface_type_t type; cairo_content_t content; cairo_reference_count_t ref_count; cairo_status_t status; cairo_bool_t finished; cairo_user_data_array_t user_data; cairo_matrix_t device_transform; cairo_matrix_t device_transform_inverse; /* The actual resolution of the device, in dots per inch. */ double x_resolution; double y_resolution; /* The resolution that should be used when generating image-based * fallback; generally only used by the analysis/paginated * surfaces */ double x_fallback_resolution; double y_fallback_resolution; cairo_clip_t *clip; /* * Each time a clip region is modified, it gets the next value in this * sequence. This means that clip regions for this surface are uniquely * identified and updates to the clip can be readily identified */ unsigned int next_clip_serial; /* * The serial number of the current clip. This is set when * the surface clipping is set. The gstate can then cheaply * check whether the surface clipping is already correct before * performing a rendering operation. * * The special value '0' is reserved for the unclipped case. */ unsigned int current_clip_serial; /* A "snapshot" surface is immutable. See _cairo_surface_snapshot. */ cairo_bool_t is_snapshot; /* * Surface font options, falling back to backend's default options, * and set using _cairo_surface_set_font_options(), and propagated by * cairo_surface_create_similar(). */ cairo_bool_t has_font_options; cairo_font_options_t font_options; }; #endif /* CAIRO_SURFACE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-scaled-font-subsets.c0000664000175000017500000006737112225470167017552 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * Copyright © 2005 Red Hat, Inc * Copyright © 2006 Keith Packard * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Kristian Høgsberg * Keith Packard * Adrian Johnson */ #define _BSD_SOURCE /* for snprintf(), strdup() */ #include "cairoint.h" #include "cairo-scaled-font-subsets-private.h" #define MAX_GLYPHS_PER_SIMPLE_FONT 256 #define MAX_GLYPHS_PER_COMPOSITE_FONT 65536 typedef enum { CAIRO_SUBSETS_SCALED, CAIRO_SUBSETS_SIMPLE, CAIRO_SUBSETS_COMPOSITE } cairo_subsets_type_t; struct _cairo_scaled_font_subsets { cairo_subsets_type_t type; int max_glyphs_per_unscaled_subset_used; cairo_hash_table_t *unscaled_sub_fonts; int max_glyphs_per_scaled_subset_used; cairo_hash_table_t *scaled_sub_fonts; int num_sub_fonts; }; typedef struct _cairo_sub_font { cairo_hash_entry_t base; cairo_bool_t is_scaled; cairo_bool_t is_composite; cairo_scaled_font_subsets_t *parent; cairo_scaled_font_t *scaled_font; unsigned int font_id; int current_subset; int num_glyphs_in_current_subset; int max_glyphs_per_subset; cairo_hash_table_t *sub_font_glyphs; } cairo_sub_font_t; typedef struct _cairo_sub_font_glyph { cairo_hash_entry_t base; unsigned int subset_id; unsigned int subset_glyph_index; double x_advance; } cairo_sub_font_glyph_t; typedef struct _cairo_sub_font_collection { unsigned long *glyphs; /* scaled_font_glyph_index */ unsigned int glyphs_size; unsigned int max_glyph; unsigned int num_glyphs; unsigned int subset_id; cairo_status_t status; cairo_scaled_font_subset_callback_func_t font_subset_callback; void *font_subset_callback_closure; } cairo_sub_font_collection_t; typedef struct _cairo_string_entry { cairo_hash_entry_t base; char *string; } cairo_string_entry_t; static cairo_status_t _cairo_sub_font_map_glyph (cairo_sub_font_t *sub_font, unsigned long scaled_font_glyph_index, cairo_scaled_font_subsets_glyph_t *subset_glyph); static void _cairo_sub_font_glyph_init_key (cairo_sub_font_glyph_t *sub_font_glyph, unsigned long scaled_font_glyph_index) { sub_font_glyph->base.hash = scaled_font_glyph_index; } static cairo_bool_t _cairo_sub_font_glyphs_equal (const void *key_a, const void *key_b) { const cairo_sub_font_glyph_t *sub_font_glyph_a = key_a; const cairo_sub_font_glyph_t *sub_font_glyph_b = key_b; return sub_font_glyph_a->base.hash == sub_font_glyph_b->base.hash; } static cairo_sub_font_glyph_t * _cairo_sub_font_glyph_create (unsigned long scaled_font_glyph_index, unsigned int subset_id, unsigned int subset_glyph_index, double x_advance) { cairo_sub_font_glyph_t *sub_font_glyph; sub_font_glyph = malloc (sizeof (cairo_sub_font_glyph_t)); if (sub_font_glyph == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } _cairo_sub_font_glyph_init_key (sub_font_glyph, scaled_font_glyph_index); sub_font_glyph->subset_id = subset_id; sub_font_glyph->subset_glyph_index = subset_glyph_index; sub_font_glyph->x_advance = x_advance; return sub_font_glyph; } static void _cairo_sub_font_glyph_destroy (cairo_sub_font_glyph_t *sub_font_glyph) { free (sub_font_glyph); } static void _cairo_sub_font_glyph_pluck (void *entry, void *closure) { cairo_sub_font_glyph_t *sub_font_glyph = entry; cairo_hash_table_t *sub_font_glyphs = closure; _cairo_hash_table_remove (sub_font_glyphs, &sub_font_glyph->base); _cairo_sub_font_glyph_destroy (sub_font_glyph); } static void _cairo_sub_font_glyph_collect (void *entry, void *closure) { cairo_sub_font_glyph_t *sub_font_glyph = entry; cairo_sub_font_collection_t *collection = closure; unsigned long scaled_font_glyph_index; unsigned int subset_glyph_index; if (sub_font_glyph->subset_id != collection->subset_id) return; scaled_font_glyph_index = sub_font_glyph->base.hash; subset_glyph_index = sub_font_glyph->subset_glyph_index; /* Ensure we don't exceed the allocated bounds. */ assert (subset_glyph_index < collection->glyphs_size); collection->glyphs[subset_glyph_index] = scaled_font_glyph_index; if (subset_glyph_index > collection->max_glyph) collection->max_glyph = subset_glyph_index; collection->num_glyphs++; } static cairo_bool_t _cairo_sub_fonts_equal (const void *key_a, const void *key_b) { const cairo_sub_font_t *sub_font_a = key_a; const cairo_sub_font_t *sub_font_b = key_b; if (sub_font_a->is_scaled) return sub_font_a->scaled_font == sub_font_b->scaled_font; else return sub_font_a->scaled_font->font_face == sub_font_b->scaled_font->font_face; } static void _cairo_sub_font_init_key (cairo_sub_font_t *sub_font, cairo_scaled_font_t *scaled_font) { if (sub_font->is_scaled) { sub_font->base.hash = (unsigned long) scaled_font; sub_font->scaled_font = scaled_font; } else { sub_font->base.hash = (unsigned long) scaled_font->font_face; sub_font->scaled_font = scaled_font; } } static cairo_status_t _cairo_sub_font_create (cairo_scaled_font_subsets_t *parent, cairo_scaled_font_t *scaled_font, unsigned int font_id, int max_glyphs_per_subset, cairo_bool_t is_scaled, cairo_bool_t is_composite, cairo_sub_font_t **sub_font_out) { cairo_sub_font_t *sub_font; cairo_status_t status; cairo_scaled_font_subsets_glyph_t subset_glyph; sub_font = malloc (sizeof (cairo_sub_font_t)); if (sub_font == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); sub_font->is_scaled = is_scaled; sub_font->is_composite = is_composite; _cairo_sub_font_init_key (sub_font, scaled_font); sub_font->parent = parent; sub_font->scaled_font = scaled_font; sub_font->font_id = font_id; sub_font->current_subset = 0; sub_font->num_glyphs_in_current_subset = 0; sub_font->max_glyphs_per_subset = max_glyphs_per_subset; sub_font->sub_font_glyphs = _cairo_hash_table_create (_cairo_sub_font_glyphs_equal); if (sub_font->sub_font_glyphs == NULL) { free (sub_font); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Reserve first glyph in subset for the .notdef glyph */ status = _cairo_sub_font_map_glyph (sub_font, 0, &subset_glyph); if (status) { _cairo_hash_table_destroy (sub_font->sub_font_glyphs); free (sub_font); return status; } *sub_font_out = sub_font; return CAIRO_STATUS_SUCCESS; } static void _cairo_sub_font_destroy (cairo_sub_font_t *sub_font) { _cairo_hash_table_foreach (sub_font->sub_font_glyphs, _cairo_sub_font_glyph_pluck, sub_font->sub_font_glyphs); _cairo_hash_table_destroy (sub_font->sub_font_glyphs); cairo_scaled_font_destroy (sub_font->scaled_font); free (sub_font); } static void _cairo_sub_font_pluck (void *entry, void *closure) { cairo_sub_font_t *sub_font = entry; cairo_hash_table_t *sub_fonts = closure; _cairo_hash_table_remove (sub_fonts, &sub_font->base); _cairo_sub_font_destroy (sub_font); } static cairo_bool_t _cairo_sub_font_lookup_glyph (cairo_sub_font_t *sub_font, unsigned long scaled_font_glyph_index, cairo_scaled_font_subsets_glyph_t *subset_glyph) { cairo_sub_font_glyph_t key, *sub_font_glyph; _cairo_sub_font_glyph_init_key (&key, scaled_font_glyph_index); if (_cairo_hash_table_lookup (sub_font->sub_font_glyphs, &key.base, (cairo_hash_entry_t **) &sub_font_glyph)) { subset_glyph->font_id = sub_font->font_id; subset_glyph->subset_id = sub_font_glyph->subset_id; subset_glyph->subset_glyph_index = sub_font_glyph->subset_glyph_index; subset_glyph->is_scaled = sub_font->is_scaled; subset_glyph->is_composite = sub_font->is_composite; subset_glyph->x_advance = sub_font_glyph->x_advance; return TRUE; } return FALSE; } static cairo_status_t _cairo_sub_font_map_glyph (cairo_sub_font_t *sub_font, unsigned long scaled_font_glyph_index, cairo_scaled_font_subsets_glyph_t *subset_glyph) { cairo_sub_font_glyph_t key, *sub_font_glyph; cairo_status_t status; cairo_scaled_glyph_t *scaled_glyph; cairo_scaled_font_subsets_glyph_t tmp_subset_glyph; _cairo_sub_font_glyph_init_key (&key, scaled_font_glyph_index); if (! _cairo_hash_table_lookup (sub_font->sub_font_glyphs, &key.base, (cairo_hash_entry_t **) &sub_font_glyph)) { if (sub_font->num_glyphs_in_current_subset == sub_font->max_glyphs_per_subset) { sub_font->current_subset++; sub_font->num_glyphs_in_current_subset = 0; /* Reserve first glyph in subset for the .notdef glyph */ status = _cairo_sub_font_map_glyph (sub_font, 0, &tmp_subset_glyph); if (status) return status; } status = _cairo_scaled_glyph_lookup (sub_font->scaled_font, scaled_font_glyph_index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); assert (status != CAIRO_INT_STATUS_UNSUPPORTED); if (status) return status; sub_font_glyph = _cairo_sub_font_glyph_create (scaled_font_glyph_index, sub_font->current_subset, sub_font->num_glyphs_in_current_subset, scaled_glyph->metrics.x_advance); if (sub_font_glyph == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_hash_table_insert (sub_font->sub_font_glyphs, &sub_font_glyph->base); if (status) { _cairo_sub_font_glyph_destroy (sub_font_glyph); return status; } sub_font->num_glyphs_in_current_subset++; if (sub_font->is_scaled) { if (sub_font->num_glyphs_in_current_subset > sub_font->parent->max_glyphs_per_scaled_subset_used) sub_font->parent->max_glyphs_per_scaled_subset_used = sub_font->num_glyphs_in_current_subset; } else { if (sub_font->num_glyphs_in_current_subset > sub_font->parent->max_glyphs_per_unscaled_subset_used) sub_font->parent->max_glyphs_per_unscaled_subset_used = sub_font->num_glyphs_in_current_subset; } } subset_glyph->font_id = sub_font->font_id; subset_glyph->subset_id = sub_font_glyph->subset_id; subset_glyph->subset_glyph_index = sub_font_glyph->subset_glyph_index; subset_glyph->is_scaled = sub_font->is_scaled; subset_glyph->is_composite = sub_font->is_composite; subset_glyph->x_advance = sub_font_glyph->x_advance; return CAIRO_STATUS_SUCCESS; } static void _cairo_sub_font_collect (void *entry, void *closure) { cairo_sub_font_t *sub_font = entry; cairo_sub_font_collection_t *collection = closure; cairo_scaled_font_subset_t subset; int i; unsigned int j; if (collection->status) return; for (i = 0; i <= sub_font->current_subset; i++) { collection->subset_id = i; collection->num_glyphs = 0; collection->max_glyph = 0; _cairo_hash_table_foreach (sub_font->sub_font_glyphs, _cairo_sub_font_glyph_collect, collection); if (collection->status) break; if (collection->num_glyphs == 0) continue; /* Ensure the resulting array has no uninitialized holes */ assert (collection->num_glyphs == collection->max_glyph + 1); subset.scaled_font = sub_font->scaled_font; subset.is_composite = sub_font->is_composite; subset.font_id = sub_font->font_id; subset.subset_id = i; subset.glyphs = collection->glyphs; subset.num_glyphs = collection->num_glyphs; subset.glyph_names = NULL; /* No need to check for out of memory here. If to_unicode is NULL, the PDF * surface does not emit an ToUnicode stream */ subset.to_unicode = _cairo_malloc_ab (collection->num_glyphs, sizeof (unsigned long)); if (subset.to_unicode) { for (j = 0; j < collection->num_glyphs; j++) { /* default unicode character required when mapping fails */ subset.to_unicode[j] = 0xfffd; } } collection->status = (collection->font_subset_callback) (&subset, collection->font_subset_callback_closure); if (subset.to_unicode != NULL) free (subset.to_unicode); if (subset.glyph_names != NULL) { for (j = 0; j < collection->num_glyphs; j++) free (subset.glyph_names[j]); free (subset.glyph_names); } if (collection->status) break; } } static cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_internal (cairo_subsets_type_t type) { cairo_scaled_font_subsets_t *subsets; subsets = malloc (sizeof (cairo_scaled_font_subsets_t)); if (subsets == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } subsets->type = type; subsets->max_glyphs_per_unscaled_subset_used = 0; subsets->max_glyphs_per_scaled_subset_used = 0; subsets->num_sub_fonts = 0; subsets->unscaled_sub_fonts = _cairo_hash_table_create (_cairo_sub_fonts_equal); if (! subsets->unscaled_sub_fonts) { free (subsets); return NULL; } subsets->scaled_sub_fonts = _cairo_hash_table_create (_cairo_sub_fonts_equal); if (! subsets->scaled_sub_fonts) { _cairo_hash_table_destroy (subsets->unscaled_sub_fonts); free (subsets); return NULL; } return subsets; } cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_scaled (void) { return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_SCALED); } cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_simple (void) { return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_SIMPLE); } cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_composite (void) { return _cairo_scaled_font_subsets_create_internal (CAIRO_SUBSETS_COMPOSITE); } void _cairo_scaled_font_subsets_destroy (cairo_scaled_font_subsets_t *subsets) { _cairo_hash_table_foreach (subsets->scaled_sub_fonts, _cairo_sub_font_pluck, subsets->scaled_sub_fonts); _cairo_hash_table_destroy (subsets->scaled_sub_fonts); _cairo_hash_table_foreach (subsets->unscaled_sub_fonts, _cairo_sub_font_pluck, subsets->unscaled_sub_fonts); _cairo_hash_table_destroy (subsets->unscaled_sub_fonts); free (subsets); } cairo_status_t _cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *subsets, cairo_scaled_font_t *scaled_font, unsigned long scaled_font_glyph_index, cairo_scaled_font_subsets_glyph_t *subset_glyph) { cairo_sub_font_t key, *sub_font; cairo_scaled_glyph_t *scaled_glyph; cairo_font_face_t *font_face; cairo_matrix_t identity; cairo_font_options_t font_options; cairo_scaled_font_t *unscaled_font; cairo_status_t status; int max_glyphs; cairo_bool_t type1_font; /* Lookup glyph in unscaled subsets */ if (subsets->type != CAIRO_SUBSETS_SCALED) { key.is_scaled = FALSE; _cairo_sub_font_init_key (&key, scaled_font); if (_cairo_hash_table_lookup (subsets->unscaled_sub_fonts, &key.base, (cairo_hash_entry_t **) &sub_font)) { if (_cairo_sub_font_lookup_glyph (sub_font, scaled_font_glyph_index, subset_glyph)) return CAIRO_STATUS_SUCCESS; } } /* Lookup glyph in scaled subsets */ key.is_scaled = TRUE; _cairo_sub_font_init_key (&key, scaled_font); if (_cairo_hash_table_lookup (subsets->scaled_sub_fonts, &key.base, (cairo_hash_entry_t **) &sub_font)) { if (_cairo_sub_font_lookup_glyph (sub_font, scaled_font_glyph_index, subset_glyph)) return CAIRO_STATUS_SUCCESS; } /* Glyph not found. Determine whether the glyph is outline or * bitmap and add to the appropriate subset. * * glyph_index 0 (the .notdef glyph) is a special case. Some fonts * will return CAIRO_INT_STATUS_UNSUPPORTED when doing a * _scaled_glyph_lookup(_GLYPH_INFO_PATH). Type1-fallback creates * empty glyphs in this case so we can put the glyph in a unscaled * subset. */ if (scaled_font_glyph_index == 0) { status = CAIRO_STATUS_SUCCESS; } else { status = _cairo_scaled_glyph_lookup (scaled_font, scaled_font_glyph_index, CAIRO_SCALED_GLYPH_INFO_PATH, &scaled_glyph); } if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; if (status == CAIRO_STATUS_SUCCESS && subsets->type != CAIRO_SUBSETS_SCALED) { /* Path available. Add to unscaled subset. */ key.is_scaled = FALSE; _cairo_sub_font_init_key (&key, scaled_font); if (! _cairo_hash_table_lookup (subsets->unscaled_sub_fonts, &key.base, (cairo_hash_entry_t **) &sub_font)) { font_face = cairo_scaled_font_get_font_face (scaled_font); cairo_matrix_init_identity (&identity); _cairo_font_options_init_default (&font_options); cairo_font_options_set_hint_style (&font_options, CAIRO_HINT_STYLE_NONE); cairo_font_options_set_hint_metrics (&font_options, CAIRO_HINT_METRICS_OFF); unscaled_font = cairo_scaled_font_create (font_face, &identity, &identity, &font_options); if (unscaled_font->status) return unscaled_font->status; subset_glyph->is_scaled = FALSE; type1_font = FALSE; #if CAIRO_HAS_FT_FONT type1_font = _cairo_type1_scaled_font_is_type1 (unscaled_font); #endif if (subsets->type == CAIRO_SUBSETS_COMPOSITE && !type1_font) { max_glyphs = MAX_GLYPHS_PER_COMPOSITE_FONT; subset_glyph->is_composite = TRUE; } else { max_glyphs = MAX_GLYPHS_PER_SIMPLE_FONT; subset_glyph->is_composite = FALSE; } status = _cairo_sub_font_create (subsets, unscaled_font, subsets->num_sub_fonts, max_glyphs, subset_glyph->is_scaled, subset_glyph->is_composite, &sub_font); if (status) { cairo_scaled_font_destroy (unscaled_font); return status; } status = _cairo_hash_table_insert (subsets->unscaled_sub_fonts, &sub_font->base); if (status) { _cairo_sub_font_destroy (sub_font); return status; } subsets->num_sub_fonts++; } } else { /* No path available. Add to scaled subset. */ key.is_scaled = TRUE; _cairo_sub_font_init_key (&key, scaled_font); if (! _cairo_hash_table_lookup (subsets->scaled_sub_fonts, &key.base, (cairo_hash_entry_t **) &sub_font)) { subset_glyph->is_scaled = TRUE; subset_glyph->is_composite = FALSE; if (subsets->type == CAIRO_SUBSETS_SCALED) max_glyphs = INT_MAX; else max_glyphs = MAX_GLYPHS_PER_SIMPLE_FONT; status = _cairo_sub_font_create (subsets, cairo_scaled_font_reference (scaled_font), subsets->num_sub_fonts, max_glyphs, subset_glyph->is_scaled, subset_glyph->is_composite, &sub_font); if (status) { cairo_scaled_font_destroy (scaled_font); return status; } status = _cairo_hash_table_insert (subsets->scaled_sub_fonts, &sub_font->base); if (status) { _cairo_sub_font_destroy (sub_font); return status; } subsets->num_sub_fonts++; } } return _cairo_sub_font_map_glyph (sub_font, scaled_font_glyph_index, subset_glyph); } static cairo_status_t _cairo_scaled_font_subsets_foreach_internal (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_subset_callback_func_t font_subset_callback, void *closure, cairo_bool_t is_scaled) { cairo_sub_font_collection_t collection; if (is_scaled) collection.glyphs_size = font_subsets->max_glyphs_per_scaled_subset_used; else collection.glyphs_size = font_subsets->max_glyphs_per_unscaled_subset_used; if (! collection.glyphs_size) return CAIRO_STATUS_SUCCESS; collection.glyphs = _cairo_malloc_ab (collection.glyphs_size, sizeof(unsigned long)); if (collection.glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); collection.font_subset_callback = font_subset_callback; collection.font_subset_callback_closure = closure; collection.status = CAIRO_STATUS_SUCCESS; if (is_scaled) _cairo_hash_table_foreach (font_subsets->scaled_sub_fonts, _cairo_sub_font_collect, &collection); else _cairo_hash_table_foreach (font_subsets->unscaled_sub_fonts, _cairo_sub_font_collect, &collection); free (collection.glyphs); return collection.status; } cairo_status_t _cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_subset_callback_func_t font_subset_callback, void *closure) { return _cairo_scaled_font_subsets_foreach_internal (font_subsets, font_subset_callback, closure, TRUE); } cairo_status_t _cairo_scaled_font_subsets_foreach_unscaled (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_subset_callback_func_t font_subset_callback, void *closure) { return _cairo_scaled_font_subsets_foreach_internal (font_subsets, font_subset_callback, closure, FALSE); } static cairo_bool_t _cairo_string_equal (const void *key_a, const void *key_b) { const cairo_string_entry_t *a = key_a; const cairo_string_entry_t *b = key_b; if (strcmp (a->string, b->string) == 0) return TRUE; else return FALSE; } static void _cairo_string_init_key (cairo_string_entry_t *key, char *s) { unsigned long sum = 0; unsigned int i; for (i = 0; i < strlen(s); i++) sum += s[i]; key->base.hash = sum; key->string = s; } static cairo_status_t create_string_entry (char *s, cairo_string_entry_t **entry) { *entry = malloc (sizeof (cairo_string_entry_t)); if (*entry == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_string_init_key (*entry, s); return CAIRO_STATUS_SUCCESS; } cairo_int_status_t _cairo_scaled_font_subset_create_glyph_names (cairo_scaled_font_subset_t *subset) { const cairo_scaled_font_backend_t *backend; unsigned int i; cairo_status_t status; cairo_hash_table_t *names; cairo_string_entry_t key, *entry; char buf[30]; if (subset->to_unicode == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_truetype_create_glyph_to_unicode_map (subset); if (status) { if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; backend = subset->scaled_font->backend; if (backend->map_glyphs_to_unicode == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; status = backend->map_glyphs_to_unicode (subset->scaled_font, subset); if (status) return status; } names = _cairo_hash_table_create (_cairo_string_equal); if (names == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); subset->glyph_names = calloc (subset->num_glyphs, sizeof (char *)); if (subset->glyph_names == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_HASH; } subset->glyph_names[0] = strdup (".notdef"); if (subset->glyph_names[0] == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_HASH; } status = create_string_entry (subset->glyph_names[0], &entry); if (status) goto CLEANUP_HASH; status = _cairo_hash_table_insert (names, &entry->base); if (status) { free (entry); goto CLEANUP_HASH; } for (i = 1; i < subset->num_glyphs; i++) { if (subset->to_unicode[i] <= 0xffff) { snprintf (buf, sizeof(buf), "uni%04X", (unsigned int)(subset->to_unicode[i])); _cairo_string_init_key (&key, buf); if (_cairo_hash_table_lookup (names, &key.base, (cairo_hash_entry_t **) &entry)) { snprintf (buf, sizeof(buf), "g%d", i); } } else { snprintf (buf, sizeof(buf), "g%d", i); } subset->glyph_names[i] = strdup (buf); if (subset->glyph_names[i] == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_HASH; } status = create_string_entry (subset->glyph_names[i], &entry); if (status) goto CLEANUP_HASH; status = _cairo_hash_table_insert (names, &entry->base); if (status) { free (entry); goto CLEANUP_HASH; } } CLEANUP_HASH: while (1) { entry = _cairo_hash_table_random_entry (names, NULL); if (entry == NULL) break; _cairo_hash_table_remove (names, (cairo_hash_entry_t *) entry); free (entry); } _cairo_hash_table_destroy (names); if (status == CAIRO_STATUS_SUCCESS) return CAIRO_STATUS_SUCCESS; if (subset->glyph_names != NULL) { for (i = 0; i < subset->num_glyphs; i++) { if (subset->glyph_names[i] != NULL) free (subset->glyph_names[i]); } free (subset->glyph_names); subset->glyph_names = NULL; } return status; } libgdiplus-2.11/cairo/src/cairo-path-fixed-private.h0000664000175000017500000000522012225470167017354 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_PATH_FIXED_PRIVATE_H #define CAIRO_PATH_FIXED_PRIVATE_H enum cairo_path_op { CAIRO_PATH_OP_MOVE_TO = 0, CAIRO_PATH_OP_LINE_TO = 1, CAIRO_PATH_OP_CURVE_TO = 2, CAIRO_PATH_OP_CLOSE_PATH = 3 }; /* we want to make sure a single byte is used for thie enum */ typedef char cairo_path_op_t; /* make _cairo_path_fixed fit a 512 bytes. about 50 items */ #define CAIRO_PATH_BUF_SIZE ((512 - 4 * sizeof (void*) - sizeof (cairo_path_buf_t)) \ / (2 * sizeof (cairo_point_t) + sizeof (cairo_path_op_t))) typedef struct _cairo_path_buf { struct _cairo_path_buf *next, *prev; int buf_size; int num_ops; int num_points; cairo_path_op_t *op; cairo_point_t *points; } cairo_path_buf_t; typedef struct _cairo_path_buf_fixed { cairo_path_buf_t base; cairo_path_op_t op[CAIRO_PATH_BUF_SIZE]; cairo_point_t points[2 * CAIRO_PATH_BUF_SIZE]; } cairo_path_buf_fixed_t; struct _cairo_path_fixed { cairo_point_t last_move_point; cairo_point_t current_point; unsigned int has_current_point : 1; unsigned int has_curve_to : 1; cairo_path_buf_t *buf_tail; cairo_path_buf_fixed_t buf_head; }; #endif /* CAIRO_PATH_FIXED_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-xlib-xrender.h0000664000175000017500000000460012225470167016257 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_XLIB_XRENDER_H #define CAIRO_XLIB_XRENDER_H #include #if CAIRO_HAS_XLIB_XRENDER_SURFACE #include #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_xlib_surface_create_with_xrender_format (Display *dpy, Drawable drawable, Screen *screen, XRenderPictFormat *format, int width, int height); cairo_public XRenderPictFormat * cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface); CAIRO_END_DECLS #else /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ # error Cairo was not compiled with support for the xlib XRender backend #endif /* CAIRO_HAS_XLIB_XRENDER_SURFACE */ #endif /* CAIRO_XLIB_XRENDER_H */ libgdiplus-2.11/cairo/src/cairo-clip.c0000664000175000017500000005451412225470167014607 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Kristian Høgsberg */ #include "cairoint.h" #include "cairo-clip-private.h" static cairo_clip_path_t * _cairo_clip_path_reference (cairo_clip_path_t *clip_path); static void _cairo_clip_path_destroy (cairo_clip_path_t *clip_path); void _cairo_clip_init (cairo_clip_t *clip, cairo_surface_t *target) { if (target) clip->mode = _cairo_surface_get_clip_mode (target); else clip->mode = CAIRO_CLIP_MODE_MASK; clip->all_clipped = FALSE; clip->surface = NULL; clip->surface_rect.x = 0; clip->surface_rect.y = 0; clip->surface_rect.width = 0; clip->surface_rect.height = 0; clip->serial = 0; _cairo_region_init (&clip->region); clip->has_region = FALSE; clip->path = NULL; } cairo_status_t _cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other) { clip->mode = other->mode; clip->all_clipped = other->all_clipped; clip->surface = cairo_surface_reference (other->surface); clip->surface_rect = other->surface_rect; clip->serial = other->serial; _cairo_region_init (&clip->region); if (other->has_region) { cairo_status_t status; status = _cairo_region_copy (&clip->region, &other->region); if (status) { _cairo_region_fini (&clip->region); cairo_surface_destroy (clip->surface); return status; } clip->has_region = TRUE; } else { clip->has_region = FALSE; } clip->path = _cairo_clip_path_reference (other->path); return CAIRO_STATUS_SUCCESS; } void _cairo_clip_reset (cairo_clip_t *clip) { clip->all_clipped = FALSE; /* destroy any existing clip-region artifacts */ cairo_surface_destroy (clip->surface); clip->surface = NULL; clip->serial = 0; if (clip->has_region) { /* _cairo_region_fini just releases the resources used but * doesn't bother with leaving the region in a valid state. * So _cairo_region_init has to be called afterwards. */ _cairo_region_fini (&clip->region); _cairo_region_init (&clip->region); clip->has_region = FALSE; } _cairo_clip_path_destroy (clip->path); clip->path = NULL; } static void _cairo_clip_set_all_clipped (cairo_clip_t *clip, cairo_surface_t *target) { _cairo_clip_reset (clip); clip->all_clipped = TRUE; clip->serial = _cairo_surface_allocate_clip_serial (target); } static cairo_status_t _cairo_clip_path_intersect_to_rectangle (cairo_clip_path_t *clip_path, cairo_rectangle_int_t *rectangle) { while (clip_path) { cairo_status_t status; cairo_traps_t traps; cairo_box_t extents; cairo_rectangle_int_t extents_rect; _cairo_traps_init (&traps); status = _cairo_path_fixed_fill_to_traps (&clip_path->path, clip_path->fill_rule, clip_path->tolerance, &traps); if (status) { _cairo_traps_fini (&traps); return status; } _cairo_traps_extents (&traps, &extents); _cairo_box_round_to_rectangle (&extents, &extents_rect); _cairo_rectangle_intersect (rectangle, &extents_rect); _cairo_traps_fini (&traps); clip_path = clip_path->prev; } return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_clip_intersect_to_rectangle (cairo_clip_t *clip, cairo_rectangle_int_t *rectangle) { if (!clip) return CAIRO_STATUS_SUCCESS; if (clip->all_clipped) { *rectangle = clip->surface_rect; return CAIRO_STATUS_SUCCESS; } if (clip->path) { cairo_status_t status; status = _cairo_clip_path_intersect_to_rectangle (clip->path, rectangle); if (status) return status; } if (clip->has_region) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_region_t intersection; _cairo_region_init_rect (&intersection, rectangle); status = _cairo_region_intersect (&intersection, &clip->region, &intersection); if (!status) _cairo_region_get_extents (&intersection, rectangle); _cairo_region_fini (&intersection); if (status) return status; } if (clip->surface) _cairo_rectangle_intersect (rectangle, &clip->surface_rect); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_clip_intersect_to_region (cairo_clip_t *clip, cairo_region_t *region) { cairo_status_t status; if (!clip) return CAIRO_STATUS_SUCCESS; if (clip->all_clipped) { cairo_region_t clip_rect; _cairo_region_init_rect (&clip_rect, &clip->surface_rect); status = _cairo_region_intersect (region, &clip_rect, region); _cairo_region_fini (&clip_rect); return status; } if (clip->path) { /* Intersect clip path into region. */ } if (clip->has_region) { status = _cairo_region_intersect (region, &clip->region, region); if (status) return status; } if (clip->surface) { cairo_region_t clip_rect; _cairo_region_init_rect (&clip_rect, &clip->surface_rect); status = _cairo_region_intersect (region, &clip_rect, region); _cairo_region_fini (&clip_rect); if (status) return status; } return CAIRO_STATUS_SUCCESS; } /* Combines the region of clip->surface given by extents in * device backend coordinates into the given temporary surface, * which has its origin at dst_x, dst_y in backend coordinates */ cairo_status_t _cairo_clip_combine_to_surface (cairo_clip_t *clip, cairo_operator_t op, cairo_surface_t *dst, int dst_x, int dst_y, const cairo_rectangle_int_t *extents) { cairo_pattern_union_t pattern; cairo_status_t status; if (clip->all_clipped) return CAIRO_STATUS_SUCCESS; _cairo_pattern_init_for_surface (&pattern.surface, clip->surface); status = _cairo_surface_composite (op, &pattern.base, NULL, dst, extents->x - clip->surface_rect.x, extents->y - clip->surface_rect.y, 0, 0, extents->x - dst_x, extents->y - dst_y, extents->width, extents->height); _cairo_pattern_fini (&pattern.base); return status; } static cairo_status_t _cairo_clip_intersect_path (cairo_clip_t *clip, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_clip_path_t *clip_path; cairo_status_t status; if (clip->mode != CAIRO_CLIP_MODE_PATH) return CAIRO_INT_STATUS_UNSUPPORTED; clip_path = malloc (sizeof (cairo_clip_path_t)); if (clip_path == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_path_fixed_init_copy (&clip_path->path, path); if (status) { free (clip_path); return status; } CAIRO_REFERENCE_COUNT_INIT (&clip_path->ref_count, 1); clip_path->fill_rule = fill_rule; clip_path->tolerance = tolerance; clip_path->antialias = antialias; clip_path->prev = clip->path; clip->path = clip_path; return CAIRO_STATUS_SUCCESS; } static cairo_clip_path_t * _cairo_clip_path_reference (cairo_clip_path_t *clip_path) { if (clip_path == NULL) return NULL; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&clip_path->ref_count)); _cairo_reference_count_inc (&clip_path->ref_count); return clip_path; } static void _cairo_clip_path_destroy (cairo_clip_path_t *clip_path) { if (clip_path == NULL) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&clip_path->ref_count)); if (! _cairo_reference_count_dec_and_test (&clip_path->ref_count)) return; _cairo_path_fixed_fini (&clip_path->path); _cairo_clip_path_destroy (clip_path->prev); free (clip_path); } static cairo_int_status_t _cairo_clip_intersect_region (cairo_clip_t *clip, cairo_traps_t *traps, cairo_surface_t *target) { cairo_region_t region; cairo_int_status_t status; if (clip->all_clipped) return CAIRO_STATUS_SUCCESS; if (clip->mode != CAIRO_CLIP_MODE_REGION) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_traps_extract_region (traps, ®ion); if (status) return status; status = CAIRO_STATUS_SUCCESS; if (!clip->has_region) { status = _cairo_region_copy (&clip->region, ®ion); if (status == CAIRO_STATUS_SUCCESS) clip->has_region = TRUE; } else { cairo_region_t intersection; _cairo_region_init (&intersection); status = _cairo_region_intersect (&intersection, &clip->region, ®ion); if (status == CAIRO_STATUS_SUCCESS) status = _cairo_region_copy (&clip->region, &intersection); _cairo_region_fini (&intersection); } clip->serial = _cairo_surface_allocate_clip_serial (target); _cairo_region_fini (®ion); if (! _cairo_region_not_empty (&clip->region)) _cairo_clip_set_all_clipped (clip, target); return status; } static cairo_status_t _cairo_clip_intersect_mask (cairo_clip_t *clip, cairo_traps_t *traps, cairo_antialias_t antialias, cairo_surface_t *target) { cairo_pattern_union_t pattern; cairo_box_t extents; cairo_rectangle_int_t surface_rect, target_rect; cairo_surface_t *surface; cairo_status_t status; if (clip->all_clipped) return CAIRO_STATUS_SUCCESS; /* Represent the clip as a mask surface. We create a new surface * the size of the intersection of the old mask surface and the * extents of the new clip path. */ _cairo_traps_extents (traps, &extents); _cairo_box_round_to_rectangle (&extents, &surface_rect); if (clip->surface != NULL) _cairo_rectangle_intersect (&surface_rect, &clip->surface_rect); /* Intersect with the target surface rectangle so we don't use * more memory and time than we need to. */ status = _cairo_surface_get_extents (target, &target_rect); if (!status) _cairo_rectangle_intersect (&surface_rect, &target_rect); if (surface_rect.width == 0 || surface_rect.height == 0) { surface = NULL; status = CAIRO_STATUS_SUCCESS; if (clip->surface != NULL) cairo_surface_destroy (clip->surface); goto DONE; } _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); /* The clipping operation should ideally be something like the following to * avoid having to do as many passes over the data if (clip->surface != NULL) { _cairo_pattern_init_for_surface (&pattern.surface, clip->surface); } else { _cairo_pattern_init_solid (&pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); } status = _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_IN, &pattern.base, surface, antialias, 0, 0, 0, 0, surface_rect.width, surface_rect.height, traps->traps, traps->num_traps); However this operation is not accelerated by pixman I believe the best possible operation would probably an unbounded SRC operator. Using SRC we could potentially avoid having to initialize the surface which would be ideal from an efficiency point of view. However, _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_SOURCE) is bounded by the mask. */ surface = _cairo_surface_create_similar_solid (target, CAIRO_CONTENT_ALPHA, surface_rect.width, surface_rect.height, CAIRO_COLOR_TRANSPARENT, &pattern.base); if (surface->status) { _cairo_pattern_fini (&pattern.base); return surface->status; } /* Render the new clipping path into the new mask surface. */ _cairo_traps_translate (traps, -surface_rect.x, -surface_rect.y); status = _cairo_surface_composite_trapezoids (CAIRO_OPERATOR_ADD, &pattern.base, surface, antialias, 0, 0, 0, 0, surface_rect.width, surface_rect.height, traps->traps, traps->num_traps); _cairo_pattern_fini (&pattern.base); if (status) { cairo_surface_destroy (surface); return status; } /* If there was a clip surface already, combine it with the new * mask surface using the IN operator, so we get the intersection * of the old and new clipping paths. */ if (clip->surface != NULL) { _cairo_pattern_init_for_surface (&pattern.surface, clip->surface); status = _cairo_surface_composite (CAIRO_OPERATOR_IN, &pattern.base, NULL, surface, surface_rect.x - clip->surface_rect.x, surface_rect.y - clip->surface_rect.y, 0, 0, 0, 0, surface_rect.width, surface_rect.height); _cairo_pattern_fini (&pattern.base); if (status) { cairo_surface_destroy (surface); return status; } cairo_surface_destroy (clip->surface); } DONE: clip->surface = surface; clip->surface_rect = surface_rect; clip->serial = _cairo_surface_allocate_clip_serial (target); if (surface_rect.width == 0 || surface_rect.height == 0) _cairo_clip_set_all_clipped (clip, target); return status; } cairo_status_t _cairo_clip_clip (cairo_clip_t *clip, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias, cairo_surface_t *target) { cairo_status_t status; cairo_traps_t traps; if (clip->all_clipped) return CAIRO_STATUS_SUCCESS; /* catch the empty clip path */ if (! path->has_current_point) { _cairo_clip_set_all_clipped (clip, target); return CAIRO_STATUS_SUCCESS; } status = _cairo_clip_intersect_path (clip, path, fill_rule, tolerance, antialias); if (status == CAIRO_STATUS_SUCCESS) clip->serial = _cairo_surface_allocate_clip_serial (target); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return status; _cairo_traps_init (&traps); status = _cairo_path_fixed_fill_to_traps (path, fill_rule, tolerance, &traps); if (status) goto bail; status = _cairo_clip_intersect_region (clip, &traps, target); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto bail; status = _cairo_clip_intersect_mask (clip, &traps, antialias, target); bail: _cairo_traps_fini (&traps); return status; } void _cairo_clip_translate (cairo_clip_t *clip, cairo_fixed_t tx, cairo_fixed_t ty) { if (clip->all_clipped) return; if (clip->has_region) { _cairo_region_translate (&clip->region, _cairo_fixed_integer_part (tx), _cairo_fixed_integer_part (ty)); } if (clip->surface) { clip->surface_rect.x += _cairo_fixed_integer_part (tx); clip->surface_rect.y += _cairo_fixed_integer_part (ty); } if (clip->path) { cairo_clip_path_t *clip_path = clip->path; cairo_matrix_t matrix; cairo_matrix_init_translate (&matrix, _cairo_fixed_to_double (tx), _cairo_fixed_to_double (ty)); while (clip_path) { _cairo_path_fixed_device_transform (&clip_path->path, &matrix); clip_path = clip_path->prev; } } } static cairo_status_t _cairo_clip_path_reapply_clip_path (cairo_clip_t *clip, cairo_clip_path_t *clip_path) { cairo_status_t status; if (clip_path->prev) { status = _cairo_clip_path_reapply_clip_path (clip, clip_path->prev); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) return status; } return _cairo_clip_intersect_path (clip, &clip_path->path, clip_path->fill_rule, clip_path->tolerance, clip_path->antialias); } cairo_status_t _cairo_clip_init_deep_copy (cairo_clip_t *clip, cairo_clip_t *other, cairo_surface_t *target) { cairo_status_t status; _cairo_clip_init (clip, target); if (other->mode != clip->mode) { /* We should reapply the original clip path in this case, and let * whatever the right handling is happen */ } else { if (other->has_region) { status = _cairo_region_copy (&clip->region, &other->region); if (status) goto BAIL; clip->has_region = TRUE; } if (other->surface) { status = _cairo_surface_clone_similar (target, other->surface, other->surface_rect.x, other->surface_rect.y, other->surface_rect.width, other->surface_rect.height, &clip->surface); if (status) goto BAIL; clip->surface_rect = other->surface_rect; } if (other->path) { status = _cairo_clip_path_reapply_clip_path (clip, other->path); if (status && status != CAIRO_INT_STATUS_UNSUPPORTED) goto BAIL; } } return CAIRO_STATUS_SUCCESS; BAIL: if (clip->has_region) _cairo_region_fini (&clip->region); if (clip->surface) cairo_surface_destroy (clip->surface); return status; } const cairo_rectangle_list_t _cairo_rectangles_nil = { CAIRO_STATUS_NO_MEMORY, NULL, 0 }; static const cairo_rectangle_list_t _cairo_rectangles_not_representable = { CAIRO_STATUS_CLIP_NOT_REPRESENTABLE, NULL, 0 }; static cairo_bool_t _cairo_clip_int_rect_to_user (cairo_gstate_t *gstate, cairo_rectangle_int_t *clip_rect, cairo_rectangle_t *user_rect) { cairo_bool_t is_tight; double x1 = clip_rect->x; double y1 = clip_rect->y; double x2 = clip_rect->x + clip_rect->width; double y2 = clip_rect->y + clip_rect->height; _cairo_gstate_backend_to_user_rectangle (gstate, &x1, &y1, &x2, &y2, &is_tight); user_rect->x = x1; user_rect->y = y1; user_rect->width = x2 - x1; user_rect->height = y2 - y1; return is_tight; } cairo_rectangle_list_t * _cairo_clip_copy_rectangle_list (cairo_clip_t *clip, cairo_gstate_t *gstate) { cairo_rectangle_list_t *list; cairo_rectangle_t *rectangles = NULL; int n_boxes = 0; if (clip->all_clipped) goto DONE; if (clip->path || clip->surface) { _cairo_error_throw (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); return (cairo_rectangle_list_t*) &_cairo_rectangles_not_representable; } if (clip->has_region) { cairo_box_int_t *boxes; int i; if (_cairo_region_get_boxes (&clip->region, &n_boxes, &boxes)) return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; if (n_boxes) { rectangles = _cairo_malloc_ab (n_boxes, sizeof (cairo_rectangle_t)); if (rectangles == NULL) { _cairo_region_boxes_fini (&clip->region, boxes); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; } for (i = 0; i < n_boxes; ++i) { cairo_rectangle_int_t clip_rect = { boxes[i].p1.x, boxes[i].p1.y, boxes[i].p2.x - boxes[i].p1.x, boxes[i].p2.y - boxes[i].p1.y }; if (!_cairo_clip_int_rect_to_user(gstate, &clip_rect, &rectangles[i])) { _cairo_error_throw (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); _cairo_region_boxes_fini (&clip->region, boxes); free (rectangles); return (cairo_rectangle_list_t*) &_cairo_rectangles_not_representable; } } } _cairo_region_boxes_fini (&clip->region, boxes); } else { cairo_rectangle_int_t extents; n_boxes = 1; rectangles = malloc(sizeof (cairo_rectangle_t)); if (rectangles == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; } if (_cairo_surface_get_extents (_cairo_gstate_get_target (gstate), &extents) || !_cairo_clip_int_rect_to_user(gstate, &extents, rectangles)) { _cairo_error_throw (CAIRO_STATUS_CLIP_NOT_REPRESENTABLE); free (rectangles); return (cairo_rectangle_list_t*) &_cairo_rectangles_not_representable; } } DONE: list = malloc (sizeof (cairo_rectangle_list_t)); if (list == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); free (rectangles); return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; } list->status = CAIRO_STATUS_SUCCESS; list->rectangles = rectangles; list->num_rectangles = n_boxes; return list; } /** * cairo_rectangle_list_destroy: * @rectangle_list: a rectangle list, as obtained from cairo_copy_clip_rectangles() * * Unconditionally frees @rectangle_list and all associated * references. After this call, the @rectangle_list pointer must not * be dereferenced. * * Since: 1.4 **/ void cairo_rectangle_list_destroy (cairo_rectangle_list_t *rectangle_list) { if (rectangle_list == NULL || rectangle_list == &_cairo_rectangles_nil || rectangle_list == &_cairo_rectangles_not_representable) return; free (rectangle_list->rectangles); free (rectangle_list); } libgdiplus-2.11/cairo/src/cairo-pdf-operators-private.h0000664000175000017500000001016512225470167020114 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc * Copyright © 2006 Red Hat, Inc * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Kristian Høgsberg * Carl Worth * Adrian Johnson */ #ifndef CAIRO_PDF_OPERATORS_H #define CAIRO_PDF_OPERATORS_H #include "cairo-compiler-private.h" #include "cairo-types-private.h" typedef cairo_status_t (*cairo_pdf_operators_use_font_subset_t) (unsigned int font_id, unsigned int subset_id, void *closure); typedef struct _cairo_pdf_operators { cairo_output_stream_t *stream; cairo_matrix_t cairo_to_pdf; cairo_scaled_font_subsets_t *font_subsets; cairo_pdf_operators_use_font_subset_t use_font_subset; void *use_font_subset_closure; } cairo_pdf_operators_t; cairo_private void _cairo_pdf_operators_init (cairo_pdf_operators_t *pdf_operators, cairo_output_stream_t *stream, cairo_matrix_t *cairo_to_pdf, cairo_scaled_font_subsets_t *font_subsets); cairo_private void _cairo_pdf_operators_fini (cairo_pdf_operators_t *pdf_operators); cairo_private void _cairo_pdf_operators_set_font_subsets_callback (cairo_pdf_operators_t *pdf_operators, cairo_pdf_operators_use_font_subset_t use_font_subset, void *closure); cairo_private void _cairo_pdf_operators_set_stream (cairo_pdf_operators_t *pdf_operators, cairo_output_stream_t *stream); cairo_private void _cairo_pdf_operators_set_cairo_to_pdf_matrix (cairo_pdf_operators_t *pdf_operators, cairo_matrix_t *cairo_to_pdf); cairo_private cairo_int_status_t _cairo_pdf_operators_clip (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule); cairo_private cairo_int_status_t _cairo_pdf_operators_stroke (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse); cairo_private cairo_int_status_t _cairo_pdf_operators_fill (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule); cairo_private cairo_int_status_t _cairo_pdf_operators_fill_stroke (cairo_pdf_operators_t *pdf_operators, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse); cairo_private cairo_int_status_t _cairo_pdf_operators_show_glyphs (cairo_pdf_operators_t *pdf_operators, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); #endif /* CAIRO_PDF_OPERATORS_H */ libgdiplus-2.11/cairo/src/cairo-gstate.c0000664000175000017500000013143412225470167015144 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #define _GNU_SOURCE #include "cairoint.h" #include "cairo-clip-private.h" #include "cairo-gstate-private.h" #if _XOPEN_SOURCE >= 600 || defined (_ISOC99_SOURCE) #define ISFINITE(x) isfinite (x) #else #define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */ #endif static cairo_status_t _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other); static cairo_status_t _cairo_gstate_ensure_font_face (cairo_gstate_t *gstate); static cairo_status_t _cairo_gstate_ensure_scaled_font (cairo_gstate_t *gstate); static void _cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate); static void _cairo_gstate_transform_glyphs_to_backend (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_glyph_t *transformed_glyphs); cairo_status_t _cairo_gstate_init (cairo_gstate_t *gstate, cairo_surface_t *target) { cairo_status_t status; gstate->next = NULL; gstate->op = CAIRO_GSTATE_OPERATOR_DEFAULT; gstate->tolerance = CAIRO_GSTATE_TOLERANCE_DEFAULT; gstate->antialias = CAIRO_ANTIALIAS_DEFAULT; _cairo_stroke_style_init (&gstate->stroke_style); gstate->fill_rule = CAIRO_GSTATE_FILL_RULE_DEFAULT; gstate->font_face = NULL; gstate->scaled_font = NULL; cairo_matrix_init_scale (&gstate->font_matrix, CAIRO_GSTATE_DEFAULT_FONT_SIZE, CAIRO_GSTATE_DEFAULT_FONT_SIZE); _cairo_font_options_init_default (&gstate->font_options); _cairo_clip_init (&gstate->clip, target); gstate->target = cairo_surface_reference (target); gstate->parent_target = NULL; gstate->original_target = cairo_surface_reference (target); _cairo_gstate_identity_matrix (gstate); gstate->source_ctm_inverse = gstate->ctm_inverse; gstate->source = _cairo_pattern_create_solid (CAIRO_COLOR_BLACK, CAIRO_CONTENT_COLOR); /* Now that the gstate is fully initialized and ready for the eventual * _cairo_gstate_fini(), we can check for errors (and not worry about * the resource deallocation). */ if (target == NULL) return _cairo_error (CAIRO_STATUS_NULL_POINTER); status = target->status; if (status) return status; status = gstate->source->status; if (status) return status; return CAIRO_STATUS_SUCCESS; } /** * _cairo_gstate_init_copy: * * Initialize @gstate by performing a deep copy of state fields from * @other. Note that gstate->next is not copied but is set to %NULL by * this function. **/ static cairo_status_t _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other) { cairo_status_t status; gstate->op = other->op; gstate->tolerance = other->tolerance; gstate->antialias = other->antialias; status = _cairo_stroke_style_init_copy (&gstate->stroke_style, &other->stroke_style); if (status) return status; gstate->fill_rule = other->fill_rule; gstate->font_face = cairo_font_face_reference (other->font_face); gstate->scaled_font = cairo_scaled_font_reference (other->scaled_font); gstate->font_matrix = other->font_matrix; _cairo_font_options_init_copy (&gstate->font_options , &other->font_options); status = _cairo_clip_init_copy (&gstate->clip, &other->clip); if (status) { _cairo_stroke_style_fini (&gstate->stroke_style); cairo_font_face_destroy (gstate->font_face); cairo_scaled_font_destroy (gstate->scaled_font); return status; } gstate->target = cairo_surface_reference (other->target); /* parent_target is always set to NULL; it's only ever set by redirect_target */ gstate->parent_target = NULL; gstate->original_target = cairo_surface_reference (other->original_target); gstate->ctm = other->ctm; gstate->ctm_inverse = other->ctm_inverse; gstate->source_ctm_inverse = other->source_ctm_inverse; gstate->source = cairo_pattern_reference (other->source); gstate->next = NULL; return CAIRO_STATUS_SUCCESS; } void _cairo_gstate_fini (cairo_gstate_t *gstate) { _cairo_stroke_style_fini (&gstate->stroke_style); cairo_font_face_destroy (gstate->font_face); gstate->font_face = NULL; cairo_scaled_font_destroy (gstate->scaled_font); gstate->scaled_font = NULL; _cairo_clip_reset (&gstate->clip); cairo_surface_destroy (gstate->target); gstate->target = NULL; cairo_surface_destroy (gstate->parent_target); gstate->parent_target = NULL; cairo_surface_destroy (gstate->original_target); gstate->original_target = NULL; cairo_pattern_destroy (gstate->source); gstate->source = NULL; } static void _cairo_gstate_destroy (cairo_gstate_t *gstate) { _cairo_gstate_fini (gstate); free (gstate); } /** * _cairo_gstate_clone: * @other: a #cairo_gstate_t to be copied, not %NULL. * * Create a new #cairo_gstate_t setting all graphics state parameters * to the same values as contained in @other. gstate->next will be set * to %NULL and may be used by the caller to chain #cairo_gstate_t * objects together. * * Return value: a new #cairo_gstate_t or %NULL if there is insufficient * memory. **/ static cairo_status_t _cairo_gstate_clone (cairo_gstate_t *other, cairo_gstate_t **out) { cairo_status_t status; cairo_gstate_t *gstate; assert (other != NULL); gstate = malloc (sizeof (cairo_gstate_t)); if (gstate == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_gstate_init_copy (gstate, other); if (status) { free (gstate); return status; } *out = gstate; return CAIRO_STATUS_SUCCESS; } /** * _cairo_gstate_save: * @gstate: input/output gstate pointer * * Makes a copy of the current state of @gstate and saves it * to @gstate->next, then put the address of the newly allcated * copy into @gstate. _cairo_gstate_restore() reverses this. **/ cairo_status_t _cairo_gstate_save (cairo_gstate_t **gstate) { cairo_gstate_t *top = NULL; cairo_status_t status; status = _cairo_gstate_clone (*gstate, &top); if (status) return status; top->next = *gstate; *gstate = top; return CAIRO_STATUS_SUCCESS; } /** * _cairo_gstate_restore: * @gstate: input/output gstate pointer * * Reverses the effects of one _cairo_gstate_save() call. **/ cairo_status_t _cairo_gstate_restore (cairo_gstate_t **gstate) { cairo_gstate_t *top; top = *gstate; if (top->next == NULL) return _cairo_error (CAIRO_STATUS_INVALID_RESTORE); *gstate = top->next; _cairo_gstate_destroy (top); return CAIRO_STATUS_SUCCESS; } /** * _cairo_gstate_redirect_target: * @gstate: a #cairo_gstate_t * @child: the new child target * * Redirect @gstate rendering to a "child" target. The original * "parent" target with which the gstate was created will not be * affected. See _cairo_gstate_get_target(). * * Unless the redirected target has the same device offsets as the * original #cairo_t target, the clip will be INVALID after this call, * and the caller should either recreate or reset the clip. **/ cairo_status_t _cairo_gstate_redirect_target (cairo_gstate_t *gstate, cairo_surface_t *child) { cairo_status_t status; /* If this gstate is already redirected, this is an error; we need a * new gstate to be able to redirect */ assert (gstate->parent_target == NULL); /* Set up our new parent_target based on our current target; * gstate->parent_target will take the ref that is held by gstate->target */ cairo_surface_destroy (gstate->parent_target); gstate->parent_target = gstate->target; /* Now set up our new target; we overwrite gstate->target directly, * since its ref is now owned by gstate->parent_target */ gstate->target = cairo_surface_reference (child); _cairo_clip_reset (&gstate->clip); status = _cairo_clip_init_deep_copy (&gstate->clip, &gstate->next->clip, child); if (status) return status; /* The clip is in surface backend coordinates for the previous target; * translate it into the child's backend coordinates. */ _cairo_clip_translate (&gstate->clip, _cairo_fixed_from_double (child->device_transform.x0 - gstate->parent_target->device_transform.x0), _cairo_fixed_from_double (child->device_transform.y0 - gstate->parent_target->device_transform.y0)); return CAIRO_STATUS_SUCCESS; } /** * _cairo_gstate_is_redirected * @gstate: a #cairo_gstate_t * * Return value: %TRUE if the gstate is redirected to a target * different than the original, %FALSE otherwise. **/ cairo_bool_t _cairo_gstate_is_redirected (cairo_gstate_t *gstate) { return (gstate->target != gstate->original_target); } /** * _cairo_gstate_get_target: * @gstate: a #cairo_gstate_t * * Return the current drawing target; if drawing is not redirected, * this will be the same as _cairo_gstate_get_original_target(). * * Return value: the current target surface **/ cairo_surface_t * _cairo_gstate_get_target (cairo_gstate_t *gstate) { return gstate->target; } /** * _cairo_gstate_get_parent_target: * @gstate: a #cairo_gstate_t * * Return the parent surface of the current drawing target surface; * if this particular gstate isn't a redirect gstate, this will return %NULL. **/ cairo_surface_t * _cairo_gstate_get_parent_target (cairo_gstate_t *gstate) { return gstate->parent_target; } /** * _cairo_gstate_get_original_target: * @gstate: a #cairo_gstate_t * * Return the original target with which @gstate was created. This * function always returns the original target independent of any * child target that may have been set with * _cairo_gstate_redirect_target. * * Return value: the original target surface **/ cairo_surface_t * _cairo_gstate_get_original_target (cairo_gstate_t *gstate) { return gstate->original_target; } /** * _cairo_gstate_get_clip: * @gstate: a #cairo_gstate_t * * Return value: a pointer to the gstate's #cairo_clip_t structure. */ cairo_clip_t * _cairo_gstate_get_clip (cairo_gstate_t *gstate) { return &gstate->clip; } cairo_status_t _cairo_gstate_set_source (cairo_gstate_t *gstate, cairo_pattern_t *source) { if (source->status) return source->status; source = cairo_pattern_reference (source); cairo_pattern_destroy (gstate->source); gstate->source = source; gstate->source_ctm_inverse = gstate->ctm_inverse; return CAIRO_STATUS_SUCCESS; } cairo_pattern_t * _cairo_gstate_get_source (cairo_gstate_t *gstate) { return gstate->source; } cairo_status_t _cairo_gstate_set_operator (cairo_gstate_t *gstate, cairo_operator_t op) { gstate->op = op; return CAIRO_STATUS_SUCCESS; } cairo_operator_t _cairo_gstate_get_operator (cairo_gstate_t *gstate) { return gstate->op; } cairo_status_t _cairo_gstate_set_tolerance (cairo_gstate_t *gstate, double tolerance) { gstate->tolerance = tolerance; return CAIRO_STATUS_SUCCESS; } double _cairo_gstate_get_tolerance (cairo_gstate_t *gstate) { return gstate->tolerance; } cairo_status_t _cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule) { gstate->fill_rule = fill_rule; return CAIRO_STATUS_SUCCESS; } cairo_fill_rule_t _cairo_gstate_get_fill_rule (cairo_gstate_t *gstate) { return gstate->fill_rule; } cairo_status_t _cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width) { gstate->stroke_style.line_width = width; return CAIRO_STATUS_SUCCESS; } double _cairo_gstate_get_line_width (cairo_gstate_t *gstate) { return gstate->stroke_style.line_width; } cairo_status_t _cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap) { gstate->stroke_style.line_cap = line_cap; return CAIRO_STATUS_SUCCESS; } cairo_line_cap_t _cairo_gstate_get_line_cap (cairo_gstate_t *gstate) { return gstate->stroke_style.line_cap; } cairo_status_t _cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join) { gstate->stroke_style.line_join = line_join; return CAIRO_STATUS_SUCCESS; } cairo_line_join_t _cairo_gstate_get_line_join (cairo_gstate_t *gstate) { return gstate->stroke_style.line_join; } cairo_status_t _cairo_gstate_set_dash (cairo_gstate_t *gstate, const double *dash, int num_dashes, double offset) { unsigned int i; double dash_total; if (gstate->stroke_style.dash) free (gstate->stroke_style.dash); gstate->stroke_style.num_dashes = num_dashes; if (gstate->stroke_style.num_dashes == 0) { gstate->stroke_style.dash = NULL; gstate->stroke_style.dash_offset = 0.0; return CAIRO_STATUS_SUCCESS; } gstate->stroke_style.dash = _cairo_malloc_ab (gstate->stroke_style.num_dashes, sizeof (double)); if (gstate->stroke_style.dash == NULL) { gstate->stroke_style.num_dashes = 0; return _cairo_error (CAIRO_STATUS_NO_MEMORY); } memcpy (gstate->stroke_style.dash, dash, gstate->stroke_style.num_dashes * sizeof (double)); dash_total = 0.0; for (i = 0; i < gstate->stroke_style.num_dashes; i++) { if (gstate->stroke_style.dash[i] < 0) return _cairo_error (CAIRO_STATUS_INVALID_DASH); dash_total += gstate->stroke_style.dash[i]; } if (dash_total == 0.0) return _cairo_error (CAIRO_STATUS_INVALID_DASH); /* A single dash value indicate symmetric repeating, so the total * is twice as long. */ if (gstate->stroke_style.num_dashes == 1) dash_total *= 2; /* The dashing code doesn't like a negative offset, so we compute * the equivalent positive offset. */ if (offset < 0) offset += ceil (-offset / dash_total + 0.5) * dash_total; gstate->stroke_style.dash_offset = offset; return CAIRO_STATUS_SUCCESS; } void _cairo_gstate_get_dash (cairo_gstate_t *gstate, double *dashes, int *num_dashes, double *offset) { if (dashes) memcpy (dashes, gstate->stroke_style.dash, sizeof (double) * gstate->stroke_style.num_dashes); if (num_dashes) *num_dashes = gstate->stroke_style.num_dashes; if (offset) *offset = gstate->stroke_style.dash_offset; } cairo_status_t _cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit) { gstate->stroke_style.miter_limit = limit; return CAIRO_STATUS_SUCCESS; } double _cairo_gstate_get_miter_limit (cairo_gstate_t *gstate) { return gstate->stroke_style.miter_limit; } void _cairo_gstate_get_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix) { *matrix = gstate->ctm; } cairo_status_t _cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty) { cairo_matrix_t tmp; if (! ISFINITE (tx) || ! ISFINITE (ty)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_init_translate (&tmp, tx, ty); cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); /* paranoid check against gradual numerical instability */ if (! _cairo_matrix_is_invertible (&gstate->ctm)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); cairo_matrix_init_translate (&tmp, -tx, -ty); cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_scale (cairo_gstate_t *gstate, double sx, double sy) { cairo_matrix_t tmp; if (sx * sy == 0.) /* either sx or sy is 0, or det == 0 due to underflow */ return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); if (! ISFINITE (sx) || ! ISFINITE (sy)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_init_scale (&tmp, sx, sy); cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); /* paranoid check against gradual numerical instability */ if (! _cairo_matrix_is_invertible (&gstate->ctm)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); cairo_matrix_init_scale (&tmp, 1/sx, 1/sy); cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_rotate (cairo_gstate_t *gstate, double angle) { cairo_matrix_t tmp; if (angle == 0.) return CAIRO_STATUS_SUCCESS; if (! ISFINITE (angle)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_init_rotate (&tmp, angle); cairo_matrix_multiply (&gstate->ctm, &tmp, &gstate->ctm); /* paranoid check against gradual numerical instability */ if (! _cairo_matrix_is_invertible (&gstate->ctm)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); cairo_matrix_init_rotate (&tmp, -angle); cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_transform (cairo_gstate_t *gstate, const cairo_matrix_t *matrix) { cairo_matrix_t tmp; cairo_status_t status; tmp = *matrix; status = cairo_matrix_invert (&tmp); if (status) return status; _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_multiply (&gstate->ctm, matrix, &gstate->ctm); cairo_matrix_multiply (&gstate->ctm_inverse, &gstate->ctm_inverse, &tmp); /* paranoid check against gradual numerical instability */ if (! _cairo_matrix_is_invertible (&gstate->ctm)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_set_matrix (cairo_gstate_t *gstate, const cairo_matrix_t *matrix) { cairo_status_t status; if (! _cairo_matrix_is_invertible (matrix)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_gstate_unset_scaled_font (gstate); gstate->ctm = *matrix; gstate->ctm_inverse = *matrix; status = cairo_matrix_invert (&gstate->ctm_inverse); assert (status == CAIRO_STATUS_SUCCESS); return CAIRO_STATUS_SUCCESS; } void _cairo_gstate_identity_matrix (cairo_gstate_t *gstate) { _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_init_identity (&gstate->ctm); cairo_matrix_init_identity (&gstate->ctm_inverse); } void _cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y) { cairo_matrix_transform_point (&gstate->ctm, x, y); } void _cairo_gstate_user_to_device_distance (cairo_gstate_t *gstate, double *dx, double *dy) { cairo_matrix_transform_distance (&gstate->ctm, dx, dy); } void _cairo_gstate_device_to_user (cairo_gstate_t *gstate, double *x, double *y) { cairo_matrix_transform_point (&gstate->ctm_inverse, x, y); } void _cairo_gstate_device_to_user_distance (cairo_gstate_t *gstate, double *dx, double *dy) { cairo_matrix_transform_distance (&gstate->ctm_inverse, dx, dy); } void _cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y) { cairo_matrix_transform_point (&gstate->ctm, x, y); cairo_matrix_transform_point (&gstate->target->device_transform, x, y); } void _cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y) { cairo_matrix_transform_point (&gstate->target->device_transform_inverse, x, y); cairo_matrix_transform_point (&gstate->ctm_inverse, x, y); } void _cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2, cairo_bool_t *is_tight) { cairo_matrix_t matrix_inverse; cairo_matrix_multiply (&matrix_inverse, &gstate->target->device_transform_inverse, &gstate->ctm_inverse); _cairo_matrix_transform_bounding_box (&matrix_inverse, x1, y1, x2, y2, is_tight); } /* XXX: NYI cairo_status_t _cairo_gstate_stroke_to_path (cairo_gstate_t *gstate) { cairo_status_t status; _cairo_pen_init (&gstate); return CAIRO_STATUS_SUCCESS; } */ cairo_status_t _cairo_gstate_path_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; status = _cairo_path_fixed_bounds (path, x1, y1, x2, y2, gstate->tolerance); if (status) return status; _cairo_gstate_backend_to_user_rectangle (gstate, x1, y1, x2, y2, NULL); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_gstate_copy_transformed_pattern (cairo_gstate_t *gstate, cairo_pattern_t *pattern, cairo_pattern_t *original, cairo_matrix_t *ctm_inverse) { cairo_surface_pattern_t *surface_pattern; cairo_surface_t *surface; cairo_status_t status; status = _cairo_pattern_init_copy (pattern, original); if (status) return status; _cairo_pattern_transform (pattern, ctm_inverse); if (cairo_pattern_get_type (original) == CAIRO_PATTERN_TYPE_SURFACE) { surface_pattern = (cairo_surface_pattern_t *) original; surface = surface_pattern->surface; if (_cairo_surface_has_device_transform (surface)) _cairo_pattern_transform (pattern, &surface->device_transform); } return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_gstate_copy_transformed_source (cairo_gstate_t *gstate, cairo_pattern_t *pattern) { return _cairo_gstate_copy_transformed_pattern (gstate, pattern, gstate->source, &gstate->source_ctm_inverse); } static cairo_status_t _cairo_gstate_copy_transformed_mask (cairo_gstate_t *gstate, cairo_pattern_t *pattern, cairo_pattern_t *mask) { return _cairo_gstate_copy_transformed_pattern (gstate, pattern, mask, &gstate->ctm_inverse); } cairo_status_t _cairo_gstate_paint (cairo_gstate_t *gstate) { cairo_status_t status; cairo_pattern_union_t pattern; if (gstate->source->status) return gstate->source->status; status = _cairo_surface_set_clip (gstate->target, &gstate->clip); if (status) return status; status = _cairo_gstate_copy_transformed_source (gstate, &pattern.base); if (status) return status; status = _cairo_surface_paint (gstate->target, gstate->op, &pattern.base); _cairo_pattern_fini (&pattern.base); return status; } cairo_status_t _cairo_gstate_mask (cairo_gstate_t *gstate, cairo_pattern_t *mask) { cairo_status_t status; cairo_pattern_union_t source_pattern, mask_pattern; if (mask->status) return mask->status; if (gstate->source->status) return gstate->source->status; status = _cairo_surface_set_clip (gstate->target, &gstate->clip); if (status) return status; status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); if (status) return status; status = _cairo_gstate_copy_transformed_mask (gstate, &mask_pattern.base, mask); if (status) goto CLEANUP_SOURCE; status = _cairo_surface_mask (gstate->target, gstate->op, &source_pattern.base, &mask_pattern.base); _cairo_pattern_fini (&mask_pattern.base); CLEANUP_SOURCE: _cairo_pattern_fini (&source_pattern.base); return status; } cairo_status_t _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path) { cairo_status_t status; cairo_pattern_union_t source_pattern; if (gstate->source->status) return gstate->source->status; if (gstate->stroke_style.line_width <= 0.0) return CAIRO_STATUS_SUCCESS; status = _cairo_surface_set_clip (gstate->target, &gstate->clip); if (status) return status; status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); if (status) return status; status = _cairo_surface_stroke (gstate->target, gstate->op, &source_pattern.base, path, &gstate->stroke_style, &gstate->ctm, &gstate->ctm_inverse, gstate->tolerance, gstate->antialias); _cairo_pattern_fini (&source_pattern.base); return status; } cairo_status_t _cairo_gstate_in_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double x, double y, cairo_bool_t *inside_ret) { cairo_status_t status; cairo_traps_t traps; if (gstate->stroke_style.line_width <= 0.0) { *inside_ret = FALSE; return CAIRO_STATUS_SUCCESS; } _cairo_gstate_user_to_backend (gstate, &x, &y); _cairo_traps_init (&traps); status = _cairo_path_fixed_stroke_to_traps (path, &gstate->stroke_style, &gstate->ctm, &gstate->ctm_inverse, gstate->tolerance, &traps); if (status) goto BAIL; *inside_ret = _cairo_traps_contain (&traps, x, y); BAIL: _cairo_traps_fini (&traps); return status; } cairo_status_t _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path) { cairo_status_t status; cairo_pattern_union_t pattern; if (gstate->source->status) return gstate->source->status; status = _cairo_surface_set_clip (gstate->target, &gstate->clip); if (status) return status; status = _cairo_gstate_copy_transformed_source (gstate, &pattern.base); if (status) return status; status = _cairo_surface_fill (gstate->target, gstate->op, &pattern.base, path, gstate->fill_rule, gstate->tolerance, gstate->antialias); _cairo_pattern_fini (&pattern.base); return status; } cairo_status_t _cairo_gstate_in_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double x, double y, cairo_bool_t *inside_ret) { cairo_status_t status; cairo_traps_t traps; _cairo_gstate_user_to_backend (gstate, &x, &y); _cairo_traps_init (&traps); status = _cairo_path_fixed_fill_to_traps (path, gstate->fill_rule, gstate->tolerance, &traps); if (status) goto BAIL; *inside_ret = _cairo_traps_contain (&traps, x, y); BAIL: _cairo_traps_fini (&traps); return status; } cairo_status_t _cairo_gstate_copy_page (cairo_gstate_t *gstate) { cairo_surface_copy_page (gstate->target); return cairo_surface_status (gstate->target); } cairo_status_t _cairo_gstate_show_page (cairo_gstate_t *gstate) { cairo_surface_show_page (gstate->target); return cairo_surface_status (gstate->target); } static void _cairo_gstate_traps_extents_to_user_rectangle (cairo_gstate_t *gstate, cairo_traps_t *traps, double *x1, double *y1, double *x2, double *y2) { cairo_box_t extents; if (traps->num_traps == 0) { /* no traps, so we actually won't draw anything */ if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; } else { _cairo_traps_extents (traps, &extents); if (x1) *x1 = _cairo_fixed_to_double (extents.p1.x); if (y1) *y1 = _cairo_fixed_to_double (extents.p1.y); if (x2) *x2 = _cairo_fixed_to_double (extents.p2.x); if (y2) *y2 = _cairo_fixed_to_double (extents.p2.y); _cairo_gstate_backend_to_user_rectangle (gstate, x1, y1, x2, y2, NULL); } } cairo_status_t _cairo_gstate_stroke_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; cairo_traps_t traps; if (gstate->stroke_style.line_width <= 0.0) { if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; return CAIRO_STATUS_SUCCESS; } _cairo_traps_init (&traps); status = _cairo_path_fixed_stroke_to_traps (path, &gstate->stroke_style, &gstate->ctm, &gstate->ctm_inverse, gstate->tolerance, &traps); if (status == CAIRO_STATUS_SUCCESS) { _cairo_gstate_traps_extents_to_user_rectangle(gstate, &traps, x1, y1, x2, y2); } _cairo_traps_fini (&traps); return status; } cairo_status_t _cairo_gstate_fill_extents (cairo_gstate_t *gstate, cairo_path_fixed_t *path, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; cairo_traps_t traps; _cairo_traps_init (&traps); status = _cairo_path_fixed_fill_to_traps (path, gstate->fill_rule, gstate->tolerance, &traps); if (status == CAIRO_STATUS_SUCCESS) { _cairo_gstate_traps_extents_to_user_rectangle(gstate, &traps, x1, y1, x2, y2); } _cairo_traps_fini (&traps); return status; } cairo_status_t _cairo_gstate_reset_clip (cairo_gstate_t *gstate) { _cairo_clip_reset (&gstate->clip); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path) { return _cairo_clip_clip (&gstate->clip, path, gstate->fill_rule, gstate->tolerance, gstate->antialias, gstate->target); } cairo_status_t _cairo_gstate_clip_extents (cairo_gstate_t *gstate, double *x1, double *y1, double *x2, double *y2) { cairo_rectangle_int_t extents; cairo_status_t status; status = _cairo_surface_get_extents (gstate->target, &extents); if (status) return status; status = _cairo_clip_intersect_to_rectangle (&gstate->clip, &extents); if (status) return status; if (x1) *x1 = extents.x; if (y1) *y1 = extents.y; if (x2) *x2 = extents.x + extents.width; if (y2) *y2 = extents.y + extents.height; _cairo_gstate_backend_to_user_rectangle (gstate, x1, y1, x2, y2, NULL); return CAIRO_STATUS_SUCCESS; } cairo_rectangle_list_t* _cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate) { return _cairo_clip_copy_rectangle_list (&gstate->clip, gstate); } static void _cairo_gstate_unset_scaled_font (cairo_gstate_t *gstate) { if (gstate->scaled_font) { cairo_scaled_font_destroy (gstate->scaled_font); gstate->scaled_font = NULL; } } cairo_status_t _cairo_gstate_select_font_face (cairo_gstate_t *gstate, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { cairo_font_face_t *font_face; cairo_status_t status; font_face = _cairo_toy_font_face_create (family, slant, weight); if (font_face->status) return font_face->status; status = _cairo_gstate_set_font_face (gstate, font_face); cairo_font_face_destroy (font_face); return status; } cairo_status_t _cairo_gstate_set_font_size (cairo_gstate_t *gstate, double size) { _cairo_gstate_unset_scaled_font (gstate); cairo_matrix_init_scale (&gstate->font_matrix, size, size); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_set_font_matrix (cairo_gstate_t *gstate, const cairo_matrix_t *matrix) { if (! _cairo_matrix_is_invertible (matrix)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_gstate_unset_scaled_font (gstate); gstate->font_matrix = *matrix; return CAIRO_STATUS_SUCCESS; } void _cairo_gstate_get_font_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix) { *matrix = gstate->font_matrix; } void _cairo_gstate_set_font_options (cairo_gstate_t *gstate, const cairo_font_options_t *options) { _cairo_gstate_unset_scaled_font (gstate); _cairo_font_options_init_copy (&gstate->font_options, options); } void _cairo_gstate_get_font_options (cairo_gstate_t *gstate, cairo_font_options_t *options) { *options = gstate->font_options; } cairo_status_t _cairo_gstate_get_font_face (cairo_gstate_t *gstate, cairo_font_face_t **font_face) { cairo_status_t status; status = _cairo_gstate_ensure_font_face (gstate); if (status) return status; *font_face = gstate->font_face; return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_get_scaled_font (cairo_gstate_t *gstate, cairo_scaled_font_t **scaled_font) { cairo_status_t status; status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; *scaled_font = gstate->scaled_font; return CAIRO_STATUS_SUCCESS; } /* * Like everything else in this file, fonts involve Too Many Coordinate Spaces; * it is easy to get confused about what's going on. * * The user's view * --------------- * * Users ask for things in user space. When cairo starts, a user space unit * is about 1/96 inch, which is similar to (but importantly different from) * the normal "point" units most users think in terms of. When a user * selects a font, its scale is set to "one user unit". The user can then * independently scale the user coordinate system *or* the font matrix, in * order to adjust the rendered size of the font. * * Metrics are returned in user space, whether they are obtained from * the currently selected font in a #cairo_t or from a #cairo_scaled_font_t * which is a font specialized to a particular scale matrix, CTM, and target * surface. * * The font's view * --------------- * * Fonts are designed and stored (in say .ttf files) in "font space", which * describes an "EM Square" (a design tile) and has some abstract number * such as 1000, 1024, or 2048 units per "EM". This is basically an * uninteresting space for us, but we need to remember that it exists. * * Font resources (from libraries or operating systems) render themselves * to a particular device. Since they do not want to make most programmers * worry about the font design space, the scaling API is simplified to * involve just telling the font the required pixel size of the EM square * (that is, in device space). * * * Cairo's gstate view * ------------------- * * In addition to the CTM and CTM inverse, we keep a matrix in the gstate * called the "font matrix" which describes the user's most recent * font-scaling or font-transforming request. This is kept in terms of an * abstract scale factor, composed with the CTM and used to set the font's * pixel size. So if the user asks to "scale the font by 12", the matrix * is: * * [ 12.0, 0.0, 0.0, 12.0, 0.0, 0.0 ] * * It is an affine matrix, like all cairo matrices, where its tx and ty * components are used to "nudging" fonts around and are handled in gstate * and then ignored by the "scaled-font" layer. * * In order to perform any action on a font, we must build an object * called a #cairo_font_scale_t; this contains the central 2x2 matrix * resulting from "font matrix * CTM" (sans the font matrix translation * components as stated in the previous paragraph). * * We pass this to the font when making requests of it, which causes it to * reply for a particular [user request, device] combination, under the CTM * (to accommodate the "zoom in" == "bigger fonts" issue above). * * The other terms in our communication with the font are therefore in * device space. When we ask it to perform text->glyph conversion, it will * produce a glyph string in device space. Glyph vectors we pass to it for * measuring or rendering should be in device space. The metrics which we * get back from the font will be in device space. The contents of the * global glyph image cache will be in device space. * * * Cairo's public view * ------------------- * * Since the values entering and leaving via public API calls are in user * space, the gstate functions typically need to multiply arguments by the * CTM (for user-input glyph vectors), and return values by the CTM inverse * (for font responses such as metrics or glyph vectors). * */ static cairo_status_t _cairo_gstate_ensure_font_face (cairo_gstate_t *gstate) { cairo_font_face_t *font_face; if (gstate->font_face != NULL) return gstate->font_face->status; font_face = _cairo_toy_font_face_create (CAIRO_FONT_FAMILY_DEFAULT, CAIRO_FONT_SLANT_DEFAULT, CAIRO_FONT_WEIGHT_DEFAULT); if (font_face->status) return font_face->status; gstate->font_face = font_face; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_gstate_ensure_scaled_font (cairo_gstate_t *gstate) { cairo_status_t status; cairo_font_options_t options; cairo_scaled_font_t *scaled_font; if (gstate->scaled_font != NULL) return gstate->scaled_font->status; status = _cairo_gstate_ensure_font_face (gstate); if (status) return status; cairo_surface_get_font_options (gstate->target, &options); cairo_font_options_merge (&options, &gstate->font_options); scaled_font = cairo_scaled_font_create (gstate->font_face, &gstate->font_matrix, &gstate->ctm, &options); status = cairo_scaled_font_status (scaled_font); if (status) return status; gstate->scaled_font = scaled_font; return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_get_font_extents (cairo_gstate_t *gstate, cairo_font_extents_t *extents) { cairo_status_t status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; cairo_scaled_font_extents (gstate->scaled_font, extents); return cairo_scaled_font_status (gstate->scaled_font); } cairo_status_t _cairo_gstate_text_to_glyphs (cairo_gstate_t *gstate, const char *utf8, double x, double y, cairo_glyph_t **glyphs, int *num_glyphs) { cairo_status_t status; status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; return _cairo_scaled_font_text_to_glyphs (gstate->scaled_font, x, y, utf8, glyphs, num_glyphs); } cairo_status_t _cairo_gstate_set_font_face (cairo_gstate_t *gstate, cairo_font_face_t *font_face) { if (font_face && font_face->status) return font_face->status; if (font_face != gstate->font_face) { cairo_font_face_destroy (gstate->font_face); gstate->font_face = cairo_font_face_reference (font_face); } _cairo_gstate_unset_scaled_font (gstate); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_gstate_glyph_extents (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents) { cairo_status_t status; status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; cairo_scaled_font_glyph_extents (gstate->scaled_font, glyphs, num_glyphs, extents); return cairo_scaled_font_status (gstate->scaled_font); } cairo_status_t _cairo_gstate_show_glyphs (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; cairo_pattern_union_t source_pattern; cairo_glyph_t *transformed_glyphs; cairo_glyph_t stack_transformed_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; if (gstate->source->status) return gstate->source->status; status = _cairo_surface_set_clip (gstate->target, &gstate->clip); if (status) return status; status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; if (num_glyphs <= ARRAY_LENGTH (stack_transformed_glyphs)) { transformed_glyphs = stack_transformed_glyphs; } else { transformed_glyphs = _cairo_malloc_ab (num_glyphs, sizeof(cairo_glyph_t)); if (transformed_glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_gstate_transform_glyphs_to_backend (gstate, glyphs, num_glyphs, transformed_glyphs); status = _cairo_gstate_copy_transformed_source (gstate, &source_pattern.base); if (status) goto CLEANUP_GLYPHS; status = _cairo_surface_show_glyphs (gstate->target, gstate->op, &source_pattern.base, transformed_glyphs, num_glyphs, gstate->scaled_font); _cairo_pattern_fini (&source_pattern.base); CLEANUP_GLYPHS: if (transformed_glyphs != stack_transformed_glyphs) free (transformed_glyphs); return status; } cairo_status_t _cairo_gstate_glyph_path (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_path_fixed_t *path) { cairo_status_t status; cairo_glyph_t *transformed_glyphs; cairo_glyph_t stack_transformed_glyphs[CAIRO_STACK_ARRAY_LENGTH (cairo_glyph_t)]; status = _cairo_gstate_ensure_scaled_font (gstate); if (status) return status; if (num_glyphs < ARRAY_LENGTH (stack_transformed_glyphs)) transformed_glyphs = stack_transformed_glyphs; else transformed_glyphs = _cairo_malloc_ab (num_glyphs, sizeof(cairo_glyph_t)); if (transformed_glyphs == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_gstate_transform_glyphs_to_backend (gstate, glyphs, num_glyphs, transformed_glyphs); CAIRO_MUTEX_LOCK (gstate->scaled_font->mutex); status = _cairo_scaled_font_glyph_path (gstate->scaled_font, transformed_glyphs, num_glyphs, path); CAIRO_MUTEX_UNLOCK (gstate->scaled_font->mutex); if (transformed_glyphs != stack_transformed_glyphs) free (transformed_glyphs); return status; } cairo_status_t _cairo_gstate_set_antialias (cairo_gstate_t *gstate, cairo_antialias_t antialias) { gstate->antialias = antialias; return CAIRO_STATUS_SUCCESS; } cairo_antialias_t _cairo_gstate_get_antialias (cairo_gstate_t *gstate) { return gstate->antialias; } /** * _cairo_gstate_transform_glyphs_to_backend: * @gstate: a #cairo_gstate_t * @glyphs: the array of #cairo_glyph_t objects to be transformed * @num_glyphs: the number of elements in @glyphs * @transformed_glyphs: a pre-allocated array of at least @num_glyphs * #cairo_glyph_t objects * * Transform an array of glyphs to backend space by first adding the offset * of the font matrix, then transforming from user space to backend space. * The result of the transformation is placed in @transformed_glyphs. **/ static void _cairo_gstate_transform_glyphs_to_backend (cairo_gstate_t *gstate, const cairo_glyph_t *glyphs, int num_glyphs, cairo_glyph_t *transformed_glyphs) { int i; cairo_matrix_t *ctm = &gstate->ctm; cairo_matrix_t *device_transform = &gstate->target->device_transform; if (_cairo_matrix_is_identity (ctm) && _cairo_matrix_is_identity (device_transform) && gstate->font_matrix.x0 == 0 && gstate->font_matrix.y0 == 0) { memcpy (transformed_glyphs, glyphs, num_glyphs * sizeof (cairo_glyph_t)); } else if (_cairo_matrix_is_translation (ctm) && _cairo_matrix_is_translation (device_transform)) { double tx = gstate->font_matrix.x0 + ctm->x0 + device_transform->x0; double ty = gstate->font_matrix.y0 + ctm->y0 + device_transform->y0; for (i = 0; i < num_glyphs; i++) { transformed_glyphs[i].index = glyphs[i].index; transformed_glyphs[i].x = glyphs[i].x + tx; transformed_glyphs[i].y = glyphs[i].y + ty; } } else { cairo_matrix_t aggregate_transform; cairo_matrix_init_translate (&aggregate_transform, gstate->font_matrix.x0, gstate->font_matrix.y0); cairo_matrix_multiply (&aggregate_transform, &aggregate_transform, ctm); cairo_matrix_multiply (&aggregate_transform, &aggregate_transform, device_transform); for (i = 0; i < num_glyphs; i++) { transformed_glyphs[i] = glyphs[i]; cairo_matrix_transform_point (&aggregate_transform, &transformed_glyphs[i].x, &transformed_glyphs[i].y); } } } libgdiplus-2.11/cairo/src/cairo-image-surface.c0000664000175000017500000011570112225470167016364 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" static cairo_format_t _cairo_format_from_pixman_format (pixman_format_code_t pixman_format) { switch (pixman_format) { case PIXMAN_a8r8g8b8: return CAIRO_FORMAT_ARGB32; case PIXMAN_x8r8g8b8: return CAIRO_FORMAT_RGB24; case PIXMAN_a8: return CAIRO_FORMAT_A8; case PIXMAN_a1: return CAIRO_FORMAT_A1; case PIXMAN_a8b8g8r8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_r5g6b5: case PIXMAN_b5g6r5: case PIXMAN_a1r5g5b5: case PIXMAN_x1r5g5b5: case PIXMAN_a1b5g5r5: case PIXMAN_x1b5g5r5: case PIXMAN_a4r4g4b4: case PIXMAN_x4r4g4b4: case PIXMAN_a4b4g4r4: case PIXMAN_x4b4g4r4: case PIXMAN_r3g3b2: case PIXMAN_b2g3r3: case PIXMAN_a2r2g2b2: case PIXMAN_a2b2g2r2: case PIXMAN_c8: case PIXMAN_g8: case PIXMAN_x4a4: case PIXMAN_a4: case PIXMAN_r1g2b1: case PIXMAN_b1g2r1: case PIXMAN_a1r1g1b1: case PIXMAN_a1b1g1r1: case PIXMAN_c4: case PIXMAN_g4: case PIXMAN_g1: case PIXMAN_yuy2: case PIXMAN_yv12: default: return CAIRO_FORMAT_INVALID; } return CAIRO_FORMAT_INVALID; } static cairo_content_t _cairo_content_from_pixman_format (pixman_format_code_t pixman_format) { switch (pixman_format) { case PIXMAN_a8r8g8b8: case PIXMAN_a8b8g8r8: case PIXMAN_a1r5g5b5: case PIXMAN_a1b5g5r5: case PIXMAN_a4r4g4b4: case PIXMAN_a4b4g4r4: case PIXMAN_a2r2g2b2: case PIXMAN_a2b2g2r2: case PIXMAN_a1r1g1b1: case PIXMAN_a1b1g1r1: return CAIRO_CONTENT_COLOR_ALPHA; case PIXMAN_x8r8g8b8: case PIXMAN_x8b8g8r8: case PIXMAN_r8g8b8: case PIXMAN_b8g8r8: case PIXMAN_r5g6b5: case PIXMAN_b5g6r5: case PIXMAN_x1r5g5b5: case PIXMAN_x1b5g5r5: case PIXMAN_x4r4g4b4: case PIXMAN_x4b4g4r4: case PIXMAN_r3g3b2: case PIXMAN_b2g3r3: case PIXMAN_c8: case PIXMAN_g8: case PIXMAN_r1g2b1: case PIXMAN_b1g2r1: case PIXMAN_c4: case PIXMAN_g4: case PIXMAN_g1: case PIXMAN_yuy2: case PIXMAN_yv12: return CAIRO_CONTENT_COLOR; case PIXMAN_a8: case PIXMAN_a1: case PIXMAN_x4a4: case PIXMAN_a4: return CAIRO_CONTENT_ALPHA; } return CAIRO_CONTENT_COLOR_ALPHA; } cairo_surface_t * _cairo_image_surface_create_for_pixman_image (pixman_image_t *pixman_image, pixman_format_code_t pixman_format) { cairo_image_surface_t *surface; surface = malloc (sizeof (cairo_image_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); _cairo_surface_init (&surface->base, &cairo_image_surface_backend, _cairo_content_from_pixman_format (pixman_format)); surface->pixman_image = pixman_image; surface->pixman_format = pixman_format; surface->format = _cairo_format_from_pixman_format (pixman_format); surface->data = (unsigned char *) pixman_image_get_data (pixman_image); surface->owns_data = FALSE; surface->has_clip = FALSE; surface->transparency = CAIRO_IMAGE_UNKNOWN; surface->width = pixman_image_get_width (pixman_image); surface->height = pixman_image_get_height (pixman_image); surface->stride = pixman_image_get_stride (pixman_image); surface->depth = pixman_image_get_depth (pixman_image); return &surface->base; } cairo_int_status_t _pixman_format_from_masks (cairo_format_masks_t *masks, pixman_format_code_t *format_ret) { pixman_format_code_t format; int format_type; int a, r, g, b; cairo_format_masks_t format_masks; a = _cairo_popcount (masks->alpha_mask); r = _cairo_popcount (masks->red_mask); g = _cairo_popcount (masks->green_mask); b = _cairo_popcount (masks->blue_mask); if (masks->red_mask) { if (masks->red_mask > masks->blue_mask) format_type = PIXMAN_TYPE_ARGB; else format_type = PIXMAN_TYPE_ABGR; } else if (masks->alpha_mask) { format_type = PIXMAN_TYPE_A; } else { return CAIRO_INT_STATUS_UNSUPPORTED; } format = PIXMAN_FORMAT (masks->bpp, format_type, a, r, g, b); if (! pixman_format_supported_destination (format)) return CAIRO_INT_STATUS_UNSUPPORTED; /* Sanity check that we got out of PIXMAN_FORMAT exactly what we * expected. This avoid any problems from something bizarre like * alpha in the least-significant bits, or insane channel order, * or whatever. */ _pixman_format_to_masks (format, &format_masks); if (masks->bpp != format_masks.bpp || masks->red_mask != format_masks.red_mask || masks->green_mask != format_masks.green_mask || masks->blue_mask != format_masks.blue_mask) { return CAIRO_INT_STATUS_UNSUPPORTED; } *format_ret = format; return CAIRO_STATUS_SUCCESS; } /* A mask consisting of N bits set to 1. */ #define MASK(N) ((1 << (N))-1) void _pixman_format_to_masks (pixman_format_code_t format, cairo_format_masks_t *masks) { int a, r, g, b; masks->bpp = PIXMAN_FORMAT_BPP (format); /* Number of bits in each channel */ a = PIXMAN_FORMAT_A (format); r = PIXMAN_FORMAT_R (format); g = PIXMAN_FORMAT_G (format); b = PIXMAN_FORMAT_B (format); switch (PIXMAN_FORMAT_TYPE (format)) { case PIXMAN_TYPE_ARGB: masks->alpha_mask = MASK (a) << (r + g + b); masks->red_mask = MASK (r) << (g + b); masks->green_mask = MASK (g) << (b); masks->blue_mask = MASK (b); return; case PIXMAN_TYPE_ABGR: masks->alpha_mask = MASK (a) << (b + g + r); masks->blue_mask = MASK (b) << (g +r); masks->green_mask = MASK (g) << (r); masks->red_mask = MASK (r); return; case PIXMAN_TYPE_A: masks->alpha_mask = MASK (a); masks->red_mask = 0; masks->green_mask = 0; masks->blue_mask = 0; return; case PIXMAN_TYPE_OTHER: case PIXMAN_TYPE_COLOR: case PIXMAN_TYPE_GRAY: case PIXMAN_TYPE_YUY2: case PIXMAN_TYPE_YV12: default: masks->alpha_mask = 0; masks->red_mask = 0; masks->green_mask = 0; masks->blue_mask = 0; return; } } /* XXX: This function really should be eliminated. We don't really * want to advertise a cairo image surface that supports any possible * format. A minimal step would be to replace this function with one * that accepts a #cairo_internal_format_t rather than mask values. */ cairo_surface_t * _cairo_image_surface_create_with_masks (unsigned char *data, cairo_format_masks_t *masks, int width, int height, int stride) { cairo_int_status_t status; pixman_format_code_t pixman_format; status = _pixman_format_from_masks (masks, &pixman_format); if (status == CAIRO_INT_STATUS_UNSUPPORTED) { fprintf (stderr, "Error: Cairo " PACKAGE_VERSION " does not yet support the requested image format:\n" "\tDepth: %d\n" "\tAlpha mask: 0x%08lx\n" "\tRed mask: 0x%08lx\n" "\tGreen mask: 0x%08lx\n" "\tBlue mask: 0x%08lx\n" "Please file an enhancement request (quoting the above) at:\n" PACKAGE_BUGREPORT "\n", masks->bpp, masks->alpha_mask, masks->red_mask, masks->green_mask, masks->blue_mask); ASSERT_NOT_REACHED; } return _cairo_image_surface_create_with_pixman_format (data, pixman_format, width, height, stride); } static pixman_format_code_t _cairo_format_to_pixman_format_code (cairo_format_t format) { pixman_format_code_t ret; switch (format) { case CAIRO_FORMAT_A1: ret = PIXMAN_a1; break; case CAIRO_FORMAT_A8: ret = PIXMAN_a8; break; case CAIRO_FORMAT_RGB24: ret = PIXMAN_x8r8g8b8; break; case CAIRO_FORMAT_ARGB32: default: ret = PIXMAN_a8r8g8b8; break; } return ret; } cairo_surface_t * _cairo_image_surface_create_with_pixman_format (unsigned char *data, pixman_format_code_t pixman_format, int width, int height, int stride) { cairo_surface_t *surface; pixman_image_t *pixman_image; pixman_image = pixman_image_create_bits (pixman_format, width, height, (uint32_t *) data, stride); if (pixman_image == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); surface = _cairo_image_surface_create_for_pixman_image (pixman_image, pixman_format); if (cairo_surface_status (surface)) pixman_image_unref (pixman_image); return surface; } /** * cairo_image_surface_create: * @format: format of pixels in the surface to create * @width: width of the surface, in pixels * @height: height of the surface, in pixels * * Creates an image surface of the specified format and * dimensions. Initially the surface contents are all * 0. (Specifically, within each pixel, each color or alpha channel * belonging to format will be 0. The contents of bits within a pixel, * but not belonging to the given format are undefined). * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if an error such as out of memory * occurs. You can use cairo_surface_status() to check for this. **/ cairo_surface_t * cairo_image_surface_create (cairo_format_t format, int width, int height) { pixman_format_code_t pixman_format; if (! CAIRO_FORMAT_VALID (format)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); pixman_format = _cairo_format_to_pixman_format_code (format); return _cairo_image_surface_create_with_pixman_format (NULL, pixman_format, width, height, -1); } slim_hidden_def (cairo_image_surface_create); cairo_surface_t * _cairo_image_surface_create_with_content (cairo_content_t content, int width, int height) { if (! CAIRO_CONTENT_VALID (content)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); return cairo_image_surface_create (_cairo_format_from_content (content), width, height); } /** * cairo_format_stride_for_width: * @format: A #cairo_format_t value * @width: The desired width of an image surface to be created. * * This function provides a stride value that will respect all * alignment requirements of the accelerated image-rendering code * within cairo. Typical usage will be of the form: * * * int stride; * unsigned char *data; * #cairo_surface_t *surface; * * stride = cairo_format_stride_for_width (format, width); * data = malloc (stride * height); * surface = cairo_image_surface_create_for_data (data, format, * width, height); * * * Return value: the appropriate stride to use given the desired * format and width, or -1 if either the format is invalid or the width * too large. * * Since: 1.6 **/ int cairo_format_stride_for_width (cairo_format_t format, int width) { int bpp; if (! CAIRO_FORMAT_VALID (format)) { _cairo_error_throw (CAIRO_STATUS_INVALID_FORMAT); return -1; } bpp = _cairo_format_bits_per_pixel (format); if ((unsigned) (width) >= (INT32_MAX - 7) / (unsigned) (bpp)) return -1; return CAIRO_STRIDE_FOR_WIDTH_BPP (width, bpp); } slim_hidden_def (cairo_format_stride_for_width); /** * cairo_image_surface_create_for_data: * @data: a pointer to a buffer supplied by the application in which * to write contents. This pointer must be suitably aligned for any * kind of variable, (for example, a pointer returned by malloc). * @format: the format of pixels in the buffer * @width: the width of the image to be stored in the buffer * @height: the height of the image to be stored in the buffer * @stride: the number of bytes between the start of rows in the * buffer as allocated. This value should always be computed by * cairo_format_stride_for_width() before allocating the data * buffer. * * Creates an image surface for the provided pixel data. The output * buffer must be kept around until the #cairo_surface_t is destroyed * or cairo_surface_finish() is called on the surface. The initial * contents of @buffer will be used as the initial image contents; you * must explicitly clear the buffer, using, for example, * cairo_rectangle() and cairo_fill() if you want it cleared. * * Note that the stride may be larger than * width*bytes_per_pixel to provide proper alignment for each pixel * and row. This alignment is required to allow high-performance rendering * within cairo. The correct way to obtain a legal stride value is to * call cairo_format_stride_for_width() with the desired format and * maximum image width value, and the use the resulting stride value * to allocate the data and to create the image surface. See * cairo_format_stride_for_width() for example code. * * Return value: a pointer to the newly created surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface in the case of an error such as out of * memory or an invalid stride value. In case of invalid stride value * the error status of the returned surface will be * %CAIRO_STATUS_INVALID_STRIDE. You can use * cairo_surface_status() to check for this. * * See cairo_surface_set_user_data() for a means of attaching a * destroy-notification fallback to the surface if necessary. **/ cairo_surface_t * cairo_image_surface_create_for_data (unsigned char *data, cairo_format_t format, int width, int height, int stride) { pixman_format_code_t pixman_format; if (! CAIRO_FORMAT_VALID (format)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_FORMAT)); if ((stride & (CAIRO_STRIDE_ALIGNMENT-1)) != 0) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_STRIDE)); pixman_format = _cairo_format_to_pixman_format_code (format); return _cairo_image_surface_create_with_pixman_format (data, pixman_format, width, height, stride); } slim_hidden_def (cairo_image_surface_create_for_data); cairo_surface_t * _cairo_image_surface_create_for_data_with_content (unsigned char *data, cairo_content_t content, int width, int height, int stride) { if (! CAIRO_CONTENT_VALID (content)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); return cairo_image_surface_create_for_data (data, _cairo_format_from_content (content), width, height, stride); } /** * cairo_image_surface_get_data: * @surface: a #cairo_image_surface_t * * Get a pointer to the data of the image surface, for direct * inspection or modification. * * Return value: a pointer to the image data of this surface or %NULL * if @surface is not an image surface. * * Since: 1.2 **/ unsigned char * cairo_image_surface_get_data (cairo_surface_t *surface) { cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; if (! _cairo_surface_is_image (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return NULL; } return image_surface->data; } slim_hidden_def (cairo_image_surface_get_data); /** * cairo_image_surface_get_format: * @surface: a #cairo_image_surface_t * * Get the format of the surface. * * Return value: the format of the surface * * Since: 1.2 **/ cairo_format_t cairo_image_surface_get_format (cairo_surface_t *surface) { cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; if (! _cairo_surface_is_image (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } assert (CAIRO_FORMAT_VALID (image_surface->format)); return image_surface->format; } /** * cairo_image_surface_get_width: * @surface: a #cairo_image_surface_t * * Get the width of the image surface in pixels. * * Return value: the width of the surface in pixels. **/ int cairo_image_surface_get_width (cairo_surface_t *surface) { cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; if (! _cairo_surface_is_image (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } return image_surface->width; } slim_hidden_def (cairo_image_surface_get_width); /** * cairo_image_surface_get_height: * @surface: a #cairo_image_surface_t * * Get the height of the image surface in pixels. * * Return value: the height of the surface in pixels. **/ int cairo_image_surface_get_height (cairo_surface_t *surface) { cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; if (! _cairo_surface_is_image (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } return image_surface->height; } slim_hidden_def (cairo_image_surface_get_height); /** * cairo_image_surface_get_stride: * @surface: a #cairo_image_surface_t * * Get the stride of the image surface in bytes * * Return value: the stride of the image surface in bytes (or 0 if * @surface is not an image surface). The stride is the distance in * bytes from the beginning of one row of the image data to the * beginning of the next row. * * Since: 1.2 **/ int cairo_image_surface_get_stride (cairo_surface_t *surface) { cairo_image_surface_t *image_surface = (cairo_image_surface_t *) surface; if (! _cairo_surface_is_image (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } return image_surface->stride; } slim_hidden_def (cairo_image_surface_get_stride); cairo_format_t _cairo_format_from_content (cairo_content_t content) { switch (content) { case CAIRO_CONTENT_COLOR: return CAIRO_FORMAT_RGB24; case CAIRO_CONTENT_ALPHA: return CAIRO_FORMAT_A8; case CAIRO_CONTENT_COLOR_ALPHA: return CAIRO_FORMAT_ARGB32; } ASSERT_NOT_REACHED; return CAIRO_FORMAT_ARGB32; } cairo_content_t _cairo_content_from_format (cairo_format_t format) { switch (format) { case CAIRO_FORMAT_ARGB32: return CAIRO_CONTENT_COLOR_ALPHA; case CAIRO_FORMAT_RGB24: return CAIRO_CONTENT_COLOR; case CAIRO_FORMAT_A8: case CAIRO_FORMAT_A1: return CAIRO_CONTENT_ALPHA; } ASSERT_NOT_REACHED; return CAIRO_CONTENT_COLOR_ALPHA; } int _cairo_format_bits_per_pixel (cairo_format_t format) { switch (format) { case CAIRO_FORMAT_ARGB32: return 32; case CAIRO_FORMAT_RGB24: return 32; case CAIRO_FORMAT_A8: return 8; case CAIRO_FORMAT_A1: return 1; default: ASSERT_NOT_REACHED; return 0; } } static cairo_surface_t * _cairo_image_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { assert (CAIRO_CONTENT_VALID (content)); return _cairo_image_surface_create_with_content (content, width, height); } static cairo_status_t _cairo_image_surface_finish (void *abstract_surface) { cairo_image_surface_t *surface = abstract_surface; if (surface->pixman_image) { pixman_image_unref (surface->pixman_image); surface->pixman_image = NULL; } if (surface->owns_data) { free (surface->data); surface->data = NULL; } return CAIRO_STATUS_SUCCESS; } void _cairo_image_surface_assume_ownership_of_data (cairo_image_surface_t *surface) { surface->owns_data = 1; } static cairo_status_t _cairo_image_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { *image_out = abstract_surface; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_image_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { } static cairo_status_t _cairo_image_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { cairo_image_surface_t *surface = abstract_surface; image_rect_out->x = 0; image_rect_out->y = 0; image_rect_out->width = surface->width; image_rect_out->height = surface->height; *image_out = surface; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_image_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { } static cairo_status_t _cairo_image_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_image_surface_t *surface = abstract_surface; if (src->backend == surface->base.backend) { *clone_out = cairo_surface_reference (src); return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_status_t _cairo_image_surface_set_matrix (cairo_image_surface_t *surface, const cairo_matrix_t *matrix) { pixman_transform_t pixman_transform; _cairo_matrix_to_pixman_matrix (matrix, &pixman_transform); if (! pixman_image_set_transform (surface->pixman_image, &pixman_transform)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return CAIRO_STATUS_SUCCESS; } static void _cairo_image_surface_set_filter (cairo_image_surface_t *surface, cairo_filter_t filter) { pixman_filter_t pixman_filter; switch (filter) { case CAIRO_FILTER_FAST: pixman_filter = PIXMAN_FILTER_FAST; break; case CAIRO_FILTER_GOOD: pixman_filter = PIXMAN_FILTER_GOOD; break; case CAIRO_FILTER_BEST: pixman_filter = PIXMAN_FILTER_BEST; break; case CAIRO_FILTER_NEAREST: pixman_filter = PIXMAN_FILTER_NEAREST; break; case CAIRO_FILTER_BILINEAR: pixman_filter = PIXMAN_FILTER_BILINEAR; break; case CAIRO_FILTER_GAUSSIAN: /* XXX: The GAUSSIAN value has no implementation in cairo * whatsoever, so it was really a mistake to have it in the * API. We could fix this by officially deprecating it, or * else inventing semantics and providing an actual * implementation for it. */ default: pixman_filter = PIXMAN_FILTER_BEST; } pixman_image_set_filter (surface->pixman_image, pixman_filter, NULL, 0); } static cairo_status_t _cairo_image_surface_set_attributes (cairo_image_surface_t *surface, cairo_surface_attributes_t *attributes) { cairo_int_status_t status; status = _cairo_image_surface_set_matrix (surface, &attributes->matrix); if (status) return status; switch (attributes->extend) { case CAIRO_EXTEND_NONE: pixman_image_set_repeat (surface->pixman_image, PIXMAN_REPEAT_NONE); break; case CAIRO_EXTEND_REPEAT: pixman_image_set_repeat (surface->pixman_image, PIXMAN_REPEAT_NORMAL); break; case CAIRO_EXTEND_REFLECT: pixman_image_set_repeat (surface->pixman_image, PIXMAN_REPEAT_REFLECT); break; case CAIRO_EXTEND_PAD: pixman_image_set_repeat (surface->pixman_image, PIXMAN_REPEAT_PAD); break; } _cairo_image_surface_set_filter (surface, attributes->filter); return CAIRO_STATUS_SUCCESS; } /* XXX: I think we should fix pixman to match the names/order of the * cairo operators, but that will likely be better done at the same * time the X server is ported to pixman, (which will change a lot of * things in pixman I think). */ static pixman_op_t _pixman_operator (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: return PIXMAN_OP_CLEAR; case CAIRO_OPERATOR_SOURCE: return PIXMAN_OP_SRC; case CAIRO_OPERATOR_OVER: return PIXMAN_OP_OVER; case CAIRO_OPERATOR_IN: return PIXMAN_OP_IN; case CAIRO_OPERATOR_OUT: return PIXMAN_OP_OUT; case CAIRO_OPERATOR_ATOP: return PIXMAN_OP_ATOP; case CAIRO_OPERATOR_DEST: return PIXMAN_OP_DST; case CAIRO_OPERATOR_DEST_OVER: return PIXMAN_OP_OVER_REVERSE; case CAIRO_OPERATOR_DEST_IN: return PIXMAN_OP_IN_REVERSE; case CAIRO_OPERATOR_DEST_OUT: return PIXMAN_OP_OUT_REVERSE; case CAIRO_OPERATOR_DEST_ATOP: return PIXMAN_OP_ATOP_REVERSE; case CAIRO_OPERATOR_XOR: return PIXMAN_OP_XOR; case CAIRO_OPERATOR_ADD: return PIXMAN_OP_ADD; case CAIRO_OPERATOR_SATURATE: return PIXMAN_OP_SATURATE; default: return PIXMAN_OP_OVER; } } static cairo_int_status_t _cairo_image_surface_composite (cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_surface_attributes_t src_attr, mask_attr; cairo_image_surface_t *dst = abstract_dst; cairo_image_surface_t *src; cairo_image_surface_t *mask; cairo_int_status_t status; status = _cairo_pattern_acquire_surfaces (src_pattern, mask_pattern, &dst->base, src_x, src_y, mask_x, mask_y, width, height, (cairo_surface_t **) &src, (cairo_surface_t **) &mask, &src_attr, &mask_attr); if (status) return status; status = _cairo_image_surface_set_attributes (src, &src_attr); if (status) goto CLEANUP_SURFACES; if (mask) { status = _cairo_image_surface_set_attributes (mask, &mask_attr); if (status) goto CLEANUP_SURFACES; pixman_image_composite (_pixman_operator (op), src->pixman_image, mask->pixman_image, dst->pixman_image, src_x + src_attr.x_offset, src_y + src_attr.y_offset, mask_x + mask_attr.x_offset, mask_y + mask_attr.y_offset, dst_x, dst_y, width, height); } else { pixman_image_composite (_pixman_operator (op), src->pixman_image, NULL, dst->pixman_image, src_x + src_attr.x_offset, src_y + src_attr.y_offset, 0, 0, dst_x, dst_y, width, height); } if (! _cairo_operator_bounded_by_source (op)) status = _cairo_surface_composite_fixup_unbounded (&dst->base, &src_attr, src->width, src->height, mask ? &mask_attr : NULL, mask ? mask->width : 0, mask ? mask->height : 0, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); CLEANUP_SURFACES: if (mask) _cairo_pattern_release_surface (mask_pattern, &mask->base, &mask_attr); _cairo_pattern_release_surface (src_pattern, &src->base, &src_attr); return status; } static cairo_int_status_t _cairo_image_surface_fill_rectangles (void *abstract_surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects) { cairo_image_surface_t *surface = abstract_surface; pixman_color_t pixman_color; pixman_rectangle16_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (pixman_rectangle16_t)]; pixman_rectangle16_t *pixman_rects = stack_rects; int i; cairo_int_status_t status = CAIRO_STATUS_SUCCESS; pixman_color.red = color->red_short; pixman_color.green = color->green_short; pixman_color.blue = color->blue_short; pixman_color.alpha = color->alpha_short; if (num_rects > ARRAY_LENGTH (stack_rects)) { pixman_rects = _cairo_malloc_ab (num_rects, sizeof (pixman_rectangle16_t)); if (pixman_rects == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < num_rects; i++) { pixman_rects[i].x = rects[i].x; pixman_rects[i].y = rects[i].y; pixman_rects[i].width = rects[i].width; pixman_rects[i].height = rects[i].height; } /* XXX: pixman_fill_rectangles() should be implemented */ if (! pixman_image_fill_rectangles (_pixman_operator (op), surface->pixman_image, &pixman_color, num_rects, pixman_rects)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); } if (pixman_rects != stack_rects) free (pixman_rects); return status; } static cairo_int_status_t _cairo_image_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps) { cairo_surface_attributes_t attributes; cairo_image_surface_t *dst = abstract_dst; cairo_image_surface_t *src; cairo_int_status_t status; pixman_image_t *mask; pixman_format_code_t format; uint32_t *mask_data; pixman_trapezoid_t stack_traps[CAIRO_STACK_ARRAY_LENGTH (pixman_trapezoid_t)]; pixman_trapezoid_t *pixman_traps = stack_traps; int mask_stride; int mask_bpp; int ret, i; if (height == 0 || width == 0) return CAIRO_STATUS_SUCCESS; /* Convert traps to pixman traps */ if (num_traps > ARRAY_LENGTH (stack_traps)) { pixman_traps = _cairo_malloc_ab (num_traps, sizeof (pixman_trapezoid_t)); if (pixman_traps == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < num_traps; i++) { pixman_traps[i].top = _cairo_fixed_to_16_16 (traps[i].top); pixman_traps[i].bottom = _cairo_fixed_to_16_16 (traps[i].bottom); pixman_traps[i].left.p1.x = _cairo_fixed_to_16_16 (traps[i].left.p1.x); pixman_traps[i].left.p1.y = _cairo_fixed_to_16_16 (traps[i].left.p1.y); pixman_traps[i].left.p2.x = _cairo_fixed_to_16_16 (traps[i].left.p2.x); pixman_traps[i].left.p2.y = _cairo_fixed_to_16_16 (traps[i].left.p2.y); pixman_traps[i].right.p1.x = _cairo_fixed_to_16_16 (traps[i].right.p1.x); pixman_traps[i].right.p1.y = _cairo_fixed_to_16_16 (traps[i].right.p1.y); pixman_traps[i].right.p2.x = _cairo_fixed_to_16_16 (traps[i].right.p2.x); pixman_traps[i].right.p2.y = _cairo_fixed_to_16_16 (traps[i].right.p2.y); } /* Special case adding trapezoids onto a mask surface; we want to avoid * creating an intermediate temporary mask unnecessarily. * * We make the assumption here that the portion of the trapezoids * contained within the surface is bounded by [dst_x,dst_y,width,height]; * the Cairo core code passes bounds based on the trapezoid extents. * * Currently the check surface->has_clip is needed for correct * functioning, since pixman_add_trapezoids() doesn't obey the * surface clip, which is a libpixman bug , but there's no harm in * falling through to the general case when the surface is clipped * since libpixman would have to generate an intermediate mask anyways. */ if (op == CAIRO_OPERATOR_ADD && _cairo_pattern_is_opaque_solid (pattern) && dst->base.content == CAIRO_CONTENT_ALPHA && ! dst->has_clip && antialias != CAIRO_ANTIALIAS_NONE) { pixman_add_trapezoids (dst->pixman_image, 0, 0, num_traps, pixman_traps); status = CAIRO_STATUS_SUCCESS; goto finish; } status = _cairo_pattern_acquire_surface (pattern, &dst->base, src_x, src_y, width, height, (cairo_surface_t **) &src, &attributes); if (status) goto finish; status = _cairo_image_surface_set_attributes (src, &attributes); if (status) goto CLEANUP_SOURCE; switch (antialias) { case CAIRO_ANTIALIAS_NONE: format = PIXMAN_a1; ret = 1; mask_stride = ((width + 31) / 8) & ~0x03; mask_bpp = 1; break; case CAIRO_ANTIALIAS_GRAY: case CAIRO_ANTIALIAS_SUBPIXEL: case CAIRO_ANTIALIAS_DEFAULT: default: format = PIXMAN_a8; ret = 1; mask_stride = (width + 3) & ~3; mask_bpp = 8; break; } /* The image must be initially transparent */ mask_data = calloc (mask_stride, height); if (mask_data == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_SOURCE; } mask = pixman_image_create_bits (format, width, height, mask_data, mask_stride); if (mask == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto CLEANUP_IMAGE_DATA; } pixman_add_trapezoids (mask, - dst_x, - dst_y, num_traps, pixman_traps); pixman_image_composite (_pixman_operator (op), src->pixman_image, mask, dst->pixman_image, src_x + attributes.x_offset, src_y + attributes.y_offset, 0, 0, dst_x, dst_y, width, height); if (! _cairo_operator_bounded_by_mask (op)) status = _cairo_surface_composite_shape_fixup_unbounded (&dst->base, &attributes, src->width, src->height, width, height, src_x, src_y, 0, 0, dst_x, dst_y, width, height); pixman_image_unref (mask); CLEANUP_IMAGE_DATA: free (mask_data); CLEANUP_SOURCE: _cairo_pattern_release_surface (pattern, &src->base, &attributes); finish: if (pixman_traps != stack_traps) free (pixman_traps); return status; } cairo_int_status_t _cairo_image_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_image_surface_t *surface = (cairo_image_surface_t *) abstract_surface; if (! pixman_image_set_clip_region (surface->pixman_image, ®ion->rgn)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); surface->has_clip = region != NULL; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_image_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_image_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; rectangle->width = surface->width; rectangle->height = surface->height; return CAIRO_STATUS_SUCCESS; } static void _cairo_image_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { _cairo_font_options_init_default (options); cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON); } static cairo_status_t _cairo_image_surface_reset (void *abstract_surface) { cairo_image_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_image_surface_set_clip_region (surface, NULL); assert (status == CAIRO_STATUS_SUCCESS); return CAIRO_STATUS_SUCCESS; } /** * _cairo_surface_is_image: * @surface: a #cairo_surface_t * * Checks if a surface is an #cairo_image_surface_t * * Return value: %TRUE if the surface is an image surface **/ cairo_bool_t _cairo_surface_is_image (const cairo_surface_t *surface) { return surface->backend == &cairo_image_surface_backend; } const cairo_surface_backend_t cairo_image_surface_backend = { CAIRO_SURFACE_TYPE_IMAGE, _cairo_image_surface_create_similar, _cairo_image_surface_finish, _cairo_image_surface_acquire_source_image, _cairo_image_surface_release_source_image, _cairo_image_surface_acquire_dest_image, _cairo_image_surface_release_dest_image, _cairo_image_surface_clone_similar, _cairo_image_surface_composite, _cairo_image_surface_fill_rectangles, _cairo_image_surface_composite_trapezoids, NULL, /* copy_page */ NULL, /* show_page */ _cairo_image_surface_set_clip_region, NULL, /* intersect_clip_path */ _cairo_image_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_image_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* font_fini */ NULL, /* glyph_fini */ NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ NULL, /* show_glyphs */ NULL, /* snapshot */ NULL, /* is_similar */ _cairo_image_surface_reset }; /* A convenience function for when one needs to coerce an image * surface to an alternate format. */ cairo_image_surface_t * _cairo_image_surface_clone (cairo_image_surface_t *surface, cairo_format_t format) { cairo_image_surface_t *clone; cairo_status_t status; cairo_t *cr; double x, y; clone = (cairo_image_surface_t *) cairo_image_surface_create (format, surface->width, surface->height); cairo_surface_get_device_offset (&surface->base, &x, &y); cairo_surface_set_device_offset (&clone->base, x, y); clone->transparency = CAIRO_IMAGE_UNKNOWN; /* XXX Use _cairo_surface_composite directly */ cr = cairo_create (&clone->base); cairo_set_source_surface (cr, &surface->base, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); if (status) { cairo_surface_destroy (&clone->base); return (cairo_image_surface_t *) _cairo_surface_create_in_error (status); } return clone; } cairo_image_transparency_t _cairo_image_analyze_transparency (cairo_image_surface_t *image) { int x, y; if (image->transparency != CAIRO_IMAGE_UNKNOWN) return image->transparency; if (image->format == CAIRO_FORMAT_RGB24) { image->transparency = CAIRO_IMAGE_IS_OPAQUE; return CAIRO_IMAGE_IS_OPAQUE; } if (image->format != CAIRO_FORMAT_ARGB32) { image->transparency = CAIRO_IMAGE_HAS_ALPHA; return CAIRO_IMAGE_HAS_ALPHA; } image->transparency = CAIRO_IMAGE_IS_OPAQUE; for (y = 0; y < image->height; y++) { uint32_t *pixel = (uint32_t *) (image->data + y * image->stride); for (x = 0; x < image->width; x++, pixel++) { int a = (*pixel & 0xff000000) >> 24; if (a > 0 && a < 255) { image->transparency = CAIRO_IMAGE_HAS_ALPHA; return CAIRO_IMAGE_HAS_ALPHA; } else if (a == 0) { image->transparency = CAIRO_IMAGE_HAS_BILEVEL_ALPHA; } } } return image->transparency; } libgdiplus-2.11/cairo/src/cairo-fixed-type-private.h0000664000175000017500000000500612225470167017403 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* Cairo - a vector graphics library with display and print output * * Copyright © 2007 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_FIXED_TYPE_PRIVATE_H #define CAIRO_FIXED_TYPE_PRIVATE_H #include "cairo-wideint-type-private.h" /* * Fixed-point configuration */ typedef int32_t cairo_fixed_16_16_t; typedef cairo_int64_t cairo_fixed_32_32_t; typedef cairo_int64_t cairo_fixed_48_16_t; typedef cairo_int128_t cairo_fixed_64_64_t; typedef cairo_int128_t cairo_fixed_96_32_t; /* Eventually, we should allow changing this, but I think * there are some assumptions in the tesselator about the * size of a fixed type. For now, it must be 32. */ #define CAIRO_FIXED_BITS 32 /* The number of fractional bits. Changing this involves * making sure that you compute a double-to-fixed magic number. * (see below). */ #define CAIRO_FIXED_FRAC_BITS 8 /* A signed type %CAIRO_FIXED_BITS in size; the main fixed point type */ typedef int32_t cairo_fixed_t; /* An unsigned type of the same size as #cairo_fixed_t */ typedef uint32_t cairo_fixed_unsigned_t; #endif /* CAIRO_FIXED_TYPE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-path.c0000664000175000017500000002773412225470167014620 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * Copyright © 2006 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-path-private.h" #include "cairo-path-fixed-private.h" static const cairo_path_t _cairo_path_nil = { CAIRO_STATUS_NO_MEMORY, NULL, 0 }; /* Closure for path interpretation. */ typedef struct cairo_path_count { int count; cairo_point_t current_point; } cpc_t; static cairo_status_t _cpc_move_to (void *closure, cairo_point_t *point) { cpc_t *cpc = closure; cpc->count += 2; cpc->current_point = *point; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpc_line_to (void *closure, cairo_point_t *point) { cpc_t *cpc = closure; cpc->count += 2; cpc->current_point = *point; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpc_curve_to (void *closure, cairo_point_t *p1, cairo_point_t *p2, cairo_point_t *p3) { cpc_t *cpc = closure; cpc->count += 4; cpc->current_point = *p3; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpc_close_path (void *closure) { cpc_t *cpc = closure; cpc->count += 1; return CAIRO_STATUS_SUCCESS; } static int _cairo_path_count (cairo_path_t *path, cairo_path_fixed_t *path_fixed, double tolerance, cairo_bool_t flatten) { cairo_status_t status; cpc_t cpc; cpc.count = 0; cpc.current_point.x = 0; cpc.current_point.y = 0; if (flatten) { status = _cairo_path_fixed_interpret_flat (path_fixed, CAIRO_DIRECTION_FORWARD, _cpc_move_to, _cpc_line_to, _cpc_close_path, &cpc, tolerance); } else { status = _cairo_path_fixed_interpret (path_fixed, CAIRO_DIRECTION_FORWARD, _cpc_move_to, _cpc_line_to, _cpc_curve_to, _cpc_close_path, &cpc); } if (status) return -1; return cpc.count; } /* Closure for path interpretation. */ typedef struct cairo_path_populate { cairo_path_data_t *data; cairo_gstate_t *gstate; cairo_point_t current_point; } cpp_t; static cairo_status_t _cpp_move_to (void *closure, cairo_point_t *point) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; double x, y; x = _cairo_fixed_to_double (point->x); y = _cairo_fixed_to_double (point->y); _cairo_gstate_backend_to_user (cpp->gstate, &x, &y); data->header.type = CAIRO_PATH_MOVE_TO; data->header.length = 2; /* We index from 1 to leave room for data->header */ data[1].point.x = x; data[1].point.y = y; cpp->data += data->header.length; cpp->current_point = *point; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpp_line_to (void *closure, cairo_point_t *point) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; double x, y; x = _cairo_fixed_to_double (point->x); y = _cairo_fixed_to_double (point->y); _cairo_gstate_backend_to_user (cpp->gstate, &x, &y); data->header.type = CAIRO_PATH_LINE_TO; data->header.length = 2; /* We index from 1 to leave room for data->header */ data[1].point.x = x; data[1].point.y = y; cpp->data += data->header.length; cpp->current_point = *point; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpp_curve_to (void *closure, cairo_point_t *p1, cairo_point_t *p2, cairo_point_t *p3) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; double x1, y1; double x2, y2; double x3, y3; x1 = _cairo_fixed_to_double (p1->x); y1 = _cairo_fixed_to_double (p1->y); _cairo_gstate_backend_to_user (cpp->gstate, &x1, &y1); x2 = _cairo_fixed_to_double (p2->x); y2 = _cairo_fixed_to_double (p2->y); _cairo_gstate_backend_to_user (cpp->gstate, &x2, &y2); x3 = _cairo_fixed_to_double (p3->x); y3 = _cairo_fixed_to_double (p3->y); _cairo_gstate_backend_to_user (cpp->gstate, &x3, &y3); data->header.type = CAIRO_PATH_CURVE_TO; data->header.length = 4; /* We index from 1 to leave room for data->header */ data[1].point.x = x1; data[1].point.y = y1; data[2].point.x = x2; data[2].point.y = y2; data[3].point.x = x3; data[3].point.y = y3; cpp->data += data->header.length; cpp->current_point = *p3; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cpp_close_path (void *closure) { cpp_t *cpp = closure; cairo_path_data_t *data = cpp->data; data->header.type = CAIRO_PATH_CLOSE_PATH; data->header.length = 1; cpp->data += data->header.length; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_path_populate (cairo_path_t *path, cairo_path_fixed_t *path_fixed, cairo_gstate_t *gstate, cairo_bool_t flatten) { cairo_status_t status; cpp_t cpp; cpp.data = path->data; cpp.gstate = gstate; cpp.current_point.x = 0; cpp.current_point.y = 0; if (flatten) { double tolerance = _cairo_gstate_get_tolerance (gstate); status = _cairo_path_fixed_interpret_flat (path_fixed, CAIRO_DIRECTION_FORWARD, _cpp_move_to, _cpp_line_to, _cpp_close_path, &cpp, tolerance); } else { status = _cairo_path_fixed_interpret (path_fixed, CAIRO_DIRECTION_FORWARD, _cpp_move_to, _cpp_line_to, _cpp_curve_to, _cpp_close_path, &cpp); } if (status) return status; /* Sanity check the count */ assert (cpp.data - path->data == path->num_data); return CAIRO_STATUS_SUCCESS; } cairo_path_t * _cairo_path_create_in_error (cairo_status_t status) { cairo_path_t *path; /* special case NO_MEMORY so as to avoid allocations */ if (status == CAIRO_STATUS_NO_MEMORY) return (cairo_path_t*) &_cairo_path_nil; path = malloc (sizeof (cairo_path_t)); if (path == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_path_t*) &_cairo_path_nil; } path->num_data = 0; path->data = NULL; path->status = status; return path; } static cairo_path_t * _cairo_path_create_internal (cairo_path_fixed_t *path_fixed, cairo_gstate_t *gstate, cairo_bool_t flatten) { cairo_path_t *path; path = malloc (sizeof (cairo_path_t)); if (path == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_path_t*) &_cairo_path_nil; } path->num_data = _cairo_path_count (path, path_fixed, _cairo_gstate_get_tolerance (gstate), flatten); if (path->num_data < 0) { free (path); return (cairo_path_t*) &_cairo_path_nil; } if (path->num_data) { path->data = _cairo_malloc_ab (path->num_data, sizeof (cairo_path_data_t)); if (path->data == NULL) { free (path); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_path_t*) &_cairo_path_nil; } path->status = _cairo_path_populate (path, path_fixed, gstate, flatten); } else { path->data = NULL; path->status = CAIRO_STATUS_SUCCESS; } return path; } /** * cairo_path_destroy: * @path: a path previously returned by either cairo_copy_path() or * cairo_copy_path_flat(). * * Immediately releases all memory associated with @path. After a call * to cairo_path_destroy() the @path pointer is no longer valid and * should not be used further. * * Note: cairo_path_destroy() should only be called with a * pointer to a #cairo_path_t returned by a cairo function. Any path * that is created manually (ie. outside of cairo) should be destroyed * manually as well. **/ void cairo_path_destroy (cairo_path_t *path) { if (path == NULL || path == &_cairo_path_nil) return; if (path->data) free (path->data); free (path); } /** * _cairo_path_create: * @path: a fixed-point, device-space path to be converted and copied * @gstate: the current graphics state * * Creates a user-space #cairo_path_t copy of the given device-space * @path. The @gstate parameter provides the inverse CTM for the * conversion. * * Return value: the new copy of the path. If there is insufficient * memory a pointer to a special static nil #cairo_path_t will be * returned instead with status==%CAIRO_STATUS_NO_MEMORY and * data==%NULL. **/ cairo_path_t * _cairo_path_create (cairo_path_fixed_t *path, cairo_gstate_t *gstate) { return _cairo_path_create_internal (path, gstate, FALSE); } /** * _cairo_path_create_flat: * @path: a fixed-point, device-space path to be flattened, converted and copied * @gstate: the current graphics state * * Creates a flattened, user-space #cairo_path_t copy of the given * device-space @path. The @gstate parameter provide the inverse CTM * for the conversion, as well as the tolerance value to control the * accuracy of the flattening. * * Return value: the flattened copy of the path. If there is insufficient * memory a pointer to a special static nil #cairo_path_t will be * returned instead with status==%CAIRO_STATUS_NO_MEMORY and * data==%NULL. **/ cairo_path_t * _cairo_path_create_flat (cairo_path_fixed_t *path, cairo_gstate_t *gstate) { return _cairo_path_create_internal (path, gstate, TRUE); } /** * _cairo_path_append_to_context: * @path: the path data to be appended * @cr: a cairo context * * Append @path to the current path within @cr. * * Return value: %CAIRO_STATUS_INVALID_PATH_DATA if the data in @path * is invalid, and %CAIRO_STATUS_SUCCESS otherwise. **/ cairo_status_t _cairo_path_append_to_context (const cairo_path_t *path, cairo_t *cr) { int i; cairo_path_data_t *p; cairo_status_t status; for (i=0; i < path->num_data; i += path->data[i].header.length) { p = &path->data[i]; switch (p->header.type) { case CAIRO_PATH_MOVE_TO: if (p->header.length < 2) return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); cairo_move_to (cr, p[1].point.x, p[1].point.y); break; case CAIRO_PATH_LINE_TO: if (p->header.length < 2) return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); cairo_line_to (cr, p[1].point.x, p[1].point.y); break; case CAIRO_PATH_CURVE_TO: if (p->header.length < 4) return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); cairo_curve_to (cr, p[1].point.x, p[1].point.y, p[2].point.x, p[2].point.y, p[3].point.x, p[3].point.y); break; case CAIRO_PATH_CLOSE_PATH: if (p->header.length < 1) return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); cairo_close_path (cr); break; default: return _cairo_error (CAIRO_STATUS_INVALID_PATH_DATA); } status = cairo_status (cr); if (status) return status; } return CAIRO_STATUS_SUCCESS; } libgdiplus-2.11/cairo/src/cairo-quartz-image.h0000664000175000017500000000404712225470167016267 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2008 Mozilla Corporation * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Mozilla Corporation. * * Contributor(s): * Vladimir Vukicevic */ #ifndef CAIRO_QUARTZ_IMAGE_H #define CAIRO_QUARTZ_IMAGE_H #include #if CAIRO_HAS_QUARTZ_IMAGE_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_quartz_image_surface_create (cairo_surface_t *image_surface); cairo_public cairo_surface_t * cairo_quartz_image_surface_get_image (cairo_surface_t *surface); CAIRO_END_DECLS #else /* CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ # error Cairo was not compiled with support for the quartz-image backend #endif /* CAIRO_HAS_QUARTZ_IMAGE_SURFACE */ #endif /* CAIRO_QUARTZ_IMAGE_H */ libgdiplus-2.11/cairo/src/cairo-beos.h0000664000175000017500000000372112225470167014607 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Christian Biesinger * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Christian Biesinger * * * Contributor(s): */ #ifndef CAIRO_BEOS_H #define CAIRO_BEOS_H #include #if CAIRO_HAS_BEOS_SURFACE #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_beos_surface_create (BView* view); cairo_public cairo_surface_t * cairo_beos_surface_create_for_bitmap (BView* view, BBitmap* bmp); CAIRO_END_DECLS #else /* CAIRO_HAS_BEOS_SURFACE */ # error Cairo was not compiled with support for the beos backend #endif /* CAIRO_HAS_BEOS_SURFACE */ #endif /* CAIRO_BEOS_H */ libgdiplus-2.11/cairo/src/cairo-xlib-private.h0000664000175000017500000001163212225470167016265 00000000000000/* Cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. */ #ifndef CAIRO_XLIB_PRIVATE_H #define CAIRO_XLIB_PRIVATE_H #include "cairo-xlib.h" #include "cairo-compiler-private.h" #include "cairo-freelist-private.h" #include "cairo-mutex-private.h" #include "cairo-reference-count-private.h" typedef struct _cairo_xlib_display cairo_xlib_display_t; typedef struct _cairo_xlib_hook cairo_xlib_hook_t; typedef struct _cairo_xlib_job cairo_xlib_job_t; typedef void (*cairo_xlib_notify_func) (Display *, void *); typedef void (*cairo_xlib_notify_resource_func) (Display *, XID); struct _cairo_xlib_hook { cairo_xlib_hook_t *next; void (*func) (Display *display, void *data); void *data; const void *key; }; struct _cairo_xlib_display { cairo_xlib_display_t *next; cairo_reference_count_t ref_count; cairo_mutex_t mutex; Display *display; cairo_xlib_screen_info_t *screens; cairo_xlib_job_t *workqueue; cairo_freelist_t wq_freelist; cairo_freelist_t hook_freelist; cairo_xlib_hook_t *close_display_hooks; unsigned int buggy_repeat :1; unsigned int closed :1; }; typedef struct _cairo_xlib_visual_info { VisualID visualid; XColor colors[256]; unsigned long rgb333_to_pseudocolor[512]; } cairo_xlib_visual_info_t; struct _cairo_xlib_screen_info { cairo_xlib_screen_info_t *next; cairo_reference_count_t ref_count; cairo_xlib_display_t *display; Screen *screen; cairo_bool_t has_render; cairo_font_options_t font_options; GC gc[9]; unsigned int gc_needs_clip_reset; cairo_array_t visuals; }; cairo_private cairo_xlib_display_t * _cairo_xlib_display_get (Display *display); cairo_private cairo_xlib_display_t * _cairo_xlib_display_reference (cairo_xlib_display_t *info); cairo_private void _cairo_xlib_display_destroy (cairo_xlib_display_t *info); cairo_private cairo_bool_t _cairo_xlib_add_close_display_hook (Display *display, void (*func) (Display *, void *), void *data, const void *key); cairo_private void _cairo_xlib_remove_close_display_hooks (Display *display, const void *key); cairo_private cairo_status_t _cairo_xlib_display_queue_work (cairo_xlib_display_t *display, cairo_xlib_notify_func notify, void *data, void (*destroy)(void *)); cairo_private cairo_status_t _cairo_xlib_display_queue_resource (cairo_xlib_display_t *display, cairo_xlib_notify_resource_func notify, XID resource); cairo_private void _cairo_xlib_display_notify (cairo_xlib_display_t *display); cairo_private cairo_xlib_screen_info_t * _cairo_xlib_screen_info_get (Display *display, Screen *screen); cairo_private cairo_xlib_screen_info_t * _cairo_xlib_screen_info_reference (cairo_xlib_screen_info_t *info); cairo_private void _cairo_xlib_screen_info_destroy (cairo_xlib_screen_info_t *info); cairo_private void _cairo_xlib_screen_info_close_display (cairo_xlib_screen_info_t *info); cairo_private GC _cairo_xlib_screen_get_gc (cairo_xlib_screen_info_t *info, int depth); cairo_private cairo_status_t _cairo_xlib_screen_put_gc (cairo_xlib_screen_info_t *info, int depth, GC gc, cairo_bool_t reset_clip); cairo_private cairo_status_t _cairo_xlib_screen_get_visual_info (cairo_xlib_screen_info_t *info, Visual *visual, cairo_xlib_visual_info_t **out); cairo_private cairo_status_t _cairo_xlib_visual_info_create (Display *dpy, int screen, VisualID visualid, cairo_xlib_visual_info_t **out); cairo_private void _cairo_xlib_visual_info_destroy (Display *dpy, cairo_xlib_visual_info_t *info); #endif /* CAIRO_XLIB_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-matrix.c0000664000175000017500000005450412225470167015163 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #define _GNU_SOURCE #include "cairoint.h" #if _XOPEN_SOURCE >= 600 || defined (_ISOC99_SOURCE) #define ISFINITE(x) isfinite (x) #else #define ISFINITE(x) ((x) * (x) >= 0.) /* check for NaNs */ #endif static void _cairo_matrix_scalar_multiply (cairo_matrix_t *matrix, double scalar); static void _cairo_matrix_compute_adjoint (cairo_matrix_t *matrix); /** * cairo_matrix_init_identity: * @matrix: a #cairo_matrix_t * * Modifies @matrix to be an identity transformation. **/ void cairo_matrix_init_identity (cairo_matrix_t *matrix) { cairo_matrix_init (matrix, 1, 0, 0, 1, 0, 0); } slim_hidden_def(cairo_matrix_init_identity); /** * cairo_matrix_init: * @matrix: a #cairo_matrix_t * @xx: xx component of the affine transformation * @yx: yx component of the affine transformation * @xy: xy component of the affine transformation * @yy: yy component of the affine transformation * @x0: X translation component of the affine transformation * @y0: Y translation component of the affine transformation * * Sets @matrix to be the affine transformation given by * @xx, @yx, @xy, @yy, @x0, @y0. The transformation is given * by: * * x_new = xx * x + xy * y + x0; * y_new = yx * x + yy * y + y0; * **/ void cairo_matrix_init (cairo_matrix_t *matrix, double xx, double yx, double xy, double yy, double x0, double y0) { matrix->xx = xx; matrix->yx = yx; matrix->xy = xy; matrix->yy = yy; matrix->x0 = x0; matrix->y0 = y0; } slim_hidden_def(cairo_matrix_init); /** * _cairo_matrix_get_affine: * @matrix: a #cairo_matrix_t * @xx: location to store xx component of matrix * @yx: location to store yx component of matrix * @xy: location to store xy component of matrix * @yy: location to store yy component of matrix * @x0: location to store x0 (X-translation component) of matrix, or %NULL * @y0: location to store y0 (Y-translation component) of matrix, or %NULL * * Gets the matrix values for the affine transformation that @matrix represents. * See cairo_matrix_init(). * * * This function is a leftover from the old public API, but is still * mildly useful as an internal means for getting at the matrix * members in a positional way. For example, when reassigning to some * external matrix type, or when renaming members to more meaningful * names (such as a,b,c,d,e,f) for particular manipulations. **/ void _cairo_matrix_get_affine (const cairo_matrix_t *matrix, double *xx, double *yx, double *xy, double *yy, double *x0, double *y0) { *xx = matrix->xx; *yx = matrix->yx; *xy = matrix->xy; *yy = matrix->yy; if (x0) *x0 = matrix->x0; if (y0) *y0 = matrix->y0; } /** * cairo_matrix_init_translate: * @matrix: a #cairo_matrix_t * @tx: amount to translate in the X direction * @ty: amount to translate in the Y direction * * Initializes @matrix to a transformation that translates by @tx and * @ty in the X and Y dimensions, respectively. **/ void cairo_matrix_init_translate (cairo_matrix_t *matrix, double tx, double ty) { cairo_matrix_init (matrix, 1, 0, 0, 1, tx, ty); } slim_hidden_def(cairo_matrix_init_translate); /** * cairo_matrix_translate: * @matrix: a #cairo_matrix_t * @tx: amount to translate in the X direction * @ty: amount to translate in the Y direction * * Applies a translation by @tx, @ty to the transformation in * @matrix. The effect of the new transformation is to first translate * the coordinates by @tx and @ty, then apply the original transformation * to the coordinates. **/ void cairo_matrix_translate (cairo_matrix_t *matrix, double tx, double ty) { cairo_matrix_t tmp; cairo_matrix_init_translate (&tmp, tx, ty); cairo_matrix_multiply (matrix, &tmp, matrix); } slim_hidden_def (cairo_matrix_translate); /** * cairo_matrix_init_scale: * @matrix: a #cairo_matrix_t * @sx: scale factor in the X direction * @sy: scale factor in the Y direction * * Initializes @matrix to a transformation that scales by @sx and @sy * in the X and Y dimensions, respectively. **/ void cairo_matrix_init_scale (cairo_matrix_t *matrix, double sx, double sy) { cairo_matrix_init (matrix, sx, 0, 0, sy, 0, 0); } slim_hidden_def(cairo_matrix_init_scale); /** * cairo_matrix_scale: * @matrix: a #cairo_matrix_t * @sx: scale factor in the X direction * @sy: scale factor in the Y direction * * Applies scaling by @sx, @sy to the transformation in @matrix. The * effect of the new transformation is to first scale the coordinates * by @sx and @sy, then apply the original transformation to the coordinates. **/ void cairo_matrix_scale (cairo_matrix_t *matrix, double sx, double sy) { cairo_matrix_t tmp; cairo_matrix_init_scale (&tmp, sx, sy); cairo_matrix_multiply (matrix, &tmp, matrix); } slim_hidden_def(cairo_matrix_scale); /** * cairo_matrix_init_rotate: * @matrix: a #cairo_matrix_t * @radians: angle of rotation, in radians. The direction of rotation * is defined such that positive angles rotate in the direction from * the positive X axis toward the positive Y axis. With the default * axis orientation of cairo, positive angles rotate in a clockwise * direction. * * Initialized @matrix to a transformation that rotates by @radians. **/ void cairo_matrix_init_rotate (cairo_matrix_t *matrix, double radians) { double s; double c; s = sin (radians); c = cos (radians); cairo_matrix_init (matrix, c, s, -s, c, 0, 0); } slim_hidden_def(cairo_matrix_init_rotate); /** * cairo_matrix_rotate: * @matrix: a #cairo_matrix_t * @radians: angle of rotation, in radians. The direction of rotation * is defined such that positive angles rotate in the direction from * the positive X axis toward the positive Y axis. With the default * axis orientation of cairo, positive angles rotate in a clockwise * direction. * * Applies rotation by @radians to the transformation in * @matrix. The effect of the new transformation is to first rotate the * coordinates by @radians, then apply the original transformation * to the coordinates. **/ void cairo_matrix_rotate (cairo_matrix_t *matrix, double radians) { cairo_matrix_t tmp; cairo_matrix_init_rotate (&tmp, radians); cairo_matrix_multiply (matrix, &tmp, matrix); } /** * cairo_matrix_multiply: * @result: a #cairo_matrix_t in which to store the result * @a: a #cairo_matrix_t * @b: a #cairo_matrix_t * * Multiplies the affine transformations in @a and @b together * and stores the result in @result. The effect of the resulting * transformation is to first apply the transformation in @a to the * coordinates and then apply the transformation in @b to the * coordinates. * * It is allowable for @result to be identical to either @a or @b. **/ /* * XXX: The ordering of the arguments to this function corresponds * to [row_vector]*A*B. If we want to use column vectors instead, * then we need to switch the two arguments and fix up all * uses. */ void cairo_matrix_multiply (cairo_matrix_t *result, const cairo_matrix_t *a, const cairo_matrix_t *b) { cairo_matrix_t r; r.xx = a->xx * b->xx + a->yx * b->xy; r.yx = a->xx * b->yx + a->yx * b->yy; r.xy = a->xy * b->xx + a->yy * b->xy; r.yy = a->xy * b->yx + a->yy * b->yy; r.x0 = a->x0 * b->xx + a->y0 * b->xy + b->x0; r.y0 = a->x0 * b->yx + a->y0 * b->yy + b->y0; *result = r; } slim_hidden_def(cairo_matrix_multiply); /** * cairo_matrix_transform_distance: * @matrix: a #cairo_matrix_t * @dx: X component of a distance vector. An in/out parameter * @dy: Y component of a distance vector. An in/out parameter * * Transforms the distance vector (@dx,@dy) by @matrix. This is * similar to cairo_matrix_transform_point() except that the translation * components of the transformation are ignored. The calculation of * the returned vector is as follows: * * * dx2 = dx1 * a + dy1 * c; * dy2 = dx1 * b + dy1 * d; * * * Affine transformations are position invariant, so the same vector * always transforms to the same vector. If (@x1,@y1) transforms * to (@x2,@y2) then (@x1+@dx1,@y1+@dy1) will transform to * (@x1+@dx2,@y1+@dy2) for all values of @x1 and @x2. **/ void cairo_matrix_transform_distance (const cairo_matrix_t *matrix, double *dx, double *dy) { double new_x, new_y; new_x = (matrix->xx * *dx + matrix->xy * *dy); new_y = (matrix->yx * *dx + matrix->yy * *dy); *dx = new_x; *dy = new_y; } slim_hidden_def(cairo_matrix_transform_distance); /** * cairo_matrix_transform_point: * @matrix: a #cairo_matrix_t * @x: X position. An in/out parameter * @y: Y position. An in/out parameter * * Transforms the point (@x, @y) by @matrix. **/ void cairo_matrix_transform_point (const cairo_matrix_t *matrix, double *x, double *y) { cairo_matrix_transform_distance (matrix, x, y); *x += matrix->x0; *y += matrix->y0; } slim_hidden_def(cairo_matrix_transform_point); void _cairo_matrix_transform_bounding_box (const cairo_matrix_t *matrix, double *x1, double *y1, double *x2, double *y2, cairo_bool_t *is_tight) { int i; double quad_x[4], quad_y[4]; double min_x, max_x; double min_y, max_y; quad_x[0] = *x1; quad_y[0] = *y1; cairo_matrix_transform_point (matrix, &quad_x[0], &quad_y[0]); quad_x[1] = *x2; quad_y[1] = *y1; cairo_matrix_transform_point (matrix, &quad_x[1], &quad_y[1]); quad_x[2] = *x1; quad_y[2] = *y2; cairo_matrix_transform_point (matrix, &quad_x[2], &quad_y[2]); quad_x[3] = *x2; quad_y[3] = *y2; cairo_matrix_transform_point (matrix, &quad_x[3], &quad_y[3]); min_x = max_x = quad_x[0]; min_y = max_y = quad_y[0]; for (i=1; i < 4; i++) { if (quad_x[i] < min_x) min_x = quad_x[i]; if (quad_x[i] > max_x) max_x = quad_x[i]; if (quad_y[i] < min_y) min_y = quad_y[i]; if (quad_y[i] > max_y) max_y = quad_y[i]; } *x1 = min_x; *y1 = min_y; *x2 = max_x; *y2 = max_y; if (is_tight) { /* it's tight if and only if the four corner points form an axis-aligned rectangle. And that's true if and only if we can derive corners 0 and 3 from corners 1 and 2 in one of two straightforward ways... We could use a tolerance here but for now we'll fall back to FALSE in the case of floating point error. */ *is_tight = (quad_x[1] == quad_x[0] && quad_y[1] == quad_y[3] && quad_x[2] == quad_x[3] && quad_y[2] == quad_y[0]) || (quad_x[1] == quad_x[3] && quad_y[1] == quad_y[0] && quad_x[2] == quad_x[0] && quad_y[2] == quad_y[3]); } } static void _cairo_matrix_scalar_multiply (cairo_matrix_t *matrix, double scalar) { matrix->xx *= scalar; matrix->yx *= scalar; matrix->xy *= scalar; matrix->yy *= scalar; matrix->x0 *= scalar; matrix->y0 *= scalar; } /* This function isn't a correct adjoint in that the implicit 1 in the homogeneous result should actually be ad-bc instead. But, since this adjoint is only used in the computation of the inverse, which divides by det (A)=ad-bc anyway, everything works out in the end. */ static void _cairo_matrix_compute_adjoint (cairo_matrix_t *matrix) { /* adj (A) = transpose (C:cofactor (A,i,j)) */ double a, b, c, d, tx, ty; _cairo_matrix_get_affine (matrix, &a, &b, &c, &d, &tx, &ty); cairo_matrix_init (matrix, d, -b, -c, a, c*ty - d*tx, b*tx - a*ty); } /** * cairo_matrix_invert: * @matrix: a #cairo_matrix_t * * Changes @matrix to be the inverse of it's original value. Not * all transformation matrices have inverses; if the matrix * collapses points together (it is degenerate), * then it has no inverse and this function will fail. * * Returns: If @matrix has an inverse, modifies @matrix to * be the inverse matrix and returns %CAIRO_STATUS_SUCCESS. Otherwise, * returns %CAIRO_STATUS_INVALID_MATRIX. **/ cairo_status_t cairo_matrix_invert (cairo_matrix_t *matrix) { /* inv (A) = 1/det (A) * adj (A) */ double det; _cairo_matrix_compute_determinant (matrix, &det); if (det == 0) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); if (! ISFINITE (det)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); _cairo_matrix_compute_adjoint (matrix); _cairo_matrix_scalar_multiply (matrix, 1 / det); return CAIRO_STATUS_SUCCESS; } slim_hidden_def(cairo_matrix_invert); cairo_bool_t _cairo_matrix_is_invertible (const cairo_matrix_t *matrix) { double det; _cairo_matrix_compute_determinant (matrix, &det); return det != 0. && ISFINITE (det); } void _cairo_matrix_compute_determinant (const cairo_matrix_t *matrix, double *det) { double a, b, c, d; a = matrix->xx; b = matrix->yx; c = matrix->xy; d = matrix->yy; *det = a*d - b*c; } /* Compute the amount that each basis vector is scaled by. */ cairo_status_t _cairo_matrix_compute_scale_factors (const cairo_matrix_t *matrix, double *sx, double *sy, int x_major) { double det; _cairo_matrix_compute_determinant (matrix, &det); if (! ISFINITE (det)) return _cairo_error (CAIRO_STATUS_INVALID_MATRIX); if (det == 0) { *sx = *sy = 0; } else { double x = x_major != 0; double y = x == 0; double major, minor; cairo_matrix_transform_distance (matrix, &x, &y); major = sqrt(x*x + y*y); /* * ignore mirroring */ if (det < 0) det = -det; if (major) minor = det / major; else minor = 0.0; if (x_major) { *sx = major; *sy = minor; } else { *sx = minor; *sy = major; } } return CAIRO_STATUS_SUCCESS; } cairo_bool_t _cairo_matrix_is_identity (const cairo_matrix_t *matrix) { return (matrix->xx == 1.0 && matrix->yx == 0.0 && matrix->xy == 0.0 && matrix->yy == 1.0 && matrix->x0 == 0.0 && matrix->y0 == 0.0); } cairo_bool_t _cairo_matrix_is_translation (const cairo_matrix_t *matrix) { return (matrix->xx == 1.0 && matrix->yx == 0.0 && matrix->xy == 0.0 && matrix->yy == 1.0); } cairo_bool_t _cairo_matrix_is_integer_translation (const cairo_matrix_t *matrix, int *itx, int *ity) { if (_cairo_matrix_is_translation (matrix)) { cairo_fixed_t x0_fixed = _cairo_fixed_from_double (matrix->x0); cairo_fixed_t y0_fixed = _cairo_fixed_from_double (matrix->y0); if (_cairo_fixed_is_integer (x0_fixed) && _cairo_fixed_is_integer (y0_fixed)) { if (itx) *itx = _cairo_fixed_integer_part (x0_fixed); if (ity) *ity = _cairo_fixed_integer_part (y0_fixed); return TRUE; } } return FALSE; } /* A circle in user space is transformed into an ellipse in device space. The following is a derivation of a formula to calculate the length of the major axis for this ellipse; this is useful for error bounds calculations. Thanks to Walter Brisken for this derivation: 1. First some notation: All capital letters represent vectors in two dimensions. A prime ' represents a transformed coordinate. Matrices are written in underlined form, ie _R_. Lowercase letters represent scalar real values. 2. The question has been posed: What is the maximum expansion factor achieved by the linear transformation X' = X _R_ where _R_ is a real-valued 2x2 matrix with entries: _R_ = [a b] [c d] . In other words, what is the maximum radius, MAX[ |X'| ], reached for any X on the unit circle ( |X| = 1 ) ? 3. Some useful formulae (A) through (C) below are standard double-angle formulae. (D) is a lesser known result and is derived below: (A) sin²(θ) = (1 - cos(2*θ))/2 (B) cos²(θ) = (1 + cos(2*θ))/2 (C) sin(θ)*cos(θ) = sin(2*θ)/2 (D) MAX[a*cos(θ) + b*sin(θ)] = sqrt(a² + b²) Proof of (D): find the maximum of the function by setting the derivative to zero: -a*sin(θ)+b*cos(θ) = 0 From this it follows that tan(θ) = b/a and hence sin(θ) = b/sqrt(a² + b²) and cos(θ) = a/sqrt(a² + b²) Thus the maximum value is MAX[a*cos(θ) + b*sin(θ)] = (a² + b²)/sqrt(a² + b²) = sqrt(a² + b²) 4. Derivation of maximum expansion To find MAX[ |X'| ] we search brute force method using calculus. The unit circle on which X is constrained is to be parameterized by t: X(θ) = (cos(θ), sin(θ)) Thus X'(θ) = X(θ) * _R_ = (cos(θ), sin(θ)) * [a b] [c d] = (a*cos(θ) + c*sin(θ), b*cos(θ) + d*sin(θ)). Define r(θ) = |X'(θ)| Thus r²(θ) = (a*cos(θ) + c*sin(θ))² + (b*cos(θ) + d*sin(θ))² = (a² + b²)*cos²(θ) + (c² + d²)*sin²(θ) + 2*(a*c + b*d)*cos(θ)*sin(θ) Now apply the double angle formulae (A) to (C) from above: r²(θ) = (a² + b² + c² + d²)/2 + (a² + b² - c² - d²)*cos(2*θ)/2 + (a*c + b*d)*sin(2*θ) = f + g*cos(φ) + h*sin(φ) Where f = (a² + b² + c² + d²)/2 g = (a² + b² - c² - d²)/2 h = (a*c + d*d) φ = 2*θ It is clear that MAX[ |X'| ] = sqrt(MAX[ r² ]). Here we determine MAX[ r² ] using (D) from above: MAX[ r² ] = f + sqrt(g² + h²) And finally MAX[ |X'| ] = sqrt( f + sqrt(g² + h²) ) Which is the solution to this problem. Walter Brisken 2004/10/08 (Note that the minor axis length is at the minimum of the above solution, which is just sqrt ( f - sqrt(g² + h²) ) given the symmetry of (D)). */ /* determine the length of the major axis of a circle of the given radius after applying the transformation matrix. */ double _cairo_matrix_transformed_circle_major_axis (cairo_matrix_t *matrix, double radius) { double a, b, c, d, f, g, h, i, j; _cairo_matrix_get_affine (matrix, &a, &b, &c, &d, NULL, NULL); i = a*a + b*b; j = c*c + d*d; f = 0.5 * (i + j); g = 0.5 * (i - j); h = a*c + b*d; return radius * sqrt (f + sqrt (g*g+h*h)); /* * we don't need the minor axis length, which is * double min = radius * sqrt (f - sqrt (g*g+h*h)); */ } void _cairo_matrix_to_pixman_matrix (const cairo_matrix_t *matrix, pixman_transform_t *pixman_transform) { static const pixman_transform_t pixman_identity_transform = {{ {1 << 16, 0, 0}, { 0, 1 << 16, 0}, { 0, 0, 1 << 16} }}; if (_cairo_matrix_is_identity (matrix)) { *pixman_transform = pixman_identity_transform; } else { cairo_matrix_t inv = *matrix; double x = 0, y = 0; pixman_vector_t vector; pixman_transform->matrix[0][0] = _cairo_fixed_16_16_from_double (matrix->xx); pixman_transform->matrix[0][1] = _cairo_fixed_16_16_from_double (matrix->xy); pixman_transform->matrix[0][2] = _cairo_fixed_16_16_from_double (matrix->x0); pixman_transform->matrix[1][0] = _cairo_fixed_16_16_from_double (matrix->yx); pixman_transform->matrix[1][1] = _cairo_fixed_16_16_from_double (matrix->yy); pixman_transform->matrix[1][2] = _cairo_fixed_16_16_from_double (matrix->y0); pixman_transform->matrix[2][0] = 0; pixman_transform->matrix[2][1] = 0; pixman_transform->matrix[2][2] = 1 << 16; /* The conversion above breaks cairo's translation invariance: * a translation of (a, b) in device space translates to * a translation of (xx * a + xy * b, yx * a + yy * b) * for cairo, while pixman uses rounded versions of xx ... yy. * This error increases as a and b get larger. * * To compensate for this, we fix the point (0, 0) in pattern * space and adjust pixman's transform to agree with cairo's at * that point. */ /* Note: If we can't invert the transformation, skip the adjustment. */ if (cairo_matrix_invert (&inv) != CAIRO_STATUS_SUCCESS) return; /* find the device space coordinate that maps to (0, 0) */ cairo_matrix_transform_point (&inv, &x, &y); /* transform the resulting device space coordinate back * to the pattern space, using pixman's transform */ vector.vector[0] = _cairo_fixed_16_16_from_double (x); vector.vector[1] = _cairo_fixed_16_16_from_double (y); vector.vector[2] = 1 << 16; if (!pixman_transform_point_3d (pixman_transform, &vector)) return; /* Ideally, the vector should now be (0, 0). We can now compensate * for the resulting error */ pixman_transform->matrix[0][2] -= vector.vector[0]; pixman_transform->matrix[1][2] -= vector.vector[1]; } } libgdiplus-2.11/cairo/src/cairo-os2-private.h0000664000175000017500000000504612225470167016034 00000000000000/* vim: set sw=4 sts=4 et cin: */ /* cairo - a vector graphics library with display and print output * * Copyright (c) 2005-2006 netlabs.org * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is * Doodle * * Contributor(s): * Peter Weilbacher */ #ifndef CAIRO_OS2_PRIVATE_H #define CAIRO_OS2_PRIVATE_H #define INCL_DOS #define INCL_DOSSEMAPHORES #define INCL_DOSERRORS #define INCL_WIN #define INCL_GPI #ifdef __WATCOMC__ # include #else # include #endif #include #include "cairoint.h" typedef struct _cairo_os2_surface { cairo_surface_t base; /* Mutex semaphore to protect private fields from concurrent access */ HMTX hmtx_use_private_fields; /* Private fields: */ HPS hps_client_window; HWND hwnd_client_window; BITMAPINFO2 bitmap_info; unsigned char *pixels; cairo_image_surface_t *image_surface; int pixel_array_lend_count; HEV hev_pixel_array_came_back; RECTL rcl_dirty_area; cairo_bool_t dirty_area_present; /* General flags: */ cairo_bool_t blit_as_changes; } cairo_os2_surface_t; #endif /* CAIRO_OS2_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-ft-font.c0000664000175000017500000023035212225470167015231 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2000 Keith Packard * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Graydon Hoare * Owen Taylor * Keith Packard * Carl Worth */ #define _BSD_SOURCE /* for strdup() */ #include "cairoint.h" #include "cairo-ft-private.h" #include #include #include #include #include FT_FREETYPE_H #include FT_OUTLINE_H #include FT_IMAGE_H #include FT_TRUETYPE_TABLES_H #if HAVE_FT_GLYPHSLOT_EMBOLDEN #include FT_SYNTHESIS_H #endif #define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) #define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) #define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) #define DOUBLE_FROM_16_16(t) ((double)(t) / 65536.0) /* This is the max number of FT_face objects we keep open at once */ #define MAX_OPEN_FACES 10 /* * The simple 2x2 matrix is converted into separate scale and shape * factors so that hinting works right */ typedef struct _cairo_ft_font_transform { double x_scale, y_scale; double shape[2][2]; } cairo_ft_font_transform_t; /* * We create an object that corresponds to a single font on the disk; * (identified by a filename/id pair) these are shared between all * fonts using that file. For cairo_ft_font_face_create_for_ft_face(), we * just create a one-off version with a permanent face value. */ typedef struct _cairo_ft_font_face cairo_ft_font_face_t; struct _cairo_ft_unscaled_font { cairo_unscaled_font_t base; cairo_bool_t from_face; /* from cairo_ft_font_face_create_for_ft_face()? */ FT_Face face; /* provided or cached face */ /* only set if from_face is false */ char *filename; int id; /* We temporarily scale the unscaled font as needed */ cairo_bool_t have_scale; cairo_matrix_t current_scale; double x_scale; /* Extracted X scale factor */ double y_scale; /* Extracted Y scale factor */ cairo_bool_t have_shape; /* true if the current scale has a non-scale component*/ cairo_matrix_t current_shape; FT_Matrix Current_Shape; cairo_mutex_t mutex; int lock_count; cairo_ft_font_face_t *faces; /* Linked list of faces for this font */ }; static int _cairo_ft_unscaled_font_keys_equal (const void *key_a, const void *key_b); static void _cairo_ft_unscaled_font_fini (cairo_ft_unscaled_font_t *unscaled); static cairo_status_t _cairo_ft_font_options_substitute (const cairo_font_options_t *options, FcPattern *pattern); typedef enum _cairo_ft_extra_flags { CAIRO_FT_OPTIONS_HINT_METRICS = (1 << 0), CAIRO_FT_OPTIONS_EMBOLDEN = (1 << 1) } cairo_ft_extra_flags_t; typedef struct _cairo_ft_options { cairo_font_options_t base; int load_flags; /* flags for FT_Load_Glyph */ cairo_ft_extra_flags_t extra_flags; /* other flags that affect results */ } cairo_ft_options_t; struct _cairo_ft_font_face { cairo_font_face_t base; cairo_ft_unscaled_font_t *unscaled; cairo_ft_options_t ft_options; cairo_ft_font_face_t *next; }; static const cairo_unscaled_font_backend_t cairo_ft_unscaled_font_backend; /* * We maintain a hash table to map file/id => #cairo_ft_unscaled_font_t. * The hash table itself isn't limited in size. However, we limit the * number of FT_Face objects we keep around; when we've exceeded that * limit and need to create a new FT_Face, we dump the FT_Face from a * random #cairo_ft_unscaled_font_t which has an unlocked FT_Face, (if * there are any). */ typedef struct _cairo_ft_unscaled_font_map { cairo_hash_table_t *hash_table; FT_Library ft_library; int num_open_faces; } cairo_ft_unscaled_font_map_t; static cairo_ft_unscaled_font_map_t *cairo_ft_unscaled_font_map = NULL; static void _font_map_release_face_lock_held (cairo_ft_unscaled_font_map_t *font_map, cairo_ft_unscaled_font_t *unscaled) { if (unscaled->face) { FT_Done_Face (unscaled->face); unscaled->face = NULL; unscaled->have_scale = FALSE; font_map->num_open_faces--; } } static void _cairo_ft_unscaled_font_map_create (void) { cairo_ft_unscaled_font_map_t *font_map; /* This function is only intended to be called from * _cairo_ft_unscaled_font_map_lock. So we'll crash if we can * detect some other call path. */ assert (cairo_ft_unscaled_font_map == NULL); font_map = malloc (sizeof (cairo_ft_unscaled_font_map_t)); if (font_map == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); goto FAIL; } font_map->hash_table = _cairo_hash_table_create (_cairo_ft_unscaled_font_keys_equal); if (font_map->hash_table == NULL) goto FAIL; if (FT_Init_FreeType (&font_map->ft_library)) goto FAIL; font_map->num_open_faces = 0; cairo_ft_unscaled_font_map = font_map; return; FAIL: if (font_map) { if (font_map->hash_table) _cairo_hash_table_destroy (font_map->hash_table); free (font_map); } cairo_ft_unscaled_font_map = NULL; } static void _cairo_ft_unscaled_font_map_destroy (void) { cairo_ft_unscaled_font_t *unscaled; cairo_ft_unscaled_font_map_t *font_map; CAIRO_MUTEX_LOCK (_cairo_ft_unscaled_font_map_mutex); if (cairo_ft_unscaled_font_map) { font_map = cairo_ft_unscaled_font_map; /* This is rather inefficient, but destroying the hash table * is something we only do during debugging, (during * cairo_debug_reset_static_data), when efficiency is not * relevant. */ while (1) { unscaled = _cairo_hash_table_random_entry (font_map->hash_table, NULL); if (unscaled == NULL) break; _cairo_hash_table_remove (font_map->hash_table, &unscaled->base.hash_entry); _font_map_release_face_lock_held (font_map, unscaled); _cairo_ft_unscaled_font_fini (unscaled); free (unscaled); } assert (font_map->num_open_faces == 0); FT_Done_FreeType (font_map->ft_library); _cairo_hash_table_destroy (font_map->hash_table); free (font_map); cairo_ft_unscaled_font_map = NULL; } CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); } static cairo_ft_unscaled_font_map_t * _cairo_ft_unscaled_font_map_lock (void) { CAIRO_MUTEX_LOCK (_cairo_ft_unscaled_font_map_mutex); if (cairo_ft_unscaled_font_map == NULL) { _cairo_ft_unscaled_font_map_create (); if (cairo_ft_unscaled_font_map == NULL) { CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } } return cairo_ft_unscaled_font_map; } static void _cairo_ft_unscaled_font_map_unlock (void) { CAIRO_MUTEX_UNLOCK (_cairo_ft_unscaled_font_map_mutex); } static void _cairo_ft_unscaled_font_init_key (cairo_ft_unscaled_font_t *key, char *filename, int id) { unsigned long hash; key->filename = filename; key->id = id; /* 1607 is just an arbitrary prime. */ hash = _cairo_hash_string (filename); hash += ((unsigned long) id) * 1607; key->base.hash_entry.hash = hash; } /** * _cairo_ft_unscaled_font_init: * * Initialize a #cairo_ft_unscaled_font_t. * * There are two basic flavors of #cairo_ft_unscaled_font_t, one * created from an FT_Face and the other created from a filename/id * pair. These two flavors are identified as from_face and !from_face. * * To initialize a from_face font, pass filename==%NULL, id=0 and the * desired face. * * To initialize a !from_face font, pass the filename/id as desired * and face==%NULL. * * Note that the code handles these two flavors in very distinct * ways. For example there is a hash_table mapping * filename/id->#cairo_unscaled_font_t in the !from_face case, but no * parallel in the from_face case, (where the calling code would have * to do its own mapping to ensure similar sharing). **/ static cairo_status_t _cairo_ft_unscaled_font_init (cairo_ft_unscaled_font_t *unscaled, const char *filename, int id, FT_Face face) { _cairo_unscaled_font_init (&unscaled->base, &cairo_ft_unscaled_font_backend); if (face) { unscaled->from_face = TRUE; unscaled->face = face; unscaled->filename = NULL; unscaled->id = 0; } else { char *filename_copy; unscaled->from_face = FALSE; unscaled->face = NULL; filename_copy = strdup (filename); if (filename_copy == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _cairo_ft_unscaled_font_init_key (unscaled, filename_copy, id); } unscaled->have_scale = FALSE; CAIRO_MUTEX_INIT (unscaled->mutex); unscaled->lock_count = 0; unscaled->faces = NULL; return CAIRO_STATUS_SUCCESS; } cairo_bool_t _cairo_unscaled_font_is_ft (cairo_unscaled_font_t *unscaled_font) { return unscaled_font->backend == &cairo_ft_unscaled_font_backend; } /** * _cairo_ft_unscaled_font_fini: * * Free all data associated with a #cairo_ft_unscaled_font_t. * * CAUTION: The unscaled->face field must be %NULL before calling this * function. This is because the #cairo_ft_unscaled_font_t_map keeps a * count of these faces (font_map->num_open_faces) so it maintains the * unscaled->face field while it has its lock held. See * _font_map_release_face_lock_held(). **/ static void _cairo_ft_unscaled_font_fini (cairo_ft_unscaled_font_t *unscaled) { assert (unscaled->face == NULL); if (unscaled->filename) { free (unscaled->filename); unscaled->filename = NULL; } CAIRO_MUTEX_FINI (unscaled->mutex); } static int _cairo_ft_unscaled_font_keys_equal (const void *key_a, const void *key_b) { const cairo_ft_unscaled_font_t *unscaled_a = key_a; const cairo_ft_unscaled_font_t *unscaled_b = key_b; return (strcmp (unscaled_a->filename, unscaled_b->filename) == 0 && unscaled_a->id == unscaled_b->id); } /* Finds or creates a #cairo_ft_unscaled_font_t for the filename/id from * pattern. Returns a new reference to the unscaled font. */ static cairo_ft_unscaled_font_t * _cairo_ft_unscaled_font_create_for_pattern (FcPattern *pattern) { cairo_ft_unscaled_font_t key, *unscaled; cairo_ft_unscaled_font_map_t *font_map; cairo_status_t status; FcChar8 *fc_filename; char *filename; int id; if (FcPatternGetString (pattern, FC_FILE, 0, &fc_filename) != FcResultMatch) goto UNWIND; filename = (char *) fc_filename; if (FcPatternGetInteger (pattern, FC_INDEX, 0, &id) != FcResultMatch) goto UNWIND; font_map = _cairo_ft_unscaled_font_map_lock (); if (font_map == NULL) goto UNWIND; _cairo_ft_unscaled_font_init_key (&key, filename, id); /* Return existing unscaled font if it exists in the hash table. */ if (_cairo_hash_table_lookup (font_map->hash_table, &key.base.hash_entry, (cairo_hash_entry_t **) &unscaled)) { _cairo_unscaled_font_reference (&unscaled->base); _cairo_ft_unscaled_font_map_unlock (); return unscaled; } /* Otherwise create it and insert into hash table. */ unscaled = malloc (sizeof (cairo_ft_unscaled_font_t)); if (unscaled == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); goto UNWIND_FONT_MAP_LOCK; } status = _cairo_ft_unscaled_font_init (unscaled, filename, id, NULL); if (status) goto UNWIND_UNSCALED_MALLOC; status = _cairo_hash_table_insert (font_map->hash_table, &unscaled->base.hash_entry); if (status) goto UNWIND_UNSCALED_FONT_INIT; _cairo_ft_unscaled_font_map_unlock (); return unscaled; UNWIND_UNSCALED_FONT_INIT: _cairo_ft_unscaled_font_fini (unscaled); UNWIND_UNSCALED_MALLOC: free (unscaled); UNWIND_FONT_MAP_LOCK: _cairo_ft_unscaled_font_map_unlock (); UNWIND: return NULL; } static cairo_ft_unscaled_font_t * _cairo_ft_unscaled_font_create_from_face (FT_Face face) { cairo_status_t status; cairo_ft_unscaled_font_t *unscaled; unscaled = malloc (sizeof (cairo_ft_unscaled_font_t)); if (unscaled == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } status = _cairo_ft_unscaled_font_init (unscaled, NULL, 0, face); if (status) { free (unscaled); return NULL; } return unscaled; } static void _cairo_ft_unscaled_font_destroy (void *abstract_font) { cairo_ft_unscaled_font_t *unscaled = abstract_font; if (unscaled == NULL) return; if (unscaled->from_face) { /* See comments in _ft_font_face_destroy about the "zombie" state * for a _ft_font_face. */ if (unscaled->faces && !unscaled->faces->unscaled) cairo_font_face_destroy (&unscaled->faces->base); unscaled->face = NULL; } else { cairo_ft_unscaled_font_map_t *font_map; font_map = _cairo_ft_unscaled_font_map_lock (); /* All created objects must have been mapped in the font map. */ assert (font_map != NULL); _cairo_hash_table_remove (font_map->hash_table, &unscaled->base.hash_entry); _font_map_release_face_lock_held (font_map, unscaled); _cairo_ft_unscaled_font_map_unlock (); } _cairo_ft_unscaled_font_fini (unscaled); } static cairo_bool_t _has_unlocked_face (void *entry) { cairo_ft_unscaled_font_t *unscaled = entry; return (unscaled->lock_count == 0 && unscaled->face); } /* Ensures that an unscaled font has a face object. If we exceed * MAX_OPEN_FACES, try to close some. * * This differs from _cairo_ft_scaled_font_lock_face in that it doesn't * set the scale on the face, but just returns it at the last scale. */ FT_Face _cairo_ft_unscaled_font_lock_face (cairo_ft_unscaled_font_t *unscaled) { cairo_ft_unscaled_font_map_t *font_map; FT_Face face = NULL; CAIRO_MUTEX_LOCK (unscaled->mutex); unscaled->lock_count++; if (unscaled->face) return unscaled->face; /* If this unscaled font was created from an FT_Face then we just * returned it above. */ assert (!unscaled->from_face); font_map = _cairo_ft_unscaled_font_map_lock (); { assert (font_map != NULL); while (font_map->num_open_faces >= MAX_OPEN_FACES) { cairo_ft_unscaled_font_t *entry; entry = _cairo_hash_table_random_entry (font_map->hash_table, _has_unlocked_face); if (entry == NULL) break; _font_map_release_face_lock_held (font_map, entry); } } _cairo_ft_unscaled_font_map_unlock (); if (FT_New_Face (font_map->ft_library, unscaled->filename, unscaled->id, &face) != FT_Err_Ok) { unscaled->lock_count--; CAIRO_MUTEX_UNLOCK (unscaled->mutex); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } unscaled->face = face; font_map->num_open_faces++; return face; } slim_hidden_def (cairo_ft_scaled_font_lock_face); /* Unlock unscaled font locked with _cairo_ft_unscaled_font_lock_face */ void _cairo_ft_unscaled_font_unlock_face (cairo_ft_unscaled_font_t *unscaled) { assert (unscaled->lock_count > 0); unscaled->lock_count--; CAIRO_MUTEX_UNLOCK (unscaled->mutex); } slim_hidden_def (cairo_ft_scaled_font_unlock_face); static cairo_status_t _compute_transform (cairo_ft_font_transform_t *sf, cairo_matrix_t *scale) { cairo_status_t status; double x_scale, y_scale; cairo_matrix_t normalized = *scale; /* The font matrix has x and y "scale" components which we extract and * use as character scale values. These influence the way freetype * chooses hints, as well as selecting different bitmaps in * hand-rendered fonts. We also copy the normalized matrix to * freetype's transformation. */ status = _cairo_matrix_compute_scale_factors (scale, &x_scale, &y_scale, /* XXX */ 1); if (status) return status; /* FreeType docs say this about x_scale and y_scale: * "A character width or height smaller than 1pt is set to 1pt;" * So, we cap them from below at 1.0 and let the FT transform * take care of sub-1.0 scaling. */ if (x_scale < 1.0) x_scale = 1.0; if (y_scale < 1.0) y_scale = 1.0; sf->x_scale = x_scale; sf->y_scale = y_scale; cairo_matrix_scale (&normalized, 1.0 / x_scale, 1.0 / y_scale); _cairo_matrix_get_affine (&normalized, &sf->shape[0][0], &sf->shape[0][1], &sf->shape[1][0], &sf->shape[1][1], NULL, NULL); return CAIRO_STATUS_SUCCESS; } /* Temporarily scales an unscaled font to the give scale. We catch * scaling to the same size, since changing a FT_Face is expensive. */ static cairo_status_t _cairo_ft_unscaled_font_set_scale (cairo_ft_unscaled_font_t *unscaled, cairo_matrix_t *scale) { cairo_status_t status; cairo_ft_font_transform_t sf; FT_Matrix mat; FT_Error error; assert (unscaled->face != NULL); if (unscaled->have_scale && scale->xx == unscaled->current_scale.xx && scale->yx == unscaled->current_scale.yx && scale->xy == unscaled->current_scale.xy && scale->yy == unscaled->current_scale.yy) return CAIRO_STATUS_SUCCESS; unscaled->have_scale = TRUE; unscaled->current_scale = *scale; status = _compute_transform (&sf, scale); if (status) return status; unscaled->x_scale = sf.x_scale; unscaled->y_scale = sf.y_scale; mat.xx = DOUBLE_TO_16_16(sf.shape[0][0]); mat.yx = - DOUBLE_TO_16_16(sf.shape[0][1]); mat.xy = - DOUBLE_TO_16_16(sf.shape[1][0]); mat.yy = DOUBLE_TO_16_16(sf.shape[1][1]); unscaled->have_shape = (mat.xx != 0x10000 || mat.yx != 0x00000 || mat.xy != 0x00000 || mat.yy != 0x10000); unscaled->Current_Shape = mat; cairo_matrix_init (&unscaled->current_shape, sf.shape[0][0], sf.shape[0][1], sf.shape[1][0], sf.shape[1][1], 0.0, 0.0); FT_Set_Transform(unscaled->face, &mat, NULL); if ((unscaled->face->face_flags & FT_FACE_FLAG_SCALABLE) != 0) { error = FT_Set_Char_Size (unscaled->face, sf.x_scale * 64.0 + .5, sf.y_scale * 64.0 + .5, 0, 0); if (error) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } else { double min_distance = DBL_MAX; int i; int best_i = 0; for (i = 0; i < unscaled->face->num_fixed_sizes; i++) { #if HAVE_FT_BITMAP_SIZE_Y_PPEM double size = unscaled->face->available_sizes[i].y_ppem / 64.; #else double size = unscaled->face->available_sizes[i].height; #endif double distance = fabs (size - sf.y_scale); if (distance <= min_distance) { min_distance = distance; best_i = i; } } #if HAVE_FT_BITMAP_SIZE_Y_PPEM error = FT_Set_Char_Size (unscaled->face, unscaled->face->available_sizes[best_i].x_ppem, unscaled->face->available_sizes[best_i].y_ppem, 0, 0); if (error) #endif error = FT_Set_Pixel_Sizes (unscaled->face, unscaled->face->available_sizes[best_i].width, unscaled->face->available_sizes[best_i].height); if (error) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } return CAIRO_STATUS_SUCCESS; } /* Empirically-derived subpixel filtering values thanks to Keith * Packard and libXft. */ static const int filters[3][3] = { /* red */ #if 0 { 65538*4/7,65538*2/7,65538*1/7 }, /* green */ { 65536*1/4, 65536*2/4, 65537*1/4 }, /* blue */ { 65538*1/7,65538*2/7,65538*4/7 }, #endif { 65538*9/13,65538*3/13,65538*1/13 }, /* green */ { 65538*1/6, 65538*4/6, 65538*1/6 }, /* blue */ { 65538*1/13,65538*3/13,65538*9/13 }, }; /* Fills in val->image with an image surface created from @bitmap */ static cairo_status_t _get_bitmap_surface (FT_Bitmap *bitmap, cairo_bool_t own_buffer, cairo_font_options_t *font_options, cairo_image_surface_t **surface) { int width, height, stride; unsigned char *data; int format = CAIRO_FORMAT_A8; cairo_bool_t subpixel = FALSE; width = bitmap->width; height = bitmap->rows; if (width == 0 || height == 0) { *surface = (cairo_image_surface_t *) cairo_image_surface_create_for_data (NULL, format, 0, 0, 0); return (*surface)->base.status; } switch (bitmap->pixel_mode) { case FT_PIXEL_MODE_MONO: stride = (((width + 31) & ~31) >> 3); if (own_buffer) { data = bitmap->buffer; assert (stride == bitmap->pitch); } else { data = _cairo_malloc_ab (height, stride); if (!data) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (stride == bitmap->pitch) { memcpy (data, bitmap->buffer, stride * height); } else { int i; unsigned char *source, *dest; source = bitmap->buffer; dest = data; for (i = height; i; i--) { memcpy (dest, source, bitmap->pitch); memset (dest + bitmap->pitch, '\0', stride - bitmap->pitch); source += bitmap->pitch; dest += stride; } } } #ifndef WORDS_BIGENDIAN { unsigned char *d = data; int count = stride * height; while (count--) { *d = CAIRO_BITSWAP8 (*d); d++; } } #endif format = CAIRO_FORMAT_A1; break; case FT_PIXEL_MODE_LCD: case FT_PIXEL_MODE_LCD_V: case FT_PIXEL_MODE_GRAY: switch (font_options->antialias) { case CAIRO_ANTIALIAS_DEFAULT: case CAIRO_ANTIALIAS_GRAY: case CAIRO_ANTIALIAS_NONE: default: stride = bitmap->pitch; if (own_buffer) { data = bitmap->buffer; } else { data = _cairo_malloc_ab (height, stride); if (!data) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (data, bitmap->buffer, stride * height); } format = CAIRO_FORMAT_A8; break; case CAIRO_ANTIALIAS_SUBPIXEL: { int x, y; unsigned char *in_line, *out_line, *in; unsigned int *out; unsigned int red, green, blue; int rf, gf, bf; int s; int o, os; unsigned char *data_rgba; unsigned int width_rgba, stride_rgba; int vmul = 1; int hmul = 1; switch (font_options->subpixel_order) { case CAIRO_SUBPIXEL_ORDER_DEFAULT: case CAIRO_SUBPIXEL_ORDER_RGB: case CAIRO_SUBPIXEL_ORDER_BGR: default: width /= 3; hmul = 3; break; case CAIRO_SUBPIXEL_ORDER_VRGB: case CAIRO_SUBPIXEL_ORDER_VBGR: vmul = 3; height /= 3; break; } /* * Filter the glyph to soften the color fringes */ width_rgba = width; stride = bitmap->pitch; stride_rgba = (width_rgba * 4 + 3) & ~3; data_rgba = calloc (stride_rgba, height); if (data_rgba == NULL) { if (own_buffer) free (bitmap->buffer); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } os = 1; switch (font_options->subpixel_order) { case CAIRO_SUBPIXEL_ORDER_VRGB: os = stride; case CAIRO_SUBPIXEL_ORDER_DEFAULT: case CAIRO_SUBPIXEL_ORDER_RGB: default: rf = 0; gf = 1; bf = 2; break; case CAIRO_SUBPIXEL_ORDER_VBGR: os = stride; case CAIRO_SUBPIXEL_ORDER_BGR: bf = 0; gf = 1; rf = 2; break; } in_line = bitmap->buffer; out_line = data_rgba; for (y = 0; y < height; y++) { in = in_line; out = (unsigned int *) out_line; in_line += stride * vmul; out_line += stride_rgba; for (x = 0; x < width * hmul; x += hmul) { red = green = blue = 0; o = 0; for (s = 0; s < 3; s++) { red += filters[rf][s]*in[x+o]; green += filters[gf][s]*in[x+o]; blue += filters[bf][s]*in[x+o]; o += os; } red = red / 65536; green = green / 65536; blue = blue / 65536; *out++ = (green << 24) | (red << 16) | (green << 8) | blue; } } /* Images here are stored in native format. The * backend must convert to its own format as needed */ if (own_buffer) free (bitmap->buffer); data = data_rgba; stride = stride_rgba; format = CAIRO_FORMAT_ARGB32; subpixel = TRUE; break; } } break; case FT_PIXEL_MODE_GRAY2: case FT_PIXEL_MODE_GRAY4: /* These could be triggered by very rare types of TrueType fonts */ default: if (own_buffer) free (bitmap->buffer); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } *surface = (cairo_image_surface_t *) cairo_image_surface_create_for_data (data, format, width, height, stride); if ((*surface)->base.status) { free (data); return (*surface)->base.status; } if (subpixel) pixman_image_set_component_alpha ((*surface)->pixman_image, TRUE); _cairo_image_surface_assume_ownership_of_data ((*surface)); return CAIRO_STATUS_SUCCESS; } /* Converts an outline FT_GlyphSlot into an image * * This could go through _render_glyph_bitmap as well, letting * FreeType convert the outline to a bitmap, but doing it ourselves * has two minor advantages: first, we save a copy of the bitmap * buffer: we can directly use the buffer that FreeType renders * into. * * Second, it may help when we add support for subpixel * rendering: the Xft code does it this way. (Keith thinks that * it may also be possible to get the subpixel rendering with * FT_Render_Glyph: something worth looking into in more detail * when we add subpixel support. If so, we may want to eliminate * this version of the code path entirely. */ static cairo_status_t _render_glyph_outline (FT_Face face, cairo_font_options_t *font_options, cairo_image_surface_t **surface) { FT_GlyphSlot glyphslot = face->glyph; FT_Outline *outline = &glyphslot->outline; FT_Bitmap bitmap; FT_BBox cbox; FT_Matrix matrix; int hmul = 1; int vmul = 1; unsigned int width, height, stride; cairo_bool_t subpixel = FALSE; cairo_status_t status; FT_Outline_Get_CBox (outline, &cbox); cbox.xMin &= -64; cbox.yMin &= -64; cbox.xMax = (cbox.xMax + 63) & -64; cbox.yMax = (cbox.yMax + 63) & -64; width = (unsigned int) ((cbox.xMax - cbox.xMin) >> 6); height = (unsigned int) ((cbox.yMax - cbox.yMin) >> 6); stride = (width * hmul + 3) & ~3; if (width * height == 0) { cairo_format_t format; /* Looks like fb handles zero-sized images just fine */ switch (font_options->antialias) { case CAIRO_ANTIALIAS_NONE: format = CAIRO_FORMAT_A1; break; case CAIRO_ANTIALIAS_SUBPIXEL: format= CAIRO_FORMAT_ARGB32; break; case CAIRO_ANTIALIAS_DEFAULT: case CAIRO_ANTIALIAS_GRAY: default: format = CAIRO_FORMAT_A8; break; } (*surface) = (cairo_image_surface_t *) cairo_image_surface_create_for_data (NULL, format, 0, 0, 0); if ((*surface)->base.status) return (*surface)->base.status; } else { matrix.xx = matrix.yy = 0x10000L; matrix.xy = matrix.yx = 0; switch (font_options->antialias) { case CAIRO_ANTIALIAS_NONE: bitmap.pixel_mode = FT_PIXEL_MODE_MONO; bitmap.num_grays = 1; stride = ((width + 31) & -32) >> 3; break; case CAIRO_ANTIALIAS_DEFAULT: case CAIRO_ANTIALIAS_GRAY: bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; bitmap.num_grays = 256; stride = (width + 3) & -4; break; case CAIRO_ANTIALIAS_SUBPIXEL: switch (font_options->subpixel_order) { case CAIRO_SUBPIXEL_ORDER_RGB: case CAIRO_SUBPIXEL_ORDER_BGR: case CAIRO_SUBPIXEL_ORDER_DEFAULT: default: matrix.xx *= 3; hmul = 3; subpixel = TRUE; break; case CAIRO_SUBPIXEL_ORDER_VRGB: case CAIRO_SUBPIXEL_ORDER_VBGR: matrix.yy *= 3; vmul = 3; subpixel = TRUE; break; } FT_Outline_Transform (outline, &matrix); bitmap.pixel_mode = FT_PIXEL_MODE_GRAY; bitmap.num_grays = 256; stride = (width * hmul + 3) & -4; } bitmap.pitch = stride; bitmap.width = width * hmul; bitmap.rows = height * vmul; bitmap.buffer = calloc (stride, bitmap.rows); if (bitmap.buffer == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); FT_Outline_Translate (outline, -cbox.xMin*hmul, -cbox.yMin*vmul); if (FT_Outline_Get_Bitmap (glyphslot->library, outline, &bitmap) != 0) { free (bitmap.buffer); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } status = _get_bitmap_surface (&bitmap, TRUE, font_options, surface); if (status) return status; } /* * Note: the font's coordinate system is upside down from ours, so the * Y coordinate of the control box needs to be negated. Moreover, device * offsets are position of glyph origin relative to top left while xMin * and yMax are offsets of top left relative to origin. Another negation. */ cairo_surface_set_device_offset (&(*surface)->base, floor (-(double) cbox.xMin / 64.0), floor (+(double) cbox.yMax / 64.0)); return CAIRO_STATUS_SUCCESS; } /* Converts a bitmap (or other) FT_GlyphSlot into an image */ static cairo_status_t _render_glyph_bitmap (FT_Face face, cairo_font_options_t *font_options, cairo_image_surface_t **surface) { FT_GlyphSlot glyphslot = face->glyph; cairo_status_t status = CAIRO_STATUS_SUCCESS; FT_Error error; /* According to the FreeType docs, glyphslot->format could be * something other than FT_GLYPH_FORMAT_OUTLINE or * FT_GLYPH_FORMAT_BITMAP. Calling FT_Render_Glyph gives FreeType * the opportunity to convert such to * bitmap. FT_GLYPH_FORMAT_COMPOSITE will not be encountered since * we avoid the FT_LOAD_NO_RECURSE flag. */ error = FT_Render_Glyph (glyphslot, FT_RENDER_MODE_NORMAL); /* XXX ignoring all other errors for now. They are not fatal, typically * just a glyph-not-found. */ if (error == FT_Err_Out_Of_Memory) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _get_bitmap_surface (&glyphslot->bitmap, FALSE, font_options, surface); if (status) return status; /* * Note: the font's coordinate system is upside down from ours, so the * Y coordinate of the control box needs to be negated. Moreover, device * offsets are position of glyph origin relative to top left while * bitmap_left and bitmap_top are offsets of top left relative to origin. * Another negation. */ cairo_surface_set_device_offset (&(*surface)->base, -glyphslot->bitmap_left, +glyphslot->bitmap_top); return status; } static cairo_status_t _transform_glyph_bitmap (cairo_matrix_t * shape, cairo_image_surface_t ** surface) { cairo_matrix_t original_to_transformed; cairo_matrix_t transformed_to_original; cairo_image_surface_t *old_image; cairo_surface_t *image; double x[4], y[4]; double origin_x, origin_y; int orig_width, orig_height; int i; int x_min, y_min, x_max, y_max; int width, height; cairo_status_t status; cairo_surface_pattern_t pattern; /* We want to compute a transform that takes the origin * (device_x_offset, device_y_offset) to 0,0, then applies * the "shape" portion of the font transform */ original_to_transformed = *shape; cairo_surface_get_device_offset (&(*surface)->base, &origin_x, &origin_y); orig_width = cairo_image_surface_get_width (&(*surface)->base); orig_height = cairo_image_surface_get_height (&(*surface)->base); cairo_matrix_translate (&original_to_transformed, -origin_x, -origin_y); /* Find the bounding box of the original bitmap under that * transform */ x[0] = 0; y[0] = 0; x[1] = orig_width; y[1] = 0; x[2] = orig_width; y[2] = orig_height; x[3] = 0; y[3] = orig_height; for (i = 0; i < 4; i++) cairo_matrix_transform_point (&original_to_transformed, &x[i], &y[i]); x_min = floor (x[0]); y_min = floor (y[0]); x_max = ceil (x[0]); y_max = ceil (y[0]); for (i = 1; i < 4; i++) { if (x[i] < x_min) x_min = floor (x[i]); else if (x[i] > x_max) x_max = ceil (x[i]); if (y[i] < y_min) y_min = floor (y[i]); else if (y[i] > y_max) y_max = ceil (y[i]); } /* Adjust the transform so that the bounding box starts at 0,0 ... * this gives our final transform from original bitmap to transformed * bitmap. */ original_to_transformed.x0 -= x_min; original_to_transformed.y0 -= y_min; /* Create the transformed bitmap */ width = x_max - x_min; height = y_max - y_min; transformed_to_original = original_to_transformed; status = cairo_matrix_invert (&transformed_to_original); if (status) return status; /* We need to pad out the width to 32-bit intervals for cairo-xlib-surface.c */ width = (width + 3) & ~3; image = cairo_image_surface_create (CAIRO_FORMAT_A8, width, height); if (image->status) return image->status; /* Initialize it to empty */ status = _cairo_surface_fill_rectangle (image, CAIRO_OPERATOR_CLEAR, CAIRO_COLOR_TRANSPARENT, 0, 0, width, height); if (status) { cairo_surface_destroy (image); return status; } /* Draw the original bitmap transformed into the new bitmap */ _cairo_pattern_init_for_surface (&pattern, &(*surface)->base); cairo_pattern_set_matrix (&pattern.base, &transformed_to_original); status = _cairo_surface_composite (CAIRO_OPERATOR_OVER, &pattern.base, NULL, image, 0, 0, 0, 0, 0, 0, width, height); _cairo_pattern_fini (&pattern.base); if (status) { cairo_surface_destroy (image); return status; } /* Now update the cache entry for the new bitmap, recomputing * the origin based on the final transform. */ cairo_matrix_transform_point (&original_to_transformed, &origin_x, &origin_y); old_image = (*surface); (*surface) = (cairo_image_surface_t *)image; cairo_surface_destroy (&old_image->base); cairo_surface_set_device_offset (&(*surface)->base, _cairo_lround (origin_x), _cairo_lround (origin_y)); return status; } static const cairo_unscaled_font_backend_t cairo_ft_unscaled_font_backend = { _cairo_ft_unscaled_font_destroy, #if 0 _cairo_ft_unscaled_font_create_glyph #endif }; /* #cairo_ft_scaled_font_t */ typedef struct _cairo_ft_scaled_font { cairo_scaled_font_t base; cairo_ft_unscaled_font_t *unscaled; cairo_ft_options_t ft_options; } cairo_ft_scaled_font_t; const cairo_scaled_font_backend_t cairo_ft_scaled_font_backend; /* The load flags passed to FT_Load_Glyph control aspects like hinting and * antialiasing. Here we compute them from the fields of a FcPattern. */ static void _get_pattern_ft_options (FcPattern *pattern, cairo_ft_options_t *ret) { FcBool antialias, vertical_layout, hinting, autohint, bitmap, embolden; cairo_ft_options_t ft_options; int rgba; #ifdef FC_HINT_STYLE int hintstyle; #endif _cairo_font_options_init_default (&ft_options.base); ft_options.load_flags = FT_LOAD_DEFAULT; ft_options.extra_flags = 0; #ifndef FC_EMBEDDED_BITMAP #define FC_EMBEDDED_BITMAP "embeddedbitmap" #endif /* Check whether to force use of embedded bitmaps */ if (FcPatternGetBool (pattern, FC_EMBEDDED_BITMAP, 0, &bitmap) != FcResultMatch) bitmap = FcFalse; /* disable antialiasing if requested */ if (FcPatternGetBool (pattern, FC_ANTIALIAS, 0, &antialias) != FcResultMatch) antialias = FcTrue; if (antialias) { cairo_subpixel_order_t subpixel_order; /* disable hinting if requested */ if (FcPatternGetBool (pattern, FC_HINTING, 0, &hinting) != FcResultMatch) hinting = FcTrue; if (FcPatternGetInteger (pattern, FC_RGBA, 0, &rgba) != FcResultMatch) rgba = FC_RGBA_UNKNOWN; switch (rgba) { case FC_RGBA_RGB: subpixel_order = CAIRO_SUBPIXEL_ORDER_RGB; break; case FC_RGBA_BGR: subpixel_order = CAIRO_SUBPIXEL_ORDER_BGR; break; case FC_RGBA_VRGB: subpixel_order = CAIRO_SUBPIXEL_ORDER_VRGB; break; case FC_RGBA_VBGR: subpixel_order = CAIRO_SUBPIXEL_ORDER_VBGR; break; case FC_RGBA_UNKNOWN: case FC_RGBA_NONE: default: subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; break; } if (subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) { ft_options.base.subpixel_order = subpixel_order; ft_options.base.antialias = CAIRO_ANTIALIAS_SUBPIXEL; } #ifdef FC_HINT_STYLE if (FcPatternGetInteger (pattern, FC_HINT_STYLE, 0, &hintstyle) != FcResultMatch) hintstyle = FC_HINT_FULL; if (!hinting) hintstyle = FC_HINT_NONE; switch (hintstyle) { case FC_HINT_NONE: ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE; break; case FC_HINT_SLIGHT: ft_options.base.hint_style = CAIRO_HINT_STYLE_SLIGHT; break; case FC_HINT_MEDIUM: default: ft_options.base.hint_style = CAIRO_HINT_STYLE_MEDIUM; break; case FC_HINT_FULL: ft_options.base.hint_style = CAIRO_HINT_STYLE_FULL; break; } #else /* !FC_HINT_STYLE */ if (!hinting) { ft_options.base.hint_style = CAIRO_HINT_STYLE_NONE; } #endif /* FC_HINT_STYLE */ /* Force embedded bitmaps off if no hinting requested */ if (ft_options.base.hint_style == CAIRO_HINT_STYLE_NONE) bitmap = FcFalse; if (!bitmap) ft_options.load_flags |= FT_LOAD_NO_BITMAP; } else { ft_options.base.antialias = CAIRO_ANTIALIAS_NONE; } /* force autohinting if requested */ if (FcPatternGetBool (pattern, FC_AUTOHINT, 0, &autohint) != FcResultMatch) autohint = FcFalse; if (autohint) ft_options.load_flags |= FT_LOAD_FORCE_AUTOHINT; if (FcPatternGetBool (pattern, FC_VERTICAL_LAYOUT, 0, &vertical_layout) != FcResultMatch) vertical_layout = FcFalse; if (vertical_layout) ft_options.load_flags |= FT_LOAD_VERTICAL_LAYOUT; #ifndef FC_EMBOLDEN #define FC_EMBOLDEN "embolden" #endif if (FcPatternGetBool (pattern, FC_EMBOLDEN, 0, &embolden) != FcResultMatch) embolden = FcFalse; if (embolden) ft_options.extra_flags |= CAIRO_FT_OPTIONS_EMBOLDEN; *ret = ft_options; } static void _cairo_ft_options_merge (cairo_ft_options_t *options, cairo_ft_options_t *other) { int load_flags = other->load_flags; int load_target = FT_LOAD_TARGET_NORMAL; /* clear load target mode */ load_flags &= ~(FT_LOAD_TARGET_(FT_LOAD_TARGET_MODE(other->load_flags))); if (load_flags & FT_LOAD_NO_HINTING) other->base.hint_style = CAIRO_HINT_STYLE_NONE; if (other->base.antialias == CAIRO_ANTIALIAS_NONE || options->base.antialias == CAIRO_ANTIALIAS_NONE) { options->base.antialias = CAIRO_ANTIALIAS_NONE; options->base.subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; } if (other->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL && (options->base.antialias == CAIRO_ANTIALIAS_DEFAULT || options->base.antialias == CAIRO_ANTIALIAS_GRAY)) { options->base.antialias = CAIRO_ANTIALIAS_SUBPIXEL; options->base.subpixel_order = other->base.subpixel_order; } if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT) options->base.hint_style = other->base.hint_style; if (other->base.hint_style == CAIRO_HINT_STYLE_NONE) options->base.hint_style = CAIRO_HINT_STYLE_NONE; if (options->base.antialias == CAIRO_ANTIALIAS_NONE) { if (options->base.hint_style == CAIRO_HINT_STYLE_NONE) load_flags |= FT_LOAD_NO_HINTING; else load_target = FT_LOAD_TARGET_MONO; load_flags |= FT_LOAD_MONOCHROME; } else { switch (options->base.hint_style) { case CAIRO_HINT_STYLE_NONE: load_flags |= FT_LOAD_NO_HINTING; break; case CAIRO_HINT_STYLE_SLIGHT: load_target = FT_LOAD_TARGET_LIGHT; break; case CAIRO_HINT_STYLE_MEDIUM: break; case CAIRO_HINT_STYLE_FULL: case CAIRO_HINT_STYLE_DEFAULT: if (options->base.antialias == CAIRO_ANTIALIAS_SUBPIXEL) { switch (options->base.subpixel_order) { case CAIRO_SUBPIXEL_ORDER_DEFAULT: case CAIRO_SUBPIXEL_ORDER_RGB: case CAIRO_SUBPIXEL_ORDER_BGR: load_target |= FT_LOAD_TARGET_LCD; break; case CAIRO_SUBPIXEL_ORDER_VRGB: case CAIRO_SUBPIXEL_ORDER_VBGR: load_target |= FT_LOAD_TARGET_LCD_V; break; } } break; } } options->load_flags = load_flags | load_target; options->extra_flags = other->extra_flags; if (options->base.hint_metrics != CAIRO_HINT_METRICS_OFF) options->extra_flags |= CAIRO_FT_OPTIONS_HINT_METRICS; } static cairo_status_t _cairo_ft_scaled_font_create (cairo_ft_unscaled_font_t *unscaled, cairo_font_face_t *font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_ft_options_t ft_options, cairo_scaled_font_t **font_out) { cairo_ft_scaled_font_t *scaled_font; FT_Face face; FT_Size_Metrics *metrics; cairo_font_extents_t fs_metrics; cairo_status_t status; face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return _cairo_error (CAIRO_STATUS_NO_MEMORY); scaled_font = malloc (sizeof(cairo_ft_scaled_font_t)); if (scaled_font == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } _cairo_unscaled_font_reference (&unscaled->base); scaled_font->unscaled = unscaled; _cairo_font_options_init_copy (&scaled_font->ft_options.base, options); _cairo_ft_options_merge (&scaled_font->ft_options, &ft_options); status = _cairo_scaled_font_init (&scaled_font->base, font_face, font_matrix, ctm, options, &cairo_ft_scaled_font_backend); if (status) { _cairo_unscaled_font_destroy (&unscaled->base); free (scaled_font); goto FAIL; } status = _cairo_ft_unscaled_font_set_scale (unscaled, &scaled_font->base.scale); if (status) { _cairo_unscaled_font_destroy (&unscaled->base); free (scaled_font); goto FAIL; } metrics = &face->size->metrics; /* * Get to unscaled metrics so that the upper level can get back to * user space * * Also use this path for bitmap-only fonts. The other branch uses * face members that are only relevant for scalable fonts. This is * detected by simply checking for units_per_EM==0. */ if (scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF || face->units_per_EM == 0) { double x_factor, y_factor; if (unscaled->x_scale == 0) x_factor = 0; else x_factor = 1 / unscaled->x_scale; if (unscaled->y_scale == 0) y_factor = 0; else y_factor = 1 / unscaled->y_scale; fs_metrics.ascent = DOUBLE_FROM_26_6(metrics->ascender) * y_factor; fs_metrics.descent = DOUBLE_FROM_26_6(- metrics->descender) * y_factor; fs_metrics.height = DOUBLE_FROM_26_6(metrics->height) * y_factor; if (!_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) { fs_metrics.max_x_advance = DOUBLE_FROM_26_6(metrics->max_advance) * x_factor; fs_metrics.max_y_advance = 0; } else { fs_metrics.max_x_advance = 0; fs_metrics.max_y_advance = DOUBLE_FROM_26_6(metrics->max_advance) * y_factor; } } else { double scale = face->units_per_EM; fs_metrics.ascent = face->ascender / scale; fs_metrics.descent = - face->descender / scale; fs_metrics.height = face->height / scale; if (!_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) { fs_metrics.max_x_advance = face->max_advance_width / scale; fs_metrics.max_y_advance = 0; } else { fs_metrics.max_x_advance = 0; fs_metrics.max_y_advance = face->max_advance_height / scale; } } status = _cairo_scaled_font_set_metrics (&scaled_font->base, &fs_metrics); *font_out = &scaled_font->base; FAIL: _cairo_ft_unscaled_font_unlock_face (unscaled); return status; } cairo_bool_t _cairo_scaled_font_is_ft (cairo_scaled_font_t *scaled_font) { return scaled_font->backend == &cairo_ft_scaled_font_backend; } static cairo_status_t _cairo_ft_scaled_font_create_toy (cairo_toy_font_face_t *toy_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *font_options, cairo_scaled_font_t **font) { FcPattern *pattern, *resolved; cairo_ft_unscaled_font_t *unscaled; FcResult result; int fcslant; int fcweight; cairo_matrix_t scale; cairo_status_t status; cairo_ft_font_transform_t sf; cairo_ft_options_t ft_options; cairo_matrix_multiply (&scale, font_matrix, ctm); status = _compute_transform (&sf, &scale); if (status) return status; pattern = FcPatternCreate (); if (!pattern) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (!FcPatternAddString (pattern, FC_FAMILY, (unsigned char *) toy_face->family)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } switch (toy_face->slant) { case CAIRO_FONT_SLANT_ITALIC: fcslant = FC_SLANT_ITALIC; break; case CAIRO_FONT_SLANT_OBLIQUE: fcslant = FC_SLANT_OBLIQUE; break; case CAIRO_FONT_SLANT_NORMAL: default: fcslant = FC_SLANT_ROMAN; break; } if (!FcPatternAddInteger (pattern, FC_SLANT, fcslant)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } switch (toy_face->weight) { case CAIRO_FONT_WEIGHT_BOLD: fcweight = FC_WEIGHT_BOLD; break; case CAIRO_FONT_WEIGHT_NORMAL: default: fcweight = FC_WEIGHT_MEDIUM; break; } if (!FcPatternAddInteger (pattern, FC_WEIGHT, fcweight)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } if (! FcPatternAddDouble (pattern, FC_PIXEL_SIZE, sf.y_scale)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } if (! FcConfigSubstitute (NULL, pattern, FcMatchPattern)) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } status = _cairo_ft_font_options_substitute (font_options, pattern); if (status) goto FREE_PATTERN; FcDefaultSubstitute (pattern); resolved = FcFontMatch (NULL, pattern, &result); if (!resolved) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_PATTERN; } unscaled = _cairo_ft_unscaled_font_create_for_pattern (resolved); if (!unscaled) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FREE_RESOLVED; } _get_pattern_ft_options (resolved, &ft_options); status = _cairo_ft_scaled_font_create (unscaled, &toy_face->base, font_matrix, ctm, font_options, ft_options, font); _cairo_unscaled_font_destroy (&unscaled->base); FREE_RESOLVED: FcPatternDestroy (resolved); FREE_PATTERN: FcPatternDestroy (pattern); return status; } static void _cairo_ft_scaled_font_fini (void *abstract_font) { cairo_ft_scaled_font_t *scaled_font = abstract_font; if (scaled_font == NULL) return; _cairo_unscaled_font_destroy (&scaled_font->unscaled->base); } static int _move_to (FT_Vector *to, void *closure) { cairo_path_fixed_t *path = closure; cairo_fixed_t x, y; x = _cairo_fixed_from_26_6 (to->x); y = _cairo_fixed_from_26_6 (to->y); if (_cairo_path_fixed_close_path (path) != CAIRO_STATUS_SUCCESS) return 1; if (_cairo_path_fixed_move_to (path, x, y) != CAIRO_STATUS_SUCCESS) return 1; return 0; } static int _line_to (FT_Vector *to, void *closure) { cairo_path_fixed_t *path = closure; cairo_fixed_t x, y; x = _cairo_fixed_from_26_6 (to->x); y = _cairo_fixed_from_26_6 (to->y); if (_cairo_path_fixed_line_to (path, x, y) != CAIRO_STATUS_SUCCESS) return 1; return 0; } static int _conic_to (FT_Vector *control, FT_Vector *to, void *closure) { cairo_path_fixed_t *path = closure; cairo_fixed_t x0, y0; cairo_fixed_t x1, y1; cairo_fixed_t x2, y2; cairo_fixed_t x3, y3; cairo_point_t conic; if (! _cairo_path_fixed_get_current_point (path, &x0, &y0)) return 1; conic.x = _cairo_fixed_from_26_6 (control->x); conic.y = _cairo_fixed_from_26_6 (control->y); x3 = _cairo_fixed_from_26_6 (to->x); y3 = _cairo_fixed_from_26_6 (to->y); x1 = x0 + 2.0/3.0 * (conic.x - x0); y1 = y0 + 2.0/3.0 * (conic.y - y0); x2 = x3 + 2.0/3.0 * (conic.x - x3); y2 = y3 + 2.0/3.0 * (conic.y - y3); if (_cairo_path_fixed_curve_to (path, x1, y1, x2, y2, x3, y3) != CAIRO_STATUS_SUCCESS) return 1; return 0; } static int _cubic_to (FT_Vector *control1, FT_Vector *control2, FT_Vector *to, void *closure) { cairo_path_fixed_t *path = closure; cairo_fixed_t x0, y0; cairo_fixed_t x1, y1; cairo_fixed_t x2, y2; x0 = _cairo_fixed_from_26_6 (control1->x); y0 = _cairo_fixed_from_26_6 (control1->y); x1 = _cairo_fixed_from_26_6 (control2->x); y1 = _cairo_fixed_from_26_6 (control2->y); x2 = _cairo_fixed_from_26_6 (to->x); y2 = _cairo_fixed_from_26_6 (to->y); if (_cairo_path_fixed_curve_to (path, x0, y0, x1, y1, x2, y2) != CAIRO_STATUS_SUCCESS) return 1; return 0; } static cairo_status_t _decompose_glyph_outline (FT_Face face, cairo_font_options_t *options, cairo_path_fixed_t **pathp) { static const FT_Outline_Funcs outline_funcs = { (FT_Outline_MoveToFunc)_move_to, (FT_Outline_LineToFunc)_line_to, (FT_Outline_ConicToFunc)_conic_to, (FT_Outline_CubicToFunc)_cubic_to, 0, /* shift */ 0, /* delta */ }; static const FT_Matrix invert_y = { DOUBLE_TO_16_16 (1.0), 0, 0, DOUBLE_TO_16_16 (-1.0), }; FT_GlyphSlot glyph; cairo_path_fixed_t *path; cairo_status_t status; path = _cairo_path_fixed_create (); if (!path) return _cairo_error (CAIRO_STATUS_NO_MEMORY); glyph = face->glyph; /* Font glyphs have an inverted Y axis compared to cairo. */ FT_Outline_Transform (&glyph->outline, &invert_y); if (FT_Outline_Decompose (&glyph->outline, &outline_funcs, path)) { _cairo_path_fixed_destroy (path); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } status = _cairo_path_fixed_close_path (path); if (status) { _cairo_path_fixed_destroy (path); return status; } *pathp = path; return CAIRO_STATUS_SUCCESS; } /* * Translate glyph to match its metrics. */ static void _cairo_ft_scaled_glyph_vertical_layout_bearing_fix (void *abstract_font, FT_GlyphSlot glyph) { cairo_ft_scaled_font_t *scaled_font = abstract_font; FT_Vector vector; vector.x = glyph->metrics.vertBearingX - glyph->metrics.horiBearingX; vector.y = -glyph->metrics.vertBearingY - glyph->metrics.horiBearingY; if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) { FT_Vector_Transform (&vector, &scaled_font->unscaled->Current_Shape); FT_Outline_Translate(&glyph->outline, vector.x, vector.y); } else if (glyph->format == FT_GLYPH_FORMAT_BITMAP) { glyph->bitmap_left += vector.x / 64; glyph->bitmap_top += vector.y / 64; } } static cairo_int_status_t _cairo_ft_scaled_glyph_init (void *abstract_font, cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_glyph_info_t info) { cairo_text_extents_t fs_metrics; cairo_ft_scaled_font_t *scaled_font = abstract_font; cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; FT_GlyphSlot glyph; FT_Face face; FT_Error error; int load_flags = scaled_font->ft_options.load_flags; FT_Glyph_Metrics *metrics; double x_factor, y_factor; cairo_bool_t vertical_layout = FALSE; cairo_status_t status; face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return _cairo_error (CAIRO_STATUS_NO_MEMORY); status = _cairo_ft_unscaled_font_set_scale (scaled_font->unscaled, &scaled_font->base.scale); if (status) goto FAIL; /* Ignore global advance unconditionally */ load_flags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; if ((info & CAIRO_SCALED_GLYPH_INFO_PATH) != 0 && (info & CAIRO_SCALED_GLYPH_INFO_SURFACE) == 0) load_flags |= FT_LOAD_NO_BITMAP; /* * Don't pass FT_LOAD_VERTICAL_LAYOUT to FT_Load_Glyph here as * suggested by freetype people. */ if (load_flags & FT_LOAD_VERTICAL_LAYOUT) { load_flags &= ~FT_LOAD_VERTICAL_LAYOUT; vertical_layout = TRUE; } error = FT_Load_Glyph (scaled_font->unscaled->face, _cairo_scaled_glyph_index(scaled_glyph), load_flags); /* XXX ignoring all other errors for now. They are not fatal, typically * just a glyph-not-found. */ if (error == FT_Err_Out_Of_Memory) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } glyph = face->glyph; #if HAVE_FT_GLYPHSLOT_EMBOLDEN /* * embolden glyphs if requested */ if (scaled_font->ft_options.extra_flags & CAIRO_FT_OPTIONS_EMBOLDEN) FT_GlyphSlot_Embolden (glyph); #endif if (vertical_layout) _cairo_ft_scaled_glyph_vertical_layout_bearing_fix (scaled_font, glyph); if (info & CAIRO_SCALED_GLYPH_INFO_METRICS) { cairo_bool_t hint_metrics = scaled_font->base.options.hint_metrics != CAIRO_HINT_METRICS_OFF; /* * Compute font-space metrics */ metrics = &glyph->metrics; if (unscaled->x_scale == 0) x_factor = 0; else x_factor = 1 / unscaled->x_scale; if (unscaled->y_scale == 0) y_factor = 0; else y_factor = 1 / unscaled->y_scale; /* * Note: Y coordinates of the horizontal bearing need to be negated. * * Scale metrics back to glyph space from the scaled glyph space returned * by FreeType * * If we want hinted metrics but aren't asking for hinted glyphs from * FreeType, then we need to do the metric hinting ourselves. */ if (hint_metrics && (load_flags & FT_LOAD_NO_HINTING)) { FT_Pos x1, x2; FT_Pos y1, y2; FT_Pos advance; if (!vertical_layout) { x1 = (metrics->horiBearingX) & -64; x2 = (metrics->horiBearingX + metrics->width + 63) & -64; y1 = (-metrics->horiBearingY) & -64; y2 = (-metrics->horiBearingY + metrics->height + 63) & -64; advance = ((metrics->horiAdvance + 32) & -64); fs_metrics.x_bearing = DOUBLE_FROM_26_6 (x1) * x_factor; fs_metrics.y_bearing = DOUBLE_FROM_26_6 (y1) * y_factor; fs_metrics.width = DOUBLE_FROM_26_6 (x2 - x1) * x_factor; fs_metrics.height = DOUBLE_FROM_26_6 (y2 - y1) * y_factor; fs_metrics.x_advance = DOUBLE_FROM_26_6 (advance) * x_factor; fs_metrics.y_advance = 0; } else { x1 = (metrics->vertBearingX) & -64; x2 = (metrics->vertBearingX + metrics->width + 63) & -64; y1 = (metrics->vertBearingY) & -64; y2 = (metrics->vertBearingY + metrics->height + 63) & -64; advance = ((metrics->vertAdvance + 32) & -64); fs_metrics.x_bearing = DOUBLE_FROM_26_6 (x1) * x_factor; fs_metrics.y_bearing = DOUBLE_FROM_26_6 (y1) * y_factor; fs_metrics.width = DOUBLE_FROM_26_6 (x2 - x1) * x_factor; fs_metrics.height = DOUBLE_FROM_26_6 (y2 - y1) * y_factor; fs_metrics.x_advance = 0; fs_metrics.y_advance = DOUBLE_FROM_26_6 (advance) * y_factor; } } else { fs_metrics.width = DOUBLE_FROM_26_6 (metrics->width) * x_factor; fs_metrics.height = DOUBLE_FROM_26_6 (metrics->height) * y_factor; if (!vertical_layout) { fs_metrics.x_bearing = DOUBLE_FROM_26_6 (metrics->horiBearingX) * x_factor; fs_metrics.y_bearing = DOUBLE_FROM_26_6 (-metrics->horiBearingY) * y_factor; if (hint_metrics || glyph->format != FT_GLYPH_FORMAT_OUTLINE) fs_metrics.x_advance = DOUBLE_FROM_26_6 (metrics->horiAdvance) * x_factor; else fs_metrics.x_advance = DOUBLE_FROM_16_16 (glyph->linearHoriAdvance) * x_factor; fs_metrics.y_advance = 0 * y_factor; } else { fs_metrics.x_bearing = DOUBLE_FROM_26_6 (metrics->vertBearingX) * x_factor; fs_metrics.y_bearing = DOUBLE_FROM_26_6 (metrics->vertBearingY) * y_factor; fs_metrics.x_advance = 0 * x_factor; if (hint_metrics || glyph->format != FT_GLYPH_FORMAT_OUTLINE) fs_metrics.y_advance = DOUBLE_FROM_26_6 (metrics->vertAdvance) * y_factor; else fs_metrics.y_advance = DOUBLE_FROM_26_6 (glyph->linearVertAdvance) * y_factor; } } _cairo_scaled_glyph_set_metrics (scaled_glyph, &scaled_font->base, &fs_metrics); } if ((info & CAIRO_SCALED_GLYPH_INFO_SURFACE) != 0) { cairo_image_surface_t *surface; if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) { status = _render_glyph_outline (face, &scaled_font->ft_options.base, &surface); } else { status = _render_glyph_bitmap (face, &scaled_font->ft_options.base, &surface); if (status == CAIRO_STATUS_SUCCESS && unscaled->have_shape) { status = _transform_glyph_bitmap (&unscaled->current_shape, &surface); if (status) cairo_surface_destroy (&surface->base); } } if (status) goto FAIL; _cairo_scaled_glyph_set_surface (scaled_glyph, &scaled_font->base, surface); } if (info & CAIRO_SCALED_GLYPH_INFO_PATH) { cairo_path_fixed_t *path = NULL; /* hide compiler warning */ /* * A kludge -- the above code will trash the outline, * so reload it. This will probably never occur though */ if ((info & CAIRO_SCALED_GLYPH_INFO_SURFACE) != 0) { error = FT_Load_Glyph (face, _cairo_scaled_glyph_index(scaled_glyph), load_flags | FT_LOAD_NO_BITMAP); /* XXX ignoring all other errors for now. They are not fatal, typically * just a glyph-not-found. */ if (error == FT_Err_Out_Of_Memory) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto FAIL; } #if HAVE_FT_GLYPHSLOT_EMBOLDEN /* * embolden glyphs if requested */ if (scaled_font->ft_options.extra_flags & CAIRO_FT_OPTIONS_EMBOLDEN) FT_GlyphSlot_Embolden (glyph); #endif if (vertical_layout) _cairo_ft_scaled_glyph_vertical_layout_bearing_fix (scaled_font, glyph); } if (glyph->format == FT_GLYPH_FORMAT_OUTLINE) status = _decompose_glyph_outline (face, &scaled_font->ft_options.base, &path); else status = CAIRO_INT_STATUS_UNSUPPORTED; if (status) goto FAIL; _cairo_scaled_glyph_set_path (scaled_glyph, &scaled_font->base, path); } FAIL: _cairo_ft_unscaled_font_unlock_face (unscaled); return status; } static unsigned long _cairo_ft_ucs4_to_index (void *abstract_font, uint32_t ucs4) { cairo_ft_scaled_font_t *scaled_font = abstract_font; cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; FT_Face face; FT_UInt index; face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return 0; index = FT_Get_Char_Index (face, ucs4); _cairo_ft_unscaled_font_unlock_face (unscaled); return index; } static cairo_int_status_t _cairo_ft_load_truetype_table (void *abstract_font, unsigned long tag, long offset, unsigned char *buffer, unsigned long *length) { cairo_ft_scaled_font_t *scaled_font = abstract_font; cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; FT_Face face; cairo_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; if (_cairo_ft_scaled_font_is_vertical (&scaled_font->base)) return CAIRO_INT_STATUS_UNSUPPORTED; #if HAVE_FT_LOAD_SFNT_TABLE face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (FT_IS_SFNT (face) && FT_Load_Sfnt_Table (face, tag, offset, buffer, length) == 0) status = CAIRO_STATUS_SUCCESS; _cairo_ft_unscaled_font_unlock_face (unscaled); #endif return status; } static cairo_int_status_t _cairo_ft_map_glyphs_to_unicode (void *abstract_font, cairo_scaled_font_subset_t *font_subset) { cairo_ft_scaled_font_t *scaled_font = abstract_font; cairo_ft_unscaled_font_t *unscaled = scaled_font->unscaled; FT_Face face; FT_UInt glyph; unsigned long charcode; unsigned int i; int count; face = _cairo_ft_unscaled_font_lock_face (unscaled); if (!face) return _cairo_error (CAIRO_STATUS_NO_MEMORY); count = font_subset->num_glyphs; charcode = FT_Get_First_Char( face, &glyph); while (glyph != 0 && count > 0) { for (i = 0; i < font_subset->num_glyphs; i++) { if (font_subset->glyphs[i] == glyph) { font_subset->to_unicode[i] = charcode; count--; break; } } charcode = FT_Get_Next_Char (face, charcode, &glyph); } _cairo_ft_unscaled_font_unlock_face (unscaled); return CAIRO_STATUS_SUCCESS; } const cairo_scaled_font_backend_t cairo_ft_scaled_font_backend = { CAIRO_FONT_TYPE_FT, _cairo_ft_scaled_font_create_toy, _cairo_ft_scaled_font_fini, _cairo_ft_scaled_glyph_init, NULL, /* text_to_glyphs */ _cairo_ft_ucs4_to_index, NULL, /* show_glyphs */ _cairo_ft_load_truetype_table, _cairo_ft_map_glyphs_to_unicode, }; /* #cairo_ft_font_face_t */ static void _cairo_ft_font_face_destroy (void *abstract_face) { cairo_ft_font_face_t *font_face = abstract_face; cairo_ft_font_face_t *tmp_face = NULL; cairo_ft_font_face_t *last_face = NULL; if (font_face == NULL) return; /* When destroying the face created by cairo_ft_font_face_create_for_ft_face, * we have a special "zombie" state for the face when the unscaled font * is still alive but there are no public references to the font face. * * We go from: * * font_face ------> unscaled * <-....weak....../ * * To: * * font_face <------- unscaled */ if (font_face->unscaled && font_face->unscaled->from_face && CAIRO_REFERENCE_COUNT_GET_VALUE (&font_face->unscaled->base.ref_count) > 1) { cairo_font_face_reference (&font_face->base); _cairo_unscaled_font_destroy (&font_face->unscaled->base); font_face->unscaled = NULL; return; } if (font_face->unscaled) { /* Remove face from linked list */ for (tmp_face = font_face->unscaled->faces; tmp_face; tmp_face = tmp_face->next) { if (tmp_face == font_face) { if (last_face) last_face->next = tmp_face->next; else font_face->unscaled->faces = tmp_face->next; } last_face = tmp_face; } _cairo_unscaled_font_destroy (&font_face->unscaled->base); font_face->unscaled = NULL; } } static cairo_status_t _cairo_ft_font_face_scaled_font_create (void *abstract_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font) { cairo_ft_font_face_t *font_face = abstract_face; cairo_ft_options_t ft_options; /* The handling of font options is different depending on how the * font face was created. When the user creates a font face with * cairo_ft_font_face_create_for_ft_face(), then the load flags * passed in augment the load flags for the options. But for * cairo_ft_font_face_create_for_pattern(), the load flags are * derived from a pattern where the user has called * cairo_ft_font_options_substitute(), so *just* use those load * flags and ignore the options. */ ft_options = font_face->ft_options; return _cairo_ft_scaled_font_create (font_face->unscaled, &font_face->base, font_matrix, ctm, options, ft_options, scaled_font); } static const cairo_font_face_backend_t _cairo_ft_font_face_backend = { CAIRO_FONT_TYPE_FT, _cairo_ft_font_face_destroy, _cairo_ft_font_face_scaled_font_create }; static cairo_font_face_t * _cairo_ft_font_face_create (cairo_ft_unscaled_font_t *unscaled, cairo_ft_options_t *ft_options) { cairo_ft_font_face_t *font_face, **prev_font_face; /* Looked for an existing matching font face */ for (font_face = unscaled->faces, prev_font_face = &unscaled->faces; font_face; prev_font_face = &font_face->next, font_face = font_face->next) { if (font_face->ft_options.load_flags == ft_options->load_flags && font_face->ft_options.extra_flags == ft_options->extra_flags && cairo_font_options_equal (&font_face->ft_options.base, &ft_options->base)) { if (font_face->base.status == CAIRO_STATUS_SUCCESS) return cairo_font_face_reference (&font_face->base); /* The font_face has been left in an error state, abandon it. */ *prev_font_face = font_face->next; break; } } /* No match found, create a new one */ font_face = malloc (sizeof (cairo_ft_font_face_t)); if (!font_face) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_face_t *)&_cairo_font_face_nil; } font_face->unscaled = unscaled; _cairo_unscaled_font_reference (&unscaled->base); font_face->ft_options = *ft_options; font_face->next = unscaled->faces; unscaled->faces = font_face; _cairo_font_face_init (&font_face->base, &_cairo_ft_font_face_backend); return &font_face->base; } /* implement the platform-specific interface */ static cairo_status_t _cairo_ft_font_options_substitute (const cairo_font_options_t *options, FcPattern *pattern) { FcValue v; if (options->antialias != CAIRO_ANTIALIAS_DEFAULT) { if (FcPatternGet (pattern, FC_ANTIALIAS, 0, &v) == FcResultNoMatch) { if (! FcPatternAddBool (pattern, FC_ANTIALIAS, options->antialias != CAIRO_ANTIALIAS_NONE)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (options->antialias != CAIRO_ANTIALIAS_SUBPIXEL) { FcPatternDel (pattern, FC_RGBA); if (! FcPatternAddInteger (pattern, FC_RGBA, FC_RGBA_NONE)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } } if (options->antialias != CAIRO_ANTIALIAS_DEFAULT) { if (FcPatternGet (pattern, FC_RGBA, 0, &v) == FcResultNoMatch) { int rgba; if (options->antialias == CAIRO_ANTIALIAS_SUBPIXEL) { switch (options->subpixel_order) { case CAIRO_SUBPIXEL_ORDER_DEFAULT: case CAIRO_SUBPIXEL_ORDER_RGB: default: rgba = FC_RGBA_RGB; break; case CAIRO_SUBPIXEL_ORDER_BGR: rgba = FC_RGBA_BGR; break; case CAIRO_SUBPIXEL_ORDER_VRGB: rgba = FC_RGBA_VRGB; break; case CAIRO_SUBPIXEL_ORDER_VBGR: rgba = FC_RGBA_VBGR; break; } } else { rgba = FC_RGBA_NONE; } if (! FcPatternAddInteger (pattern, FC_RGBA, rgba)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } if (options->hint_style != CAIRO_HINT_STYLE_DEFAULT) { if (FcPatternGet (pattern, FC_HINTING, 0, &v) == FcResultNoMatch) { if (! FcPatternAddBool (pattern, FC_HINTING, options->hint_style != CAIRO_HINT_STYLE_NONE)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } #ifdef FC_HINT_STYLE if (FcPatternGet (pattern, FC_HINT_STYLE, 0, &v) == FcResultNoMatch) { int hint_style; switch (options->hint_style) { case CAIRO_HINT_STYLE_NONE: hint_style = FC_HINT_NONE; break; case CAIRO_HINT_STYLE_SLIGHT: hint_style = FC_HINT_SLIGHT; break; case CAIRO_HINT_STYLE_MEDIUM: hint_style = FC_HINT_MEDIUM; break; case CAIRO_HINT_STYLE_FULL: case CAIRO_HINT_STYLE_DEFAULT: default: hint_style = FC_HINT_FULL; break; } if (! FcPatternAddInteger (pattern, FC_HINT_STYLE, hint_style)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } #endif } return CAIRO_STATUS_SUCCESS; } /** * cairo_ft_font_options_substitute: * @options: a #cairo_font_options_t object * @pattern: an existing #FcPattern * * Add options to a #FcPattern based on a #cairo_font_options_t font * options object. Options that are already in the pattern, are not overridden, * so you should call this function after calling FcConfigSubstitute() (the * user's settings should override options based on the surface type), but * before calling FcDefaultSubstitute(). **/ void cairo_ft_font_options_substitute (const cairo_font_options_t *options, FcPattern *pattern) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return; _cairo_ft_font_options_substitute (options, pattern); } /** * cairo_ft_font_face_create_for_pattern: * @pattern: A fully resolved fontconfig * pattern. A pattern can be resolved, by, among other things, calling * FcConfigSubstitute(), FcDefaultSubstitute(), then * FcFontMatch(). Cairo will call FcPatternReference() on this * pattern, so you should not further modify the pattern, but you can * release your reference to the pattern with FcPatternDestroy() if * you no longer need to access it. * * Creates a new font face for the FreeType font backend based on a * fontconfig pattern. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). The * #cairo_scaled_font_t returned from cairo_scaled_font_create() is * also for the FreeType backend and can be used with functions such * as cairo_ft_font_lock_face(). * * Font rendering options are represented both here and when you * call cairo_scaled_font_create(). Font options that have a representation * in a #FcPattern must be passed in here; to modify #FcPattern * appropriately to reflect the options in a #cairo_font_options_t, call * cairo_ft_font_options_substitute(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. **/ cairo_font_face_t * cairo_ft_font_face_create_for_pattern (FcPattern *pattern) { cairo_ft_unscaled_font_t *unscaled; cairo_font_face_t *font_face; cairo_ft_options_t ft_options; unscaled = _cairo_ft_unscaled_font_create_for_pattern (pattern); if (unscaled == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_face_t *)&_cairo_font_face_nil; } _get_pattern_ft_options (pattern, &ft_options); font_face = _cairo_ft_font_face_create (unscaled, &ft_options); _cairo_unscaled_font_destroy (&unscaled->base); return font_face; } /** * cairo_ft_font_face_create_for_ft_face: * @face: A FreeType face object, already opened. This must * be kept around until the face's ref_count drops to * zero and it is freed. Since the face may be referenced * internally to Cairo, the best way to determine when it * is safe to free the face is to pass a * #cairo_destroy_func_t to cairo_font_face_set_user_data() * @load_flags: flags to pass to FT_Load_Glyph when loading * glyphs from the font. These flags are OR'ed together with * the flags derived from the #cairo_font_options_t passed * to cairo_scaled_font_create(), so only a few values such * as %FT_LOAD_VERTICAL_LAYOUT, and %FT_LOAD_FORCE_AUTOHINT * are useful. You should not pass any of the flags affecting * the load target, such as %FT_LOAD_TARGET_LIGHT. * * Creates a new font face for the FreeType font backend from a * pre-opened FreeType face. This font can then be used with * cairo_set_font_face() or cairo_scaled_font_create(). The * #cairo_scaled_font_t returned from cairo_scaled_font_create() is * also for the FreeType backend and can be used with functions such * as cairo_ft_font_lock_face(). * * Return value: a newly created #cairo_font_face_t. Free with * cairo_font_face_destroy() when you are done using it. **/ cairo_font_face_t * cairo_ft_font_face_create_for_ft_face (FT_Face face, int load_flags) { cairo_ft_unscaled_font_t *unscaled; cairo_font_face_t *font_face; cairo_ft_options_t ft_options; unscaled = _cairo_ft_unscaled_font_create_from_face (face); if (unscaled == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_face_t *)&_cairo_font_face_nil; } ft_options.load_flags = load_flags; ft_options.extra_flags = 0; _cairo_font_options_init_default (&ft_options.base); font_face = _cairo_ft_font_face_create (unscaled, &ft_options); _cairo_unscaled_font_destroy (&unscaled->base); return font_face; } /** * cairo_ft_scaled_font_lock_face: * @scaled_font: A #cairo_scaled_font_t from the FreeType font backend. Such an * object can be created by calling cairo_scaled_font_create() on a * FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), * cairo_ft_font_face_create_for_face()). * * cairo_ft_font_lock_face() gets the #FT_Face object from a FreeType * backend font and scales it appropriately for the font. You must * release the face with cairo_ft_font_unlock_face() * when you are done using it. Since the #FT_Face object can be * shared between multiple #cairo_scaled_font_t objects, you must not * lock any other font objects until you unlock this one. A count is * kept of the number of times cairo_ft_font_lock_face() is * called. cairo_ft_font_unlock_face() must be called the same number * of times. * * You must be careful when using this function in a library or in a * threaded application, because freetype's design makes it unsafe to * call freetype functions simultaneously from multiple threads, (even * if using distinct FT_Face objects). Because of this, application * code that acquires an FT_Face object with this call must add it's * own locking to protect any use of that object, (and which also must * protect any other calls into cairo as almost any cairo function * might result in a call into the freetype library). * * Return value: The #FT_Face object for @font, scaled appropriately, * or %NULL if @scaled_font is in an error state (see * cairo_scaled_font_status()) or there is insufficient memory. **/ FT_Face cairo_ft_scaled_font_lock_face (cairo_scaled_font_t *abstract_font) { cairo_ft_scaled_font_t *scaled_font = (cairo_ft_scaled_font_t *) abstract_font; FT_Face face; cairo_status_t status; if (scaled_font->base.status) return NULL; face = _cairo_ft_unscaled_font_lock_face (scaled_font->unscaled); if (face == NULL) { status = _cairo_scaled_font_set_error (&scaled_font->base, CAIRO_STATUS_NO_MEMORY); return NULL; } status = _cairo_ft_unscaled_font_set_scale (scaled_font->unscaled, &scaled_font->base.scale); if (status) { _cairo_ft_unscaled_font_unlock_face (scaled_font->unscaled); status = _cairo_scaled_font_set_error (&scaled_font->base, status); return NULL; } /* Note: We deliberately release the unscaled font's mutex here, * so that we are not holding a lock across two separate calls to * cairo function, (which would give the application some * opportunity for creating deadlock. This is obviously unsafe, * but as documented, the user must add manual locking when using * this function. */ CAIRO_MUTEX_UNLOCK (scaled_font->unscaled->mutex); return face; } /** * cairo_ft_scaled_font_unlock_face: * @scaled_font: A #cairo_scaled_font_t from the FreeType font backend. Such an * object can be created by calling cairo_scaled_font_create() on a * FreeType backend font face (see cairo_ft_font_face_create_for_pattern(), * cairo_ft_font_face_create_for_ft_face()). * * Releases a face obtained with cairo_ft_scaled_font_lock_face(). **/ void cairo_ft_scaled_font_unlock_face (cairo_scaled_font_t *abstract_font) { cairo_ft_scaled_font_t *scaled_font = (cairo_ft_scaled_font_t *) abstract_font; if (scaled_font->base.status) return; /* Note: We released the unscaled font's mutex at the end of * cairo_ft_scaled_font_lock_face, so we have to acquire it again * as _cairo_ft_unscaled_font_unlock_face expects it to be held * when we call into it. */ CAIRO_MUTEX_LOCK (scaled_font->unscaled->mutex); _cairo_ft_unscaled_font_unlock_face (scaled_font->unscaled); } /* We expose our unscaled font implementation internally for the the * PDF backend, which needs to keep track of the the different * fonts-on-disk used by a document, so it can embed them. */ cairo_unscaled_font_t * _cairo_ft_scaled_font_get_unscaled_font (cairo_scaled_font_t *abstract_font) { cairo_ft_scaled_font_t *scaled_font = (cairo_ft_scaled_font_t *) abstract_font; return &scaled_font->unscaled->base; } cairo_bool_t _cairo_ft_scaled_font_is_vertical (cairo_scaled_font_t *scaled_font) { cairo_ft_scaled_font_t *ft_scaled_font; if (!_cairo_scaled_font_is_ft (scaled_font)) return FALSE; ft_scaled_font = (cairo_ft_scaled_font_t *) scaled_font; if (ft_scaled_font->ft_options.load_flags & FT_LOAD_VERTICAL_LAYOUT) return TRUE; return FALSE; } void _cairo_ft_font_reset_static_data (void) { _cairo_ft_unscaled_font_map_destroy (); } libgdiplus-2.11/cairo/src/cairo-embed.h0000664000175000017500000024565012225470167014744 00000000000000/* * Copyright (C) 2007 Novell, Inc (http://www.novell.com) * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial * portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Authors: * Larry Ewing (via script) * */ #ifndef CAIRO_EMBED_H_ #define CAIRO_EMBED_H_ #define _cairo_analysis_surface_add_operation _mono_cairo_analysis_surface_add_operation #define _cairo_analysis_surface_analyze_meta_surface_pattern _mono_cairo_analysis_surface_analyze_meta_surface_pattern #define _cairo_analysis_surface_create _mono_cairo_analysis_surface_create #define _cairo_analysis_surface_fill _mono_cairo_analysis_surface_fill #define _cairo_analysis_surface_finish _mono_cairo_analysis_surface_finish #define _cairo_analysis_surface_get_bounding_box _mono_cairo_analysis_surface_get_bounding_box #define _cairo_analysis_surface_get_extents _mono_cairo_analysis_surface_get_extents #define _cairo_analysis_surface_get_supported _mono_cairo_analysis_surface_get_supported #define _cairo_analysis_surface_get_unsupported _mono_cairo_analysis_surface_get_unsupported #define _cairo_analysis_surface_has_supported _mono_cairo_analysis_surface_has_supported #define _cairo_analysis_surface_has_unsupported _mono_cairo_analysis_surface_has_unsupported #define _cairo_analysis_surface_intersect_clip_path _mono_cairo_analysis_surface_intersect_clip_path #define _cairo_analysis_surface_mask _mono_cairo_analysis_surface_mask #define _cairo_analysis_surface_paint _mono_cairo_analysis_surface_paint #define _cairo_analysis_surface_show_glyphs _mono_cairo_analysis_surface_show_glyphs #define _cairo_analysis_surface_stroke _mono_cairo_analysis_surface_stroke #define _cairo_arc_in_direction _mono_cairo_arc_in_direction #define _cairo_arc_path _mono_cairo_arc_path #define _cairo_arc_path_negative _mono_cairo_arc_path_negative #define _cairo_array_allocate _mono_cairo_array_allocate #define _cairo_array_append _mono_cairo_array_append #define _cairo_array_append_multiple _mono_cairo_array_append_multiple #define _cairo_array_copy_element _mono_cairo_array_copy_element #define _cairo_array_fini _mono_cairo_array_fini #define _cairo_array_grow_by _mono_cairo_array_grow_by #define _cairo_array_index _mono_cairo_array_index #define _cairo_array_init _mono_cairo_array_init #define _cairo_array_init_snapshot _mono_cairo_array_init_snapshot #define _cairo_array_num_elements _mono_cairo_array_num_elements #define _cairo_array_size _mono_cairo_array_size #define _cairo_array_truncate _mono_cairo_array_truncate #define _cairo_atomic_int_cmpxchg _mono_cairo_atomic_int_cmpxchg #define _cairo_atomic_int_dec_and_test _mono_cairo_atomic_int_dec_and_test #define _cairo_atomic_int_inc _mono_cairo_atomic_int_inc #define _cairo_atomic_mutex _mono_cairo_atomic_mutex #define _cairo_base85_stream_close _mono_cairo_base85_stream_close #define _cairo_base85_stream_create _mono_cairo_base85_stream_create #define _cairo_base85_stream_write _mono_cairo_base85_stream_write #define _cairo_bentley_ottmann_tessellate_polygon _mono_cairo_bentley_ottmann_tessellate_polygon #define _cairo_bo_edge_contains_intersect_point _mono_cairo_bo_edge_contains_intersect_point #define _cairo_bo_edge_end_trap _mono_cairo_bo_edge_end_trap #define _cairo_bo_event_init _mono_cairo_bo_event_init #define _cairo_bo_event_queue_insert_if_intersect_below_current_y _mono_cairo_bo_event_queue_insert_if_intersect_below_current_y #define _cairo_bo_intersect_ordinate_32_compare _mono_cairo_bo_intersect_ordinate_32_compare #define _cairo_bo_sweep_line_validate _mono_cairo_bo_sweep_line_validate #define _cairo_box_contains_point _mono_cairo_box_contains_point #define _cairo_box_intersects_line_segment _mono_cairo_box_intersects_line_segment #define _cairo_box_round_to_rectangle _mono_cairo_box_round_to_rectangle #define _cairo_cache_create _mono_cairo_cache_create #define _cairo_cache_destroy _mono_cairo_cache_destroy #define _cairo_cache_foreach _mono_cairo_cache_foreach #define _cairo_cache_freeze _mono_cairo_cache_freeze #define _cairo_cache_insert _mono_cairo_cache_insert #define _cairo_cache_lookup _mono_cairo_cache_lookup #define _cairo_cache_remove _mono_cairo_cache_remove #define _cairo_cache_shrink_to_accommodate _mono_cairo_cache_shrink_to_accommodate #define _cairo_cache_thaw _mono_cairo_cache_thaw #define _cairo_cff_dict_equal _mono_cairo_cff_dict_equal #define _cairo_cff_fallback_fini _mono_cairo_cff_fallback_fini #define _cairo_cff_fallback_init _mono_cairo_cff_fallback_init #define _cairo_cff_subset_fini _mono_cairo_cff_subset_fini #define _cairo_cff_subset_init _mono_cairo_cff_subset_init #define _cairo_clip_clip _mono_cairo_clip_clip #define _cairo_clip_combine_to_surface _mono_cairo_clip_combine_to_surface #define _cairo_clip_copy_rectangle_list _mono_cairo_clip_copy_rectangle_list #define _cairo_clip_init _mono_cairo_clip_init #define _cairo_clip_init_copy _mono_cairo_clip_init_copy #define _cairo_clip_init_deep_copy _mono_cairo_clip_init_deep_copy #define _cairo_clip_int_rect_to_user _mono_cairo_clip_int_rect_to_user #define _cairo_clip_intersect_path _mono_cairo_clip_intersect_path #define _cairo_clip_intersect_to_rectangle _mono_cairo_clip_intersect_to_rectangle #define _cairo_clip_intersect_to_region _mono_cairo_clip_intersect_to_region #define _cairo_clip_path_destroy _mono_cairo_clip_path_destroy #define _cairo_clip_path_reapply_clip_path _mono_cairo_clip_path_reapply_clip_path #define _cairo_clip_reset _mono_cairo_clip_reset #define _cairo_clip_set_all_clipped _mono_cairo_clip_set_all_clipped #define _cairo_clip_translate _mono_cairo_clip_translate #define _cairo_color_compute_shorts _mono_cairo_color_compute_shorts #define _cairo_color_double_to_short _mono_cairo_color_double_to_short #define _cairo_color_equal _mono_cairo_color_equal #define _cairo_color_get_rgba _mono_cairo_color_get_rgba #define _cairo_color_get_rgba_premultiplied _mono_cairo_color_get_rgba_premultiplied #define _cairo_color_init _mono_cairo_color_init #define _cairo_color_init_rgb _mono_cairo_color_init_rgb #define _cairo_color_init_rgba _mono_cairo_color_init_rgba #define _cairo_color_multiply_alpha _mono_cairo_color_multiply_alpha #define _cairo_command_get_path _mono_cairo_command_get_path #define _cairo_content_from_format _mono_cairo_content_from_format #define _cairo_deflate_stream_close _mono_cairo_deflate_stream_close #define _cairo_deflate_stream_create _mono_cairo_deflate_stream_create #define _cairo_deflate_stream_write _mono_cairo_deflate_stream_write #define _cairo_dict_collect _mono_cairo_dict_collect #define _cairo_dict_init_key _mono_cairo_dict_init_key #define _cairo_dtostr _mono_cairo_dtostr #define _cairo_error _mono_cairo_error #define _cairo_filler_close_path _mono_cairo_filler_close_path #define _cairo_filler_curve_to _mono_cairo_filler_curve_to #define _cairo_filler_line_to _mono_cairo_filler_line_to #define _cairo_filler_move_to _mono_cairo_filler_move_to #define _cairo_font_face_init _mono_cairo_font_face_init #define _cairo_font_face_mutex _mono_cairo_font_face_mutex #define _cairo_font_face_nil _mono_cairo_font_face_nil #define _cairo_font_face_set_error _mono_cairo_font_face_set_error #define _cairo_font_options_init_copy _mono_cairo_font_options_init_copy #define _cairo_font_options_init_default _mono_cairo_font_options_init_default #define _cairo_font_options_nil _mono_cairo_font_options_nil #define _cairo_font_reset_static_data _mono_cairo_font_reset_static_data #define _cairo_format_bits_per_pixel _mono_cairo_format_bits_per_pixel #define _cairo_format_from_content _mono_cairo_format_from_content #define _cairo_format_to_pixman_format_code _mono_cairo_format_to_pixman_format_code #define _cairo_freelist_alloc _mono_cairo_freelist_alloc #define _cairo_freelist_calloc _mono_cairo_freelist_calloc #define _cairo_freelist_fini _mono_cairo_freelist_fini #define _cairo_freelist_free _mono_cairo_freelist_free #define _cairo_freelist_init _mono_cairo_freelist_init #define _cairo_ft_font_face_backend _mono_cairo_ft_font_face_backend #define _cairo_ft_font_face_create _mono_cairo_ft_font_face_create #define _cairo_ft_font_face_destroy _mono_cairo_ft_font_face_destroy #define _cairo_ft_font_face_scaled_font_create _mono_cairo_ft_font_face_scaled_font_create #define _cairo_ft_font_options_substitute _mono_cairo_ft_font_options_substitute #define _cairo_ft_font_reset_static_data _mono_cairo_ft_font_reset_static_data #define _cairo_ft_load_truetype_table _mono_cairo_ft_load_truetype_table #define _cairo_ft_map_glyphs_to_unicode _mono_cairo_ft_map_glyphs_to_unicode #define _cairo_ft_scaled_font_create _mono_cairo_ft_scaled_font_create #define _cairo_ft_scaled_font_create_toy _mono_cairo_ft_scaled_font_create_toy #define _cairo_ft_scaled_font_fini _mono_cairo_ft_scaled_font_fini #define _cairo_ft_scaled_font_get_unscaled_font _mono_cairo_ft_scaled_font_get_unscaled_font #define _cairo_ft_scaled_font_is_vertical _mono_cairo_ft_scaled_font_is_vertical #define _cairo_ft_scaled_glyph_init _mono_cairo_ft_scaled_glyph_init #define _cairo_ft_scaled_glyph_vertical_layout_bearing_fix _mono_cairo_ft_scaled_glyph_vertical_layout_bearing_fix #define _cairo_ft_ucs4_to_index _mono_cairo_ft_ucs4_to_index #define _cairo_ft_unscaled_font_create_for_pattern _mono_cairo_ft_unscaled_font_create_for_pattern #define _cairo_ft_unscaled_font_destroy _mono_cairo_ft_unscaled_font_destroy #define _cairo_ft_unscaled_font_fini _mono_cairo_ft_unscaled_font_fini #define _cairo_ft_unscaled_font_init _mono_cairo_ft_unscaled_font_init #define _cairo_ft_unscaled_font_init_key _mono_cairo_ft_unscaled_font_init_key #define _cairo_ft_unscaled_font_keys_equal _mono_cairo_ft_unscaled_font_keys_equal #define _cairo_ft_unscaled_font_lock_face _mono_cairo_ft_unscaled_font_lock_face #define _cairo_ft_unscaled_font_map_lock _mono_cairo_ft_unscaled_font_map_lock #define _cairo_ft_unscaled_font_map_mutex _mono_cairo_ft_unscaled_font_map_mutex #define _cairo_ft_unscaled_font_map_unlock _mono_cairo_ft_unscaled_font_map_unlock #define _cairo_ft_unscaled_font_set_scale _mono_cairo_ft_unscaled_font_set_scale #define _cairo_ft_unscaled_font_unlock_face _mono_cairo_ft_unscaled_font_unlock_face #define _cairo_gstate_backend_to_user _mono_cairo_gstate_backend_to_user #define _cairo_gstate_backend_to_user_rectangle _mono_cairo_gstate_backend_to_user_rectangle #define _cairo_gstate_clip _mono_cairo_gstate_clip #define _cairo_gstate_clip_extents _mono_cairo_gstate_clip_extents #define _cairo_gstate_copy_clip_rectangle_list _mono_cairo_gstate_copy_clip_rectangle_list #define _cairo_gstate_copy_page _mono_cairo_gstate_copy_page #define _cairo_gstate_copy_transformed_pattern _mono_cairo_gstate_copy_transformed_pattern #define _cairo_gstate_copy_transformed_source _mono_cairo_gstate_copy_transformed_source #define _cairo_gstate_device_to_user _mono_cairo_gstate_device_to_user #define _cairo_gstate_device_to_user_distance _mono_cairo_gstate_device_to_user_distance #define _cairo_gstate_ensure_font_face _mono_cairo_gstate_ensure_font_face #define _cairo_gstate_ensure_scaled_font _mono_cairo_gstate_ensure_scaled_font #define _cairo_gstate_fill _mono_cairo_gstate_fill #define _cairo_gstate_fill_extents _mono_cairo_gstate_fill_extents #define _cairo_gstate_fini _mono_cairo_gstate_fini #define _cairo_gstate_get_antialias _mono_cairo_gstate_get_antialias #define _cairo_gstate_get_clip _mono_cairo_gstate_get_clip #define _cairo_gstate_get_dash _mono_cairo_gstate_get_dash #define _cairo_gstate_get_fill_rule _mono_cairo_gstate_get_fill_rule #define _cairo_gstate_get_font_extents _mono_cairo_gstate_get_font_extents #define _cairo_gstate_get_font_face _mono_cairo_gstate_get_font_face #define _cairo_gstate_get_font_matrix _mono_cairo_gstate_get_font_matrix #define _cairo_gstate_get_font_options _mono_cairo_gstate_get_font_options #define _cairo_gstate_get_line_cap _mono_cairo_gstate_get_line_cap #define _cairo_gstate_get_line_join _mono_cairo_gstate_get_line_join #define _cairo_gstate_get_line_width _mono_cairo_gstate_get_line_width #define _cairo_gstate_get_matrix _mono_cairo_gstate_get_matrix #define _cairo_gstate_get_miter_limit _mono_cairo_gstate_get_miter_limit #define _cairo_gstate_get_operator _mono_cairo_gstate_get_operator #define _cairo_gstate_get_original_target _mono_cairo_gstate_get_original_target #define _cairo_gstate_get_parent_target _mono_cairo_gstate_get_parent_target #define _cairo_gstate_get_scaled_font _mono_cairo_gstate_get_scaled_font #define _cairo_gstate_get_source _mono_cairo_gstate_get_source #define _cairo_gstate_get_target _mono_cairo_gstate_get_target #define _cairo_gstate_get_tolerance _mono_cairo_gstate_get_tolerance #define _cairo_gstate_glyph_extents _mono_cairo_gstate_glyph_extents #define _cairo_gstate_glyph_path _mono_cairo_gstate_glyph_path #define _cairo_gstate_identity_matrix _mono_cairo_gstate_identity_matrix #define _cairo_gstate_in_fill _mono_cairo_gstate_in_fill #define _cairo_gstate_in_stroke _mono_cairo_gstate_in_stroke #define _cairo_gstate_init _mono_cairo_gstate_init #define _cairo_gstate_is_redirected _mono_cairo_gstate_is_redirected #define _cairo_gstate_mask _mono_cairo_gstate_mask #define _cairo_gstate_paint _mono_cairo_gstate_paint #define _cairo_gstate_path_extents _mono_cairo_gstate_path_extents #define _cairo_gstate_redirect_target _mono_cairo_gstate_redirect_target #define _cairo_gstate_reset_clip _mono_cairo_gstate_reset_clip #define _cairo_gstate_restore _mono_cairo_gstate_restore #define _cairo_gstate_rotate _mono_cairo_gstate_rotate #define _cairo_gstate_save _mono_cairo_gstate_save #define _cairo_gstate_scale _mono_cairo_gstate_scale #define _cairo_gstate_select_font_face _mono_cairo_gstate_select_font_face #define _cairo_gstate_set_antialias _mono_cairo_gstate_set_antialias #define _cairo_gstate_set_dash _mono_cairo_gstate_set_dash #define _cairo_gstate_set_fill_rule _mono_cairo_gstate_set_fill_rule #define _cairo_gstate_set_font_face _mono_cairo_gstate_set_font_face #define _cairo_gstate_set_font_matrix _mono_cairo_gstate_set_font_matrix #define _cairo_gstate_set_font_options _mono_cairo_gstate_set_font_options #define _cairo_gstate_set_font_size _mono_cairo_gstate_set_font_size #define _cairo_gstate_set_line_cap _mono_cairo_gstate_set_line_cap #define _cairo_gstate_set_line_join _mono_cairo_gstate_set_line_join #define _cairo_gstate_set_line_width _mono_cairo_gstate_set_line_width #define _cairo_gstate_set_matrix _mono_cairo_gstate_set_matrix #define _cairo_gstate_set_miter_limit _mono_cairo_gstate_set_miter_limit #define _cairo_gstate_set_operator _mono_cairo_gstate_set_operator #define _cairo_gstate_set_source _mono_cairo_gstate_set_source #define _cairo_gstate_set_tolerance _mono_cairo_gstate_set_tolerance #define _cairo_gstate_show_glyphs _mono_cairo_gstate_show_glyphs #define _cairo_gstate_show_page _mono_cairo_gstate_show_page #define _cairo_gstate_stroke _mono_cairo_gstate_stroke #define _cairo_gstate_stroke_extents _mono_cairo_gstate_stroke_extents #define _cairo_gstate_text_to_glyphs _mono_cairo_gstate_text_to_glyphs #define _cairo_gstate_transform _mono_cairo_gstate_transform #define _cairo_gstate_transform_glyphs_to_backend _mono_cairo_gstate_transform_glyphs_to_backend #define _cairo_gstate_translate _mono_cairo_gstate_translate #define _cairo_gstate_traps_extents_to_user_rectangle _mono_cairo_gstate_traps_extents_to_user_rectangle #define _cairo_gstate_unset_scaled_font _mono_cairo_gstate_unset_scaled_font #define _cairo_gstate_user_to_backend _mono_cairo_gstate_user_to_backend #define _cairo_gstate_user_to_device _mono_cairo_gstate_user_to_device #define _cairo_gstate_user_to_device_distance _mono_cairo_gstate_user_to_device_distance #define _cairo_hash_string _mono_cairo_hash_string #define _cairo_hash_table_create _mono_cairo_hash_table_create #define _cairo_hash_table_destroy _mono_cairo_hash_table_destroy #define _cairo_hash_table_foreach _mono_cairo_hash_table_foreach #define _cairo_hash_table_insert _mono_cairo_hash_table_insert #define _cairo_hash_table_lookup _mono_cairo_hash_table_lookup #define _cairo_hash_table_lookup_internal _mono_cairo_hash_table_lookup_internal #define _cairo_hash_table_random_entry _mono_cairo_hash_table_random_entry #define _cairo_hash_table_remove _mono_cairo_hash_table_remove #define _cairo_hash_table_resize _mono_cairo_hash_table_resize #define _cairo_hull_compute _mono_cairo_hull_compute #define _cairo_hull_next_valid _mono_cairo_hull_next_valid #define _cairo_hull_vertex_compare _mono_cairo_hull_vertex_compare #define _cairo_image_analyze_transparency _mono_cairo_image_analyze_transparency #define _cairo_image_surface_acquire_dest_image _mono_cairo_image_surface_acquire_dest_image #define _cairo_image_surface_acquire_source_image _mono_cairo_image_surface_acquire_source_image #define _cairo_image_surface_assume_ownership_of_data _mono_cairo_image_surface_assume_ownership_of_data #define _cairo_image_surface_clone _mono_cairo_image_surface_clone #define _cairo_image_surface_clone_similar _mono_cairo_image_surface_clone_similar #define _cairo_image_surface_composite _mono_cairo_image_surface_composite #define _cairo_image_surface_composite_trapezoids _mono_cairo_image_surface_composite_trapezoids #define _cairo_image_surface_create_for_data_with_content _mono_cairo_image_surface_create_for_data_with_content #define _cairo_image_surface_create_for_pixman_image _mono_cairo_image_surface_create_for_pixman_image #define _cairo_image_surface_create_similar _mono_cairo_image_surface_create_similar #define _cairo_image_surface_create_with_content _mono_cairo_image_surface_create_with_content #define _cairo_image_surface_create_with_masks _mono_cairo_image_surface_create_with_masks #define _cairo_image_surface_create_with_pixman_format _mono_cairo_image_surface_create_with_pixman_format #define _cairo_image_surface_fill_rectangles _mono_cairo_image_surface_fill_rectangles #define _cairo_image_surface_finish _mono_cairo_image_surface_finish #define _cairo_image_surface_get_extents _mono_cairo_image_surface_get_extents #define _cairo_image_surface_get_font_options _mono_cairo_image_surface_get_font_options #define _cairo_image_surface_release_dest_image _mono_cairo_image_surface_release_dest_image #define _cairo_image_surface_release_source_image _mono_cairo_image_surface_release_source_image #define _cairo_image_surface_reset _mono_cairo_image_surface_reset #define _cairo_image_surface_set_attributes _mono_cairo_image_surface_set_attributes #define _cairo_image_surface_set_clip_region _mono_cairo_image_surface_set_clip_region #define _cairo_int128_divrem _mono_cairo_int128_divrem #define _cairo_int128_lt _mono_cairo_int128_lt #define _cairo_int32_to_int128 _mono_cairo_int32_to_int128 #define _cairo_int64_divrem _mono_cairo_int64_divrem #define _cairo_int64_to_int128 _mono_cairo_int64_to_int128 #define _cairo_int64x64_128_mul _mono_cairo_int64x64_128_mul #define _cairo_int_96by64_32x64_divrem _mono_cairo_int_96by64_32x64_divrem #define _cairo_lfsr_random_lut _mono_cairo_lfsr_random_lut #define _cairo_lfsr_random_state _mono_cairo_lfsr_random_state #define _cairo_lround _mono_cairo_lround #define _cairo_lzw_compress _mono_cairo_lzw_compress #define _cairo_matrix_compute_determinant _mono_cairo_matrix_compute_determinant #define _cairo_matrix_compute_scale_factors _mono_cairo_matrix_compute_scale_factors #define _cairo_matrix_get_affine _mono_cairo_matrix_get_affine #define _cairo_matrix_is_identity _mono_cairo_matrix_is_identity #define _cairo_matrix_is_integer_translation _mono_cairo_matrix_is_integer_translation #define _cairo_matrix_is_invertible _mono_cairo_matrix_is_invertible #define _cairo_matrix_is_translation _mono_cairo_matrix_is_translation #define _cairo_matrix_to_pixman_matrix _mono_cairo_matrix_to_pixman_matrix #define _cairo_matrix_transform_bounding_box _mono_cairo_matrix_transform_bounding_box #define _cairo_matrix_transformed_circle_major_axis _mono_cairo_matrix_transformed_circle_major_axis #define _cairo_memory_stream_copy _mono_cairo_memory_stream_copy #define _cairo_memory_stream_create _mono_cairo_memory_stream_create #define _cairo_memory_stream_length _mono_cairo_memory_stream_length #define _cairo_meta_surface_acquire_source_image _mono_cairo_meta_surface_acquire_source_image #define _cairo_meta_surface_create _mono_cairo_meta_surface_create #define _cairo_meta_surface_create_similar _mono_cairo_meta_surface_create_similar #define _cairo_meta_surface_fill _mono_cairo_meta_surface_fill #define _cairo_meta_surface_finish _mono_cairo_meta_surface_finish #define _cairo_meta_surface_get_extents _mono_cairo_meta_surface_get_extents #define _cairo_meta_surface_intersect_clip_path _mono_cairo_meta_surface_intersect_clip_path #define _cairo_meta_surface_mask _mono_cairo_meta_surface_mask #define _cairo_meta_surface_paint _mono_cairo_meta_surface_paint #define _cairo_meta_surface_release_source_image _mono_cairo_meta_surface_release_source_image #define _cairo_meta_surface_replay _mono_cairo_meta_surface_replay #define _cairo_meta_surface_replay_and_create_regions _mono_cairo_meta_surface_replay_and_create_regions #define _cairo_meta_surface_replay_internal _mono_cairo_meta_surface_replay_internal #define _cairo_meta_surface_replay_region _mono_cairo_meta_surface_replay_region #define _cairo_meta_surface_show_glyphs _mono_cairo_meta_surface_show_glyphs #define _cairo_meta_surface_snapshot _mono_cairo_meta_surface_snapshot #define _cairo_meta_surface_stroke _mono_cairo_meta_surface_stroke #define _cairo_nil _mono_cairo_nil #define _cairo_operator_bounded_by_mask _mono_cairo_operator_bounded_by_mask #define _cairo_operator_bounded_by_source _mono_cairo_operator_bounded_by_source #define _cairo_output_stream_close _mono_cairo_output_stream_close #define _cairo_output_stream_create _mono_cairo_output_stream_create #define _cairo_output_stream_create_for_file _mono_cairo_output_stream_create_for_file #define _cairo_output_stream_create_for_filename _mono_cairo_output_stream_create_for_filename #define _cairo_output_stream_create_in_error _mono_cairo_output_stream_create_in_error #define _cairo_output_stream_destroy _mono_cairo_output_stream_destroy #define _cairo_output_stream_fini _mono_cairo_output_stream_fini #define _cairo_output_stream_get_position _mono_cairo_output_stream_get_position #define _cairo_output_stream_get_status _mono_cairo_output_stream_get_status #define _cairo_output_stream_init _mono_cairo_output_stream_init #define _cairo_output_stream_nil _mono_cairo_output_stream_nil #define _cairo_output_stream_nil_write_error _mono_cairo_output_stream_nil_write_error #define _cairo_output_stream_printf _mono_cairo_output_stream_printf #define _cairo_output_stream_vprintf _mono_cairo_output_stream_vprintf #define _cairo_output_stream_write _mono_cairo_output_stream_write #define _cairo_output_stream_write_hex_string _mono_cairo_output_stream_write_hex_string #define _cairo_paginated_surface_acquire_source_image _mono_cairo_paginated_surface_acquire_source_image #define _cairo_paginated_surface_copy_page _mono_cairo_paginated_surface_copy_page #define _cairo_paginated_surface_create _mono_cairo_paginated_surface_create #define _cairo_paginated_surface_create_image_surface _mono_cairo_paginated_surface_create_image_surface #define _cairo_paginated_surface_create_similar _mono_cairo_paginated_surface_create_similar #define _cairo_paginated_surface_fill _mono_cairo_paginated_surface_fill #define _cairo_paginated_surface_finish _mono_cairo_paginated_surface_finish #define _cairo_paginated_surface_get_extents _mono_cairo_paginated_surface_get_extents #define _cairo_paginated_surface_get_font_options _mono_cairo_paginated_surface_get_font_options #define _cairo_paginated_surface_get_target _mono_cairo_paginated_surface_get_target #define _cairo_paginated_surface_intersect_clip_path _mono_cairo_paginated_surface_intersect_clip_path #define _cairo_paginated_surface_mask _mono_cairo_paginated_surface_mask #define _cairo_paginated_surface_paint _mono_cairo_paginated_surface_paint #define _cairo_paginated_surface_release_source_image _mono_cairo_paginated_surface_release_source_image #define _cairo_paginated_surface_set_size _mono_cairo_paginated_surface_set_size #define _cairo_paginated_surface_show_glyphs _mono_cairo_paginated_surface_show_glyphs #define _cairo_paginated_surface_show_page _mono_cairo_paginated_surface_show_page #define _cairo_paginated_surface_snapshot _mono_cairo_paginated_surface_snapshot #define _cairo_paginated_surface_stroke _mono_cairo_paginated_surface_stroke #define _cairo_path_append_to_context _mono_cairo_path_append_to_context #define _cairo_path_bounder_add_point _mono_cairo_path_bounder_add_point #define _cairo_path_bounder_close_path _mono_cairo_path_bounder_close_path #define _cairo_path_bounder_line_to _mono_cairo_path_bounder_line_to #define _cairo_path_bounder_move_to _mono_cairo_path_bounder_move_to #define _cairo_path_buf_create _mono_cairo_path_buf_create #define _cairo_path_create _mono_cairo_path_create #define _cairo_path_create_flat _mono_cairo_path_create_flat #define _cairo_path_create_in_error _mono_cairo_path_create_in_error #define _cairo_path_create_internal _mono_cairo_path_create_internal #define _cairo_path_fixed_add _mono_cairo_path_fixed_add #define _cairo_path_fixed_add_buf _mono_cairo_path_fixed_add_buf #define _cairo_path_fixed_bounds _mono_cairo_path_fixed_bounds #define _cairo_path_fixed_close_path _mono_cairo_path_fixed_close_path #define _cairo_path_fixed_create _mono_cairo_path_fixed_create #define _cairo_path_fixed_curve_to _mono_cairo_path_fixed_curve_to #define _cairo_path_fixed_destroy _mono_cairo_path_fixed_destroy #define _cairo_path_fixed_device_transform _mono_cairo_path_fixed_device_transform #define _cairo_path_fixed_fill_to_traps _mono_cairo_path_fixed_fill_to_traps #define _cairo_path_fixed_fini _mono_cairo_path_fixed_fini #define _cairo_path_fixed_get_current_point _mono_cairo_path_fixed_get_current_point #define _cairo_path_fixed_init _mono_cairo_path_fixed_init #define _cairo_path_fixed_init_copy _mono_cairo_path_fixed_init_copy #define _cairo_path_fixed_interpret _mono_cairo_path_fixed_interpret #define _cairo_path_fixed_interpret_flat _mono_cairo_path_fixed_interpret_flat #define _cairo_path_fixed_is_box _mono_cairo_path_fixed_is_box #define _cairo_path_fixed_is_empty _mono_cairo_path_fixed_is_empty #define _cairo_path_fixed_is_equal _mono_cairo_path_fixed_is_equal #define _cairo_path_fixed_is_rectangle _mono_cairo_path_fixed_is_rectangle #define _cairo_path_fixed_line_to _mono_cairo_path_fixed_line_to #define _cairo_path_fixed_move_to _mono_cairo_path_fixed_move_to #define _cairo_path_fixed_new_sub_path _mono_cairo_path_fixed_new_sub_path #define _cairo_path_fixed_rel_curve_to _mono_cairo_path_fixed_rel_curve_to #define _cairo_path_fixed_rel_line_to _mono_cairo_path_fixed_rel_line_to #define _cairo_path_fixed_rel_move_to _mono_cairo_path_fixed_rel_move_to #define _cairo_path_fixed_stroke_to_traps _mono_cairo_path_fixed_stroke_to_traps #define _cairo_path_nil _mono_cairo_path_nil #define _cairo_pattern_acquire_surface _mono_cairo_pattern_acquire_surface #define _cairo_pattern_acquire_surface_for_solid _mono_cairo_pattern_acquire_surface_for_solid #define _cairo_pattern_acquire_surfaces _mono_cairo_pattern_acquire_surfaces #define _cairo_pattern_add_color_stop _mono_cairo_pattern_add_color_stop #define _cairo_pattern_create_copy _mono_cairo_pattern_create_copy #define _cairo_pattern_create_solid _mono_cairo_pattern_create_solid #define _cairo_pattern_fini _mono_cairo_pattern_fini #define _cairo_pattern_get_extents _mono_cairo_pattern_get_extents #define _cairo_pattern_init _mono_cairo_pattern_init #define _cairo_pattern_init_copy _mono_cairo_pattern_init_copy #define _cairo_pattern_init_for_surface _mono_cairo_pattern_init_for_surface #define _cairo_pattern_init_gradient _mono_cairo_pattern_init_gradient #define _cairo_pattern_init_linear _mono_cairo_pattern_init_linear #define _cairo_pattern_init_radial _mono_cairo_pattern_init_radial #define _cairo_pattern_init_solid _mono_cairo_pattern_init_solid #define _cairo_pattern_is_opaque _mono_cairo_pattern_is_opaque #define _cairo_pattern_is_opaque_solid _mono_cairo_pattern_is_opaque_solid #define _cairo_pattern_nil _mono_cairo_pattern_nil #define _cairo_pattern_nil_null_pointer _mono_cairo_pattern_nil_null_pointer #define _cairo_pattern_release_surface _mono_cairo_pattern_release_surface #define _cairo_pattern_reset_static_data _mono_cairo_pattern_reset_static_data #define _cairo_pattern_set_error _mono_cairo_pattern_set_error #define _cairo_pattern_solid_pattern_cache_lock _mono_cairo_pattern_solid_pattern_cache_lock #define _cairo_pattern_solid_surface_cache_lock _mono_cairo_pattern_solid_surface_cache_lock #define _cairo_pattern_solid_surface_matches _mono_cairo_pattern_solid_surface_matches #define _cairo_pattern_transform _mono_cairo_pattern_transform #define _cairo_pdf_group_resources_clear _mono_cairo_pdf_group_resources_clear #define _cairo_pdf_operators_clip _mono_cairo_pdf_operators_clip #define _cairo_pdf_operators_emit_path _mono_cairo_pdf_operators_emit_path #define _cairo_pdf_operators_emit_stroke _mono_cairo_pdf_operators_emit_stroke #define _cairo_pdf_operators_fill _mono_cairo_pdf_operators_fill #define _cairo_pdf_operators_fill_stroke _mono_cairo_pdf_operators_fill_stroke #define _cairo_pdf_operators_fini _mono_cairo_pdf_operators_fini #define _cairo_pdf_operators_init _mono_cairo_pdf_operators_init #define _cairo_pdf_operators_set_cairo_to_pdf_matrix _mono_cairo_pdf_operators_set_cairo_to_pdf_matrix #define _cairo_pdf_operators_set_font_subsets_callback _mono_cairo_pdf_operators_set_font_subsets_callback #define _cairo_pdf_operators_set_stream _mono_cairo_pdf_operators_set_stream #define _cairo_pdf_operators_show_glyphs _mono_cairo_pdf_operators_show_glyphs #define _cairo_pdf_operators_stroke _mono_cairo_pdf_operators_stroke #define _cairo_pdf_path_close_path _mono_cairo_pdf_path_close_path #define _cairo_pdf_path_curve_to _mono_cairo_pdf_path_curve_to #define _cairo_pdf_path_line_to _mono_cairo_pdf_path_line_to #define _cairo_pdf_path_move_to _mono_cairo_pdf_path_move_to #define _cairo_pdf_smask_group_destroy _mono_cairo_pdf_smask_group_destroy #define _cairo_pdf_surface_add_alpha _mono_cairo_pdf_surface_add_alpha #define _cairo_pdf_surface_add_font _mono_cairo_pdf_surface_add_font #define _cairo_pdf_surface_add_pattern _mono_cairo_pdf_surface_add_pattern #define _cairo_pdf_surface_add_pdf_pattern _mono_cairo_pdf_surface_add_pdf_pattern #define _cairo_pdf_surface_add_smask _mono_cairo_pdf_surface_add_smask #define _cairo_pdf_surface_add_smask_group _mono_cairo_pdf_surface_add_smask_group #define _cairo_pdf_surface_add_xobject _mono_cairo_pdf_surface_add_xobject #define _cairo_pdf_surface_analyze_operation _mono_cairo_pdf_surface_analyze_operation #define _cairo_pdf_surface_clear _mono_cairo_pdf_surface_clear #define _cairo_pdf_surface_close_content_stream _mono_cairo_pdf_surface_close_content_stream #define _cairo_pdf_surface_close_group _mono_cairo_pdf_surface_close_group #define _cairo_pdf_surface_close_stream _mono_cairo_pdf_surface_close_stream #define _cairo_pdf_surface_create_for_stream_internal _mono_cairo_pdf_surface_create_for_stream_internal #define _cairo_pdf_surface_create_similar _mono_cairo_pdf_surface_create_similar #define _cairo_pdf_surface_create_smask_group _mono_cairo_pdf_surface_create_smask_group #define _cairo_pdf_surface_emit_cff_font _mono_cairo_pdf_surface_emit_cff_font #define _cairo_pdf_surface_emit_group_resources _mono_cairo_pdf_surface_emit_group_resources #define _cairo_pdf_surface_emit_pattern_stops _mono_cairo_pdf_surface_emit_pattern_stops #define _cairo_pdf_surface_emit_repeating_function _mono_cairo_pdf_surface_emit_repeating_function #define _cairo_pdf_surface_emit_scaled_font_subset _mono_cairo_pdf_surface_emit_scaled_font_subset #define _cairo_pdf_surface_emit_stitched_colorgradient _mono_cairo_pdf_surface_emit_stitched_colorgradient #define _cairo_pdf_surface_emit_surface_pattern _mono_cairo_pdf_surface_emit_surface_pattern #define _cairo_pdf_surface_emit_to_unicode_stream _mono_cairo_pdf_surface_emit_to_unicode_stream #define _cairo_pdf_surface_emit_type1_font _mono_cairo_pdf_surface_emit_type1_font #define _cairo_pdf_surface_emit_unscaled_font_subset _mono_cairo_pdf_surface_emit_unscaled_font_subset #define _cairo_pdf_surface_fill _mono_cairo_pdf_surface_fill #define _cairo_pdf_surface_fill_stroke _mono_cairo_pdf_surface_fill_stroke #define _cairo_pdf_surface_finish _mono_cairo_pdf_surface_finish #define _cairo_pdf_surface_get_extents _mono_cairo_pdf_surface_get_extents #define _cairo_pdf_surface_get_font_options _mono_cairo_pdf_surface_get_font_options #define _cairo_pdf_surface_get_font_resource _mono_cairo_pdf_surface_get_font_resource #define _cairo_pdf_surface_intersect_clip_path _mono_cairo_pdf_surface_intersect_clip_path #define _cairo_pdf_surface_mask _mono_cairo_pdf_surface_mask #define _cairo_pdf_surface_new_object _mono_cairo_pdf_surface_new_object #define _cairo_pdf_surface_open_content_stream _mono_cairo_pdf_surface_open_content_stream #define _cairo_pdf_surface_open_group _mono_cairo_pdf_surface_open_group #define _cairo_pdf_surface_open_stream _mono_cairo_pdf_surface_open_stream #define _cairo_pdf_surface_operation_supported _mono_cairo_pdf_surface_operation_supported #define _cairo_pdf_surface_paint _mono_cairo_pdf_surface_paint #define _cairo_pdf_surface_select_pattern _mono_cairo_pdf_surface_select_pattern #define _cairo_pdf_surface_set_paginated_mode _mono_cairo_pdf_surface_set_paginated_mode #define _cairo_pdf_surface_set_size_internal _mono_cairo_pdf_surface_set_size_internal #define _cairo_pdf_surface_show_glyphs _mono_cairo_pdf_surface_show_glyphs #define _cairo_pdf_surface_show_page _mono_cairo_pdf_surface_show_page #define _cairo_pdf_surface_start_fallback _mono_cairo_pdf_surface_start_fallback #define _cairo_pdf_surface_start_page _mono_cairo_pdf_surface_start_page #define _cairo_pdf_surface_stroke _mono_cairo_pdf_surface_stroke #define _cairo_pdf_surface_unselect_pattern _mono_cairo_pdf_surface_unselect_pattern #define _cairo_pdf_surface_update_object _mono_cairo_pdf_surface_update_object #define _cairo_pen_add_points _mono_cairo_pen_add_points #define _cairo_pen_compute_slopes _mono_cairo_pen_compute_slopes #define _cairo_pen_find_active_ccw_vertex_index _mono_cairo_pen_find_active_ccw_vertex_index #define _cairo_pen_find_active_cw_vertex_index _mono_cairo_pen_find_active_cw_vertex_index #define _cairo_pen_fini _mono_cairo_pen_fini #define _cairo_pen_init _mono_cairo_pen_init #define _cairo_pen_init_copy _mono_cairo_pen_init_copy #define _cairo_pen_init_empty _mono_cairo_pen_init_empty #define _cairo_pen_stroke_spline _mono_cairo_pen_stroke_spline #define _cairo_pen_stroke_spline_half _mono_cairo_pen_stroke_spline_half #define _cairo_polygon_add_edge _mono_cairo_polygon_add_edge #define _cairo_polygon_close _mono_cairo_polygon_close #define _cairo_polygon_fini _mono_cairo_polygon_fini #define _cairo_polygon_init _mono_cairo_polygon_init #define _cairo_polygon_line_to _mono_cairo_polygon_line_to #define _cairo_polygon_move_to _mono_cairo_polygon_move_to #define _cairo_polygon_status _mono_cairo_polygon_status #define _cairo_ps_level_strings _mono_cairo_ps_level_strings #define _cairo_ps_levels _mono_cairo_ps_levels #define _cairo_ps_surface_acquire_surface _mono_cairo_ps_surface_acquire_surface #define _cairo_ps_surface_analyze_operation _mono_cairo_ps_surface_analyze_operation #define _cairo_ps_surface_create_for_stream_internal _mono_cairo_ps_surface_create_for_stream_internal #define _cairo_ps_surface_create_similar _mono_cairo_ps_surface_create_similar #define _cairo_ps_surface_emit_base85_string _mono_cairo_ps_surface_emit_base85_string #define _cairo_ps_surface_emit_body _mono_cairo_ps_surface_emit_body #define _cairo_ps_surface_emit_linear_colorgradient _mono_cairo_ps_surface_emit_linear_colorgradient #define _cairo_ps_surface_emit_pattern _mono_cairo_ps_surface_emit_pattern #define _cairo_ps_surface_emit_pattern_stops _mono_cairo_ps_surface_emit_pattern_stops #define _cairo_ps_surface_emit_scaled_font_subset _mono_cairo_ps_surface_emit_scaled_font_subset #define _cairo_ps_surface_emit_surface _mono_cairo_ps_surface_emit_surface #define _cairo_ps_surface_emit_unscaled_font_subset _mono_cairo_ps_surface_emit_unscaled_font_subset #define _cairo_ps_surface_fill _mono_cairo_ps_surface_fill #define _cairo_ps_surface_finish _mono_cairo_ps_surface_finish #define _cairo_ps_surface_flatten_transparency _mono_cairo_ps_surface_flatten_transparency #define _cairo_ps_surface_get_extents _mono_cairo_ps_surface_get_extents #define _cairo_ps_surface_get_font_options _mono_cairo_ps_surface_get_font_options #define _cairo_ps_surface_intersect_clip_path _mono_cairo_ps_surface_intersect_clip_path #define _cairo_ps_surface_operation_supported _mono_cairo_ps_surface_operation_supported #define _cairo_ps_surface_paint _mono_cairo_ps_surface_paint #define _cairo_ps_surface_paint_surface _mono_cairo_ps_surface_paint_surface #define _cairo_ps_surface_set_bounding_box _mono_cairo_ps_surface_set_bounding_box #define _cairo_ps_surface_set_paginated_mode _mono_cairo_ps_surface_set_paginated_mode #define _cairo_ps_surface_show_glyphs _mono_cairo_ps_surface_show_glyphs #define _cairo_ps_surface_show_page _mono_cairo_ps_surface_show_page #define _cairo_ps_surface_start_page _mono_cairo_ps_surface_start_page #define _cairo_ps_surface_stroke _mono_cairo_ps_surface_stroke #define _cairo_rectangle_intersect _mono_cairo_rectangle_intersect #define _cairo_rectangles_nil _mono_cairo_rectangles_nil #define _cairo_rectangles_not_representable _mono_cairo_rectangles_not_representable #define _cairo_rectilinear_stroker_close_path _mono_cairo_rectilinear_stroker_close_path #define _cairo_rectilinear_stroker_emit_segments _mono_cairo_rectilinear_stroker_emit_segments #define _cairo_rectilinear_stroker_line_to _mono_cairo_rectilinear_stroker_line_to #define _cairo_rectilinear_stroker_move_to _mono_cairo_rectilinear_stroker_move_to #define _cairo_region_boxes_fini _mono_cairo_region_boxes_fini #define _cairo_region_contains_rectangle _mono_cairo_region_contains_rectangle #define _cairo_region_copy _mono_cairo_region_copy #define _cairo_region_fini _mono_cairo_region_fini #define _cairo_region_get_boxes _mono_cairo_region_get_boxes #define _cairo_region_get_extents _mono_cairo_region_get_extents #define _cairo_region_init _mono_cairo_region_init #define _cairo_region_init_boxes _mono_cairo_region_init_boxes #define _cairo_region_init_rect _mono_cairo_region_init_rect #define _cairo_region_intersect _mono_cairo_region_intersect #define _cairo_region_not_empty _mono_cairo_region_not_empty #define _cairo_region_num_boxes _mono_cairo_region_num_boxes #define _cairo_region_subtract _mono_cairo_region_subtract #define _cairo_region_translate _mono_cairo_region_translate #define _cairo_region_union_rect _mono_cairo_region_union_rect #define _cairo_restrict_value _mono_cairo_restrict_value #define _cairo_scaled_font_create_in_error _mono_cairo_scaled_font_create_in_error #define _cairo_scaled_font_error_mutex _mono_cairo_scaled_font_error_mutex #define _cairo_scaled_font_fini _mono_cairo_scaled_font_fini #define _cairo_scaled_font_freeze_cache _mono_cairo_scaled_font_freeze_cache #define _cairo_scaled_font_glyph_device_extents _mono_cairo_scaled_font_glyph_device_extents #define _cairo_scaled_font_glyph_path _mono_cairo_scaled_font_glyph_path #define _cairo_scaled_font_init _mono_cairo_scaled_font_init #define _cairo_scaled_font_init_key _mono_cairo_scaled_font_init_key #define _cairo_scaled_font_is_ft _mono_cairo_scaled_font_is_ft #define _cairo_scaled_font_keys_equal _mono_cairo_scaled_font_keys_equal #define _cairo_scaled_font_map_destroy _mono_cairo_scaled_font_map_destroy #define _cairo_scaled_font_map_lock _mono_cairo_scaled_font_map_lock #define _cairo_scaled_font_map_mutex _mono_cairo_scaled_font_map_mutex #define _cairo_scaled_font_map_unlock _mono_cairo_scaled_font_map_unlock #define _cairo_scaled_font_nil _mono_cairo_scaled_font_nil #define _cairo_scaled_font_nil_objects _mono_cairo_scaled_font_nil_objects #define _cairo_scaled_font_reset_cache _mono_cairo_scaled_font_reset_cache #define _cairo_scaled_font_reset_static_data _mono_cairo_scaled_font_reset_static_data #define _cairo_scaled_font_set_error _mono_cairo_scaled_font_set_error #define _cairo_scaled_font_set_metrics _mono_cairo_scaled_font_set_metrics #define _cairo_scaled_font_show_glyphs _mono_cairo_scaled_font_show_glyphs #define _cairo_scaled_font_subset_create_glyph_names _mono_cairo_scaled_font_subset_create_glyph_names #define _cairo_scaled_font_subsets_create_composite _mono_cairo_scaled_font_subsets_create_composite #define _cairo_scaled_font_subsets_create_internal _mono_cairo_scaled_font_subsets_create_internal #define _cairo_scaled_font_subsets_create_scaled _mono_cairo_scaled_font_subsets_create_scaled #define _cairo_scaled_font_subsets_create_simple _mono_cairo_scaled_font_subsets_create_simple #define _cairo_scaled_font_subsets_destroy _mono_cairo_scaled_font_subsets_destroy #define _cairo_scaled_font_subsets_foreach_internal _mono_cairo_scaled_font_subsets_foreach_internal #define _cairo_scaled_font_subsets_foreach_scaled _mono_cairo_scaled_font_subsets_foreach_scaled #define _cairo_scaled_font_subsets_foreach_unscaled _mono_cairo_scaled_font_subsets_foreach_unscaled #define _cairo_scaled_font_subsets_map_glyph _mono_cairo_scaled_font_subsets_map_glyph #define _cairo_scaled_font_text_to_glyphs _mono_cairo_scaled_font_text_to_glyphs #define _cairo_scaled_font_thaw_cache _mono_cairo_scaled_font_thaw_cache #define _cairo_scaled_glyph_destroy _mono_cairo_scaled_glyph_destroy #define _cairo_scaled_glyph_keys_equal _mono_cairo_scaled_glyph_keys_equal #define _cairo_scaled_glyph_lookup _mono_cairo_scaled_glyph_lookup #define _cairo_scaled_glyph_set_metrics _mono_cairo_scaled_glyph_set_metrics #define _cairo_scaled_glyph_set_path _mono_cairo_scaled_glyph_set_path #define _cairo_scaled_glyph_set_surface _mono_cairo_scaled_glyph_set_surface #define _cairo_set_error _mono_cairo_set_error #define _cairo_skip_list_delete _mono_cairo_skip_list_delete #define _cairo_skip_list_delete_given _mono_cairo_skip_list_delete_given #define _cairo_skip_list_find _mono_cairo_skip_list_find #define _cairo_skip_list_fini _mono_cairo_skip_list_fini #define _cairo_skip_list_init _mono_cairo_skip_list_init #define _cairo_skip_list_insert _mono_cairo_skip_list_insert #define _cairo_slope_compare _mono_cairo_slope_compare #define _cairo_slope_compare_sgn _mono_cairo_slope_compare_sgn #define _cairo_slope_init _mono_cairo_slope_init #define _cairo_spline_add_point _mono_cairo_spline_add_point #define _cairo_spline_decompose _mono_cairo_spline_decompose #define _cairo_spline_decompose_into _mono_cairo_spline_decompose_into #define _cairo_spline_fini _mono_cairo_spline_fini #define _cairo_spline_init _mono_cairo_spline_init #define _cairo_stock_color _mono_cairo_stock_color #define _cairo_string_equal _mono_cairo_string_equal #define _cairo_string_init_key _mono_cairo_string_init_key #define _cairo_stroke_style_fini _mono_cairo_stroke_style_fini #define _cairo_stroke_style_init _mono_cairo_stroke_style_init #define _cairo_stroke_style_init_copy _mono_cairo_stroke_style_init_copy #define _cairo_stroke_style_max_distance_from_path _mono_cairo_stroke_style_max_distance_from_path #define _cairo_stroker_add_cap _mono_cairo_stroker_add_cap #define _cairo_stroker_add_caps _mono_cairo_stroker_add_caps #define _cairo_stroker_add_leading_cap _mono_cairo_stroker_add_leading_cap #define _cairo_stroker_add_sub_edge _mono_cairo_stroker_add_sub_edge #define _cairo_stroker_add_trailing_cap _mono_cairo_stroker_add_trailing_cap #define _cairo_stroker_close_path _mono_cairo_stroker_close_path #define _cairo_stroker_curve_to _mono_cairo_stroker_curve_to #define _cairo_stroker_curve_to_dashed _mono_cairo_stroker_curve_to_dashed #define _cairo_stroker_join _mono_cairo_stroker_join #define _cairo_stroker_line_to _mono_cairo_stroker_line_to #define _cairo_stroker_line_to_dashed _mono_cairo_stroker_line_to_dashed #define _cairo_stroker_move_to _mono_cairo_stroker_move_to #define _cairo_stroker_move_to_dashed _mono_cairo_stroker_move_to_dashed #define _cairo_stroker_start_dash _mono_cairo_stroker_start_dash #define _cairo_sub_font_collect _mono_cairo_sub_font_collect #define _cairo_sub_font_create _mono_cairo_sub_font_create #define _cairo_sub_font_destroy _mono_cairo_sub_font_destroy #define _cairo_sub_font_glyph_collect _mono_cairo_sub_font_glyph_collect #define _cairo_sub_font_glyph_destroy _mono_cairo_sub_font_glyph_destroy #define _cairo_sub_font_glyph_init_key _mono_cairo_sub_font_glyph_init_key #define _cairo_sub_font_glyph_pluck _mono_cairo_sub_font_glyph_pluck #define _cairo_sub_font_glyphs_equal _mono_cairo_sub_font_glyphs_equal #define _cairo_sub_font_init_key _mono_cairo_sub_font_init_key #define _cairo_sub_font_lookup_glyph _mono_cairo_sub_font_lookup_glyph #define _cairo_sub_font_map_glyph _mono_cairo_sub_font_map_glyph #define _cairo_sub_font_pluck _mono_cairo_sub_font_pluck #define _cairo_sub_fonts_equal _mono_cairo_sub_fonts_equal #define _cairo_surface_acquire_dest_image _mono_cairo_surface_acquire_dest_image #define _cairo_surface_acquire_source_image _mono_cairo_surface_acquire_source_image #define _cairo_surface_allocate_clip_serial _mono_cairo_surface_allocate_clip_serial #define _cairo_surface_clone_similar _mono_cairo_surface_clone_similar #define _cairo_surface_composite _mono_cairo_surface_composite #define _cairo_surface_composite_fixup_unbounded _mono_cairo_surface_composite_fixup_unbounded #define _cairo_surface_composite_fixup_unbounded_internal _mono_cairo_surface_composite_fixup_unbounded_internal #define _cairo_surface_composite_shape_fixup_unbounded _mono_cairo_surface_composite_shape_fixup_unbounded #define _cairo_surface_composite_trapezoids _mono_cairo_surface_composite_trapezoids #define _cairo_surface_copy_pattern_for_destination _mono_cairo_surface_copy_pattern_for_destination #define _cairo_surface_create_in_error _mono_cairo_surface_create_in_error #define _cairo_surface_create_similar_scratch _mono_cairo_surface_create_similar_scratch #define _cairo_surface_create_similar_solid _mono_cairo_surface_create_similar_solid #define _cairo_surface_fallback_clone_similar _mono_cairo_surface_fallback_clone_similar #define _cairo_surface_fallback_composite _mono_cairo_surface_fallback_composite #define _cairo_surface_fallback_composite_trapezoids _mono_cairo_surface_fallback_composite_trapezoids #define _cairo_surface_fallback_fill _mono_cairo_surface_fallback_fill #define _cairo_surface_fallback_fill_rectangles _mono_cairo_surface_fallback_fill_rectangles #define _cairo_surface_fallback_mask _mono_cairo_surface_fallback_mask #define _cairo_surface_fallback_paint _mono_cairo_surface_fallback_paint #define _cairo_surface_fallback_show_glyphs _mono_cairo_surface_fallback_show_glyphs #define _cairo_surface_fallback_snapshot _mono_cairo_surface_fallback_snapshot #define _cairo_surface_fallback_stroke _mono_cairo_surface_fallback_stroke #define _cairo_surface_fill _mono_cairo_surface_fill #define _cairo_surface_fill_rectangle _mono_cairo_surface_fill_rectangle #define _cairo_surface_fill_rectangles _mono_cairo_surface_fill_rectangles #define _cairo_surface_fill_region _mono_cairo_surface_fill_region #define _cairo_surface_fill_stroke _mono_cairo_surface_fill_stroke #define _cairo_surface_get_clip _mono_cairo_surface_get_clip #define _cairo_surface_get_clip_mode _mono_cairo_surface_get_clip_mode #define _cairo_surface_get_current_clip_serial _mono_cairo_surface_get_current_clip_serial #define _cairo_surface_get_extents _mono_cairo_surface_get_extents #define _cairo_surface_has_device_transform _mono_cairo_surface_has_device_transform #define _cairo_surface_init _mono_cairo_surface_init #define _cairo_surface_intersect_clip_path _mono_cairo_surface_intersect_clip_path #define _cairo_surface_is_image _mono_cairo_surface_is_image #define _cairo_surface_is_meta _mono_cairo_surface_is_meta #define _cairo_surface_is_paginated _mono_cairo_surface_is_paginated #define _cairo_surface_is_similar _mono_cairo_surface_is_similar #define _cairo_surface_is_xlib _mono_cairo_surface_is_xlib #define _cairo_surface_mask _mono_cairo_surface_mask #define _cairo_surface_mask_draw_func _mono_cairo_surface_mask_draw_func #define _cairo_surface_nil _mono_cairo_surface_nil #define _cairo_surface_nil_file_not_found _mono_cairo_surface_nil_file_not_found #define _cairo_surface_nil_invalid_content _mono_cairo_surface_nil_invalid_content #define _cairo_surface_nil_invalid_format _mono_cairo_surface_nil_invalid_format #define _cairo_surface_nil_invalid_stride _mono_cairo_surface_nil_invalid_stride #define _cairo_surface_nil_invalid_visual _mono_cairo_surface_nil_invalid_visual #define _cairo_surface_nil_read_error _mono_cairo_surface_nil_read_error #define _cairo_surface_nil_temp_file_error _mono_cairo_surface_nil_temp_file_error #define _cairo_surface_nil_write_error _mono_cairo_surface_nil_write_error #define _cairo_surface_old_show_glyphs _mono_cairo_surface_old_show_glyphs #define _cairo_surface_old_show_glyphs_draw_func _mono_cairo_surface_old_show_glyphs_draw_func #define _cairo_surface_paint _mono_cairo_surface_paint #define _cairo_surface_release_dest_image _mono_cairo_surface_release_dest_image #define _cairo_surface_release_source_image _mono_cairo_surface_release_source_image #define _cairo_surface_reset _mono_cairo_surface_reset #define _cairo_surface_reset_clip _mono_cairo_surface_reset_clip #define _cairo_surface_set_clip _mono_cairo_surface_set_clip #define _cairo_surface_set_clip_path_recursive _mono_cairo_surface_set_clip_path_recursive #define _cairo_surface_set_clip_region _mono_cairo_surface_set_clip_region #define _cairo_surface_set_device_scale _mono_cairo_surface_set_device_scale #define _cairo_surface_set_empty_clip_path _mono_cairo_surface_set_empty_clip_path #define _cairo_surface_set_error _mono_cairo_surface_set_error #define _cairo_surface_set_font_options _mono_cairo_surface_set_font_options #define _cairo_surface_set_resolution _mono_cairo_surface_set_resolution #define _cairo_surface_show_glyphs _mono_cairo_surface_show_glyphs #define _cairo_surface_snapshot _mono_cairo_surface_snapshot #define _cairo_surface_stroke _mono_cairo_surface_stroke #define _cairo_svg_document_destroy _mono_cairo_svg_document_destroy #define _cairo_svg_document_emit_font_subset _mono_cairo_svg_document_emit_font_subset #define _cairo_svg_document_finish _mono_cairo_svg_document_finish #define _cairo_svg_internal_version_strings _mono_cairo_svg_internal_version_strings #define _cairo_svg_path_close_path _mono_cairo_svg_path_close_path #define _cairo_svg_path_curve_to _mono_cairo_svg_path_curve_to #define _cairo_svg_path_line_to _mono_cairo_svg_path_line_to #define _cairo_svg_path_move_to _mono_cairo_svg_path_move_to #define _cairo_svg_surface_analyze_operation _mono_cairo_svg_surface_analyze_operation #define _cairo_svg_surface_copy_page _mono_cairo_svg_surface_copy_page #define _cairo_svg_surface_create_for_document _mono_cairo_svg_surface_create_for_document #define _cairo_svg_surface_create_for_stream_internal _mono_cairo_svg_surface_create_for_stream_internal #define _cairo_svg_surface_create_similar _mono_cairo_svg_surface_create_similar #define _cairo_svg_surface_emit_alpha_filter _mono_cairo_svg_surface_emit_alpha_filter #define _cairo_svg_surface_emit_composite_pattern _mono_cairo_svg_surface_emit_composite_pattern #define _cairo_svg_surface_emit_fill_style _mono_cairo_svg_surface_emit_fill_style #define _cairo_svg_surface_emit_operator _mono_cairo_svg_surface_emit_operator #define _cairo_svg_surface_emit_paint _mono_cairo_svg_surface_emit_paint #define _cairo_svg_surface_emit_path _mono_cairo_svg_surface_emit_path #define _cairo_svg_surface_emit_pattern _mono_cairo_svg_surface_emit_pattern #define _cairo_svg_surface_emit_pattern_extend _mono_cairo_svg_surface_emit_pattern_extend #define _cairo_svg_surface_emit_pattern_stops _mono_cairo_svg_surface_emit_pattern_stops #define _cairo_svg_surface_emit_stroke_style _mono_cairo_svg_surface_emit_stroke_style #define _cairo_svg_surface_emit_transform _mono_cairo_svg_surface_emit_transform #define _cairo_svg_surface_fill _mono_cairo_svg_surface_fill #define _cairo_svg_surface_fill_stroke _mono_cairo_svg_surface_fill_stroke #define _cairo_svg_surface_finish _mono_cairo_svg_surface_finish #define _cairo_svg_surface_get_extents _mono_cairo_svg_surface_get_extents #define _cairo_svg_surface_get_font_options _mono_cairo_svg_surface_get_font_options #define _cairo_svg_surface_intersect_clip_path _mono_cairo_svg_surface_intersect_clip_path #define _cairo_svg_surface_mask _mono_cairo_svg_surface_mask #define _cairo_svg_surface_operation_supported _mono_cairo_svg_surface_operation_supported #define _cairo_svg_surface_paint _mono_cairo_svg_surface_paint #define _cairo_svg_surface_set_paginated_mode _mono_cairo_svg_surface_set_paginated_mode #define _cairo_svg_surface_show_glyphs _mono_cairo_svg_surface_show_glyphs #define _cairo_svg_surface_show_page _mono_cairo_svg_surface_show_page #define _cairo_svg_surface_store_page _mono_cairo_svg_surface_store_page #define _cairo_svg_surface_stroke _mono_cairo_svg_surface_stroke #define _cairo_svg_version_strings _mono_cairo_svg_version_strings #define _cairo_svg_versions _mono_cairo_svg_versions #define _cairo_toy_font_face_backend _mono_cairo_toy_font_face_backend #define _cairo_toy_font_face_create _mono_cairo_toy_font_face_create #define _cairo_toy_font_face_destroy _mono_cairo_toy_font_face_destroy #define _cairo_toy_font_face_fini _mono_cairo_toy_font_face_fini #define _cairo_toy_font_face_hash_table_lock _mono_cairo_toy_font_face_hash_table_lock #define _cairo_toy_font_face_hash_table_unlock _mono_cairo_toy_font_face_hash_table_unlock #define _cairo_toy_font_face_init_key _mono_cairo_toy_font_face_init_key #define _cairo_toy_font_face_keys_equal _mono_cairo_toy_font_face_keys_equal #define _cairo_toy_font_face_scaled_font_create _mono_cairo_toy_font_face_scaled_font_create #define _cairo_trapezoid_array_translate_and_scale _mono_cairo_trapezoid_array_translate_and_scale #define _cairo_traps_add_trap_from_points _mono_cairo_traps_add_trap_from_points #define _cairo_traps_contain _mono_cairo_traps_contain #define _cairo_traps_extents _mono_cairo_traps_extents #define _cairo_traps_extract_region _mono_cairo_traps_extract_region #define _cairo_traps_fini _mono_cairo_traps_fini #define _cairo_traps_get_limit _mono_cairo_traps_get_limit #define _cairo_traps_init _mono_cairo_traps_init #define _cairo_traps_init_box _mono_cairo_traps_init_box #define _cairo_traps_limit _mono_cairo_traps_limit #define _cairo_traps_status _mono_cairo_traps_status #define _cairo_traps_tessellate_convex_quad _mono_cairo_traps_tessellate_convex_quad #define _cairo_traps_tessellate_triangle _mono_cairo_traps_tessellate_triangle #define _cairo_traps_translate _mono_cairo_traps_translate #define _cairo_truetype_create_glyph_to_unicode_map _mono_cairo_truetype_create_glyph_to_unicode_map #define _cairo_truetype_font_set_error _mono_cairo_truetype_font_set_error #define _cairo_truetype_subset_fini _mono_cairo_truetype_subset_fini #define _cairo_truetype_subset_init _mono_cairo_truetype_subset_init #define _cairo_type1_fallback_fini _mono_cairo_type1_fallback_fini #define _cairo_type1_fallback_init_binary _mono_cairo_type1_fallback_init_binary #define _cairo_type1_fallback_init_hex _mono_cairo_type1_fallback_init_hex #define _cairo_type1_fallback_init_internal _mono_cairo_type1_fallback_init_internal #define _cairo_type1_scaled_font_is_type1 _mono_cairo_type1_scaled_font_is_type1 #define _cairo_type1_subset_fini _mono_cairo_type1_subset_fini #define _cairo_type1_subset_init _mono_cairo_type1_subset_init #define _cairo_type2_charstrings_fini _mono_cairo_type2_charstrings_fini #define _cairo_type2_charstrings_init _mono_cairo_type2_charstrings_init #define _cairo_uint128_add _mono_cairo_uint128_add #define _cairo_uint128_divrem _mono_cairo_uint128_divrem #define _cairo_uint128_eq _mono_cairo_uint128_eq #define _cairo_uint128_lsl _mono_cairo_uint128_lsl #define _cairo_uint128_lt _mono_cairo_uint128_lt #define _cairo_uint128_mul _mono_cairo_uint128_mul #define _cairo_uint128_negate _mono_cairo_uint128_negate #define _cairo_uint128_not _mono_cairo_uint128_not #define _cairo_uint128_rsa _mono_cairo_uint128_rsa #define _cairo_uint128_rsl _mono_cairo_uint128_rsl #define _cairo_uint128_sub _mono_cairo_uint128_sub #define _cairo_uint32_to_uint128 _mono_cairo_uint32_to_uint128 #define _cairo_uint64_divrem _mono_cairo_uint64_divrem #define _cairo_uint64_to_uint128 _mono_cairo_uint64_to_uint128 #define _cairo_uint64x64_128_mul _mono_cairo_uint64x64_128_mul #define _cairo_uint_96by64_32x64_divrem _mono_cairo_uint_96by64_32x64_divrem #define _cairo_unscaled_font_destroy _mono_cairo_unscaled_font_destroy #define _cairo_unscaled_font_init _mono_cairo_unscaled_font_init #define _cairo_unscaled_font_is_ft _mono_cairo_unscaled_font_is_ft #define _cairo_unscaled_font_reference _mono_cairo_unscaled_font_reference #define _cairo_user_data_array_fini _mono_cairo_user_data_array_fini #define _cairo_user_data_array_get_data _mono_cairo_user_data_array_get_data #define _cairo_user_data_array_init _mono_cairo_user_data_array_init #define _cairo_user_data_array_set_data _mono_cairo_user_data_array_set_data #define _cairo_utf8_to_ucs4 _mono_cairo_utf8_to_ucs4 #define _cairo_xlib_add_close_display_hook _mono_cairo_xlib_add_close_display_hook #define _cairo_xlib_close_display _mono_cairo_xlib_close_display #define _cairo_xlib_display_destroy _mono_cairo_xlib_display_destroy #define _cairo_xlib_display_get _mono_cairo_xlib_display_get #define _cairo_xlib_display_list _mono_cairo_xlib_display_list #define _cairo_xlib_display_mutex _mono_cairo_xlib_display_mutex #define _cairo_xlib_display_notify _mono_cairo_xlib_display_notify #define _cairo_xlib_display_queue_resource _mono_cairo_xlib_display_queue_resource #define _cairo_xlib_display_queue_work _mono_cairo_xlib_display_queue_work #define _cairo_xlib_display_reference _mono_cairo_xlib_display_reference #define _cairo_xlib_remove_close_display_hooks _mono_cairo_xlib_remove_close_display_hooks #define _cairo_xlib_render_free_glyphs _mono_cairo_xlib_render_free_glyphs #define _cairo_xlib_scaled_glyph_get_glyphset_info _mono_cairo_xlib_scaled_glyph_get_glyphset_info #define _cairo_xlib_screen_get_gc _mono_cairo_xlib_screen_get_gc #define _cairo_xlib_screen_get_visual_info _mono_cairo_xlib_screen_get_visual_info #define _cairo_xlib_screen_info_close_display _mono_cairo_xlib_screen_info_close_display #define _cairo_xlib_screen_info_destroy _mono_cairo_xlib_screen_info_destroy #define _cairo_xlib_screen_info_get _mono_cairo_xlib_screen_info_get #define _cairo_xlib_screen_info_reference _mono_cairo_xlib_screen_info_reference #define _cairo_xlib_screen_put_gc _mono_cairo_xlib_screen_put_gc #define _cairo_xlib_surface_acquire_dest_image _mono_cairo_xlib_surface_acquire_dest_image #define _cairo_xlib_surface_acquire_source_image _mono_cairo_xlib_surface_acquire_source_image #define _cairo_xlib_surface_clone_similar _mono_cairo_xlib_surface_clone_similar #define _cairo_xlib_surface_composite _mono_cairo_xlib_surface_composite #define _cairo_xlib_surface_composite_trapezoids _mono_cairo_xlib_surface_composite_trapezoids #define _cairo_xlib_surface_create_internal _mono_cairo_xlib_surface_create_internal #define _cairo_xlib_surface_create_similar _mono_cairo_xlib_surface_create_similar #define _cairo_xlib_surface_create_similar_with_format _mono_cairo_xlib_surface_create_similar_with_format #define _cairo_xlib_surface_detach_display _mono_cairo_xlib_surface_detach_display #define _cairo_xlib_surface_emit_glyphs_chunk _mono_cairo_xlib_surface_emit_glyphs_chunk #define _cairo_xlib_surface_ensure_dst_picture _mono_cairo_xlib_surface_ensure_dst_picture #define _cairo_xlib_surface_ensure_gc _mono_cairo_xlib_surface_ensure_gc #define _cairo_xlib_surface_fill_rectangles _mono_cairo_xlib_surface_fill_rectangles #define _cairo_xlib_surface_finish _mono_cairo_xlib_surface_finish #define _cairo_xlib_surface_get_extents _mono_cairo_xlib_surface_get_extents #define _cairo_xlib_surface_get_font_options _mono_cairo_xlib_surface_get_font_options #define _cairo_xlib_surface_is_similar _mono_cairo_xlib_surface_is_similar #define _cairo_xlib_surface_release_dest_image _mono_cairo_xlib_surface_release_dest_image #define _cairo_xlib_surface_release_source_image _mono_cairo_xlib_surface_release_source_image #define _cairo_xlib_surface_remove_scaled_font _mono_cairo_xlib_surface_remove_scaled_font #define _cairo_xlib_surface_reset _mono_cairo_xlib_surface_reset #define _cairo_xlib_surface_same_screen _mono_cairo_xlib_surface_same_screen #define _cairo_xlib_surface_scaled_font_fini _mono_cairo_xlib_surface_scaled_font_fini #define _cairo_xlib_surface_scaled_glyph_fini _mono_cairo_xlib_surface_scaled_glyph_fini #define _cairo_xlib_surface_set_attributes _mono_cairo_xlib_surface_set_attributes #define _cairo_xlib_surface_set_clip_region _mono_cairo_xlib_surface_set_clip_region #define _cairo_xlib_surface_set_gc_clip_rects _mono_cairo_xlib_surface_set_gc_clip_rects #define _cairo_xlib_surface_set_picture_clip_rects _mono_cairo_xlib_surface_set_picture_clip_rects #define _cairo_xlib_surface_set_repeat _mono_cairo_xlib_surface_set_repeat #define _cairo_xlib_surface_show_glyphs _mono_cairo_xlib_surface_show_glyphs #define _cairo_xlib_visual_info_create _mono_cairo_xlib_visual_info_create #define _cairo_xlib_visual_info_destroy _mono_cairo_xlib_visual_info_destroy #define cairo_analysis_surface_backend mono_cairo_analysis_surface_backend #define cairo_append_path mono_cairo_append_path #define cairo_arc mono_cairo_arc #define cairo_arc_negative mono_cairo_arc_negative #define cairo_bo_event_compare_abstract mono_cairo_bo_event_compare_abstract #define cairo_bo_event_compare_pointers mono_cairo_bo_event_compare_pointers #define cairo_cff_font_create_cid_fontdict mono_cairo_cff_font_create_cid_fontdict #define cairo_cff_font_destroy mono_cairo_cff_font_destroy #define cairo_cff_font_read_global_subroutines mono_cairo_cff_font_read_global_subroutines #define cairo_cff_font_read_header mono_cairo_cff_font_read_header #define cairo_cff_font_read_name mono_cairo_cff_font_read_name #define cairo_cff_font_read_private_dict mono_cairo_cff_font_read_private_dict #define cairo_cff_font_read_strings mono_cairo_cff_font_read_strings #define cairo_cff_font_read_top_dict mono_cairo_cff_font_read_top_dict #define cairo_cff_font_set_ros_strings mono_cairo_cff_font_set_ros_strings #define cairo_cff_font_set_topdict_operator_to_cur_pos mono_cairo_cff_font_set_topdict_operator_to_cur_pos #define cairo_cff_font_subset_dict_strings mono_cairo_cff_font_subset_dict_strings #define cairo_cff_font_write_charset mono_cairo_cff_font_write_charset #define cairo_cff_font_write_charstrings mono_cairo_cff_font_write_charstrings #define cairo_cff_font_write_cid_fontdict mono_cairo_cff_font_write_cid_fontdict #define cairo_cff_font_write_cid_private_dict_and_local_sub mono_cairo_cff_font_write_cid_private_dict_and_local_sub #define cairo_cff_font_write_fdselect mono_cairo_cff_font_write_fdselect #define cairo_cff_font_write_global_subrs mono_cairo_cff_font_write_global_subrs #define cairo_cff_font_write_header mono_cairo_cff_font_write_header #define cairo_cff_font_write_local_sub mono_cairo_cff_font_write_local_sub #define cairo_cff_font_write_name mono_cairo_cff_font_write_name #define cairo_cff_font_write_private_dict mono_cairo_cff_font_write_private_dict #define cairo_cff_font_write_strings mono_cairo_cff_font_write_strings #define cairo_cff_font_write_subset mono_cairo_cff_font_write_subset #define cairo_cff_font_write_top_dict mono_cairo_cff_font_write_top_dict #define cairo_clip mono_cairo_clip #define cairo_clip_extents mono_cairo_clip_extents #define cairo_clip_preserve mono_cairo_clip_preserve #define cairo_close_path mono_cairo_close_path #define cairo_color_black mono_cairo_color_black #define cairo_color_transparent mono_cairo_color_transparent #define cairo_color_white mono_cairo_color_white #define cairo_copy_clip_rectangle_list mono_cairo_copy_clip_rectangle_list #define cairo_copy_page mono_cairo_copy_page #define cairo_copy_path mono_cairo_copy_path #define cairo_copy_path_flat mono_cairo_copy_path_flat #define cairo_create mono_cairo_create #define cairo_curve_to mono_cairo_curve_to #define cairo_debug_reset_static_data mono_cairo_debug_reset_static_data #define cairo_deflate_stream_deflate mono_cairo_deflate_stream_deflate #define cairo_destroy mono_cairo_destroy #define cairo_device_to_user mono_cairo_device_to_user #define cairo_device_to_user_distance mono_cairo_device_to_user_distance #define cairo_dict_write_operator mono_cairo_dict_write_operator #define cairo_fill mono_cairo_fill #define cairo_fill_extents mono_cairo_fill_extents #define cairo_fill_preserve mono_cairo_fill_preserve #define cairo_font_extents mono_cairo_font_extents #define cairo_font_face_destroy mono_cairo_font_face_destroy #define cairo_font_face_get_reference_count mono_cairo_font_face_get_reference_count #define cairo_font_face_get_type mono_cairo_font_face_get_type #define cairo_font_face_get_user_data mono_cairo_font_face_get_user_data #define cairo_font_face_reference mono_cairo_font_face_reference #define cairo_font_face_set_user_data mono_cairo_font_face_set_user_data #define cairo_font_face_status mono_cairo_font_face_status #define cairo_font_options_copy mono_cairo_font_options_copy #define cairo_font_options_create mono_cairo_font_options_create #define cairo_font_options_destroy mono_cairo_font_options_destroy #define cairo_font_options_equal mono_cairo_font_options_equal #define cairo_font_options_get_antialias mono_cairo_font_options_get_antialias #define cairo_font_options_get_hint_metrics mono_cairo_font_options_get_hint_metrics #define cairo_font_options_get_hint_style mono_cairo_font_options_get_hint_style #define cairo_font_options_get_subpixel_order mono_cairo_font_options_get_subpixel_order #define cairo_font_options_hash mono_cairo_font_options_hash #define cairo_font_options_merge mono_cairo_font_options_merge #define cairo_font_options_set_antialias mono_cairo_font_options_set_antialias #define cairo_font_options_set_hint_metrics mono_cairo_font_options_set_hint_metrics #define cairo_font_options_set_hint_style mono_cairo_font_options_set_hint_style #define cairo_font_options_set_subpixel_order mono_cairo_font_options_set_subpixel_order #define cairo_font_options_status mono_cairo_font_options_status #define cairo_format_stride_for_width mono_cairo_format_stride_for_width #define cairo_ft_font_face_create_for_ft_face mono_cairo_ft_font_face_create_for_ft_face #define cairo_ft_font_face_create_for_pattern mono_cairo_ft_font_face_create_for_pattern #define cairo_ft_font_options_substitute mono_cairo_ft_font_options_substitute #define cairo_ft_scaled_font_backend mono_cairo_ft_scaled_font_backend #define cairo_ft_scaled_font_lock_face mono_cairo_ft_scaled_font_lock_face #define cairo_ft_scaled_font_unlock_face mono_cairo_ft_scaled_font_unlock_face #define cairo_ft_unscaled_font_backend mono_cairo_ft_unscaled_font_backend #define cairo_ft_unscaled_font_map mono_cairo_ft_unscaled_font_map #define cairo_get_antialias mono_cairo_get_antialias #define cairo_get_current_point mono_cairo_get_current_point #define cairo_get_dash mono_cairo_get_dash #define cairo_get_dash_count mono_cairo_get_dash_count #define cairo_get_fill_rule mono_cairo_get_fill_rule #define cairo_get_font_face mono_cairo_get_font_face #define cairo_get_font_matrix mono_cairo_get_font_matrix #define cairo_get_font_options mono_cairo_get_font_options #define cairo_get_group_target mono_cairo_get_group_target #define cairo_get_line_cap mono_cairo_get_line_cap #define cairo_get_line_join mono_cairo_get_line_join #define cairo_get_line_width mono_cairo_get_line_width #define cairo_get_matrix mono_cairo_get_matrix #define cairo_get_miter_limit mono_cairo_get_miter_limit #define cairo_get_operator mono_cairo_get_operator #define cairo_get_reference_count mono_cairo_get_reference_count #define cairo_get_scaled_font mono_cairo_get_scaled_font #define cairo_get_source mono_cairo_get_source #define cairo_get_target mono_cairo_get_target #define cairo_get_tolerance mono_cairo_get_tolerance #define cairo_get_user_data mono_cairo_get_user_data #define cairo_glyph_extents mono_cairo_glyph_extents #define cairo_glyph_path mono_cairo_glyph_path #define cairo_has_current_point mono_cairo_has_current_point #define cairo_identity_matrix mono_cairo_identity_matrix #define cairo_image_surface_backend mono_cairo_image_surface_backend #define cairo_image_surface_create mono_cairo_image_surface_create #define cairo_image_surface_create_for_data mono_cairo_image_surface_create_for_data #define cairo_image_surface_create_from_png mono_cairo_image_surface_create_from_png #define cairo_image_surface_create_from_png_stream mono_cairo_image_surface_create_from_png_stream #define cairo_image_surface_get_data mono_cairo_image_surface_get_data #define cairo_image_surface_get_format mono_cairo_image_surface_get_format #define cairo_image_surface_get_height mono_cairo_image_surface_get_height #define cairo_image_surface_get_stride mono_cairo_image_surface_get_stride #define cairo_image_surface_get_width mono_cairo_image_surface_get_width #define cairo_in_fill mono_cairo_in_fill #define cairo_in_stroke mono_cairo_in_stroke #define cairo_line_to mono_cairo_line_to #define cairo_mask mono_cairo_mask #define cairo_mask_surface mono_cairo_mask_surface #define cairo_matrix_init mono_cairo_matrix_init #define cairo_matrix_init_identity mono_cairo_matrix_init_identity #define cairo_matrix_init_rotate mono_cairo_matrix_init_rotate #define cairo_matrix_init_scale mono_cairo_matrix_init_scale #define cairo_matrix_init_translate mono_cairo_matrix_init_translate #define cairo_matrix_invert mono_cairo_matrix_invert #define cairo_matrix_multiply mono_cairo_matrix_multiply #define cairo_matrix_rotate mono_cairo_matrix_rotate #define cairo_matrix_scale mono_cairo_matrix_scale #define cairo_matrix_transform_distance mono_cairo_matrix_transform_distance #define cairo_matrix_transform_point mono_cairo_matrix_transform_point #define cairo_matrix_translate mono_cairo_matrix_translate #define cairo_meta_surface_backend mono_cairo_meta_surface_backend #define cairo_move_to mono_cairo_move_to #define cairo_new_path mono_cairo_new_path #define cairo_new_sub_path mono_cairo_new_sub_path #define cairo_paginated_surface_backend mono_cairo_paginated_surface_backend #define cairo_paint mono_cairo_paint #define cairo_paint_with_alpha mono_cairo_paint_with_alpha #define cairo_path_destroy mono_cairo_path_destroy #define cairo_path_extents mono_cairo_path_extents #define cairo_pattern_add_color_stop_rgb mono_cairo_pattern_add_color_stop_rgb #define cairo_pattern_add_color_stop_rgba mono_cairo_pattern_add_color_stop_rgba #define cairo_pattern_create_for_surface mono_cairo_pattern_create_for_surface #define cairo_pattern_create_linear mono_cairo_pattern_create_linear #define cairo_pattern_create_radial mono_cairo_pattern_create_radial #define cairo_pattern_create_rgb mono_cairo_pattern_create_rgb #define cairo_pattern_create_rgba mono_cairo_pattern_create_rgba #define cairo_pattern_destroy mono_cairo_pattern_destroy #define cairo_pattern_get_color_stop_count mono_cairo_pattern_get_color_stop_count #define cairo_pattern_get_color_stop_rgba mono_cairo_pattern_get_color_stop_rgba #define cairo_pattern_get_extend mono_cairo_pattern_get_extend #define cairo_pattern_get_filter mono_cairo_pattern_get_filter #define cairo_pattern_get_linear_points mono_cairo_pattern_get_linear_points #define cairo_pattern_get_matrix mono_cairo_pattern_get_matrix #define cairo_pattern_get_radial_circles mono_cairo_pattern_get_radial_circles #define cairo_pattern_get_reference_count mono_cairo_pattern_get_reference_count #define cairo_pattern_get_rgba mono_cairo_pattern_get_rgba #define cairo_pattern_get_surface mono_cairo_pattern_get_surface #define cairo_pattern_get_type mono_cairo_pattern_get_type #define cairo_pattern_get_user_data mono_cairo_pattern_get_user_data #define cairo_pattern_none mono_cairo_pattern_none #define cairo_pattern_reference mono_cairo_pattern_reference #define cairo_pattern_set_extend mono_cairo_pattern_set_extend #define cairo_pattern_set_filter mono_cairo_pattern_set_filter #define cairo_pattern_set_matrix mono_cairo_pattern_set_matrix #define cairo_pattern_set_user_data mono_cairo_pattern_set_user_data #define cairo_pattern_status mono_cairo_pattern_status #define cairo_pdf_surface_backend mono_cairo_pdf_surface_backend #define cairo_pdf_surface_create mono_cairo_pdf_surface_create #define cairo_pdf_surface_create_for_stream mono_cairo_pdf_surface_create_for_stream #define cairo_pdf_surface_emit_alpha_linear_function mono_cairo_pdf_surface_emit_alpha_linear_function #define cairo_pdf_surface_emit_rgb_linear_function mono_cairo_pdf_surface_emit_rgb_linear_function #define cairo_pdf_surface_emit_transparency_group mono_cairo_pdf_surface_emit_transparency_group #define cairo_pdf_surface_paginated_backend mono_cairo_pdf_surface_paginated_backend #define cairo_pdf_surface_set_size mono_cairo_pdf_surface_set_size #define cairo_pop_group mono_cairo_pop_group #define cairo_pop_group_to_source mono_cairo_pop_group_to_source #define cairo_ps_get_levels mono_cairo_ps_get_levels #define cairo_ps_level_to_string mono_cairo_ps_level_to_string #define cairo_ps_surface_backend mono_cairo_ps_surface_backend #define cairo_ps_surface_create mono_cairo_ps_surface_create #define cairo_ps_surface_create_for_stream mono_cairo_ps_surface_create_for_stream #define cairo_ps_surface_dsc_begin_page_setup mono_cairo_ps_surface_dsc_begin_page_setup #define cairo_ps_surface_dsc_begin_setup mono_cairo_ps_surface_dsc_begin_setup #define cairo_ps_surface_dsc_comment mono_cairo_ps_surface_dsc_comment #define cairo_ps_surface_get_eps mono_cairo_ps_surface_get_eps #define cairo_ps_surface_paginated_backend mono_cairo_ps_surface_paginated_backend #define cairo_ps_surface_restrict_to_level mono_cairo_ps_surface_restrict_to_level #define cairo_ps_surface_set_eps mono_cairo_ps_surface_set_eps #define cairo_ps_surface_set_size mono_cairo_ps_surface_set_size #define cairo_push_group mono_cairo_push_group #define cairo_push_group_with_content mono_cairo_push_group_with_content #define cairo_rectangle mono_cairo_rectangle #define cairo_rectangle_list_destroy mono_cairo_rectangle_list_destroy #define cairo_reference mono_cairo_reference #define cairo_rel_curve_to mono_cairo_rel_curve_to #define cairo_rel_line_to mono_cairo_rel_line_to #define cairo_rel_move_to mono_cairo_rel_move_to #define cairo_reset_clip mono_cairo_reset_clip #define cairo_restore mono_cairo_restore #define cairo_rotate mono_cairo_rotate #define cairo_save mono_cairo_save #define cairo_scale mono_cairo_scale #define cairo_scaled_font_create mono_cairo_scaled_font_create #define cairo_scaled_font_destroy mono_cairo_scaled_font_destroy #define cairo_scaled_font_extents mono_cairo_scaled_font_extents #define cairo_scaled_font_get_ctm mono_cairo_scaled_font_get_ctm #define cairo_scaled_font_get_font_face mono_cairo_scaled_font_get_font_face #define cairo_scaled_font_get_font_matrix mono_cairo_scaled_font_get_font_matrix #define cairo_scaled_font_get_font_options mono_cairo_scaled_font_get_font_options #define cairo_scaled_font_get_reference_count mono_cairo_scaled_font_get_reference_count #define cairo_scaled_font_get_type mono_cairo_scaled_font_get_type #define cairo_scaled_font_get_user_data mono_cairo_scaled_font_get_user_data #define cairo_scaled_font_glyph_extents mono_cairo_scaled_font_glyph_extents #define cairo_scaled_font_map mono_cairo_scaled_font_map #define cairo_scaled_font_reference mono_cairo_scaled_font_reference #define cairo_scaled_font_set_user_data mono_cairo_scaled_font_set_user_data #define cairo_scaled_font_status mono_cairo_scaled_font_status #define cairo_scaled_font_text_extents mono_cairo_scaled_font_text_extents #define cairo_select_font_face mono_cairo_select_font_face #define cairo_set_antialias mono_cairo_set_antialias #define cairo_set_dash mono_cairo_set_dash #define cairo_set_fill_rule mono_cairo_set_fill_rule #define cairo_set_font_face mono_cairo_set_font_face #define cairo_set_font_matrix mono_cairo_set_font_matrix #define cairo_set_font_options mono_cairo_set_font_options #define cairo_set_font_size mono_cairo_set_font_size #define cairo_set_line_cap mono_cairo_set_line_cap #define cairo_set_line_join mono_cairo_set_line_join #define cairo_set_line_width mono_cairo_set_line_width #define cairo_set_matrix mono_cairo_set_matrix #define cairo_set_miter_limit mono_cairo_set_miter_limit #define cairo_set_operator mono_cairo_set_operator #define cairo_set_scaled_font mono_cairo_set_scaled_font #define cairo_set_source mono_cairo_set_source #define cairo_set_source_rgb mono_cairo_set_source_rgb #define cairo_set_source_rgba mono_cairo_set_source_rgba #define cairo_set_source_surface mono_cairo_set_source_surface #define cairo_set_tolerance mono_cairo_set_tolerance #define cairo_set_user_data mono_cairo_set_user_data #define cairo_show_glyphs mono_cairo_show_glyphs #define cairo_show_page mono_cairo_show_page #define cairo_show_text mono_cairo_show_text #define cairo_status mono_cairo_status #define cairo_status_to_string mono_cairo_status_to_string #define cairo_stroke mono_cairo_stroke #define cairo_stroke_extents mono_cairo_stroke_extents #define cairo_stroke_preserve mono_cairo_stroke_preserve #define cairo_surface_copy_page mono_cairo_surface_copy_page #define cairo_surface_create_similar mono_cairo_surface_create_similar #define cairo_surface_destroy mono_cairo_surface_destroy #define cairo_surface_finish mono_cairo_surface_finish #define cairo_surface_flush mono_cairo_surface_flush #define cairo_surface_get_content mono_cairo_surface_get_content #define cairo_surface_get_device_offset mono_cairo_surface_get_device_offset #define cairo_surface_get_font_options mono_cairo_surface_get_font_options #define cairo_surface_get_reference_count mono_cairo_surface_get_reference_count #define cairo_surface_get_type mono_cairo_surface_get_type #define cairo_surface_get_user_data mono_cairo_surface_get_user_data #define cairo_surface_mark_dirty mono_cairo_surface_mark_dirty #define cairo_surface_mark_dirty_rectangle mono_cairo_surface_mark_dirty_rectangle #define cairo_surface_reference mono_cairo_surface_reference #define cairo_surface_set_device_offset mono_cairo_surface_set_device_offset #define cairo_surface_set_fallback_resolution mono_cairo_surface_set_fallback_resolution #define cairo_surface_set_user_data mono_cairo_surface_set_user_data #define cairo_surface_show_page mono_cairo_surface_show_page #define cairo_surface_status mono_cairo_surface_status #define cairo_surface_write_to_png mono_cairo_surface_write_to_png #define cairo_surface_write_to_png_stream mono_cairo_surface_write_to_png_stream #define cairo_svg_get_versions mono_cairo_svg_get_versions #define cairo_svg_surface_backend mono_cairo_svg_surface_backend #define cairo_svg_surface_create mono_cairo_svg_surface_create #define cairo_svg_surface_create_for_stream mono_cairo_svg_surface_create_for_stream #define cairo_svg_surface_paginated_backend mono_cairo_svg_surface_paginated_backend #define cairo_svg_surface_restrict_to_version mono_cairo_svg_surface_restrict_to_version #define cairo_svg_version_to_string mono_cairo_svg_version_to_string #define cairo_text_extents mono_cairo_text_extents #define cairo_text_path mono_cairo_text_path #define cairo_toy_font_face_hash_table mono_cairo_toy_font_face_hash_table #define cairo_transform mono_cairo_transform #define cairo_translate mono_cairo_translate #define cairo_truetype_font_add_truetype_table mono_cairo_truetype_font_add_truetype_table #define cairo_truetype_font_align_output mono_cairo_truetype_font_align_output #define cairo_truetype_font_allocate_write_buffer mono_cairo_truetype_font_allocate_write_buffer #define cairo_truetype_font_calculate_checksum mono_cairo_truetype_font_calculate_checksum #define cairo_truetype_font_check_boundary mono_cairo_truetype_font_check_boundary #define cairo_truetype_font_destroy mono_cairo_truetype_font_destroy #define cairo_truetype_font_use_glyph mono_cairo_truetype_font_use_glyph #define cairo_truetype_font_write mono_cairo_truetype_font_write #define cairo_truetype_font_write_be16 mono_cairo_truetype_font_write_be16 #define cairo_truetype_font_write_be32 mono_cairo_truetype_font_write_be32 #define cairo_truetype_font_write_cmap_table mono_cairo_truetype_font_write_cmap_table #define cairo_truetype_font_write_generic_table mono_cairo_truetype_font_write_generic_table #define cairo_truetype_font_write_glyf_table mono_cairo_truetype_font_write_glyf_table #define cairo_truetype_font_write_head_table mono_cairo_truetype_font_write_head_table #define cairo_truetype_font_write_hhea_table mono_cairo_truetype_font_write_hhea_table #define cairo_truetype_font_write_hmtx_table mono_cairo_truetype_font_write_hmtx_table #define cairo_truetype_font_write_loca_table mono_cairo_truetype_font_write_loca_table #define cairo_truetype_font_write_maxp_table mono_cairo_truetype_font_write_maxp_table #define cairo_type1_font_create mono_cairo_type1_font_create #define cairo_type1_font_create_charstring mono_cairo_type1_font_create_charstring #define cairo_type1_font_destroy mono_cairo_type1_font_destroy #define cairo_type1_font_subset_destroy mono_cairo_type1_font_subset_destroy #define cairo_type1_font_subset_for_each_glyph mono_cairo_type1_font_subset_for_each_glyph #define cairo_type1_font_subset_get_glyph_names_and_widths mono_cairo_type1_font_subset_get_glyph_names_and_widths #define cairo_type1_font_subset_look_for_seac mono_cairo_type1_font_subset_look_for_seac #define cairo_type1_font_subset_lookup_glyph mono_cairo_type1_font_subset_lookup_glyph #define cairo_type1_font_subset_use_glyph mono_cairo_type1_font_subset_use_glyph #define cairo_type1_font_subset_write_encrypted mono_cairo_type1_font_subset_write_encrypted #define cairo_type1_write_stream mono_cairo_type1_write_stream #define cairo_type1_write_stream_encrypted mono_cairo_type1_write_stream_encrypted #define cairo_user_to_device mono_cairo_user_to_device #define cairo_user_to_device_distance mono_cairo_user_to_device_distance #define cairo_version mono_cairo_version #define cairo_version_string mono_cairo_version_string #define cairo_xlib_surface_backend mono_cairo_xlib_surface_backend #define cairo_xlib_surface_create mono_cairo_xlib_surface_create #define cairo_xlib_surface_create_for_bitmap mono_cairo_xlib_surface_create_for_bitmap #define cairo_xlib_surface_create_with_xrender_format mono_cairo_xlib_surface_create_with_xrender_format #define cairo_xlib_surface_get_depth mono_cairo_xlib_surface_get_depth #define cairo_xlib_surface_get_display mono_cairo_xlib_surface_get_display #define cairo_xlib_surface_get_drawable mono_cairo_xlib_surface_get_drawable #define cairo_xlib_surface_get_height mono_cairo_xlib_surface_get_height #define cairo_xlib_surface_get_screen mono_cairo_xlib_surface_get_screen #define cairo_xlib_surface_get_visual mono_cairo_xlib_surface_get_visual #define cairo_xlib_surface_get_width mono_cairo_xlib_surface_get_width #define cairo_xlib_surface_get_xrender_format mono_cairo_xlib_surface_get_xrender_format #define cairo_xlib_surface_set_drawable mono_cairo_xlib_surface_set_drawable #define cairo_xlib_surface_set_size mono_cairo_xlib_surface_set_size #endif libgdiplus-2.11/cairo/src/cairo-pen.c0000664000175000017500000003373712225470167014446 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" static int _cairo_pen_vertices_needed (double tolerance, double radius, cairo_matrix_t *matrix); static void _cairo_pen_compute_slopes (cairo_pen_t *pen); static void _cairo_pen_stroke_spline_half (cairo_pen_t *pen, cairo_spline_t *spline, cairo_direction_t dir, cairo_polygon_t *polygon); void _cairo_pen_init_empty (cairo_pen_t *pen) { pen->radius = 0; pen->tolerance = 0; pen->vertices = NULL; pen->num_vertices = 0; } cairo_status_t _cairo_pen_init (cairo_pen_t *pen, double radius, double tolerance, cairo_matrix_t *ctm) { int i; int reflect; double det; pen->radius = radius; pen->tolerance = tolerance; _cairo_matrix_compute_determinant (ctm, &det); if (det >= 0) { reflect = 0; } else { reflect = 1; } pen->num_vertices = _cairo_pen_vertices_needed (tolerance, radius, ctm); pen->vertices = _cairo_malloc_ab (pen->num_vertices, sizeof (cairo_pen_vertex_t)); if (pen->vertices == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); /* * Compute pen coordinates. To generate the right ellipse, compute points around * a circle in user space and transform them to device space. To get a consistent * orientation in device space, flip the pen if the transformation matrix * is reflecting */ for (i=0; i < pen->num_vertices; i++) { double theta = 2 * M_PI * i / (double) pen->num_vertices; double dx = radius * cos (reflect ? -theta : theta); double dy = radius * sin (reflect ? -theta : theta); cairo_pen_vertex_t *v = &pen->vertices[i]; cairo_matrix_transform_distance (ctm, &dx, &dy); v->point.x = _cairo_fixed_from_double (dx); v->point.y = _cairo_fixed_from_double (dy); } _cairo_pen_compute_slopes (pen); return CAIRO_STATUS_SUCCESS; } void _cairo_pen_fini (cairo_pen_t *pen) { free (pen->vertices); pen->vertices = NULL; _cairo_pen_init_empty (pen); } cairo_status_t _cairo_pen_init_copy (cairo_pen_t *pen, cairo_pen_t *other) { *pen = *other; if (pen->num_vertices) { pen->vertices = _cairo_malloc_ab (pen->num_vertices, sizeof (cairo_pen_vertex_t)); if (pen->vertices == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); memcpy (pen->vertices, other->vertices, pen->num_vertices * sizeof (cairo_pen_vertex_t)); } return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_pen_add_points (cairo_pen_t *pen, cairo_point_t *point, int num_points) { cairo_pen_vertex_t *vertices; cairo_status_t status; int num_vertices; int i; num_vertices = pen->num_vertices + num_points; vertices = _cairo_realloc_ab (pen->vertices, num_vertices, sizeof (cairo_pen_vertex_t)); if (vertices == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); pen->vertices = vertices; pen->num_vertices = num_vertices; /* initialize new vertices */ for (i=0; i < num_points; i++) pen->vertices[pen->num_vertices-num_points+i].point = point[i]; status = _cairo_hull_compute (pen->vertices, &pen->num_vertices); if (status) return status; _cairo_pen_compute_slopes (pen); return CAIRO_STATUS_SUCCESS; } /* The circular pen in user space is transformed into an ellipse in device space. We construct the pen by computing points along the circumference using equally spaced angles. We show that this approximation to the ellipse has maximum error at the major axis of the ellipse. Set M = major axis length m = minor axis length Align 'M' along the X axis and 'm' along the Y axis and draw an ellipse parameterized by angle 't': x = M cos t y = m sin t Perturb t by ± d and compute two new points (x+,y+), (x-,y-). The distance from the average of these two points to (x,y) represents the maximum error in approximating the ellipse with a polygon formed from vertices 2∆ radians apart. x+ = M cos (t+∆) y+ = m sin (t+∆) x- = M cos (t-∆) y- = m sin (t-∆) Now compute the approximation error, E: Ex = (x - (x+ + x-) / 2) Ex = (M cos(t) - (Mcos(t+∆) + Mcos(t-∆))/2) = M (cos(t) - (cos(t)cos(∆) + sin(t)sin(∆) + cos(t)cos(∆) - sin(t)sin(∆))/2) = M(cos(t) - cos(t)cos(∆)) = M cos(t) (1 - cos(∆)) Ey = y - (y+ - y-) / 2 = m sin (t) - (m sin(t+∆) + m sin(t-∆)) / 2 = m (sin(t) - (sin(t)cos(∆) + cos(t)sin(∆) + sin(t)cos(∆) - cos(t)sin(∆))/2) = m (sin(t) - sin(t)cos(∆)) = m sin(t) (1 - cos(∆)) E² = Ex² + Ey² = (M cos(t) (1 - cos (∆)))² + (m sin(t) (1-cos(∆)))² = (1 - cos(∆))² (M² cos²(t) + m² sin²(t)) = (1 - cos(∆))² ((m² + M² - m²) cos² (t) + m² sin²(t)) = (1 - cos(∆))² (M² - m²) cos² (t) + (1 - cos(∆))² m² Find the extremum by differentiation wrt t and setting that to zero ∂(E²)/∂(t) = (1-cos(∆))² (M² - m²) (-2 cos(t) sin(t)) 0 = 2 cos (t) sin (t) 0 = sin (2t) t = nÏ€ Which is to say that the maximum and minimum errors occur on the axes of the ellipse at 0 and Ï€ radians: E²(0) = (1-cos(∆))² (M² - m²) + (1-cos(∆))² m² = (1-cos(∆))² M² E²(Ï€) = (1-cos(∆))² m² maximum error = M (1-cos(∆)) minimum error = m (1-cos(∆)) We must make maximum error ≤ tolerance, so compute the ∆ needed: tolerance = M (1-cos(∆)) tolerance / M = 1 - cos (∆) cos(∆) = 1 - tolerance/M ∆ = acos (1 - tolerance / M); Remembering that ∆ is half of our angle between vertices, the number of vertices is then vertices = ceil(2Ï€/2∆). = ceil(Ï€/∆). Note that this also equation works for M == m (a circle) as it doesn't matter where on the circle the error is computed. */ static int _cairo_pen_vertices_needed (double tolerance, double radius, cairo_matrix_t *matrix) { /* * the pen is a circle that gets transformed to an ellipse by matrix. * compute major axis length for a pen with the specified radius. * we don't need the minor axis length. */ double major_axis = _cairo_matrix_transformed_circle_major_axis(matrix, radius); /* * compute number of vertices needed */ int num_vertices; /* Where tolerance / M is > 1, we use 4 points */ if (tolerance >= major_axis) { num_vertices = 4; } else { double delta = acos (1 - tolerance / major_axis); num_vertices = ceil (M_PI / delta); /* number of vertices must be even */ if (num_vertices % 2) num_vertices++; /* And we must always have at least 4 vertices. */ if (num_vertices < 4) num_vertices = 4; } return num_vertices; } static void _cairo_pen_compute_slopes (cairo_pen_t *pen) { int i, i_prev; cairo_pen_vertex_t *prev, *v, *next; for (i=0, i_prev = pen->num_vertices - 1; i < pen->num_vertices; i_prev = i++) { prev = &pen->vertices[i_prev]; v = &pen->vertices[i]; next = &pen->vertices[(i + 1) % pen->num_vertices]; _cairo_slope_init (&v->slope_cw, &prev->point, &v->point); _cairo_slope_init (&v->slope_ccw, &v->point, &next->point); } } /* * Find active pen vertex for clockwise edge of stroke at the given slope. * * The strictness of the inequalities here is delicate. The issue is * that the slope_ccw member of one pen vertex will be equivalent to * the slope_cw member of the next pen vertex in a counterclockwise * order. However, for this function, we care strongly about which * vertex is returned. * * [I think the "care strongly" above has to do with ensuring that the * pen's "extra points" from the spline's initial and final slopes are * properly found when beginning the spline stroking.] */ void _cairo_pen_find_active_cw_vertex_index (cairo_pen_t *pen, cairo_slope_t *slope, int *active) { int i; for (i=0; i < pen->num_vertices; i++) { if ((_cairo_slope_compare (slope, &pen->vertices[i].slope_ccw) < 0) && (_cairo_slope_compare (slope, &pen->vertices[i].slope_cw) >= 0)) break; } /* If the desired slope cannot be found between any of the pen * vertices, then we must have a degenerate pen, (such as a pen * that's been transformed to a line). In that case, we consider * the first pen vertex as the appropriate clockwise vertex. */ if (i == pen->num_vertices) i = 0; *active = i; } /* Find active pen vertex for counterclockwise edge of stroke at the given slope. * * Note: See the comments for _cairo_pen_find_active_cw_vertex_index * for some details about the strictness of the inequalities here. */ void _cairo_pen_find_active_ccw_vertex_index (cairo_pen_t *pen, cairo_slope_t *slope, int *active) { int i; cairo_slope_t slope_reverse; slope_reverse = *slope; slope_reverse.dx = -slope_reverse.dx; slope_reverse.dy = -slope_reverse.dy; for (i=pen->num_vertices-1; i >= 0; i--) { if ((_cairo_slope_compare (&pen->vertices[i].slope_ccw, &slope_reverse) >= 0) && (_cairo_slope_compare (&pen->vertices[i].slope_cw, &slope_reverse) < 0)) break; } /* If the desired slope cannot be found between any of the pen * vertices, then we must have a degenerate pen, (such as a pen * that's been transformed to a line). In that case, we consider * the last pen vertex as the appropriate counterclockwise vertex. */ if (i < 0) i = pen->num_vertices - 1; *active = i; } static void _cairo_pen_stroke_spline_half (cairo_pen_t *pen, cairo_spline_t *spline, cairo_direction_t dir, cairo_polygon_t *polygon) { int i; int start, stop, step; int active = 0; cairo_point_t hull_point; cairo_slope_t slope, initial_slope, final_slope; cairo_point_t *point = spline->points; int num_points = spline->num_points; if (dir == CAIRO_DIRECTION_FORWARD) { start = 0; stop = num_points; step = 1; initial_slope = spline->initial_slope; final_slope = spline->final_slope; } else { start = num_points - 1; stop = -1; step = -1; initial_slope = spline->final_slope; initial_slope.dx = -initial_slope.dx; initial_slope.dy = -initial_slope.dy; final_slope = spline->initial_slope; final_slope.dx = -final_slope.dx; final_slope.dy = -final_slope.dy; } _cairo_pen_find_active_cw_vertex_index (pen, &initial_slope, &active); i = start; while (i != stop) { hull_point.x = point[i].x + pen->vertices[active].point.x; hull_point.y = point[i].y + pen->vertices[active].point.y; _cairo_polygon_line_to (polygon, &hull_point); if (i + step == stop) slope = final_slope; else _cairo_slope_init (&slope, &point[i], &point[i+step]); /* The strict inequalities here ensure that if a spline slope * compares identically with either of the slopes of the * active vertex, then it remains the active vertex. This is * very important since otherwise we can trigger an infinite * loop in the case of a degenerate pen, (a line), where * neither vertex considers itself active for the slope---one * will consider it as equal and reject, and the other will * consider it unequal and reject. This is due to the inherent * ambiguity when comparing slopes that differ by exactly * pi. */ if (_cairo_slope_compare (&slope, &pen->vertices[active].slope_ccw) > 0) { if (++active == pen->num_vertices) active = 0; } else if (_cairo_slope_compare (&slope, &pen->vertices[active].slope_cw) < 0) { if (--active == -1) active = pen->num_vertices - 1; } else { i += step; } } } /* Compute outline of a given spline using the pen. The trapezoids needed to fill that outline will be added to traps */ cairo_status_t _cairo_pen_stroke_spline (cairo_pen_t *pen, cairo_spline_t *spline, double tolerance, cairo_traps_t *traps) { cairo_status_t status; cairo_polygon_t polygon; /* If the line width is so small that the pen is reduced to a single point, then we have nothing to do. */ if (pen->num_vertices <= 1) return CAIRO_STATUS_SUCCESS; _cairo_polygon_init (&polygon); status = _cairo_spline_decompose (spline, tolerance); if (status) goto BAIL; _cairo_pen_stroke_spline_half (pen, spline, CAIRO_DIRECTION_FORWARD, &polygon); _cairo_pen_stroke_spline_half (pen, spline, CAIRO_DIRECTION_REVERSE, &polygon); _cairo_polygon_close (&polygon); status = _cairo_polygon_status (&polygon); if (status) goto BAIL; status = _cairo_bentley_ottmann_tessellate_polygon (traps, &polygon, CAIRO_FILL_RULE_WINDING); BAIL: _cairo_polygon_fini (&polygon); return status; } libgdiplus-2.11/cairo/src/cairo-ps-surface-private.h0000664000175000017500000000614312225470167017400 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Kristian Høgsberg * Keith Packard */ #ifndef CAIRO_PS_SURFACE_PRIVATE_H #define CAIRO_PS_SURFACE_PRIVATE_H #include "cairo-ps.h" #include "cairo-surface-private.h" #include "cairo-pdf-operators-private.h" typedef struct cairo_ps_surface { cairo_surface_t base; /* Here final_stream corresponds to the stream/file passed to * cairo_ps_surface_create surface is built. Meanwhile stream is a * temporary stream in which the file output is built, (so that * the header can be built and inserted into the target stream * before the contents of the temporary stream are copied). */ cairo_output_stream_t *final_stream; FILE *tmpfile; cairo_output_stream_t *stream; cairo_bool_t eps; cairo_content_t content; double width; double height; int bbox_x1, bbox_y1, bbox_x2, bbox_y2; cairo_matrix_t cairo_to_ps; cairo_image_surface_t *image; void *image_extra; cairo_bool_t use_string_datasource; int num_pages; cairo_paginated_mode_t paginated_mode; cairo_bool_t force_fallbacks; cairo_scaled_font_subsets_t *font_subsets; cairo_array_t dsc_header_comments; cairo_array_t dsc_setup_comments; cairo_array_t dsc_page_setup_comments; cairo_array_t *dsc_comment_target; cairo_ps_level_t ps_level; cairo_ps_level_t ps_level_used; cairo_pdf_operators_t pdf_operators; cairo_surface_t *paginated_surface; } cairo_ps_surface_t; #endif /* CAIRO_PS_SURFACE_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-font-options.c0000664000175000017500000003047412225470167016316 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Owen Taylor */ #include "cairoint.h" static const cairo_font_options_t _cairo_font_options_nil = { CAIRO_ANTIALIAS_DEFAULT, CAIRO_SUBPIXEL_ORDER_DEFAULT, CAIRO_HINT_STYLE_DEFAULT, CAIRO_HINT_METRICS_DEFAULT }; /** * _cairo_font_options_init_default: * @options: a #cairo_font_options_t * * Initializes all fields of the font options object to default values. **/ void _cairo_font_options_init_default (cairo_font_options_t *options) { options->antialias = CAIRO_ANTIALIAS_DEFAULT; options->subpixel_order = CAIRO_SUBPIXEL_ORDER_DEFAULT; options->hint_style = CAIRO_HINT_STYLE_DEFAULT; options->hint_metrics = CAIRO_HINT_METRICS_DEFAULT; } void _cairo_font_options_init_copy (cairo_font_options_t *options, const cairo_font_options_t *other) { options->antialias = other->antialias; options->subpixel_order = other->subpixel_order; options->hint_style = other->hint_style; options->hint_metrics = other->hint_metrics; } /** * cairo_font_options_create: * * Allocates a new font options object with all options initialized * to default values. * * Return value: a newly allocated #cairo_font_options_t. Free with * cairo_font_options_destroy(). This function always returns a * valid pointer; if memory cannot be allocated, then a special * error object is returned where all operations on the object do nothing. * You can check for this with cairo_font_options_status(). **/ cairo_font_options_t * cairo_font_options_create (void) { cairo_font_options_t *options; options = malloc (sizeof (cairo_font_options_t)); if (!options) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_options_t *) &_cairo_font_options_nil; } _cairo_font_options_init_default (options); return options; } slim_hidden_def (cairo_font_options_create); /** * cairo_font_options_copy: * @original: a #cairo_font_options_t * * Allocates a new font options object copying the option values from * @original. * * Return value: a newly allocated #cairo_font_options_t. Free with * cairo_font_options_destroy(). This function always returns a * valid pointer; if memory cannot be allocated, then a special * error object is returned where all operations on the object do nothing. * You can check for this with cairo_font_options_status(). **/ cairo_font_options_t * cairo_font_options_copy (const cairo_font_options_t *original) { cairo_font_options_t *options; if (cairo_font_options_status ((cairo_font_options_t *) original)) return (cairo_font_options_t *) &_cairo_font_options_nil; options = malloc (sizeof (cairo_font_options_t)); if (!options) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_font_options_t *) &_cairo_font_options_nil; } _cairo_font_options_init_copy (options, original); return options; } /** * cairo_font_options_destroy: * @options: a #cairo_font_options_t * * Destroys a #cairo_font_options_t object created with with * cairo_font_options_create() or cairo_font_options_copy(). **/ void cairo_font_options_destroy (cairo_font_options_t *options) { if (cairo_font_options_status (options)) return; free (options); } slim_hidden_def (cairo_font_options_destroy); /** * cairo_font_options_status: * @options: a #cairo_font_options_t * * Checks whether an error has previously occurred for this * font options object * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY **/ cairo_status_t cairo_font_options_status (cairo_font_options_t *options) { if (options == NULL) return CAIRO_STATUS_NULL_POINTER; else if (options == (cairo_font_options_t *) &_cairo_font_options_nil) return CAIRO_STATUS_NO_MEMORY; else return CAIRO_STATUS_SUCCESS; } slim_hidden_def (cairo_font_options_status); /** * cairo_font_options_merge: * @options: a #cairo_font_options_t * @other: another #cairo_font_options_t * * Merges non-default options from @other into @options, replacing * existing values. This operation can be thought of as somewhat * similar to compositing @other onto @options with the operation * of %CAIRO_OPERATION_OVER. **/ void cairo_font_options_merge (cairo_font_options_t *options, const cairo_font_options_t *other) { if (cairo_font_options_status (options)) return; if (cairo_font_options_status ((cairo_font_options_t *) other)) return; if (other->antialias != CAIRO_ANTIALIAS_DEFAULT) options->antialias = other->antialias; if (other->subpixel_order != CAIRO_SUBPIXEL_ORDER_DEFAULT) options->subpixel_order = other->subpixel_order; if (other->hint_style != CAIRO_HINT_STYLE_DEFAULT) options->hint_style = other->hint_style; if (other->hint_metrics != CAIRO_HINT_METRICS_DEFAULT) options->hint_metrics = other->hint_metrics; } slim_hidden_def (cairo_font_options_merge); /** * cairo_font_options_equal: * @options: a #cairo_font_options_t * @other: another #cairo_font_options_t * * Compares two font options objects for equality. * * Return value: %TRUE if all fields of the two font options objects match. * Note that this function will return %FALSE if either object is in * error. **/ cairo_bool_t cairo_font_options_equal (const cairo_font_options_t *options, const cairo_font_options_t *other) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return FALSE; if (cairo_font_options_status ((cairo_font_options_t *) other)) return FALSE; if (options == other) return TRUE; return (options->antialias == other->antialias && options->subpixel_order == other->subpixel_order && options->hint_style == other->hint_style && options->hint_metrics == other->hint_metrics); } slim_hidden_def (cairo_font_options_equal); /** * cairo_font_options_hash: * @options: a #cairo_font_options_t * * Compute a hash for the font options object; this value will * be useful when storing an object containing a #cairo_font_options_t * in a hash table. * * Return value: the hash value for the font options object. * The return value can be cast to a 32-bit type if a * 32-bit hash value is needed. **/ unsigned long cairo_font_options_hash (const cairo_font_options_t *options) { if (cairo_font_options_status ((cairo_font_options_t *) options)) options = &_cairo_font_options_nil; /* force default values */ return ((options->antialias) | (options->subpixel_order << 4) | (options->hint_style << 8) | (options->hint_metrics << 16)); } slim_hidden_def (cairo_font_options_hash); /** * cairo_font_options_set_antialias: * @options: a #cairo_font_options_t * @antialias: the new antialiasing mode * * Sets the antialiasing mode for the font options object. This * specifies the type of antialiasing to do when rendering text. **/ void cairo_font_options_set_antialias (cairo_font_options_t *options, cairo_antialias_t antialias) { if (cairo_font_options_status (options)) return; options->antialias = antialias; } slim_hidden_def (cairo_font_options_set_antialias); /** * cairo_font_options_get_antialias: * @options: a #cairo_font_options_t * * Gets the antialiasing mode for the font options object. * * Return value: the antialiasing mode **/ cairo_antialias_t cairo_font_options_get_antialias (const cairo_font_options_t *options) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return CAIRO_ANTIALIAS_DEFAULT; return options->antialias; } /** * cairo_font_options_set_subpixel_order: * @options: a #cairo_font_options_t * @subpixel_order: the new subpixel order * * Sets the subpixel order for the font options object. The subpixel * order specifies the order of color elements within each pixel on * the display device when rendering with an antialiasing mode of * %CAIRO_ANTIALIAS_SUBPIXEL. See the documentation for * #cairo_subpixel_order_t for full details. **/ void cairo_font_options_set_subpixel_order (cairo_font_options_t *options, cairo_subpixel_order_t subpixel_order) { if (cairo_font_options_status (options)) return; options->subpixel_order = subpixel_order; } slim_hidden_def (cairo_font_options_set_subpixel_order); /** * cairo_font_options_get_subpixel_order: * @options: a #cairo_font_options_t * * Gets the subpixel order for the font options object. * See the documentation for #cairo_subpixel_order_t for full details. * * Return value: the subpixel order for the font options object **/ cairo_subpixel_order_t cairo_font_options_get_subpixel_order (const cairo_font_options_t *options) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return CAIRO_SUBPIXEL_ORDER_DEFAULT; return options->subpixel_order; } /** * cairo_font_options_set_hint_style: * @options: a #cairo_font_options_t * @hint_style: the new hint style * * Sets the hint style for font outlines for the font options object. * This controls whether to fit font outlines to the pixel grid, * and if so, whether to optimize for fidelity or contrast. * See the documentation for #cairo_hint_style_t for full details. **/ void cairo_font_options_set_hint_style (cairo_font_options_t *options, cairo_hint_style_t hint_style) { if (cairo_font_options_status (options)) return; options->hint_style = hint_style; } slim_hidden_def (cairo_font_options_set_hint_style); /** * cairo_font_options_get_hint_style: * @options: a #cairo_font_options_t * * Gets the hint style for font outlines for the font options object. * See the documentation for #cairo_hint_style_t for full details. * * Return value: the hint style for the font options object **/ cairo_hint_style_t cairo_font_options_get_hint_style (const cairo_font_options_t *options) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return CAIRO_HINT_STYLE_DEFAULT; return options->hint_style; } /** * cairo_font_options_set_hint_metrics: * @options: a #cairo_font_options_t * @hint_metrics: the new metrics hinting mode * * Sets the metrics hinting mode for the font options object. This * controls whether metrics are quantized to integer values in * device units. * See the documentation for #cairo_hint_metrics_t for full details. **/ void cairo_font_options_set_hint_metrics (cairo_font_options_t *options, cairo_hint_metrics_t hint_metrics) { if (cairo_font_options_status (options)) return; options->hint_metrics = hint_metrics; } slim_hidden_def (cairo_font_options_set_hint_metrics); /** * cairo_font_options_get_hint_metrics: * @options: a #cairo_font_options_t * * Gets the metrics hinting mode for the font options object. * See the documentation for #cairo_hint_metrics_t for full details. * * Return value: the metrics hinting mode for the font options object **/ cairo_hint_metrics_t cairo_font_options_get_hint_metrics (const cairo_font_options_t *options) { if (cairo_font_options_status ((cairo_font_options_t *) options)) return CAIRO_HINT_METRICS_DEFAULT; return options->hint_metrics; } libgdiplus-2.11/cairo/src/cairo-xcb-xrender.h0000664000175000017500000000417612225470167016105 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_XCB_XRENDER_H #define CAIRO_XCB_XRENDER_H #include #if CAIRO_HAS_XCB_SURFACE #include #include CAIRO_BEGIN_DECLS cairo_public cairo_surface_t * cairo_xcb_surface_create_with_xrender_format (xcb_connection_t *c, xcb_drawable_t drawable, xcb_screen_t *screen, xcb_render_pictforminfo_t *format, int width, int height); CAIRO_END_DECLS #else /* CAIRO_HAS_XCB_SURFACE */ # error Cairo was not compiled with support for the xcb backend #endif /* CAIRO_HAS_XCB_SURFACE */ #endif /* CAIRO_XCB_XRENDER_H */ libgdiplus-2.11/cairo/src/cairo-hull.c0000664000175000017500000001356412225470167014624 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2003 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" typedef struct cairo_hull { cairo_point_t point; cairo_slope_t slope; int discard; int id; } cairo_hull_t; static cairo_status_t _cairo_hull_create (cairo_pen_vertex_t *vertices, int num_vertices, cairo_hull_t **out) { int i; cairo_hull_t *hull; cairo_point_t *p, *extremum, tmp; extremum = &vertices[0].point; for (i = 1; i < num_vertices; i++) { p = &vertices[i].point; if (p->y < extremum->y || (p->y == extremum->y && p->x < extremum->x)) extremum = p; } /* Put the extremal point at the beginning of the array */ tmp = *extremum; *extremum = vertices[0].point; vertices[0].point = tmp; hull = _cairo_malloc_ab (num_vertices, sizeof (cairo_hull_t)); if (hull == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < num_vertices; i++) { hull[i].point = vertices[i].point; _cairo_slope_init (&hull[i].slope, &hull[0].point, &hull[i].point); /* give each point a unique id for later comparison */ hull[i].id = i; /* Don't discard by default */ hull[i].discard = 0; /* Discard all points coincident with the extremal point */ if (i != 0 && hull[i].slope.dx == 0 && hull[i].slope.dy == 0) hull[i].discard = 1; } *out = hull; return CAIRO_STATUS_SUCCESS; } static int _cairo_hull_vertex_compare (const void *av, const void *bv) { cairo_hull_t *a = (cairo_hull_t *) av; cairo_hull_t *b = (cairo_hull_t *) bv; int ret; ret = _cairo_slope_compare (&a->slope, &b->slope); /* In the case of two vertices with identical slope from the extremal point discard the nearer point. */ if (ret == 0) { cairo_fixed_48_16_t a_dist, b_dist; a_dist = ((cairo_fixed_48_16_t) a->slope.dx * a->slope.dx + (cairo_fixed_48_16_t) a->slope.dy * a->slope.dy); b_dist = ((cairo_fixed_48_16_t) b->slope.dx * b->slope.dx + (cairo_fixed_48_16_t) b->slope.dy * b->slope.dy); /* * Use the point's ids to ensure a total ordering. * a well-defined ordering, and avoid setting discard on * both points. */ if (a_dist < b_dist || (a_dist == b_dist && a->id < b->id)) { a->discard = 1; ret = -1; } else { b->discard = 1; ret = 1; } } return ret; } static int _cairo_hull_prev_valid (cairo_hull_t *hull, int num_hull, int index) { /* hull[0] is always valid, and we never need to wraparound, (if * we are passed an index of 0 here, then the calling loop is just * about to terminate). */ if (index == 0) return 0; do { index--; } while (hull[index].discard); return index; } static int _cairo_hull_next_valid (cairo_hull_t *hull, int num_hull, int index) { do { index = (index + 1) % num_hull; } while (hull[index].discard); return index; } static void _cairo_hull_eliminate_concave (cairo_hull_t *hull, int num_hull) { int i, j, k; cairo_slope_t slope_ij, slope_jk; i = 0; j = _cairo_hull_next_valid (hull, num_hull, i); k = _cairo_hull_next_valid (hull, num_hull, j); do { _cairo_slope_init (&slope_ij, &hull[i].point, &hull[j].point); _cairo_slope_init (&slope_jk, &hull[j].point, &hull[k].point); /* Is the angle formed by ij and jk concave? */ if (_cairo_slope_compare (&slope_ij, &slope_jk) >= 0) { if (i == k) return; hull[j].discard = 1; j = i; i = _cairo_hull_prev_valid (hull, num_hull, j); } else { i = j; j = k; k = _cairo_hull_next_valid (hull, num_hull, j); } } while (j != 0); } static void _cairo_hull_to_pen (cairo_hull_t *hull, cairo_pen_vertex_t *vertices, int *num_vertices) { int i, j = 0; for (i = 0; i < *num_vertices; i++) { if (hull[i].discard) continue; vertices[j++].point = hull[i].point; } *num_vertices = j; } /* Given a set of vertices, compute the convex hull using the Graham scan algorithm. */ cairo_status_t _cairo_hull_compute (cairo_pen_vertex_t *vertices, int *num_vertices) { cairo_status_t status; cairo_hull_t *hull = NULL; int num_hull = *num_vertices; status = _cairo_hull_create (vertices, num_hull, &hull); if (status) return status; qsort (hull + 1, num_hull - 1, sizeof (cairo_hull_t), _cairo_hull_vertex_compare); _cairo_hull_eliminate_concave (hull, num_hull); _cairo_hull_to_pen (hull, vertices, num_vertices); free (hull); return CAIRO_STATUS_SUCCESS; } libgdiplus-2.11/cairo/src/cairo-arc-private.h0000664000175000017500000000356412225470167016101 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_ARC_PRIVATE_H #define CAIRO_ARC_PRIVATE_H #include "cairoint.h" cairo_private void _cairo_arc_path (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); cairo_private void _cairo_arc_path_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2); #endif /* CAIRO_ARC_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-atomic.c0000664000175000017500000000473512225470167015134 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2007 Chris Wilson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * Contributor(s): * Chris Wilson */ #include "cairoint.h" #include "cairo-atomic-private.h" #include "cairo-mutex-private.h" #ifndef CAIRO_HAS_ATOMIC_OPS void _cairo_atomic_int_inc (int *x) { CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); *x += 1; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); } cairo_bool_t _cairo_atomic_int_dec_and_test (int *x) { cairo_bool_t ret; CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); ret = --*x == 0; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); return ret; } int _cairo_atomic_int_cmpxchg (int *x, int oldv, int newv) { int ret; CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); ret = *x; if (ret == oldv) *x = newv; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); return ret; } #endif #ifdef CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER int _cairo_atomic_int_get (int *x) { int ret; CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); ret = *x; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); return ret; } void _cairo_atomic_int_set (int *x, int value) { CAIRO_MUTEX_LOCK (_cairo_atomic_mutex); *x = value; CAIRO_MUTEX_UNLOCK (_cairo_atomic_mutex); } #endif libgdiplus-2.11/cairo/src/cairo-traps.c0000664000175000017500000004777312225470167015022 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* * Copyright © 2002 Keith Packard * Copyright © 2007 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith R. Packard * Carl D. Worth * * 2002-07-15: Converted from XRenderCompositeDoublePoly to #cairo_trap_t. Carl D. Worth */ #include "cairoint.h" /* private functions */ static cairo_status_t _cairo_traps_grow (cairo_traps_t *traps); static void _cairo_traps_add_trap (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom, cairo_line_t *left, cairo_line_t *right); static int _compare_point_fixed_by_y (const void *av, const void *bv); void _cairo_traps_init (cairo_traps_t *traps) { traps->status = CAIRO_STATUS_SUCCESS; traps->num_traps = 0; traps->traps_size = ARRAY_LENGTH (traps->traps_embedded); traps->traps = traps->traps_embedded; traps->extents.p1.x = traps->extents.p1.y = INT32_MAX; traps->extents.p2.x = traps->extents.p2.y = INT32_MIN; traps->has_limits = FALSE; } void _cairo_traps_limit (cairo_traps_t *traps, cairo_box_t *limits) { traps->has_limits = TRUE; traps->limits = *limits; } cairo_bool_t _cairo_traps_get_limit (cairo_traps_t *traps, cairo_box_t *limits) { *limits = traps->limits; return traps->has_limits; } void _cairo_traps_fini (cairo_traps_t *traps) { if (traps->traps && traps->traps != traps->traps_embedded) free (traps->traps); traps->traps = NULL; traps->traps_size = 0; traps->num_traps = 0; } /** * _cairo_traps_init_box: * @traps: a #cairo_traps_t * @box: a box that will be converted to a single trapezoid * to store in @traps. * * Initializes a #cairo_traps_t to contain a single rectangular * trapezoid. **/ cairo_status_t _cairo_traps_init_box (cairo_traps_t *traps, cairo_box_t *box) { _cairo_traps_init (traps); assert (traps->traps_size >= 1); traps->num_traps = 1; traps->traps[0].top = box->p1.y; traps->traps[0].bottom = box->p2.y; traps->traps[0].left.p1 = box->p1; traps->traps[0].left.p2.x = box->p1.x; traps->traps[0].left.p2.y = box->p2.y; traps->traps[0].right.p1.x = box->p2.x; traps->traps[0].right.p1.y = box->p1.y; traps->traps[0].right.p2 = box->p2; traps->extents = *box; return traps->status; } cairo_status_t _cairo_traps_status (cairo_traps_t *traps) { return traps->status; } static void _cairo_traps_add_trap (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom, cairo_line_t *left, cairo_line_t *right) { cairo_trapezoid_t *trap; if (traps->status) return; /* Note: With the goofy trapezoid specification, (where an * arbitrary two points on the lines can specified for the left * and right edges), these limit checks would not work in * general. For example, one can imagine a trapezoid entirely * within the limits, but with two points used to specify the left * edge entirely to the right of the limits. Fortunately, for our * purposes, cairo will never generate such a crazy * trapezoid. Instead, cairo always uses for its points the * extreme positions of the edge that are visible on at least some * trapezoid. With this constraint, it's impossible for both * points to be outside the limits while the relevant edge is * entirely inside the limits. */ if (traps->has_limits) { /* Trivially reject if trapezoid is entirely to the right or * to the left of the limits. */ if (left->p1.x >= traps->limits.p2.x && left->p2.x >= traps->limits.p2.x) { return; } if (right->p1.x <= traps->limits.p1.x && right->p2.x <= traps->limits.p1.x) { return; } /* Otherwise, clip the trapezoid to the limits. We only clip * where an edge is entirely outside the limits. If we wanted * to be more clever, we could handle cases where a trapezoid * edge intersects the edge of the limits, but that would * require slicing this trapezoid into multiple trapezoids, * and I'm not sure the effort would be worth it. */ if (top < traps->limits.p1.y) top = traps->limits.p1.y; if (bottom > traps->limits.p2.y) bottom = traps->limits.p2.y; if (left->p1.x < traps->limits.p1.x && left->p2.x < traps->limits.p1.x) { left->p1.x = traps->limits.p1.x; left->p2.x = traps->limits.p1.x; } if (right->p1.x > traps->limits.p2.x && right->p2.x > traps->limits.p2.x) { right->p1.x = traps->limits.p2.x; right->p2.x = traps->limits.p2.x; } } if (top >= bottom) { return; } if (traps->num_traps >= traps->traps_size) { traps->status = _cairo_traps_grow (traps); if (traps->status) return; } trap = &traps->traps[traps->num_traps]; trap->top = top; trap->bottom = bottom; trap->left = *left; trap->right = *right; if (top < traps->extents.p1.y) traps->extents.p1.y = top; if (bottom > traps->extents.p2.y) traps->extents.p2.y = bottom; /* * This isn't generally accurate, but it is close enough for * this purpose. Assuming that the left and right segments always * contain the trapezoid vertical extents, these compares will * yield a containing box. Assuming that the points all come from * the same figure which will eventually be completely drawn, then * the compares will yield the correct overall extents */ if (left->p1.x < traps->extents.p1.x) traps->extents.p1.x = left->p1.x; if (left->p2.x < traps->extents.p1.x) traps->extents.p1.x = left->p2.x; if (right->p1.x > traps->extents.p2.x) traps->extents.p2.x = right->p1.x; if (right->p2.x > traps->extents.p2.x) traps->extents.p2.x = right->p2.x; traps->num_traps++; } void _cairo_traps_add_trap_from_points (cairo_traps_t *traps, cairo_fixed_t top, cairo_fixed_t bottom, cairo_point_t left_p1, cairo_point_t left_p2, cairo_point_t right_p1, cairo_point_t right_p2) { cairo_line_t left; cairo_line_t right; if (traps->status) return; left.p1 = left_p1; left.p2 = left_p2; right.p1 = right_p1; right.p2 = right_p2; _cairo_traps_add_trap (traps, top, bottom, &left, &right); } /* make room for at least one more trap */ static cairo_status_t _cairo_traps_grow (cairo_traps_t *traps) { cairo_trapezoid_t *new_traps; int new_size = 2 * MAX (traps->traps_size, 16); if (traps->traps == traps->traps_embedded) { new_traps = _cairo_malloc_ab (new_size, sizeof (cairo_trapezoid_t)); if (new_traps) memcpy (new_traps, traps->traps, sizeof (traps->traps_embedded)); } else { new_traps = _cairo_realloc_ab (traps->traps, new_size, sizeof (cairo_trapezoid_t)); } if (new_traps == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); traps->traps = new_traps; traps->traps_size = new_size; return CAIRO_STATUS_SUCCESS; } static int _compare_point_fixed_by_y (const void *av, const void *bv) { const cairo_point_t *a = av, *b = bv; int ret = a->y - b->y; if (ret == 0) { ret = a->x - b->x; } return ret; } void _cairo_traps_translate (cairo_traps_t *traps, int x, int y) { cairo_fixed_t xoff, yoff; cairo_trapezoid_t *t; int i; /* Ugh. The cairo_composite/(Render) interface doesn't allow an offset for the trapezoids. Need to manually shift all the coordinates to align with the offset origin of the intermediate surface. */ xoff = _cairo_fixed_from_int (x); yoff = _cairo_fixed_from_int (y); for (i = 0, t = traps->traps; i < traps->num_traps; i++, t++) { t->top += yoff; t->bottom += yoff; t->left.p1.x += xoff; t->left.p1.y += yoff; t->left.p2.x += xoff; t->left.p2.y += yoff; t->right.p1.x += xoff; t->right.p1.y += yoff; t->right.p2.x += xoff; t->right.p2.y += yoff; } } void _cairo_trapezoid_array_translate_and_scale (cairo_trapezoid_t *offset_traps, cairo_trapezoid_t *src_traps, int num_traps, double tx, double ty, double sx, double sy) { int i; cairo_fixed_t xoff = _cairo_fixed_from_double (tx); cairo_fixed_t yoff = _cairo_fixed_from_double (ty); if (sx == 1.0 && sy == 1.0) { for (i = 0; i < num_traps; i++) { offset_traps[i].top = src_traps[i].top + yoff; offset_traps[i].bottom = src_traps[i].bottom + yoff; offset_traps[i].left.p1.x = src_traps[i].left.p1.x + xoff; offset_traps[i].left.p1.y = src_traps[i].left.p1.y + yoff; offset_traps[i].left.p2.x = src_traps[i].left.p2.x + xoff; offset_traps[i].left.p2.y = src_traps[i].left.p2.y + yoff; offset_traps[i].right.p1.x = src_traps[i].right.p1.x + xoff; offset_traps[i].right.p1.y = src_traps[i].right.p1.y + yoff; offset_traps[i].right.p2.x = src_traps[i].right.p2.x + xoff; offset_traps[i].right.p2.y = src_traps[i].right.p2.y + yoff; } } else { cairo_fixed_t xsc = _cairo_fixed_from_double (sx); cairo_fixed_t ysc = _cairo_fixed_from_double (sy); for (i = 0; i < num_traps; i++) { offset_traps[i].top = _cairo_fixed_mul (src_traps[i].top + yoff, ysc); offset_traps[i].bottom = _cairo_fixed_mul (src_traps[i].bottom + yoff, ysc); offset_traps[i].left.p1.x = _cairo_fixed_mul (src_traps[i].left.p1.x + xoff, xsc); offset_traps[i].left.p1.y = _cairo_fixed_mul (src_traps[i].left.p1.y + yoff, ysc); offset_traps[i].left.p2.x = _cairo_fixed_mul (src_traps[i].left.p2.x + xoff, xsc); offset_traps[i].left.p2.y = _cairo_fixed_mul (src_traps[i].left.p2.y + yoff, ysc); offset_traps[i].right.p1.x = _cairo_fixed_mul (src_traps[i].right.p1.x + xoff, xsc); offset_traps[i].right.p1.y = _cairo_fixed_mul (src_traps[i].right.p1.y + yoff, ysc); offset_traps[i].right.p2.x = _cairo_fixed_mul (src_traps[i].right.p2.x + xoff, xsc); offset_traps[i].right.p2.y = _cairo_fixed_mul (src_traps[i].right.p2.y + yoff, ysc); } } } /* A triangle is simply a degenerate case of a convex * quadrilateral. We would not benefit from having any distinct * implementation of triangle vs. quadrilateral tessellation here. */ cairo_status_t _cairo_traps_tessellate_triangle (cairo_traps_t *traps, cairo_point_t t[3]) { cairo_point_t quad[4]; quad[0] = t[0]; quad[1] = t[0]; quad[2] = t[1]; quad[3] = t[2]; return _cairo_traps_tessellate_convex_quad (traps, quad); } cairo_status_t _cairo_traps_tessellate_convex_quad (cairo_traps_t *traps, cairo_point_t q[4]) { int a, b, c, d; int i; cairo_slope_t ab, ad; cairo_bool_t b_left_of_d; /* Choose a as a point with minimal y */ a = 0; for (i = 1; i < 4; i++) if (_compare_point_fixed_by_y (&q[i], &q[a]) < 0) a = i; /* b and d are adjacent to a, while c is opposite */ b = (a + 1) % 4; c = (a + 2) % 4; d = (a + 3) % 4; /* Choose between b and d so that b.y is less than d.y */ if (_compare_point_fixed_by_y (&q[d], &q[b]) < 0) { b = (a + 3) % 4; d = (a + 1) % 4; } /* Without freedom left to choose anything else, we have four * cases to tessellate. * * First, we have to determine the Y-axis sort of the four * vertices, (either abcd or abdc). After that we need to detemine * which edges will be "left" and which will be "right" in the * resulting trapezoids. This can be determined by computing a * slope comparison of ab and ad to determine if b is left of d or * not. * * Note that "left of" here is in the sense of which edges should * be the left vs. right edges of the trapezoid. In particular, b * left of d does *not* mean that b.x is less than d.x. * * This should hopefully be made clear in the lame ASCII art * below. Since the same slope comparison is used in all cases, we * compute it before testing for the Y-value sort. */ /* Note: If a == b then the ab slope doesn't give us any * information. In that case, we can replace it with the ac (or * equivalenly the bc) slope which gives us exactly the same * information we need. At worst the names of the identifiers ab * and b_left_of_d are inaccurate in this case, (would be ac, and * c_left_of_d). */ if (q[a].x == q[b].x && q[a].y == q[b].y) _cairo_slope_init (&ab, &q[a], &q[c]); else _cairo_slope_init (&ab, &q[a], &q[b]); _cairo_slope_init (&ad, &q[a], &q[d]); b_left_of_d = (_cairo_slope_compare (&ab, &ad) > 0); if (q[c].y <= q[d].y) { if (b_left_of_d) { /* Y-sort is abcd and b is left of d, (slope(ab) > slope (ad)) * * top bot left right * _a a a * / / /| |\ a.y b.y ab ad * b / b | b \ * / / | | \ \ b.y c.y bc ad * c / c | c \ * | / \| \ \ c.y d.y cd ad * d d d */ _cairo_traps_add_trap_from_points (traps, q[a].y, q[b].y, q[a], q[b], q[a], q[d]); _cairo_traps_add_trap_from_points (traps, q[b].y, q[c].y, q[b], q[c], q[a], q[d]); _cairo_traps_add_trap_from_points (traps, q[c].y, q[d].y, q[c], q[d], q[a], q[d]); } else { /* Y-sort is abcd and b is right of d, (slope(ab) <= slope (ad)) * * a a a_ * /| |\ \ \ a.y b.y ad ab * / b | b \ b * / / | | \ \ b.y c.y ad bc * / c | c \ c * / / |/ \ | c.y d.y ad cd * d d d */ _cairo_traps_add_trap_from_points (traps, q[a].y, q[b].y, q[a], q[d], q[a], q[b]); _cairo_traps_add_trap_from_points (traps, q[b].y, q[c].y, q[a], q[d], q[b], q[c]); _cairo_traps_add_trap_from_points (traps, q[c].y, q[d].y, q[a], q[d], q[c], q[d]); } } else { if (b_left_of_d) { /* Y-sort is abdc and b is left of d, (slope (ab) > slope (ad)) * * a a a * // / \ |\ a.y b.y ab ad * /b/ b \ b \ * / / \ \ \ \ b.y d.y bc ad * /d/ \ d \ d * // \ / \| d.y c.y bc dc * c c c */ _cairo_traps_add_trap_from_points (traps, q[a].y, q[b].y, q[a], q[b], q[a], q[d]); _cairo_traps_add_trap_from_points (traps, q[b].y, q[d].y, q[b], q[c], q[a], q[d]); _cairo_traps_add_trap_from_points (traps, q[d].y, q[c].y, q[b], q[c], q[d], q[c]); } else { /* Y-sort is abdc and b is right of d, (slope (ab) <= slope (ad)) * * a a a * /| / \ \\ a.y b.y ad ab * / b / b \b\ * / / / / \ \ b.y d.y ad bc * d / d / \d\ * |/ \ / \\ d.y c.y dc bc * c c c */ _cairo_traps_add_trap_from_points (traps, q[a].y, q[b].y, q[a], q[d], q[a], q[b]); _cairo_traps_add_trap_from_points (traps, q[b].y, q[d].y, q[a], q[d], q[b], q[c]); _cairo_traps_add_trap_from_points (traps, q[d].y, q[c].y, q[d], q[c], q[b], q[c]); } } return traps->status; } static cairo_bool_t _cairo_trap_contains (cairo_trapezoid_t *t, cairo_point_t *pt) { cairo_slope_t slope_left, slope_pt, slope_right; if (t->top > pt->y) return FALSE; if (t->bottom < pt->y) return FALSE; _cairo_slope_init (&slope_left, &t->left.p1, &t->left.p2); _cairo_slope_init (&slope_pt, &t->left.p1, pt); if (_cairo_slope_compare (&slope_left, &slope_pt) < 0) return FALSE; _cairo_slope_init (&slope_right, &t->right.p1, &t->right.p2); _cairo_slope_init (&slope_pt, &t->right.p1, pt); if (_cairo_slope_compare (&slope_pt, &slope_right) < 0) return FALSE; return TRUE; } cairo_bool_t _cairo_traps_contain (cairo_traps_t *traps, double x, double y) { int i; cairo_point_t point; point.x = _cairo_fixed_from_double (x); point.y = _cairo_fixed_from_double (y); for (i = 0; i < traps->num_traps; i++) { if (_cairo_trap_contains (&traps->traps[i], &point)) return TRUE; } return FALSE; } void _cairo_traps_extents (cairo_traps_t *traps, cairo_box_t *extents) { if (traps->num_traps == 0) { extents->p1.x = extents->p1.y = _cairo_fixed_from_int (0); extents->p2.x = extents->p2.y = _cairo_fixed_from_int (0); } else *extents = traps->extents; } /** * _cairo_traps_extract_region: * @traps: a #cairo_traps_t * @region: a #cairo_region_t * * Determines if a set of trapezoids are exactly representable as a * cairo region. If so, the passed-in region is initialized to * the area representing the given traps. It should be finalized * with _cairo_region_fini(). If not, %CAIRO_INT_STATUS_UNSUPPORTED * is returned. * * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_INT_STATUS_UNSUPPORTED * or %CAIRO_STATUS_NO_MEMORY **/ cairo_int_status_t _cairo_traps_extract_region (cairo_traps_t *traps, cairo_region_t *region) { cairo_box_int_t stack_boxes[CAIRO_STACK_ARRAY_LENGTH (cairo_box_int_t)]; cairo_box_int_t *boxes = stack_boxes; int i, box_count; cairo_int_status_t status; for (i = 0; i < traps->num_traps; i++) if (!(traps->traps[i].left.p1.x == traps->traps[i].left.p2.x && traps->traps[i].right.p1.x == traps->traps[i].right.p2.x && _cairo_fixed_is_integer(traps->traps[i].top) && _cairo_fixed_is_integer(traps->traps[i].bottom) && _cairo_fixed_is_integer(traps->traps[i].left.p1.x) && _cairo_fixed_is_integer(traps->traps[i].right.p1.x))) { return CAIRO_INT_STATUS_UNSUPPORTED; } if (traps->num_traps > ARRAY_LENGTH(stack_boxes)) { boxes = _cairo_malloc_ab (traps->num_traps, sizeof(cairo_box_int_t)); if (boxes == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } box_count = 0; for (i = 0; i < traps->num_traps; i++) { int x1 = _cairo_fixed_integer_part(traps->traps[i].left.p1.x); int y1 = _cairo_fixed_integer_part(traps->traps[i].top); int x2 = _cairo_fixed_integer_part(traps->traps[i].right.p1.x); int y2 = _cairo_fixed_integer_part(traps->traps[i].bottom); /* XXX: Sometimes we get degenerate trapezoids from the tesellator; * skip these. */ if (x1 == x2 || y1 == y2) continue; boxes[box_count].p1.x = x1; boxes[box_count].p1.y = y1; boxes[box_count].p2.x = x2; boxes[box_count].p2.y = y2; box_count++; } status = _cairo_region_init_boxes (region, boxes, box_count); if (boxes != stack_boxes) free (boxes); if (status) _cairo_region_fini (region); return status; } libgdiplus-2.11/cairo/src/cairo-hash.c0000664000175000017500000004323612225470167014602 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2004 Red Hat, Inc. * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Keith Packard * Graydon Hoare * Carl Worth */ #include "cairoint.h" /* * An entry can be in one of three states: * * FREE: Entry has never been used, terminates all searches. * Appears in the table as a %NULL pointer. * * DEAD: Entry had been live in the past. A dead entry can be reused * but does not terminate a search for an exact entry. * Appears in the table as a pointer to DEAD_ENTRY. * * LIVE: Entry is currently being used. * Appears in the table as any non-%NULL, non-DEAD_ENTRY pointer. */ static cairo_hash_entry_t dead_entry = { 0 }; #define DEAD_ENTRY (&dead_entry) #define ENTRY_IS_FREE(entry) ((entry) == NULL) #define ENTRY_IS_DEAD(entry) ((entry) == DEAD_ENTRY) #define ENTRY_IS_LIVE(entry) ((entry) && ! ENTRY_IS_DEAD(entry)) /* We expect keys will not be destroyed frequently, so our table does not * contain any explicit shrinking code nor any chain-coalescing code for * entries randomly deleted by memory pressure (except during rehashing, of * course). These assumptions are potentially bad, but they make the * implementation straightforward. * * Revisit later if evidence appears that we're using excessive memory from * a mostly-dead table. * * This table is open-addressed with double hashing. Each table size is a * prime chosen to be a little more than double the high water mark for a * given arrangement, so the tables should remain < 50% full. The table * size makes for the "first" hash modulus; a second prime (2 less than the * first prime) serves as the "second" hash modulus, which is co-prime and * thus guarantees a complete permutation of table indices. * * This structure, and accompanying table, is borrowed/modified from the * file xserver/render/glyph.c in the freedesktop.org x server, with * permission (and suggested modification of doubling sizes) by Keith * Packard. */ typedef struct _cairo_hash_table_arrangement { unsigned long high_water_mark; unsigned long size; unsigned long rehash; } cairo_hash_table_arrangement_t; static const cairo_hash_table_arrangement_t hash_table_arrangements [] = { { 16, 43, 41 }, { 32, 73, 71 }, { 64, 151, 149 }, { 128, 283, 281 }, { 256, 571, 569 }, { 512, 1153, 1151 }, { 1024, 2269, 2267 }, { 2048, 4519, 4517 }, { 4096, 9013, 9011 }, { 8192, 18043, 18041 }, { 16384, 36109, 36107 }, { 32768, 72091, 72089 }, { 65536, 144409, 144407 }, { 131072, 288361, 288359 }, { 262144, 576883, 576881 }, { 524288, 1153459, 1153457 }, { 1048576, 2307163, 2307161 }, { 2097152, 4613893, 4613891 }, { 4194304, 9227641, 9227639 }, { 8388608, 18455029, 18455027 }, { 16777216, 36911011, 36911009 }, { 33554432, 73819861, 73819859 }, { 67108864, 147639589, 147639587 }, { 134217728, 295279081, 295279079 }, { 268435456, 590559793, 590559791 } }; #define NUM_HASH_TABLE_ARRANGEMENTS ARRAY_LENGTH (hash_table_arrangements) struct _cairo_hash_table { cairo_hash_keys_equal_func_t keys_equal; const cairo_hash_table_arrangement_t *arrangement; cairo_hash_entry_t **entries; unsigned long live_entries; unsigned long iterating; /* Iterating, no insert, no resize */ }; /** * _cairo_hash_table_create: * @keys_equal: a function to return %TRUE if two keys are equal * * Creates a new hash table which will use the keys_equal() function * to compare hash keys. Data is provided to the hash table in the * form of user-derived versions of #cairo_hash_entry_t. A hash entry * must be able to hold both a key (including a hash code) and a * value. Sometimes only the key will be necessary, (as in * _cairo_hash_table_remove), and other times both a key and a value * will be necessary, (as in _cairo_hash_table_insert). * * See #cairo_hash_entry_t for more details. * * Return value: the new hash table or %NULL if out of memory. **/ cairo_hash_table_t * _cairo_hash_table_create (cairo_hash_keys_equal_func_t keys_equal) { cairo_hash_table_t *hash_table; hash_table = malloc (sizeof (cairo_hash_table_t)); if (hash_table == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } hash_table->keys_equal = keys_equal; hash_table->arrangement = &hash_table_arrangements[0]; hash_table->entries = calloc (hash_table->arrangement->size, sizeof(cairo_hash_entry_t *)); if (hash_table->entries == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); free (hash_table); return NULL; } hash_table->live_entries = 0; hash_table->iterating = 0; return hash_table; } /** * _cairo_hash_table_destroy: * @hash_table: an empty hash table to destroy * * Immediately destroys the given hash table, freeing all resources * associated with it. * * WARNING: The hash_table must have no live entries in it before * _cairo_hash_table_destroy is called. It is a fatal error otherwise, * and this function will halt. The rationale for this behavior is to * avoid memory leaks and to avoid needless complication of the API * with destroy notifiy callbacks. * * WARNING: The hash_table must have no running iterators in it when * _cairo_hash_table_destroy is called. It is a fatal error otherwise, * and this function will halt. **/ void _cairo_hash_table_destroy (cairo_hash_table_t *hash_table) { if (hash_table == NULL) return; /* The hash table must be empty. Otherwise, halt. */ assert (hash_table->live_entries == 0); /* No iterators can be running. Otherwise, halt. */ assert (hash_table->iterating == 0); free (hash_table->entries); hash_table->entries = NULL; free (hash_table); } /** * _cairo_hash_table_lookup_internal: * * @hash_table: a #cairo_hash_table_t to search * @key: the key to search on * @hash_code: the hash_code for @key * @key_unique: If %TRUE, then caller asserts that no key already * exists that will compare equal to #key, so search can be * optimized. If unsure, set to %FALSE and the code will always work. * * Search the hashtable for a live entry for which * hash_table->keys_equal returns true. If no such entry exists then * return the first available (free or dead entry). * * If the key_unique flag is set, then the search will never call * hash_table->keys_equal and will act as if it always returned * false. This is useful as a performance optimization in special * circumstances where the caller knows that there is no existing * entry in the hash table with a matching key. * * Return value: The matching entry in the hash table (if * any). Otherwise, the first available entry. The caller should check * entry->state to check whether a match was found or not. **/ static cairo_hash_entry_t ** _cairo_hash_table_lookup_internal (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key, cairo_bool_t key_is_unique) { cairo_hash_entry_t **entry, **first_available = NULL; unsigned long table_size, i, idx, step; table_size = hash_table->arrangement->size; idx = key->hash % table_size; step = 0; for (i = 0; i < table_size; ++i) { entry = &hash_table->entries[idx]; if (ENTRY_IS_FREE(*entry)) { return entry; } else if (ENTRY_IS_DEAD(*entry)) { if (key_is_unique) { return entry; } else { if (! first_available) first_available = entry; } } else /* ENTRY_IS_LIVE(*entry) */ { if (! key_is_unique) if (hash_table->keys_equal (key, *entry)) return entry; } if (step == 0) { step = key->hash % hash_table->arrangement->rehash; if (step == 0) step = 1; } idx += step; if (idx >= table_size) idx -= table_size; } /* * The table should not have permitted you to get here if you were just * looking for a free slot: there should have been room. */ assert (key_is_unique == 0); return first_available; } /** * _cairo_hash_table_resize: * @hash_table: a hash table * * Resize the hash table if the number of entries has gotten much * bigger or smaller than the ideal number of entries for the current * size. * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if out of memory. **/ static cairo_status_t _cairo_hash_table_resize (cairo_hash_table_t *hash_table) { cairo_hash_table_t tmp; cairo_hash_entry_t **entry; unsigned long new_size, i; /* This keeps the hash table between 25% and 50% full. */ unsigned long high = hash_table->arrangement->high_water_mark; unsigned long low = high >> 2; if (hash_table->live_entries >= low && hash_table->live_entries <= high) return CAIRO_STATUS_SUCCESS; tmp = *hash_table; if (hash_table->live_entries > high) { tmp.arrangement = hash_table->arrangement + 1; /* This code is being abused if we can't make a table big enough. */ assert (tmp.arrangement - hash_table_arrangements < NUM_HASH_TABLE_ARRANGEMENTS); } else /* hash_table->live_entries < low */ { /* Can't shrink if we're at the smallest size */ if (hash_table->arrangement == &hash_table_arrangements[0]) return CAIRO_STATUS_SUCCESS; tmp.arrangement = hash_table->arrangement - 1; } new_size = tmp.arrangement->size; tmp.entries = calloc (new_size, sizeof (cairo_hash_entry_t*)); if (tmp.entries == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); for (i = 0; i < hash_table->arrangement->size; ++i) { if (ENTRY_IS_LIVE (hash_table->entries[i])) { entry = _cairo_hash_table_lookup_internal (&tmp, hash_table->entries[i], TRUE); assert (ENTRY_IS_FREE(*entry)); *entry = hash_table->entries[i]; } } free (hash_table->entries); hash_table->entries = tmp.entries; hash_table->arrangement = tmp.arrangement; return CAIRO_STATUS_SUCCESS; } /** * _cairo_hash_table_lookup: * @hash_table: a hash table * @key: the key of interest * @entry_return: pointer for return value. * * Performs a lookup in @hash_table looking for an entry which has a * key that matches @key, (as determined by the keys_equal() function * passed to _cairo_hash_table_create). * * Return value: %TRUE if there is an entry in the hash table that * matches the given key, (which will now be in *entry_return). %FALSE * otherwise, (in which case *entry_return will be %NULL). **/ cairo_bool_t _cairo_hash_table_lookup (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key, cairo_hash_entry_t **entry_return) { cairo_hash_entry_t **entry; /* See if we have an entry in the table already. */ entry = _cairo_hash_table_lookup_internal (hash_table, key, FALSE); if (ENTRY_IS_LIVE(*entry)) { *entry_return = *entry; return TRUE; } *entry_return = NULL; return FALSE; } /** * _cairo_hash_table_random_entry: * @hash_table: a hash table * @predicate: a predicate function, or %NULL for any entry. * * Find a random entry in the hash table satisfying the given * @predicate. A %NULL @predicate is taken as equivalent to a function * which always returns %TRUE, (eg. any entry in the table will do). * * We use the same algorithm as the lookup algorithm to walk over the * entries in the hash table in a pseudo-random order. Walking * linearly would favor entries following gaps in the hash table. We * could also call rand() repeatedly, which works well for almost-full * tables, but degrades when the table is almost empty, or predicate * returns %TRUE for most entries. * * Return value: a random live entry or %NULL if there are no entries * that match the given predicate. In particular, if predicate is * NULL, a %NULL return value indicates that the table is empty. **/ void * _cairo_hash_table_random_entry (cairo_hash_table_t *hash_table, cairo_hash_predicate_func_t predicate) { cairo_hash_entry_t **entry; unsigned long hash; unsigned long table_size, i, idx, step; table_size = hash_table->arrangement->size; hash = rand (); idx = hash % table_size; step = 0; for (i = 0; i < table_size; ++i) { entry = &hash_table->entries[idx]; if (ENTRY_IS_LIVE (*entry) && (predicate == NULL || predicate (*entry))) { return *entry; } if (step == 0) { step = hash % hash_table->arrangement->rehash; if (step == 0) step = 1; } idx += step; if (idx >= table_size) idx -= table_size; } return NULL; } /** * _cairo_hash_table_insert: * @hash_table: a hash table * @key_and_value: an entry to be inserted * * Insert the entry #key_and_value into the hash table. * * WARNING: It is a fatal error if an entry exists in the hash table * with a matching key, (this function will halt). * * WARNING: It is a fatal error to insert an element while * an iterator is running * * Instead of using insert to replace an entry, consider just editing * the entry obtained with _cairo_hash_table_lookup. Or if absolutely * necessary, use _cairo_hash_table_remove first. * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if insufficient memory is available. **/ cairo_status_t _cairo_hash_table_insert (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key_and_value) { cairo_status_t status; cairo_hash_entry_t **entry; /* Insert is illegal while an iterator is running. */ assert (hash_table->iterating == 0); entry = _cairo_hash_table_lookup_internal (hash_table, key_and_value, FALSE); if (ENTRY_IS_LIVE(*entry)) { /* User is being bad, let's crash. */ ASSERT_NOT_REACHED; } *entry = key_and_value; hash_table->live_entries++; status = _cairo_hash_table_resize (hash_table); if (status) { /* abort the insert... */ *entry = DEAD_ENTRY; hash_table->live_entries--; return status; } return CAIRO_STATUS_SUCCESS; } /** * _cairo_hash_table_remove: * @hash_table: a hash table * @key: key of entry to be removed * * Remove an entry from the hash table which has a key that matches * @key, if any (as determined by the keys_equal() function passed to * _cairo_hash_table_create). * * Return value: %CAIRO_STATUS_SUCCESS if successful or * CAIRO_STATUS_NO_MEMORY if out of memory. **/ void _cairo_hash_table_remove (cairo_hash_table_t *hash_table, cairo_hash_entry_t *key) { cairo_hash_entry_t **entry; entry = _cairo_hash_table_lookup_internal (hash_table, key, FALSE); if (! ENTRY_IS_LIVE(*entry)) return; *entry = DEAD_ENTRY; hash_table->live_entries--; /* Check for table resize. Don't do this when iterating as this will * reorder elements of the table and cause the iteration to potentially * skip some elements. */ if (hash_table->iterating == 0) { /* This call _can_ fail, but only in failing to allocate new * memory to shrink the hash table. It does leave the table in a * consistent state, and we've already succeeded in removing the * entry, so we don't examine the failure status of this call. */ _cairo_hash_table_resize (hash_table); } } /** * _cairo_hash_table_foreach: * @hash_table: a hash table * @hash_callback: function to be called for each live entry * @closure: additional argument to be passed to @hash_callback * * Call @hash_callback for each live entry in the hash table, in a * non-specified order. * * Entries in @hash_table may be removed by code executed from @hash_callback. * * Entries may not be inserted to @hash_table, nor may @hash_table * be destroyed by code executed from @hash_callback. The relevant * functions will halt in these cases. **/ void _cairo_hash_table_foreach (cairo_hash_table_t *hash_table, cairo_hash_callback_func_t hash_callback, void *closure) { unsigned long i; cairo_hash_entry_t *entry; if (hash_table == NULL) return; /* Mark the table for iteration */ ++hash_table->iterating; for (i = 0; i < hash_table->arrangement->size; i++) { entry = hash_table->entries[i]; if (ENTRY_IS_LIVE(entry)) hash_callback (entry, closure); } /* If some elements were deleted during the iteration, * the table may need resizing. Just do this every time * as the check is inexpensive. */ if (--hash_table->iterating == 0) { /* Should we fail to shrink the hash table, it is left unaltered, * and we don't need to propagate the error status. */ _cairo_hash_table_resize (hash_table); } } libgdiplus-2.11/cairo/src/cairo.c0000664000175000017500000031234012225470167013654 00000000000000/* -*- Mode: c; c-basic-offset: 4; indent-tabs-mode: t; tab-width: 8; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-private.h" #include "cairo-arc-private.h" #include "cairo-path-private.h" #define CAIRO_TOLERANCE_MINIMUM 0.0002 /* We're limited by 16 bits of sub-pixel precision */ static const cairo_t _cairo_nil = { CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ CAIRO_STATUS_NO_MEMORY, /* status */ { 0, 0, 0, NULL }, /* user_data */ NULL, /* gstate */ {{ /* gstate_tail */ 0 }}, {{ /* path */ { 0, 0 }, /* last_move_point */ { 0, 0 }, /* current point */ FALSE, /* has_current_point */ FALSE, /* has_curve_to */ NULL, {{NULL}} /* buf_tail, buf_head */ }} }; #include /** * _cairo_error: * @status: a status value indicating an error, (eg. not * CAIRO_STATUS_SUCCESS) * * Checks that status is an error status, but does nothing else. * * All assignments of an error status to any user-visible object * within the cairo application should result in a call to * _cairo_error(). * * The purpose of this function is to allow the user to set a * breakpoint in _cairo_error() to generate a stack trace for when the * user causes cairo to detect an error. * * Return value: the error status. **/ cairo_status_t _cairo_error (cairo_status_t status) { assert (status > CAIRO_STATUS_SUCCESS && status <= CAIRO_STATUS_LAST_STATUS); return status; } /** * _cairo_set_error: * @cr: a cairo context * @status: a status value indicating an error, (eg. not * CAIRO_STATUS_SUCCESS) * * Atomically sets cr->status to @status and calls _cairo_error; * * All assignments of an error status to cr->status should happen * through _cairo_set_error(). Note that due to the nature of the atomic * operation, it is not safe to call this function on the nil objects. * * The purpose of this function is to allow the user to set a * breakpoint in _cairo_error() to generate a stack trace for when the * user causes cairo to detect an error. **/ static void _cairo_set_error (cairo_t *cr, cairo_status_t status) { /* Don't overwrite an existing error. This preserves the first * error, which is the most significant. */ _cairo_status_set_error (&cr->status, status); status = _cairo_error (status); } /** * cairo_version: * * Returns the version of the cairo library encoded in a single * integer as per %CAIRO_VERSION_ENCODE. The encoding ensures that * later versions compare greater than earlier versions. * * A run-time comparison to check that cairo's version is greater than * or equal to version X.Y.Z could be performed as follows: * * * if (cairo_version() >= CAIRO_VERSION_ENCODE(X,Y,Z)) {...} * * * See also cairo_version_string() as well as the compile-time * equivalents %CAIRO_VERSION and %CAIRO_VERSION_STRING. * * Return value: the encoded version. **/ int cairo_version (void) { return CAIRO_VERSION; } /** * cairo_version_string: * * Returns the version of the cairo library as a human-readable string * of the form "X.Y.Z". * * See also cairo_version() as well as the compile-time equivalents * %CAIRO_VERSION_STRING and %CAIRO_VERSION. * * Return value: a string containing the version. **/ const char* cairo_version_string (void) { return CAIRO_VERSION_STRING; } slim_hidden_def (cairo_version_string); /** * cairo_create: * @target: target surface for the context * * Creates a new #cairo_t with all graphics state parameters set to * default values and with @target as a target surface. The target * surface should be constructed with a backend-specific function such * as cairo_image_surface_create() (or any other * cairo_backend_surface_create variant). * * This function references @target, so you can immediately * call cairo_surface_destroy() on it if you don't need to * maintain a separate reference to it. * * Return value: a newly allocated #cairo_t with a reference * count of 1. The initial reference count should be released * with cairo_destroy() when you are done using the #cairo_t. * This function never returns %NULL. If memory cannot be * allocated, a special #cairo_t object will be returned on * which cairo_status() returns %CAIRO_STATUS_NO_MEMORY. * You can use this object normally, but no drawing will * be done. **/ cairo_t * cairo_create (cairo_surface_t *target) { cairo_t *cr; cairo_status_t status; /* special case OOM in order to avoid another allocation */ if (target && target->status == CAIRO_STATUS_NO_MEMORY) return (cairo_t *) &_cairo_nil; cr = malloc (sizeof (cairo_t)); if (cr == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return (cairo_t *) &_cairo_nil; } CAIRO_REFERENCE_COUNT_INIT (&cr->ref_count, 1); cr->status = CAIRO_STATUS_SUCCESS; _cairo_user_data_array_init (&cr->user_data); _cairo_path_fixed_init (cr->path); cr->gstate = cr->gstate_tail; status = _cairo_gstate_init (cr->gstate, target); if (status) _cairo_set_error (cr, status); return cr; } slim_hidden_def (cairo_create); /** * cairo_reference: * @cr: a #cairo_t * * Increases the reference count on @cr by one. This prevents * @cr from being destroyed until a matching call to cairo_destroy() * is made. * * The number of references to a #cairo_t can be get using * cairo_get_reference_count(). * * Return value: the referenced #cairo_t. **/ cairo_t * cairo_reference (cairo_t *cr) { if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) return cr; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count)); _cairo_reference_count_inc (&cr->ref_count); return cr; } /** * cairo_destroy: * @cr: a #cairo_t * * Decreases the reference count on @cr by one. If the result * is zero, then @cr and all associated resources are freed. * See cairo_reference(). **/ void cairo_destroy (cairo_t *cr) { if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&cr->ref_count)); if (! _cairo_reference_count_dec_and_test (&cr->ref_count)) return; while (cr->gstate != cr->gstate_tail) { if (_cairo_gstate_restore (&cr->gstate)) break; } _cairo_gstate_fini (cr->gstate); _cairo_path_fixed_fini (cr->path); _cairo_user_data_array_fini (&cr->user_data); free (cr); } slim_hidden_def (cairo_destroy); /** * cairo_get_user_data: * @cr: a #cairo_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Return user data previously attached to @cr using the specified * key. If no user data has been attached with the given key this * function returns %NULL. * * Return value: the user data previously attached or %NULL. * * Since: 1.4 **/ void * cairo_get_user_data (cairo_t *cr, const cairo_user_data_key_t *key) { return _cairo_user_data_array_get_data (&cr->user_data, key); } /** * cairo_set_user_data: * @cr: a #cairo_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach to the #cairo_t * @destroy: a #cairo_destroy_func_t which will be called when the * #cairo_t is destroyed or when new user data is attached using the * same key. * * Attach user data to @cr. To remove user data from a surface, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. * * Since: 1.4 **/ cairo_status_t cairo_set_user_data (cairo_t *cr, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _cairo_user_data_array_set_data (&cr->user_data, key, user_data, destroy); } /** * cairo_get_reference_count: * @cr: a #cairo_t * * Returns the current reference count of @cr. * * Return value: the current reference count of @cr. If the * object is a nil object, 0 will be returned. * * Since: 1.4 **/ unsigned int cairo_get_reference_count (cairo_t *cr) { if (cr == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&cr->ref_count)) return 0; return CAIRO_REFERENCE_COUNT_GET_VALUE (&cr->ref_count); } /** * cairo_save: * @cr: a #cairo_t * * Makes a copy of the current state of @cr and saves it * on an internal stack of saved states for @cr. When * cairo_restore() is called, @cr will be restored to * the saved state. Multiple calls to cairo_save() and * cairo_restore() can be nested; each call to cairo_restore() * restores the state from the matching paired cairo_save(). * * It isn't necessary to clear all saved states before * a #cairo_t is freed. If the reference count of a #cairo_t * drops to zero in response to a call to cairo_destroy(), * any saved states will be freed along with the #cairo_t. **/ void cairo_save (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_save (&cr->gstate); if (status) { _cairo_set_error (cr, status); } } slim_hidden_def(cairo_save); /** * cairo_restore: * @cr: a #cairo_t * * Restores @cr to the state saved by a preceding call to * cairo_save() and removes that state from the stack of * saved states. **/ void cairo_restore (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_restore (&cr->gstate); if (status) { _cairo_set_error (cr, status); } } slim_hidden_def(cairo_restore); /** * cairo_push_group: * @cr: a cairo context * * Temporarily redirects drawing to an intermediate surface known as a * group. The redirection lasts until the group is completed by a call * to cairo_pop_group() or cairo_pop_group_to_source(). These calls * provide the result of any drawing to the group as a pattern, * (either as an explicit object, or set as the source pattern). * * This group functionality can be convenient for performing * intermediate compositing. One common use of a group is to render * objects as opaque within the group, (so that they occlude each * other), and then blend the result with translucence onto the * destination. * * Groups can be nested arbitrarily deep by making balanced calls to * cairo_push_group()/cairo_pop_group(). Each call pushes/pops the new * target group onto/from a stack. * * The cairo_push_group() function calls cairo_save() so that any * changes to the graphics state will not be visible outside the * group, (the pop_group functions call cairo_restore()). * * By default the intermediate group will have a content type of * CAIRO_CONTENT_COLOR_ALPHA. Other content types can be chosen for * the group by using cairo_push_group_with_content() instead. * * As an example, here is how one might fill and stroke a path with * translucence, but without any portion of the fill being visible * under the stroke: * * * cairo_push_group (cr); * cairo_set_source (cr, fill_pattern); * cairo_fill_preserve (cr); * cairo_set_source (cr, stroke_pattern); * cairo_stroke (cr); * cairo_pop_group_to_source (cr); * cairo_paint_with_alpha (cr, alpha); * * * Since: 1.2 */ void cairo_push_group (cairo_t *cr) { cairo_push_group_with_content (cr, CAIRO_CONTENT_COLOR_ALPHA); } slim_hidden_def(cairo_push_group); /** * cairo_push_group_with_content: * @cr: a cairo context * @content: a %#cairo_content_t indicating the type of group that * will be created * * Temporarily redirects drawing to an intermediate surface known as a * group. The redirection lasts until the group is completed by a call * to cairo_pop_group() or cairo_pop_group_to_source(). These calls * provide the result of any drawing to the group as a pattern, * (either as an explicit object, or set as the source pattern). * * The group will have a content type of @content. The ability to * control this content type is the only distinction between this * function and cairo_push_group() which you should see for a more * detailed description of group rendering. * * Since: 1.2 */ void cairo_push_group_with_content (cairo_t *cr, cairo_content_t content) { cairo_status_t status; cairo_rectangle_int_t extents; cairo_surface_t *parent_surface, *group_surface = NULL; if (cr->status) return; parent_surface = _cairo_gstate_get_target (cr->gstate); /* Get the extents that we'll use in creating our new group surface */ status = _cairo_surface_get_extents (parent_surface, &extents); if (status) goto bail; status = _cairo_clip_intersect_to_rectangle (_cairo_gstate_get_clip (cr->gstate), &extents); if (status) goto bail; group_surface = cairo_surface_create_similar (_cairo_gstate_get_target (cr->gstate), content, extents.width, extents.height); status = cairo_surface_status (group_surface); if (status) goto bail; /* Set device offsets on the new surface so that logically it appears at * the same location on the parent surface -- when we pop_group this, * the source pattern will get fixed up for the appropriate target surface * device offsets, so we want to set our own surface offsets from /that/, * and not from the device origin. */ cairo_surface_set_device_offset (group_surface, parent_surface->device_transform.x0 - extents.x, parent_surface->device_transform.y0 - extents.y); /* create a new gstate for the redirect */ cairo_save (cr); if (cr->status) goto bail; status = _cairo_gstate_redirect_target (cr->gstate, group_surface); bail: cairo_surface_destroy (group_surface); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_push_group_with_content); /** * cairo_pop_group: * @cr: a cairo context * * Terminates the redirection begun by a call to cairo_push_group() or * cairo_push_group_with_content() and returns a new pattern * containing the results of all drawing operations performed to the * group. * * The cairo_pop_group() function calls cairo_restore(), (balancing a * call to cairo_save() by the push_group function), so that any * changes to the graphics state will not be visible outside the * group. * * Return value: a newly created (surface) pattern containing the * results of all drawing operations performed to the group. The * caller owns the returned object and should call * cairo_pattern_destroy() when finished with it. * * Since: 1.2 **/ cairo_pattern_t * cairo_pop_group (cairo_t *cr) { cairo_surface_t *group_surface, *parent_target; cairo_pattern_t *group_pattern = (cairo_pattern_t*) &_cairo_pattern_nil.base; cairo_matrix_t group_matrix; if (cr->status) return group_pattern; /* Grab the active surfaces */ group_surface = _cairo_gstate_get_target (cr->gstate); parent_target = _cairo_gstate_get_parent_target (cr->gstate); /* Verify that we are at the right nesting level */ if (parent_target == NULL) { _cairo_set_error (cr, CAIRO_STATUS_INVALID_POP_GROUP); return group_pattern; } /* We need to save group_surface before we restore; we don't need * to reference parent_target and original_target, since the * gstate will still hold refs to them once we restore. */ group_surface = cairo_surface_reference (group_surface); cairo_restore (cr); if (cr->status) goto done; group_pattern = cairo_pattern_create_for_surface (group_surface); if (cairo_pattern_status (group_pattern)) { _cairo_set_error (cr, cairo_pattern_status (group_pattern)); goto done; } _cairo_gstate_get_matrix (cr->gstate, &group_matrix); cairo_pattern_set_matrix (group_pattern, &group_matrix); done: cairo_surface_destroy (group_surface); return group_pattern; } slim_hidden_def(cairo_pop_group); /** * cairo_pop_group_to_source: * @cr: a cairo context * * Terminates the redirection begun by a call to cairo_push_group() or * cairo_push_group_with_content() and installs the resulting pattern * as the source pattern in the given cairo context. * * The behavior of this function is equivalent to the sequence of * operations: * * * #cairo_pattern_t *group = cairo_pop_group (cr); * cairo_set_source (cr, group); * cairo_pattern_destroy (group); * * * but is more convenient as their is no need for a variable to store * the short-lived pointer to the pattern. * * The cairo_pop_group() function calls cairo_restore(), (balancing a * call to cairo_save() by the push_group function), so that any * changes to the graphics state will not be visible outside the * group. * * Since: 1.2 **/ void cairo_pop_group_to_source (cairo_t *cr) { cairo_pattern_t *group_pattern; group_pattern = cairo_pop_group (cr); cairo_set_source (cr, group_pattern); cairo_pattern_destroy (group_pattern); } slim_hidden_def(cairo_pop_group_to_source); /** * cairo_set_operator: * @cr: a #cairo_t * @op: a compositing operator, specified as a #cairo_operator_t * * Sets the compositing operator to be used for all drawing * operations. See #cairo_operator_t for details on the semantics of * each available compositing operator. * * The default operator is %CAIRO_OPERATOR_OVER. **/ void cairo_set_operator (cairo_t *cr, cairo_operator_t op) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_operator (cr->gstate, op); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_set_operator); /** * cairo_set_source_rgb * @cr: a cairo context * @red: red component of color * @green: green component of color * @blue: blue component of color * * Sets the source pattern within @cr to an opaque color. This opaque * color will then be used for any subsequent drawing operation until * a new source pattern is set. * * The color components are floating point numbers in the range 0 to * 1. If the values passed in are outside that range, they will be * clamped. * * The default source pattern is opaque black, (that is, it is * equivalent to cairo_set_source_rgb (cr, 0.0, 0.0, 0.0)). **/ void cairo_set_source_rgb (cairo_t *cr, double red, double green, double blue) { cairo_pattern_t *pattern; if (cr->status) return; /* push the current pattern to the freed lists */ cairo_set_source (cr, (cairo_pattern_t *) &cairo_pattern_none); pattern = cairo_pattern_create_rgb (red, green, blue); cairo_set_source (cr, pattern); cairo_pattern_destroy (pattern); } /** * cairo_set_source_rgba: * @cr: a cairo context * @red: red component of color * @green: green component of color * @blue: blue component of color * @alpha: alpha component of color * * Sets the source pattern within @cr to a translucent color. This * color will then be used for any subsequent drawing operation until * a new source pattern is set. * * The color and alpha components are floating point numbers in the * range 0 to 1. If the values passed in are outside that range, they * will be clamped. * * The default source pattern is opaque black, (that is, it is * equivalent to cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0)). **/ void cairo_set_source_rgba (cairo_t *cr, double red, double green, double blue, double alpha) { cairo_pattern_t *pattern; if (cr->status) return; /* push the current pattern to the freed lists */ cairo_set_source (cr, (cairo_pattern_t *) &cairo_pattern_none); pattern = cairo_pattern_create_rgba (red, green, blue, alpha); cairo_set_source (cr, pattern); cairo_pattern_destroy (pattern); } /** * cairo_set_source_surface: * @cr: a cairo context * @surface: a surface to be used to set the source pattern * @x: User-space X coordinate for surface origin * @y: User-space Y coordinate for surface origin * * This is a convenience function for creating a pattern from @surface * and setting it as the source in @cr with cairo_set_source(). * * The @x and @y parameters give the user-space coordinate at which * the surface origin should appear. (The surface origin is its * upper-left corner before any transformation has been applied.) The * @x and @y patterns are negated and then set as translation values * in the pattern matrix. * * Other than the initial translation pattern matrix, as described * above, all other pattern attributes, (such as its extend mode), are * set to the default values as in cairo_pattern_create_for_surface(). * The resulting pattern can be queried with cairo_get_source() so * that these attributes can be modified if desired, (eg. to create a * repeating pattern with cairo_pattern_set_extend()). **/ void cairo_set_source_surface (cairo_t *cr, cairo_surface_t *surface, double x, double y) { cairo_pattern_t *pattern; cairo_matrix_t matrix; if (cr->status) return; /* push the current pattern to the freed lists */ cairo_set_source (cr, (cairo_pattern_t *) &cairo_pattern_none); pattern = cairo_pattern_create_for_surface (surface); cairo_matrix_init_translate (&matrix, -x, -y); cairo_pattern_set_matrix (pattern, &matrix); cairo_set_source (cr, pattern); cairo_pattern_destroy (pattern); } slim_hidden_def (cairo_set_source_surface); /** * cairo_set_source * @cr: a cairo context * @source: a #cairo_pattern_t to be used as the source for * subsequent drawing operations. * * Sets the source pattern within @cr to @source. This pattern * will then be used for any subsequent drawing operation until a new * source pattern is set. * * Note: The pattern's transformation matrix will be locked to the * user space in effect at the time of cairo_set_source(). This means * that further modifications of the current transformation matrix * will not affect the source pattern. See cairo_pattern_set_matrix(). * * The default source pattern is a solid pattern that is opaque black, * (that is, it is equivalent to cairo_set_source_rgb (cr, 0.0, 0.0, * 0.0)). **/ void cairo_set_source (cairo_t *cr, cairo_pattern_t *source) { cairo_status_t status; if (cr->status) return; if (source == NULL) { _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); return; } if (source->status) { _cairo_set_error (cr, source->status); return; } status = _cairo_gstate_set_source (cr->gstate, source); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_set_source); /** * cairo_get_source: * @cr: a cairo context * * Gets the current source pattern for @cr. * * Return value: the current source pattern. This object is owned by * cairo. To keep a reference to it, you must call * cairo_pattern_reference(). **/ cairo_pattern_t * cairo_get_source (cairo_t *cr) { if (cr->status) return (cairo_pattern_t*) &_cairo_pattern_nil.base; return _cairo_gstate_get_source (cr->gstate); } /** * cairo_set_tolerance: * @cr: a #cairo_t * @tolerance: the tolerance, in device units (typically pixels) * * Sets the tolerance used when converting paths into trapezoids. * Curved segments of the path will be subdivided until the maximum * deviation between the original path and the polygonal approximation * is less than @tolerance. The default value is 0.1. A larger * value will give better performance, a smaller value, better * appearance. (Reducing the value from the default value of 0.1 * is unlikely to improve appearance significantly.) **/ void cairo_set_tolerance (cairo_t *cr, double tolerance) { cairo_status_t status; if (cr->status) return; _cairo_restrict_value (&tolerance, CAIRO_TOLERANCE_MINIMUM, tolerance); status = _cairo_gstate_set_tolerance (cr->gstate, tolerance); if (status) _cairo_set_error (cr, status); } /** * cairo_set_antialias: * @cr: a #cairo_t * @antialias: the new antialiasing mode * * Set the antialiasing mode of the rasterizer used for drawing shapes. * This value is a hint, and a particular backend may or may not support * a particular value. At the current time, no backend supports * %CAIRO_ANTIALIAS_SUBPIXEL when drawing shapes. * * Note that this option does not affect text rendering, instead see * cairo_font_options_set_antialias(). **/ void cairo_set_antialias (cairo_t *cr, cairo_antialias_t antialias) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_antialias (cr->gstate, antialias); if (status) _cairo_set_error (cr, status); } /** * cairo_set_fill_rule: * @cr: a #cairo_t * @fill_rule: a fill rule, specified as a #cairo_fill_rule_t * * Set the current fill rule within the cairo context. The fill rule * is used to determine which regions are inside or outside a complex * (potentially self-intersecting) path. The current fill rule affects * both cairo_fill() and cairo_clip(). See #cairo_fill_rule_t for details * on the semantics of each available fill rule. * * The default fill rule is %CAIRO_FILL_RULE_WINDING. **/ void cairo_set_fill_rule (cairo_t *cr, cairo_fill_rule_t fill_rule) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_fill_rule (cr->gstate, fill_rule); if (status) _cairo_set_error (cr, status); } /** * cairo_set_line_width: * @cr: a #cairo_t * @width: a line width * * Sets the current line width within the cairo context. The line * width value specifies the diameter of a pen that is circular in * user space, (though device-space pen may be an ellipse in general * due to scaling/shear/rotation of the CTM). * * Note: When the description above refers to user space and CTM it * refers to the user space and CTM in effect at the time of the * stroking operation, not the user space and CTM in effect at the * time of the call to cairo_set_line_width(). The simplest usage * makes both of these spaces identical. That is, if there is no * change to the CTM between a call to cairo_set_line_with() and the * stroking operation, then one can just pass user-space values to * cairo_set_line_width() and ignore this note. * * As with the other stroke parameters, the current line width is * examined by cairo_stroke(), cairo_stroke_extents(), and * cairo_stroke_to_path(), but does not have any effect during path * construction. * * The default line width value is 2.0. **/ void cairo_set_line_width (cairo_t *cr, double width) { cairo_status_t status; if (cr->status) return; _cairo_restrict_value (&width, 0.0, width); status = _cairo_gstate_set_line_width (cr->gstate, width); if (status) _cairo_set_error (cr, status); } /** * cairo_set_line_cap: * @cr: a cairo context * @line_cap: a line cap style * * Sets the current line cap style within the cairo context. See * #cairo_line_cap_t for details about how the available line cap * styles are drawn. * * As with the other stroke parameters, the current line cap style is * examined by cairo_stroke(), cairo_stroke_extents(), and * cairo_stroke_to_path(), but does not have any effect during path * construction. * * The default line cap style is %CAIRO_LINE_CAP_BUTT. **/ void cairo_set_line_cap (cairo_t *cr, cairo_line_cap_t line_cap) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_line_cap (cr->gstate, line_cap); if (status) _cairo_set_error (cr, status); } /** * cairo_set_line_join: * @cr: a cairo context * @line_join: a line join style * * Sets the current line join style within the cairo context. See * #cairo_line_join_t for details about how the available line join * styles are drawn. * * As with the other stroke parameters, the current line join style is * examined by cairo_stroke(), cairo_stroke_extents(), and * cairo_stroke_to_path(), but does not have any effect during path * construction. * * The default line join style is %CAIRO_LINE_JOIN_MITER. **/ void cairo_set_line_join (cairo_t *cr, cairo_line_join_t line_join) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_line_join (cr->gstate, line_join); if (status) _cairo_set_error (cr, status); } /** * cairo_set_dash: * @cr: a cairo context * @dashes: an array specifying alternate lengths of on and off stroke portions * @num_dashes: the length of the dashes array * @offset: an offset into the dash pattern at which the stroke should start * * Sets the dash pattern to be used by cairo_stroke(). A dash pattern * is specified by @dashes, an array of positive values. Each value * provides the length of alternate "on" and "off" portions of the * stroke. The @offset specifies an offset into the pattern at which * the stroke begins. * * Each "on" segment will have caps applied as if the segment were a * separate sub-path. In particular, it is valid to use an "on" length * of 0.0 with %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE in order * to distributed dots or squares along a path. * * Note: The length values are in user-space units as evaluated at the * time of stroking. This is not necessarily the same as the user * space at the time of cairo_set_dash(). * * If @num_dashes is 0 dashing is disabled. * * If @num_dashes is 1 a symmetric pattern is assumed with alternating * on and off portions of the size specified by the single value in * @dashes. * * If any value in @dashes is negative, or if all values are 0, then * @cr will be put into an error state with a status of * #%CAIRO_STATUS_INVALID_DASH. **/ void cairo_set_dash (cairo_t *cr, const double *dashes, int num_dashes, double offset) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_dash (cr->gstate, dashes, num_dashes, offset); if (status) _cairo_set_error (cr, status); } /** * cairo_get_dash_count: * @cr: a #cairo_t * * This function returns the length of the dash array in @cr (0 if dashing * is not currently in effect). * * See also cairo_set_dash() and cairo_get_dash(). * * Return value: the length of the dash array, or 0 if no dash array set. * * Since: 1.4 */ int cairo_get_dash_count (cairo_t *cr) { int num_dashes; if (cr->status) return 0; _cairo_gstate_get_dash (cr->gstate, NULL, &num_dashes, NULL); return num_dashes; } /** * cairo_get_dash: * @cr: a #cairo_t * @dashes: return value for the dash array, or %NULL * @offset: return value for the current dash offset, or %NULL * * Gets the current dash array. If not %NULL, @dashes should be big * enough to hold at least the number of values returned by * cairo_get_dash_count(). * * Since: 1.4 **/ void cairo_get_dash (cairo_t *cr, double *dashes, double *offset) { if (cr->status) return; _cairo_gstate_get_dash (cr->gstate, dashes, NULL, offset); } /** * cairo_set_miter_limit: * @cr: a cairo context * @limit: miter limit to set * * Sets the current miter limit within the cairo context. * * If the current line join style is set to %CAIRO_LINE_JOIN_MITER * (see cairo_set_line_join()), the miter limit is used to determine * whether the lines should be joined with a bevel instead of a miter. * Cairo divides the length of the miter by the line width. * If the result is greater than the miter limit, the style is * converted to a bevel. * * As with the other stroke parameters, the current line miter limit is * examined by cairo_stroke(), cairo_stroke_extents(), and * cairo_stroke_to_path(), but does not have any effect during path * construction. * * The default miter limit value is 10.0, which will convert joins * with interior angles less than 11 degrees to bevels instead of * miters. For reference, a miter limit of 2.0 makes the miter cutoff * at 60 degrees, and a miter limit of 1.414 makes the cutoff at 90 * degrees. * * A miter limit for a desired angle can be computed as: miter limit = * 1/sin(angle/2) **/ void cairo_set_miter_limit (cairo_t *cr, double limit) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_miter_limit (cr->gstate, limit); if (status) _cairo_set_error (cr, status); } /** * cairo_translate: * @cr: a cairo context * @tx: amount to translate in the X direction * @ty: amount to translate in the Y direction * * Modifies the current transformation matrix (CTM) by translating the * user-space origin by (@tx, @ty). This offset is interpreted as a * user-space coordinate according to the CTM in place before the new * call to cairo_translate(). In other words, the translation of the * user-space origin takes place after any existing transformation. **/ void cairo_translate (cairo_t *cr, double tx, double ty) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_translate (cr->gstate, tx, ty); if (status) _cairo_set_error (cr, status); } /** * cairo_scale: * @cr: a cairo context * @sx: scale factor for the X dimension * @sy: scale factor for the Y dimension * * Modifies the current transformation matrix (CTM) by scaling the X * and Y user-space axes by @sx and @sy respectively. The scaling of * the axes takes place after any existing transformation of user * space. **/ void cairo_scale (cairo_t *cr, double sx, double sy) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_scale (cr->gstate, sx, sy); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_scale); /** * cairo_rotate: * @cr: a cairo context * @angle: angle (in radians) by which the user-space axes will be * rotated * * Modifies the current transformation matrix (CTM) by rotating the * user-space axes by @angle radians. The rotation of the axes takes * places after any existing transformation of user space. The * rotation direction for positive angles is from the positive X axis * toward the positive Y axis. **/ void cairo_rotate (cairo_t *cr, double angle) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_rotate (cr->gstate, angle); if (status) _cairo_set_error (cr, status); } /** * cairo_transform: * @cr: a cairo context * @matrix: a transformation to be applied to the user-space axes * * Modifies the current transformation matrix (CTM) by applying * @matrix as an additional transformation. The new transformation of * user space takes place after any existing transformation. **/ void cairo_transform (cairo_t *cr, const cairo_matrix_t *matrix) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_transform (cr->gstate, matrix); if (status) _cairo_set_error (cr, status); } /** * cairo_set_matrix: * @cr: a cairo context * @matrix: a transformation matrix from user space to device space * * Modifies the current transformation matrix (CTM) by setting it * equal to @matrix. **/ void cairo_set_matrix (cairo_t *cr, const cairo_matrix_t *matrix) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_matrix (cr->gstate, matrix); if (status) _cairo_set_error (cr, status); } /** * cairo_identity_matrix: * @cr: a cairo context * * Resets the current transformation matrix (CTM) by setting it equal * to the identity matrix. That is, the user-space and device-space * axes will be aligned and one user-space unit will transform to one * device-space unit. **/ void cairo_identity_matrix (cairo_t *cr) { if (cr->status) return; _cairo_gstate_identity_matrix (cr->gstate); } /** * cairo_user_to_device: * @cr: a cairo context * @x: X value of coordinate (in/out parameter) * @y: Y value of coordinate (in/out parameter) * * Transform a coordinate from user space to device space by * multiplying the given point by the current transformation matrix * (CTM). **/ void cairo_user_to_device (cairo_t *cr, double *x, double *y) { if (cr->status) return; _cairo_gstate_user_to_device (cr->gstate, x, y); } /** * cairo_user_to_device_distance: * @cr: a cairo context * @dx: X component of a distance vector (in/out parameter) * @dy: Y component of a distance vector (in/out parameter) * * Transform a distance vector from user space to device space. This * function is similar to cairo_user_to_device() except that the * translation components of the CTM will be ignored when transforming * (@dx,@dy). **/ void cairo_user_to_device_distance (cairo_t *cr, double *dx, double *dy) { if (cr->status) return; _cairo_gstate_user_to_device_distance (cr->gstate, dx, dy); } /** * cairo_device_to_user: * @cr: a cairo * @x: X value of coordinate (in/out parameter) * @y: Y value of coordinate (in/out parameter) * * Transform a coordinate from device space to user space by * multiplying the given point by the inverse of the current * transformation matrix (CTM). **/ void cairo_device_to_user (cairo_t *cr, double *x, double *y) { if (cr->status) return; _cairo_gstate_device_to_user (cr->gstate, x, y); } /** * cairo_device_to_user_distance: * @cr: a cairo context * @dx: X component of a distance vector (in/out parameter) * @dy: Y component of a distance vector (in/out parameter) * * Transform a distance vector from device space to user space. This * function is similar to cairo_device_to_user() except that the * translation components of the inverse CTM will be ignored when * transforming (@dx,@dy). **/ void cairo_device_to_user_distance (cairo_t *cr, double *dx, double *dy) { if (cr->status) return; _cairo_gstate_device_to_user_distance (cr->gstate, dx, dy); } /** * cairo_new_path: * @cr: a cairo context * * Clears the current path. After this call there will be no path and * no current point. **/ void cairo_new_path (cairo_t *cr) { if (cr->status) return; _cairo_path_fixed_fini (cr->path); } slim_hidden_def(cairo_new_path); /** * cairo_move_to: * @cr: a cairo context * @x: the X coordinate of the new position * @y: the Y coordinate of the new position * * Begin a new sub-path. After this call the current point will be (@x, * @y). **/ void cairo_move_to (cairo_t *cr, double x, double y) { cairo_status_t status; cairo_fixed_t x_fixed, y_fixed; if (cr->status) return; _cairo_gstate_user_to_backend (cr->gstate, &x, &y); x_fixed = _cairo_fixed_from_double (x); y_fixed = _cairo_fixed_from_double (y); status = _cairo_path_fixed_move_to (cr->path, x_fixed, y_fixed); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_move_to); /** * cairo_new_sub_path: * @cr: a cairo context * * Begin a new sub-path. Note that the existing path is not * affected. After this call there will be no current point. * * In many cases, this call is not needed since new sub-paths are * frequently started with cairo_move_to(). * * A call to cairo_new_sub_path() is particularly useful when * beginning a new sub-path with one of the cairo_arc() calls. This * makes things easier as it is no longer necessary to manually * compute the arc's initial coordinates for a call to * cairo_move_to(). * * Since: 1.2 **/ void cairo_new_sub_path (cairo_t *cr) { if (cr->status) return; _cairo_path_fixed_new_sub_path (cr->path); } /** * cairo_line_to: * @cr: a cairo context * @x: the X coordinate of the end of the new line * @y: the Y coordinate of the end of the new line * * Adds a line to the path from the current point to position (@x, @y) * in user-space coordinates. After this call the current point * will be (@x, @y). * * If there is no current point before the call to cairo_line_to() * this function will behave as cairo_move_to (@cr, @x, @y). **/ void cairo_line_to (cairo_t *cr, double x, double y) { cairo_status_t status; cairo_fixed_t x_fixed, y_fixed; if (cr->status) return; _cairo_gstate_user_to_backend (cr->gstate, &x, &y); x_fixed = _cairo_fixed_from_double (x); y_fixed = _cairo_fixed_from_double (y); status = _cairo_path_fixed_line_to (cr->path, x_fixed, y_fixed); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_line_to); /** * cairo_curve_to: * @cr: a cairo context * @x1: the X coordinate of the first control point * @y1: the Y coordinate of the first control point * @x2: the X coordinate of the second control point * @y2: the Y coordinate of the second control point * @x3: the X coordinate of the end of the curve * @y3: the Y coordinate of the end of the curve * * Adds a cubic Bézier spline to the path from the current point to * position (@x3, @y3) in user-space coordinates, using (@x1, @y1) and * (@x2, @y2) as the control points. After this call the current point * will be (@x3, @y3). * * If there is no current point before the call to cairo_curve_to() * this function will behave as if preceded by a call to * cairo_move_to (@cr, @x1, @y1). **/ void cairo_curve_to (cairo_t *cr, double x1, double y1, double x2, double y2, double x3, double y3) { cairo_status_t status; cairo_fixed_t x1_fixed, y1_fixed; cairo_fixed_t x2_fixed, y2_fixed; cairo_fixed_t x3_fixed, y3_fixed; if (cr->status) return; _cairo_gstate_user_to_backend (cr->gstate, &x1, &y1); _cairo_gstate_user_to_backend (cr->gstate, &x2, &y2); _cairo_gstate_user_to_backend (cr->gstate, &x3, &y3); x1_fixed = _cairo_fixed_from_double (x1); y1_fixed = _cairo_fixed_from_double (y1); x2_fixed = _cairo_fixed_from_double (x2); y2_fixed = _cairo_fixed_from_double (y2); x3_fixed = _cairo_fixed_from_double (x3); y3_fixed = _cairo_fixed_from_double (y3); status = _cairo_path_fixed_curve_to (cr->path, x1_fixed, y1_fixed, x2_fixed, y2_fixed, x3_fixed, y3_fixed); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_curve_to); /** * cairo_arc: * @cr: a cairo context * @xc: X position of the center of the arc * @yc: Y position of the center of the arc * @radius: the radius of the arc * @angle1: the start angle, in radians * @angle2: the end angle, in radians * * Adds a circular arc of the given @radius to the current path. The * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in * the direction of increasing angles to end at @angle2. If @angle2 is * less than @angle1 it will be progressively increased by 2*M_PI * until it is greater than @angle1. * * If there is a current point, an initial line segment will be added * to the path to connect the current point to the beginning of the * arc. If this initial line is undesired, it can be avoided by * calling cairo_new_sub_path() before calling cairo_arc(). * * Angles are measured in radians. An angle of 0.0 is in the direction * of the positive X axis (in user space). An angle of %M_PI/2.0 radians * (90 degrees) is in the direction of the positive Y axis (in * user space). Angles increase in the direction from the positive X * axis toward the positive Y axis. So with the default transformation * matrix, angles increase in a clockwise direction. * * (To convert from degrees to radians, use degrees * (M_PI / * 180.).) * * This function gives the arc in the direction of increasing angles; * see cairo_arc_negative() to get the arc in the direction of * decreasing angles. * * The arc is circular in user space. To achieve an elliptical arc, * you can scale the current transformation matrix by different * amounts in the X and Y directions. For example, to draw an ellipse * in the box given by @x, @y, @width, @height: * * * cairo_save (cr); * cairo_translate (cr, x + width / 2., y + height / 2.); * cairo_scale (cr, width / 2., height / 2.); * cairo_arc (cr, 0., 0., 1., 0., 2 * M_PI); * cairo_restore (cr); * **/ void cairo_arc (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) { if (cr->status) return; /* Do nothing, successfully, if radius is <= 0 */ if (radius <= 0.0) return; while (angle2 < angle1) angle2 += 2 * M_PI; cairo_line_to (cr, xc + radius * cos (angle1), yc + radius * sin (angle1)); _cairo_arc_path (cr, xc, yc, radius, angle1, angle2); } /** * cairo_arc_negative: * @cr: a cairo context * @xc: X position of the center of the arc * @yc: Y position of the center of the arc * @radius: the radius of the arc * @angle1: the start angle, in radians * @angle2: the end angle, in radians * * Adds a circular arc of the given @radius to the current path. The * arc is centered at (@xc, @yc), begins at @angle1 and proceeds in * the direction of decreasing angles to end at @angle2. If @angle2 is * greater than @angle1 it will be progressively decreased by 2*M_PI * until it is less than @angle1. * * See cairo_arc() for more details. This function differs only in the * direction of the arc between the two angles. **/ void cairo_arc_negative (cairo_t *cr, double xc, double yc, double radius, double angle1, double angle2) { if (cr->status) return; /* Do nothing, successfully, if radius is <= 0 */ if (radius <= 0.0) return; while (angle2 > angle1) angle2 -= 2 * M_PI; cairo_line_to (cr, xc + radius * cos (angle1), yc + radius * sin (angle1)); _cairo_arc_path_negative (cr, xc, yc, radius, angle1, angle2); } /* XXX: NYI void cairo_arc_to (cairo_t *cr, double x1, double y1, double x2, double y2, double radius) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_arc_to (cr->gstate, x1, y1, x2, y2, radius); if (status) _cairo_set_error (cr, status); } */ /** * cairo_rel_move_to: * @cr: a cairo context * @dx: the X offset * @dy: the Y offset * * Begin a new sub-path. After this call the current point will offset * by (@x, @y). * * Given a current point of (x, y), cairo_rel_move_to(@cr, @dx, @dy) * is logically equivalent to cairo_move_to (@cr, x + @dx, y + @dy). * * It is an error to call this function with no current point. Doing * so will cause @cr to shutdown with a status of * CAIRO_STATUS_NO_CURRENT_POINT. **/ void cairo_rel_move_to (cairo_t *cr, double dx, double dy) { cairo_fixed_t dx_fixed, dy_fixed; cairo_status_t status; if (cr->status) return; _cairo_gstate_user_to_device_distance (cr->gstate, &dx, &dy); dx_fixed = _cairo_fixed_from_double (dx); dy_fixed = _cairo_fixed_from_double (dy); status = _cairo_path_fixed_rel_move_to (cr->path, dx_fixed, dy_fixed); if (status) _cairo_set_error (cr, status); } /** * cairo_rel_line_to: * @cr: a cairo context * @dx: the X offset to the end of the new line * @dy: the Y offset to the end of the new line * * Relative-coordinate version of cairo_line_to(). Adds a line to the * path from the current point to a point that is offset from the * current point by (@dx, @dy) in user space. After this call the * current point will be offset by (@dx, @dy). * * Given a current point of (x, y), cairo_rel_line_to(@cr, @dx, @dy) * is logically equivalent to cairo_line_to (@cr, x + @dx, y + @dy). * * It is an error to call this function with no current point. Doing * so will cause @cr to shutdown with a status of * CAIRO_STATUS_NO_CURRENT_POINT. **/ void cairo_rel_line_to (cairo_t *cr, double dx, double dy) { cairo_fixed_t dx_fixed, dy_fixed; cairo_status_t status; if (cr->status) return; _cairo_gstate_user_to_device_distance (cr->gstate, &dx, &dy); dx_fixed = _cairo_fixed_from_double (dx); dy_fixed = _cairo_fixed_from_double (dy); status = _cairo_path_fixed_rel_line_to (cr->path, dx_fixed, dy_fixed); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_rel_line_to); /** * cairo_rel_curve_to: * @cr: a cairo context * @dx1: the X offset to the first control point * @dy1: the Y offset to the first control point * @dx2: the X offset to the second control point * @dy2: the Y offset to the second control point * @dx3: the X offset to the end of the curve * @dy3: the Y offset to the end of the curve * * Relative-coordinate version of cairo_curve_to(). All offsets are * relative to the current point. Adds a cubic Bézier spline to the * path from the current point to a point offset from the current * point by (@dx3, @dy3), using points offset by (@dx1, @dy1) and * (@dx2, @dy2) as the control points. After this call the current * point will be offset by (@dx3, @dy3). * * Given a current point of (x, y), cairo_rel_curve_to (@cr, @dx1, * @dy1, @dx2, @dy2, @dx3, @dy3) is logically equivalent to * cairo_curve_to (@cr, x + @dx1, y + @dy1, x + @dx2, y + @dy2, x + * @dx3, y + @dy3). * * It is an error to call this function with no current point. Doing * so will cause @cr to shutdown with a status of * CAIRO_STATUS_NO_CURRENT_POINT. **/ void cairo_rel_curve_to (cairo_t *cr, double dx1, double dy1, double dx2, double dy2, double dx3, double dy3) { cairo_fixed_t dx1_fixed, dy1_fixed; cairo_fixed_t dx2_fixed, dy2_fixed; cairo_fixed_t dx3_fixed, dy3_fixed; cairo_status_t status; if (cr->status) return; _cairo_gstate_user_to_device_distance (cr->gstate, &dx1, &dy1); _cairo_gstate_user_to_device_distance (cr->gstate, &dx2, &dy2); _cairo_gstate_user_to_device_distance (cr->gstate, &dx3, &dy3); dx1_fixed = _cairo_fixed_from_double (dx1); dy1_fixed = _cairo_fixed_from_double (dy1); dx2_fixed = _cairo_fixed_from_double (dx2); dy2_fixed = _cairo_fixed_from_double (dy2); dx3_fixed = _cairo_fixed_from_double (dx3); dy3_fixed = _cairo_fixed_from_double (dy3); status = _cairo_path_fixed_rel_curve_to (cr->path, dx1_fixed, dy1_fixed, dx2_fixed, dy2_fixed, dx3_fixed, dy3_fixed); if (status) _cairo_set_error (cr, status); } /** * cairo_rectangle: * @cr: a cairo context * @x: the X coordinate of the top left corner of the rectangle * @y: the Y coordinate to the top left corner of the rectangle * @width: the width of the rectangle * @height: the height of the rectangle * * Adds a closed sub-path rectangle of the given size to the current * path at position (@x, @y) in user-space coordinates. * * This function is logically equivalent to: * * cairo_move_to (cr, x, y); * cairo_rel_line_to (cr, width, 0); * cairo_rel_line_to (cr, 0, height); * cairo_rel_line_to (cr, -width, 0); * cairo_close_path (cr); * **/ void cairo_rectangle (cairo_t *cr, double x, double y, double width, double height) { if (cr->status) return; cairo_move_to (cr, x, y); cairo_rel_line_to (cr, width, 0); cairo_rel_line_to (cr, 0, height); cairo_rel_line_to (cr, -width, 0); cairo_close_path (cr); } /* XXX: NYI void cairo_stroke_to_path (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_stroke_path (cr->gstate); if (status) _cairo_set_error (cr, status); } */ /** * cairo_close_path: * @cr: a cairo context * * Adds a line segment to the path from the current point to the * beginning of the current sub-path, (the most recent point passed to * cairo_move_to()), and closes this sub-path. After this call the * current point will be at the joined endpoint of the sub-path. * * The behavior of cairo_close_path() is distinct from simply calling * cairo_line_to() with the equivalent coordinate in the case of * stroking. When a closed sub-path is stroked, there are no caps on * the ends of the sub-path. Instead, there is a line join connecting * the final and initial segments of the sub-path. * * If there is no current point before the call to cairo_close_path(), * this function will have no effect. * * Note: As of cairo version 1.2.4 any call to cairo_close_path() will * place an explicit MOVE_TO element into the path immediately after * the CLOSE_PATH element, (which can be seen in cairo_copy_path() for * example). This can simplify path processing in some cases as it may * not be necessary to save the "last move_to point" during processing * as the MOVE_TO immediately after the CLOSE_PATH will provide that * point. **/ void cairo_close_path (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_path_fixed_close_path (cr->path); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_close_path); /** * cairo_path_extents: * @cr: a cairo context * @x1: left of the resulting extents * @y1: top of the resulting extents * @x2: right of the resulting extents * @y2: bottom of the resulting extents * * Computes a bounding box in user-space coordinates covering the * points on the current path. If the current path is empty, returns * an empty rectangle ((0,0), (0,0)). Stroke parameters, fill rule, * surface dimensions and clipping are not taken into account. * * Contrast with cairo_fill_extents() and cairo_stroke_extents() which * return the extents of only the area that would be "inked" by * the corresponding drawing operations. * * The result of cairo_path_extents() is defined as equivalent to the * limit of cairo_stroke_extents() with %CAIRO_LINE_CAP_ROUND as the * line width approaches 0.0, (but never reaching the empty-rectangle * returned by cairo_stroke_extents() for a line width of 0.0). * * Specifically, this means that zero-area sub-paths such as * cairo_move_to();cairo_line_to() segments, (even degenerate cases * where the coordinates to both calls are identical), will be * considered as contributing to the extents. However, a lone * cairo_move_to() will not contribute to the results of * cairo_path_extents(). * * Since: 1.6 **/ void cairo_path_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; if (cr->status) { if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; return; } status = _cairo_gstate_path_extents (cr->gstate, cr->path, x1, y1, x2, y2); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_path_extents); /** * cairo_paint: * @cr: a cairo context * * A drawing operator that paints the current source everywhere within * the current clip region. **/ void cairo_paint (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_paint (cr->gstate); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_paint); /** * cairo_paint_with_alpha: * @cr: a cairo context * @alpha: alpha value, between 0 (transparent) and 1 (opaque) * * A drawing operator that paints the current source everywhere within * the current clip region using a mask of constant alpha value * @alpha. The effect is similar to cairo_paint(), but the drawing * is faded out using the alpha value. **/ void cairo_paint_with_alpha (cairo_t *cr, double alpha) { cairo_status_t status; cairo_color_t color; cairo_pattern_union_t pattern; if (cr->status) return; if (CAIRO_ALPHA_IS_OPAQUE (alpha)) { cairo_paint (cr); return; } if (CAIRO_ALPHA_IS_ZERO (alpha)) { return; } _cairo_color_init_rgba (&color, 1., 1., 1., alpha); _cairo_pattern_init_solid (&pattern.solid, &color, CAIRO_CONTENT_ALPHA); status = _cairo_gstate_mask (cr->gstate, &pattern.base); if (status) _cairo_set_error (cr, status); _cairo_pattern_fini (&pattern.base); } /** * cairo_mask: * @cr: a cairo context * @pattern: a #cairo_pattern_t * * A drawing operator that paints the current source * using the alpha channel of @pattern as a mask. (Opaque * areas of @pattern are painted with the source, transparent * areas are not painted.) */ void cairo_mask (cairo_t *cr, cairo_pattern_t *pattern) { cairo_status_t status; if (cr->status) return; if (pattern == NULL) { _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); return; } if (pattern->status) { _cairo_set_error (cr, pattern->status); return; } status = _cairo_gstate_mask (cr->gstate, pattern); if (status) _cairo_set_error (cr, status); } slim_hidden_def (cairo_mask); /** * cairo_mask_surface: * @cr: a cairo context * @surface: a #cairo_surface_t * @surface_x: X coordinate at which to place the origin of @surface * @surface_y: Y coordinate at which to place the origin of @surface * * A drawing operator that paints the current source * using the alpha channel of @surface as a mask. (Opaque * areas of @surface are painted with the source, transparent * areas are not painted.) */ void cairo_mask_surface (cairo_t *cr, cairo_surface_t *surface, double surface_x, double surface_y) { cairo_pattern_t *pattern; cairo_matrix_t matrix; if (cr->status) return; pattern = cairo_pattern_create_for_surface (surface); cairo_matrix_init_translate (&matrix, - surface_x, - surface_y); cairo_pattern_set_matrix (pattern, &matrix); cairo_mask (cr, pattern); cairo_pattern_destroy (pattern); } /** * cairo_stroke: * @cr: a cairo context * * A drawing operator that strokes the current path according to the * current line width, line join, line cap, and dash settings. After * cairo_stroke, the current path will be cleared from the cairo * context. See cairo_set_line_width(), cairo_set_line_join(), * cairo_set_line_cap(), cairo_set_dash(), and * cairo_stroke_preserve(). * * Note: Degenerate segments and sub-paths are treated specially and * provide a useful result. These can result in two different * situations: * * 1. Zero-length "on" segments set in cairo_set_dash(). If the cap * style is %CAIRO_LINE_CAP_ROUND or %CAIRO_LINE_CAP_SQUARE then these * segments will be drawn as circular dots or squares respectively. In * the case of %CAIRO_LINE_CAP_SQUARE, the orientation of the squares * is determined by the direction of the underlying path. * * 2. A sub-path created by cairo_move_to() followed by either a * cairo_close_path() or one or more calls to cairo_line_to() to the * same coordinate as the cairo_move_to(). If the cap style is * CAIRO_LINE_CAP_ROUND then these sub-paths will be drawn as circular * dots. Note that in the case of %CAIRO_LINE_CAP_SQUARE a degenerate * sub-path will not be drawn at all, (since the correct orientation * is indeterminate). * * In no case will a cap style of %CAIRO_LINE_CAP_BUTT cause anything * to be drawn in the case of either degenerate segments or sub-paths. **/ void cairo_stroke (cairo_t *cr) { cairo_stroke_preserve (cr); cairo_new_path (cr); } /** * cairo_stroke_preserve: * @cr: a cairo context * * A drawing operator that strokes the current path according to the * current line width, line join, line cap, and dash settings. Unlike * cairo_stroke(), cairo_stroke_preserve() preserves the path within the * cairo context. * * See cairo_set_line_width(), cairo_set_line_join(), * cairo_set_line_cap(), cairo_set_dash(), and * cairo_stroke_preserve(). **/ void cairo_stroke_preserve (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_stroke (cr->gstate, cr->path); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_stroke_preserve); /** * cairo_fill: * @cr: a cairo context * * A drawing operator that fills the current path according to the * current fill rule, (each sub-path is implicitly closed before being * filled). After cairo_fill(), the current path will be cleared from * the cairo context. See cairo_set_fill_rule() and * cairo_fill_preserve(). **/ void cairo_fill (cairo_t *cr) { cairo_fill_preserve (cr); cairo_new_path (cr); } /** * cairo_fill_preserve: * @cr: a cairo context * * A drawing operator that fills the current path according to the * current fill rule, (each sub-path is implicitly closed before being * filled). Unlike cairo_fill(), cairo_fill_preserve() preserves the * path within the cairo context. * * See cairo_set_fill_rule() and cairo_fill(). **/ void cairo_fill_preserve (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_fill (cr->gstate, cr->path); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_fill_preserve); /** * cairo_copy_page: * @cr: a cairo context * * Emits the current page for backends that support multiple pages, but * doesn't clear it, so, the contents of the current page will be retained * for the next page too. Use cairo_show_page() if you want to get an * empty page after the emission. * * This is a convenience function that simply calls * cairo_surface_copy_page() on @cr's target. **/ void cairo_copy_page (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_copy_page (cr->gstate); if (status) _cairo_set_error (cr, status); } /** * cairo_show_page: * @cr: a cairo context * * Emits and clears the current page for backends that support multiple * pages. Use cairo_copy_page() if you don't want to clear the page. * * This is a convenience function that simply calls * cairo_surface_show_page() on @cr's target. **/ void cairo_show_page (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_show_page (cr->gstate); if (status) _cairo_set_error (cr, status); } /** * cairo_in_stroke: * @cr: a cairo context * @x: X coordinate of the point to test * @y: Y coordinate of the point to test * * Tests whether the given point is inside the area that would be * affected by a cairo_stroke() operation given the current path and * stroking parameters. Surface dimensions and clipping are not taken * into account. * * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), * cairo_set_line_cap(), cairo_set_dash(), and * cairo_stroke_preserve(). * * Return value: A non-zero value if the point is inside, or zero if * outside. **/ cairo_bool_t cairo_in_stroke (cairo_t *cr, double x, double y) { cairo_status_t status; cairo_bool_t inside = FALSE; if (cr->status) return 0; status = _cairo_gstate_in_stroke (cr->gstate, cr->path, x, y, &inside); if (status) _cairo_set_error (cr, status); return inside; } /** * cairo_in_fill: * @cr: a cairo context * @x: X coordinate of the point to test * @y: Y coordinate of the point to test * * Tests whether the given point is inside the area that would be * affected by a cairo_fill() operation given the current path and * filling parameters. Surface dimensions and clipping are not taken * into account. * * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). * * Return value: A non-zero value if the point is inside, or zero if * outside. **/ cairo_bool_t cairo_in_fill (cairo_t *cr, double x, double y) { cairo_status_t status; cairo_bool_t inside = FALSE; if (cr->status) return 0; status = _cairo_gstate_in_fill (cr->gstate, cr->path, x, y, &inside); if (status) _cairo_set_error (cr, status); return inside; } /** * cairo_stroke_extents: * @cr: a cairo context * @x1: left of the resulting extents * @y1: top of the resulting extents * @x2: right of the resulting extents * @y2: bottom of the resulting extents * * Computes a bounding box in user coordinates covering the area that * would be affected, (the "inked" area), by a cairo_stroke() * operation operation given the current path and stroke * parameters. If the current path is empty, returns an empty * rectangle ((0,0), (0,0)). Surface dimensions and clipping are not * taken into account. * * Note that if the line width is set to exactly zero, then * cairo_stroke_extents() will return an empty rectangle. Contrast with * cairo_path_extents() which can be used to compute the non-empty * bounds as the line width approaches zero. * * Note that cairo_stroke_extents() must necessarily do more work to * compute the precise inked areas in light of the stroke parameters, * so cairo_path_extents() may be more desirable for sake of * performance if non-inked path extents are desired. * * See cairo_stroke(), cairo_set_line_width(), cairo_set_line_join(), * cairo_set_line_cap(), cairo_set_dash(), and * cairo_stroke_preserve(). **/ void cairo_stroke_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; if (cr->status) { if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; return; } status = _cairo_gstate_stroke_extents (cr->gstate, cr->path, x1, y1, x2, y2); if (status) _cairo_set_error (cr, status); } /** * cairo_fill_extents: * @cr: a cairo context * @x1: left of the resulting extents * @y1: top of the resulting extents * @x2: right of the resulting extents * @y2: bottom of the resulting extents * * Computes a bounding box in user coordinates covering the area that * would be affected, (the "inked" area), by a cairo_fill() operation * given the current path and fill parameters. If the current path is * empty, returns an empty rectangle ((0,0), (0,0)). Surface * dimensions and clipping are not taken into account. * * Contrast with cairo_path_extents(), which is similar, but returns * non-zero extents for some paths with no inked area, (such as a * simple line segment). * * Note that cairo_fill_extents() must necessarily do more work to * compute the precise inked areas in light of the fill rule, so * cairo_path_extents() may be more desirable for sake of performance * if the non-inked path extents are desired. * * See cairo_fill(), cairo_set_fill_rule() and cairo_fill_preserve(). **/ void cairo_fill_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; if (cr->status) { if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; return; } status = _cairo_gstate_fill_extents (cr->gstate, cr->path, x1, y1, x2, y2); if (status) _cairo_set_error (cr, status); } /** * cairo_clip: * @cr: a cairo context * * Establishes a new clip region by intersecting the current clip * region with the current path as it would be filled by cairo_fill() * and according to the current fill rule (see cairo_set_fill_rule()). * * After cairo_clip(), the current path will be cleared from the cairo * context. * * The current clip region affects all drawing operations by * effectively masking out any changes to the surface that are outside * the current clip region. * * Calling cairo_clip() can only make the clip region smaller, never * larger. But the current clip is part of the graphics state, so a * temporary restriction of the clip region can be achieved by * calling cairo_clip() within a cairo_save()/cairo_restore() * pair. The only other means of increasing the size of the clip * region is cairo_reset_clip(). **/ void cairo_clip (cairo_t *cr) { cairo_clip_preserve (cr); cairo_new_path (cr); } /** * cairo_clip_preserve: * @cr: a cairo context * * Establishes a new clip region by intersecting the current clip * region with the current path as it would be filled by cairo_fill() * and according to the current fill rule (see cairo_set_fill_rule()). * * Unlike cairo_clip(), cairo_clip_preserve() preserves the path within * the cairo context. * * The current clip region affects all drawing operations by * effectively masking out any changes to the surface that are outside * the current clip region. * * Calling cairo_clip() can only make the clip region smaller, never * larger. But the current clip is part of the graphics state, so a * temporary restriction of the clip region can be achieved by * calling cairo_clip() within a cairo_save()/cairo_restore() * pair. The only other means of increasing the size of the clip * region is cairo_reset_clip(). **/ void cairo_clip_preserve (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_clip (cr->gstate, cr->path); if (status) _cairo_set_error (cr, status); } slim_hidden_def(cairo_clip_preserve); /** * cairo_reset_clip: * @cr: a cairo context * * Reset the current clip region to its original, unrestricted * state. That is, set the clip region to an infinitely large shape * containing the target surface. Equivalently, if infinity is too * hard to grasp, one can imagine the clip region being reset to the * exact bounds of the target surface. * * Note that code meant to be reusable should not call * cairo_reset_clip() as it will cause results unexpected by * higher-level code which calls cairo_clip(). Consider using * cairo_save() and cairo_restore() around cairo_clip() as a more * robust means of temporarily restricting the clip region. **/ void cairo_reset_clip (cairo_t *cr) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_reset_clip (cr->gstate); if (status) _cairo_set_error (cr, status); } /** * cairo_clip_extents: * @cr: a cairo context * @x1: left of the resulting extents * @y1: top of the resulting extents * @x2: right of the resulting extents * @y2: bottom of the resulting extents * * Computes a bounding box in user coordinates covering the area inside the * current clip. * * Since: 1.4 **/ void cairo_clip_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2) { cairo_status_t status; if (cr->status) { if (x1) *x1 = 0.0; if (y1) *y1 = 0.0; if (x2) *x2 = 0.0; if (y2) *y2 = 0.0; return; } status = _cairo_gstate_clip_extents (cr->gstate, x1, y1, x2, y2); if (status) _cairo_set_error (cr, status); } static cairo_rectangle_list_t * _cairo_rectangle_list_create_in_error (cairo_status_t status) { cairo_rectangle_list_t *list; if (status == CAIRO_STATUS_NO_MEMORY) return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; list = malloc (sizeof (cairo_rectangle_list_t)); if (list == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); return (cairo_rectangle_list_t*) &_cairo_rectangles_nil; } list->status = status; list->rectangles = NULL; list->num_rectangles = 0; return list; } /** * cairo_copy_clip_rectangle_list: * @cr: a cairo context * * Gets the current clip region as a list of rectangles in user coordinates. * Never returns %NULL. * * The status in the list may be %CAIRO_STATUS_CLIP_NOT_REPRESENTABLE to * indicate that the clip region cannot be represented as a list of * user-space rectangles. The status may have other values to indicate * other errors. * * Returns: the current clip region as a list of rectangles in user coordinates, * which should be destroyed using cairo_rectangle_list_destroy(). * * Since: 1.4 **/ cairo_rectangle_list_t * cairo_copy_clip_rectangle_list (cairo_t *cr) { if (cr->status) return _cairo_rectangle_list_create_in_error (cr->status); return _cairo_gstate_copy_clip_rectangle_list (cr->gstate); } /** * cairo_select_font_face: * @cr: a #cairo_t * @family: a font family name, encoded in UTF-8 * @slant: the slant for the font * @weight: the weight for the font * * Note: The cairo_select_font_face() function call is part of what * the cairo designers call the "toy" text API. It is convenient for * short demos and simple programs, but it is not expected to be * adequate for serious text-using applications. * * Selects a family and style of font from a simplified description as * a family name, slant and weight. Cairo provides no operation to * list available family names on the system (this is a "toy", * remember"), but the standard CSS2 generic family names, ("serif", * "sans-serif", "cursive", "fantasy", "monospace"), are likely to * work as expected. * * For "real" font selection, see the font-backend-specific * font_face_create functions for the font backend you are using. (For * example, if you are using the freetype-based cairo-ft font backend, * see cairo_ft_font_face_create_for_ft_face() or * cairo_ft_font_face_create_for_pattern().) The resulting font face * could then be used with cairo_scaled_font_create() and * cairo_set_scaled_font(). * * Similarly, when using the "real" font support, you can call * directly into the underlying font system, (such as fontconfig or * freetype), for operations such as listing available fonts, etc. * * It is expected that most applications will need to use a more * comprehensive font handling and text layout library, (for example, * pango), in conjunction with cairo. * * If text is drawn without a call to cairo_select_font_face(), (nor * cairo_set_font_face() nor cairo_set_scaled_font()), the default * family is "sans", slant is %CAIRO_FONT_SLANT_NORMAL, and weight is * %CAIRO_FONT_WEIGHT_NORMAL. **/ void cairo_select_font_face (cairo_t *cr, const char *family, cairo_font_slant_t slant, cairo_font_weight_t weight) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_select_font_face (cr->gstate, family, slant, weight); if (status) _cairo_set_error (cr, status); } /** * cairo_font_extents: * @cr: a #cairo_t * @extents: a #cairo_font_extents_t object into which the results * will be stored. * * Gets the font extents for the currently selected font. **/ void cairo_font_extents (cairo_t *cr, cairo_font_extents_t *extents) { cairo_status_t status; extents->ascent = 0.0; extents->descent = 0.0; extents->height = 0.0; extents->max_x_advance = 0.0; extents->max_y_advance = 0.0; if (cr->status) return; status = _cairo_gstate_get_font_extents (cr->gstate, extents); if (status) _cairo_set_error (cr, status); } /** * cairo_set_font_face: * @cr: a #cairo_t * @font_face: a #cairo_font_face_t, or %NULL to restore to the default font * * Replaces the current #cairo_font_face_t object in the #cairo_t with * @font_face. The replaced font face in the #cairo_t will be * destroyed if there are no other references to it. **/ void cairo_set_font_face (cairo_t *cr, cairo_font_face_t *font_face) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_font_face (cr->gstate, font_face); if (status) _cairo_set_error (cr, status); } /** * cairo_get_font_face: * @cr: a #cairo_t * * Gets the current font face for a #cairo_t. * * Return value: the current font face. This object is owned by * cairo. To keep a reference to it, you must call * cairo_font_face_reference. * * This function never returns %NULL. If memory cannot be allocated, a * special "nil" #cairo_font_face_t object will be returned on which * cairo_font_face_status() returns %CAIRO_STATUS_NO_MEMORY. Using * this nil object will cause its error state to propagate to other * objects it is passed to, (for example, calling * cairo_set_font_face() with a nil font will trigger an error that * will shutdown the #cairo_t object). **/ cairo_font_face_t * cairo_get_font_face (cairo_t *cr) { cairo_status_t status; cairo_font_face_t *font_face; if (cr->status) return (cairo_font_face_t*) &_cairo_font_face_nil; status = _cairo_gstate_get_font_face (cr->gstate, &font_face); if (status) { _cairo_set_error (cr, status); return (cairo_font_face_t*) &_cairo_font_face_nil; } return font_face; } /** * cairo_set_font_size: * @cr: a #cairo_t * @size: the new font size, in user space units * * Sets the current font matrix to a scale by a factor of @size, replacing * any font matrix previously set with cairo_set_font_size() or * cairo_set_font_matrix(). This results in a font size of @size user space * units. (More precisely, this matrix will result in the font's * em-square being a @size by @size square in user space.) * * If text is drawn without a call to cairo_set_font_size(), (nor * cairo_set_font_matrix() nor cairo_set_scaled_font()), the default * font size is 10.0. **/ void cairo_set_font_size (cairo_t *cr, double size) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_font_size (cr->gstate, size); if (status) _cairo_set_error (cr, status); } /** * cairo_set_font_matrix * @cr: a #cairo_t * @matrix: a #cairo_matrix_t describing a transform to be applied to * the current font. * * Sets the current font matrix to @matrix. The font matrix gives a * transformation from the design space of the font (in this space, * the em-square is 1 unit by 1 unit) to user space. Normally, a * simple scale is used (see cairo_set_font_size()), but a more * complex font matrix can be used to shear the font * or stretch it unequally along the two axes **/ void cairo_set_font_matrix (cairo_t *cr, const cairo_matrix_t *matrix) { cairo_status_t status; if (cr->status) return; status = _cairo_gstate_set_font_matrix (cr->gstate, matrix); if (status) _cairo_set_error (cr, status); } /** * cairo_get_font_matrix * @cr: a #cairo_t * @matrix: return value for the matrix * * Stores the current font matrix into @matrix. See * cairo_set_font_matrix(). **/ void cairo_get_font_matrix (cairo_t *cr, cairo_matrix_t *matrix) { if (cr->status) { cairo_matrix_init_identity (matrix); return; } _cairo_gstate_get_font_matrix (cr->gstate, matrix); } /** * cairo_set_font_options: * @cr: a #cairo_t * @options: font options to use * * Sets a set of custom font rendering options for the #cairo_t. * Rendering options are derived by merging these options with the * options derived from underlying surface; if the value in @options * has a default value (like %CAIRO_ANTIALIAS_DEFAULT), then the value * from the surface is used. **/ void cairo_set_font_options (cairo_t *cr, const cairo_font_options_t *options) { cairo_status_t status; if (cr->status) return; status = cairo_font_options_status ((cairo_font_options_t *) options); if (status) { _cairo_set_error (cr, status); return; } _cairo_gstate_set_font_options (cr->gstate, options); } /** * cairo_get_font_options: * @cr: a #cairo_t * @options: a #cairo_font_options_t object into which to store * the retrieved options. All existing values are overwritten * * Retrieves font rendering options set via #cairo_set_font_options. * Note that the returned options do not include any options derived * from the underlying surface; they are literally the options * passed to cairo_set_font_options(). **/ void cairo_get_font_options (cairo_t *cr, cairo_font_options_t *options) { /* check that we aren't trying to overwrite the nil object */ if (cairo_font_options_status (options)) return; if (cr->status) { _cairo_font_options_init_default (options); return; } _cairo_gstate_get_font_options (cr->gstate, options); } /** * cairo_set_scaled_font: * @cr: a #cairo_t * @scaled_font: a #cairo_scaled_font_t * * Replaces the current font face, font matrix, and font options in * the #cairo_t with those of the #cairo_scaled_font_t. Except for * some translation, the current CTM of the #cairo_t should be the * same as that of the #cairo_scaled_font_t, which can be accessed * using cairo_scaled_font_get_ctm(). * * Since: 1.2 **/ void cairo_set_scaled_font (cairo_t *cr, const cairo_scaled_font_t *scaled_font) { cairo_status_t status; if (cr->status) return; status = scaled_font->status; if (status) goto BAIL; status = _cairo_gstate_set_font_face (cr->gstate, scaled_font->font_face); if (status) goto BAIL; status = _cairo_gstate_set_font_matrix (cr->gstate, &scaled_font->font_matrix); if (status) goto BAIL; _cairo_gstate_set_font_options (cr->gstate, &scaled_font->options); return; BAIL: _cairo_set_error (cr, status); } /** * cairo_get_scaled_font: * @cr: a #cairo_t * * Gets the current scaled font for a #cairo_t. * * Return value: the current scaled font. This object is owned by * cairo. To keep a reference to it, you must call * cairo_scaled_font_reference(). * * This function never returns %NULL. If memory cannot be allocated, a * special "nil" #cairo_scaled_font_t object will be returned on which * cairo_scaled_font_status() returns %CAIRO_STATUS_NO_MEMORY. Using * this nil object will cause its error state to propagate to other * objects it is passed to, (for example, calling * cairo_set_scaled_font() with a nil font will trigger an error that * will shutdown the #cairo_t object). * * Since: 1.4 **/ cairo_scaled_font_t * cairo_get_scaled_font (cairo_t *cr) { cairo_status_t status; cairo_scaled_font_t *scaled_font; if (cr->status) return _cairo_scaled_font_create_in_error (cr->status); status = _cairo_gstate_get_scaled_font (cr->gstate, &scaled_font); if (status) { _cairo_set_error (cr, status); return _cairo_scaled_font_create_in_error (status); } return scaled_font; } /** * cairo_text_extents: * @cr: a #cairo_t * @utf8: a string of text, encoded in UTF-8 * @extents: a #cairo_text_extents_t object into which the results * will be stored * * Gets the extents for a string of text. The extents describe a * user-space rectangle that encloses the "inked" portion of the text, * (as it would be drawn by cairo_show_text()). Additionally, the * x_advance and y_advance values indicate the amount by which the * current point would be advanced by cairo_show_text(). * * Note that whitespace characters do not directly contribute to the * size of the rectangle (extents.width and extents.height). They do * contribute indirectly by changing the position of non-whitespace * characters. In particular, trailing whitespace characters are * likely to not affect the size of the rectangle, though they will * affect the x_advance and y_advance values. **/ void cairo_text_extents (cairo_t *cr, const char *utf8, cairo_text_extents_t *extents) { cairo_status_t status; cairo_glyph_t *glyphs = NULL; int num_glyphs; double x, y; extents->x_bearing = 0.0; extents->y_bearing = 0.0; extents->width = 0.0; extents->height = 0.0; extents->x_advance = 0.0; extents->y_advance = 0.0; if (cr->status) return; if (utf8 == NULL) return; cairo_get_current_point (cr, &x, &y); status = _cairo_gstate_text_to_glyphs (cr->gstate, utf8, x, y, &glyphs, &num_glyphs); if (status == CAIRO_STATUS_SUCCESS) status = _cairo_gstate_glyph_extents (cr->gstate, glyphs, num_glyphs, extents); if (glyphs) free (glyphs); if (status) _cairo_set_error (cr, status); } /** * cairo_glyph_extents: * @cr: a #cairo_t * @glyphs: an array of #cairo_glyph_t objects * @num_glyphs: the number of elements in @glyphs * @extents: a #cairo_text_extents_t object into which the results * will be stored * * Gets the extents for an array of glyphs. The extents describe a * user-space rectangle that encloses the "inked" portion of the * glyphs, (as they would be drawn by cairo_show_glyphs()). * Additionally, the x_advance and y_advance values indicate the * amount by which the current point would be advanced by * cairo_show_glyphs. * * Note that whitespace glyphs do not contribute to the size of the * rectangle (extents.width and extents.height). **/ void cairo_glyph_extents (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs, cairo_text_extents_t *extents) { cairo_status_t status; extents->x_bearing = 0.0; extents->y_bearing = 0.0; extents->width = 0.0; extents->height = 0.0; extents->x_advance = 0.0; extents->y_advance = 0.0; if (cr->status) return; status = _cairo_gstate_glyph_extents (cr->gstate, glyphs, num_glyphs, extents); if (status) _cairo_set_error (cr, status); } /** * cairo_show_text: * @cr: a cairo context * @utf8: a string of text encoded in UTF-8 * * A drawing operator that generates the shape from a string of UTF-8 * characters, rendered according to the current font_face, font_size * (font_matrix), and font_options. * * This function first computes a set of glyphs for the string of * text. The first glyph is placed so that its origin is at the * current point. The origin of each subsequent glyph is offset from * that of the previous glyph by the advance values of the previous * glyph. * * After this call the current point is moved to the origin of where * the next glyph would be placed in this same progression. That is, * the current point will be at the origin of the final glyph offset * by its advance values. This allows for easy display of a single * logical string with multiple calls to cairo_show_text(). * * Note: The cairo_show_text() function call is part of what the cairo * designers call the "toy" text API. It is convenient for short demos * and simple programs, but it is not expected to be adequate for * serious text-using applications. See cairo_show_glyphs() for the * "real" text display API in cairo. **/ void cairo_show_text (cairo_t *cr, const char *utf8) { cairo_text_extents_t extents; cairo_status_t status; cairo_glyph_t *glyphs = NULL, *last_glyph; int num_glyphs; double x, y; if (cr->status) return; if (utf8 == NULL) return; cairo_get_current_point (cr, &x, &y); status = _cairo_gstate_text_to_glyphs (cr->gstate, utf8, x, y, &glyphs, &num_glyphs); if (status) goto BAIL; if (num_glyphs == 0) return; status = _cairo_gstate_show_glyphs (cr->gstate, glyphs, num_glyphs); if (status) goto BAIL; last_glyph = &glyphs[num_glyphs - 1]; status = _cairo_gstate_glyph_extents (cr->gstate, last_glyph, 1, &extents); if (status) goto BAIL; x = last_glyph->x + extents.x_advance; y = last_glyph->y + extents.y_advance; cairo_move_to (cr, x, y); BAIL: if (glyphs) free (glyphs); if (status) _cairo_set_error (cr, status); } /** * cairo_show_glyphs: * @cr: a cairo context * @glyphs: array of glyphs to show * @num_glyphs: number of glyphs to show * * A drawing operator that generates the shape from an array of glyphs, * rendered according to the current font_face, font_size * (font_matrix), and font_options. **/ void cairo_show_glyphs (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; if (cr->status) return; if (num_glyphs == 0) return; status = _cairo_gstate_show_glyphs (cr->gstate, glyphs, num_glyphs); if (status) _cairo_set_error (cr, status); } /** * cairo_text_path: * @cr: a cairo context * @utf8: a string of text encoded in UTF-8 * * Adds closed paths for text to the current path. The generated * path if filled, achieves an effect similar to that of * cairo_show_text(). * * Text conversion and positioning is done similar to cairo_show_text(). * * Like cairo_show_text(), After this call the current point is * moved to the origin of where the next glyph would be placed in * this same progression. That is, the current point will be at * the origin of the final glyph offset by its advance values. * This allows for chaining multiple calls to to cairo_text_path() * without having to set current point in between. * * Note: The cairo_text_path() function call is part of what the cairo * designers call the "toy" text API. It is convenient for short demos * and simple programs, but it is not expected to be adequate for * serious text-using applications. See cairo_glyph_path() for the * "real" text path API in cairo. **/ void cairo_text_path (cairo_t *cr, const char *utf8) { cairo_status_t status; cairo_text_extents_t extents; cairo_glyph_t *glyphs = NULL, *last_glyph; int num_glyphs; double x, y; if (cr->status) return; if (utf8 == NULL) return; cairo_get_current_point (cr, &x, &y); status = _cairo_gstate_text_to_glyphs (cr->gstate, utf8, x, y, &glyphs, &num_glyphs); if (status) goto BAIL; if (num_glyphs == 0) return; status = _cairo_gstate_glyph_path (cr->gstate, glyphs, num_glyphs, cr->path); if (status) goto BAIL; last_glyph = &glyphs[num_glyphs - 1]; status = _cairo_gstate_glyph_extents (cr->gstate, last_glyph, 1, &extents); if (status) goto BAIL; x = last_glyph->x + extents.x_advance; y = last_glyph->y + extents.y_advance; cairo_move_to (cr, x, y); BAIL: if (glyphs) free (glyphs); if (status) _cairo_set_error (cr, status); } /** * cairo_glyph_path: * @cr: a cairo context * @glyphs: array of glyphs to show * @num_glyphs: number of glyphs to show * * Adds closed paths for the glyphs to the current path. The generated * path if filled, achieves an effect similar to that of * cairo_show_glyphs(). **/ void cairo_glyph_path (cairo_t *cr, const cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; if (cr->status) return; if (num_glyphs == 0) return; status = _cairo_gstate_glyph_path (cr->gstate, glyphs, num_glyphs, cr->path); if (status) _cairo_set_error (cr, status); } /** * cairo_get_operator: * @cr: a cairo context * * Gets the current compositing operator for a cairo context. * * Return value: the current compositing operator. **/ cairo_operator_t cairo_get_operator (cairo_t *cr) { if (cr->status) return (cairo_operator_t) 0; return _cairo_gstate_get_operator (cr->gstate); } /** * cairo_get_tolerance: * @cr: a cairo context * * Gets the current tolerance value, as set by cairo_set_tolerance(). * * Return value: the current tolerance value. **/ double cairo_get_tolerance (cairo_t *cr) { if (cr->status) return 0.; return _cairo_gstate_get_tolerance (cr->gstate); } slim_hidden_def (cairo_get_tolerance); /** * cairo_get_antialias: * @cr: a cairo context * * Gets the current shape antialiasing mode, as set by cairo_set_shape_antialias(). * * Return value: the current shape antialiasing mode. **/ cairo_antialias_t cairo_get_antialias (cairo_t *cr) { if (cr->status) return (cairo_antialias_t) 0; return _cairo_gstate_get_antialias (cr->gstate); } /** * cairo_has_current_point: * @cr: a cairo context * * Returns whether a current point is defined on the current path. * See cairo_get_current_point() for details on the current point. * * Return value: whether a current point is defined. * * Since: 1.6 **/ cairo_bool_t cairo_has_current_point (cairo_t *cr) { if (cr->status) return FALSE; return cr->path->has_current_point; } /** * cairo_get_current_point: * @cr: a cairo context * @x: return value for X coordinate of the current point * @y: return value for Y coordinate of the current point * * Gets the current point of the current path, which is * conceptually the final point reached by the path so far. * * The current point is returned in the user-space coordinate * system. If there is no defined current point or if @cr is in an * error status, @x and @y will both be set to 0.0. It is possible to * check this in advance with cairo_has_current_point(). * * Most path construction functions alter the current point. See the * following for details on how they affect the current point: * cairo_new_path(), cairo_new_sub_path(), * cairo_append_path(), cairo_close_path(), * cairo_move_to(), cairo_line_to(), cairo_curve_to(), * cairo_rel_move_to(), cairo_rel_line_to(), cairo_rel_curve_to(), * cairo_arc(), cairo_arc_negative(), cairo_rectangle(), * cairo_text_path(), cairo_glyph_path(), cairo_stroke_to_path() * * Some functions use and alter the current point but do not otherwise * change current path: * cairo_show_text(), cairo_show_glyphs(). * * Some functions unset the current path and as a result, current point: * cairo_fill(), cairo_stroke(). **/ void cairo_get_current_point (cairo_t *cr, double *x_ret, double *y_ret) { cairo_fixed_t x_fixed, y_fixed; double x, y; if (cr->status == CAIRO_STATUS_SUCCESS && _cairo_path_fixed_get_current_point (cr->path, &x_fixed, &y_fixed)) { x = _cairo_fixed_to_double (x_fixed); y = _cairo_fixed_to_double (y_fixed); _cairo_gstate_backend_to_user (cr->gstate, &x, &y); } else { x = 0.0; y = 0.0; } if (x_ret) *x_ret = x; if (y_ret) *y_ret = y; } slim_hidden_def(cairo_get_current_point); /** * cairo_get_fill_rule: * @cr: a cairo context * * Gets the current fill rule, as set by cairo_set_fill_rule(). * * Return value: the current fill rule. **/ cairo_fill_rule_t cairo_get_fill_rule (cairo_t *cr) { if (cr->status) return (cairo_fill_rule_t) 0; return _cairo_gstate_get_fill_rule (cr->gstate); } /** * cairo_get_line_width: * @cr: a cairo context * * This function returns the current line width value exactly as set by * cairo_set_line_width(). Note that the value is unchanged even if * the CTM has changed between the calls to cairo_set_line_width() and * cairo_get_line_width(). * * Return value: the current line width. **/ double cairo_get_line_width (cairo_t *cr) { if (cr->status) return 0.; return _cairo_gstate_get_line_width (cr->gstate); } /** * cairo_get_line_cap: * @cr: a cairo context * * Gets the current line cap style, as set by cairo_set_line_cap(). * * Return value: the current line cap style. **/ cairo_line_cap_t cairo_get_line_cap (cairo_t *cr) { if (cr->status) return (cairo_line_cap_t) 0; return _cairo_gstate_get_line_cap (cr->gstate); } /** * cairo_get_line_join: * @cr: a cairo context * * Gets the current line join style, as set by cairo_set_line_join(). * * Return value: the current line join style. **/ cairo_line_join_t cairo_get_line_join (cairo_t *cr) { if (cr->status) return (cairo_line_join_t) 0; return _cairo_gstate_get_line_join (cr->gstate); } /** * cairo_get_miter_limit: * @cr: a cairo context * * Gets the current miter limit, as set by cairo_set_miter_limit(). * * Return value: the current miter limit. **/ double cairo_get_miter_limit (cairo_t *cr) { if (cr->status) return 0.; return _cairo_gstate_get_miter_limit (cr->gstate); } /** * cairo_get_matrix: * @cr: a cairo context * @matrix: return value for the matrix * * Stores the current transformation matrix (CTM) into @matrix. **/ void cairo_get_matrix (cairo_t *cr, cairo_matrix_t *matrix) { if (cr->status) { cairo_matrix_init_identity (matrix); return; } _cairo_gstate_get_matrix (cr->gstate, matrix); } slim_hidden_def (cairo_get_matrix); /** * cairo_get_target: * @cr: a cairo context * * Gets the target surface for the cairo context as passed to * cairo_create(). * * This function will always return a valid pointer, but the result * can be a "nil" surface if @cr is already in an error state, * (ie. cairo_status() != %CAIRO_STATUS_SUCCESS). * A nil surface is indicated by cairo_surface_status() * != %CAIRO_STATUS_SUCCESS. * * Return value: the target surface. This object is owned by cairo. To * keep a reference to it, you must call cairo_surface_reference(). **/ cairo_surface_t * cairo_get_target (cairo_t *cr) { if (cr->status) return _cairo_surface_create_in_error (cr->status); return _cairo_gstate_get_original_target (cr->gstate); } /** * cairo_get_group_target: * @cr: a cairo context * * Gets the current destination surface for the context. This is either * the original target surface as passed to cairo_create() or the target * surface for the current group as started by the most recent call to * cairo_push_group() or cairo_push_group_with_content(). * * This function will always return a valid pointer, but the result * can be a "nil" surface if @cr is already in an error state, * (ie. cairo_status() != %CAIRO_STATUS_SUCCESS). * A nil surface is indicated by cairo_surface_status() * != %CAIRO_STATUS_SUCCESS. * * Return value: the target surface. This object is owned by cairo. To * keep a reference to it, you must call cairo_surface_reference(). * * Since: 1.2 **/ cairo_surface_t * cairo_get_group_target (cairo_t *cr) { if (cr->status) return _cairo_surface_create_in_error (cr->status); return _cairo_gstate_get_target (cr->gstate); } /** * cairo_copy_path: * @cr: a cairo context * * Creates a copy of the current path and returns it to the user as a * #cairo_path_t. See #cairo_path_data_t for hints on how to iterate * over the returned data structure. * * This function will always return a valid pointer, but the result * will have no data (data==%NULL and * num_data==0), if either of the following * conditions hold: * * * If there is insufficient memory to copy the path. In this * case path->status will be set to * %CAIRO_STATUS_NO_MEMORY. * If @cr is already in an error state. In this case * path->status will contain the same status that * would be returned by cairo_status(). * * * In either case, path->status will be set to * %CAIRO_STATUS_NO_MEMORY (regardless of what the error status in * @cr might have been). * * Return value: the copy of the current path. The caller owns the * returned object and should call cairo_path_destroy() when finished * with it. **/ cairo_path_t * cairo_copy_path (cairo_t *cr) { if (cr->status) return _cairo_path_create_in_error (cr->status); return _cairo_path_create (cr->path, cr->gstate); } /** * cairo_copy_path_flat: * @cr: a cairo context * * Gets a flattened copy of the current path and returns it to the * user as a #cairo_path_t. See #cairo_path_data_t for hints on * how to iterate over the returned data structure. * * This function is like cairo_copy_path() except that any curves * in the path will be approximated with piecewise-linear * approximations, (accurate to within the current tolerance * value). That is, the result is guaranteed to not have any elements * of type %CAIRO_PATH_CURVE_TO which will instead be replaced by a * series of %CAIRO_PATH_LINE_TO elements. * * This function will always return a valid pointer, but the result * will have no data (data==%NULL and * num_data==0), if either of the following * conditions hold: * * * If there is insufficient memory to copy the path. In this * case path->status will be set to * %CAIRO_STATUS_NO_MEMORY. * If @cr is already in an error state. In this case * path->status will contain the same status that * would be returned by cairo_status(). * * * Return value: the copy of the current path. The caller owns the * returned object and should call cairo_path_destroy() when finished * with it. **/ cairo_path_t * cairo_copy_path_flat (cairo_t *cr) { if (cr->status) return _cairo_path_create_in_error (cr->status); return _cairo_path_create_flat (cr->path, cr->gstate); } /** * cairo_append_path: * @cr: a cairo context * @path: path to be appended * * Append the @path onto the current path. The @path may be either the * return value from one of cairo_copy_path() or * cairo_copy_path_flat() or it may be constructed manually. See * #cairo_path_t for details on how the path data structure should be * initialized, and note that path->status must be * initialized to %CAIRO_STATUS_SUCCESS. **/ void cairo_append_path (cairo_t *cr, const cairo_path_t *path) { cairo_status_t status; if (cr->status) return; if (path == NULL) { _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); return; } if (path->status) { if (path->status > CAIRO_STATUS_SUCCESS && path->status <= CAIRO_STATUS_LAST_STATUS) _cairo_set_error (cr, path->status); else _cairo_set_error (cr, CAIRO_STATUS_INVALID_STATUS); return; } if (path->num_data == 0) return; if (path->data == NULL) { _cairo_set_error (cr, CAIRO_STATUS_NULL_POINTER); return; } status = _cairo_path_append_to_context (path, cr); if (status) _cairo_set_error (cr, status); } /** * cairo_status: * @cr: a cairo context * * Checks whether an error has previously occurred for this context. * * Returns: the current status of this context, see #cairo_status_t **/ cairo_status_t cairo_status (cairo_t *cr) { return cr->status; } slim_hidden_def (cairo_status); libgdiplus-2.11/cairo/src/cairo-xlib-surface.c0000664000175000017500000031464012225470167016243 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth * Behdad Esfahbod */ #include "cairoint.h" #include "cairo-xlib-private.h" #include "cairo-xlib-surface-private.h" #include "cairo-clip-private.h" #include /* for XDestroyImage */ /* Xlib doesn't define a typedef, so define one ourselves */ typedef int (*cairo_xlib_error_func_t) (Display *display, XErrorEvent *event); static cairo_surface_t * _cairo_xlib_surface_create_internal (Display *dpy, Drawable drawable, Screen *screen, Visual *visual, XRenderPictFormat *xrender_format, int width, int height, int depth); static cairo_status_t _cairo_xlib_surface_ensure_gc (cairo_xlib_surface_t *surface); static void _cairo_xlib_surface_ensure_src_picture (cairo_xlib_surface_t *surface); static void _cairo_xlib_surface_ensure_dst_picture (cairo_xlib_surface_t *surface); static cairo_bool_t _cairo_surface_is_xlib (cairo_surface_t *surface); static cairo_bool_t _native_byte_order_lsb (void); static cairo_int_status_t _cairo_xlib_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font); /* * Instead of taking two round trips for each blending request, * assume that if a particular drawable fails GetImage that it will * fail for a "while"; use temporary pixmaps to avoid the errors */ #define CAIRO_ASSUME_PIXMAP 20 static const XTransform identity = { { { 1 << 16, 0x00000, 0x00000 }, { 0x00000, 1 << 16, 0x00000 }, { 0x00000, 0x00000, 1 << 16 }, } }; #define CAIRO_SURFACE_RENDER_AT_LEAST(surface, major, minor) \ (((surface)->render_major > major) || \ (((surface)->render_major == major) && ((surface)->render_minor >= minor))) #define CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_COMPOSITE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_COMPOSITE_TEXT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 0) #define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1) #define CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 1) #define CAIRO_SURFACE_RENDER_HAS_DISJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2) #define CAIRO_SURFACE_RENDER_HAS_CONJOINT(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 2) #define CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRIANGLES(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRISTRIP(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_TRIFAN(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 4) #define CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 6) #define CAIRO_SURFACE_RENDER_HAS_FILTERS(surface) CAIRO_SURFACE_RENDER_AT_LEAST((surface), 0, 6) static XRenderPictFormat * _CAIRO_FORMAT_TO_XRENDER_FORMAT(Display *dpy, cairo_format_t format) { int pict_format; switch (format) { case CAIRO_FORMAT_A1: pict_format = PictStandardA1; break; case CAIRO_FORMAT_A8: pict_format = PictStandardA8; break; case CAIRO_FORMAT_RGB24: pict_format = PictStandardRGB24; break; case CAIRO_FORMAT_ARGB32: default: pict_format = PictStandardARGB32; break; } return XRenderFindStandardFormat (dpy, pict_format); } static cairo_surface_t * _cairo_xlib_surface_create_similar_with_format (void *abstract_src, cairo_format_t format, int width, int height) { cairo_xlib_surface_t *src = abstract_src; Display *dpy = src->dpy; Pixmap pix; cairo_xlib_surface_t *surface; XRenderPictFormat *xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (dpy, format); /* As a good first approximation, if the display doesn't have even * the most elementary RENDER operation, then we're better off * using image surfaces for all temporary operations, so return NULL * and let the fallback code happen. */ if (xrender_format == NULL || ! CAIRO_SURFACE_RENDER_HAS_COMPOSITE (src)) return NULL; pix = XCreatePixmap (dpy, src->drawable, width <= 0 ? 1 : width, height <= 0 ? 1 : height, xrender_format->depth); surface = (cairo_xlib_surface_t *) _cairo_xlib_surface_create_internal (dpy, pix, src->screen, NULL, xrender_format, width, height, xrender_format->depth); if (surface->base.status) { XFreePixmap (dpy, pix); return &surface->base; } surface->owns_pixmap = TRUE; return &surface->base; } static cairo_content_t _xrender_format_to_content (XRenderPictFormat *xrender_format) { cairo_bool_t xrender_format_has_alpha; cairo_bool_t xrender_format_has_color; /* This only happens when using a non-Render server. Let's punt * and say there's no alpha here. */ if (xrender_format == NULL) return CAIRO_CONTENT_COLOR; xrender_format_has_alpha = (xrender_format->direct.alphaMask != 0); xrender_format_has_color = (xrender_format->direct.redMask != 0 || xrender_format->direct.greenMask != 0 || xrender_format->direct.blueMask != 0); if (xrender_format_has_alpha) if (xrender_format_has_color) return CAIRO_CONTENT_COLOR_ALPHA; else return CAIRO_CONTENT_ALPHA; else return CAIRO_CONTENT_COLOR; } static cairo_surface_t * _cairo_xlib_surface_create_similar (void *abstract_src, cairo_content_t content, int width, int height) { cairo_xlib_surface_t *src = abstract_src; XRenderPictFormat *xrender_format = src->xrender_format; cairo_xlib_surface_t *surface; Pixmap pix; _cairo_xlib_display_notify (src->screen_info->display); /* Start by examining the surface's XRenderFormat, or if it * doesn't have one, then look one up through its visual (in the * case of a bitmap, it won't even have that). */ if (xrender_format == NULL && src->visual != NULL) xrender_format = XRenderFindVisualFormat (src->dpy, src->visual); /* If we never found an XRenderFormat or if it isn't compatible * with the content being requested, then we fallback to just * constructing a cairo_format_t instead, (which will fairly * arbitrarily pick a visual/depth for the similar surface. */ if (xrender_format == NULL || _xrender_format_to_content (xrender_format) != content) { return _cairo_xlib_surface_create_similar_with_format (abstract_src, _cairo_format_from_content (content), width, height); } /* We've got a compatible XRenderFormat now, which means the * similar surface will match the existing surface as closely in * visual/depth etc. as possible. */ pix = XCreatePixmap (src->dpy, src->drawable, width <= 0 ? 1 : width, height <= 0 ? 1 : height, xrender_format->depth); surface = (cairo_xlib_surface_t *) _cairo_xlib_surface_create_internal (src->dpy, pix, src->screen, src->visual, xrender_format, width, height, xrender_format->depth); if (surface->base.status != CAIRO_STATUS_SUCCESS) { XFreePixmap (src->dpy, pix); return &surface->base; } surface->owns_pixmap = TRUE; return &surface->base; } static cairo_status_t _cairo_xlib_surface_finish (void *abstract_surface) { cairo_xlib_surface_t *surface = abstract_surface; cairo_xlib_display_t *display = surface->screen_info ? surface->screen_info->display : NULL; cairo_status_t status = CAIRO_STATUS_SUCCESS; if (surface->owns_pixmap) { cairo_status_t status2; if (surface->dst_picture != None) { status2 = _cairo_xlib_display_queue_resource (display, XRenderFreePicture, surface->dst_picture); if (status2 == CAIRO_STATUS_SUCCESS) surface->dst_picture = None; else if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (surface->src_picture != None) { status2 = _cairo_xlib_display_queue_resource (display, XRenderFreePicture, surface->src_picture); if (status2 == CAIRO_STATUS_SUCCESS) surface->src_picture = None; else if (status == CAIRO_STATUS_SUCCESS) status = status2; } status2 = _cairo_xlib_display_queue_resource (display, (cairo_xlib_notify_resource_func) XFreePixmap, surface->drawable); if (status2 == CAIRO_STATUS_SUCCESS) { surface->owns_pixmap = FALSE; surface->drawable = None; } else if (status == CAIRO_STATUS_SUCCESS) status = status2; } else { if (surface->dst_picture != None) XRenderFreePicture (surface->dpy, surface->dst_picture); if (surface->src_picture != None) XRenderFreePicture (surface->dpy, surface->src_picture); } if (surface->gc != NULL) { cairo_status_t status2; status2 = _cairo_xlib_screen_put_gc (surface->screen_info, surface->depth, surface->gc, surface->have_clip_rects); surface->gc = NULL; if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (surface->clip_rects != surface->embedded_clip_rects) free (surface->clip_rects); if (surface->screen_info != NULL) _cairo_xlib_screen_info_destroy (surface->screen_info); if (surface->dpy != NULL) { _cairo_xlib_remove_close_display_hooks (surface->dpy, surface); surface->dpy = NULL; } return status; } static int _noop_error_handler (Display *display, XErrorEvent *event) { return False; /* return value is ignored */ } static void _swap_ximage_2bytes (XImage *ximage) { int i, j; char *line = ximage->data; for (j = ximage->height; j; j--) { uint16_t *p = (uint16_t *)line; for (i = ximage->width; i; i--) { *p = (((*p & 0x00ff) << 8) | ((*p) >> 8)); p++; } line += ximage->bytes_per_line; } } static void _swap_ximage_4bytes (XImage *ximage) { int i, j; char *line = ximage->data; for (j = ximage->height; j; j--) { uint32_t *p = (uint32_t *)line; for (i = ximage->width; i; i--) { *p = (((*p & 0x000000ff) << 24) | ((*p & 0x0000ff00) << 8) | ((*p & 0x00ff0000) >> 8) | ((*p) >> 24)); p++; } line += ximage->bytes_per_line; } } static void _swap_ximage_bits (XImage *ximage) { int i, j; char *line = ximage->data; int unit = ximage->bitmap_unit; int line_bytes = ((ximage->width + unit - 1) & ~(unit - 1)) / 8; for (j = ximage->height; j; j--) { char *p = line; for (i = line_bytes; i; i--) { char b = *p; b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); *p = b; p++; } line += ximage->bytes_per_line; } } static void _swap_ximage_to_native (XImage *ximage) { int unit_bytes = 0; int native_byte_order = _native_byte_order_lsb () ? LSBFirst : MSBFirst; if (ximage->bits_per_pixel == 1 && ximage->bitmap_bit_order != native_byte_order) { _swap_ximage_bits (ximage); if (ximage->bitmap_bit_order == ximage->byte_order) return; } if (ximage->byte_order == native_byte_order) return; switch (ximage->bits_per_pixel) { case 1: unit_bytes = ximage->bitmap_unit / 8; break; case 8: case 16: case 32: unit_bytes = ximage->bits_per_pixel / 8; break; default: /* This could be hit on some uncommon but possible cases, * such as bpp=4. These are cases that libpixman can't deal * with in any case. */ ASSERT_NOT_REACHED; } switch (unit_bytes) { case 1: return; case 2: _swap_ximage_2bytes (ximage); break; case 4: _swap_ximage_4bytes (ximage); break; default: ASSERT_NOT_REACHED; } } /* Given a mask, (with a single sequence of contiguous 1 bits), return * the number of 1 bits in 'width' and the number of 0 bits to its * right in 'shift'. */ static inline void _characterize_field (uint32_t mask, int *width, int *shift) { *width = _cairo_popcount (mask); /* The final '& 31' is to force a 0 mask to result in 0 shift. */ *shift = _cairo_popcount ((mask - 1) & ~mask) & 31; } /* Convert a field of 'width' bits to 'new_width' bits with correct * rounding. */ static inline uint32_t _resize_field (uint32_t field, int width, int new_width) { if (width == 0) return 0; if (width >= new_width) { return field >> (width - new_width); } else { uint32_t result = field << (new_width - width); while (width < new_width) { result |= result >> width; width <<= 1; } return result; } } /* Given a shifted field value, (described by 'width' and 'shift), * resize it 8-bits and return that value. * * Note that the original field value must not have any non-field bits * set. */ static inline uint32_t _field_to_8 (uint32_t field, int width, int shift) { return _resize_field (field >> shift, width, 8); } /* Given an 8-bit value, convert it to a field of 'width', shift it up * to 'shift, and return it. */ static inline uint32_t _field_from_8 (uint32_t field, int width, int shift) { return _resize_field (field, 8, width) << shift; } static cairo_status_t _get_image_surface (cairo_xlib_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect) { cairo_int_status_t status; cairo_image_surface_t *image; XImage *ximage; unsigned short x1, y1, x2, y2; pixman_format_code_t pixman_format; cairo_format_masks_t xlib_masks; x1 = 0; y1 = 0; x2 = surface->width; y2 = surface->height; if (interest_rect) { cairo_rectangle_int_t rect; rect.x = interest_rect->x; rect.y = interest_rect->y; rect.width = interest_rect->width; rect.height = interest_rect->height; if (rect.x > x1) x1 = rect.x; if (rect.y > y1) y1 = rect.y; if (rect.x + rect.width < x2) x2 = rect.x + rect.width; if (rect.y + rect.height < y2) y2 = rect.y + rect.height; if (x1 >= x2 || y1 >= y2) { *image_out = NULL; return CAIRO_STATUS_SUCCESS; } } if (image_rect) { image_rect->x = x1; image_rect->y = y1; image_rect->width = x2 - x1; image_rect->height = y2 - y1; } /* XXX: This should try to use the XShm extension if available */ if (surface->use_pixmap == 0) { cairo_xlib_error_func_t old_handler; old_handler = XSetErrorHandler (_noop_error_handler); ximage = XGetImage (surface->dpy, surface->drawable, x1, y1, x2 - x1, y2 - y1, AllPlanes, ZPixmap); XSetErrorHandler (old_handler); /* If we get an error, the surface must have been a window, * so retry with the safe code path. */ if (!ximage) surface->use_pixmap = CAIRO_ASSUME_PIXMAP; } else { surface->use_pixmap--; ximage = NULL; } if (!ximage) { /* XGetImage from a window is dangerous because it can * produce errors if the window is unmapped or partially * outside the screen. We could check for errors and * retry, but to keep things simple, we just create a * temporary pixmap */ Pixmap pixmap; cairo_status_t status = _cairo_xlib_surface_ensure_gc (surface); if (status) return status; pixmap = XCreatePixmap (surface->dpy, surface->drawable, x2 - x1, y2 - y1, surface->depth); if (pixmap) { XCopyArea (surface->dpy, surface->drawable, pixmap, surface->gc, x1, y1, x2 - x1, y2 - y1, 0, 0); ximage = XGetImage (surface->dpy, pixmap, 0, 0, x2 - x1, y2 - y1, AllPlanes, ZPixmap); XFreePixmap (surface->dpy, pixmap); } } if (!ximage) return _cairo_error (CAIRO_STATUS_NO_MEMORY); _swap_ximage_to_native (ximage); xlib_masks.bpp = ximage->bits_per_pixel; xlib_masks.alpha_mask = surface->a_mask; xlib_masks.red_mask = surface->r_mask; xlib_masks.green_mask = surface->g_mask; xlib_masks.blue_mask = surface->b_mask; status = _pixman_format_from_masks (&xlib_masks, &pixman_format); if (status == CAIRO_STATUS_SUCCESS) { image = (cairo_image_surface_t*) _cairo_image_surface_create_with_pixman_format ((unsigned char *) ximage->data, pixman_format, ximage->width, ximage->height, ximage->bytes_per_line); status = image->base.status; if (status) { XDestroyImage (ximage); return status; } /* Let the surface take ownership of the data */ _cairo_image_surface_assume_ownership_of_data (image); ximage->data = NULL; } else { cairo_format_t format; unsigned char *data; uint32_t *row; uint32_t in_pixel, out_pixel; unsigned int rowstride; uint32_t a_mask=0, r_mask=0, g_mask=0, b_mask=0; int a_width=0, r_width=0, g_width=0, b_width=0; int a_shift=0, r_shift=0, g_shift=0, b_shift=0; int x, y; XColor *colors = NULL; /* The visual we are dealing with is not supported by the * standard pixman formats. So we must first convert the data * to a supported format. */ if (surface->visual->class == TrueColor) { cairo_bool_t has_color; cairo_bool_t has_alpha; has_color = (surface->r_mask || surface->g_mask || surface->b_mask); has_alpha = surface->a_mask; if (has_color) { if (has_alpha) { format = CAIRO_FORMAT_ARGB32; } else { format = CAIRO_FORMAT_RGB24; } } else { /* XXX: Using CAIRO_FORMAT_A8 here would be more * efficient, but would require slightly different code in * the image conversion to put the alpha channel values * into the right place. */ format = CAIRO_FORMAT_ARGB32; } a_mask = surface->a_mask; r_mask = surface->r_mask; g_mask = surface->g_mask; b_mask = surface->b_mask; _characterize_field (a_mask, &a_width, &a_shift); _characterize_field (r_mask, &r_width, &r_shift); _characterize_field (g_mask, &g_width, &g_shift); _characterize_field (b_mask, &b_width, &b_shift); } else { cairo_xlib_visual_info_t *visual_info; format = CAIRO_FORMAT_RGB24; status = _cairo_xlib_screen_get_visual_info (surface->screen_info, surface->visual, &visual_info); if (status) { XDestroyImage (ximage); return status; } colors = visual_info->colors; } image = (cairo_image_surface_t *) cairo_image_surface_create (format, ximage->width, ximage->height); status = image->base.status; if (status) { XDestroyImage (ximage); return status; } data = cairo_image_surface_get_data (&image->base); rowstride = cairo_image_surface_get_stride (&image->base) >> 2; row = (uint32_t *) data; for (y = 0; y < ximage->height; y++) { for (x = 0; x < ximage->width; x++) { in_pixel = XGetPixel (ximage, x, y); if (surface->visual->class == TrueColor) { out_pixel = ( _field_to_8 (in_pixel & a_mask, a_width, a_shift) << 24 | _field_to_8 (in_pixel & r_mask, r_width, r_shift) << 16 | _field_to_8 (in_pixel & g_mask, g_width, g_shift) << 8 | _field_to_8 (in_pixel & b_mask, b_width, b_shift)); } else { XColor *color; color = &colors[in_pixel & 0xff]; out_pixel = ( _field_to_8 (color->red, 16, 0) << 16 | _field_to_8 (color->green, 16, 0) << 8 | _field_to_8 (color->blue, 16, 0)); } row[x] = out_pixel; } row += rowstride; } } XDestroyImage (ximage); *image_out = image; return CAIRO_STATUS_SUCCESS; } static void _cairo_xlib_surface_ensure_src_picture (cairo_xlib_surface_t *surface) { if (!surface->src_picture) { XRenderPictureAttributes pa; int mask = 0; pa.subwindow_mode = IncludeInferiors; mask |= CPSubwindowMode; surface->src_picture = XRenderCreatePicture (surface->dpy, surface->drawable, surface->xrender_format, mask, &pa); } } static void _cairo_xlib_surface_set_picture_clip_rects (cairo_xlib_surface_t *surface) { if (surface->have_clip_rects) { XRenderSetPictureClipRectangles (surface->dpy, surface->dst_picture, 0, 0, surface->clip_rects, surface->num_clip_rects); } else { XRenderPictureAttributes pa; pa.clip_mask = None; XRenderChangePicture (surface->dpy, surface->dst_picture, CPClipMask, &pa); } surface->clip_dirty &= ~CAIRO_XLIB_SURFACE_CLIP_DIRTY_PICTURE; } static void _cairo_xlib_surface_set_gc_clip_rects (cairo_xlib_surface_t *surface) { if (surface->have_clip_rects) { XSetClipRectangles(surface->dpy, surface->gc, 0, 0, surface->clip_rects, surface->num_clip_rects, YXSorted); } else XSetClipMask (surface->dpy, surface->gc, None); surface->clip_dirty &= ~CAIRO_XLIB_SURFACE_CLIP_DIRTY_GC; } static void _cairo_xlib_surface_ensure_dst_picture (cairo_xlib_surface_t *surface) { if (!surface->dst_picture) { surface->dst_picture = XRenderCreatePicture (surface->dpy, surface->drawable, surface->xrender_format, 0, NULL); _cairo_xlib_surface_set_picture_clip_rects (surface); } else if (surface->clip_dirty & CAIRO_XLIB_SURFACE_CLIP_DIRTY_PICTURE) _cairo_xlib_surface_set_picture_clip_rects (surface); } static cairo_status_t _cairo_xlib_surface_ensure_gc (cairo_xlib_surface_t *surface) { XGCValues gcv; if (surface->gc == NULL) { surface->gc = _cairo_xlib_screen_get_gc (surface->screen_info, surface->depth); if (surface->gc == NULL) { gcv.graphics_exposures = False; surface->gc = XCreateGC (surface->dpy, surface->drawable, GCGraphicsExposures, &gcv); if (!surface->gc) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } _cairo_xlib_surface_set_gc_clip_rects (surface); } else if (surface->clip_dirty & CAIRO_XLIB_SURFACE_CLIP_DIRTY_GC) _cairo_xlib_surface_set_gc_clip_rects (surface); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _draw_image_surface (cairo_xlib_surface_t *surface, cairo_image_surface_t *image, int src_x, int src_y, int width, int height, int dst_x, int dst_y) { XImage ximage; cairo_format_masks_t image_masks; int native_byte_order = _native_byte_order_lsb () ? LSBFirst : MSBFirst; cairo_status_t status; cairo_bool_t own_data; unsigned long *rgb333_to_pseudocolor = NULL; _pixman_format_to_masks (image->pixman_format, &image_masks); ximage.width = image->width; ximage.height = image->height; ximage.format = ZPixmap; ximage.byte_order = native_byte_order; ximage.bitmap_unit = 32; /* always for libpixman */ ximage.bitmap_bit_order = native_byte_order; ximage.bitmap_pad = 32; /* always for libpixman */ ximage.depth = surface->depth; ximage.red_mask = surface->r_mask; ximage.green_mask = surface->g_mask; ximage.blue_mask = surface->b_mask; ximage.xoffset = 0; if (image_masks.red_mask == surface->r_mask && image_masks.green_mask == surface->g_mask && image_masks.blue_mask == surface->b_mask) { ximage.bits_per_pixel = image_masks.bpp; ximage.bytes_per_line = image->stride; ximage.data = (char *)image->data; own_data = FALSE; XInitImage (&ximage); } else { unsigned int stride, rowstride; int x, y; uint32_t in_pixel, out_pixel, *row; int a_width=0, r_width=0, g_width=0, b_width=0; int a_shift=0, r_shift=0, g_shift=0, b_shift=0; if (surface->depth > 16) { ximage.bits_per_pixel = 32; } else if (surface->depth > 8) { ximage.bits_per_pixel = 16; } else if (surface->depth > 1) { ximage.bits_per_pixel = 8; } else { ximage.bits_per_pixel = 1; } stride = CAIRO_STRIDE_FOR_WIDTH_BPP (ximage.width, ximage.bits_per_pixel); ximage.bytes_per_line = stride; ximage.data = _cairo_malloc_ab (stride, ximage.height); if (ximage.data == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); own_data = TRUE; XInitImage (&ximage); if (surface->visual->class == TrueColor) { _characterize_field (surface->a_mask, &a_width, &a_shift); _characterize_field (surface->r_mask, &r_width, &r_shift); _characterize_field (surface->g_mask, &g_width, &g_shift); _characterize_field (surface->b_mask, &b_width, &b_shift); } else { cairo_xlib_visual_info_t *visual_info; status = _cairo_xlib_screen_get_visual_info (surface->screen_info, surface->visual, &visual_info); if (status) goto BAIL; rgb333_to_pseudocolor = visual_info->rgb333_to_pseudocolor; } rowstride = cairo_image_surface_get_stride (&image->base) >> 2; row = (uint32_t *) cairo_image_surface_get_data (&image->base); for (y = 0; y < ximage.height; y++) { for (x = 0; x < ximage.width; x++) { int a, r, g, b; in_pixel = row[x]; a = (in_pixel >> 24) & 0xff; r = (in_pixel >> 16) & 0xff; g = (in_pixel >> 8) & 0xff; b = (in_pixel ) & 0xff; if (surface->visual->class == TrueColor) out_pixel = (_field_from_8 (a, a_width, a_shift) | _field_from_8 (r, r_width, r_shift) | _field_from_8 (g, g_width, g_shift) | _field_from_8 (b, b_width, b_shift)); else out_pixel = rgb333_to_pseudocolor[_field_from_8 (r, 3, 6) | _field_from_8 (g, 3, 3) | _field_from_8 (b, 3, 0)]; XPutPixel (&ximage, x, y, out_pixel); } row += rowstride; } } status = _cairo_xlib_surface_ensure_gc (surface); if (status) goto BAIL; XPutImage(surface->dpy, surface->drawable, surface->gc, &ximage, src_x, src_y, dst_x, dst_y, width, height); BAIL: if (own_data) free (ximage.data); return status; } static cairo_status_t _cairo_xlib_surface_acquire_source_image (void *abstract_surface, cairo_image_surface_t **image_out, void **image_extra) { cairo_xlib_surface_t *surface = abstract_surface; cairo_image_surface_t *image; cairo_status_t status; _cairo_xlib_display_notify (surface->screen_info->display); status = _get_image_surface (surface, NULL, &image, NULL); if (status) return status; *image_out = image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_xlib_surface_release_source_image (void *abstract_surface, cairo_image_surface_t *image, void *image_extra) { cairo_surface_destroy (&image->base); } static cairo_status_t _cairo_xlib_surface_acquire_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect_out, void **image_extra) { cairo_xlib_surface_t *surface = abstract_surface; cairo_image_surface_t *image; cairo_status_t status; _cairo_xlib_display_notify (surface->screen_info->display); status = _get_image_surface (surface, interest_rect, &image, image_rect_out); if (status) return status; *image_out = image; *image_extra = NULL; return CAIRO_STATUS_SUCCESS; } static void _cairo_xlib_surface_release_dest_image (void *abstract_surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { cairo_xlib_surface_t *surface = abstract_surface; cairo_status_t status; status = _draw_image_surface (surface, image, 0, 0, image->width, image->height, image_rect->x, image_rect->y); status = _cairo_surface_set_error (&surface->base, status); cairo_surface_destroy (&image->base); } /* * Return whether two xlib surfaces share the same * screen. Both core and Render drawing require this * when using multiple drawables in an operation. */ static cairo_bool_t _cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst, cairo_xlib_surface_t *src) { return dst->dpy == src->dpy && dst->screen == src->screen; } static cairo_status_t _cairo_xlib_surface_clone_similar (void *abstract_surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_xlib_surface_t *surface = abstract_surface; cairo_xlib_surface_t *clone; cairo_status_t status; _cairo_xlib_display_notify (surface->screen_info->display); if (src->backend == surface->base.backend ) { cairo_xlib_surface_t *xlib_src = (cairo_xlib_surface_t *)src; if (_cairo_xlib_surface_same_screen (surface, xlib_src)) { *clone_out = cairo_surface_reference (src); return CAIRO_STATUS_SUCCESS; } } else if (_cairo_surface_is_image (src)) { cairo_image_surface_t *image_src = (cairo_image_surface_t *)src; if (! CAIRO_FORMAT_VALID (image_src->format)) return CAIRO_INT_STATUS_UNSUPPORTED; clone = (cairo_xlib_surface_t *) _cairo_xlib_surface_create_similar_with_format (surface, image_src->format, image_src->width, image_src->height); if (clone == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; if (clone->base.status) return clone->base.status; status = _draw_image_surface (clone, image_src, src_x, src_y, width, height, src_x, src_y); if (status) { cairo_surface_destroy (&clone->base); return status; } *clone_out = &clone->base; return CAIRO_STATUS_SUCCESS; } return CAIRO_INT_STATUS_UNSUPPORTED; } static cairo_status_t _cairo_xlib_surface_set_matrix (cairo_xlib_surface_t *surface, cairo_matrix_t *matrix) { XTransform xtransform; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; xtransform.matrix[0][0] = _cairo_fixed_16_16_from_double (matrix->xx); xtransform.matrix[0][1] = _cairo_fixed_16_16_from_double (matrix->xy); xtransform.matrix[0][2] = _cairo_fixed_16_16_from_double (matrix->x0); xtransform.matrix[1][0] = _cairo_fixed_16_16_from_double (matrix->yx); xtransform.matrix[1][1] = _cairo_fixed_16_16_from_double (matrix->yy); xtransform.matrix[1][2] = _cairo_fixed_16_16_from_double (matrix->y0); xtransform.matrix[2][0] = 0; xtransform.matrix[2][1] = 0; xtransform.matrix[2][2] = 1 << 16; if (memcmp (&xtransform, &surface->xtransform, sizeof (XTransform)) == 0) return CAIRO_STATUS_SUCCESS; if (!CAIRO_SURFACE_RENDER_HAS_PICTURE_TRANSFORM (surface)) return CAIRO_INT_STATUS_UNSUPPORTED; XRenderSetPictureTransform (surface->dpy, surface->src_picture, &xtransform); surface->xtransform = xtransform; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xlib_surface_set_filter (cairo_xlib_surface_t *surface, cairo_filter_t filter) { const char *render_filter; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; if (surface->filter == filter) return CAIRO_STATUS_SUCCESS; if (!CAIRO_SURFACE_RENDER_HAS_FILTERS (surface)) { if (filter == CAIRO_FILTER_FAST || filter == CAIRO_FILTER_NEAREST) return CAIRO_STATUS_SUCCESS; return CAIRO_INT_STATUS_UNSUPPORTED; } switch (filter) { case CAIRO_FILTER_FAST: render_filter = FilterFast; break; case CAIRO_FILTER_GOOD: render_filter = FilterGood; break; case CAIRO_FILTER_BEST: render_filter = FilterBest; break; case CAIRO_FILTER_NEAREST: render_filter = FilterNearest; break; case CAIRO_FILTER_BILINEAR: render_filter = FilterBilinear; break; case CAIRO_FILTER_GAUSSIAN: /* XXX: The GAUSSIAN value has no implementation in cairo * whatsoever, so it was really a mistake to have it in the * API. We could fix this by officially deprecating it, or * else inventing semantics and providing an actual * implementation for it. */ default: render_filter = FilterBest; break; } XRenderSetPictureFilter (surface->dpy, surface->src_picture, (char *) render_filter, NULL, 0); surface->filter = filter; return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xlib_surface_set_repeat (cairo_xlib_surface_t *surface, int repeat) { XRenderPictureAttributes pa; unsigned long mask; if (!surface->src_picture) return CAIRO_STATUS_SUCCESS; if (surface->repeat == repeat) return CAIRO_STATUS_SUCCESS; mask = CPRepeat; pa.repeat = repeat; XRenderChangePicture (surface->dpy, surface->src_picture, mask, &pa); surface->repeat = repeat; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_xlib_surface_set_attributes (cairo_xlib_surface_t *surface, cairo_surface_attributes_t *attributes) { cairo_int_status_t status; _cairo_xlib_surface_ensure_src_picture (surface); status = _cairo_xlib_surface_set_matrix (surface, &attributes->matrix); if (status) return status; switch (attributes->extend) { case CAIRO_EXTEND_NONE: status = _cairo_xlib_surface_set_repeat (surface, 0); break; case CAIRO_EXTEND_REPEAT: status = _cairo_xlib_surface_set_repeat (surface, 1); break; case CAIRO_EXTEND_REFLECT: case CAIRO_EXTEND_PAD: default: status = CAIRO_INT_STATUS_UNSUPPORTED; } if (status) return status; status = _cairo_xlib_surface_set_filter (surface, attributes->filter); if (status) return status; return CAIRO_STATUS_SUCCESS; } /* Checks whether we can can directly draw from src to dst with * the core protocol: either with CopyArea or using src as a * a tile in a GC. */ static cairo_bool_t _surfaces_compatible (cairo_xlib_surface_t *dst, cairo_xlib_surface_t *src) { /* same screen */ if (!_cairo_xlib_surface_same_screen (dst, src)) return FALSE; /* same depth (for core) */ if (src->depth != dst->depth) return FALSE; /* if Render is supported, match picture formats */ if (src->xrender_format != NULL && src->xrender_format == dst->xrender_format) return TRUE; /* Without Render, match visuals instead */ if (src->visual == dst->visual) return TRUE; return FALSE; } static cairo_bool_t _surface_has_alpha (cairo_xlib_surface_t *surface) { if (surface->xrender_format) { if (surface->xrender_format->type == PictTypeDirect && surface->xrender_format->direct.alphaMask != 0) return TRUE; else return FALSE; } else { /* In the no-render case, we never have alpha */ return FALSE; } } /* Returns true if the given operator and source-alpha combination * requires alpha compositing to complete. */ static cairo_bool_t _operator_needs_alpha_composite (cairo_operator_t op, cairo_bool_t surface_has_alpha) { if (op == CAIRO_OPERATOR_SOURCE || (!surface_has_alpha && (op == CAIRO_OPERATOR_OVER || op == CAIRO_OPERATOR_ATOP || op == CAIRO_OPERATOR_IN))) return FALSE; return TRUE; } /* There is a bug in most older X servers with compositing using a * untransformed repeating source pattern when the source is in off-screen * video memory, and another with repeated transformed images using a * general transform matrix. When these bugs could be triggered, we need a * fallback: in the common case where we have no transformation and the * source and destination have the same format/visual, we can do the * operation using the core protocol for the first bug, otherwise, we need * a software fallback. * * We can also often optimize a compositing operation by calling XCopyArea * for some common cases where there is no alpha compositing to be done. * We figure that out here as well. */ typedef enum { DO_RENDER, /* use render */ DO_XCOPYAREA, /* core protocol XCopyArea optimization/fallback */ DO_XTILE, /* core protocol XSetTile optimization/fallback */ DO_UNSUPPORTED /* software fallback */ } composite_operation_t; /* Initial check for the render bugs; we need to recheck for the * offscreen-memory bug after we turn patterns into surfaces, since that * may introduce a repeating pattern for gradient patterns. We don't need * to check for the repeat+transform bug because gradient surfaces aren't * transformed. * * All we do here is reject cases where we *know* are going to * hit the bug and won't be able to use a core protocol fallback. */ static composite_operation_t _categorize_composite_operation (cairo_xlib_surface_t *dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_bool_t have_mask) { if (!dst->buggy_repeat) return DO_RENDER; if (src_pattern->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *)src_pattern; if (_cairo_matrix_is_integer_translation (&src_pattern->matrix, NULL, NULL) && src_pattern->extend == CAIRO_EXTEND_REPEAT) { /* This is the case where we have the bug involving * untransformed repeating source patterns with off-screen * video memory; reject some cases where a core protocol * fallback is impossible. */ if (have_mask || !(op == CAIRO_OPERATOR_SOURCE || op == CAIRO_OPERATOR_OVER)) return DO_UNSUPPORTED; if (_cairo_surface_is_xlib (surface_pattern->surface)) { cairo_xlib_surface_t *src = (cairo_xlib_surface_t *)surface_pattern->surface; if (op == CAIRO_OPERATOR_OVER && _surface_has_alpha (src)) return DO_UNSUPPORTED; /* If these are on the same screen but otherwise incompatible, * make a copy as core drawing can't cross depths and doesn't * work right across visuals of the same depth */ if (_cairo_xlib_surface_same_screen (dst, src) && !_surfaces_compatible (dst, src)) return DO_UNSUPPORTED; } } /* Check for the other bug involving repeat patterns with general * transforms. */ if (!_cairo_matrix_is_integer_translation (&src_pattern->matrix, NULL, NULL) && src_pattern->extend == CAIRO_EXTEND_REPEAT) return DO_UNSUPPORTED; } return DO_RENDER; } /* Recheck for composite-repeat once we've turned patterns into Xlib surfaces * If we end up returning DO_UNSUPPORTED here, we're throwing away work we * did to turn gradients into a pattern, but most of the time we can handle * that case with core protocol fallback. * * Also check here if we can just use XCopyArea, instead of going through * Render. */ static composite_operation_t _recategorize_composite_operation (cairo_xlib_surface_t *dst, cairo_operator_t op, cairo_xlib_surface_t *src, cairo_surface_attributes_t *src_attr, cairo_bool_t have_mask) { cairo_bool_t is_integer_translation = _cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL); cairo_bool_t needs_alpha_composite; if (!_cairo_surface_is_xlib (&src->base)) return DO_UNSUPPORTED; needs_alpha_composite = _operator_needs_alpha_composite (op, _surface_has_alpha (src)); if (!have_mask && is_integer_translation && src_attr->extend == CAIRO_EXTEND_NONE && !needs_alpha_composite && _surfaces_compatible(src, dst)) { return DO_XCOPYAREA; } if (dst->buggy_repeat && is_integer_translation && src_attr->extend == CAIRO_EXTEND_REPEAT && (src->width != 1 || src->height != 1)) { if (!have_mask && !needs_alpha_composite && _surfaces_compatible (dst, src)) { return DO_XTILE; } return DO_UNSUPPORTED; } if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE (src)) return DO_UNSUPPORTED; return DO_RENDER; } static int _render_operator (cairo_operator_t op) { switch (op) { case CAIRO_OPERATOR_CLEAR: return PictOpClear; case CAIRO_OPERATOR_SOURCE: return PictOpSrc; case CAIRO_OPERATOR_OVER: return PictOpOver; case CAIRO_OPERATOR_IN: return PictOpIn; case CAIRO_OPERATOR_OUT: return PictOpOut; case CAIRO_OPERATOR_ATOP: return PictOpAtop; case CAIRO_OPERATOR_DEST: return PictOpDst; case CAIRO_OPERATOR_DEST_OVER: return PictOpOverReverse; case CAIRO_OPERATOR_DEST_IN: return PictOpInReverse; case CAIRO_OPERATOR_DEST_OUT: return PictOpOutReverse; case CAIRO_OPERATOR_DEST_ATOP: return PictOpAtopReverse; case CAIRO_OPERATOR_XOR: return PictOpXor; case CAIRO_OPERATOR_ADD: return PictOpAdd; case CAIRO_OPERATOR_SATURATE: return PictOpSaturate; default: return PictOpOver; } } static cairo_int_status_t _cairo_xlib_surface_composite (cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_surface_attributes_t src_attr, mask_attr; cairo_xlib_surface_t *dst = abstract_dst; cairo_xlib_surface_t *src; cairo_xlib_surface_t *mask; cairo_int_status_t status; composite_operation_t operation; int itx, ity; cairo_bool_t is_integer_translation; _cairo_xlib_display_notify (dst->screen_info->display); if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE (dst)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, src_pattern, mask_pattern != NULL); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_pattern_acquire_surfaces (src_pattern, mask_pattern, &dst->base, src_x, src_y, mask_x, mask_y, width, height, (cairo_surface_t **) &src, (cairo_surface_t **) &mask, &src_attr, &mask_attr); if (status) return status; /* check for fallback surfaces that we cannot handle ... */ if (!_cairo_surface_is_xlib (&src->base)) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } if (mask != NULL && !_cairo_surface_is_xlib (&mask->base)) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } operation = _recategorize_composite_operation (dst, op, src, &src_attr, mask_pattern != NULL); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } switch (operation) { case DO_RENDER: status = _cairo_xlib_surface_set_attributes (src, &src_attr); if (status) goto BAIL; _cairo_xlib_surface_ensure_dst_picture (dst); if (mask) { status = _cairo_xlib_surface_set_attributes (mask, &mask_attr); if (status) goto BAIL; XRenderComposite (dst->dpy, _render_operator (op), src->src_picture, mask->src_picture, dst->dst_picture, src_x + src_attr.x_offset, src_y + src_attr.y_offset, mask_x + mask_attr.x_offset, mask_y + mask_attr.y_offset, dst_x, dst_y, width, height); } else { XRenderComposite (dst->dpy, _render_operator (op), src->src_picture, 0, dst->dst_picture, src_x + src_attr.x_offset, src_y + src_attr.y_offset, 0, 0, dst_x, dst_y, width, height); } break; case DO_XCOPYAREA: status = _cairo_xlib_surface_ensure_gc (dst); if (status) goto BAIL; XCopyArea (dst->dpy, src->drawable, dst->drawable, dst->gc, src_x + src_attr.x_offset, src_y + src_attr.y_offset, width, height, dst_x, dst_y); break; case DO_XTILE: /* This case is only used for bug fallbacks, though it is theoretically * applicable to the case where we don't have the RENDER extension as * well. * * We've checked that we have a repeating unscaled source in * _recategorize_composite_operation. */ status = _cairo_xlib_surface_ensure_gc (dst); if (status) goto BAIL; is_integer_translation = _cairo_matrix_is_integer_translation (&src_attr.matrix, &itx, &ity); /* This is a pre-condition for DO_XTILE. */ assert (is_integer_translation); XSetTSOrigin (dst->dpy, dst->gc, - (itx + src_attr.x_offset), - (ity + src_attr.y_offset)); XSetTile (dst->dpy, dst->gc, src->drawable); XSetFillStyle (dst->dpy, dst->gc, FillTiled); XFillRectangle (dst->dpy, dst->drawable, dst->gc, dst_x, dst_y, width, height); break; case DO_UNSUPPORTED: default: ASSERT_NOT_REACHED; } if (!_cairo_operator_bounded_by_source (op)) status = _cairo_surface_composite_fixup_unbounded (&dst->base, &src_attr, src->width, src->height, mask ? &mask_attr : NULL, mask ? mask->width : 0, mask ? mask->height : 0, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); BAIL: if (mask) _cairo_pattern_release_surface (mask_pattern, &mask->base, &mask_attr); _cairo_pattern_release_surface (src_pattern, &src->base, &src_attr); return status; } static cairo_int_status_t _cairo_xlib_surface_fill_rectangles (void *abstract_surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects) { cairo_xlib_surface_t *surface = abstract_surface; XRenderColor render_color; XRectangle static_xrects[16]; XRectangle *xrects = static_xrects; int i; _cairo_xlib_display_notify (surface->screen_info->display); if (!CAIRO_SURFACE_RENDER_HAS_FILL_RECTANGLE (surface)) return CAIRO_INT_STATUS_UNSUPPORTED; render_color.red = color->red_short; render_color.green = color->green_short; render_color.blue = color->blue_short; render_color.alpha = color->alpha_short; if (num_rects > ARRAY_LENGTH(static_xrects)) { xrects = _cairo_malloc_ab (num_rects, sizeof(XRectangle)); if (xrects == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } for (i = 0; i < num_rects; i++) { xrects[i].x = rects[i].x; xrects[i].y = rects[i].y; xrects[i].width = rects[i].width; xrects[i].height = rects[i].height; } _cairo_xlib_surface_ensure_dst_picture (surface); XRenderFillRectangles (surface->dpy, _render_operator (op), surface->dst_picture, &render_color, xrects, num_rects); if (xrects != static_xrects) free(xrects); return CAIRO_STATUS_SUCCESS; } /* Creates an A8 picture of size @width x @height, initialized with @color */ static Picture _create_a8_picture (cairo_xlib_surface_t *surface, XRenderColor *color, int width, int height, cairo_bool_t repeat) { XRenderPictureAttributes pa; unsigned long mask = 0; Pixmap pixmap = XCreatePixmap (surface->dpy, surface->drawable, width <= 0 ? 1 : width, height <= 0 ? 1 : height, 8); Picture picture; if (repeat) { pa.repeat = TRUE; mask = CPRepeat; } picture = XRenderCreatePicture (surface->dpy, pixmap, XRenderFindStandardFormat (surface->dpy, PictStandardA8), mask, &pa); XRenderFillRectangle (surface->dpy, PictOpSrc, picture, color, 0, 0, width, height); XFreePixmap (surface->dpy, pixmap); return picture; } /* Creates a temporary mask for the trapezoids covering the area * [@dst_x, @dst_y, @width, @height] of the destination surface. */ static Picture _create_trapezoid_mask (cairo_xlib_surface_t *dst, cairo_trapezoid_t *traps, int num_traps, int dst_x, int dst_y, int width, int height, XRenderPictFormat *pict_format) { XRenderColor transparent = { 0, 0, 0, 0 }; XRenderColor solid = { 0xffff, 0xffff, 0xffff, 0xffff }; Picture mask_picture, solid_picture; XTrapezoid *offset_traps; int i; /* This would be considerably simpler using XRenderAddTraps(), but since * we are only using this in the unbounded-operator case, we stick with * XRenderCompositeTrapezoids, which is available on older versions * of RENDER rather than conditionalizing. We should still hit an * optimization that avoids creating another intermediate surface on * the servers that have XRenderAddTraps(). */ mask_picture = _create_a8_picture (dst, &transparent, width, height, FALSE); if (num_traps == 0) return mask_picture; offset_traps = _cairo_malloc_ab (num_traps, sizeof (XTrapezoid)); if (!offset_traps) { XRenderFreePicture (dst->dpy, mask_picture); _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return None; } for (i = 0; i < num_traps; i++) { offset_traps[i].top = _cairo_fixed_to_16_16(traps[i].top) - 0x10000 * dst_y; offset_traps[i].bottom = _cairo_fixed_to_16_16(traps[i].bottom) - 0x10000 * dst_y; offset_traps[i].left.p1.x = _cairo_fixed_to_16_16(traps[i].left.p1.x) - 0x10000 * dst_x; offset_traps[i].left.p1.y = _cairo_fixed_to_16_16(traps[i].left.p1.y) - 0x10000 * dst_y; offset_traps[i].left.p2.x = _cairo_fixed_to_16_16(traps[i].left.p2.x) - 0x10000 * dst_x; offset_traps[i].left.p2.y = _cairo_fixed_to_16_16(traps[i].left.p2.y) - 0x10000 * dst_y; offset_traps[i].right.p1.x = _cairo_fixed_to_16_16(traps[i].right.p1.x) - 0x10000 * dst_x; offset_traps[i].right.p1.y = _cairo_fixed_to_16_16(traps[i].right.p1.y) - 0x10000 * dst_y; offset_traps[i].right.p2.x = _cairo_fixed_to_16_16(traps[i].right.p2.x) - 0x10000 * dst_x; offset_traps[i].right.p2.y = _cairo_fixed_to_16_16(traps[i].right.p2.y) - 0x10000 * dst_y; } solid_picture = _create_a8_picture (dst, &solid, width, height, TRUE); XRenderCompositeTrapezoids (dst->dpy, PictOpAdd, solid_picture, mask_picture, pict_format, 0, 0, offset_traps, num_traps); XRenderFreePicture (dst->dpy, solid_picture); free (offset_traps); return mask_picture; } static cairo_int_status_t _cairo_xlib_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, void *abstract_dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps) { cairo_surface_attributes_t attributes; cairo_xlib_surface_t *dst = abstract_dst; cairo_xlib_surface_t *src; cairo_int_status_t status; composite_operation_t operation; int render_reference_x, render_reference_y; int render_src_x, render_src_y; XRenderPictFormat *pict_format; _cairo_xlib_display_notify (dst->screen_info->display); if (!CAIRO_SURFACE_RENDER_HAS_TRAPEZOIDS (dst)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, pattern, TRUE); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; status = _cairo_pattern_acquire_surface (pattern, &dst->base, src_x, src_y, width, height, (cairo_surface_t **) &src, &attributes); if (status) return status; operation = _recategorize_composite_operation (dst, op, src, &attributes, TRUE); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL; } switch (antialias) { case CAIRO_ANTIALIAS_NONE: pict_format = XRenderFindStandardFormat (dst->dpy, PictStandardA1); break; case CAIRO_ANTIALIAS_GRAY: case CAIRO_ANTIALIAS_SUBPIXEL: case CAIRO_ANTIALIAS_DEFAULT: default: pict_format = XRenderFindStandardFormat (dst->dpy, PictStandardA8); break; } if (traps[0].left.p1.y < traps[0].left.p2.y) { render_reference_x = _cairo_fixed_integer_floor (traps[0].left.p1.x); render_reference_y = _cairo_fixed_integer_floor (traps[0].left.p1.y); } else { render_reference_x = _cairo_fixed_integer_floor (traps[0].left.p2.x); render_reference_y = _cairo_fixed_integer_floor (traps[0].left.p2.y); } render_src_x = src_x + render_reference_x - dst_x; render_src_y = src_y + render_reference_y - dst_y; _cairo_xlib_surface_ensure_dst_picture (dst); status = _cairo_xlib_surface_set_attributes (src, &attributes); if (status) goto BAIL; if (!_cairo_operator_bounded_by_mask (op)) { /* XRenderCompositeTrapezoids() creates a mask only large enough for the * trapezoids themselves, but if the operator is unbounded, then we need * to actually composite all the way out to the bounds, so we create * the mask and composite ourselves. There actually would * be benefit to doing this in all cases, since RENDER implementations * will frequently create a too temporary big mask, ignoring destination * bounds and clip. (XRenderAddTraps() could be used to make creating * the mask somewhat cheaper.) */ Picture mask_picture = _create_trapezoid_mask (dst, traps, num_traps, dst_x, dst_y, width, height, pict_format); if (!mask_picture) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } XRenderComposite (dst->dpy, _render_operator (op), src->src_picture, mask_picture, dst->dst_picture, src_x + attributes.x_offset, src_y + attributes.y_offset, 0, 0, dst_x, dst_y, width, height); XRenderFreePicture (dst->dpy, mask_picture); status = _cairo_surface_composite_shape_fixup_unbounded (&dst->base, &attributes, src->width, src->height, width, height, src_x, src_y, 0, 0, dst_x, dst_y, width, height); } else { XTrapezoid xtraps_stack[16]; XTrapezoid *xtraps = xtraps_stack; int i; if (num_traps > ARRAY_LENGTH(xtraps_stack)) { xtraps = _cairo_malloc_ab (num_traps, sizeof(XTrapezoid)); if (xtraps == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } } for (i = 0; i < num_traps; i++) { xtraps[i].top = _cairo_fixed_to_16_16(traps[i].top); xtraps[i].bottom = _cairo_fixed_to_16_16(traps[i].bottom); xtraps[i].left.p1.x = _cairo_fixed_to_16_16(traps[i].left.p1.x); xtraps[i].left.p1.y = _cairo_fixed_to_16_16(traps[i].left.p1.y); xtraps[i].left.p2.x = _cairo_fixed_to_16_16(traps[i].left.p2.x); xtraps[i].left.p2.y = _cairo_fixed_to_16_16(traps[i].left.p2.y); xtraps[i].right.p1.x = _cairo_fixed_to_16_16(traps[i].right.p1.x); xtraps[i].right.p1.y = _cairo_fixed_to_16_16(traps[i].right.p1.y); xtraps[i].right.p2.x = _cairo_fixed_to_16_16(traps[i].right.p2.x); xtraps[i].right.p2.y = _cairo_fixed_to_16_16(traps[i].right.p2.y); } XRenderCompositeTrapezoids (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, pict_format, render_src_x + attributes.x_offset, render_src_y + attributes.y_offset, xtraps, num_traps); if (xtraps != xtraps_stack) free(xtraps); } BAIL: _cairo_pattern_release_surface (pattern, &src->base, &attributes); return status; } static cairo_int_status_t _cairo_xlib_surface_set_clip_region (void *abstract_surface, cairo_region_t *region) { cairo_xlib_surface_t *surface = abstract_surface; if (surface->have_clip_rects == FALSE && region == NULL) return CAIRO_STATUS_SUCCESS; if (surface->clip_rects != surface->embedded_clip_rects) { free (surface->clip_rects); surface->clip_rects = surface->embedded_clip_rects; } surface->have_clip_rects = FALSE; surface->num_clip_rects = 0; if (region != NULL) { cairo_box_int_t *boxes; cairo_status_t status; XRectangle *rects = NULL; int n_boxes, i; status = _cairo_region_get_boxes (region, &n_boxes, &boxes); if (status) return status; if (n_boxes > ARRAY_LENGTH (surface->embedded_clip_rects)) { rects = _cairo_malloc_ab (n_boxes, sizeof(XRectangle)); if (rects == NULL) { _cairo_region_boxes_fini (region, boxes); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } } else { rects = surface->embedded_clip_rects; } for (i = 0; i < n_boxes; i++) { rects[i].x = boxes[i].p1.x; rects[i].y = boxes[i].p1.y; rects[i].width = boxes[i].p2.x - boxes[i].p1.x; rects[i].height = boxes[i].p2.y - boxes[i].p1.y; } _cairo_region_boxes_fini (region, boxes); surface->have_clip_rects = TRUE; surface->clip_rects = rects; surface->num_clip_rects = n_boxes; } surface->clip_dirty = CAIRO_XLIB_SURFACE_CLIP_DIRTY_ALL; return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_xlib_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_xlib_surface_t *surface = abstract_surface; rectangle->x = 0; rectangle->y = 0; rectangle->width = surface->width; rectangle->height = surface->height; return CAIRO_STATUS_SUCCESS; } static void _cairo_xlib_surface_get_font_options (void *abstract_surface, cairo_font_options_t *options) { cairo_xlib_surface_t *surface = abstract_surface; *options = surface->screen_info->font_options; } static void _cairo_xlib_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font); static void _cairo_xlib_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font); static cairo_bool_t _cairo_xlib_surface_is_similar (void *surface_a, void *surface_b, cairo_content_t content) { cairo_xlib_surface_t *a = surface_a; cairo_xlib_surface_t *b = surface_b; XRenderPictFormat *xrender_format = b->xrender_format; if (!_cairo_xlib_surface_same_screen (a, b)) return FALSE; /* now inspect the content to check that a is similar to b */ if (xrender_format == NULL && b->visual != NULL) xrender_format = XRenderFindVisualFormat (b->dpy, b->visual); if (xrender_format == NULL || _xrender_format_to_content (xrender_format) != content) { xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT (b->dpy, _cairo_format_from_content (content)); } return a->xrender_format == xrender_format; } static cairo_status_t _cairo_xlib_surface_reset (void *abstract_surface) { cairo_xlib_surface_t *surface = abstract_surface; cairo_status_t status; status = _cairo_xlib_surface_set_clip_region (surface, NULL); if (status) return status; return CAIRO_STATUS_SUCCESS; } static const cairo_surface_backend_t cairo_xlib_surface_backend = { CAIRO_SURFACE_TYPE_XLIB, _cairo_xlib_surface_create_similar, _cairo_xlib_surface_finish, _cairo_xlib_surface_acquire_source_image, _cairo_xlib_surface_release_source_image, _cairo_xlib_surface_acquire_dest_image, _cairo_xlib_surface_release_dest_image, _cairo_xlib_surface_clone_similar, _cairo_xlib_surface_composite, _cairo_xlib_surface_fill_rectangles, _cairo_xlib_surface_composite_trapezoids, NULL, /* copy_page */ NULL, /* show_page */ _cairo_xlib_surface_set_clip_region, NULL, /* intersect_clip_path */ _cairo_xlib_surface_get_extents, NULL, /* old_show_glyphs */ _cairo_xlib_surface_get_font_options, NULL, /* flush */ NULL, /* mark_dirty_rectangle */ _cairo_xlib_surface_scaled_font_fini, _cairo_xlib_surface_scaled_glyph_fini, NULL, /* paint */ NULL, /* mask */ NULL, /* stroke */ NULL, /* fill */ _cairo_xlib_surface_show_glyphs, NULL, /* snapshot */ _cairo_xlib_surface_is_similar, _cairo_xlib_surface_reset }; /** * _cairo_surface_is_xlib: * @surface: a #cairo_surface_t * * Checks if a surface is a #cairo_xlib_surface_t * * Return value: True if the surface is an xlib surface **/ static cairo_bool_t _cairo_surface_is_xlib (cairo_surface_t *surface) { return surface->backend == &cairo_xlib_surface_backend; } static void _cairo_xlib_surface_detach_display (Display *dpy, void *data) { cairo_xlib_surface_t *surface = data; surface->dpy = NULL; if (surface->dst_picture != None) { XRenderFreePicture (dpy, surface->dst_picture); surface->dst_picture = None; } if (surface->src_picture != None) { XRenderFreePicture (dpy, surface->src_picture); surface->src_picture = None; } if (surface->owns_pixmap) { XFreePixmap (dpy, surface->drawable); surface->drawable = None; surface->owns_pixmap = FALSE; } if (surface->gc != NULL) { XFreeGC (dpy, surface->gc); surface->gc = NULL; } } static cairo_surface_t * _cairo_xlib_surface_create_internal (Display *dpy, Drawable drawable, Screen *screen, Visual *visual, XRenderPictFormat *xrender_format, int width, int height, int depth) { cairo_xlib_surface_t *surface; cairo_xlib_screen_info_t *screen_info; CAIRO_MUTEX_INITIALIZE (); screen_info = _cairo_xlib_screen_info_get (dpy, screen); if (screen_info == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); surface = malloc (sizeof (cairo_xlib_surface_t)); if (surface == NULL) { _cairo_xlib_screen_info_destroy (screen_info); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } if (! _cairo_xlib_add_close_display_hook (dpy, _cairo_xlib_surface_detach_display, surface, surface)) { free (surface); _cairo_xlib_screen_info_destroy (screen_info); return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); } if (xrender_format) { depth = xrender_format->depth; } else if (visual) { int j, k; /* This is ugly, but we have to walk over all visuals * for the display to find the depth. */ for (j = 0; j < screen->ndepths; j++) { Depth *d = &screen->depths[j]; for (k = 0; k < d->nvisuals; k++) { if (&d->visuals[k] == visual) { depth = d->depth; goto found; } } } found: ; } if (! XRenderQueryVersion (dpy, &surface->render_major, &surface->render_minor)) { surface->render_major = -1; surface->render_minor = -1; } if (CAIRO_SURFACE_RENDER_HAS_CREATE_PICTURE (surface)) { if (!xrender_format) { if (visual) xrender_format = XRenderFindVisualFormat (dpy, visual); else if (depth == 1) xrender_format = XRenderFindStandardFormat (dpy, PictStandardA1); } } else { xrender_format = NULL; } _cairo_surface_init (&surface->base, &cairo_xlib_surface_backend, _xrender_format_to_content (xrender_format)); surface->dpy = dpy; surface->screen_info = screen_info; surface->gc = NULL; surface->drawable = drawable; surface->screen = screen; surface->owns_pixmap = FALSE; surface->use_pixmap = 0; surface->width = width; surface->height = height; surface->buggy_repeat = screen_info->display->buggy_repeat; surface->dst_picture = None; surface->src_picture = None; surface->visual = visual; surface->xrender_format = xrender_format; surface->depth = depth; surface->filter = CAIRO_FILTER_NEAREST; surface->repeat = FALSE; surface->xtransform = identity; surface->have_clip_rects = FALSE; surface->clip_rects = surface->embedded_clip_rects; surface->num_clip_rects = 0; /* * Compute the pixel format masks from either a XrenderFormat or * else from a visual; failing that we assume the drawable is an * alpha-only pixmap as it could only have been created that way * through the cairo_xlib_surface_create_for_bitmap function. */ if (xrender_format) { surface->a_mask = (unsigned long) surface->xrender_format->direct.alphaMask << surface->xrender_format->direct.alpha; surface->r_mask = (unsigned long) surface->xrender_format->direct.redMask << surface->xrender_format->direct.red; surface->g_mask = (unsigned long) surface->xrender_format->direct.greenMask << surface->xrender_format->direct.green; surface->b_mask = (unsigned long) surface->xrender_format->direct.blueMask << surface->xrender_format->direct.blue; } else if (visual) { surface->a_mask = 0; surface->r_mask = visual->red_mask; surface->g_mask = visual->green_mask; surface->b_mask = visual->blue_mask; } else { if (depth < 32) surface->a_mask = (1 << depth) - 1; else surface->a_mask = 0xffffffff; surface->r_mask = 0; surface->g_mask = 0; surface->b_mask = 0; } return (cairo_surface_t *) surface; } static Screen * _cairo_xlib_screen_from_visual (Display *dpy, Visual *visual) { int s; int d; int v; Screen *screen; Depth *depth; for (s = 0; s < ScreenCount (dpy); s++) { screen = ScreenOfDisplay (dpy, s); if (visual == DefaultVisualOfScreen (screen)) return screen; for (d = 0; d < screen->ndepths; d++) { depth = &screen->depths[d]; for (v = 0; v < depth->nvisuals; v++) if (visual == &depth->visuals[v]) return screen; } } return NULL; } /** * cairo_xlib_surface_create: * @dpy: an X Display * @drawable: an X Drawable, (a Pixmap or a Window) * @visual: the visual to use for drawing to @drawable. The depth * of the visual must match the depth of the drawable. * Currently, only TrueColor visuals are fully supported. * @width: the current width of @drawable. * @height: the current height of @drawable. * * Creates an Xlib surface that draws to the given drawable. * The way that colors are represented in the drawable is specified * by the provided visual. * * Note: If @drawable is a Window, then the function * cairo_xlib_surface_set_size must be called whenever the size of the * window changes. * * When @drawable is a Window containing child windows then drawing to * the created surface will be clipped by those child windows. When * the created surface is used as a source, the contents of the * children will be included. * * Return value: the newly created surface **/ cairo_surface_t * cairo_xlib_surface_create (Display *dpy, Drawable drawable, Visual *visual, int width, int height) { Screen *screen = _cairo_xlib_screen_from_visual (dpy, visual); if (screen == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_VISUAL)); return _cairo_xlib_surface_create_internal (dpy, drawable, screen, visual, NULL, width, height, 0); } /** * cairo_xlib_surface_create_for_bitmap: * @dpy: an X Display * @bitmap: an X Drawable, (a depth-1 Pixmap) * @screen: the X Screen associated with @bitmap * @width: the current width of @bitmap. * @height: the current height of @bitmap. * * Creates an Xlib surface that draws to the given bitmap. * This will be drawn to as a %CAIRO_FORMAT_A1 object. * * Return value: the newly created surface **/ cairo_surface_t * cairo_xlib_surface_create_for_bitmap (Display *dpy, Pixmap bitmap, Screen *screen, int width, int height) { return _cairo_xlib_surface_create_internal (dpy, bitmap, screen, NULL, NULL, width, height, 1); } #if CAIRO_HAS_XLIB_XRENDER_SURFACE /** * cairo_xlib_surface_create_with_xrender_format: * @dpy: an X Display * @drawable: an X Drawable, (a Pixmap or a Window) * @screen: the X Screen associated with @drawable * @format: the picture format to use for drawing to @drawable. The depth * of @format must match the depth of the drawable. * @width: the current width of @drawable. * @height: the current height of @drawable. * * Creates an Xlib surface that draws to the given drawable. * The way that colors are represented in the drawable is specified * by the provided picture format. * * Note: If @drawable is a Window, then the function * cairo_xlib_surface_set_size must be called whenever the size of the * window changes. * * Return value: the newly created surface **/ cairo_surface_t * cairo_xlib_surface_create_with_xrender_format (Display *dpy, Drawable drawable, Screen *screen, XRenderPictFormat *format, int width, int height) { return _cairo_xlib_surface_create_internal (dpy, drawable, screen, NULL, format, width, height, 0); } /** * cairo_xlib_surface_get_xrender_format: * @surface: an xlib surface * * Gets the X Render picture format that @surface uses for rendering with the * X Render extension. If the surface was created by * cairo_xlib_surface_create_with_xrender_format() originally, the return * value is the format passed to that constructor. * * Return value: the XRenderPictFormat* associated with @surface, * or %NULL if the surface is not an xlib surface * or if the X Render extension is not available. * * Since: 1.6 **/ XRenderPictFormat * cairo_xlib_surface_get_xrender_format (cairo_surface_t *surface) { cairo_xlib_surface_t *xlib_surface = (cairo_xlib_surface_t *) surface; /* Throw an error for a non-xlib surface */ if (! _cairo_surface_is_xlib (surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return NULL; } return xlib_surface->xrender_format; } #endif /** * cairo_xlib_surface_set_size: * @surface: a #cairo_surface_t for the XLib backend * @width: the new width of the surface * @height: the new height of the surface * * Informs cairo of the new size of the X Drawable underlying the * surface. For a surface created for a Window (rather than a Pixmap), * this function must be called each time the size of the window * changes. (For a subwindow, you are normally resizing the window * yourself, but for a toplevel window, it is necessary to listen for * ConfigureNotify events.) * * A Pixmap can never change size, so it is never necessary to call * this function on a surface created for a Pixmap. **/ void cairo_xlib_surface_set_size (cairo_surface_t *abstract_surface, int width, int height) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; cairo_status_t status; if (! _cairo_surface_is_xlib (abstract_surface)) { status = _cairo_surface_set_error (abstract_surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return; } surface->width = width; surface->height = height; } /** * cairo_xlib_surface_set_drawable: * @surface: a #cairo_surface_t for the XLib backend * @drawable: the new drawable for the surface * @width: the width of the new drawable * @height: the height of the new drawable * * Informs cairo of a new X Drawable underlying the * surface. The drawable must match the display, screen * and format of the existing drawable or the application * will get X protocol errors and will probably terminate. * No checks are done by this function to ensure this * compatibility. **/ void cairo_xlib_surface_set_drawable (cairo_surface_t *abstract_surface, Drawable drawable, int width, int height) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *)abstract_surface; cairo_status_t status; if (! _cairo_surface_is_xlib (abstract_surface)) { status = _cairo_surface_set_error (abstract_surface, CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return; } /* XXX: and what about this case? */ if (surface->owns_pixmap) return; if (surface->drawable != drawable) { if (surface->dst_picture != None) { status = _cairo_xlib_display_queue_resource ( surface->screen_info->display, XRenderFreePicture, surface->dst_picture); if (status) { status = _cairo_surface_set_error (&surface->base, status); return; } surface->dst_picture = None; } if (surface->src_picture != None) { status = _cairo_xlib_display_queue_resource ( surface->screen_info->display, XRenderFreePicture, surface->src_picture); if (status) { status = _cairo_surface_set_error (&surface->base, status); return; } surface->src_picture = None; } surface->drawable = drawable; } surface->width = width; surface->height = height; } /** * cairo_xlib_surface_get_display: * @surface: a #cairo_xlib_surface_t * * Get the X Display for the underlying X Drawable. * * Return value: the display. * * Since: 1.2 **/ Display * cairo_xlib_surface_get_display (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return NULL; } return surface->dpy; } /** * cairo_xlib_surface_get_drawable: * @surface: a #cairo_xlib_surface_t * * Get the underlying X Drawable used for the surface. * * Return value: the drawable. * * Since: 1.2 **/ Drawable cairo_xlib_surface_get_drawable (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } return surface->drawable; } /** * cairo_xlib_surface_get_screen: * @surface: a #cairo_xlib_surface_t * * Get the X Screen for the underlying X Drawable. * * Return value: the screen. * * Since: 1.2 **/ Screen * cairo_xlib_surface_get_screen (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return NULL; } return surface->screen; } /** * cairo_xlib_surface_get_visual: * @surface: a #cairo_xlib_surface_t * * Get the X Visual used for underlying X Drawable. * * Return value: the visual. * * Since: 1.2 **/ Visual * cairo_xlib_surface_get_visual (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return NULL; } return surface->visual; } /** * cairo_xlib_surface_get_depth: * @surface: a #cairo_xlib_surface_t * * Get the number of bits used to represent each pixel value. * * Return value: the depth of the surface in bits. * * Since: 1.2 **/ int cairo_xlib_surface_get_depth (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return 0; } return surface->depth; } /** * cairo_xlib_surface_get_width: * @surface: a #cairo_xlib_surface_t * * Get the width of the X Drawable underlying the surface in pixels. * * Return value: the width of the surface in pixels. * * Since: 1.2 **/ int cairo_xlib_surface_get_width (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return -1; } return surface->width; } /** * cairo_xlib_surface_get_height: * @surface: a #cairo_xlib_surface_t * * Get the height of the X Drawable underlying the surface in pixels. * * Return value: the height of the surface in pixels. * * Since: 1.2 **/ int cairo_xlib_surface_get_height (cairo_surface_t *abstract_surface) { cairo_xlib_surface_t *surface = (cairo_xlib_surface_t *) abstract_surface; if (! _cairo_surface_is_xlib (abstract_surface)) { _cairo_error_throw (CAIRO_STATUS_SURFACE_TYPE_MISMATCH); return -1; } return surface->height; } enum { GLYPHSET_INDEX_ARGB32, GLYPHSET_INDEX_A8, GLYPHSET_INDEX_A1, NUM_GLYPHSETS }; typedef struct _cairo_xlib_font_glyphset_info { GlyphSet glyphset; cairo_format_t format; XRenderPictFormat *xrender_format; } cairo_xlib_font_glyphset_info_t; typedef struct _cairo_xlib_surface_font_private { Display *dpy; cairo_xlib_font_glyphset_info_t glyphset_info[NUM_GLYPHSETS]; } cairo_xlib_surface_font_private_t; static void _cairo_xlib_surface_remove_scaled_font (Display *dpy, void *data) { cairo_scaled_font_t *scaled_font = data; cairo_xlib_surface_font_private_t *font_private; CAIRO_MUTEX_LOCK (scaled_font->mutex); font_private = scaled_font->surface_private; scaled_font->surface_private = NULL; _cairo_scaled_font_reset_cache (scaled_font); CAIRO_MUTEX_UNLOCK (scaled_font->mutex); if (font_private != NULL) { int i; for (i = 0; i < NUM_GLYPHSETS; i++) { cairo_xlib_font_glyphset_info_t *glyphset_info = &font_private->glyphset_info[i]; if (glyphset_info->glyphset) { XRenderFreeGlyphSet (font_private->dpy, glyphset_info->glyphset); } } free (font_private); } } static cairo_status_t _cairo_xlib_surface_font_init (Display *dpy, cairo_scaled_font_t *scaled_font) { cairo_xlib_surface_font_private_t *font_private; int i; font_private = malloc (sizeof (cairo_xlib_surface_font_private_t)); if (!font_private) return _cairo_error (CAIRO_STATUS_NO_MEMORY); if (!_cairo_xlib_add_close_display_hook (dpy, _cairo_xlib_surface_remove_scaled_font, scaled_font, scaled_font)) { free (font_private); return _cairo_error (CAIRO_STATUS_NO_MEMORY); } font_private->dpy = dpy; for (i = 0; i < NUM_GLYPHSETS; i++) { cairo_xlib_font_glyphset_info_t *glyphset_info = &font_private->glyphset_info[i]; switch (i) { case GLYPHSET_INDEX_ARGB32: glyphset_info->format = CAIRO_FORMAT_ARGB32; break; case GLYPHSET_INDEX_A8: glyphset_info->format = CAIRO_FORMAT_A8; break; case GLYPHSET_INDEX_A1: glyphset_info->format = CAIRO_FORMAT_A1; break; default: ASSERT_NOT_REACHED; break; } glyphset_info->xrender_format = NULL; glyphset_info->glyphset = None; } scaled_font->surface_private = font_private; scaled_font->surface_backend = &cairo_xlib_surface_backend; return CAIRO_STATUS_SUCCESS; } static void _cairo_xlib_surface_scaled_font_fini (cairo_scaled_font_t *scaled_font) { cairo_xlib_surface_font_private_t *font_private = scaled_font->surface_private; if (font_private) { cairo_xlib_display_t *display; _cairo_xlib_remove_close_display_hooks (font_private->dpy, scaled_font); display = _cairo_xlib_display_get (font_private->dpy); if (display != NULL) { int i; for (i = 0; i < NUM_GLYPHSETS; i++) { cairo_xlib_font_glyphset_info_t *glyphset_info = &font_private->glyphset_info[i]; if (glyphset_info->glyphset) { cairo_status_t status; status = _cairo_xlib_display_queue_resource (display, XRenderFreeGlyphSet, glyphset_info->glyphset); (void) status; /* XXX cannot propagate failure */ } } _cairo_xlib_display_destroy (display); } free (font_private); } } struct _cairo_xlib_render_free_glyphs { GlyphSet glyphset; unsigned long glyph_index; }; static void _cairo_xlib_render_free_glyphs (Display *dpy, struct _cairo_xlib_render_free_glyphs *arg) { XRenderFreeGlyphs (dpy, arg->glyphset, &arg->glyph_index, 1); } static cairo_xlib_font_glyphset_info_t * _cairo_xlib_scaled_glyph_get_glyphset_info (cairo_scaled_glyph_t *scaled_glyph) { return scaled_glyph->surface_private; } static void _cairo_xlib_scaled_glyph_set_glyphset_info (cairo_scaled_glyph_t *scaled_glyph, cairo_xlib_font_glyphset_info_t *glyphset_info) { scaled_glyph->surface_private = glyphset_info; } static void _cairo_xlib_surface_scaled_glyph_fini (cairo_scaled_glyph_t *scaled_glyph, cairo_scaled_font_t *scaled_font) { cairo_xlib_surface_font_private_t *font_private = scaled_font->surface_private; if (font_private != NULL && scaled_glyph->surface_private != NULL) { cairo_xlib_display_t *display = _cairo_xlib_display_get (font_private->dpy); if (display != NULL) { struct _cairo_xlib_render_free_glyphs *arg = malloc (sizeof (*arg)); if (arg != NULL) { cairo_status_t status; arg->glyphset = _cairo_xlib_scaled_glyph_get_glyphset_info (scaled_glyph)->glyphset; arg->glyph_index = _cairo_scaled_glyph_index (scaled_glyph); status = _cairo_xlib_display_queue_work (display, (cairo_xlib_notify_func) _cairo_xlib_render_free_glyphs, arg, free); if (status) { /* XXX cannot propagate failure */ free (arg); } } _cairo_xlib_display_destroy (display); } } } static cairo_bool_t _native_byte_order_lsb (void) { int x = 1; return *((char *) &x) == 1; } static cairo_xlib_font_glyphset_info_t * _cairo_xlib_scaled_font_get_glyphset_info_for_format (cairo_scaled_font_t *scaled_font, cairo_format_t format) { cairo_xlib_surface_font_private_t *font_private = scaled_font->surface_private; cairo_xlib_font_glyphset_info_t *glyphset_info; int glyphset_index; switch (format) { default: case CAIRO_FORMAT_RGB24: case CAIRO_FORMAT_ARGB32: glyphset_index = GLYPHSET_INDEX_ARGB32; break; case CAIRO_FORMAT_A8: glyphset_index = GLYPHSET_INDEX_A8; break; case CAIRO_FORMAT_A1: glyphset_index = GLYPHSET_INDEX_A1; break; } glyphset_info = &font_private->glyphset_info[glyphset_index]; if (glyphset_info->glyphset == None) { glyphset_info->xrender_format = _CAIRO_FORMAT_TO_XRENDER_FORMAT(font_private->dpy, glyphset_info->format); glyphset_info->glyphset = XRenderCreateGlyphSet (font_private->dpy, glyphset_info->xrender_format); } return glyphset_info; } static cairo_status_t _cairo_xlib_surface_add_glyph (Display *dpy, cairo_scaled_font_t *scaled_font, cairo_scaled_glyph_t **pscaled_glyph) { XGlyphInfo glyph_info; unsigned long glyph_index; unsigned char *data; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_xlib_surface_font_private_t *font_private; cairo_scaled_glyph_t *scaled_glyph = *pscaled_glyph; cairo_image_surface_t *glyph_surface = scaled_glyph->surface; cairo_bool_t already_had_glyph_surface; cairo_xlib_font_glyphset_info_t *glyphset_info; if (!glyph_surface) { status = _cairo_scaled_glyph_lookup (scaled_font, _cairo_scaled_glyph_index (scaled_glyph), CAIRO_SCALED_GLYPH_INFO_METRICS | CAIRO_SCALED_GLYPH_INFO_SURFACE, pscaled_glyph); if (status != CAIRO_STATUS_SUCCESS) return status; scaled_glyph = *pscaled_glyph; glyph_surface = scaled_glyph->surface; already_had_glyph_surface = FALSE; } else { already_had_glyph_surface = TRUE; } /* XXX XRenderAddGlyph does not handle a glyph surface larger than the * maximum XRequest size. */ { /* pessimistic length estimation in case we need to change formats */ int len = 4 * glyph_surface->width * glyph_surface->height; int max_request_size = XMaxRequestSize (dpy) - sz_xRenderAddGlyphsReq - sz_xGlyphInfo - 4; if (len >= max_request_size) return CAIRO_INT_STATUS_UNSUPPORTED; } if (scaled_font->surface_private == NULL) { status = _cairo_xlib_surface_font_init (dpy, scaled_font); if (status) return status; } font_private = scaled_font->surface_private; glyphset_info = _cairo_xlib_scaled_font_get_glyphset_info_for_format (scaled_font, glyph_surface->format); /* If the glyph surface has zero height or width, we create * a clear 1x1 surface, to avoid various X server bugs. */ if (glyph_surface->width == 0 || glyph_surface->height == 0) { cairo_t *cr; cairo_surface_t *tmp_surface; tmp_surface = cairo_image_surface_create (glyphset_info->format, 1, 1); if (tmp_surface->status) goto BAIL; cr = cairo_create (tmp_surface); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); tmp_surface->device_transform = glyph_surface->base.device_transform; tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; glyph_surface = (cairo_image_surface_t *) tmp_surface; if (status) goto BAIL; } /* If the glyph format does not match the font format, then we * create a temporary surface for the glyph image with the font's * format. */ if (glyph_surface->format != glyphset_info->format) { cairo_t *cr; cairo_surface_t *tmp_surface; tmp_surface = cairo_image_surface_create (glyphset_info->format, glyph_surface->width, glyph_surface->height); if (tmp_surface->status) goto BAIL; tmp_surface->device_transform = glyph_surface->base.device_transform; tmp_surface->device_transform_inverse = glyph_surface->base.device_transform_inverse; cr = cairo_create (tmp_surface); cairo_set_source_surface (cr, &glyph_surface->base, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); status = cairo_status (cr); cairo_destroy (cr); glyph_surface = (cairo_image_surface_t *) tmp_surface; if (status) goto BAIL; } /* XXX: FRAGILE: We're ignore device_transform scaling here. A bug? */ glyph_info.x = _cairo_lround (glyph_surface->base.device_transform.x0); glyph_info.y = _cairo_lround (glyph_surface->base.device_transform.y0); glyph_info.width = glyph_surface->width; glyph_info.height = glyph_surface->height; glyph_info.xOff = scaled_glyph->x_advance; glyph_info.yOff = scaled_glyph->y_advance; data = glyph_surface->data; /* flip formats around */ switch (scaled_glyph->surface->format) { case CAIRO_FORMAT_A1: /* local bitmaps are always stored with bit == byte */ if (_native_byte_order_lsb() != (BitmapBitOrder (dpy) == LSBFirst)) { int c = glyph_surface->stride * glyph_surface->height; unsigned char *d; unsigned char *new, *n; new = malloc (c); if (!new) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } n = new; d = data; while (c--) { char b = *d++; b = ((b << 1) & 0xaa) | ((b >> 1) & 0x55); b = ((b << 2) & 0xcc) | ((b >> 2) & 0x33); b = ((b << 4) & 0xf0) | ((b >> 4) & 0x0f); *n++ = b; } data = new; } break; case CAIRO_FORMAT_A8: break; case CAIRO_FORMAT_ARGB32: if (_native_byte_order_lsb() != (ImageByteOrder (dpy) == LSBFirst)) { unsigned int c = glyph_surface->stride * glyph_surface->height; unsigned char *d; unsigned char *new, *n; new = malloc (c); if (new == NULL) { status = _cairo_error (CAIRO_STATUS_NO_MEMORY); goto BAIL; } n = new; d = data; while (c >= 4) { n[3] = d[0]; n[2] = d[1]; n[1] = d[2]; n[0] = d[3]; d += 4; n += 4; c -= 4; } data = new; } break; case CAIRO_FORMAT_RGB24: default: ASSERT_NOT_REACHED; break; } /* XXX assume X server wants pixman padding. Xft assumes this as well */ glyph_index = _cairo_scaled_glyph_index (scaled_glyph); XRenderAddGlyphs (dpy, glyphset_info->glyphset, &glyph_index, &glyph_info, 1, (char *) data, glyph_surface->stride * glyph_surface->height); _cairo_xlib_scaled_glyph_set_glyphset_info (scaled_glyph, glyphset_info); if (data != glyph_surface->data) free (data); BAIL: if (glyph_surface != scaled_glyph->surface) cairo_surface_destroy (&glyph_surface->base); /* if the scaled glyph didn't already have a surface attached * to it, release the created surface now that we have it * uploaded to the X server. If the surface has already been * there (eg. because image backend requested it), leave it in * the cache */ if (!already_had_glyph_surface) _cairo_scaled_glyph_set_surface (scaled_glyph, scaled_font, NULL); return status; } typedef void (*cairo_xrender_composite_text_func_t) (Display *dpy, int op, Picture src, Picture dst, _Xconst XRenderPictFormat *maskFormat, int xSrc, int ySrc, int xDst, int yDst, _Xconst XGlyphElt8 *elts, int nelt); /* Build a struct of the same size of #cairo_glyph_t that can be used both as * an input glyph with double coordinates, and as "working" glyph with * integer from-current-point offsets. */ typedef struct { unsigned long index; union { struct { double x; double y; } d; struct { int x; int y; } i; } p; } cairo_xlib_glyph_t; /* compile-time assert that #cairo_xlib_glyph_t is the same size as #cairo_glyph_t */ typedef int cairo_xlib_glyph_t_size_assertion [sizeof (cairo_xlib_glyph_t) == sizeof (cairo_glyph_t) ? 1 : -1]; #define GLYPH_INDEX_SKIP ((unsigned long) -1) static cairo_status_t _cairo_xlib_surface_emit_glyphs_chunk (cairo_xlib_surface_t *dst, cairo_xlib_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_xlib_surface_t *src, cairo_surface_attributes_t *attributes, /* info for this chunk */ int num_elts, int width, cairo_xlib_font_glyphset_info_t *glyphset_info) { /* Which XRenderCompositeText function to use */ cairo_xrender_composite_text_func_t composite_text_func; int size; /* Element buffer stuff */ XGlyphElt8 *elts; XGlyphElt8 stack_elts[CAIRO_STACK_ARRAY_LENGTH (XGlyphElt8)]; /* Reuse the input glyph array for output char generation */ char *char8 = (char *) glyphs; unsigned short *char16 = (unsigned short *) glyphs; unsigned int *char32 = (unsigned int *) glyphs; int i; int nelt; /* Element index */ int n; /* Num output glyphs in current element */ int j; /* Num output glyphs so far */ switch (width) { case 1: /* don't cast the 8-variant, to catch possible mismatches */ composite_text_func = XRenderCompositeText8; size = sizeof (char); break; case 2: composite_text_func = (cairo_xrender_composite_text_func_t) XRenderCompositeText16; size = sizeof (unsigned short); break; default: case 4: composite_text_func = (cairo_xrender_composite_text_func_t) XRenderCompositeText32; size = sizeof (unsigned int); } /* Allocate element array */ if (num_elts <= ARRAY_LENGTH (stack_elts)) { elts = stack_elts; } else { elts = _cairo_malloc_ab (num_elts, sizeof (XGlyphElt8)); if (elts == NULL) return _cairo_error (CAIRO_STATUS_NO_MEMORY); } /* Fill them in */ nelt = 0; n = 0; j = 0; for (i = 0; i < num_glyphs; i++) { /* Skip glyphs marked so */ if (glyphs[i].index == GLYPH_INDEX_SKIP) continue; /* Start a new element for first output glyph, and for glyphs with * unexpected position */ if (!j || glyphs[i].p.i.x || glyphs[i].p.i.y) { if (j) { elts[nelt].nchars = n; nelt++; n = 0; } elts[nelt].chars = char8 + size * j; elts[nelt].glyphset = glyphset_info->glyphset; elts[nelt].xOff = glyphs[i].p.i.x; elts[nelt].yOff = glyphs[i].p.i.y; } switch (width) { case 1: char8 [j] = (char) glyphs[i].index; break; case 2: char16[j] = (unsigned short) glyphs[i].index; break; default: case 4: char32[j] = (unsigned int) glyphs[i].index; break; } n++; j++; } if (n) { elts[nelt].nchars = n; nelt++; n = 0; } composite_text_func (dst->dpy, _render_operator (op), src->src_picture, dst->dst_picture, glyphset_info->xrender_format, attributes->x_offset + elts[0].xOff, attributes->y_offset + elts[0].yOff, elts[0].xOff, elts[0].yOff, (XGlyphElt8 *) elts, nelt); if (elts != stack_elts) free (elts); return CAIRO_STATUS_SUCCESS; } static cairo_status_t _cairo_xlib_surface_emit_glyphs (cairo_xlib_surface_t *dst, cairo_xlib_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_xlib_surface_t *src, cairo_surface_attributes_t *attributes) { int i; cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_scaled_glyph_t *scaled_glyph; cairo_fixed_t x = 0, y = 0; cairo_xlib_font_glyphset_info_t *glyphset_info = NULL, *this_glyphset_info; unsigned long max_index = 0; int width = 1; int num_elts = 0; int num_out_glyphs = 0; int max_request_size = XMaxRequestSize (dst->dpy) - MAX (sz_xRenderCompositeGlyphs8Req, MAX(sz_xRenderCompositeGlyphs16Req, sz_xRenderCompositeGlyphs32Req)); int request_size = 0; _cairo_xlib_surface_ensure_dst_picture (dst); _cairo_xlib_display_notify (dst->screen_info->display); for (i = 0; i < num_glyphs; i++) { int this_x, this_y; int old_width; status = _cairo_scaled_glyph_lookup (scaled_font, glyphs[i].index, CAIRO_SCALED_GLYPH_INFO_METRICS, &scaled_glyph); if (status != CAIRO_STATUS_SUCCESS) return status; this_x = _cairo_lround (glyphs[i].p.d.x); this_y = _cairo_lround (glyphs[i].p.d.y); /* Glyph skipping: * * We skip any glyphs that have troublesome coordinates. We want * to make sure that (glyph2.x - (glyph1.x + glyph1.width)) fits in * a signed 16bit integer, otherwise it will overflow in the render * protocol. * To ensure this, we'll make sure that (glyph2.x - glyph1.x) fits in * a signed 15bit integer. The trivial option would be to allow * coordinates -8192..8192, but that's kinda dull. It probably will * take a decade or so to get monitors 8192x4096 or something. A * negative value of -8192 on the other hand, is absolutely useless. * Note that we do want to allow some negative positions. The glyph * may start off the screen but part of it make it to the screen. * Anyway, we will allow positions in the range -1024..15359. That * will buy us a few more years before this stops working. */ if (((this_x+1024)|(this_y+1024))&~0x3fffu) { glyphs[i].index = GLYPH_INDEX_SKIP; continue; } /* Send unsent glyphs to the server */ if (_cairo_xlib_scaled_glyph_get_glyphset_info (scaled_glyph) == NULL) { status = _cairo_xlib_surface_add_glyph (dst->dpy, scaled_font, &scaled_glyph); if (status) return status; } this_glyphset_info = _cairo_xlib_scaled_glyph_get_glyphset_info (scaled_glyph); if (!glyphset_info) glyphset_info = this_glyphset_info; old_width = width; /* Update max glyph index */ if (glyphs[i].index > max_index) { max_index = glyphs[i].index; if (max_index >= 65536) width = 4; else if (max_index >= 256) width = 2; if (width != old_width) request_size += (width - old_width) * num_out_glyphs; } /* If we will pass the max request size by adding this glyph, * flush current glyphs. Note that we account for a * possible element being added below. * * Also flush if changing glyphsets, as Xrender limits one mask * format per request, so we can either break up, or use a * wide-enough mask format. We do the former. One reason to * prefer the latter is the fact that Xserver ADDs all glyphs * to the mask first, and then composes that to final surface, * though it's not a big deal. */ if (request_size + width > max_request_size - sz_xGlyphElt || (this_glyphset_info != glyphset_info)) { status = _cairo_xlib_surface_emit_glyphs_chunk (dst, glyphs, i, scaled_font, op, src, attributes, num_elts, old_width, glyphset_info); if (status != CAIRO_STATUS_SUCCESS) return status; glyphs += i; num_glyphs -= i; i = 0; max_index = glyphs[i].index; width = max_index < 256 ? 1 : max_index < 65536 ? 2 : 4; request_size = 0; num_elts = 0; num_out_glyphs = 0; x = y = 0; glyphset_info = this_glyphset_info; } /* Convert absolute glyph position to relative-to-current-point * position */ glyphs[i].p.i.x = this_x - x; glyphs[i].p.i.y = this_y - y; /* Start a new element for the first glyph, or for any glyph that * has unexpected position */ if (!num_out_glyphs || glyphs[i].p.i.x || glyphs[i].p.i.y) { num_elts++; request_size += sz_xGlyphElt; } /* adjust current-position */ x = this_x + scaled_glyph->x_advance; y = this_y + scaled_glyph->y_advance; num_out_glyphs++; request_size += width; } if (num_elts) status = _cairo_xlib_surface_emit_glyphs_chunk (dst, glyphs, num_glyphs, scaled_font, op, src, attributes, num_elts, width, glyphset_info); return status; } #undef GLYPH_INDEX_SKIP static cairo_int_status_t _cairo_xlib_surface_show_glyphs (void *abstract_dst, cairo_operator_t op, cairo_pattern_t *src_pattern, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_int_status_t status = CAIRO_STATUS_SUCCESS; cairo_xlib_surface_t *dst = (cairo_xlib_surface_t*) abstract_dst; composite_operation_t operation; cairo_surface_attributes_t attributes; cairo_xlib_surface_t *src = NULL; cairo_xlib_surface_font_private_t *font_private; cairo_pattern_union_t solid_pattern; if (!CAIRO_SURFACE_RENDER_HAS_COMPOSITE_TEXT (dst) || !dst->xrender_format) return CAIRO_INT_STATUS_UNSUPPORTED; /* Just let unbounded operators go through the fallback code * instead of trying to do the fixups here */ if (!_cairo_operator_bounded_by_mask (op)) return CAIRO_INT_STATUS_UNSUPPORTED; /* Render <= 0.10 seems to have a bug with PictOpSrc and glyphs -- * the solid source seems to be multiplied by the glyph mask, and * then the entire thing is copied to the destination surface, * including the fully transparent "background" of the rectangular * glyph surface. */ if (op == CAIRO_OPERATOR_SOURCE && !CAIRO_SURFACE_RENDER_AT_LEAST(dst, 0, 11)) return CAIRO_INT_STATUS_UNSUPPORTED; /* We can only use our code if we either have no clip or * have a real native clip region set. If we're using * fallback clip masking, we have to go through the full * fallback path. */ if (dst->base.clip && (dst->base.clip->mode != CAIRO_CLIP_MODE_REGION || dst->base.clip->surface != NULL)) return CAIRO_INT_STATUS_UNSUPPORTED; operation = _categorize_composite_operation (dst, op, src_pattern, TRUE); if (operation == DO_UNSUPPORTED) return CAIRO_INT_STATUS_UNSUPPORTED; font_private = scaled_font->surface_private; if ((scaled_font->surface_backend != NULL && scaled_font->surface_backend != &cairo_xlib_surface_backend) || (font_private != NULL && font_private->dpy != dst->dpy)) return CAIRO_INT_STATUS_UNSUPPORTED; /* After passing all those tests, we're now committed to rendering * these glyphs or to fail trying. We first upload any glyphs to * the X server that it doesn't have already, then we draw * them. We tie into the scaled_font's glyph cache and remove * glyphs from the X server when they are ejected from the * scaled_font cache. Because of this we first freeze the * scaled_font's cache so that we don't cause any of our glyphs to * be ejected and removed from the X server before we have a * chance to render them. */ _cairo_scaled_font_freeze_cache (scaled_font); /* PictOpClear doesn't seem to work with CompositeText; it seems to ignore * the mask (the glyphs). This code below was executed as a side effect * of going through the _clip_and_composite fallback code for old_show_glyphs, * so PictOpClear was never used with CompositeText before. */ if (op == CAIRO_OPERATOR_CLEAR) { _cairo_pattern_init_solid (&solid_pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); src_pattern = &solid_pattern.base; op = CAIRO_OPERATOR_DEST_OUT; } if (src_pattern->type == CAIRO_PATTERN_TYPE_SOLID) { status = _cairo_pattern_acquire_surface (src_pattern, &dst->base, 0, 0, 1, 1, (cairo_surface_t **) &src, &attributes); if (status) goto BAIL0; } else { cairo_rectangle_int_t glyph_extents; status = _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, &glyph_extents); if (status) goto BAIL0; status = _cairo_pattern_acquire_surface (src_pattern, &dst->base, glyph_extents.x, glyph_extents.y, glyph_extents.width, glyph_extents.height, (cairo_surface_t **) &src, &attributes); if (status) goto BAIL0; } operation = _recategorize_composite_operation (dst, op, src, &attributes, TRUE); if (operation == DO_UNSUPPORTED) { status = CAIRO_INT_STATUS_UNSUPPORTED; goto BAIL1; } status = _cairo_xlib_surface_set_attributes (src, &attributes); if (status) goto BAIL1; status = _cairo_xlib_surface_emit_glyphs (dst, (cairo_xlib_glyph_t *) glyphs, num_glyphs, scaled_font, op, src, &attributes); BAIL1: if (src) _cairo_pattern_release_surface (src_pattern, &src->base, &attributes); if (src_pattern == &solid_pattern.base) _cairo_pattern_fini (&solid_pattern.base); BAIL0: _cairo_scaled_font_thaw_cache (scaled_font); _cairo_xlib_display_notify (dst->screen_info->display); return status; } libgdiplus-2.11/cairo/src/cairo-analysis-surface.c0000664000175000017500000005500312225470167017123 00000000000000/* * Copyright © 2006 Keith Packard * Copyright © 2007 Adrian Johnson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith Packard * Adrian Johnson */ #include "cairoint.h" #include "cairo-analysis-surface-private.h" #include "cairo-paginated-private.h" #include "cairo-region-private.h" #include "cairo-meta-surface-private.h" typedef struct { cairo_surface_t base; int width; int height; cairo_surface_t *target; cairo_bool_t first_op; cairo_bool_t has_supported; cairo_bool_t has_unsupported; cairo_region_t supported_region; cairo_region_t fallback_region; cairo_rectangle_int_t current_clip; cairo_box_t page_bbox; cairo_bool_t has_ctm; cairo_matrix_t ctm; } cairo_analysis_surface_t; static cairo_int_status_t _cairo_analysis_surface_analyze_meta_surface_pattern (cairo_analysis_surface_t *surface, cairo_pattern_t *pattern) { cairo_surface_t *analysis = &surface->base; cairo_surface_pattern_t *surface_pattern; cairo_status_t status; cairo_bool_t old_has_ctm; cairo_matrix_t old_ctm, p2d; cairo_rectangle_int_t old_clip; cairo_rectangle_int_t meta_extents; int old_width; int old_height; assert (pattern->type == CAIRO_PATTERN_TYPE_SURFACE); surface_pattern = (cairo_surface_pattern_t *) pattern; assert (_cairo_surface_is_meta (surface_pattern->surface)); old_width = surface->width; old_height = surface->height; old_clip = surface->current_clip; status = _cairo_surface_get_extents (surface_pattern->surface, &meta_extents); if (status) return status; surface->width = meta_extents.width; surface->height = meta_extents.height; surface->current_clip.x = 0; surface->current_clip.y = 0; surface->current_clip.width = surface->width; surface->current_clip.height = surface->height; old_ctm = surface->ctm; old_has_ctm = surface->has_ctm; p2d = pattern->matrix; status = cairo_matrix_invert (&p2d); /* _cairo_pattern_set_matrix guarantees invertibility */ assert (status == CAIRO_STATUS_SUCCESS); cairo_matrix_multiply (&surface->ctm, &p2d, &surface->ctm); surface->has_ctm = !_cairo_matrix_is_identity (&surface->ctm); status = _cairo_meta_surface_replay_and_create_regions (surface_pattern->surface, analysis); if (status == CAIRO_STATUS_SUCCESS) status = analysis->status; surface->ctm = old_ctm; surface->has_ctm = old_has_ctm; surface->current_clip = old_clip; surface->width = old_width; surface->height = old_height; return status; } static cairo_int_status_t _cairo_analysis_surface_add_operation (cairo_analysis_surface_t *surface, cairo_rectangle_int_t *rect, cairo_int_status_t backend_status) { cairo_int_status_t status; cairo_box_t bbox; if (rect->width == 0 || rect->height == 0) { /* Even though the operation is not visible we must be careful * to not allow unsupported operations to be replayed to the * backend during CAIRO_PAGINATED_MODE_RENDER */ if (backend_status == CAIRO_STATUS_SUCCESS || backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) { return CAIRO_STATUS_SUCCESS; } else { return CAIRO_INT_STATUS_IMAGE_FALLBACK; } } if (surface->has_ctm) { double x1, y1, x2, y2; x1 = rect->x; y1 = rect->y; x2 = rect->x + rect->width; y2 = rect->y + rect->height; _cairo_matrix_transform_bounding_box (&surface->ctm, &x1, &y1, &x2, &y2, NULL); rect->x = floor (x1); rect->y = floor (y1); x2 = ceil (x2) - rect->x; y2 = ceil (y2) - rect->y; if (x2 <= 0 || y2 <= 0) { /* Even though the operation is not visible we must be * careful to not allow unsupported operations to be * replayed to the backend during * CAIRO_PAGINATED_MODE_RENDER */ if (backend_status == CAIRO_STATUS_SUCCESS || backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) { return CAIRO_STATUS_SUCCESS; } else { return CAIRO_INT_STATUS_IMAGE_FALLBACK; } } rect->width = x2; rect->height = y2; } bbox.p1.x = _cairo_fixed_from_int (rect->x); bbox.p1.y = _cairo_fixed_from_int (rect->y); bbox.p2.x = _cairo_fixed_from_int (rect->x + rect->width); bbox.p2.y = _cairo_fixed_from_int (rect->y + rect->height); if (surface->first_op) { surface->first_op = FALSE; surface->page_bbox = bbox; } else { if (bbox.p1.x < surface->page_bbox.p1.x) surface->page_bbox.p1.x = bbox.p1.x; if (bbox.p1.y < surface->page_bbox.p1.y) surface->page_bbox.p1.y = bbox.p1.y; if (bbox.p2.x > surface->page_bbox.p2.x) surface->page_bbox.p2.x = bbox.p2.x; if (bbox.p2.y > surface->page_bbox.p2.y) surface->page_bbox.p2.y = bbox.p2.y; } /* If the operation is completely enclosed within the fallback * region there is no benefit in emitting a native operation as * the fallback image will be painted on top. */ if (_cairo_region_contains_rectangle (&surface->fallback_region, rect) == PIXMAN_REGION_IN) return CAIRO_INT_STATUS_IMAGE_FALLBACK; if (backend_status == CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY) { /* A status of CAIRO_INT_STATUS_FLATTEN_TRANSPARENCY indicates * that the backend only supports this operation if the * transparency removed. If the extents of this operation does * not intersect any other native operation, the operation is * natively supported and the backend will blend the * transparency into the white background. */ if (_cairo_region_contains_rectangle (&surface->supported_region, rect) == PIXMAN_REGION_OUT) backend_status = CAIRO_STATUS_SUCCESS; } if (backend_status == CAIRO_STATUS_SUCCESS) { /* Add the operation to the supported region. Operations in * this region will be emitted as native operations. */ surface->has_supported = TRUE; status = _cairo_region_union_rect (&surface->supported_region, &surface->supported_region, rect); return status; } /* Add the operation to the unsupported region. This region will * be painted as an image after all native operations have been * emitted. */ surface->has_unsupported = TRUE; status = _cairo_region_union_rect (&surface->fallback_region, &surface->fallback_region, rect); /* The status CAIRO_INT_STATUS_IMAGE_FALLBACK is used to indicate * unsupported operations to the meta surface as using * CAIRO_INT_STATUS_UNSUPPORTED would cause cairo-surface to * invoke the cairo-surface-fallback path then return * CAIRO_STATUS_SUCCESS. */ if (status == CAIRO_STATUS_SUCCESS) return CAIRO_INT_STATUS_IMAGE_FALLBACK; else return status; } static cairo_status_t _cairo_analysis_surface_finish (void *abstract_surface) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; _cairo_region_fini (&surface->supported_region); _cairo_region_fini (&surface->fallback_region); return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_analysis_surface_intersect_clip_path (void *abstract_surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_analysis_surface_t *surface = abstract_surface; double x1, y1, x2, y2; cairo_rectangle_int_t extent; if (path == NULL) { surface->current_clip.x = 0; surface->current_clip.y = 0; surface->current_clip.width = surface->width; surface->current_clip.height = surface->height; } else { cairo_status_t status; status = _cairo_path_fixed_bounds (path, &x1, &y1, &x2, &y2, tolerance); if (status) return status; extent.x = floor (x1); extent.y = floor (y1); extent.width = ceil (x2) - extent.x; extent.height = ceil (y2) - extent.y; _cairo_rectangle_intersect (&surface->current_clip, &extent); } return CAIRO_STATUS_SUCCESS; } static cairo_int_status_t _cairo_analysis_surface_get_extents (void *abstract_surface, cairo_rectangle_int_t *rectangle) { cairo_analysis_surface_t *surface = abstract_surface; return _cairo_surface_get_extents (surface->target, rectangle); } static cairo_int_status_t _cairo_analysis_surface_paint (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_rectangle_int_t extents; if (!surface->target->backend->paint) backend_status = CAIRO_INT_STATUS_UNSUPPORTED; else backend_status = (*surface->target->backend->paint) (surface->target, op, source); if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, source); status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } _cairo_rectangle_intersect (&extents, &surface->current_clip); status = _cairo_analysis_surface_add_operation (surface, &extents, backend_status); return status; } static cairo_int_status_t _cairo_analysis_surface_mask (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_rectangle_int_t extents; if (!surface->target->backend->mask) backend_status = CAIRO_INT_STATUS_UNSUPPORTED; else backend_status = (*surface->target->backend->mask) (surface->target, op, source, mask); if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) { if (source->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) source; if (_cairo_surface_is_meta (surface_pattern->surface)) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, source); if (backend_status != CAIRO_STATUS_SUCCESS && backend_status != CAIRO_INT_STATUS_IMAGE_FALLBACK) return backend_status; } if (mask->type == CAIRO_PATTERN_TYPE_SURFACE) { cairo_surface_pattern_t *surface_pattern = (cairo_surface_pattern_t *) mask; if (_cairo_surface_is_meta (surface_pattern->surface)) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, mask); if (backend_status != CAIRO_STATUS_SUCCESS && backend_status != CAIRO_INT_STATUS_IMAGE_FALLBACK) return backend_status; } } status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); status = _cairo_pattern_get_extents (mask, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } _cairo_rectangle_intersect (&extents, &surface->current_clip); status = _cairo_analysis_surface_add_operation (surface, &extents, backend_status); return status; } static cairo_int_status_t _cairo_analysis_surface_stroke (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_traps_t traps; cairo_box_t box; cairo_rectangle_int_t extents; if (!surface->target->backend->stroke) backend_status = CAIRO_INT_STATUS_UNSUPPORTED; else backend_status = (*surface->target->backend->stroke) (surface->target, op, source, path, style, ctm, ctm_inverse, tolerance, antialias); if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, source); status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } _cairo_rectangle_intersect (&extents, &surface->current_clip); if (_cairo_operator_bounded_by_mask (op)) { box.p1.x = _cairo_fixed_from_int (extents.x); box.p1.y = _cairo_fixed_from_int (extents.y); box.p2.x = _cairo_fixed_from_int (extents.x + extents.width); box.p2.y = _cairo_fixed_from_int (extents.y + extents.height); _cairo_traps_init (&traps); _cairo_traps_limit (&traps, &box); status = _cairo_path_fixed_stroke_to_traps (path, style, ctm, ctm_inverse, tolerance, &traps); if (status) { _cairo_traps_fini (&traps); return status; } if (traps.num_traps == 0) { extents.x = 0; extents.y = 0; extents.width = 0; extents.height = 0; } else { _cairo_traps_extents (&traps, &box); extents.x = _cairo_fixed_integer_floor (box.p1.x); extents.y = _cairo_fixed_integer_floor (box.p1.y); extents.width = _cairo_fixed_integer_ceil (box.p2.x) - extents.x; extents.height = _cairo_fixed_integer_ceil (box.p2.y) - extents.y; } _cairo_traps_fini (&traps); } status = _cairo_analysis_surface_add_operation (surface, &extents, backend_status); return status; } static cairo_int_status_t _cairo_analysis_surface_fill (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_traps_t traps; cairo_box_t box; cairo_rectangle_int_t extents; if (!surface->target->backend->fill) backend_status = CAIRO_INT_STATUS_UNSUPPORTED; else backend_status = (*surface->target->backend->fill) (surface->target, op, source, path, fill_rule, tolerance, antialias); if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, source); status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } _cairo_rectangle_intersect (&extents, &surface->current_clip); if (_cairo_operator_bounded_by_mask (op)) { box.p1.x = _cairo_fixed_from_int (extents.x); box.p1.y = _cairo_fixed_from_int (extents.y); box.p2.x = _cairo_fixed_from_int (extents.x + extents.width); box.p2.y = _cairo_fixed_from_int (extents.y + extents.height); _cairo_traps_init (&traps); _cairo_traps_limit (&traps, &box); status = _cairo_path_fixed_fill_to_traps (path, fill_rule, tolerance, &traps); if (status) { _cairo_traps_fini (&traps); return status; } if (traps.num_traps == 0) { extents.x = 0; extents.y = 0; extents.width = 0; extents.height = 0; } else { _cairo_traps_extents (&traps, &box); extents.x = _cairo_fixed_integer_floor (box.p1.x); extents.y = _cairo_fixed_integer_floor (box.p1.y); extents.width = _cairo_fixed_integer_ceil (box.p2.x) - extents.x; extents.height = _cairo_fixed_integer_ceil (box.p2.y) - extents.y; } _cairo_traps_fini (&traps); } status = _cairo_analysis_surface_add_operation (surface, &extents, backend_status); return status; } static cairo_int_status_t _cairo_analysis_surface_show_glyphs (void *abstract_surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_analysis_surface_t *surface = abstract_surface; cairo_status_t status, backend_status; cairo_rectangle_int_t extents, glyph_extents; if (!surface->target->backend->show_glyphs) backend_status = CAIRO_INT_STATUS_UNSUPPORTED; else backend_status = (*surface->target->backend->show_glyphs) (surface->target, op, source, glyphs, num_glyphs, scaled_font); if (backend_status == CAIRO_INT_STATUS_ANALYZE_META_SURFACE_PATTERN) backend_status = _cairo_analysis_surface_analyze_meta_surface_pattern (surface, source); status = _cairo_surface_get_extents (&surface->base, &extents); if (status) return status; if (_cairo_operator_bounded_by_source (op)) { cairo_rectangle_int_t source_extents; status = _cairo_pattern_get_extents (source, &source_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &source_extents); } _cairo_rectangle_intersect (&extents, &surface->current_clip); if (_cairo_operator_bounded_by_mask (op)) { status = _cairo_scaled_font_glyph_device_extents (scaled_font, glyphs, num_glyphs, &glyph_extents); if (status) return status; _cairo_rectangle_intersect (&extents, &glyph_extents); } status = _cairo_analysis_surface_add_operation (surface, &extents, backend_status); return status; } static const cairo_surface_backend_t cairo_analysis_surface_backend = { CAIRO_INTERNAL_SURFACE_TYPE_ANALYSIS, NULL, /* create_similar */ _cairo_analysis_surface_finish, NULL, /* acquire_source_image */ NULL, /* release_source_image */ NULL, /* acquire_dest_image */ NULL, /* release_dest_image */ NULL, /* clone_similar */ NULL, /* composite */ NULL, /* fill_rectangles */ NULL, /* composite_trapezoids */ NULL, /* copy_page */ NULL, /* show_page */ NULL, /* set_clip_region */ _cairo_analysis_surface_intersect_clip_path, _cairo_analysis_surface_get_extents, NULL, /* old_show_glyphs */ NULL, /* get_font_options */ NULL, /* flush */ NULL, /* mark_dirty_rectangle */ NULL, /* scaled_font_fini */ NULL, /* scaled_glyph_fini */ _cairo_analysis_surface_paint, _cairo_analysis_surface_mask, _cairo_analysis_surface_stroke, _cairo_analysis_surface_fill, _cairo_analysis_surface_show_glyphs, NULL, /* snapshot */ NULL, /* is_similar */ NULL, /* reset */ NULL, /* fill_stroke */ }; cairo_surface_t * _cairo_analysis_surface_create (cairo_surface_t *target, int width, int height) { cairo_analysis_surface_t *surface; surface = malloc (sizeof (cairo_analysis_surface_t)); if (surface == NULL) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY)); /* I believe the content type here is truly arbitrary. I'm quite * sure nothing will ever use this value. */ _cairo_surface_init (&surface->base, &cairo_analysis_surface_backend, CAIRO_CONTENT_COLOR_ALPHA); surface->width = width; surface->height = height; cairo_matrix_init_identity (&surface->ctm); surface->has_ctm = FALSE; surface->target = target; surface->first_op = TRUE; surface->has_supported = FALSE; surface->has_unsupported = FALSE; _cairo_region_init (&surface->supported_region); _cairo_region_init (&surface->fallback_region); surface->current_clip.x = 0; surface->current_clip.y = 0; surface->current_clip.width = width; surface->current_clip.height = height; return &surface->base; } cairo_region_t * _cairo_analysis_surface_get_supported (cairo_surface_t *abstract_surface) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; return &surface->supported_region; } cairo_region_t * _cairo_analysis_surface_get_unsupported (cairo_surface_t *abstract_surface) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; return &surface->fallback_region; } cairo_bool_t _cairo_analysis_surface_has_supported (cairo_surface_t *abstract_surface) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; return surface->has_supported; } cairo_bool_t _cairo_analysis_surface_has_unsupported (cairo_surface_t *abstract_surface) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; return surface->has_unsupported; } void _cairo_analysis_surface_get_bounding_box (cairo_surface_t *abstract_surface, cairo_box_t *bbox) { cairo_analysis_surface_t *surface = (cairo_analysis_surface_t *) abstract_surface; *bbox = surface->page_bbox; } libgdiplus-2.11/cairo/src/cairo-atomic-private.h0000664000175000017500000000563412225470167016610 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2007 Chris Wilson * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Chris Wilson */ #ifndef CAIRO_ATOMIC_PRIVATE_H #define CAIRO_ATOMIC_PRIVATE_H #if HAVE_CONFIG_H #include "config.h" #endif CAIRO_BEGIN_DECLS #define CAIRO_HAS_ATOMIC_OPS 1 #if CAIRO_HAS_INTEL_ATOMIC_PRIMITIVES typedef int cairo_atomic_int_t; # define _cairo_atomic_int_inc(x) ((void) __sync_fetch_and_add(x, 1)) # define _cairo_atomic_int_dec_and_test(x) (__sync_fetch_and_add(x, -1) == 1) # define _cairo_atomic_int_cmpxchg(x, oldv, newv) __sync_val_compare_and_swap (x, oldv, newv) #else # include "cairo-compiler-private.h" # undef CAIRO_HAS_ATOMIC_OPS typedef int cairo_atomic_int_t; cairo_private void _cairo_atomic_int_inc (int *x); cairo_private cairo_bool_t _cairo_atomic_int_dec_and_test (int *x); cairo_private int _cairo_atomic_int_cmpxchg (int *x, int oldv, int newv); #endif #ifdef CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER # include "cairo-compiler-private.h" cairo_private int _cairo_atomic_int_get (int *x); cairo_private void _cairo_atomic_int_set (int *x, int value); #else # define _cairo_atomic_int_get(x) (*x) # define _cairo_atomic_int_set(x, value) ((*x) = value) #endif #define _cairo_status_set_error(status, err) do { \ /* hide compiler warnings about cairo_status_t != int (gcc treats its as \ * an unsigned integer instead, and about ignoring the return value. */ \ int ret__ = _cairo_atomic_int_cmpxchg ((int *) status, CAIRO_STATUS_SUCCESS, err); \ (void) ret__; \ } while (0) CAIRO_END_DECLS #endif libgdiplus-2.11/cairo/src/cairo-surface.c0000664000175000017500000023216612225470167015311 00000000000000/* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */ /* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * Copyright © 2005 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #include "cairoint.h" #include "cairo-surface-fallback-private.h" #include "cairo-clip-private.h" #define DEFINE_NIL_SURFACE(status, name) \ const cairo_surface_t name = { \ &cairo_image_surface_backend, /* backend */ \ CAIRO_SURFACE_TYPE_IMAGE, \ CAIRO_CONTENT_COLOR, \ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ \ status, /* status */ \ FALSE, /* finished */ \ { 0, /* size */ \ 0, /* num_elements */ \ 0, /* element_size */ \ NULL, /* elements */ \ }, /* user_data */ \ { 1.0, 0.0, \ 0.0, 1.0, \ 0.0, 0.0 \ }, /* device_transform */ \ { 1.0, 0.0, \ 0.0, 1.0, \ 0.0, 0.0 \ }, /* device_transform_inverse */ \ 0.0, /* x_resolution */ \ 0.0, /* y_resolution */ \ 0.0, /* x_fallback_resolution */ \ 0.0, /* y_fallback_resolution */ \ NULL, /* clip */ \ 0, /* next_clip_serial */ \ 0, /* current_clip_serial */ \ FALSE, /* is_snapshot */ \ FALSE, /* has_font_options */ \ { CAIRO_ANTIALIAS_DEFAULT, \ CAIRO_SUBPIXEL_ORDER_DEFAULT, \ CAIRO_HINT_STYLE_DEFAULT, \ CAIRO_HINT_METRICS_DEFAULT \ } /* font_options */ \ } static DEFINE_NIL_SURFACE(CAIRO_STATUS_NO_MEMORY, _cairo_surface_nil); static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_CONTENT, _cairo_surface_nil_invalid_content); static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_FORMAT, _cairo_surface_nil_invalid_format); static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_VISUAL, _cairo_surface_nil_invalid_visual); static DEFINE_NIL_SURFACE(CAIRO_STATUS_FILE_NOT_FOUND, _cairo_surface_nil_file_not_found); static DEFINE_NIL_SURFACE(CAIRO_STATUS_TEMP_FILE_ERROR, _cairo_surface_nil_temp_file_error); static DEFINE_NIL_SURFACE(CAIRO_STATUS_READ_ERROR, _cairo_surface_nil_read_error); static DEFINE_NIL_SURFACE(CAIRO_STATUS_WRITE_ERROR, _cairo_surface_nil_write_error); static DEFINE_NIL_SURFACE(CAIRO_STATUS_INVALID_STRIDE, _cairo_surface_nil_invalid_stride); static cairo_status_t _cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern, cairo_surface_t *destination, cairo_pattern_t **pattern_out); /** * _cairo_surface_set_error: * @surface: a surface * @status: a status value indicating an error, (eg. not * CAIRO_STATUS_SUCCESS) * * Atomically sets surface->status to @status and calls _cairo_error; * * All assignments of an error status to surface->status should happen * through _cairo_surface_set_error(). Note that due to the nature of * the atomic operation, it is not safe to call this function on the * nil objects. * * The purpose of this function is to allow the user to set a * breakpoint in _cairo_error() to generate a stack trace for when the * user causes cairo to detect an error. * * Return value: the error status. **/ cairo_status_t _cairo_surface_set_error (cairo_surface_t *surface, cairo_status_t status) { if (status == CAIRO_STATUS_SUCCESS || status >= CAIRO_INT_STATUS_UNSUPPORTED) return status; /* Don't overwrite an existing error. This preserves the first * error, which is the most significant. */ _cairo_status_set_error (&surface->status, status); return _cairo_error (status); } /** * cairo_surface_get_type: * @surface: a #cairo_surface_t * * This function returns the type of the backend used to create * a surface. See #cairo_surface_type_t for available types. * * Return value: The type of @surface. * * Since: 1.2 **/ cairo_surface_type_t cairo_surface_get_type (cairo_surface_t *surface) { /* We don't use surface->backend->type here so that some of the * special "wrapper" surfaces such as cairo_paginated_surface_t * can override surface->type with the type of the "child" * surface. */ return surface->type; } slim_hidden_def (cairo_surface_get_type); /** * cairo_surface_get_content: * @surface: a #cairo_surface_t * * This function returns the content type of @surface which indicates * whether the surface contains color and/or alpha information. See * #cairo_content_t. * * Return value: The content type of @surface. * * Since: 1.2 **/ cairo_content_t cairo_surface_get_content (cairo_surface_t *surface) { return surface->content; } slim_hidden_def(cairo_surface_get_content); /** * cairo_surface_status: * @surface: a #cairo_surface_t * * Checks whether an error has previously occurred for this * surface. * * Return value: %CAIRO_STATUS_SUCCESS, %CAIRO_STATUS_NULL_POINTER, * %CAIRO_STATUS_NO_MEMORY, %CAIRO_STATUS_READ_ERROR, * %CAIRO_STATUS_INVALID_CONTENT, %CAIRO_STATUS_INVALID_FORMAT, or * %CAIRO_STATUS_INVALID_VISUAL. **/ cairo_status_t cairo_surface_status (cairo_surface_t *surface) { return surface->status; } slim_hidden_def (cairo_surface_status); void _cairo_surface_init (cairo_surface_t *surface, const cairo_surface_backend_t *backend, cairo_content_t content) { CAIRO_MUTEX_INITIALIZE (); surface->backend = backend; surface->content = content; surface->type = backend->type; CAIRO_REFERENCE_COUNT_INIT (&surface->ref_count, 1); surface->status = CAIRO_STATUS_SUCCESS; surface->finished = FALSE; _cairo_user_data_array_init (&surface->user_data); cairo_matrix_init_identity (&surface->device_transform); cairo_matrix_init_identity (&surface->device_transform_inverse); surface->x_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; surface->y_resolution = CAIRO_SURFACE_RESOLUTION_DEFAULT; surface->x_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; surface->y_fallback_resolution = CAIRO_SURFACE_FALLBACK_RESOLUTION_DEFAULT; surface->clip = NULL; surface->next_clip_serial = 0; surface->current_clip_serial = 0; surface->is_snapshot = FALSE; surface->has_font_options = FALSE; } cairo_surface_t * _cairo_surface_create_similar_scratch (cairo_surface_t *other, cairo_content_t content, int width, int height) { cairo_surface_t *surface = NULL; cairo_font_options_t options; cairo_format_t format = _cairo_format_from_content (content); if (other->status) return _cairo_surface_create_in_error (other->status); if (other->backend->create_similar) { surface = other->backend->create_similar (other, content, width, height); /* It's not an error if the backend didn't create a valid * surface---it may just not be supported. */ if (surface && surface->status) { cairo_surface_destroy (surface); surface = NULL; } } if (surface == NULL) surface = cairo_image_surface_create (format, width, height); /* If any error occurred, then return the nil surface we received. */ if (surface->status) return surface; cairo_surface_get_font_options (other, &options); _cairo_surface_set_font_options (surface, &options); cairo_surface_set_fallback_resolution (surface, other->x_fallback_resolution, other->y_fallback_resolution); return surface; } /** * cairo_surface_create_similar: * @other: an existing surface used to select the backend of the new surface * @content: the content for the new surface * @width: width of the new surface, (in device-space units) * @height: height of the new surface (in device-space units) * * Create a new surface that is as compatible as possible with an * existing surface. For example the new surface will have the same * fallback resolution and font options as @other. Generally, the new * surface will also use the same backend as @other, unless that is * not possible for some reason. The type of the returned surface may * be examined with cairo_surface_get_type(). * * Initially the surface contents are all 0 (transparent if contents * have transparency, black otherwise.) * * Return value: a pointer to the newly allocated surface. The caller * owns the surface and should call cairo_surface_destroy() when done * with it. * * This function always returns a valid pointer, but it will return a * pointer to a "nil" surface if @other is already in an error state * or any other error occurs. **/ cairo_surface_t * cairo_surface_create_similar (cairo_surface_t *other, cairo_content_t content, int width, int height) { if (other->status) return _cairo_surface_create_in_error (other->status); if (! CAIRO_CONTENT_VALID (content)) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_INVALID_CONTENT)); return _cairo_surface_create_similar_solid (other, content, width, height, CAIRO_COLOR_TRANSPARENT, NULL); } slim_hidden_def (cairo_surface_create_similar); cairo_surface_t * _cairo_surface_create_similar_solid (cairo_surface_t *other, cairo_content_t content, int width, int height, const cairo_color_t *color, cairo_pattern_t *pattern) { cairo_status_t status; cairo_surface_t *surface; cairo_pattern_t *source; surface = _cairo_surface_create_similar_scratch (other, content, width, height); if (surface->status) return surface; if (pattern == NULL) { source = _cairo_pattern_create_solid (color, content); if (source->status) { cairo_surface_destroy (surface); return _cairo_surface_create_in_error (source->status); } } else source = pattern; status = _cairo_surface_paint (surface, color == CAIRO_COLOR_TRANSPARENT ? CAIRO_OPERATOR_CLEAR : CAIRO_OPERATOR_SOURCE, source); if (source != pattern) cairo_pattern_destroy (source); if (status) { cairo_surface_destroy (surface); return _cairo_surface_create_in_error (status); } return surface; } cairo_clip_mode_t _cairo_surface_get_clip_mode (cairo_surface_t *surface) { if (surface->backend->intersect_clip_path != NULL) return CAIRO_CLIP_MODE_PATH; else if (surface->backend->set_clip_region != NULL) return CAIRO_CLIP_MODE_REGION; else return CAIRO_CLIP_MODE_MASK; } /** * cairo_surface_reference: * @surface: a #cairo_surface_t * * Increases the reference count on @surface by one. This prevents * @surface from being destroyed until a matching call to * cairo_surface_destroy() is made. * * The number of references to a #cairo_surface_t can be get using * cairo_surface_get_reference_count(). * * Return value: the referenced #cairo_surface_t. **/ cairo_surface_t * cairo_surface_reference (cairo_surface_t *surface) { if (surface == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return surface; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); _cairo_reference_count_inc (&surface->ref_count); return surface; } slim_hidden_def (cairo_surface_reference); /** * cairo_surface_destroy: * @surface: a #cairo_surface_t * * Decreases the reference count on @surface by one. If the result is * zero, then @surface and all associated resources are freed. See * cairo_surface_reference(). **/ void cairo_surface_destroy (cairo_surface_t *surface) { if (surface == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return; assert (CAIRO_REFERENCE_COUNT_HAS_REFERENCE (&surface->ref_count)); if (! _cairo_reference_count_dec_and_test (&surface->ref_count)) return; if (! surface->finished) cairo_surface_finish (surface); _cairo_user_data_array_fini (&surface->user_data); free (surface); } slim_hidden_def(cairo_surface_destroy); /** * cairo_surface_reset: * @surface: a #cairo_surface_t * * Resets the surface back to defaults such that it may be reused in lieu * of creating a new surface. **/ cairo_status_t _cairo_surface_reset (cairo_surface_t *surface) { if (surface == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return CAIRO_STATUS_SUCCESS; assert (CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count) == 1); _cairo_user_data_array_fini (&surface->user_data); if (surface->backend->reset != NULL) { cairo_status_t status = surface->backend->reset (surface); if (status) return _cairo_surface_set_error (surface, status); } _cairo_surface_init (surface, surface->backend, surface->content); return CAIRO_STATUS_SUCCESS; } /** * cairo_surface_get_reference_count: * @surface: a #cairo_surface_t * * Returns the current reference count of @surface. * * Return value: the current reference count of @surface. If the * object is a nil object, 0 will be returned. * * Since: 1.4 **/ unsigned int cairo_surface_get_reference_count (cairo_surface_t *surface) { if (surface == NULL || CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return 0; return CAIRO_REFERENCE_COUNT_GET_VALUE (&surface->ref_count); } /** * cairo_surface_finish: * @surface: the #cairo_surface_t to finish * * This function finishes the surface and drops all references to * external resources. For example, for the Xlib backend it means * that cairo will no longer access the drawable, which can be freed. * After calling cairo_surface_finish() the only valid operations on a * surface are getting and setting user data and referencing and * destroying it. Further drawing to the surface will not affect the * surface but will instead trigger a CAIRO_STATUS_SURFACE_FINISHED * error. * * When the last call to cairo_surface_destroy() decreases the * reference count to zero, cairo will call cairo_surface_finish() if * it hasn't been called already, before freeing the resources * associated with the surface. **/ void cairo_surface_finish (cairo_surface_t *surface) { cairo_status_t status; if (surface == NULL) return; if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } if (surface->backend->finish == NULL) { surface->finished = TRUE; return; } if (!surface->status && surface->backend->flush) { status = surface->backend->flush (surface); if (status) { status = _cairo_surface_set_error (surface, status); return; } } status = surface->backend->finish (surface); if (status) status = _cairo_surface_set_error (surface, status); surface->finished = TRUE; } slim_hidden_def (cairo_surface_finish); /** * cairo_surface_get_user_data: * @surface: a #cairo_surface_t * @key: the address of the #cairo_user_data_key_t the user data was * attached to * * Return user data previously attached to @surface using the specified * key. If no user data has been attached with the given key this * function returns %NULL. * * Return value: the user data previously attached or %NULL. **/ void * cairo_surface_get_user_data (cairo_surface_t *surface, const cairo_user_data_key_t *key) { return _cairo_user_data_array_get_data (&surface->user_data, key); } /** * cairo_surface_set_user_data: * @surface: a #cairo_surface_t * @key: the address of a #cairo_user_data_key_t to attach the user data to * @user_data: the user data to attach to the surface * @destroy: a #cairo_destroy_func_t which will be called when the * surface is destroyed or when new user data is attached using the * same key. * * Attach user data to @surface. To remove user data from a surface, * call this function with the key that was used to set it and %NULL * for @data. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY if a * slot could not be allocated for the user data. **/ cairo_status_t cairo_surface_set_user_data (cairo_surface_t *surface, const cairo_user_data_key_t *key, void *user_data, cairo_destroy_func_t destroy) { if (CAIRO_REFERENCE_COUNT_IS_INVALID (&surface->ref_count)) return _cairo_error (CAIRO_STATUS_NO_MEMORY); return _cairo_user_data_array_set_data (&surface->user_data, key, user_data, destroy); } /** * _cairo_surface_set_font_options: * @surface: a #cairo_surface_t * @options: a #cairo_font_options_t object that contains the * options to use for this surface instead of backend's default * font options. * * Sets the default font rendering options for the surface. * This is useful to correctly propagate default font options when * falling back to an image surface in a backend implementation. * This affects the options returned in cairo_surface_get_font_options(). * * If @options is %NULL the surface options are reset to those of * the backend default. **/ void _cairo_surface_set_font_options (cairo_surface_t *surface, cairo_font_options_t *options) { cairo_status_t status; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } if (options) { surface->has_font_options = TRUE; _cairo_font_options_init_copy (&surface->font_options, options); } else { surface->has_font_options = FALSE; } } /** * cairo_surface_get_font_options: * @surface: a #cairo_surface_t * @options: a #cairo_font_options_t object into which to store * the retrieved options. All existing values are overwritten * * Retrieves the default font rendering options for the surface. * This allows display surfaces to report the correct subpixel order * for rendering on them, print surfaces to disable hinting of * metrics and so forth. The result can then be used with * cairo_scaled_font_create(). **/ void cairo_surface_get_font_options (cairo_surface_t *surface, cairo_font_options_t *options) { if (cairo_font_options_status (options)) return; if (!surface->has_font_options) { surface->has_font_options = TRUE; _cairo_font_options_init_default (&surface->font_options); if (!surface->finished && surface->backend->get_font_options) { surface->backend->get_font_options (surface, &surface->font_options); } } _cairo_font_options_init_copy (options, &surface->font_options); } slim_hidden_def (cairo_surface_get_font_options); /** * cairo_surface_flush: * @surface: a #cairo_surface_t * * Do any pending drawing for the surface and also restore any * temporary modification's cairo has made to the surface's * state. This function must be called before switching from * drawing on the surface with cairo to drawing on it directly * with native APIs. If the surface doesn't support direct access, * then this function does nothing. **/ void cairo_surface_flush (cairo_surface_t *surface) { cairo_status_t status; if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } if (surface->backend->flush) { status = surface->backend->flush (surface); if (status) status = _cairo_surface_set_error (surface, status); } } /** * cairo_surface_mark_dirty: * @surface: a #cairo_surface_t * * Tells cairo that drawing has been done to surface using means other * than cairo, and that cairo should reread any cached areas. Note * that you must call cairo_surface_flush() before doing such drawing. */ void cairo_surface_mark_dirty (cairo_surface_t *surface) { assert (! surface->is_snapshot); cairo_surface_mark_dirty_rectangle (surface, 0, 0, -1, -1); } /** * cairo_surface_mark_dirty_rectangle: * @surface: a #cairo_surface_t * @x: X coordinate of dirty rectangle * @y: Y coordinate of dirty rectangle * @width: width of dirty rectangle * @height: height of dirty rectangle * * Like cairo_surface_mark_dirty(), but drawing has been done only to * the specified rectangle, so that cairo can retain cached contents * for other parts of the surface. * * Any cached clip set on the surface will be reset by this function, * to make sure that future cairo calls have the clip set that they * expect. */ void cairo_surface_mark_dirty_rectangle (cairo_surface_t *surface, int x, int y, int width, int height) { cairo_status_t status; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } /* Always reset the clip here, to avoid having external calls to * clip manipulation functions of the underlying device clip result * in a desync between the cairo clip and the backend clip, due to * the clip caching. */ surface->current_clip_serial = -1; if (surface->backend->mark_dirty_rectangle) { /* XXX: FRAGILE: We're ignoring the scaling component of * device_transform here. I don't know what the right thing to * do would actually be if there were some scaling here, but * we avoid this since device_transfom scaling is not exported * publicly and mark_dirty is not used internally. */ status = surface->backend->mark_dirty_rectangle (surface, x + surface->device_transform.x0, y + surface->device_transform.y0, width, height); if (status) status = _cairo_surface_set_error (surface, status); } } slim_hidden_def (cairo_surface_mark_dirty_rectangle); /** * _cairo_surface_set_device_scale: * @surface: a #cairo_surface_t * @sx: a scale factor in the X direction * @sy: a scale factor in the Y direction * * Private function for setting an extra scale factor to affect all * drawing to a surface. This is used, for example, when replaying a * meta surface to an image fallback intended for an eventual * vector-oriented backend. Since the meta surface will record * coordinates in one backend space, but the image fallback uses a * different backend space, (differing by the fallback resolution * scale factors), we need a scale factor correction. * * Caution: There is no guarantee that a surface with both a * device_scale and a device_offset will be treated in consistent * fashion. So, for now, just don't do that. (And we'll need to * examine this issue in more detail if we were to ever want to export * support for device scaling.) **/ void _cairo_surface_set_device_scale (cairo_surface_t *surface, double sx, double sy) { cairo_status_t status; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } surface->device_transform.xx = sx; surface->device_transform.yy = sy; surface->device_transform_inverse.xx = 1.0 / sx; surface->device_transform_inverse.yy = 1.0 / sy; } /** * cairo_surface_set_device_offset: * @surface: a #cairo_surface_t * @x_offset: the offset in the X direction, in device units * @y_offset: the offset in the Y direction, in device units * * Sets an offset that is added to the device coordinates determined * by the CTM when drawing to @surface. One use case for this function * is when we want to create a #cairo_surface_t that redirects drawing * for a portion of an onscreen surface to an offscreen surface in a * way that is completely invisible to the user of the cairo * API. Setting a transformation via cairo_translate() isn't * sufficient to do this, since functions like * cairo_device_to_user() will expose the hidden offset. * * Note that the offset affects drawing to the surface as well as * using the surface in a source pattern. **/ void cairo_surface_set_device_offset (cairo_surface_t *surface, double x_offset, double y_offset) { cairo_status_t status; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } surface->device_transform.x0 = x_offset; surface->device_transform.y0 = y_offset; surface->device_transform_inverse.x0 = - x_offset; surface->device_transform_inverse.y0 = - y_offset; } slim_hidden_def (cairo_surface_set_device_offset); /** * cairo_surface_get_device_offset: * @surface: a #cairo_surface_t * @x_offset: the offset in the X direction, in device units * @y_offset: the offset in the Y direction, in device units * * This function returns the previous device offset set by * cairo_surface_set_device_offset(). * * Since: 1.2 **/ void cairo_surface_get_device_offset (cairo_surface_t *surface, double *x_offset, double *y_offset) { if (x_offset) *x_offset = surface->device_transform.x0; if (y_offset) *y_offset = surface->device_transform.y0; } slim_hidden_def (cairo_surface_get_device_offset); /** * cairo_surface_set_fallback_resolution: * @surface: a #cairo_surface_t * @x_pixels_per_inch: horizontal setting for pixels per inch * @y_pixels_per_inch: vertical setting for pixels per inch * * Set the horizontal and vertical resolution for image fallbacks. * * When certain operations aren't supported natively by a backend, * cairo will fallback by rendering operations to an image and then * overlaying that image onto the output. For backends that are * natively vector-oriented, this function can be used to set the * resolution used for these image fallbacks, (larger values will * result in more detailed images, but also larger file sizes). * * Some examples of natively vector-oriented backends are the ps, pdf, * and svg backends. * * For backends that are natively raster-oriented, image fallbacks are * still possible, but they are always performed at the native * device resolution. So this function has no effect on those * backends. * * Note: The fallback resolution only takes effect at the time of * completing a page (with cairo_show_page() or cairo_copy_page()) so * there is currently no way to have more than one fallback resolution * in effect on a single page. * * The default fallback resoultion is 300 pixels per inch in both * dimensions. * * Since: 1.2 **/ void cairo_surface_set_fallback_resolution (cairo_surface_t *surface, double x_pixels_per_inch, double y_pixels_per_inch) { cairo_status_t status; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } surface->x_fallback_resolution = x_pixels_per_inch; surface->y_fallback_resolution = y_pixels_per_inch; } slim_hidden_def (cairo_surface_set_fallback_resolution); cairo_bool_t _cairo_surface_has_device_transform (cairo_surface_t *surface) { return ! _cairo_matrix_is_identity (&surface->device_transform); } /** * _cairo_surface_acquire_source_image: * @surface: a #cairo_surface_t * @image_out: location to store a pointer to an image surface that * has identical contents to @surface. This surface could be @surface * itself, a surface held internal to @surface, or it could be a new * surface with a copy of the relevant portion of @surface. * @image_extra: location to store image specific backend data * * Gets an image surface to use when drawing as a fallback when drawing with * @surface as a source. _cairo_surface_release_source_image() must be called * when finished. * * Return value: %CAIRO_STATUS_SUCCESS if an image was stored in @image_out. * %CAIRO_INT_STATUS_UNSUPPORTED if an image cannot be retrieved for the specified * surface. Or %CAIRO_STATUS_NO_MEMORY. **/ cairo_status_t _cairo_surface_acquire_source_image (cairo_surface_t *surface, cairo_image_surface_t **image_out, void **image_extra) { assert (!surface->finished); if (surface->status) return surface->status; if (surface->backend->acquire_source_image == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; return _cairo_surface_set_error (surface, surface->backend->acquire_source_image (surface, image_out, image_extra)); } /** * _cairo_surface_release_source_image: * @surface: a #cairo_surface_t * @image_extra: same as return from the matching _cairo_surface_acquire_source_image() * * Releases any resources obtained with _cairo_surface_acquire_source_image() **/ void _cairo_surface_release_source_image (cairo_surface_t *surface, cairo_image_surface_t *image, void *image_extra) { assert (!surface->finished); if (surface->backend->release_source_image) surface->backend->release_source_image (surface, image, image_extra); } /** * _cairo_surface_acquire_dest_image: * @surface: a #cairo_surface_t * @interest_rect: area of @surface for which fallback drawing is being done. * A value of %NULL indicates that the entire surface is desired. * XXXX I'd like to get rid of being able to pass %NULL here (nothing seems to) * @image_out: location to store a pointer to an image surface that includes at least * the intersection of @interest_rect with the visible area of @surface. * This surface could be @surface itself, a surface held internal to @surface, * or it could be a new surface with a copy of the relevant portion of @surface. * If a new surface is created, it should have the same channels and depth * as @surface so that copying to and from it is exact. * @image_rect: location to store area of the original surface occupied * by the surface stored in @image. * @image_extra: location to store image specific backend data * * Retrieves a local image for a surface for implementing a fallback drawing * operation. After calling this function, the implementation of the fallback * drawing operation draws the primitive to the surface stored in @image_out * then calls _cairo_surface_release_dest_image(), * which, if a temporary surface was created, copies the bits back to the * main surface and frees the temporary surface. * * Return value: %CAIRO_STATUS_SUCCESS or %CAIRO_STATUS_NO_MEMORY. * %CAIRO_INT_STATUS_UNSUPPORTED can be returned but this will mean that * the backend can't draw with fallbacks. It's possible for the routine * to store %NULL in @local_out and return %CAIRO_STATUS_SUCCESS; * that indicates that no part of @interest_rect is visible, so no drawing * is necessary. _cairo_surface_release_dest_image() should not be called in that * case. **/ cairo_status_t _cairo_surface_acquire_dest_image (cairo_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t **image_out, cairo_rectangle_int_t *image_rect, void **image_extra) { assert (!surface->finished); if (surface->status) return surface->status; if (surface->backend->acquire_dest_image == NULL) return CAIRO_INT_STATUS_UNSUPPORTED; return _cairo_surface_set_error (surface, surface->backend->acquire_dest_image (surface, interest_rect, image_out, image_rect, image_extra)); } /** * _cairo_surface_release_dest_image: * @surface: a #cairo_surface_t * @interest_rect: same as passed to the matching _cairo_surface_acquire_dest_image() * @image: same as returned from the matching _cairo_surface_acquire_dest_image() * @image_rect: same as returned from the matching _cairo_surface_acquire_dest_image() * @image_extra: same as return from the matching _cairo_surface_acquire_dest_image() * * Finishes the operation started with _cairo_surface_acquire_dest_image(), by, if * necessary, copying the image from @image back to @surface and freeing any * resources that were allocated. **/ void _cairo_surface_release_dest_image (cairo_surface_t *surface, cairo_rectangle_int_t *interest_rect, cairo_image_surface_t *image, cairo_rectangle_int_t *image_rect, void *image_extra) { assert (!surface->finished); if (surface->backend->release_dest_image) surface->backend->release_dest_image (surface, interest_rect, image, image_rect, image_extra); } /** * _cairo_surface_clone_similar: * @surface: a #cairo_surface_t * @src: the source image * @src_x: extent for the rectangle in src we actually care about * @src_y: extent for the rectangle in src we actually care about * @width: extent for the rectangle in src we actually care about * @height: extent for the rectangle in src we actually care about * @clone_out: location to store a surface compatible with @surface * and with contents identical to @src. The caller must call * cairo_surface_destroy() on the result. * * Creates a surface with contents identical to @src but that * can be used efficiently with @surface. If @surface and @src are * already compatible then it may return a new reference to @src. * * Return value: %CAIRO_STATUS_SUCCESS if a surface was created and stored * in @clone_out. Otherwise %CAIRO_INT_STATUS_UNSUPPORTED or another * error like %CAIRO_STATUS_NO_MEMORY. **/ cairo_status_t _cairo_surface_clone_similar (cairo_surface_t *surface, cairo_surface_t *src, int src_x, int src_y, int width, int height, cairo_surface_t **clone_out) { cairo_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; cairo_image_surface_t *image; void *image_extra; if (surface->status) return surface->status; if (surface->finished) return _cairo_error (CAIRO_STATUS_SURFACE_FINISHED); if (surface->backend->clone_similar) { status = surface->backend->clone_similar (surface, src, src_x, src_y, width, height, clone_out); if (status == CAIRO_INT_STATUS_UNSUPPORTED) { /* If we failed, try again with an image surface */ status = _cairo_surface_acquire_source_image (src, &image, &image_extra); if (status == CAIRO_STATUS_SUCCESS) { status = surface->backend->clone_similar (surface, &image->base, src_x, src_y, width, height, clone_out); _cairo_surface_release_source_image (src, image, image_extra); } } } /* If we're still unsupported, hit our fallback path to get a clone */ if (status == CAIRO_INT_STATUS_UNSUPPORTED) status = _cairo_surface_fallback_clone_similar (surface, src, src_x, src_y, width, height, clone_out); /* We should never get UNSUPPORTED here, so if we have an error, bail. */ if (status) return status; /* Update the clone's device_transform (which the underlying surface * backend knows nothing about) */ if (*clone_out != src) { (*clone_out)->device_transform = src->device_transform; (*clone_out)->device_transform_inverse = src->device_transform_inverse; } return status; } /* XXX: Shouldn't really need to do this here. */ #include "cairo-meta-surface-private.h" /** * _cairo_surface_snapshot * @surface: a #cairo_surface_t * * Make an immutable copy of @surface. It is an error to call a * surface-modifying function on the result of this function. * * The caller owns the return value and should call * cairo_surface_destroy when finished with it. This function will not * return %NULL, but will return a nil surface instead. * * Return value: The snapshot surface. Note that the return surface * may not necessarily be of the same type as @surface. **/ cairo_surface_t * _cairo_surface_snapshot (cairo_surface_t *surface) { if (surface->status) return _cairo_surface_create_in_error (surface->status); if (surface->finished) return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_SURFACE_FINISHED)); if (surface->backend->snapshot) return surface->backend->snapshot (surface); return _cairo_surface_fallback_snapshot (surface); } /** * _cairo_surface_is_similar * @surface_a: a #cairo_surface_t * @surface_b: a #cairo_surface_t * @content: a #cairo_content_t * * Find out whether the given surfaces share the same backend, * and if so, whether they can be considered similar. * * The definition of "similar" depends on the backend. In * general, it means that the surface is equivalent to one * that would have been generated by a call to cairo_surface_create_similar(). * * Return value: %TRUE if the surfaces are similar. **/ cairo_bool_t _cairo_surface_is_similar (cairo_surface_t *surface_a, cairo_surface_t *surface_b, cairo_content_t content) { if (surface_a->backend != surface_b->backend) return FALSE; if (surface_a->backend->is_similar != NULL) return surface_a->backend->is_similar (surface_a, surface_b, content); return TRUE; } cairo_status_t _cairo_surface_composite (cairo_operator_t op, cairo_pattern_t *src, cairo_pattern_t *mask, cairo_surface_t *dst, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_int_status_t status; assert (! dst->is_snapshot); if (mask) { /* These operators aren't interpreted the same way by the backends; * they are implemented in terms of other operators in cairo-gstate.c */ assert (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_CLEAR); } if (dst->status) return dst->status; if (dst->finished) return _cairo_surface_set_error (dst, CAIRO_STATUS_SURFACE_FINISHED); if (dst->backend->composite) { status = dst->backend->composite (op, src, mask, dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_surface_set_error (dst, status); } return _cairo_surface_set_error (dst, _cairo_surface_fallback_composite (op, src, mask, dst, src_x, src_y, mask_x, mask_y, dst_x, dst_y, width, height)); } /** * _cairo_surface_fill_rectangle: * @surface: a #cairo_surface_t * @op: the operator to apply to the rectangle * @color: the source color * @x: X coordinate of rectangle, in backend coordinates * @y: Y coordinate of rectangle, in backend coordinates * @width: width of rectangle, in backend coordinates * @height: height of rectangle, in backend coordinates * * Applies an operator to a rectangle using a solid color as the source. * See _cairo_surface_fill_rectangles() for full details. * * Return value: %CAIRO_STATUS_SUCCESS or the error that occurred **/ cairo_status_t _cairo_surface_fill_rectangle (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, int x, int y, int width, int height) { cairo_rectangle_int_t rect; assert (! surface->is_snapshot); if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); rect.x = x; rect.y = y; rect.width = width; rect.height = height; return _cairo_surface_fill_rectangles (surface, op, color, &rect, 1); } /** * _cairo_surface_fill_region: * @surface: a #cairo_surface_t * @op: the operator to apply to the region * @color: the source color * @region: the region to modify, in backend coordinates * * Applies an operator to a set of rectangles specified as a * #cairo_region_t using a solid color as the source. * See _cairo_surface_fill_rectangles() for full details. * * Return value: %CAIRO_STATUS_SUCCESS or the error that occurred **/ cairo_status_t _cairo_surface_fill_region (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_region_t *region) { int num_boxes; cairo_box_int_t *boxes = NULL; cairo_rectangle_int_t stack_rects[CAIRO_STACK_ARRAY_LENGTH (cairo_rectangle_int_t)]; cairo_rectangle_int_t *rects = stack_rects; cairo_status_t status; int i; assert (! surface->is_snapshot); if (surface->status) return surface->status; num_boxes = _cairo_region_num_boxes (region); if (num_boxes == 0) return CAIRO_STATUS_SUCCESS; /* handle the common case of a single box without allocation */ if (num_boxes > 1) { status = _cairo_region_get_boxes (region, &num_boxes, &boxes); if (status) return status; if (num_boxes > ARRAY_LENGTH (stack_rects)) { rects = _cairo_malloc_ab (num_boxes, sizeof (cairo_rectangle_int_t)); if (!rects) { _cairo_region_boxes_fini (region, boxes); return _cairo_surface_set_error (surface, CAIRO_STATUS_NO_MEMORY); } } for (i = 0; i < num_boxes; i++) { rects[i].x = boxes[i].p1.x; rects[i].y = boxes[i].p1.y; rects[i].width = boxes[i].p2.x - boxes[i].p1.x; rects[i].height = boxes[i].p2.y - boxes[i].p1.y; } } else _cairo_region_get_extents (region, &rects[0]); status = _cairo_surface_fill_rectangles (surface, op, color, rects, num_boxes); if (boxes != NULL) _cairo_region_boxes_fini (region, boxes); if (rects != stack_rects) free (rects); return _cairo_surface_set_error (surface, status); } /** * _cairo_surface_fill_rectangles: * @surface: a #cairo_surface_t * @op: the operator to apply to the region * @color: the source color * @rects: the rectangles to modify, in backend coordinates * @num_rects: the number of rectangles in @rects * * Applies an operator to a set of rectangles using a solid color * as the source. Note that even if the operator is an unbounded operator * such as %CAIRO_OPERATOR_IN, only the given set of rectangles * is affected. This differs from _cairo_surface_composite_trapezoids() * where the entire destination rectangle is cleared. * * Return value: %CAIRO_STATUS_SUCCESS or the error that occurred **/ cairo_status_t _cairo_surface_fill_rectangles (cairo_surface_t *surface, cairo_operator_t op, const cairo_color_t *color, cairo_rectangle_int_t *rects, int num_rects) { cairo_int_status_t status; assert (! surface->is_snapshot); if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); if (num_rects == 0) return CAIRO_STATUS_SUCCESS; if (surface->backend->fill_rectangles) { status = surface->backend->fill_rectangles (surface, op, color, rects, num_rects); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_surface_set_error (surface, status); } return _cairo_surface_set_error (surface, _cairo_surface_fallback_fill_rectangles (surface, op, color, rects, num_rects)); } cairo_status_t _cairo_surface_paint (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source) { cairo_status_t status; cairo_pattern_t *dev_source; assert (! surface->is_snapshot); if (surface->status) return surface->status; status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source); if (status) return _cairo_surface_set_error (surface, status); if (surface->backend->paint) { status = surface->backend->paint (surface, op, dev_source); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto FINISH; } status = _cairo_surface_fallback_paint (surface, op, dev_source); FINISH: cairo_pattern_destroy (dev_source); return _cairo_surface_set_error (surface, status); } cairo_status_t _cairo_surface_mask (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_pattern_t *mask) { cairo_status_t status; cairo_pattern_t *dev_source; cairo_pattern_t *dev_mask; assert (! surface->is_snapshot); if (surface->status) return surface->status; status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source); if (status) goto FINISH; status = _cairo_surface_copy_pattern_for_destination (mask, surface, &dev_mask); if (status) goto CLEANUP_SOURCE; if (surface->backend->mask) { status = surface->backend->mask (surface, op, dev_source, dev_mask); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto CLEANUP_MASK; } status = _cairo_surface_fallback_mask (surface, op, dev_source, dev_mask); CLEANUP_MASK: cairo_pattern_destroy (dev_mask); CLEANUP_SOURCE: cairo_pattern_destroy (dev_source); FINISH: return _cairo_surface_set_error (surface, status); } cairo_status_t _cairo_surface_fill_stroke (cairo_surface_t *surface, cairo_operator_t fill_op, cairo_pattern_t *fill_source, cairo_fill_rule_t fill_rule, double fill_tolerance, cairo_antialias_t fill_antialias, cairo_path_fixed_t *path, cairo_operator_t stroke_op, cairo_pattern_t *stroke_source, cairo_stroke_style_t *stroke_style, cairo_matrix_t *stroke_ctm, cairo_matrix_t *stroke_ctm_inverse, double stroke_tolerance, cairo_antialias_t stroke_antialias) { cairo_status_t status; if (surface->status) return surface->status; if (surface->backend->fill_stroke) { cairo_pattern_t *dev_stroke_source; cairo_pattern_t *dev_fill_source; cairo_matrix_t dev_ctm = *stroke_ctm; cairo_matrix_t dev_ctm_inverse = *stroke_ctm_inverse; status = _cairo_surface_copy_pattern_for_destination (stroke_source, surface, &dev_stroke_source); if (status) return _cairo_surface_set_error (surface, status); status = _cairo_surface_copy_pattern_for_destination (fill_source, surface, &dev_fill_source); if (status) { cairo_pattern_destroy (dev_stroke_source); return _cairo_surface_set_error (surface, status); } status = surface->backend->fill_stroke (surface, fill_op, dev_fill_source, fill_rule, fill_tolerance, fill_antialias, path, stroke_op, dev_stroke_source, stroke_style, &dev_ctm, &dev_ctm_inverse, stroke_tolerance, stroke_antialias); cairo_pattern_destroy (dev_stroke_source); cairo_pattern_destroy (dev_fill_source); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_surface_set_error (surface, status); } status = _cairo_surface_fill (surface, fill_op, fill_source, path, fill_rule, fill_tolerance, fill_antialias); if (status) return _cairo_surface_set_error (surface, status); status = _cairo_surface_stroke (surface, stroke_op, stroke_source, path, stroke_style, stroke_ctm, stroke_ctm_inverse, stroke_tolerance, stroke_antialias); if (status) return _cairo_surface_set_error (surface, status); return CAIRO_STATUS_SUCCESS; } cairo_status_t _cairo_surface_stroke (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_stroke_style_t *stroke_style, cairo_matrix_t *ctm, cairo_matrix_t *ctm_inverse, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_pattern_t *dev_source; cairo_path_fixed_t *dev_path = path; cairo_path_fixed_t real_dev_path; cairo_matrix_t dev_ctm = *ctm; cairo_matrix_t dev_ctm_inverse = *ctm_inverse; assert (! surface->is_snapshot); if (surface->status) return surface->status; status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source); if (status) return _cairo_surface_set_error (surface, status); if (surface->backend->stroke) { status = surface->backend->stroke (surface, op, dev_source, path, stroke_style, &dev_ctm, &dev_ctm_inverse, tolerance, antialias); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto FINISH; } status = _cairo_surface_fallback_stroke (surface, op, dev_source, path, stroke_style, &dev_ctm, &dev_ctm_inverse, tolerance, antialias); FINISH: if (dev_path == &real_dev_path) _cairo_path_fixed_fini (&real_dev_path); cairo_pattern_destroy (dev_source); return _cairo_surface_set_error (surface, status); } cairo_status_t _cairo_surface_fill (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_status_t status; cairo_pattern_t *dev_source; assert (! surface->is_snapshot); if (surface->status) return surface->status; status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source); if (status) return _cairo_surface_set_error (surface, status); if (surface->backend->fill) { status = surface->backend->fill (surface, op, dev_source, path, fill_rule, tolerance, antialias); if (status != CAIRO_INT_STATUS_UNSUPPORTED) goto FINISH; } status = _cairo_surface_fallback_fill (surface, op, dev_source, path, fill_rule, tolerance, antialias); FINISH: cairo_pattern_destroy (dev_source); return _cairo_surface_set_error (surface, status); } cairo_status_t _cairo_surface_composite_trapezoids (cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *dst, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, unsigned int width, unsigned int height, cairo_trapezoid_t *traps, int num_traps) { cairo_int_status_t status; assert (! dst->is_snapshot); /* These operators aren't interpreted the same way by the backends; * they are implemented in terms of other operators in cairo-gstate.c */ assert (op != CAIRO_OPERATOR_SOURCE && op != CAIRO_OPERATOR_CLEAR); if (dst->status) return dst->status; if (dst->finished) return _cairo_surface_set_error (dst, CAIRO_STATUS_SURFACE_FINISHED); if (dst->backend->composite_trapezoids) { status = dst->backend->composite_trapezoids (op, pattern, dst, antialias, src_x, src_y, dst_x, dst_y, width, height, traps, num_traps); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_surface_set_error (dst, status); } return _cairo_surface_set_error (dst, _cairo_surface_fallback_composite_trapezoids (op, pattern, dst, antialias, src_x, src_y, dst_x, dst_y, width, height, traps, num_traps)); } /** * cairo_surface_copy_page: * @surface: a #cairo_surface_t * * Emits the current page for backends that support multiple pages, * but doesn't clear it, so that the contents of the current page will * be retained for the next page. Use cairo_surface_show_page() if you * want to get an empty page after the emission. * * Since: 1.6 */ void cairo_surface_copy_page (cairo_surface_t *surface) { cairo_status_t status_ignored; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status_ignored = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } /* It's fine if some backends don't implement copy_page */ if (surface->backend->copy_page == NULL) return; status_ignored = _cairo_surface_set_error (surface, surface->backend->copy_page (surface)); } slim_hidden_def (cairo_surface_copy_page); /** * cairo_surface_show_page: * @surface: a #cairo_Surface_t * * Emits and clears the current page for backends that support multiple * pages. Use cairo_surface_copy_page() if you don't want to clear the page. * * Since: 1.6 **/ void cairo_surface_show_page (cairo_surface_t *surface) { cairo_status_t status_ignored; assert (! surface->is_snapshot); if (surface->status) return; if (surface->finished) { status_ignored = _cairo_surface_set_error (surface, CAIRO_STATUS_SURFACE_FINISHED); return; } /* It's fine if some backends don't implement show_page */ if (surface->backend->show_page == NULL) return; status_ignored = _cairo_surface_set_error (surface, surface->backend->show_page (surface)); } slim_hidden_def (cairo_surface_show_page); /** * _cairo_surface_get_current_clip_serial: * @surface: the #cairo_surface_t to return the serial number for * * Returns: the serial number associated with the current * clip in the surface. All gstate functions must * verify that the correct clip is set in the surface before * invoking any surface drawing function */ unsigned int _cairo_surface_get_current_clip_serial (cairo_surface_t *surface) { return surface->current_clip_serial; } /** * _cairo_surface_allocate_clip_serial: * @surface: the #cairo_surface_t to allocate a serial number from * * Each surface has a separate set of clipping serial numbers, and * this function allocates one from the specified surface. As zero is * reserved for the special no-clipping case, this function will not * return that except for an in-error surface, (ie. surface->status != * CAIRO_STATUS_SUCCESS). */ unsigned int _cairo_surface_allocate_clip_serial (cairo_surface_t *surface) { unsigned int serial; if (surface->status) return 0; if ((serial = ++(surface->next_clip_serial)) == 0) serial = ++(surface->next_clip_serial); return serial; } /** * _cairo_surface_reset_clip: * @surface: the #cairo_surface_t to reset the clip on * * This function sets the clipping for the surface to * None, which is to say that drawing is entirely * unclipped. It also sets the clip serial number * to zero. */ cairo_status_t _cairo_surface_reset_clip (cairo_surface_t *surface) { cairo_status_t status; if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); surface->current_clip_serial = 0; if (surface->backend->intersect_clip_path) { status = surface->backend->intersect_clip_path (surface, NULL, CAIRO_FILL_RULE_WINDING, 0, CAIRO_ANTIALIAS_DEFAULT); if (status) return _cairo_surface_set_error (surface, status); } if (surface->backend->set_clip_region != NULL) { status = surface->backend->set_clip_region (surface, NULL); if (status) return _cairo_surface_set_error (surface, status); } return CAIRO_STATUS_SUCCESS; } /** * _cairo_surface_set_clip_region: * @surface: the #cairo_surface_t to reset the clip on * @region: the #cairo_region_t to use for clipping * @serial: the clip serial number associated with the region * * This function sets the clipping for the surface to * the specified region and sets the surface clipping * serial number to the associated serial number. */ cairo_status_t _cairo_surface_set_clip_region (cairo_surface_t *surface, cairo_region_t *region, unsigned int serial) { cairo_status_t status; if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); assert (surface->backend->set_clip_region != NULL); surface->current_clip_serial = serial; status = surface->backend->set_clip_region (surface, region); return _cairo_surface_set_error (surface, status); } cairo_int_status_t _cairo_surface_intersect_clip_path (cairo_surface_t *surface, cairo_path_fixed_t *path, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias) { cairo_path_fixed_t *dev_path = path; cairo_status_t status; if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); assert (surface->backend->intersect_clip_path != NULL); status = surface->backend->intersect_clip_path (surface, dev_path, fill_rule, tolerance, antialias); return _cairo_surface_set_error (surface, status); } static cairo_status_t _cairo_surface_set_clip_path_recursive (cairo_surface_t *surface, cairo_clip_path_t *clip_path) { cairo_status_t status; if (surface->status) return surface->status; if (clip_path == NULL) return CAIRO_STATUS_SUCCESS; status = _cairo_surface_set_clip_path_recursive (surface, clip_path->prev); if (status) return status; return _cairo_surface_intersect_clip_path (surface, &clip_path->path, clip_path->fill_rule, clip_path->tolerance, clip_path->antialias); } /** * _cairo_surface_set_clip_path: * @surface: the #cairo_surface_t to set the clip on * @clip_path: the clip path to set * @serial: the clip serial number associated with the clip path * * Sets the given clipping path for the surface and assigns the * clipping serial to the surface. **/ static cairo_status_t _cairo_surface_set_clip_path (cairo_surface_t *surface, cairo_clip_path_t *clip_path, unsigned int serial) { cairo_status_t status; if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); assert (surface->backend->intersect_clip_path != NULL); status = surface->backend->intersect_clip_path (surface, NULL, CAIRO_FILL_RULE_WINDING, 0, CAIRO_ANTIALIAS_DEFAULT); if (status) return _cairo_surface_set_error (surface, status); status = _cairo_surface_set_clip_path_recursive (surface, clip_path); if (status) return _cairo_surface_set_error (surface, status); surface->current_clip_serial = serial; return CAIRO_STATUS_SUCCESS; } /** * _cairo_surface_set_empty_clip_path: * @surface: the #cairo_surface_t to set the clip on * @serial: the clip serial number associated with the clip path * * Create an empty clip path, one that represents the entire surface clipped * out, and assigns the given clipping serial to the surface. **/ static cairo_status_t _cairo_surface_set_empty_clip_path (cairo_surface_t *surface, unsigned int serial) { cairo_path_fixed_t path; cairo_status_t status; if (surface->status) return surface->status; _cairo_path_fixed_init (&path); status = surface->backend->intersect_clip_path (surface, &path, CAIRO_FILL_RULE_WINDING, 0, CAIRO_ANTIALIAS_DEFAULT); if (status == CAIRO_STATUS_SUCCESS) surface->current_clip_serial = serial; _cairo_path_fixed_fini (&path); return _cairo_surface_set_error (surface, status); } cairo_clip_t * _cairo_surface_get_clip (cairo_surface_t *surface) { return surface->clip; } cairo_status_t _cairo_surface_set_clip (cairo_surface_t *surface, cairo_clip_t *clip) { unsigned int serial = 0; if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); if (clip) { serial = clip->serial; if (serial == 0) clip = NULL; } surface->clip = clip; if (serial == _cairo_surface_get_current_clip_serial (surface)) return CAIRO_STATUS_SUCCESS; if (clip) { if (clip->all_clipped) { if (surface->backend->intersect_clip_path != NULL) return _cairo_surface_set_empty_clip_path (surface, clip->serial); if (surface->backend->set_clip_region != NULL) return _cairo_surface_set_clip_region (surface, &clip->region, clip->serial); } else { if (clip->path) return _cairo_surface_set_clip_path (surface, clip->path, clip->serial); if (clip->has_region) return _cairo_surface_set_clip_region (surface, &clip->region, clip->serial); } } return _cairo_surface_reset_clip (surface); } /** * _cairo_surface_get_extents: * @surface: the #cairo_surface_t to fetch extents for * * This function returns a bounding box for the surface. The surface * bounds are defined as a region beyond which no rendering will * possibly be recorded, in other words, it is the maximum extent of * potentially usable coordinates. * * For vector surfaces, (PDF, PS, SVG and meta-surfaces), the surface * might be conceived as unbounded, but we force the user to provide a * maximum size at the time of surface_create. So get_extents uses * that size. * * Note: The coordinates returned are in "backend" space rather than * "surface" space. That is, they are relative to the true (0,0) * origin rather than the device_transform origin. This might seem a * bit inconsistent with other #cairo_surface_t interfaces, but all * current callers are within the surface layer where backend space is * desired. * * This behavior would have to be changed is we ever exported a public * variant of this function. */ cairo_status_t _cairo_surface_get_extents (cairo_surface_t *surface, cairo_rectangle_int_t *rectangle) { if (surface->status) return surface->status; if (surface->finished) return _cairo_surface_set_error (surface,CAIRO_STATUS_SURFACE_FINISHED); return _cairo_surface_set_error (surface, surface->backend->get_extents (surface, rectangle)); } /* Note: the backends may modify the contents of the glyph array as long as * they do not return %CAIRO_STATUS_UNSUPPORTED. This makes it possible to * avoid copying the array again and again, and edit it in-place. * Backends are in fact free to use the array as a generic buffer as they * see fit. * See commits 5a9642c5746fd677aed35ce620ce90b1029b1a0c and * 1781e6018c17909311295a9cc74b70500c6b4d0a for the rationale. */ cairo_status_t _cairo_surface_show_glyphs (cairo_surface_t *surface, cairo_operator_t op, cairo_pattern_t *source, cairo_glyph_t *glyphs, int num_glyphs, cairo_scaled_font_t *scaled_font) { cairo_status_t status; cairo_scaled_font_t *dev_scaled_font = scaled_font; cairo_pattern_t *dev_source; cairo_matrix_t font_matrix; assert (! surface->is_snapshot); if (surface->status) return surface->status; if (!num_glyphs) return CAIRO_STATUS_SUCCESS; status = _cairo_surface_copy_pattern_for_destination (source, surface, &dev_source); if (status) return _cairo_surface_set_error (surface, status); cairo_scaled_font_get_font_matrix (scaled_font, &font_matrix); if (_cairo_surface_has_device_transform (surface) && ! _cairo_matrix_is_integer_translation (&surface->device_transform, NULL, NULL)) { cairo_font_options_t *font_options; cairo_matrix_t dev_ctm; font_options = cairo_font_options_create (); cairo_scaled_font_get_ctm (scaled_font, &dev_ctm); cairo_matrix_multiply (&dev_ctm, &dev_ctm, &surface->device_transform); cairo_scaled_font_get_font_options (scaled_font, font_options); dev_scaled_font = cairo_scaled_font_create (cairo_scaled_font_get_font_face (scaled_font), &font_matrix, &dev_ctm, font_options); cairo_font_options_destroy (font_options); } status = cairo_scaled_font_status (dev_scaled_font); if (status) { cairo_pattern_destroy (dev_source); return _cairo_surface_set_error (surface, status); } CAIRO_MUTEX_LOCK (dev_scaled_font->mutex); status = CAIRO_INT_STATUS_UNSUPPORTED; if (surface->backend->show_glyphs) status = surface->backend->show_glyphs (surface, op, dev_source, glyphs, num_glyphs, dev_scaled_font); if (status == CAIRO_INT_STATUS_UNSUPPORTED) status = _cairo_surface_fallback_show_glyphs (surface, op, dev_source, glyphs, num_glyphs, dev_scaled_font); CAIRO_MUTEX_UNLOCK (dev_scaled_font->mutex); if (dev_scaled_font != scaled_font) cairo_scaled_font_destroy (dev_scaled_font); cairo_pattern_destroy (dev_source); return _cairo_surface_set_error (surface, status); } /* XXX: Previously, we had a function named _cairo_surface_show_glyphs * with not-so-useful semantics. We've now got a new * _cairo_surface_show_glyphs with the proper semantics, and its * fallback still uses this old function (which still needs to be * cleaned up in terms of both semantics and naming). */ cairo_status_t _cairo_surface_old_show_glyphs (cairo_scaled_font_t *scaled_font, cairo_operator_t op, cairo_pattern_t *pattern, cairo_surface_t *dst, int source_x, int source_y, int dest_x, int dest_y, unsigned int width, unsigned int height, cairo_glyph_t *glyphs, int num_glyphs) { cairo_status_t status; assert (! dst->is_snapshot); if (dst->status) return dst->status; if (dst->finished) return _cairo_surface_set_error (dst, CAIRO_STATUS_SURFACE_FINISHED); if (dst->backend->old_show_glyphs) { status = dst->backend->old_show_glyphs (scaled_font, op, pattern, dst, source_x, source_y, dest_x, dest_y, width, height, glyphs, num_glyphs); } else status = CAIRO_INT_STATUS_UNSUPPORTED; return _cairo_surface_set_error (dst, status); } static cairo_status_t _cairo_surface_composite_fixup_unbounded_internal (cairo_surface_t *dst, cairo_rectangle_int_t *src_rectangle, cairo_rectangle_int_t *mask_rectangle, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_rectangle_int_t dst_rectangle; cairo_rectangle_int_t drawn_rectangle; cairo_bool_t has_drawn_region = FALSE; cairo_bool_t has_clear_region = FALSE; cairo_region_t drawn_region; cairo_region_t clear_region; cairo_status_t status; /* The area that was drawn is the area in the destination rectangle but not within * the source or the mask. */ dst_rectangle.x = dst_x; dst_rectangle.y = dst_y; dst_rectangle.width = width; dst_rectangle.height = height; drawn_rectangle = dst_rectangle; if (src_rectangle) _cairo_rectangle_intersect (&drawn_rectangle, src_rectangle); if (mask_rectangle) _cairo_rectangle_intersect (&drawn_rectangle, mask_rectangle); /* Now compute the area that is in dst_rectangle but not in drawn_rectangle */ _cairo_region_init_rect (&drawn_region, &drawn_rectangle); _cairo_region_init_rect (&clear_region, &dst_rectangle); has_drawn_region = TRUE; has_clear_region = TRUE; status = _cairo_region_subtract (&clear_region, &clear_region, &drawn_region); if (status) goto CLEANUP_REGIONS; status = _cairo_surface_fill_region (dst, CAIRO_OPERATOR_SOURCE, CAIRO_COLOR_TRANSPARENT, &clear_region); CLEANUP_REGIONS: if (has_drawn_region) _cairo_region_fini (&drawn_region); if (has_clear_region) _cairo_region_fini (&clear_region); return _cairo_surface_set_error (dst, status); } /** * _cairo_surface_composite_fixup_unbounded: * @dst: the destination surface * @src_attr: source surface attributes (from _cairo_pattern_acquire_surface()) * @src_width: width of source surface * @src_height: height of source surface * @mask_attr: mask surface attributes or %NULL if no mask * @mask_width: width of mask surface * @mask_height: height of mask surface * @src_x: @src_x from _cairo_surface_composite() * @src_y: @src_y from _cairo_surface_composite() * @mask_x: @mask_x from _cairo_surface_composite() * @mask_y: @mask_y from _cairo_surface_composite() * @dst_x: @dst_x from _cairo_surface_composite() * @dst_y: @dst_y from _cairo_surface_composite() * @width: @width from _cairo_surface_composite() * @height: @height_x from _cairo_surface_composite() * * Eeek! Too many parameters! This is a helper function to take care of fixing * up for bugs in libpixman and RENDER where, when asked to composite an * untransformed surface with an unbounded operator (like CLEAR or SOURCE) * only the region inside both the source and the mask is affected. * This function clears the region that should have been drawn but was wasn't. **/ cairo_status_t _cairo_surface_composite_fixup_unbounded (cairo_surface_t *dst, cairo_surface_attributes_t *src_attr, int src_width, int src_height, cairo_surface_attributes_t *mask_attr, int mask_width, int mask_height, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_rectangle_int_t src_tmp, mask_tmp; cairo_rectangle_int_t *src_rectangle = NULL; cairo_rectangle_int_t *mask_rectangle = NULL; assert (! dst->is_snapshot); if (dst->status) return dst->status; /* The RENDER/libpixman operators are clipped to the bounds of the untransformed, * non-repeating sources and masks. Other sources and masks can be ignored. */ if (_cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL) && src_attr->extend == CAIRO_EXTEND_NONE) { src_tmp.x = (dst_x - (src_x + src_attr->x_offset)); src_tmp.y = (dst_y - (src_y + src_attr->y_offset)); src_tmp.width = src_width; src_tmp.height = src_height; src_rectangle = &src_tmp; } if (mask_attr && _cairo_matrix_is_integer_translation (&mask_attr->matrix, NULL, NULL) && mask_attr->extend == CAIRO_EXTEND_NONE) { mask_tmp.x = (dst_x - (mask_x + mask_attr->x_offset)); mask_tmp.y = (dst_y - (mask_y + mask_attr->y_offset)); mask_tmp.width = mask_width; mask_tmp.height = mask_height; mask_rectangle = &mask_tmp; } return _cairo_surface_composite_fixup_unbounded_internal (dst, src_rectangle, mask_rectangle, dst_x, dst_y, width, height); } /** * _cairo_surface_composite_shape_fixup_unbounded: * @dst: the destination surface * @src_attr: source surface attributes (from _cairo_pattern_acquire_surface()) * @src_width: width of source surface * @src_height: height of source surface * @mask_width: width of mask surface * @mask_height: height of mask surface * @src_x: @src_x from _cairo_surface_composite() * @src_y: @src_y from _cairo_surface_composite() * @mask_x: @mask_x from _cairo_surface_composite() * @mask_y: @mask_y from _cairo_surface_composite() * @dst_x: @dst_x from _cairo_surface_composite() * @dst_y: @dst_y from _cairo_surface_composite() * @width: @width from _cairo_surface_composite() * @height: @height_x from _cairo_surface_composite() * * Like _cairo_surface_composite_fixup_unbounded(), but instead of * handling the case where we have a source pattern and a mask * pattern, handle the case where we are compositing a source pattern * using a mask we create ourselves, as in * _cairo_surface_composite_glyphs() or _cairo_surface_composite_trapezoids() **/ cairo_status_t _cairo_surface_composite_shape_fixup_unbounded (cairo_surface_t *dst, cairo_surface_attributes_t *src_attr, int src_width, int src_height, int mask_width, int mask_height, int src_x, int src_y, int mask_x, int mask_y, int dst_x, int dst_y, unsigned int width, unsigned int height) { cairo_rectangle_int_t src_tmp, mask_tmp; cairo_rectangle_int_t *src_rectangle = NULL; cairo_rectangle_int_t *mask_rectangle = NULL; assert (! dst->is_snapshot); if (dst->status) return dst->status; /* The RENDER/libpixman operators are clipped to the bounds of the untransformed, * non-repeating sources and masks. Other sources and masks can be ignored. */ if (_cairo_matrix_is_integer_translation (&src_attr->matrix, NULL, NULL) && src_attr->extend == CAIRO_EXTEND_NONE) { src_tmp.x = (dst_x - (src_x + src_attr->x_offset)); src_tmp.y = (dst_y - (src_y + src_attr->y_offset)); src_tmp.width = src_width; src_tmp.height = src_height; src_rectangle = &src_tmp; } mask_tmp.x = dst_x - mask_x; mask_tmp.y = dst_y - mask_y; mask_tmp.width = mask_width; mask_tmp.height = mask_height; mask_rectangle = &mask_tmp; return _cairo_surface_composite_fixup_unbounded_internal (dst, src_rectangle, mask_rectangle, dst_x, dst_y, width, height); } /** * _cairo_surface_copy_pattern_for_destination * @pattern: the pattern to copy * @destination: the destination surface for which the pattern is being copied * @pattern_out: the location to hold the copy * * Copies the given pattern, taking into account device scale and offsets * of the destination surface. */ static cairo_status_t _cairo_surface_copy_pattern_for_destination (const cairo_pattern_t *pattern, cairo_surface_t *destination, cairo_pattern_t **pattern_out) { cairo_status_t status; status = _cairo_pattern_create_copy (pattern_out, pattern); if (status) return status; if (_cairo_surface_has_device_transform (destination)) { cairo_matrix_t device_to_surface = destination->device_transform; status = cairo_matrix_invert (&device_to_surface); /* We only ever allow for scaling (under the implementation's * control) or translation (under the user's control). So the * matrix should always be invertible. */ assert (status == CAIRO_STATUS_SUCCESS); _cairo_pattern_transform (*pattern_out, &device_to_surface); } return CAIRO_STATUS_SUCCESS; } /** * _cairo_surface_set_resolution * @surface: the surface * @x_res: x resolution, in dpi * @y_res: y resolution, in dpi * * Set the actual surface resolution of @surface to the given x and y DPI. * Mainly used for correctly computing the scale factor when fallback * rendering needs to take place in the paginated surface. */ void _cairo_surface_set_resolution (cairo_surface_t *surface, double x_res, double y_res) { if (surface->status) return; surface->x_resolution = x_res; surface->y_resolution = y_res; } cairo_surface_t * _cairo_surface_create_in_error (cairo_status_t status) { switch (status) { case CAIRO_STATUS_NO_MEMORY: return (cairo_surface_t *) &_cairo_surface_nil; case CAIRO_STATUS_INVALID_CONTENT: return (cairo_surface_t *) &_cairo_surface_nil_invalid_content; case CAIRO_STATUS_INVALID_FORMAT: return (cairo_surface_t *) &_cairo_surface_nil_invalid_format; case CAIRO_STATUS_INVALID_VISUAL: return (cairo_surface_t *) &_cairo_surface_nil_invalid_visual; case CAIRO_STATUS_READ_ERROR: return (cairo_surface_t *) &_cairo_surface_nil_read_error; case CAIRO_STATUS_WRITE_ERROR: return (cairo_surface_t *) &_cairo_surface_nil_write_error; case CAIRO_STATUS_FILE_NOT_FOUND: return (cairo_surface_t *) &_cairo_surface_nil_file_not_found; case CAIRO_STATUS_TEMP_FILE_ERROR: return (cairo_surface_t *) &_cairo_surface_nil_temp_file_error; case CAIRO_STATUS_INVALID_STRIDE: return (cairo_surface_t *) &_cairo_surface_nil_invalid_stride; case CAIRO_STATUS_SUCCESS: ASSERT_NOT_REACHED; /* fall-through */ case CAIRO_STATUS_INVALID_RESTORE: case CAIRO_STATUS_INVALID_POP_GROUP: case CAIRO_STATUS_NO_CURRENT_POINT: case CAIRO_STATUS_INVALID_MATRIX: case CAIRO_STATUS_INVALID_STATUS: case CAIRO_STATUS_NULL_POINTER: case CAIRO_STATUS_INVALID_STRING: case CAIRO_STATUS_INVALID_PATH_DATA: case CAIRO_STATUS_SURFACE_FINISHED: case CAIRO_STATUS_SURFACE_TYPE_MISMATCH: case CAIRO_STATUS_PATTERN_TYPE_MISMATCH: case CAIRO_STATUS_INVALID_DASH: case CAIRO_STATUS_INVALID_DSC_COMMENT: case CAIRO_STATUS_INVALID_INDEX: case CAIRO_STATUS_CLIP_NOT_REPRESENTABLE: default: _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_surface_t *) &_cairo_surface_nil; } } /* LocalWords: rasterized */ libgdiplus-2.11/cairo/src/test-paginated-surface.h0000664000175000017500000000344612225470167017127 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2005 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Red Hat, Inc. * * Contributor(s): * Carl Worth */ #ifndef TEST_PAGINATED_SURFACE_H #define TEST_PAGINATED_SURFACE_H #include "cairo.h" CAIRO_BEGIN_DECLS cairo_surface_t * _cairo_test_paginated_surface_create_for_data (unsigned char *data, cairo_content_t content, int width, int height, int stride); CAIRO_END_DECLS #endif /* TEST_PAGINATED_SURFACE_H */ libgdiplus-2.11/cairo/src/cairo-skiplist.c0000664000175000017500000005006412225470167015516 00000000000000/* * Copyright © 2006 Keith Packard * Copyright © 2006 Carl Worth * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #include "cairoint.h" #include "cairo-skiplist-private.h" #define ELT_DATA(elt) (void *) ((char*) (elt) - list->data_size) #define NEXT_TO_ELT(next) (skip_elt_t *) ((char *) (next) - offsetof (skip_elt_t, next)) /* Four 256 element lookup tables back to back implementing a linear * feedback shift register of degree 32. */ static unsigned const _cairo_lfsr_random_lut[1024] = { 0x00000000, 0x9a795537, 0xae8bff59, 0x34f2aa6e, 0xc76eab85, 0x5d17feb2, 0x69e554dc, 0xf39c01eb, 0x14a4023d, 0x8edd570a, 0xba2ffd64, 0x2056a853, 0xd3caa9b8, 0x49b3fc8f, 0x7d4156e1, 0xe73803d6, 0x2948047a, 0xb331514d, 0x87c3fb23, 0x1dbaae14, 0xee26afff, 0x745ffac8, 0x40ad50a6, 0xdad40591, 0x3dec0647, 0xa7955370, 0x9367f91e, 0x091eac29, 0xfa82adc2, 0x60fbf8f5, 0x5409529b, 0xce7007ac, 0x529008f4, 0xc8e95dc3, 0xfc1bf7ad, 0x6662a29a, 0x95fea371, 0x0f87f646, 0x3b755c28, 0xa10c091f, 0x46340ac9, 0xdc4d5ffe, 0xe8bff590, 0x72c6a0a7, 0x815aa14c, 0x1b23f47b, 0x2fd15e15, 0xb5a80b22, 0x7bd80c8e, 0xe1a159b9, 0xd553f3d7, 0x4f2aa6e0, 0xbcb6a70b, 0x26cff23c, 0x123d5852, 0x88440d65, 0x6f7c0eb3, 0xf5055b84, 0xc1f7f1ea, 0x5b8ea4dd, 0xa812a536, 0x326bf001, 0x06995a6f, 0x9ce00f58, 0xa52011e8, 0x3f5944df, 0x0babeeb1, 0x91d2bb86, 0x624eba6d, 0xf837ef5a, 0xccc54534, 0x56bc1003, 0xb18413d5, 0x2bfd46e2, 0x1f0fec8c, 0x8576b9bb, 0x76eab850, 0xec93ed67, 0xd8614709, 0x4218123e, 0x8c681592, 0x161140a5, 0x22e3eacb, 0xb89abffc, 0x4b06be17, 0xd17feb20, 0xe58d414e, 0x7ff41479, 0x98cc17af, 0x02b54298, 0x3647e8f6, 0xac3ebdc1, 0x5fa2bc2a, 0xc5dbe91d, 0xf1294373, 0x6b501644, 0xf7b0191c, 0x6dc94c2b, 0x593be645, 0xc342b372, 0x30deb299, 0xaaa7e7ae, 0x9e554dc0, 0x042c18f7, 0xe3141b21, 0x796d4e16, 0x4d9fe478, 0xd7e6b14f, 0x247ab0a4, 0xbe03e593, 0x8af14ffd, 0x10881aca, 0xdef81d66, 0x44814851, 0x7073e23f, 0xea0ab708, 0x1996b6e3, 0x83efe3d4, 0xb71d49ba, 0x2d641c8d, 0xca5c1f5b, 0x50254a6c, 0x64d7e002, 0xfeaeb535, 0x0d32b4de, 0x974be1e9, 0xa3b94b87, 0x39c01eb0, 0xd03976e7, 0x4a4023d0, 0x7eb289be, 0xe4cbdc89, 0x1757dd62, 0x8d2e8855, 0xb9dc223b, 0x23a5770c, 0xc49d74da, 0x5ee421ed, 0x6a168b83, 0xf06fdeb4, 0x03f3df5f, 0x998a8a68, 0xad782006, 0x37017531, 0xf971729d, 0x630827aa, 0x57fa8dc4, 0xcd83d8f3, 0x3e1fd918, 0xa4668c2f, 0x90942641, 0x0aed7376, 0xedd570a0, 0x77ac2597, 0x435e8ff9, 0xd927dace, 0x2abbdb25, 0xb0c28e12, 0x8430247c, 0x1e49714b, 0x82a97e13, 0x18d02b24, 0x2c22814a, 0xb65bd47d, 0x45c7d596, 0xdfbe80a1, 0xeb4c2acf, 0x71357ff8, 0x960d7c2e, 0x0c742919, 0x38868377, 0xa2ffd640, 0x5163d7ab, 0xcb1a829c, 0xffe828f2, 0x65917dc5, 0xabe17a69, 0x31982f5e, 0x056a8530, 0x9f13d007, 0x6c8fd1ec, 0xf6f684db, 0xc2042eb5, 0x587d7b82, 0xbf457854, 0x253c2d63, 0x11ce870d, 0x8bb7d23a, 0x782bd3d1, 0xe25286e6, 0xd6a02c88, 0x4cd979bf, 0x7519670f, 0xef603238, 0xdb929856, 0x41ebcd61, 0xb277cc8a, 0x280e99bd, 0x1cfc33d3, 0x868566e4, 0x61bd6532, 0xfbc43005, 0xcf369a6b, 0x554fcf5c, 0xa6d3ceb7, 0x3caa9b80, 0x085831ee, 0x922164d9, 0x5c516375, 0xc6283642, 0xf2da9c2c, 0x68a3c91b, 0x9b3fc8f0, 0x01469dc7, 0x35b437a9, 0xafcd629e, 0x48f56148, 0xd28c347f, 0xe67e9e11, 0x7c07cb26, 0x8f9bcacd, 0x15e29ffa, 0x21103594, 0xbb6960a3, 0x27896ffb, 0xbdf03acc, 0x890290a2, 0x137bc595, 0xe0e7c47e, 0x7a9e9149, 0x4e6c3b27, 0xd4156e10, 0x332d6dc6, 0xa95438f1, 0x9da6929f, 0x07dfc7a8, 0xf443c643, 0x6e3a9374, 0x5ac8391a, 0xc0b16c2d, 0x0ec16b81, 0x94b83eb6, 0xa04a94d8, 0x3a33c1ef, 0xc9afc004, 0x53d69533, 0x67243f5d, 0xfd5d6a6a, 0x1a6569bc, 0x801c3c8b, 0xb4ee96e5, 0x2e97c3d2, 0xdd0bc239, 0x4772970e, 0x73803d60, 0xe9f96857, 0x00000000, 0x3a0bb8f9, 0x741771f2, 0x4e1cc90b, 0xe82ee3e4, 0xd2255b1d, 0x9c399216, 0xa6322aef, 0x4a2492ff, 0x702f2a06, 0x3e33e30d, 0x04385bf4, 0xa20a711b, 0x9801c9e2, 0xd61d00e9, 0xec16b810, 0x944925fe, 0xae429d07, 0xe05e540c, 0xda55ecf5, 0x7c67c61a, 0x466c7ee3, 0x0870b7e8, 0x327b0f11, 0xde6db701, 0xe4660ff8, 0xaa7ac6f3, 0x90717e0a, 0x364354e5, 0x0c48ec1c, 0x42542517, 0x785f9dee, 0xb2eb1ecb, 0x88e0a632, 0xc6fc6f39, 0xfcf7d7c0, 0x5ac5fd2f, 0x60ce45d6, 0x2ed28cdd, 0x14d93424, 0xf8cf8c34, 0xc2c434cd, 0x8cd8fdc6, 0xb6d3453f, 0x10e16fd0, 0x2aead729, 0x64f61e22, 0x5efda6db, 0x26a23b35, 0x1ca983cc, 0x52b54ac7, 0x68bef23e, 0xce8cd8d1, 0xf4876028, 0xba9ba923, 0x809011da, 0x6c86a9ca, 0x568d1133, 0x1891d838, 0x229a60c1, 0x84a84a2e, 0xbea3f2d7, 0xf0bf3bdc, 0xcab48325, 0xffaf68a1, 0xc5a4d058, 0x8bb81953, 0xb1b3a1aa, 0x17818b45, 0x2d8a33bc, 0x6396fab7, 0x599d424e, 0xb58bfa5e, 0x8f8042a7, 0xc19c8bac, 0xfb973355, 0x5da519ba, 0x67aea143, 0x29b26848, 0x13b9d0b1, 0x6be64d5f, 0x51edf5a6, 0x1ff13cad, 0x25fa8454, 0x83c8aebb, 0xb9c31642, 0xf7dfdf49, 0xcdd467b0, 0x21c2dfa0, 0x1bc96759, 0x55d5ae52, 0x6fde16ab, 0xc9ec3c44, 0xf3e784bd, 0xbdfb4db6, 0x87f0f54f, 0x4d44766a, 0x774fce93, 0x39530798, 0x0358bf61, 0xa56a958e, 0x9f612d77, 0xd17de47c, 0xeb765c85, 0x0760e495, 0x3d6b5c6c, 0x73779567, 0x497c2d9e, 0xef4e0771, 0xd545bf88, 0x9b597683, 0xa152ce7a, 0xd90d5394, 0xe306eb6d, 0xad1a2266, 0x97119a9f, 0x3123b070, 0x0b280889, 0x4534c182, 0x7f3f797b, 0x9329c16b, 0xa9227992, 0xe73eb099, 0xdd350860, 0x7b07228f, 0x410c9a76, 0x0f10537d, 0x351beb84, 0x65278475, 0x5f2c3c8c, 0x1130f587, 0x2b3b4d7e, 0x8d096791, 0xb702df68, 0xf91e1663, 0xc315ae9a, 0x2f03168a, 0x1508ae73, 0x5b146778, 0x611fdf81, 0xc72df56e, 0xfd264d97, 0xb33a849c, 0x89313c65, 0xf16ea18b, 0xcb651972, 0x8579d079, 0xbf726880, 0x1940426f, 0x234bfa96, 0x6d57339d, 0x575c8b64, 0xbb4a3374, 0x81418b8d, 0xcf5d4286, 0xf556fa7f, 0x5364d090, 0x696f6869, 0x2773a162, 0x1d78199b, 0xd7cc9abe, 0xedc72247, 0xa3dbeb4c, 0x99d053b5, 0x3fe2795a, 0x05e9c1a3, 0x4bf508a8, 0x71feb051, 0x9de80841, 0xa7e3b0b8, 0xe9ff79b3, 0xd3f4c14a, 0x75c6eba5, 0x4fcd535c, 0x01d19a57, 0x3bda22ae, 0x4385bf40, 0x798e07b9, 0x3792ceb2, 0x0d99764b, 0xabab5ca4, 0x91a0e45d, 0xdfbc2d56, 0xe5b795af, 0x09a12dbf, 0x33aa9546, 0x7db65c4d, 0x47bde4b4, 0xe18fce5b, 0xdb8476a2, 0x9598bfa9, 0xaf930750, 0x9a88ecd4, 0xa083542d, 0xee9f9d26, 0xd49425df, 0x72a60f30, 0x48adb7c9, 0x06b17ec2, 0x3cbac63b, 0xd0ac7e2b, 0xeaa7c6d2, 0xa4bb0fd9, 0x9eb0b720, 0x38829dcf, 0x02892536, 0x4c95ec3d, 0x769e54c4, 0x0ec1c92a, 0x34ca71d3, 0x7ad6b8d8, 0x40dd0021, 0xe6ef2ace, 0xdce49237, 0x92f85b3c, 0xa8f3e3c5, 0x44e55bd5, 0x7eeee32c, 0x30f22a27, 0x0af992de, 0xaccbb831, 0x96c000c8, 0xd8dcc9c3, 0xe2d7713a, 0x2863f21f, 0x12684ae6, 0x5c7483ed, 0x667f3b14, 0xc04d11fb, 0xfa46a902, 0xb45a6009, 0x8e51d8f0, 0x624760e0, 0x584cd819, 0x16501112, 0x2c5ba9eb, 0x8a698304, 0xb0623bfd, 0xfe7ef2f6, 0xc4754a0f, 0xbc2ad7e1, 0x86216f18, 0xc83da613, 0xf2361eea, 0x54043405, 0x6e0f8cfc, 0x201345f7, 0x1a18fd0e, 0xf60e451e, 0xcc05fde7, 0x821934ec, 0xb8128c15, 0x1e20a6fa, 0x242b1e03, 0x6a37d708, 0x503c6ff1, 0x00000000, 0xca4f08ea, 0x0ee744e3, 0xc4a84c09, 0x1dce89c6, 0xd781812c, 0x1329cd25, 0xd966c5cf, 0x3b9d138c, 0xf1d21b66, 0x357a576f, 0xff355f85, 0x26539a4a, 0xec1c92a0, 0x28b4dea9, 0xe2fbd643, 0x773a2718, 0xbd752ff2, 0x79dd63fb, 0xb3926b11, 0x6af4aede, 0xa0bba634, 0x6413ea3d, 0xae5ce2d7, 0x4ca73494, 0x86e83c7e, 0x42407077, 0x880f789d, 0x5169bd52, 0x9b26b5b8, 0x5f8ef9b1, 0x95c1f15b, 0xee744e30, 0x243b46da, 0xe0930ad3, 0x2adc0239, 0xf3bac7f6, 0x39f5cf1c, 0xfd5d8315, 0x37128bff, 0xd5e95dbc, 0x1fa65556, 0xdb0e195f, 0x114111b5, 0xc827d47a, 0x0268dc90, 0xc6c09099, 0x0c8f9873, 0x994e6928, 0x530161c2, 0x97a92dcb, 0x5de62521, 0x8480e0ee, 0x4ecfe804, 0x8a67a40d, 0x4028ace7, 0xa2d37aa4, 0x689c724e, 0xac343e47, 0x667b36ad, 0xbf1df362, 0x7552fb88, 0xb1fab781, 0x7bb5bf6b, 0x4691c957, 0x8cdec1bd, 0x48768db4, 0x8239855e, 0x5b5f4091, 0x9110487b, 0x55b80472, 0x9ff70c98, 0x7d0cdadb, 0xb743d231, 0x73eb9e38, 0xb9a496d2, 0x60c2531d, 0xaa8d5bf7, 0x6e2517fe, 0xa46a1f14, 0x31abee4f, 0xfbe4e6a5, 0x3f4caaac, 0xf503a246, 0x2c656789, 0xe62a6f63, 0x2282236a, 0xe8cd2b80, 0x0a36fdc3, 0xc079f529, 0x04d1b920, 0xce9eb1ca, 0x17f87405, 0xddb77cef, 0x191f30e6, 0xd350380c, 0xa8e58767, 0x62aa8f8d, 0xa602c384, 0x6c4dcb6e, 0xb52b0ea1, 0x7f64064b, 0xbbcc4a42, 0x718342a8, 0x937894eb, 0x59379c01, 0x9d9fd008, 0x57d0d8e2, 0x8eb61d2d, 0x44f915c7, 0x805159ce, 0x4a1e5124, 0xdfdfa07f, 0x1590a895, 0xd138e49c, 0x1b77ec76, 0xc21129b9, 0x085e2153, 0xccf66d5a, 0x06b965b0, 0xe442b3f3, 0x2e0dbb19, 0xeaa5f710, 0x20eafffa, 0xf98c3a35, 0x33c332df, 0xf76b7ed6, 0x3d24763c, 0x8d2392ae, 0x476c9a44, 0x83c4d64d, 0x498bdea7, 0x90ed1b68, 0x5aa21382, 0x9e0a5f8b, 0x54455761, 0xb6be8122, 0x7cf189c8, 0xb859c5c1, 0x7216cd2b, 0xab7008e4, 0x613f000e, 0xa5974c07, 0x6fd844ed, 0xfa19b5b6, 0x3056bd5c, 0xf4fef155, 0x3eb1f9bf, 0xe7d73c70, 0x2d98349a, 0xe9307893, 0x237f7079, 0xc184a63a, 0x0bcbaed0, 0xcf63e2d9, 0x052cea33, 0xdc4a2ffc, 0x16052716, 0xd2ad6b1f, 0x18e263f5, 0x6357dc9e, 0xa918d474, 0x6db0987d, 0xa7ff9097, 0x7e995558, 0xb4d65db2, 0x707e11bb, 0xba311951, 0x58cacf12, 0x9285c7f8, 0x562d8bf1, 0x9c62831b, 0x450446d4, 0x8f4b4e3e, 0x4be30237, 0x81ac0add, 0x146dfb86, 0xde22f36c, 0x1a8abf65, 0xd0c5b78f, 0x09a37240, 0xc3ec7aaa, 0x074436a3, 0xcd0b3e49, 0x2ff0e80a, 0xe5bfe0e0, 0x2117ace9, 0xeb58a403, 0x323e61cc, 0xf8716926, 0x3cd9252f, 0xf6962dc5, 0xcbb25bf9, 0x01fd5313, 0xc5551f1a, 0x0f1a17f0, 0xd67cd23f, 0x1c33dad5, 0xd89b96dc, 0x12d49e36, 0xf02f4875, 0x3a60409f, 0xfec80c96, 0x3487047c, 0xede1c1b3, 0x27aec959, 0xe3068550, 0x29498dba, 0xbc887ce1, 0x76c7740b, 0xb26f3802, 0x782030e8, 0xa146f527, 0x6b09fdcd, 0xafa1b1c4, 0x65eeb92e, 0x87156f6d, 0x4d5a6787, 0x89f22b8e, 0x43bd2364, 0x9adbe6ab, 0x5094ee41, 0x943ca248, 0x5e73aaa2, 0x25c615c9, 0xef891d23, 0x2b21512a, 0xe16e59c0, 0x38089c0f, 0xf24794e5, 0x36efd8ec, 0xfca0d006, 0x1e5b0645, 0xd4140eaf, 0x10bc42a6, 0xdaf34a4c, 0x03958f83, 0xc9da8769, 0x0d72cb60, 0xc73dc38a, 0x52fc32d1, 0x98b33a3b, 0x5c1b7632, 0x96547ed8, 0x4f32bb17, 0x857db3fd, 0x41d5fff4, 0x8b9af71e, 0x6961215d, 0xa32e29b7, 0x678665be, 0xadc96d54, 0x74afa89b, 0xbee0a071, 0x7a48ec78, 0xb007e492, 0x00000000, 0x803e706b, 0x9a05b5e1, 0x1a3bc58a, 0xae723ef5, 0x2e4c4e9e, 0x34778b14, 0xb449fb7f, 0xc69d28dd, 0x46a358b6, 0x5c989d3c, 0xdca6ed57, 0x68ef1628, 0xe8d16643, 0xf2eaa3c9, 0x72d4d3a2, 0x1743048d, 0x977d74e6, 0x8d46b16c, 0x0d78c107, 0xb9313a78, 0x390f4a13, 0x23348f99, 0xa30afff2, 0xd1de2c50, 0x51e05c3b, 0x4bdb99b1, 0xcbe5e9da, 0x7fac12a5, 0xff9262ce, 0xe5a9a744, 0x6597d72f, 0x2e86091a, 0xaeb87971, 0xb483bcfb, 0x34bdcc90, 0x80f437ef, 0x00ca4784, 0x1af1820e, 0x9acff265, 0xe81b21c7, 0x682551ac, 0x721e9426, 0xf220e44d, 0x46691f32, 0xc6576f59, 0xdc6caad3, 0x5c52dab8, 0x39c50d97, 0xb9fb7dfc, 0xa3c0b876, 0x23fec81d, 0x97b73362, 0x17894309, 0x0db28683, 0x8d8cf6e8, 0xff58254a, 0x7f665521, 0x655d90ab, 0xe563e0c0, 0x512a1bbf, 0xd1146bd4, 0xcb2fae5e, 0x4b11de35, 0x5d0c1234, 0xdd32625f, 0xc709a7d5, 0x4737d7be, 0xf37e2cc1, 0x73405caa, 0x697b9920, 0xe945e94b, 0x9b913ae9, 0x1baf4a82, 0x01948f08, 0x81aaff63, 0x35e3041c, 0xb5dd7477, 0xafe6b1fd, 0x2fd8c196, 0x4a4f16b9, 0xca7166d2, 0xd04aa358, 0x5074d333, 0xe43d284c, 0x64035827, 0x7e389dad, 0xfe06edc6, 0x8cd23e64, 0x0cec4e0f, 0x16d78b85, 0x96e9fbee, 0x22a00091, 0xa29e70fa, 0xb8a5b570, 0x389bc51b, 0x738a1b2e, 0xf3b46b45, 0xe98faecf, 0x69b1dea4, 0xddf825db, 0x5dc655b0, 0x47fd903a, 0xc7c3e051, 0xb51733f3, 0x35294398, 0x2f128612, 0xaf2cf679, 0x1b650d06, 0x9b5b7d6d, 0x8160b8e7, 0x015ec88c, 0x64c91fa3, 0xe4f76fc8, 0xfeccaa42, 0x7ef2da29, 0xcabb2156, 0x4a85513d, 0x50be94b7, 0xd080e4dc, 0xa254377e, 0x226a4715, 0x3851829f, 0xb86ff2f4, 0x0c26098b, 0x8c1879e0, 0x9623bc6a, 0x161dcc01, 0xba182468, 0x3a265403, 0x201d9189, 0xa023e1e2, 0x146a1a9d, 0x94546af6, 0x8e6faf7c, 0x0e51df17, 0x7c850cb5, 0xfcbb7cde, 0xe680b954, 0x66bec93f, 0xd2f73240, 0x52c9422b, 0x48f287a1, 0xc8ccf7ca, 0xad5b20e5, 0x2d65508e, 0x375e9504, 0xb760e56f, 0x03291e10, 0x83176e7b, 0x992cabf1, 0x1912db9a, 0x6bc60838, 0xebf87853, 0xf1c3bdd9, 0x71fdcdb2, 0xc5b436cd, 0x458a46a6, 0x5fb1832c, 0xdf8ff347, 0x949e2d72, 0x14a05d19, 0x0e9b9893, 0x8ea5e8f8, 0x3aec1387, 0xbad263ec, 0xa0e9a666, 0x20d7d60d, 0x520305af, 0xd23d75c4, 0xc806b04e, 0x4838c025, 0xfc713b5a, 0x7c4f4b31, 0x66748ebb, 0xe64afed0, 0x83dd29ff, 0x03e35994, 0x19d89c1e, 0x99e6ec75, 0x2daf170a, 0xad916761, 0xb7aaa2eb, 0x3794d280, 0x45400122, 0xc57e7149, 0xdf45b4c3, 0x5f7bc4a8, 0xeb323fd7, 0x6b0c4fbc, 0x71378a36, 0xf109fa5d, 0xe714365c, 0x672a4637, 0x7d1183bd, 0xfd2ff3d6, 0x496608a9, 0xc95878c2, 0xd363bd48, 0x535dcd23, 0x21891e81, 0xa1b76eea, 0xbb8cab60, 0x3bb2db0b, 0x8ffb2074, 0x0fc5501f, 0x15fe9595, 0x95c0e5fe, 0xf05732d1, 0x706942ba, 0x6a528730, 0xea6cf75b, 0x5e250c24, 0xde1b7c4f, 0xc420b9c5, 0x441ec9ae, 0x36ca1a0c, 0xb6f46a67, 0xaccfafed, 0x2cf1df86, 0x98b824f9, 0x18865492, 0x02bd9118, 0x8283e173, 0xc9923f46, 0x49ac4f2d, 0x53978aa7, 0xd3a9facc, 0x67e001b3, 0xe7de71d8, 0xfde5b452, 0x7ddbc439, 0x0f0f179b, 0x8f3167f0, 0x950aa27a, 0x1534d211, 0xa17d296e, 0x21435905, 0x3b789c8f, 0xbb46ece4, 0xded13bcb, 0x5eef4ba0, 0x44d48e2a, 0xc4eafe41, 0x70a3053e, 0xf09d7555, 0xeaa6b0df, 0x6a98c0b4, 0x184c1316, 0x9872637d, 0x8249a6f7, 0x0277d69c, 0xb63e2de3, 0x36005d88, 0x2c3b9802, 0xac05e869}; static unsigned _cairo_lfsr_random_state = 0x12345678; static unsigned lfsr_random(void) { unsigned next; next = _cairo_lfsr_random_lut[((_cairo_lfsr_random_state>> 0) & 0xFF) + 0*256]; next ^= _cairo_lfsr_random_lut[((_cairo_lfsr_random_state>> 8) & 0xFF) + 1*256]; next ^= _cairo_lfsr_random_lut[((_cairo_lfsr_random_state>>16) & 0xFF) + 2*256]; next ^= _cairo_lfsr_random_lut[((_cairo_lfsr_random_state>>24) & 0xFF) + 3*256]; return _cairo_lfsr_random_state = next; } /* * Initialize an empty skip list */ void _cairo_skip_list_init (cairo_skip_list_t *list, cairo_skip_list_compare_t compare, size_t elt_size) { int i; list->compare = compare; list->elt_size = elt_size; list->data_size = elt_size - sizeof (skip_elt_t); for (i = 0; i < MAX_LEVEL; i++) { list->chains[i] = NULL; } for (i = 0; i < MAX_FREELIST_LEVEL; i++) { list->freelists[i] = NULL; } list->max_level = 0; } void _cairo_skip_list_fini (cairo_skip_list_t *list) { skip_elt_t *elt; int i; while ((elt = list->chains[0])) { _cairo_skip_list_delete_given (list, elt); } for (i=0; ifreelists[i]; while (elt) { skip_elt_t *nextfree = elt->prev; free (ELT_DATA(elt)); elt = nextfree; } } } /* * Generate a random level number, distributed * so that each level is 1/4 as likely as the one before * * Note that level numbers run 1 <= level < MAX_LEVEL */ static int random_level (void) { int level = 0; /* tricky bit -- each bit is '1' 75% of the time. * This works because we only use the lower MAX_LEVEL * bits, and MAX_LEVEL < 16 */ long int bits = lfsr_random(); bits |= bits >> 16; while (++level < MAX_LEVEL) { if (bits & 1) break; bits >>= 1; } return level; } static void * alloc_node_for_level (cairo_skip_list_t *list, unsigned level) { int freelist_level = FREELIST_FOR_LEVEL (level); if (list->freelists[freelist_level]) { skip_elt_t *elt = list->freelists[freelist_level]; list->freelists[freelist_level] = elt->prev; return ELT_DATA(elt); } return malloc (list->elt_size + (FREELIST_MAX_LEVEL_FOR (level) - 1) * sizeof (skip_elt_t *)); } static void free_elt (cairo_skip_list_t *list, skip_elt_t *elt) { int level = elt->prev_index + 1; int freelist_level = FREELIST_FOR_LEVEL (level); elt->prev = list->freelists[freelist_level]; list->freelists[freelist_level] = elt; } /* * Insert 'data' into the list */ void * _cairo_skip_list_insert (cairo_skip_list_t *list, void *data, int unique) { skip_elt_t **update[MAX_LEVEL]; skip_elt_t *prev[MAX_LEVEL]; char *data_and_elt; skip_elt_t *elt, **next; int i, level, prev_index; /* * Find links along each chain */ next = list->chains; for (i = list->max_level; --i >= 0; ) { for (; (elt = next[i]); next = elt->next) { int cmp = list->compare (list, ELT_DATA(elt), data); if (unique && 0 == cmp) return ELT_DATA(elt); if (cmp > 0) break; } update[i] = next; if (next != list->chains) prev[i] = NEXT_TO_ELT (next); else prev[i] = NULL; } level = random_level (); prev_index = level - 1; /* * Create new list element */ if (level > list->max_level) { level = list->max_level + 1; prev_index = level - 1; prev[prev_index] = NULL; update[list->max_level] = list->chains; list->max_level = level; } data_and_elt = alloc_node_for_level (list, level); if (data_and_elt == NULL) { _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return NULL; } memcpy (data_and_elt, data, list->data_size); elt = (skip_elt_t *) (data_and_elt + list->data_size); elt->prev_index = prev_index; elt->prev = prev[prev_index]; /* * Insert into all chains */ for (i = 0; i < level; i++) { elt->next[i] = update[i][i]; if (elt->next[i] && elt->next[i]->prev_index == i) elt->next[i]->prev = elt; update[i][i] = elt; } return data_and_elt; } void * _cairo_skip_list_find (cairo_skip_list_t *list, void *data) { int i; skip_elt_t **next = list->chains; skip_elt_t *elt; /* * Walk chain pointers one level at a time */ for (i = list->max_level; --i >= 0;) while (next[i] && list->compare (list, data, ELT_DATA(next[i])) > 0) { next = next[i]->next; } /* * Here we are */ elt = next[0]; if (elt && list->compare (list, data, ELT_DATA (elt)) == 0) return ELT_DATA (elt); return NULL; } void _cairo_skip_list_delete (cairo_skip_list_t *list, void *data) { skip_elt_t **update[MAX_LEVEL], *prev[MAX_LEVEL]; skip_elt_t *elt, **next; int i; /* * Find links along each chain */ next = list->chains; for (i = list->max_level; --i >= 0; ) { for (; (elt = next[i]); next = elt->next) { if (list->compare (list, ELT_DATA (elt), data) >= 0) break; } update[i] = &next[i]; if (next == list->chains) prev[i] = NULL; else prev[i] = NEXT_TO_ELT (next); } elt = next[0]; assert (list->compare (list, ELT_DATA (elt), data) == 0); for (i = 0; i < list->max_level && *update[i] == elt; i++) { *update[i] = elt->next[i]; if (elt->next[i] && elt->next[i]->prev_index == i) elt->next[i]->prev = prev[i]; } while (list->max_level > 0 && list->chains[list->max_level - 1] == NULL) list->max_level--; free_elt (list, elt); } void _cairo_skip_list_delete_given (cairo_skip_list_t *list, skip_elt_t *given) { skip_elt_t **update[MAX_LEVEL], *prev[MAX_LEVEL]; skip_elt_t *elt, **next; int i; /* * Find links along each chain */ if (given->prev) next = given->prev->next; else next = list->chains; for (i = given->prev_index + 1; --i >= 0; ) { for (; (elt = next[i]); next = elt->next) { if (elt == given) break; } update[i] = &next[i]; if (next == list->chains) prev[i] = NULL; else prev[i] = NEXT_TO_ELT (next); } elt = next[0]; assert (elt == given); for (i = 0; i < (given->prev_index + 1) && *update[i] == elt; i++) { *update[i] = elt->next[i]; if (elt->next[i] && elt->next[i]->prev_index == i) elt->next[i]->prev = prev[i]; } while (list->max_level > 0 && list->chains[list->max_level - 1] == NULL) list->max_level--; free_elt (list, elt); } libgdiplus-2.11/cairo/src/cairo-scaled-font-subsets-private.h0000664000175000017500000005320612225470167021217 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2006 Red Hat, Inc * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H #define CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H #include "cairoint.h" typedef struct _cairo_scaled_font_subsets_glyph { unsigned int font_id; unsigned int subset_id; unsigned int subset_glyph_index; cairo_bool_t is_scaled; cairo_bool_t is_composite; double x_advance; } cairo_scaled_font_subsets_glyph_t; /** * _cairo_scaled_font_subsets_create_scaled: * * Create a new #cairo_scaled_font_subsets_t object which can be used * to create subsets of any number of #cairo_scaled_font_t * objects. This allows the (arbitrarily large and sparse) glyph * indices of a #cairo_scaled_font_t to be mapped to one or more font * subsets with glyph indices packed into the range * [0 .. max_glyphs_per_subset). * * Return value: a pointer to the newly creates font subsets. The * caller owns this object and should call * _cairo_scaled_font_subsets_destroy() when done with it. **/ cairo_private cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_scaled (void); /** * _cairo_scaled_font_subsets_create_simple: * * Create a new #cairo_scaled_font_subsets_t object which can be used * to create font subsets suitable for embedding as Postscript or PDF * simple fonts. * * Glyphs with an outline path available will be mapped to one font * subset for each font face. Glyphs from bitmap fonts will mapped to * separate font subsets for each #cairo_scaled_font_t object. * * The maximum number of glyphs per subset is 256. Each subset * reserves the first glyph for the .notdef glyph. * * Return value: a pointer to the newly creates font subsets. The * caller owns this object and should call * _cairo_scaled_font_subsets_destroy() when done with it. **/ cairo_private cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_simple (void); /** * _cairo_scaled_font_subsets_create_composite: * * Create a new #cairo_scaled_font_subsets_t object which can be used * to create font subsets suitable for embedding as Postscript or PDF * composite fonts. * * Glyphs with an outline path available will be mapped to one font * subset for each font face. Each unscaled subset has a maximum of * 65536 glyphs except for Type1 fonts which have a maximum of 256 glyphs. * * Glyphs from bitmap fonts will mapped to separate font subsets for * each #cairo_scaled_font_t object. Each unscaled subset has a maximum * of 256 glyphs. * * Each subset reserves the first glyph for the .notdef glyph. * * Return value: a pointer to the newly creates font subsets. The * caller owns this object and should call * _cairo_scaled_font_subsets_destroy() when done with it. **/ cairo_private cairo_scaled_font_subsets_t * _cairo_scaled_font_subsets_create_composite (void); /** * _cairo_scaled_font_subsets_destroy: * @font_subsets: a #cairo_scaled_font_subsets_t object to be destroyed * * Destroys @font_subsets and all resources associated with it. **/ cairo_private void _cairo_scaled_font_subsets_destroy (cairo_scaled_font_subsets_t *font_subsets); /** * _cairo_scaled_font_subsets_map_glyph: * @font_subsets: a #cairo_scaled_font_subsets_t * @scaled_font: the font of the glyph to be mapped * @scaled_font_glyph_index: the index of the glyph to be mapped * @subset_glyph_ret: return structure containing subset font and glyph id * * @font_id_ret: return value giving the font ID of the mapped glyph * @subset_id_ret: return value giving the subset ID of the mapped glyph within the @font_id_ret * @subset_glyph_index_ret: return value giving the index of the mapped glyph within the @subset_id_ret subset * * Map a glyph from a #cairo_scaled_font to a new index within a * subset of that font. The mapping performed is from the tuple: * * (scaled_font, scaled_font_glyph_index) * * to the tuple: * * (font_id, subset_id, subset_glyph_index) * * This mapping is 1:1. If the input tuple has previously mapped, the * the output tuple previously returned will be returned again. * * Otherwise, the return tuple will be constructed as follows: * * 1) There is a 1:1 correspondence between the input scaled_font * value and the output font_id value. If no mapping has been * previously performed with the scaled_font value then the * smallest unused font_id value will be returned. * * 2) Within the set of output tuples of the same font_id value the * smallest value of subset_id will be returned such that * subset_glyph_index does not exceed max_glyphs_per_subset (as * passed to _cairo_scaled_font_subsets_create()) and that the * resulting tuple is unique. * * 3) The smallest value of subset_glyph_index is returned such that * the resulting tuple is unique. * * The net result is that any #cairo_scaled_font_t will be represented * by one or more font subsets. Each subset is effectively a tuple of * (scaled_font, font_id, subset_id) and within each subset there * exists a mapping of scaled_glyph_font_index to subset_glyph_index. * * This final description of a font subset is the same representation * used by #cairo_scaled_font_subset_t as provided by * _cairo_scaled_font_subsets_foreach. * * The returned values in the #cairo_scaled_font_subsets_glyph_t struct are: * * @font_id: The font ID of the mapped glyph * @subset_id : The subset ID of the mapped glyph within the @font_id * @subset_glyph_index: The index of the mapped glyph within the @subset_id subset * @is_scaled: If true, the mapped glyph is from a bitmap font, and separate font * subset is created for each font scale used. If false, the outline of the mapped glyph * is available. One font subset for each font face is created. * @x_advance: When @is_scaled is true, @x_advance contains the x_advance for the mapped glyph in device space. * When @is_scaled is false, @x_advance contains the x_advance for the the mapped glyph from an unhinted 1 point font. * * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero * value indicating an error. Possible errors include * CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_scaled_font_subsets_map_glyph (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_t *scaled_font, unsigned long scaled_font_glyph_index, cairo_scaled_font_subsets_glyph_t *subset_glyph_ret); typedef cairo_status_t (*cairo_scaled_font_subset_callback_func_t) (cairo_scaled_font_subset_t *font_subset, void *closure); /** * _cairo_scaled_font_subsets_foreach: * @font_subsets: a #cairo_scaled_font_subsets_t * @font_subset_callback: a function to be called for each font subset * @closure: closure data for the callback function * * Iterate over each unique scaled font subset as created by calls to * _cairo_scaled_font_subsets_map_glyph(). A subset is determined by * unique pairs of (font_id, subset_id) as returned by * _cairo_scaled_font_subsets_map_glyph(). * * For each subset, @font_subset_callback will be called and will be * provided with both a #cairo_scaled_font_subset_t object containing * all the glyphs in the subset as well as the value of @closure. * * The #cairo_scaled_font_subset_t object contains the scaled_font, * the font_id, and the subset_id corresponding to all glyphs * belonging to the subset. In addition, it contains an array providing * a mapping between subset glyph indices and the original scaled font * glyph indices. * * The index of the array corresponds to subset_glyph_index values * returned by _cairo_scaled_font_subsets_map_glyph() while the * values of the array correspond to the scaled_font_glyph_index * values passed as input to the same function. * * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero * value indicating an error. Possible errors include * CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_scaled_font_subsets_foreach_scaled (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_subset_callback_func_t font_subset_callback, void *closure); /** * _cairo_scaled_font_subsets_foreach_unscaled: * @font_subsets: a #cairo_scaled_font_subsets_t * @font_subset_callback: a function to be called for each font subset * @closure: closure data for the callback function * * Iterate over each unique unscaled font subset as created by calls to * _cairo_scaled_font_subsets_map_glyph(). A subset is determined by * unique pairs of (font_id, subset_id) as returned by * _cairo_scaled_font_subsets_map_glyph(). * * For each subset, @font_subset_callback will be called and will be * provided with both a #cairo_scaled_font_subset_t object containing * all the glyphs in the subset as well as the value of @closure. * * The #cairo_scaled_font_subset_t object contains the scaled_font, * the font_id, and the subset_id corresponding to all glyphs * belonging to the subset. In addition, it contains an array providing * a mapping between subset glyph indices and the original scaled font * glyph indices. * * The index of the array corresponds to subset_glyph_index values * returned by _cairo_scaled_font_subsets_map_glyph() while the * values of the array correspond to the scaled_font_glyph_index * values passed as input to the same function. * * Return value: %CAIRO_STATUS_SUCCESS if successful, or a non-zero * value indicating an error. Possible errors include * CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_scaled_font_subsets_foreach_unscaled (cairo_scaled_font_subsets_t *font_subsets, cairo_scaled_font_subset_callback_func_t font_subset_callback, void *closure); /** * _cairo_scaled_font_subset_create_glyph_names: * @font_subsets: a #cairo_scaled_font_subsets_t * * Create an array of strings containing the glyph name for each glyph * in @font_subsets. The array as store in font_subsets->glyph_names. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font backend does not support * mapping the glyph indices to unicode characters. Possible errors * include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_int_status_t _cairo_scaled_font_subset_create_glyph_names (cairo_scaled_font_subset_t *subset); typedef struct _cairo_cff_subset { char *base_font; int *widths; long x_min, y_min, x_max, y_max; long ascent, descent; char *data; unsigned long data_length; } cairo_cff_subset_t; /** * _cairo_cff_subset_init: * @cff_subset: a #cairo_cff_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a * cff file corresponding to @font_subset and initialize * @cff_subset with information about the subset and the cff * data. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a * cff file, or an non-zero value indicating an error. Possible * errors include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_cff_subset_init (cairo_cff_subset_t *cff_subset, const char *name, cairo_scaled_font_subset_t *font_subset); /** * _cairo_cff_subset_fini: * @cff_subset: a #cairo_cff_subset_t * * Free all resources associated with @cff_subset. After this * call, @cff_subset should not be used again without a * subsequent call to _cairo_cff_subset_init() again first. **/ cairo_private void _cairo_cff_subset_fini (cairo_cff_subset_t *cff_subset); /** * _cairo_cff_fallback_init: * @cff_subset: a #cairo_cff_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a cff * file corresponding to @font_subset and initialize @cff_subset * with information about the subset and the cff data. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a * cff file, or an non-zero value indicating an error. Possible * errors include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_cff_fallback_init (cairo_cff_subset_t *cff_subset, const char *name, cairo_scaled_font_subset_t *font_subset); /** * _cairo_cff_fallback_fini: * @cff_subset: a #cairo_cff_subset_t * * Free all resources associated with @cff_subset. After this * call, @cff_subset should not be used again without a * subsequent call to _cairo_cff_subset_init() again first. **/ cairo_private void _cairo_cff_fallback_fini (cairo_cff_subset_t *cff_subset); typedef struct _cairo_truetype_subset { char *base_font; double *widths; double x_min, y_min, x_max, y_max; double ascent, descent; char *data; unsigned long data_length; unsigned long *string_offsets; unsigned long num_string_offsets; } cairo_truetype_subset_t; /** * _cairo_truetype_subset_init: * @truetype_subset: a #cairo_truetype_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a * truetype file corresponding to @font_subset and initialize * @truetype_subset with information about the subset and the truetype * data. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a * truetype file, or an non-zero value indicating an error. Possible * errors include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_truetype_subset_init (cairo_truetype_subset_t *truetype_subset, cairo_scaled_font_subset_t *font_subset); /** * _cairo_truetype_subset_fini: * @truetype_subset: a #cairo_truetype_subset_t * * Free all resources associated with @truetype_subset. After this * call, @truetype_subset should not be used again without a * subsequent call to _cairo_truetype_subset_init() again first. **/ cairo_private void _cairo_truetype_subset_fini (cairo_truetype_subset_t *truetype_subset); typedef struct _cairo_type1_subset { char *base_font; int *widths; long x_min, y_min, x_max, y_max; long ascent, descent; char *data; unsigned long header_length; unsigned long data_length; unsigned long trailer_length; } cairo_type1_subset_t; /** * _cairo_type1_subset_init: * @type1_subset: a #cairo_type1_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * @hex_encode: if true the encrypted portion of the font is hex encoded * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a type1 * file corresponding to @font_subset and initialize @type1_subset * with information about the subset and the type1 data. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 * file, or an non-zero value indicating an error. Possible errors * include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_type1_subset_init (cairo_type1_subset_t *type_subset, const char *name, cairo_scaled_font_subset_t *font_subset, cairo_bool_t hex_encode); /** * _cairo_type1_subset_fini: * @type1_subset: a #cairo_type1_subset_t * * Free all resources associated with @type1_subset. After this call, * @type1_subset should not be used again without a subsequent call to * _cairo_truetype_type1_init() again first. **/ cairo_private void _cairo_type1_subset_fini (cairo_type1_subset_t *subset); /** * _cairo_type1_scaled_font_is_type1: * @scaled_font: a #cairo_scaled_font_t * * Return %TRUE if @scaled_font is a Type 1 font, otherwise return %FALSE. **/ cairo_private cairo_bool_t _cairo_type1_scaled_font_is_type1 (cairo_scaled_font_t *scaled_font); /** * _cairo_type1_fallback_init_binary: * @type1_subset: a #cairo_type1_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a type1 * file corresponding to @font_subset and initialize @type1_subset * with information about the subset and the type1 data. The encrypted * part of the font is binary encoded. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 * file, or an non-zero value indicating an error. Possible errors * include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_type1_fallback_init_binary (cairo_type1_subset_t *type_subset, const char *name, cairo_scaled_font_subset_t *font_subset); /** * _cairo_type1_fallback_init_hexencode: * @type1_subset: a #cairo_type1_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate a type1 * file corresponding to @font_subset and initialize @type1_subset * with information about the subset and the type1 data. The encrypted * part of the font is hex encoded. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type1 * file, or an non-zero value indicating an error. Possible errors * include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_type1_fallback_init_hex (cairo_type1_subset_t *type_subset, const char *name, cairo_scaled_font_subset_t *font_subset); /** * _cairo_type1_fallback_fini: * @type1_subset: a #cairo_type1_subset_t * * Free all resources associated with @type1_subset. After this call, * @type1_subset should not be used again without a subsequent call to * _cairo_truetype_type1_init() again first. **/ cairo_private void _cairo_type1_fallback_fini (cairo_type1_subset_t *subset); typedef struct _cairo_type2_charstrings { int *widths; long x_min, y_min, x_max, y_max; long ascent, descent; cairo_array_t charstrings; } cairo_type2_charstrings_t; /** * _cairo_type2_charstrings_init: * @type2_subset: a #cairo_type2_subset_t to initialize * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) generate type2 * charstrings to @font_subset and initialize @type2_subset * with information about the subset. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the font can't be subset as a type2 * charstrings, or an non-zero value indicating an error. Possible errors * include %CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_status_t _cairo_type2_charstrings_init (cairo_type2_charstrings_t *charstrings, cairo_scaled_font_subset_t *font_subset); /** * _cairo_type2_charstrings_fini: * @subset: a #cairo_type2_charstrings_t * * Free all resources associated with @type2_charstring. After this call, * @type2_charstring should not be used again without a subsequent call to * _cairo_type2_charstring_init() again first. **/ cairo_private void _cairo_type2_charstrings_fini (cairo_type2_charstrings_t *charstrings); /** * _cairo_truetype_create_glyph_to_unicode_map: * @font_subset: the #cairo_scaled_font_subset_t to initialize from * * If possible (depending on the format of the underlying * #cairo_scaled_font_t and the font backend in use) assign * the unicode character of each glyph in font_subset to * fontsubset->to_unicode. * * Return value: %CAIRO_STATUS_SUCCESS if successful, * CAIRO_INT_STATUS_UNSUPPORTED if the unicode encoding of * the glyphs is not available. Possible errors include * CAIRO_STATUS_NO_MEMORY. **/ cairo_private cairo_int_status_t _cairo_truetype_create_glyph_to_unicode_map (cairo_scaled_font_subset_t *font_subset); #endif /* CAIRO_SCALED_FONT_SUBSETS_PRIVATE_H */ libgdiplus-2.11/cairo/src/cairo-freelist-private.h0000664000175000017500000000542312225470167017145 00000000000000/* * Copyright © 2006 Joonas Pihlaja * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that * the above copyright notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting documentation, and * that the name of the copyright holders not be used in advertising or * publicity pertaining to distribution of the software without specific, * written prior permission. The copyright holders make no representations * about the suitability of this software for any purpose. It is provided "as * is" without express or implied warranty. * * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE * OF THIS SOFTWARE. */ #ifndef CAIRO_FREELIST_H #define CAIRO_FREELIST_H #include "cairo-types-private.h" /* Opaque implementation types. */ typedef struct _cairo_freelist cairo_freelist_t; typedef struct _cairo_freelist_node cairo_freelist_node_t; struct _cairo_freelist_node { cairo_freelist_node_t *next; }; struct _cairo_freelist { cairo_freelist_node_t *first_free_node; unsigned nodesize; }; /* Initialise a freelist that will be responsible for allocating * nodes of size nodesize. */ cairo_private void _cairo_freelist_init (cairo_freelist_t *freelist, unsigned nodesize); /* Deallocate any nodes in the freelist. */ cairo_private void _cairo_freelist_fini (cairo_freelist_t *freelist); /* Allocate a new node from the freelist. If the freelist contains no * nodes, a new one will be allocated using malloc(). The caller is * responsible for calling _cairo_freelist_free() or free() on the * returned node. Returns %NULL on memory allocation error. */ cairo_private void * _cairo_freelist_alloc (cairo_freelist_t *freelist); /* Allocate a new node from the freelist. If the freelist contains no * nodes, a new one will be allocated using calloc(). The caller is * responsible for calling _cairo_freelist_free() or free() on the * returned node. Returns %NULL on memory allocation error. */ cairo_private void * _cairo_freelist_calloc (cairo_freelist_t *freelist); /* Return a node to the freelist. This does not deallocate the memory, * but makes it available for later reuse by * _cairo_freelist_alloc(). */ cairo_private void _cairo_freelist_free (cairo_freelist_t *freelist, void *node); #endif /* CAIRO_FREELIST_H */ libgdiplus-2.11/cairo/src/cairo-analysis-surface-private.h0000664000175000017500000000422012225470167020573 00000000000000/* * Copyright © 2005 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith Packard */ #ifndef CAIRO_ANALYSIS_SURFACE_H #define CAIRO_ANALYSIS_SURFACE_H #include "cairoint.h" cairo_private cairo_surface_t * _cairo_analysis_surface_create (cairo_surface_t *target, int width, int height); cairo_private cairo_region_t * _cairo_analysis_surface_get_supported (cairo_surface_t *surface); cairo_private cairo_region_t * _cairo_analysis_surface_get_unsupported (cairo_surface_t *surface); cairo_private cairo_bool_t _cairo_analysis_surface_has_supported (cairo_surface_t *surface); cairo_private cairo_bool_t _cairo_analysis_surface_has_unsupported (cairo_surface_t *surface); cairo_private void _cairo_analysis_surface_get_bounding_box (cairo_surface_t *surface, cairo_box_t *bbox); #endif /* CAIRO_ANALYSIS_SURFACE_H */ libgdiplus-2.11/cairo/src/cairo-ps.h0000664000175000017500000000700212225470167014275 00000000000000/* cairo - a vector graphics library with display and print output * * Copyright © 2002 University of Southern California * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is University of Southern * California. * * Contributor(s): * Carl D. Worth */ #ifndef CAIRO_PS_H #define CAIRO_PS_H #include #if CAIRO_HAS_PS_SURFACE #include CAIRO_BEGIN_DECLS /* PS-surface functions */ /** * cairo_ps_level_t: * @CAIRO_PS_LEVEL_2: The language level 2 of the PostScript specification. * @CAIRO_PS_LEVEL_3: The language level 3 of the PostScript specification. * * #cairo_ps_level_t is used to describe the language level of the * PostScript Language Reference that a generated PostScript file will * conform to. */ typedef enum _cairo_ps_level { CAIRO_PS_LEVEL_2, CAIRO_PS_LEVEL_3 } cairo_ps_level_t; cairo_public cairo_surface_t * cairo_ps_surface_create (const char *filename, double width_in_points, double height_in_points); cairo_public cairo_surface_t * cairo_ps_surface_create_for_stream (cairo_write_func_t write_func, void *closure, double width_in_points, double height_in_points); cairo_public void cairo_ps_surface_restrict_to_level (cairo_surface_t *surface, cairo_ps_level_t level); cairo_public void cairo_ps_get_levels (cairo_ps_level_t const **levels, int *num_levels); cairo_public const char * cairo_ps_level_to_string (cairo_ps_level_t level); cairo_public void cairo_ps_surface_set_eps (cairo_surface_t *surface, cairo_bool_t eps); cairo_public cairo_bool_t cairo_ps_surface_get_eps (cairo_surface_t *surface); cairo_public void cairo_ps_surface_set_size (cairo_surface_t *surface, double width_in_points, double height_in_points); cairo_public void cairo_ps_surface_dsc_comment (cairo_surface_t *surface, const char *comment); cairo_public void cairo_ps_surface_dsc_begin_setup (cairo_surface_t *surface); cairo_public void cairo_ps_surface_dsc_begin_page_setup (cairo_surface_t *surface); CAIRO_END_DECLS #else /* CAIRO_HAS_PS_SURFACE */ # error Cairo was not compiled with support for the ps backend #endif /* CAIRO_HAS_PS_SURFACE */ #endif /* CAIRO_PS_H */ libgdiplus-2.11/cairo/COPYING-LGPL-2.10000664000175000017500000006364012225470167013717 00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! libgdiplus-2.11/cairo/RELEASING0000664000175000017500000001167112225470167013063 00000000000000Here are the steps to follow to create a new cairo release: 1) Ensure that there are no local, uncommitted/unspushed modifications. You're probably in a good state if both "git diff HEAD" and "git log master..origin/master" give no output. 2) Verify that the code passes "make distcheck" First, make sure you have 'nm' and 'readelf' commands in PATH. this should be Ok with any Linux distro. Running "make distcheck" should result in no warnings or errors and end with a message of the form: ================================================== cairo-X.Y.Z-head archives ready for distribution: cairo-X.Y.Z-head.tar.gz ================================================== (But the tar file isn't actually ready yet, as we still have some more steps to follow). If you get errors about local PLT entries, you get the list of cairo and pixman entries with the error. For each of these, a call to slim_hidden_def and slim_hidden_proto is needed in the cairo or pixman implementation in the style of other similar calls. 3) Fill out an entry in the NEWS file Sift through the logs since the last release. This is most easily done with a comand such as: git log --stat X.Y.Z.. where X.Y.Z is the previous release version. Summarize major changes briefly in a style similar to other entries in NEWS. Take special care to note any additions in the API. These should be easy to find by noting modifications to .h files in the log command above. And more specifically, the following command will show each patch that has changed a public header file since the given version: find src/ -name '*.h' ! -name '*-private.h' ! -name 'cairoint.h' | \ xargs git log -p X.Y.Z.. -- 4) Increment cairo_version_{minor|micro} and LT_{CURRENT|VERSION|AGE} in configure.in: If there are backward-incompatible changes in the API, stop now and don't release. Go back and fix the API instead. Cairo is intended to remain backwards-compatible as far as API. So cairo_version_major will not be incremented unless we come up with a new versioning scheme to take advantage of it. If there are API additions, then increment cairo_version_minor and reset cairo_version_micro to 0. NOTE: The minor version is only incremented for releases, not for snapshots. Otherwise, (ie. there are only bug fixes), increment cairo_version_micro to the next larger (even) number. Adjust LT_CURRENT, LT_VERSION, and LT_AGE as described in the comments in configure.in. 5) Commit the changes to NEWS and configure.in It's especially important to mention the new version number in your commit log. 6) Run "make release-publish" which will perform the following steps for you: * Generate ChangeLog files out of git repository * Check that ChangeLog files were generated properly * Check that the version number ends with an even micro component * Check that no release exists with the current version * Verify that make distcheck completes successfully * Generate the final tar file * Generate an sha1sum file * Sign the sha1sum using your GPG setup (asks for your GPG password) * scp the three files to appear on http://cairographics.org/releases * Place local copies of the three files in the releases directory * Create a LATEST-package-version file (after deleting any old one) * Tag the entire source tree with a tag of the form X.Y.Z, and sign the tag with your GPG key (asks for your GPG password, and you may need to set GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL to match your public-key's setting or this fails.) * Provide some text for the release announcement (see below). If for some reason you lost this message, "make release-publish-message" prints it for you. 7) Increment cairo_version_micro to the next larger (odd) number in configure, commit, and push. 8) Push the newly created tag out to the central tree with a command something like: git push cairo X.Y.Z 9) Edit the cairo bugzilla product and add the new version numbers. Note that you need to add two versions. One for the release/snapshot (with an even micro version), another with the post-release version (with an odd micro version). 10) Send a message to cairo-announce@cairographics.org and CC gnome-announce-list@gnome.org to announce the new release using the text provided from "make release-publish", adding the excerpt from NEWS, your signature, followed by the standard "What is cairo" and "Where to get more information about cairo" blurbs from README, and finally tacking on the detailed changelog-ish thing that gets mailed out when you push the tag (but not the diffstat thing). 11) Edit the cairo wiki to add the announcement to the NEWS page and the front page. (just the parts before your signature). 12) For minor releases (no X.Y change), notify desktop-devel-list@gnome.org or update the ExternalDependencies page for the current cycle if you know where it is. Currently it's: http://live.gnome.org/TwoPointNineteen/ExternalDependencies libgdiplus-2.11/cairo/configure0000775000175000017500000300620112225470241013523 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for cairo 1.6.4. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: http://bugs.freedesktop.org/enter_bug.cgi?product=cairo $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='cairo' PACKAGE_TARNAME='cairo' PACKAGE_VERSION='1.6.4' PACKAGE_STRING='cairo 1.6.4' PACKAGE_BUGREPORT='http://bugs.freedesktop.org/enter_bug.cgi?product=cairo' PACKAGE_URL='' ac_unique_file="src/cairo.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS DISABLE_SOME_FLOATING_POINT_FALSE DISABLE_SOME_FLOATING_POINT_TRUE CAIRO_HAS_TEST_SURFACES_FALSE CAIRO_HAS_TEST_SURFACES_TRUE CAIRO_HAS_LCOV_FALSE CAIRO_HAS_LCOV_TRUE LTP_GENHTML LTP SHTOOL PKGCONFIG_REQUIRES GTK_DOC_USE_LIBTOOL_FALSE GTK_DOC_USE_LIBTOOL_TRUE ENABLE_GTK_DOC_FALSE ENABLE_GTK_DOC_TRUE HTML_DIR CAIROPERF_LIBS CAIRO_LIBS CAIRO_LDADD CAIRO_CFLAGS CAIRO_NONPKGCONFIG_LIBS CAIRO_NONPKGCONFIG_CFLAGS CAIRO_REQUIRES CAIRO_CAN_TEST_SVG_SURFACE_FALSE CAIRO_CAN_TEST_SVG_SURFACE_TRUE LIBRSVG_LIBS LIBRSVG_CFLAGS CAIRO_HAS_SVG_SURFACE_FALSE CAIRO_HAS_SVG_SURFACE_TRUE CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE CAIRO_CAN_TEST_PDF_SURFACE_FALSE CAIRO_CAN_TEST_PDF_SURFACE_TRUE POPPLER_LIBS POPPLER_CFLAGS CAIRO_HAS_PDF_SURFACE_FALSE CAIRO_HAS_PDF_SURFACE_TRUE CAIRO_CAN_TEST_PS_SURFACE_FALSE CAIRO_CAN_TEST_PS_SURFACE_TRUE CAIRO_HAS_PS_SURFACE_FALSE CAIRO_HAS_PS_SURFACE_TRUE HAVE_PTHREAD_FALSE HAVE_PTHREAD_TRUE CAIRO_HAS_FT_FONT_FALSE CAIRO_HAS_FT_FONT_TRUE FREETYPE_CONFIG FREETYPE_LIBS FREETYPE_CFLAGS FONTCONFIG_LIBS FONTCONFIG_CFLAGS CAIRO_HAS_DIRECTFB_SURFACE_FALSE CAIRO_HAS_DIRECTFB_SURFACE_TRUE directfb_LIBS directfb_CFLAGS CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_FALSE CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_TRUE CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_FALSE CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_TRUE CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_FALSE CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_TRUE CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_FALSE CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_TRUE GLITZ_WGL_LIBS GLITZ_WGL_CFLAGS GLITZ_GLX_LIBS GLITZ_GLX_CFLAGS GLITZ_EGL_LIBS GLITZ_EGL_CFLAGS GLITZ_AGL_LIBS GLITZ_AGL_CFLAGS CAIRO_HAS_GLITZ_SURFACE_FALSE CAIRO_HAS_GLITZ_SURFACE_TRUE glitz_LIBS glitz_CFLAGS CAIRO_HAS_PNG_FUNCTIONS_FALSE CAIRO_HAS_PNG_FUNCTIONS_TRUE png_LIBS png_CFLAGS png_REQUIRES CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX CAIRO_HAS_BEOS_SURFACE_FALSE CAIRO_HAS_BEOS_SURFACE_TRUE CAIRO_HAS_OS2_SURFACE_FALSE CAIRO_HAS_OS2_SURFACE_TRUE CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE GS CAIRO_HAS_WIN32_FONT_FALSE CAIRO_HAS_WIN32_FONT_TRUE CAIRO_HAS_WIN32_SURFACE_FALSE CAIRO_HAS_WIN32_SURFACE_TRUE OS_WIN32_FALSE OS_WIN32_TRUE CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE CAIRO_HAS_QUARTZ_FONT_FALSE CAIRO_HAS_QUARTZ_FONT_TRUE CAIRO_HAS_QUARTZ_SURFACE_FALSE CAIRO_HAS_QUARTZ_SURFACE_TRUE CAIRO_HAS_XCB_SURFACE_FALSE CAIRO_HAS_XCB_SURFACE_TRUE xcb_LIBS xcb_CFLAGS CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE xlib_xrender_LIBS xlib_xrender_CFLAGS CAIRO_HAS_XLIB_SURFACE_FALSE CAIRO_HAS_XLIB_SURFACE_TRUE X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF xlib_LIBS xlib_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG LIBM OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL OBJDUMP DLLTOOL AS host_os host_vendor host_cpu host build_os build_vendor build_cpu build CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC XARGS FIND CAIRO_VERSION_MICRO CAIRO_VERSION_MINOR CAIRO_VERSION_MAJOR LT_CURRENT_MINUS_AGE VERSION_INFO am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_dependency_tracking enable_shared enable_static with_pic enable_fast_install with_gnu_ld with_sysroot enable_libtool_lock enable_xlib with_x enable_xlib_xrender enable_xcb enable_quartz enable_quartz_font enable_quartz_image enable_win32 enable_win32_font enable_os2 enable_beos enable_png enable_glitz enable_directfb enable_freetype enable_pthread enable_ps enable_pdf enable_svg with_html_dir enable_gtk_doc enable_gcov enable_test_surfaces enable_some_floating_point ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR xlib_CFLAGS xlib_LIBS XMKMF xlib_xrender_CFLAGS xlib_xrender_LIBS xcb_CFLAGS xcb_LIBS CXX CXXFLAGS CCC CXXCPP png_REQUIRES png_CFLAGS png_LIBS glitz_CFLAGS glitz_LIBS GLITZ_AGL_CFLAGS GLITZ_AGL_LIBS GLITZ_EGL_CFLAGS GLITZ_EGL_LIBS GLITZ_GLX_CFLAGS GLITZ_GLX_LIBS GLITZ_WGL_CFLAGS GLITZ_WGL_LIBS directfb_CFLAGS directfb_LIBS FONTCONFIG_CFLAGS FONTCONFIG_LIBS FREETYPE_CFLAGS FREETYPE_LIBS POPPLER_CFLAGS POPPLER_LIBS LIBRSVG_CFLAGS LIBRSVG_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures cairo 1.6.4 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/cairo] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of cairo 1.6.4:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-libtool-lock avoid locking (might break parallel builds) --enable-xlib=[no/auto/yes] Enable cairo's Xlib backend [default=auto] --enable-xlib-xrender=[no/auto/yes] Enable cairo's Xlib Xrender backend [default=auto] --enable-xcb=[no/auto/yes] Enable cairo's XCB backend [default=no] --enable-quartz=[no/auto/yes] Enable cairo's Quartz backend [default=auto] --enable-quartz-font=[no/auto/yes] Enable cairo's Quartz font backend [default=auto] --enable-quartz-image=[no/auto/yes] Enable cairo's Quartz Image backend [default=no] --enable-win32=[no/auto/yes] Enable cairo's Microsoft Windows backend [default=auto] --enable-win32-font=[no/auto/yes] Enable cairo's Microsoft Windows font backend [default=auto] --enable-os2=[no/auto/yes] Enable cairo's OS/2 backend [default=no] --enable-beos=[no/auto/yes] Enable cairo's BeOS/Zeta backend [default=no] --enable-png=[no/auto/yes] Enable cairo's PNG backend [default=yes] --enable-glitz=[no/auto/yes] Enable cairo's glitz backend [default=no] --enable-directfb=[no/auto/yes] Enable cairo's directfb backend [default=no] --enable-freetype=[no/auto/yes] Enable cairo's FreeType font backend [default=auto] --disable-pthread Do not use pthread --enable-ps=[no/auto/yes] Enable cairo's PostScript backend [default=yes] --enable-pdf=[no/auto/yes] Enable cairo's PDF backend [default=yes] --enable-svg=[no/auto/yes] Enable cairo's SVG backend [default=yes] --enable-gtk-doc use gtk-doc to build documentation [default=no] --enable-gcov Enable gcov --enable-test-surfaces Add backends for more test suite coverage (no additional public functionality) --disable-some-floating-point Disable certain code paths that rely heavily on double precision floating-point calculation. This option can improve performance on systems without a double precision floating-point unit, but might degrade performance on those that do. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-x use the X Window System --with-html-dir=PATH path to installed docs Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path xlib_CFLAGS C compiler flags for xlib, overriding pkg-config xlib_LIBS linker flags for xlib, overriding pkg-config XMKMF Path to xmkmf, Makefile generator for X Window System xlib_xrender_CFLAGS C compiler flags for xlib_xrender, overriding pkg-config xlib_xrender_LIBS linker flags for xlib_xrender, overriding pkg-config xcb_CFLAGS C compiler flags for xcb, overriding pkg-config xcb_LIBS linker flags for xcb, overriding pkg-config CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor png_REQUIRES module name for libpng to search for using pkg-config png_CFLAGS C compiler flags for png, overriding pkg-config png_LIBS linker flags for png, overriding pkg-config glitz_CFLAGS C compiler flags for glitz, overriding pkg-config glitz_LIBS linker flags for glitz, overriding pkg-config GLITZ_AGL_CFLAGS C compiler flags for GLITZ_AGL, overriding pkg-config GLITZ_AGL_LIBS linker flags for GLITZ_AGL, overriding pkg-config GLITZ_EGL_CFLAGS C compiler flags for GLITZ_EGL, overriding pkg-config GLITZ_EGL_LIBS linker flags for GLITZ_EGL, overriding pkg-config GLITZ_GLX_CFLAGS C compiler flags for GLITZ_GLX, overriding pkg-config GLITZ_GLX_LIBS linker flags for GLITZ_GLX, overriding pkg-config GLITZ_WGL_CFLAGS C compiler flags for GLITZ_WGL, overriding pkg-config GLITZ_WGL_LIBS linker flags for GLITZ_WGL, overriding pkg-config directfb_CFLAGS C compiler flags for directfb, overriding pkg-config directfb_LIBS linker flags for directfb, overriding pkg-config FONTCONFIG_CFLAGS C compiler flags for FONTCONFIG, overriding pkg-config FONTCONFIG_LIBS linker flags for FONTCONFIG, overriding pkg-config FREETYPE_CFLAGS C compiler flags for FREETYPE, overriding pkg-config FREETYPE_LIBS linker flags for FREETYPE, overriding pkg-config POPPLER_CFLAGS C compiler flags for POPPLER, overriding pkg-config POPPLER_LIBS linker flags for POPPLER, overriding pkg-config LIBRSVG_CFLAGS C compiler flags for LIBRSVG, overriding pkg-config LIBRSVG_LIBS linker flags for LIBRSVG, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF cairo configure 1.6.4 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## ---------------------------------------------------------------------- ## ## Report this to http://bugs.freedesktop.org/enter_bug.cgi?product=cairo ## ## ---------------------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES # ---------------------------------------------------- # Tries to find if the field MEMBER exists in type AGGR, after including # INCLUDES, setting cache variable VAR accordingly. ac_fn_c_check_member () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5 $as_echo_n "checking for $2.$3... " >&6; } if eval \${$4+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $5 int main () { static $2 ac_aggr; if (sizeof ac_aggr.$3) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$4=yes" else eval "$4=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$4 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_member # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by cairo $as_me 1.6.4, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" am__api_version='1.11' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='cairo' VERSION='1.6.4' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # libtool shared library version # Increment if the interface has additions, changes, removals. # Increment any time the source changes; set to # 0 if you increment CURRENT # Increment if any interfaces have been added; set to 0 # if any interfaces have been removed. removal has # precedence over adding, so set to 0 if both happened. + VERSION_INFO="19:5:17" LT_CURRENT_MINUS_AGE=2 CAIRO_VERSION_MAJOR=1 CAIRO_VERSION_MINOR=6 CAIRO_VERSION_MICRO=4 # Extract the first word of "find", so it can be a program name with args. set dummy find; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FIND+:} false; then : $as_echo_n "(cached) " >&6 else case $FIND in [\\/]* | ?:[\\/]*) ac_cv_path_FIND="$FIND" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FIND="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi FIND=$ac_cv_path_FIND if test -n "$FIND"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FIND" >&5 $as_echo "$FIND" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xargs", so it can be a program name with args. set dummy xargs; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XARGS+:} false; then : $as_echo_n "(cached) " >&6 else case $XARGS in [\\/]* | ?:[\\/]*) ac_cv_path_XARGS="$XARGS" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XARGS="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XARGS=$ac_cv_path_XARGS if test -n "$XARGS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XARGS" >&5 $as_echo "$XARGS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AS=$ac_cv_prog_AS if test -n "$AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 $as_echo "$AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 $as_echo "$ac_ct_AS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) 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]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${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' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${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' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$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" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$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" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="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}" module_expsym_cmds="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}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$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' else archive_cmds='$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' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$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' fi else archive_cmds='$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' archive_expsym_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$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' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $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' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 $as_echo_n "checking for inline... " >&6; } if ${ac_cv_c_inline+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_inline=$ac_kw fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext test "$ac_cv_c_inline" != no && break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 $as_echo "$ac_cv_c_inline" >&6; } case $ac_cv_c_inline in inline | yes) ;; *) case $ac_cv_c_inline in no) ac_val=;; *) ac_val=$ac_cv_c_inline;; esac cat >>confdefs.h <<_ACEOF #ifndef __cplusplus #define inline $ac_val #endif _ACEOF ;; esac case $host_os in darwin*) ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether float word ordering is bigendian" >&5 $as_echo_n "checking whether float word ordering is bigendian... " >&6; } if ${ax_cv_c_float_words_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else # The endianess is detected by first compiling C code that contains a special # double float value, then grepping the resulting object file for certain # strings of ascii values. The double is specially crafted to have a # binary representation that corresponds with a simple string. In this # implementation, the string "noonsees" was selected because the individual # word values ("noon" and "sees") are palindromes, thus making this test # byte-order agnostic. If grep finds the string "noonsees" in the object # file, the target platform stores float words in big-endian order. If grep # finds "seesnoon", float words are in little-endian order. If neither value # is found, the user is instructed to specify the ordering. ax_cv_c_float_words_bigendian=unknown cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ double d = 90904234967036810337470478905505011476211692735615632014797120844053488865816695273723469097858056257517020191247487429516932130503560650002327564517570778480236724525140520121371739201496540132640109977779420565776568942592.0; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if strings - conftest.$ac_objext | grep noonsees >/dev/null ; then ax_cv_c_float_words_bigendian=yes fi if strings - conftest.$ac_objext | grep seesnoon >/dev/null ; then if test "$ax_cv_c_float_words_bigendian" = unknown; then ax_cv_c_float_words_bigendian=no else ax_cv_c_float_words_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_c_float_words_bigendian" >&5 $as_echo "$ax_cv_c_float_words_bigendian" >&6; } case $ax_cv_c_float_words_bigendian in yes) $as_echo "#define FLOAT_WORDS_BIGENDIAN 1" >>confdefs.h ;; no) ;; *) as_fn_error $? " Unknown float word ordering. You need to manually preset ax_cv_c_float_words_bigendian=no (or yes) according to your system. " "$LINENO" 5 ;; esac ;; esac for ac_func in vasnprintf ctime_r drand48 do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Sun Solaris (non-POSIX ctime_r)" >&5 $as_echo_n "checking for Sun Solaris (non-POSIX ctime_r)... " >&6; } case "$host" in *-*-solaris*) CFLAGS="$CFLAGS -D_POSIX_PTHREAD_SEMANTICS" solaris_posix_pthread=yes ;; *) solaris_posix_pthread=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $solaris_posix_pthread" >&5 $as_echo "$solaris_posix_pthread" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native atomic primitives" >&5 $as_echo_n "checking for native atomic primitives... " >&6; } cairo_atomic_primitives="none" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int atomic_add(int i) { return __sync_fetch_and_add (&i, 1); } int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : $as_echo "#define CAIRO_HAS_INTEL_ATOMIC_PRIMITIVES 1" >>confdefs.h cairo_atomic_primitives="Intel" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_atomic_primitives" >&5 $as_echo "$cairo_atomic_primitives" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether atomic ops require a memory barrier" >&5 $as_echo_n "checking whether atomic ops require a memory barrier... " >&6; } case $host_cpu in i?86) cairo_atomic_op_needs_memory_barrier="no" ;; x86_64) cairo_atomic_op_needs_memory_barrier="no" ;; arm*) cairo_atomic_op_needs_memory_barrier="no" ;; *) cairo_atomic_op_needs_memory_barrier="yes" ;; esac if test "x$cairo_atomic_op_needs_memory_barrier" = "xyes"; then cat >>confdefs.h <<_ACEOF #define CAIRO_ATOMIC_OP_NEEDS_MEMORY_BARRIER 1 _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_atomic_op_needs_memory_barrier" >&5 $as_echo "$cairo_atomic_op_needs_memory_barrier" >&6; } LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5 $as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; } if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lmw $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char _mwvalidcheckl (); int main () { return _mwvalidcheckl (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_mw__mwvalidcheckl=yes else ac_cv_lib_mw__mwvalidcheckl=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5 $as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; } if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then : LIBM="-lmw" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="$LIBM -lm" fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 $as_echo_n "checking for cos in -lm... " >&6; } if ${ac_cv_lib_m_cos+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char cos (); int main () { return cos (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_cos=yes else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5 $as_echo "$ac_cv_lib_m_cos" >&6; } if test "x$ac_cv_lib_m_cos" = xyes; then : LIBM="-lm" fi ;; esac LIBS="$LIBS $LIBM" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for compress in -lz" >&5 $as_echo_n "checking for compress in -lz... " >&6; } if ${ac_cv_lib_z_compress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char compress (); int main () { return compress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_compress=yes else ac_cv_lib_z_compress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress" >&5 $as_echo "$ac_cv_lib_z_compress" >&6; } if test "x$ac_cv_lib_z_compress" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "zlib.h" "ac_cv_header_zlib_h" "$ac_includes_default" if test "x$ac_cv_header_zlib_h" = xyes; then : have_libz=yes else have_libz="no (requires zlib http://www.gzip.org/zlib/)" fi else have_libz="no (requires zlib http://www.gzip.org/zlib/)" fi if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi if test "x$PKG_CONFIG" = x; then as_fn_error $? "pkg-config >= $PKGCONFIG_REQUIRED required but not found (http://pkgconfig.freedesktop.org/)" "$LINENO" 5 fi CAIRO_FEATURES="" CAIRO_NO_FEATURES="" CAIRO_REQUIRES="" CAIRO_NONPKGCONFIG_CFLAGS="" CAIRO_NONPKGCONFIG_LIBS="$LIBM" CAIRO_LDADD="" CAIRO_CFLAGS=$CAIRO_NONPKGCONFIG_CFLAGS CAIRO_LIBS=$CAIRO_NONPKGCONFIG_LIBS #PIXMAN_VERSION="0.10.0" #PIXMAN_REQUIRES="pixman-1 >= $PIXMAN_VERSION" #PKG_CHECK_MODULES(pixman, $PIXMAN_REQUIRES, , # [AC_MSG_ERROR([pixman >= $PIXMAN_VERSION is required #(http://cairographics.org/releases/)])]) pixman_CFLAGS='-I$(top_srcdir)/../pixman/pixman' pixman_LIBS='$(top_builddir)/../pixman/pixman/libpixman-1.la' #CAIRO_REQUIRES="$PIXMAN_REQUIRES $CAIRO_REQUIRES" CAIRO_CFLAGS="$pixman_CFLAGS $CAIRO_CFLAGS" CAIRO_LIBS="$pixman_LIBS $CAIRO_LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi # Check whether --enable-xlib was given. if test "${enable_xlib+set}" = set; then : enableval=$enable_xlib; enable_xlib=$enableval else enable_xlib=auto fi if test "x$enable_xlib" = xno; then use_xlib="no (disabled, use --enable-xlib to enable)" else if test "x$cairo_cv_backend_xlib_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_xlib_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Xlib backend" >&5 $as_echo_n "checking for cairo's Xlib backend... " >&6; } if ${cairo_cv_backend_xlib_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_xlib=yes xlib_REQUIRES=$ac_env_xlib_REQUIRES_value xlib_CFLAGS=$ac_env_xlib_CFLAGS_value xlib_LIBS=$ac_env_xlib_LIBS_value xlib_NONPKGCONFIG_CFLAGS=$ac_env_xlib_NONPKGCONFIG_CFLAGS_value xlib_NONPKGCONFIG_LIBS=$ac_env_xlib_NONPKGCONFIG_LIBS_value xlib_BASE=cairo xlib_REQUIRES="x11" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xlib" >&5 $as_echo_n "checking for xlib... " >&6; } if test -n "$xlib_CFLAGS"; then pkg_cv_xlib_CFLAGS="$xlib_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xlib_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xlib_CFLAGS=`$PKG_CONFIG --cflags "$xlib_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$xlib_LIBS"; then pkg_cv_xlib_LIBS="$xlib_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xlib_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xlib_LIBS=`$PKG_CONFIG --libs "$xlib_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then xlib_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$xlib_REQUIRES" 2>&1` else xlib_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$xlib_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$xlib_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } xlib_REQUIRES="" if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test "x$no_x" = xyes; then use_xlib="no (requires X development libraries)" else xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS fi elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } xlib_REQUIRES="" if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi if test "x$no_x" = xyes; then use_xlib="no (requires X development libraries)" else xlib_NONPKGCONFIG_LIBS="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS" xlib_NONPKGCONFIG_CFLAGS=$X_CFLAGS fi else xlib_CFLAGS=$pkg_cv_xlib_CFLAGS xlib_LIBS=$pkg_cv_xlib_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi cairo_cv_backend_xlib_use=$use_xlib cairo_cv_backend_xlib_cache_version=4 cairo_cv_backend_xlib_requires=$xlib_REQUIRES cairo_cv_backend_xlib_cflags=$xlib_CFLAGS cairo_cv_backend_xlib_libs=$xlib_LIBS cairo_cv_backend_xlib_nonpkgconfig_cflags=$xlib_NONPKGCONFIG_CFLAGS cairo_cv_backend_xlib_nonpkgconfig_libs=$xlib_NONPKGCONFIG_LIBS cairo_cv_backend_xlib_base=$xlib_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Xlib backend could be enabled" >&5 $as_echo_n "checking whether cairo's Xlib backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_xlib_use" >&5 $as_echo "$cairo_cv_backend_xlib_use" >&6; } use_xlib=$cairo_cv_backend_xlib_use xlib_BASE=$cairo_cv_backend_xlib_base xlib_REQUIRES="$cairo_cv_backend_xlib_requires " xlib_CFLAGS="$cairo_cv_backend_xlib_cflags " xlib_LIBS="$cairo_cv_backend_xlib_libs " xlib_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_xlib_nonpkgconfig_cflags " xlib_NONPKGCONFIG_LIBS="$cairo_cv_backend_xlib_nonpkgconfig_libs " # null the ones that only have space test "x$xlib_REQUIRES" = "x " && xlib_REQUIRES="" test "x$xlib_CFLAGS" = "x " && xlib_CFLAGS="" test "x$xlib_LIBS" = "x " && xlib_LIBS="" test "x$xlib_NONPKGCONFIG_CFLAGS" = "x " && xlib_NONPKGCONFIG_CFLAGS="" test "x$xlib_NONPKGCONFIG_LIBS" = "x " && xlib_NONPKGCONFIG_LIBS="" case $enable_xlib in yes) if test "x$use_xlib" = xyes; then : else as_fn_error $? "requested Xlib backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-xlib: $use_xlib, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_xlib" = xyes; then CAIRO_FEATURES="XLIB_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$xlib_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$xlib_NONPKGCONFIG_CFLAGS$xlib_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$xlib_NONPKGCONFIG_LIBS$xlib_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$xlib_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$xlib_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-xlib.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,xlib,g" \ -e "s,@Backend_Name@,Xlib,g" \ -e "s,@BACKEND_BASE@,$xlib_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$xlib_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$xlib_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$xlib_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="XLIB_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_xlib" = xyes; then CAIRO_HAS_XLIB_SURFACE_TRUE= CAIRO_HAS_XLIB_SURFACE_FALSE='#' else CAIRO_HAS_XLIB_SURFACE_TRUE='#' CAIRO_HAS_XLIB_SURFACE_FALSE= fi # Check whether --enable-xlib-xrender was given. if test "${enable_xlib_xrender+set}" = set; then : enableval=$enable_xlib_xrender; enable_xlib_xrender=$enableval else enable_xlib_xrender=auto fi if test "x$enable_xlib_xrender" = xno; then use_xlib_xrender="no (disabled, use --enable-xlib-xrender to enable)" else if test "x$cairo_cv_backend_xlib_xrender_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_xlib_xrender_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Xlib Xrender backend" >&5 $as_echo_n "checking for cairo's Xlib Xrender backend... " >&6; } if ${cairo_cv_backend_xlib_xrender_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_xlib_xrender=yes xlib_xrender_REQUIRES=$ac_env_xlib_xrender_REQUIRES_value xlib_xrender_CFLAGS=$ac_env_xlib_xrender_CFLAGS_value xlib_xrender_LIBS=$ac_env_xlib_xrender_LIBS_value xlib_xrender_NONPKGCONFIG_CFLAGS=$ac_env_xlib_xrender_NONPKGCONFIG_CFLAGS_value xlib_xrender_NONPKGCONFIG_LIBS=$ac_env_xlib_xrender_NONPKGCONFIG_LIBS_value xlib_xrender_BASE=cairo if test "x$use_xlib" != "xyes"; then use_xlib_xrender="no (requires --enable-xlib)" else xlib_xrender_BASE=cairo-xlib xlib_xrender_REQUIRES="xrender >= 0.6" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xlib_xrender" >&5 $as_echo_n "checking for xlib_xrender... " >&6; } if test -n "$xlib_xrender_CFLAGS"; then pkg_cv_xlib_xrender_CFLAGS="$xlib_xrender_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xrender_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xlib_xrender_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xlib_xrender_CFLAGS=`$PKG_CONFIG --cflags "$xlib_xrender_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$xlib_xrender_LIBS"; then pkg_cv_xlib_xrender_LIBS="$xlib_xrender_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xlib_xrender_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xlib_xrender_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xlib_xrender_LIBS=`$PKG_CONFIG --libs "$xlib_xrender_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then xlib_xrender_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$xlib_xrender_REQUIRES" 2>&1` else xlib_xrender_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$xlib_xrender_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$xlib_xrender_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } xlib_xrender_REQUIRES="" old_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "$ac_includes_default" if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then : xlib_xrender_NONPKGCONFIG_LIBS="-lXrender" else use_xlib_xrender="no (requires Xrender http://freedesktop.org/Software/xlibs)" fi CPPFLAGS=$old_CPPFLAGS elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } xlib_xrender_REQUIRES="" old_CPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $xlib_CFLAGS $xlib_NONPKGCONFIG_CFLAGS" ac_fn_c_check_header_mongrel "$LINENO" "X11/extensions/Xrender.h" "ac_cv_header_X11_extensions_Xrender_h" "$ac_includes_default" if test "x$ac_cv_header_X11_extensions_Xrender_h" = xyes; then : xlib_xrender_NONPKGCONFIG_LIBS="-lXrender" else use_xlib_xrender="no (requires Xrender http://freedesktop.org/Software/xlibs)" fi CPPFLAGS=$old_CPPFLAGS else xlib_xrender_CFLAGS=$pkg_cv_xlib_xrender_CFLAGS xlib_xrender_LIBS=$pkg_cv_xlib_xrender_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi fi cairo_cv_backend_xlib_xrender_use=$use_xlib_xrender cairo_cv_backend_xlib_xrender_cache_version=4 cairo_cv_backend_xlib_xrender_requires=$xlib_xrender_REQUIRES cairo_cv_backend_xlib_xrender_cflags=$xlib_xrender_CFLAGS cairo_cv_backend_xlib_xrender_libs=$xlib_xrender_LIBS cairo_cv_backend_xlib_xrender_nonpkgconfig_cflags=$xlib_xrender_NONPKGCONFIG_CFLAGS cairo_cv_backend_xlib_xrender_nonpkgconfig_libs=$xlib_xrender_NONPKGCONFIG_LIBS cairo_cv_backend_xlib_xrender_base=$xlib_xrender_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Xlib Xrender backend could be enabled" >&5 $as_echo_n "checking whether cairo's Xlib Xrender backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_xlib_xrender_use" >&5 $as_echo "$cairo_cv_backend_xlib_xrender_use" >&6; } use_xlib_xrender=$cairo_cv_backend_xlib_xrender_use xlib_xrender_BASE=$cairo_cv_backend_xlib_xrender_base xlib_xrender_REQUIRES="$cairo_cv_backend_xlib_xrender_requires " xlib_xrender_CFLAGS="$cairo_cv_backend_xlib_xrender_cflags " xlib_xrender_LIBS="$cairo_cv_backend_xlib_xrender_libs " xlib_xrender_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_xlib_xrender_nonpkgconfig_cflags " xlib_xrender_NONPKGCONFIG_LIBS="$cairo_cv_backend_xlib_xrender_nonpkgconfig_libs " # null the ones that only have space test "x$xlib_xrender_REQUIRES" = "x " && xlib_xrender_REQUIRES="" test "x$xlib_xrender_CFLAGS" = "x " && xlib_xrender_CFLAGS="" test "x$xlib_xrender_LIBS" = "x " && xlib_xrender_LIBS="" test "x$xlib_xrender_NONPKGCONFIG_CFLAGS" = "x " && xlib_xrender_NONPKGCONFIG_CFLAGS="" test "x$xlib_xrender_NONPKGCONFIG_LIBS" = "x " && xlib_xrender_NONPKGCONFIG_LIBS="" case $enable_xlib_xrender in yes) if test "x$use_xlib_xrender" = xyes; then : else as_fn_error $? "requested Xlib Xrender backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-xlib-xrender: $use_xlib_xrender, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_xlib_xrender" = xyes; then CAIRO_FEATURES="XLIB_XRENDER_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$xlib_xrender_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$xlib_xrender_NONPKGCONFIG_CFLAGS$xlib_xrender_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$xlib_xrender_NONPKGCONFIG_LIBS$xlib_xrender_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$xlib_xrender_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$xlib_xrender_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-xlib_xrender.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,xlib_xrender,g" \ -e "s,@Backend_Name@,Xlib Xrender,g" \ -e "s,@BACKEND_BASE@,$xlib_xrender_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$xlib_xrender_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$xlib_xrender_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$xlib_xrender_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="XLIB_XRENDER_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_xlib_xrender" = xyes; then CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE= CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE='#' else CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE='#' CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE= fi # Check whether --enable-xcb was given. if test "${enable_xcb+set}" = set; then : enableval=$enable_xcb; enable_xcb=$enableval else enable_xcb=no fi if test "x$enable_xcb" = xno; then use_xcb="no (disabled, use --enable-xcb to enable)" else if test "x$cairo_cv_backend_xcb_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_xcb_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's XCB backend" >&5 $as_echo_n "checking for cairo's XCB backend... " >&6; } if ${cairo_cv_backend_xcb_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_xcb=yes xcb_REQUIRES=$ac_env_xcb_REQUIRES_value xcb_CFLAGS=$ac_env_xcb_CFLAGS_value xcb_LIBS=$ac_env_xcb_LIBS_value xcb_NONPKGCONFIG_CFLAGS=$ac_env_xcb_NONPKGCONFIG_CFLAGS_value xcb_NONPKGCONFIG_LIBS=$ac_env_xcb_NONPKGCONFIG_LIBS_value xcb_BASE=cairo xcb_REQUIRES="xcb >= 0.9.92 xcb-render >= 0.9.92 xcb-renderutil" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xcb" >&5 $as_echo_n "checking for xcb... " >&6; } if test -n "$xcb_CFLAGS"; then pkg_cv_xcb_CFLAGS="$xcb_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xcb_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xcb_CFLAGS=`$PKG_CONFIG --cflags "$xcb_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$xcb_LIBS"; then pkg_cv_xcb_LIBS="$xcb_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$xcb_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$xcb_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_xcb_LIBS=`$PKG_CONFIG --libs "$xcb_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then xcb_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$xcb_REQUIRES" 2>&1` else xcb_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$xcb_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$xcb_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_xcb="no (requires XCB http://xcb.freedesktop.org)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_xcb="no (requires XCB http://xcb.freedesktop.org)" else xcb_CFLAGS=$pkg_cv_xcb_CFLAGS xcb_LIBS=$pkg_cv_xcb_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi cairo_cv_backend_xcb_use=$use_xcb cairo_cv_backend_xcb_cache_version=4 cairo_cv_backend_xcb_requires=$xcb_REQUIRES cairo_cv_backend_xcb_cflags=$xcb_CFLAGS cairo_cv_backend_xcb_libs=$xcb_LIBS cairo_cv_backend_xcb_nonpkgconfig_cflags=$xcb_NONPKGCONFIG_CFLAGS cairo_cv_backend_xcb_nonpkgconfig_libs=$xcb_NONPKGCONFIG_LIBS cairo_cv_backend_xcb_base=$xcb_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's XCB backend could be enabled" >&5 $as_echo_n "checking whether cairo's XCB backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_xcb_use" >&5 $as_echo "$cairo_cv_backend_xcb_use" >&6; } use_xcb=$cairo_cv_backend_xcb_use xcb_BASE=$cairo_cv_backend_xcb_base xcb_REQUIRES="$cairo_cv_backend_xcb_requires " xcb_CFLAGS="$cairo_cv_backend_xcb_cflags " xcb_LIBS="$cairo_cv_backend_xcb_libs " xcb_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_xcb_nonpkgconfig_cflags " xcb_NONPKGCONFIG_LIBS="$cairo_cv_backend_xcb_nonpkgconfig_libs " # null the ones that only have space test "x$xcb_REQUIRES" = "x " && xcb_REQUIRES="" test "x$xcb_CFLAGS" = "x " && xcb_CFLAGS="" test "x$xcb_LIBS" = "x " && xcb_LIBS="" test "x$xcb_NONPKGCONFIG_CFLAGS" = "x " && xcb_NONPKGCONFIG_CFLAGS="" test "x$xcb_NONPKGCONFIG_LIBS" = "x " && xcb_NONPKGCONFIG_LIBS="" case $enable_xcb in yes) if test "x$use_xcb" = xyes; then : else as_fn_error $? "requested XCB backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-xcb: $use_xcb, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_xcb" = xyes; then CAIRO_FEATURES="XCB_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$xcb_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$xcb_NONPKGCONFIG_CFLAGS$xcb_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$xcb_NONPKGCONFIG_LIBS$xcb_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$xcb_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$xcb_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-xcb.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,xcb,g" \ -e "s,@Backend_Name@,XCB,g" \ -e "s,@BACKEND_BASE@,$xcb_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$xcb_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$xcb_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$xcb_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="XCB_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_xcb" = xyes; then CAIRO_HAS_XCB_SURFACE_TRUE= CAIRO_HAS_XCB_SURFACE_FALSE='#' else CAIRO_HAS_XCB_SURFACE_TRUE='#' CAIRO_HAS_XCB_SURFACE_FALSE= fi # Check whether --enable-quartz was given. if test "${enable_quartz+set}" = set; then : enableval=$enable_quartz; enable_quartz=$enableval else enable_quartz=auto fi if test "x$enable_quartz" = xno; then use_quartz="no (disabled, use --enable-quartz to enable)" else if test "x$cairo_cv_backend_quartz_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_quartz_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz backend" >&5 $as_echo_n "checking for cairo's Quartz backend... " >&6; } if ${cairo_cv_backend_quartz_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_quartz=yes quartz_REQUIRES=$ac_env_quartz_REQUIRES_value quartz_CFLAGS=$ac_env_quartz_CFLAGS_value quartz_LIBS=$ac_env_quartz_LIBS_value quartz_NONPKGCONFIG_CFLAGS=$ac_env_quartz_NONPKGCONFIG_CFLAGS_value quartz_NONPKGCONFIG_LIBS=$ac_env_quartz_NONPKGCONFIG_LIBS_value quartz_BASE=cairo ac_fn_c_check_header_mongrel "$LINENO" "ApplicationServices/ApplicationServices.h" "ac_cv_header_ApplicationServices_ApplicationServices_h" "$ac_includes_default" if test "x$ac_cv_header_ApplicationServices_ApplicationServices_h" = xyes; then : else use_quartz="no (ApplicationServices framework not found)" fi if test "x$use_quartz" != "xyes" ; then ac_fn_c_check_header_mongrel "$LINENO" "CoreGraphics/CoreGraphics.h" "ac_cv_header_CoreGraphics_CoreGraphics_h" "$ac_includes_default" if test "x$ac_cv_header_CoreGraphics_CoreGraphics_h" = xyes; then : else use_quartz="no (CoreGraphics framework not found)" fi quartz_LIBS="-Xlinker -framework -Xlinker CoreGraphics" else quartz_LIBS="-Xlinker -framework -Xlinker ApplicationServices" fi cairo_cv_backend_quartz_use=$use_quartz cairo_cv_backend_quartz_cache_version=4 cairo_cv_backend_quartz_requires=$quartz_REQUIRES cairo_cv_backend_quartz_cflags=$quartz_CFLAGS cairo_cv_backend_quartz_libs=$quartz_LIBS cairo_cv_backend_quartz_nonpkgconfig_cflags=$quartz_NONPKGCONFIG_CFLAGS cairo_cv_backend_quartz_nonpkgconfig_libs=$quartz_NONPKGCONFIG_LIBS cairo_cv_backend_quartz_base=$quartz_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz backend could be enabled" >&5 $as_echo_n "checking whether cairo's Quartz backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_quartz_use" >&5 $as_echo "$cairo_cv_backend_quartz_use" >&6; } use_quartz=$cairo_cv_backend_quartz_use quartz_BASE=$cairo_cv_backend_quartz_base quartz_REQUIRES="$cairo_cv_backend_quartz_requires " quartz_CFLAGS="$cairo_cv_backend_quartz_cflags " quartz_LIBS="$cairo_cv_backend_quartz_libs " quartz_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_quartz_nonpkgconfig_cflags " quartz_NONPKGCONFIG_LIBS="$cairo_cv_backend_quartz_nonpkgconfig_libs " # null the ones that only have space test "x$quartz_REQUIRES" = "x " && quartz_REQUIRES="" test "x$quartz_CFLAGS" = "x " && quartz_CFLAGS="" test "x$quartz_LIBS" = "x " && quartz_LIBS="" test "x$quartz_NONPKGCONFIG_CFLAGS" = "x " && quartz_NONPKGCONFIG_CFLAGS="" test "x$quartz_NONPKGCONFIG_LIBS" = "x " && quartz_NONPKGCONFIG_LIBS="" case $enable_quartz in yes) if test "x$use_quartz" = xyes; then : else as_fn_error $? "requested Quartz backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-quartz: $use_quartz, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_quartz" = xyes; then CAIRO_FEATURES="QUARTZ_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$quartz_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$quartz_NONPKGCONFIG_CFLAGS$quartz_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$quartz_NONPKGCONFIG_LIBS$quartz_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$quartz_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$quartz_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-quartz.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,quartz,g" \ -e "s,@Backend_Name@,Quartz,g" \ -e "s,@BACKEND_BASE@,$quartz_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$quartz_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$quartz_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$quartz_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="QUARTZ_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_quartz" = xyes; then CAIRO_HAS_QUARTZ_SURFACE_TRUE= CAIRO_HAS_QUARTZ_SURFACE_FALSE='#' else CAIRO_HAS_QUARTZ_SURFACE_TRUE='#' CAIRO_HAS_QUARTZ_SURFACE_FALSE= fi # Check whether --enable-quartz-font was given. if test "${enable_quartz_font+set}" = set; then : enableval=$enable_quartz_font; enable_quartz_font=$enableval else enable_quartz_font=auto fi if test "x$enable_quartz_font" = xno; then use_quartz_font="no (disabled, use --enable-quartz-font to enable)" else if test "x$cairo_cv_backend_quartz_font_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_quartz_font_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz font backend" >&5 $as_echo_n "checking for cairo's Quartz font backend... " >&6; } if ${cairo_cv_backend_quartz_font_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_quartz_font=yes quartz_font_REQUIRES=$ac_env_quartz_font_REQUIRES_value quartz_font_CFLAGS=$ac_env_quartz_font_CFLAGS_value quartz_font_LIBS=$ac_env_quartz_font_LIBS_value quartz_font_NONPKGCONFIG_CFLAGS=$ac_env_quartz_font_NONPKGCONFIG_CFLAGS_value quartz_font_NONPKGCONFIG_LIBS=$ac_env_quartz_font_NONPKGCONFIG_LIBS_value quartz_font_BASE=cairo use_quartz_font=$use_quartz cairo_cv_backend_quartz_font_use=$use_quartz_font cairo_cv_backend_quartz_font_cache_version=4 cairo_cv_backend_quartz_font_requires=$quartz_font_REQUIRES cairo_cv_backend_quartz_font_cflags=$quartz_font_CFLAGS cairo_cv_backend_quartz_font_libs=$quartz_font_LIBS cairo_cv_backend_quartz_font_nonpkgconfig_cflags=$quartz_font_NONPKGCONFIG_CFLAGS cairo_cv_backend_quartz_font_nonpkgconfig_libs=$quartz_font_NONPKGCONFIG_LIBS cairo_cv_backend_quartz_font_base=$quartz_font_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz font backend could be enabled" >&5 $as_echo_n "checking whether cairo's Quartz font backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_quartz_font_use" >&5 $as_echo "$cairo_cv_backend_quartz_font_use" >&6; } use_quartz_font=$cairo_cv_backend_quartz_font_use quartz_font_BASE=$cairo_cv_backend_quartz_font_base quartz_font_REQUIRES="$cairo_cv_backend_quartz_font_requires " quartz_font_CFLAGS="$cairo_cv_backend_quartz_font_cflags " quartz_font_LIBS="$cairo_cv_backend_quartz_font_libs " quartz_font_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_quartz_font_nonpkgconfig_cflags " quartz_font_NONPKGCONFIG_LIBS="$cairo_cv_backend_quartz_font_nonpkgconfig_libs " # null the ones that only have space test "x$quartz_font_REQUIRES" = "x " && quartz_font_REQUIRES="" test "x$quartz_font_CFLAGS" = "x " && quartz_font_CFLAGS="" test "x$quartz_font_LIBS" = "x " && quartz_font_LIBS="" test "x$quartz_font_NONPKGCONFIG_CFLAGS" = "x " && quartz_font_NONPKGCONFIG_CFLAGS="" test "x$quartz_font_NONPKGCONFIG_LIBS" = "x " && quartz_font_NONPKGCONFIG_LIBS="" case $enable_quartz_font in yes) if test "x$use_quartz_font" = xyes; then : else as_fn_error $? "requested Quartz font backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-quartz-font: $use_quartz_font, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_quartz_font" = xyes; then CAIRO_FEATURES="QUARTZ_FONT $CAIRO_FEATURES" CAIRO_REQUIRES="$quartz_font_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$quartz_font_NONPKGCONFIG_CFLAGS$quartz_font_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$quartz_font_NONPKGCONFIG_LIBS$quartz_font_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$quartz_font_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$quartz_font_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-quartz_font.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,quartz_font,g" \ -e "s,@Backend_Name@,Quartz font,g" \ -e "s,@BACKEND_BASE@,$quartz_font_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$quartz_font_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$quartz_font_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$quartz_font_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="QUARTZ_FONT $CAIRO_NO_FEATURES" fi fi if test "x$use_quartz_font" = xyes; then CAIRO_HAS_QUARTZ_FONT_TRUE= CAIRO_HAS_QUARTZ_FONT_FALSE='#' else CAIRO_HAS_QUARTZ_FONT_TRUE='#' CAIRO_HAS_QUARTZ_FONT_FALSE= fi # Check whether --enable-quartz-image was given. if test "${enable_quartz_image+set}" = set; then : enableval=$enable_quartz_image; enable_quartz_image=$enableval else enable_quartz_image=no fi if test "x$enable_quartz_image" = xno; then use_quartz_image="no (disabled, use --enable-quartz-image to enable)" else if test "x$cairo_cv_backend_quartz_image_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_quartz_image_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Quartz Image backend" >&5 $as_echo_n "checking for cairo's Quartz Image backend... " >&6; } if ${cairo_cv_backend_quartz_image_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_quartz_image=yes quartz_image_REQUIRES=$ac_env_quartz_image_REQUIRES_value quartz_image_CFLAGS=$ac_env_quartz_image_CFLAGS_value quartz_image_LIBS=$ac_env_quartz_image_LIBS_value quartz_image_NONPKGCONFIG_CFLAGS=$ac_env_quartz_image_NONPKGCONFIG_CFLAGS_value quartz_image_NONPKGCONFIG_LIBS=$ac_env_quartz_image_NONPKGCONFIG_LIBS_value quartz_image_BASE=cairo use_quartz_image=$use_quartz cairo_cv_backend_quartz_image_use=$use_quartz_image cairo_cv_backend_quartz_image_cache_version=4 cairo_cv_backend_quartz_image_requires=$quartz_image_REQUIRES cairo_cv_backend_quartz_image_cflags=$quartz_image_CFLAGS cairo_cv_backend_quartz_image_libs=$quartz_image_LIBS cairo_cv_backend_quartz_image_nonpkgconfig_cflags=$quartz_image_NONPKGCONFIG_CFLAGS cairo_cv_backend_quartz_image_nonpkgconfig_libs=$quartz_image_NONPKGCONFIG_LIBS cairo_cv_backend_quartz_image_base=$quartz_image_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Quartz Image backend could be enabled" >&5 $as_echo_n "checking whether cairo's Quartz Image backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_quartz_image_use" >&5 $as_echo "$cairo_cv_backend_quartz_image_use" >&6; } use_quartz_image=$cairo_cv_backend_quartz_image_use quartz_image_BASE=$cairo_cv_backend_quartz_image_base quartz_image_REQUIRES="$cairo_cv_backend_quartz_image_requires " quartz_image_CFLAGS="$cairo_cv_backend_quartz_image_cflags " quartz_image_LIBS="$cairo_cv_backend_quartz_image_libs " quartz_image_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_quartz_image_nonpkgconfig_cflags " quartz_image_NONPKGCONFIG_LIBS="$cairo_cv_backend_quartz_image_nonpkgconfig_libs " # null the ones that only have space test "x$quartz_image_REQUIRES" = "x " && quartz_image_REQUIRES="" test "x$quartz_image_CFLAGS" = "x " && quartz_image_CFLAGS="" test "x$quartz_image_LIBS" = "x " && quartz_image_LIBS="" test "x$quartz_image_NONPKGCONFIG_CFLAGS" = "x " && quartz_image_NONPKGCONFIG_CFLAGS="" test "x$quartz_image_NONPKGCONFIG_LIBS" = "x " && quartz_image_NONPKGCONFIG_LIBS="" case $enable_quartz_image in yes) if test "x$use_quartz_image" = xyes; then : else as_fn_error $? "requested Quartz Image backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-quartz-image: $use_quartz_image, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_quartz_image" = xyes; then CAIRO_FEATURES="QUARTZ_IMAGE_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$quartz_image_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$quartz_image_NONPKGCONFIG_CFLAGS$quartz_image_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$quartz_image_NONPKGCONFIG_LIBS$quartz_image_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$quartz_image_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$quartz_image_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-quartz_image.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,quartz_image,g" \ -e "s,@Backend_Name@,Quartz Image,g" \ -e "s,@BACKEND_BASE@,$quartz_image_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$quartz_image_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$quartz_image_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$quartz_image_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="QUARTZ_IMAGE_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_quartz_image" = xyes; then CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE= CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE='#' else CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE='#' CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for native Win32" >&5 $as_echo_n "checking for native Win32... " >&6; } case "$host" in *-*-mingw*) cairo_os_win32=yes ;; *) cairo_os_win32=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_os_win32" >&5 $as_echo "$cairo_os_win32" >&6; } if test "$cairo_os_win32" = "yes"; then OS_WIN32_TRUE= OS_WIN32_FALSE='#' else OS_WIN32_TRUE='#' OS_WIN32_FALSE= fi for ac_header in windows.h do : ac_fn_c_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_WINDOWS_H 1 _ACEOF have_windows=yes else have_windows=no fi done # Check whether --enable-win32 was given. if test "${enable_win32+set}" = set; then : enableval=$enable_win32; enable_win32=$enableval else enable_win32=auto fi if test "x$enable_win32" = xno; then use_win32="no (disabled, use --enable-win32 to enable)" else if test "x$cairo_cv_backend_win32_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_win32_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Microsoft Windows backend" >&5 $as_echo_n "checking for cairo's Microsoft Windows backend... " >&6; } if ${cairo_cv_backend_win32_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_win32=yes win32_REQUIRES=$ac_env_win32_REQUIRES_value win32_CFLAGS=$ac_env_win32_CFLAGS_value win32_LIBS=$ac_env_win32_LIBS_value win32_NONPKGCONFIG_CFLAGS=$ac_env_win32_NONPKGCONFIG_CFLAGS_value win32_NONPKGCONFIG_LIBS=$ac_env_win32_NONPKGCONFIG_LIBS_value win32_BASE=cairo if test "x$have_windows" != xyes; then use_win32="no (requires a Win32 platform)" fi win32_LIBS="-lgdi32 -lmsimg32" cairo_cv_backend_win32_use=$use_win32 cairo_cv_backend_win32_cache_version=4 cairo_cv_backend_win32_requires=$win32_REQUIRES cairo_cv_backend_win32_cflags=$win32_CFLAGS cairo_cv_backend_win32_libs=$win32_LIBS cairo_cv_backend_win32_nonpkgconfig_cflags=$win32_NONPKGCONFIG_CFLAGS cairo_cv_backend_win32_nonpkgconfig_libs=$win32_NONPKGCONFIG_LIBS cairo_cv_backend_win32_base=$win32_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Microsoft Windows backend could be enabled" >&5 $as_echo_n "checking whether cairo's Microsoft Windows backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_win32_use" >&5 $as_echo "$cairo_cv_backend_win32_use" >&6; } use_win32=$cairo_cv_backend_win32_use win32_BASE=$cairo_cv_backend_win32_base win32_REQUIRES="$cairo_cv_backend_win32_requires " win32_CFLAGS="$cairo_cv_backend_win32_cflags " win32_LIBS="$cairo_cv_backend_win32_libs " win32_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_win32_nonpkgconfig_cflags " win32_NONPKGCONFIG_LIBS="$cairo_cv_backend_win32_nonpkgconfig_libs " # null the ones that only have space test "x$win32_REQUIRES" = "x " && win32_REQUIRES="" test "x$win32_CFLAGS" = "x " && win32_CFLAGS="" test "x$win32_LIBS" = "x " && win32_LIBS="" test "x$win32_NONPKGCONFIG_CFLAGS" = "x " && win32_NONPKGCONFIG_CFLAGS="" test "x$win32_NONPKGCONFIG_LIBS" = "x " && win32_NONPKGCONFIG_LIBS="" case $enable_win32 in yes) if test "x$use_win32" = xyes; then : else as_fn_error $? "requested Microsoft Windows backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-win32: $use_win32, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_win32" = xyes; then CAIRO_FEATURES="WIN32_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$win32_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$win32_NONPKGCONFIG_CFLAGS$win32_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$win32_NONPKGCONFIG_LIBS$win32_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$win32_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$win32_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-win32.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,win32,g" \ -e "s,@Backend_Name@,Microsoft Windows,g" \ -e "s,@BACKEND_BASE@,$win32_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$win32_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$win32_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$win32_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="WIN32_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_win32" = xyes; then CAIRO_HAS_WIN32_SURFACE_TRUE= CAIRO_HAS_WIN32_SURFACE_FALSE='#' else CAIRO_HAS_WIN32_SURFACE_TRUE='#' CAIRO_HAS_WIN32_SURFACE_FALSE= fi # Check whether --enable-win32-font was given. if test "${enable_win32_font+set}" = set; then : enableval=$enable_win32_font; enable_win32_font=$enableval else enable_win32_font=auto fi if test "x$enable_win32_font" = xno; then use_win32_font="no (disabled, use --enable-win32-font to enable)" else if test "x$cairo_cv_backend_win32_font_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_win32_font_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's Microsoft Windows font backend" >&5 $as_echo_n "checking for cairo's Microsoft Windows font backend... " >&6; } if ${cairo_cv_backend_win32_font_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_win32_font=yes win32_font_REQUIRES=$ac_env_win32_font_REQUIRES_value win32_font_CFLAGS=$ac_env_win32_font_CFLAGS_value win32_font_LIBS=$ac_env_win32_font_LIBS_value win32_font_NONPKGCONFIG_CFLAGS=$ac_env_win32_font_NONPKGCONFIG_CFLAGS_value win32_font_NONPKGCONFIG_LIBS=$ac_env_win32_font_NONPKGCONFIG_LIBS_value win32_font_BASE=cairo use_win32_font=$use_win32 cairo_cv_backend_win32_font_use=$use_win32_font cairo_cv_backend_win32_font_cache_version=4 cairo_cv_backend_win32_font_requires=$win32_font_REQUIRES cairo_cv_backend_win32_font_cflags=$win32_font_CFLAGS cairo_cv_backend_win32_font_libs=$win32_font_LIBS cairo_cv_backend_win32_font_nonpkgconfig_cflags=$win32_font_NONPKGCONFIG_CFLAGS cairo_cv_backend_win32_font_nonpkgconfig_libs=$win32_font_NONPKGCONFIG_LIBS cairo_cv_backend_win32_font_base=$win32_font_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's Microsoft Windows font backend could be enabled" >&5 $as_echo_n "checking whether cairo's Microsoft Windows font backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_win32_font_use" >&5 $as_echo "$cairo_cv_backend_win32_font_use" >&6; } use_win32_font=$cairo_cv_backend_win32_font_use win32_font_BASE=$cairo_cv_backend_win32_font_base win32_font_REQUIRES="$cairo_cv_backend_win32_font_requires " win32_font_CFLAGS="$cairo_cv_backend_win32_font_cflags " win32_font_LIBS="$cairo_cv_backend_win32_font_libs " win32_font_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_win32_font_nonpkgconfig_cflags " win32_font_NONPKGCONFIG_LIBS="$cairo_cv_backend_win32_font_nonpkgconfig_libs " # null the ones that only have space test "x$win32_font_REQUIRES" = "x " && win32_font_REQUIRES="" test "x$win32_font_CFLAGS" = "x " && win32_font_CFLAGS="" test "x$win32_font_LIBS" = "x " && win32_font_LIBS="" test "x$win32_font_NONPKGCONFIG_CFLAGS" = "x " && win32_font_NONPKGCONFIG_CFLAGS="" test "x$win32_font_NONPKGCONFIG_LIBS" = "x " && win32_font_NONPKGCONFIG_LIBS="" case $enable_win32_font in yes) if test "x$use_win32_font" = xyes; then : else as_fn_error $? "requested Microsoft Windows font backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-win32-font: $use_win32_font, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_win32_font" = xyes; then CAIRO_FEATURES="WIN32_FONT $CAIRO_FEATURES" CAIRO_REQUIRES="$win32_font_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$win32_font_NONPKGCONFIG_CFLAGS$win32_font_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$win32_font_NONPKGCONFIG_LIBS$win32_font_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$win32_font_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$win32_font_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-win32_font.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,win32_font,g" \ -e "s,@Backend_Name@,Microsoft Windows font,g" \ -e "s,@BACKEND_BASE@,$win32_font_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$win32_font_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$win32_font_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$win32_font_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="WIN32_FONT $CAIRO_NO_FEATURES" fi fi if test "x$use_win32_font" = xyes; then CAIRO_HAS_WIN32_FONT_TRUE= CAIRO_HAS_WIN32_FONT_FALSE='#' else CAIRO_HAS_WIN32_FONT_TRUE='#' CAIRO_HAS_WIN32_FONT_FALSE= fi test_win32_printing=no if test "x$use_win32" = "xyes"; then # Extract the first word of "gs", so it can be a program name with args. set dummy gs; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GS"; then ac_cv_prog_GS="$GS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GS="gs" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GS=$ac_cv_prog_GS if test -n "$GS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GS" >&5 $as_echo "$GS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GS"; then $as_echo "#define CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE 1" >>confdefs.h test_win32_printing="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Win32 Printing backend will not be tested since ghostscript is not available" >&5 $as_echo "$as_me: WARNING: Win32 Printing backend will not be tested since ghostscript is not available" >&2;} test_win32_printing="no (requires ghostscript)" fi fi if test "x$test_win32_printing" = "xyes"; then CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE= CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE='#' else CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE='#' CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE= fi # Check whether --enable-os2 was given. if test "${enable_os2+set}" = set; then : enableval=$enable_os2; enable_os2=$enableval else enable_os2=no fi if test "x$enable_os2" = xno; then use_os2="no (disabled, use --enable-os2 to enable)" else if test "x$cairo_cv_backend_os2_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_os2_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's OS/2 backend" >&5 $as_echo_n "checking for cairo's OS/2 backend... " >&6; } if ${cairo_cv_backend_os2_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_os2=yes os2_REQUIRES=$ac_env_os2_REQUIRES_value os2_CFLAGS=$ac_env_os2_CFLAGS_value os2_LIBS=$ac_env_os2_LIBS_value os2_NONPKGCONFIG_CFLAGS=$ac_env_os2_NONPKGCONFIG_CFLAGS_value os2_NONPKGCONFIG_LIBS=$ac_env_os2_NONPKGCONFIG_LIBS_value os2_BASE=cairo case "$host" in *-*-os2*) : ;; *) use_os2="no (requires an OS/2 platform)" ;; esac cairo_cv_backend_os2_use=$use_os2 cairo_cv_backend_os2_cache_version=4 cairo_cv_backend_os2_requires=$os2_REQUIRES cairo_cv_backend_os2_cflags=$os2_CFLAGS cairo_cv_backend_os2_libs=$os2_LIBS cairo_cv_backend_os2_nonpkgconfig_cflags=$os2_NONPKGCONFIG_CFLAGS cairo_cv_backend_os2_nonpkgconfig_libs=$os2_NONPKGCONFIG_LIBS cairo_cv_backend_os2_base=$os2_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's OS/2 backend could be enabled" >&5 $as_echo_n "checking whether cairo's OS/2 backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_os2_use" >&5 $as_echo "$cairo_cv_backend_os2_use" >&6; } use_os2=$cairo_cv_backend_os2_use os2_BASE=$cairo_cv_backend_os2_base os2_REQUIRES="$cairo_cv_backend_os2_requires " os2_CFLAGS="$cairo_cv_backend_os2_cflags " os2_LIBS="$cairo_cv_backend_os2_libs " os2_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_os2_nonpkgconfig_cflags " os2_NONPKGCONFIG_LIBS="$cairo_cv_backend_os2_nonpkgconfig_libs " # null the ones that only have space test "x$os2_REQUIRES" = "x " && os2_REQUIRES="" test "x$os2_CFLAGS" = "x " && os2_CFLAGS="" test "x$os2_LIBS" = "x " && os2_LIBS="" test "x$os2_NONPKGCONFIG_CFLAGS" = "x " && os2_NONPKGCONFIG_CFLAGS="" test "x$os2_NONPKGCONFIG_LIBS" = "x " && os2_NONPKGCONFIG_LIBS="" case $enable_os2 in yes) if test "x$use_os2" = xyes; then : else as_fn_error $? "requested OS/2 backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-os2: $use_os2, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_os2" = xyes; then CAIRO_FEATURES="OS2_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$os2_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$os2_NONPKGCONFIG_CFLAGS$os2_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$os2_NONPKGCONFIG_LIBS$os2_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$os2_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$os2_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-os2.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,os2,g" \ -e "s,@Backend_Name@,OS/2,g" \ -e "s,@BACKEND_BASE@,$os2_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$os2_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$os2_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$os2_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="OS2_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_os2" = xyes; then CAIRO_HAS_OS2_SURFACE_TRUE= CAIRO_HAS_OS2_SURFACE_FALSE='#' else CAIRO_HAS_OS2_SURFACE_TRUE='#' CAIRO_HAS_OS2_SURFACE_FALSE= fi # Check whether --enable-beos was given. if test "${enable_beos+set}" = set; then : enableval=$enable_beos; enable_beos=$enableval else enable_beos=no fi if test "x$enable_beos" = xno; then use_beos="no (disabled, use --enable-beos to enable)" else if test "x$cairo_cv_backend_beos_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_beos_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's BeOS/Zeta backend" >&5 $as_echo_n "checking for cairo's BeOS/Zeta backend... " >&6; } if ${cairo_cv_backend_beos_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_beos=yes beos_REQUIRES=$ac_env_beos_REQUIRES_value beos_CFLAGS=$ac_env_beos_CFLAGS_value beos_LIBS=$ac_env_beos_LIBS_value beos_NONPKGCONFIG_CFLAGS=$ac_env_beos_NONPKGCONFIG_CFLAGS_value beos_NONPKGCONFIG_LIBS=$ac_env_beos_NONPKGCONFIG_LIBS_value beos_BASE=cairo case "$host" in *-*-beos) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lbe" >&5 $as_echo_n "checking for main in -lbe... " >&6; } if ${ac_cv_lib_be_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbe $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_be_main=yes else ac_cv_lib_be_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_be_main" >&5 $as_echo "$ac_cv_lib_be_main" >&6; } if test "x$ac_cv_lib_be_main" = xyes; then : beos_LIBS="$beos_LIBS -lbe" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lzeta" >&5 $as_echo_n "checking for main in -lzeta... " >&6; } if ${ac_cv_lib_zeta_main+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lzeta $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_zeta_main=yes else ac_cv_lib_zeta_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_zeta_main" >&5 $as_echo "$ac_cv_lib_zeta_main" >&6; } if test "x$ac_cv_lib_zeta_main" = xyes; then : beos_LIBS="$beos_LIBS -lzeta" fi ;; *) use_beos="no (requires a BeOS platform)" ;; esac cairo_cv_backend_beos_use=$use_beos cairo_cv_backend_beos_cache_version=4 cairo_cv_backend_beos_requires=$beos_REQUIRES cairo_cv_backend_beos_cflags=$beos_CFLAGS cairo_cv_backend_beos_libs=$beos_LIBS cairo_cv_backend_beos_nonpkgconfig_cflags=$beos_NONPKGCONFIG_CFLAGS cairo_cv_backend_beos_nonpkgconfig_libs=$beos_NONPKGCONFIG_LIBS cairo_cv_backend_beos_base=$beos_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's BeOS/Zeta backend could be enabled" >&5 $as_echo_n "checking whether cairo's BeOS/Zeta backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_beos_use" >&5 $as_echo "$cairo_cv_backend_beos_use" >&6; } use_beos=$cairo_cv_backend_beos_use beos_BASE=$cairo_cv_backend_beos_base beos_REQUIRES="$cairo_cv_backend_beos_requires " beos_CFLAGS="$cairo_cv_backend_beos_cflags " beos_LIBS="$cairo_cv_backend_beos_libs " beos_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_beos_nonpkgconfig_cflags " beos_NONPKGCONFIG_LIBS="$cairo_cv_backend_beos_nonpkgconfig_libs " # null the ones that only have space test "x$beos_REQUIRES" = "x " && beos_REQUIRES="" test "x$beos_CFLAGS" = "x " && beos_CFLAGS="" test "x$beos_LIBS" = "x " && beos_LIBS="" test "x$beos_NONPKGCONFIG_CFLAGS" = "x " && beos_NONPKGCONFIG_CFLAGS="" test "x$beos_NONPKGCONFIG_LIBS" = "x " && beos_NONPKGCONFIG_LIBS="" case $enable_beos in yes) if test "x$use_beos" = xyes; then : else as_fn_error $? "requested BeOS/Zeta backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-beos: $use_beos, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_beos" = xyes; then CAIRO_FEATURES="BEOS_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$beos_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$beos_NONPKGCONFIG_CFLAGS$beos_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$beos_NONPKGCONFIG_LIBS$beos_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$beos_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$beos_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-beos.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,beos,g" \ -e "s,@Backend_Name@,BeOS/Zeta,g" \ -e "s,@BACKEND_BASE@,$beos_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$beos_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$beos_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$beos_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="BEOS_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_beos" = xyes; then CAIRO_HAS_BEOS_SURFACE_TRUE= CAIRO_HAS_BEOS_SURFACE_FALSE='#' else CAIRO_HAS_BEOS_SURFACE_TRUE='#' CAIRO_HAS_BEOS_SURFACE_FALSE= fi # Uncomment the if, since with it in place compilation breaks on OpenSuSE 11.1b4 #if test "x$use_beos" = "xyes"; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case ${2} in .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test "X$CXX" != "Xno" && ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || (test "X$CXX" != "Xg++"))) ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test "$_lt_caught_CXX_error" != yes; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test "$GXX" = yes; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test "$GXX" = yes; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test "$with_gnu_ld" = yes; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$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' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='${wl}' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='${wl}-f,' if test "$GXX" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec_CXX='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_CXX='-berok' # Determine the default libpath from the value encoded in an empty # executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$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" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$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" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' ${wl}-bernotok' allow_undefined_flag_CXX=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes # This is similar to how AIX traditionally builds its shared # libraries. archive_expsym_cmds_CXX="\$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' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ func_to_tool_file "$lt_outputfile"~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='${wl}--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$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' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $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' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds_CXX="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}" module_expsym_cmds_CXX="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}" if test "$lt_cv_apple_cc_single_mod" != "yes"; then archive_cmds_CXX="\$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}" archive_expsym_cmds_CXX="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}" fi else ld_shlibs_CXX=no fi ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='${wl}-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then archive_cmds_CXX='$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' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test $with_gnu_ld = no; then hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='${wl}-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes; then if test $with_gnu_ld = no; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='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' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$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' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test "$GXX" = yes; then if test "$with_gnu_ld" = no; then archive_cmds_CXX='$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' else archive_cmds_CXX='$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' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='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' archive_expsym_cmds_CXX='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' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $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' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' archive_expsym_cmds_CXX='$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' ;; esac hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' whole_archive_flag_spec_CXX='${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' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec_CXX='${wl}--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='${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' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd2*) # C++ shared libraries are fairly broken ld_shlibs_CXX=no ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='${wl}-E' whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='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' hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' archive_cmds_CXX='$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' hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$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' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $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~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. 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"' ;; *) if test "$GXX" = yes && test "$with_gnu_ld" = no; then allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' case $host in osf3*) archive_cmds_CXX='$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' ;; *) archive_cmds_CXX='$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' ;; esac hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test "$GXX" = yes && test "$with_gnu_ld" = no; then no_undefined_flag_CXX=' ${wl}-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require `-G' NOT `-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='${wl}-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='${wl}-z,text' allow_undefined_flag_CXX='${wl}-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='${wl}-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no GCC_CXX="$GXX" LD_CXX="$LD" ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case ${prev}${p} in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test $p = "-L" || test $p = "-R"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test "$pre_test_object_deps_done" = no; then case ${prev} in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX="${prev}${p}" else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX="${prev}${p}" else postdeps_CXX="${postdeps_CXX} ${prev}${p}" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test "$pre_test_object_deps_done" = no; then if test -z "$predep_objects_CXX"; then predep_objects_CXX="$p" else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX="$p" else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # The more standards-conforming stlport4 library is # incompatible with the Cstd library. Avoid specifying # it if it's in CXXFLAGS. Ignore libCrun as # -library=stlport4 depends on it. case " $CXX $CXXFLAGS " in *" -library=stlport4 "*) solaris_use_stlport4=yes ;; esac # Adding this requires a known-good setup of shared libraries for # Sun compiler versions before 5.6, else PIC objects from an old # archive will be linked into the output, leading to subtle bugs. if test "$solaris_use_stlport4" != yes; then postdeps_CXX='-library=Cstd -library=Crun' fi ;; esac ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--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" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64 which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global defined # symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX="$ltdll_cmds" ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test "$ld_shlibs_CXX" = no && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test "X$hardcode_automatic_CXX" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct_CXX" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no && test "$hardcode_minus_L_CXX" != no; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test "$hardcode_action_CXX" = relink || test "$inherit_rpath_CXX" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test "$_lt_caught_CXX_error" != yes ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #fi # Check whether --enable-png was given. if test "${enable_png+set}" = set; then : enableval=$enable_png; enable_png=$enableval else enable_png=yes fi if test "x$enable_png" = xno; then use_png="no (disabled, use --enable-png to enable)" else if test "x$cairo_cv_backend_png_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_png_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PNG backend" >&5 $as_echo_n "checking for cairo's PNG backend... " >&6; } if ${cairo_cv_backend_png_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_png=yes png_REQUIRES=$ac_env_png_REQUIRES_value png_CFLAGS=$ac_env_png_CFLAGS_value png_LIBS=$ac_env_png_LIBS_value png_NONPKGCONFIG_CFLAGS=$ac_env_png_NONPKGCONFIG_CFLAGS_value png_NONPKGCONFIG_LIBS=$ac_env_png_NONPKGCONFIG_LIBS_value png_BASE=cairo use_png=no if test "x$png_REQUIRES" = x; then # libpng13 is GnuWin32's libpng-1.2.8 :-( for l in libpng12 libpng13 libpng10 ; do if $PKG_CONFIG --exists $l ; then png_REQUIRES=$l use_png=yes break fi done else use_png=yes fi if test "x$use_png" = "xyes" ; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png" >&5 $as_echo_n "checking for png... " >&6; } if test -n "$png_CFLAGS"; then pkg_cv_png_CFLAGS="$png_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$png_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$png_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_png_CFLAGS=`$PKG_CONFIG --cflags "$png_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$png_LIBS"; then pkg_cv_png_LIBS="$png_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$png_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$png_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_png_LIBS=`$PKG_CONFIG --libs "$png_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then png_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$png_REQUIRES" 2>&1` else png_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$png_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$png_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else png_CFLAGS=$pkg_cv_png_CFLAGS png_LIBS=$pkg_cv_png_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find libpng in the pkg-config search path" >&5 $as_echo "$as_me: WARNING: Could not find libpng in the pkg-config search path" >&2;} fi cairo_cv_backend_png_use=$use_png cairo_cv_backend_png_cache_version=4 cairo_cv_backend_png_requires=$png_REQUIRES cairo_cv_backend_png_cflags=$png_CFLAGS cairo_cv_backend_png_libs=$png_LIBS cairo_cv_backend_png_nonpkgconfig_cflags=$png_NONPKGCONFIG_CFLAGS cairo_cv_backend_png_nonpkgconfig_libs=$png_NONPKGCONFIG_LIBS cairo_cv_backend_png_base=$png_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PNG backend could be enabled" >&5 $as_echo_n "checking whether cairo's PNG backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_png_use" >&5 $as_echo "$cairo_cv_backend_png_use" >&6; } use_png=$cairo_cv_backend_png_use png_BASE=$cairo_cv_backend_png_base png_REQUIRES="$cairo_cv_backend_png_requires " png_CFLAGS="$cairo_cv_backend_png_cflags " png_LIBS="$cairo_cv_backend_png_libs " png_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_png_nonpkgconfig_cflags " png_NONPKGCONFIG_LIBS="$cairo_cv_backend_png_nonpkgconfig_libs " # null the ones that only have space test "x$png_REQUIRES" = "x " && png_REQUIRES="" test "x$png_CFLAGS" = "x " && png_CFLAGS="" test "x$png_LIBS" = "x " && png_LIBS="" test "x$png_NONPKGCONFIG_CFLAGS" = "x " && png_NONPKGCONFIG_CFLAGS="" test "x$png_NONPKGCONFIG_LIBS" = "x " && png_NONPKGCONFIG_LIBS="" case $enable_png in yes) if test "x$use_png" = xyes; then : else as_fn_error $? "requested PNG backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-png: $use_png, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_png" = xyes; then CAIRO_FEATURES="PNG_FUNCTIONS $CAIRO_FEATURES" CAIRO_REQUIRES="$png_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$png_NONPKGCONFIG_CFLAGS$png_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$png_NONPKGCONFIG_LIBS$png_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$png_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$png_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-png.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,png,g" \ -e "s,@Backend_Name@,PNG,g" \ -e "s,@BACKEND_BASE@,$png_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$png_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$png_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$png_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="PNG_FUNCTIONS $CAIRO_NO_FEATURES" fi fi if test "x$use_png" = xyes; then CAIRO_HAS_PNG_FUNCTIONS_TRUE= CAIRO_HAS_PNG_FUNCTIONS_FALSE='#' else CAIRO_HAS_PNG_FUNCTIONS_TRUE='#' CAIRO_HAS_PNG_FUNCTIONS_FALSE= fi if test "x$use_png" = "xyes"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** To run the tests, cairo must be built with png support ***" >&5 $as_echo "$as_me: WARNING: *** To run the tests, cairo must be built with png support ***" >&2;} fi GLITZ_MIN_VERSION=0.5.1 # Check whether --enable-glitz was given. if test "${enable_glitz+set}" = set; then : enableval=$enable_glitz; enable_glitz=$enableval else enable_glitz=no fi if test "x$enable_glitz" = xno; then use_glitz="no (disabled, use --enable-glitz to enable)" else if test "x$cairo_cv_backend_glitz_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_glitz_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's glitz backend" >&5 $as_echo_n "checking for cairo's glitz backend... " >&6; } if ${cairo_cv_backend_glitz_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_glitz=yes glitz_REQUIRES=$ac_env_glitz_REQUIRES_value glitz_CFLAGS=$ac_env_glitz_CFLAGS_value glitz_LIBS=$ac_env_glitz_LIBS_value glitz_NONPKGCONFIG_CFLAGS=$ac_env_glitz_NONPKGCONFIG_CFLAGS_value glitz_NONPKGCONFIG_LIBS=$ac_env_glitz_NONPKGCONFIG_LIBS_value glitz_BASE=cairo glitz_REQUIRES="glitz >= $GLITZ_MIN_VERSION" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glitz" >&5 $as_echo_n "checking for glitz... " >&6; } if test -n "$glitz_CFLAGS"; then pkg_cv_glitz_CFLAGS="$glitz_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$glitz_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$glitz_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_glitz_CFLAGS=`$PKG_CONFIG --cflags "$glitz_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$glitz_LIBS"; then pkg_cv_glitz_LIBS="$glitz_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$glitz_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$glitz_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_glitz_LIBS=`$PKG_CONFIG --libs "$glitz_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then glitz_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$glitz_REQUIRES" 2>&1` else glitz_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$glitz_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$glitz_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_glitz="no (requires glitz http://freedesktop.org/Software/glitz)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_glitz="no (requires glitz http://freedesktop.org/Software/glitz)" else glitz_CFLAGS=$pkg_cv_glitz_CFLAGS glitz_LIBS=$pkg_cv_glitz_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi cairo_cv_backend_glitz_use=$use_glitz cairo_cv_backend_glitz_cache_version=4 cairo_cv_backend_glitz_requires=$glitz_REQUIRES cairo_cv_backend_glitz_cflags=$glitz_CFLAGS cairo_cv_backend_glitz_libs=$glitz_LIBS cairo_cv_backend_glitz_nonpkgconfig_cflags=$glitz_NONPKGCONFIG_CFLAGS cairo_cv_backend_glitz_nonpkgconfig_libs=$glitz_NONPKGCONFIG_LIBS cairo_cv_backend_glitz_base=$glitz_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's glitz backend could be enabled" >&5 $as_echo_n "checking whether cairo's glitz backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_glitz_use" >&5 $as_echo "$cairo_cv_backend_glitz_use" >&6; } use_glitz=$cairo_cv_backend_glitz_use glitz_BASE=$cairo_cv_backend_glitz_base glitz_REQUIRES="$cairo_cv_backend_glitz_requires " glitz_CFLAGS="$cairo_cv_backend_glitz_cflags " glitz_LIBS="$cairo_cv_backend_glitz_libs " glitz_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_glitz_nonpkgconfig_cflags " glitz_NONPKGCONFIG_LIBS="$cairo_cv_backend_glitz_nonpkgconfig_libs " # null the ones that only have space test "x$glitz_REQUIRES" = "x " && glitz_REQUIRES="" test "x$glitz_CFLAGS" = "x " && glitz_CFLAGS="" test "x$glitz_LIBS" = "x " && glitz_LIBS="" test "x$glitz_NONPKGCONFIG_CFLAGS" = "x " && glitz_NONPKGCONFIG_CFLAGS="" test "x$glitz_NONPKGCONFIG_LIBS" = "x " && glitz_NONPKGCONFIG_LIBS="" case $enable_glitz in yes) if test "x$use_glitz" = xyes; then : else as_fn_error $? "requested glitz backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-glitz: $use_glitz, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_glitz" = xyes; then CAIRO_FEATURES="GLITZ_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$glitz_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$glitz_NONPKGCONFIG_CFLAGS$glitz_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$glitz_NONPKGCONFIG_LIBS$glitz_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$glitz_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$glitz_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-glitz.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,glitz,g" \ -e "s,@Backend_Name@,glitz,g" \ -e "s,@BACKEND_BASE@,$glitz_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$glitz_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$glitz_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$glitz_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="GLITZ_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_glitz" = xyes; then CAIRO_HAS_GLITZ_SURFACE_TRUE= CAIRO_HAS_GLITZ_SURFACE_FALSE='#' else CAIRO_HAS_GLITZ_SURFACE_TRUE='#' CAIRO_HAS_GLITZ_SURFACE_FALSE= fi if test "x$use_glitz" = "xyes";then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLITZ_AGL" >&5 $as_echo_n "checking for GLITZ_AGL... " >&6; } if test -n "$GLITZ_AGL_CFLAGS"; then pkg_cv_GLITZ_AGL_CFLAGS="$GLITZ_AGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-agl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-agl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_AGL_CFLAGS=`$PKG_CONFIG --cflags "glitz-agl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLITZ_AGL_LIBS"; then pkg_cv_GLITZ_AGL_LIBS="$GLITZ_AGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-agl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-agl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_AGL_LIBS=`$PKG_CONFIG --libs "glitz-agl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLITZ_AGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glitz-agl >= $GLITZ_MIN_VERSION" 2>&1` else GLITZ_AGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glitz-agl >= $GLITZ_MIN_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLITZ_AGL_PKG_ERRORS" >&5 have_glitz_agl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_glitz_agl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else GLITZ_AGL_CFLAGS=$pkg_cv_GLITZ_AGL_CFLAGS GLITZ_AGL_LIBS=$pkg_cv_GLITZ_AGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_glitz_agl=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLITZ_EGL" >&5 $as_echo_n "checking for GLITZ_EGL... " >&6; } if test -n "$GLITZ_EGL_CFLAGS"; then pkg_cv_GLITZ_EGL_CFLAGS="$GLITZ_EGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-egl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-egl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_EGL_CFLAGS=`$PKG_CONFIG --cflags "glitz-egl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLITZ_EGL_LIBS"; then pkg_cv_GLITZ_EGL_LIBS="$GLITZ_EGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-egl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-egl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_EGL_LIBS=`$PKG_CONFIG --libs "glitz-egl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLITZ_EGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glitz-egl >= $GLITZ_MIN_VERSION" 2>&1` else GLITZ_EGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glitz-egl >= $GLITZ_MIN_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLITZ_EGL_PKG_ERRORS" >&5 have_glitz_egl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_glitz_egl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else GLITZ_EGL_CFLAGS=$pkg_cv_GLITZ_EGL_CFLAGS GLITZ_EGL_LIBS=$pkg_cv_GLITZ_EGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_glitz_egl=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLITZ_GLX" >&5 $as_echo_n "checking for GLITZ_GLX... " >&6; } if test -n "$GLITZ_GLX_CFLAGS"; then pkg_cv_GLITZ_GLX_CFLAGS="$GLITZ_GLX_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-glx >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-glx >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_GLX_CFLAGS=`$PKG_CONFIG --cflags "glitz-glx >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLITZ_GLX_LIBS"; then pkg_cv_GLITZ_GLX_LIBS="$GLITZ_GLX_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-glx >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-glx >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_GLX_LIBS=`$PKG_CONFIG --libs "glitz-glx >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLITZ_GLX_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glitz-glx >= $GLITZ_MIN_VERSION" 2>&1` else GLITZ_GLX_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glitz-glx >= $GLITZ_MIN_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLITZ_GLX_PKG_ERRORS" >&5 have_glitz_glx=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_glitz_glx=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else GLITZ_GLX_CFLAGS=$pkg_cv_GLITZ_GLX_CFLAGS GLITZ_GLX_LIBS=$pkg_cv_GLITZ_GLX_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_glitz_glx=yes fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLITZ_WGL" >&5 $as_echo_n "checking for GLITZ_WGL... " >&6; } if test -n "$GLITZ_WGL_CFLAGS"; then pkg_cv_GLITZ_WGL_CFLAGS="$GLITZ_WGL_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-wgl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-wgl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_WGL_CFLAGS=`$PKG_CONFIG --cflags "glitz-wgl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$GLITZ_WGL_LIBS"; then pkg_cv_GLITZ_WGL_LIBS="$GLITZ_WGL_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glitz-wgl >= \$GLITZ_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glitz-wgl >= $GLITZ_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_GLITZ_WGL_LIBS=`$PKG_CONFIG --libs "glitz-wgl >= $GLITZ_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GLITZ_WGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glitz-wgl >= $GLITZ_MIN_VERSION" 2>&1` else GLITZ_WGL_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glitz-wgl >= $GLITZ_MIN_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$GLITZ_WGL_PKG_ERRORS" >&5 have_glitz_wgl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_glitz_wgl=no; { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } else GLITZ_WGL_CFLAGS=$pkg_cv_GLITZ_WGL_CFLAGS GLITZ_WGL_LIBS=$pkg_cv_GLITZ_WGL_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } have_glitz_wgl=yes fi if test "x$have_glitz_agl" = "xyes";then $as_echo "#define CAIRO_CAN_TEST_GLITZ_AGL_SURFACE 1" >>confdefs.h fi if test "x$have_glitz_egl" = "xyes";then $as_echo "#define CAIRO_CAN_TEST_GLITZ_EGL_SURFACE 1" >>confdefs.h fi if test "x$have_glitz_glx" = "xyes";then $as_echo "#define CAIRO_CAN_TEST_GLITZ_GLX_SURFACE 1" >>confdefs.h fi if test "x$have_glitz_wgl" = "xyes";then $as_echo "#define CAIRO_CAN_TEST_GLITZ_WGL_SURFACE 1" >>confdefs.h fi fi if test "x$have_glitz_agl" = "xyes"; then CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_TRUE= CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_FALSE='#' else CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_TRUE='#' CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_FALSE= fi if test "x$have_glitz_egl" = "xyes"; then CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_TRUE= CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_FALSE='#' else CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_TRUE='#' CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_FALSE= fi if test "x$have_glitz_glx" = "xyes"; then CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_TRUE= CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_FALSE='#' else CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_TRUE='#' CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_FALSE= fi if test "x$have_glitz_wgl" = "xyes"; then CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_TRUE= CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_FALSE='#' else CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_TRUE='#' CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_FALSE= fi # Check whether --enable-directfb was given. if test "${enable_directfb+set}" = set; then : enableval=$enable_directfb; enable_directfb=$enableval else enable_directfb=no fi if test "x$enable_directfb" = xno; then use_directfb="no (disabled, use --enable-directfb to enable)" else if test "x$cairo_cv_backend_directfb_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_directfb_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's directfb backend" >&5 $as_echo_n "checking for cairo's directfb backend... " >&6; } if ${cairo_cv_backend_directfb_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_directfb=yes directfb_REQUIRES=$ac_env_directfb_REQUIRES_value directfb_CFLAGS=$ac_env_directfb_CFLAGS_value directfb_LIBS=$ac_env_directfb_LIBS_value directfb_NONPKGCONFIG_CFLAGS=$ac_env_directfb_NONPKGCONFIG_CFLAGS_value directfb_NONPKGCONFIG_LIBS=$ac_env_directfb_NONPKGCONFIG_LIBS_value directfb_BASE=cairo directfb_REQUIRES=directfb pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for directfb" >&5 $as_echo_n "checking for directfb... " >&6; } if test -n "$directfb_CFLAGS"; then pkg_cv_directfb_CFLAGS="$directfb_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$directfb_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$directfb_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_directfb_CFLAGS=`$PKG_CONFIG --cflags "$directfb_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$directfb_LIBS"; then pkg_cv_directfb_LIBS="$directfb_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$directfb_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$directfb_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_directfb_LIBS=`$PKG_CONFIG --libs "$directfb_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then directfb_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$directfb_REQUIRES" 2>&1` else directfb_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$directfb_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$directfb_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_directfb="no (requires directfb http://www.directfb.org)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_directfb="no (requires directfb http://www.directfb.org)" else directfb_CFLAGS=$pkg_cv_directfb_CFLAGS directfb_LIBS=$pkg_cv_directfb_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi cairo_cv_backend_directfb_use=$use_directfb cairo_cv_backend_directfb_cache_version=4 cairo_cv_backend_directfb_requires=$directfb_REQUIRES cairo_cv_backend_directfb_cflags=$directfb_CFLAGS cairo_cv_backend_directfb_libs=$directfb_LIBS cairo_cv_backend_directfb_nonpkgconfig_cflags=$directfb_NONPKGCONFIG_CFLAGS cairo_cv_backend_directfb_nonpkgconfig_libs=$directfb_NONPKGCONFIG_LIBS cairo_cv_backend_directfb_base=$directfb_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's directfb backend could be enabled" >&5 $as_echo_n "checking whether cairo's directfb backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_directfb_use" >&5 $as_echo "$cairo_cv_backend_directfb_use" >&6; } use_directfb=$cairo_cv_backend_directfb_use directfb_BASE=$cairo_cv_backend_directfb_base directfb_REQUIRES="$cairo_cv_backend_directfb_requires " directfb_CFLAGS="$cairo_cv_backend_directfb_cflags " directfb_LIBS="$cairo_cv_backend_directfb_libs " directfb_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_directfb_nonpkgconfig_cflags " directfb_NONPKGCONFIG_LIBS="$cairo_cv_backend_directfb_nonpkgconfig_libs " # null the ones that only have space test "x$directfb_REQUIRES" = "x " && directfb_REQUIRES="" test "x$directfb_CFLAGS" = "x " && directfb_CFLAGS="" test "x$directfb_LIBS" = "x " && directfb_LIBS="" test "x$directfb_NONPKGCONFIG_CFLAGS" = "x " && directfb_NONPKGCONFIG_CFLAGS="" test "x$directfb_NONPKGCONFIG_LIBS" = "x " && directfb_NONPKGCONFIG_LIBS="" case $enable_directfb in yes) if test "x$use_directfb" = xyes; then : else as_fn_error $? "requested directfb backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-directfb: $use_directfb, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_directfb" = xyes; then CAIRO_FEATURES="DIRECTFB_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$directfb_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$directfb_NONPKGCONFIG_CFLAGS$directfb_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$directfb_NONPKGCONFIG_LIBS$directfb_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$directfb_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$directfb_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-directfb.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,directfb,g" \ -e "s,@Backend_Name@,directfb,g" \ -e "s,@BACKEND_BASE@,$directfb_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$directfb_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$directfb_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$directfb_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="DIRECTFB_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_directfb" = xyes; then CAIRO_HAS_DIRECTFB_SURFACE_TRUE= CAIRO_HAS_DIRECTFB_SURFACE_FALSE='#' else CAIRO_HAS_DIRECTFB_SURFACE_TRUE='#' CAIRO_HAS_DIRECTFB_SURFACE_FALSE= fi # We use pkg-config to look for freetype2, but fall back to # freetype-config if it fails. We prefer pkg-config, since we can # then just put freetype2 >= $FREETYPE_MIN_VERSION in # Requires.private, but at least up to 2003-06-07, there was no # freetype2.pc in the release. # # FreeType versions come in three forms: # release (such as 2.1.9) # libtool (such as 9.7.3) (returned by freetype-config and pkg-config) # platform-specific/soname (such as 6.3.4) # and they recommend you never use the platform-specific version # (see docs/VERSION.DLL in freetype2 sources) # # Set these as appropriate: # release number - for information only FREETYPE_MIN_RELEASE=2.1.0 # libtool-specific version - this is what is checked FREETYPE_MIN_VERSION=8.0.2 # Check whether --enable-freetype was given. if test "${enable_freetype+set}" = set; then : enableval=$enable_freetype; enable_ft=$enableval else enable_ft=auto fi if test "x$enable_ft" = xno; then use_ft="no (disabled, use --enable-freetype to enable)" else if test "x$cairo_cv_backend_ft_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_ft_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's FreeType font backend" >&5 $as_echo_n "checking for cairo's FreeType font backend... " >&6; } if ${cairo_cv_backend_ft_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_ft=yes ft_REQUIRES=$ac_env_ft_REQUIRES_value ft_CFLAGS=$ac_env_ft_CFLAGS_value ft_LIBS=$ac_env_ft_LIBS_value ft_NONPKGCONFIG_CFLAGS=$ac_env_ft_NONPKGCONFIG_CFLAGS_value ft_NONPKGCONFIG_LIBS=$ac_env_ft_NONPKGCONFIG_LIBS_value ft_BASE=cairo ft_REQUIRES="fontconfig" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 $as_echo_n "checking for FONTCONFIG... " >&6; } if test -n "$FONTCONFIG_CFLAGS"; then pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$ft_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$ft_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "$ft_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FONTCONFIG_LIBS"; then pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$ft_REQUIRES\""; } >&5 ($PKG_CONFIG --exists --print-errors "$ft_REQUIRES") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "$ft_REQUIRES" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$ft_REQUIRES" 2>&1` else FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$ft_REQUIRES" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FONTCONFIG_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_ft=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } use_ft=no else FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } use_ft=yes fi if test "x$use_ft" = "xyes"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE" >&5 $as_echo_n "checking for FREETYPE... " >&6; } if test -n "$FREETYPE_CFLAGS"; then pkg_cv_FREETYPE_CFLAGS="$FREETYPE_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= \$FREETYPE_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2 >= $FREETYPE_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_CFLAGS=`$PKG_CONFIG --cflags "freetype2 >= $FREETYPE_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FREETYPE_LIBS"; then pkg_cv_FREETYPE_LIBS="$FREETYPE_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2 >= \$FREETYPE_MIN_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2 >= $FREETYPE_MIN_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE_LIBS=`$PKG_CONFIG --libs "freetype2 >= $FREETYPE_MIN_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FREETYPE_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2 >= $FREETYPE_MIN_VERSION" 2>&1` else FREETYPE_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2 >= $FREETYPE_MIN_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } freetype_pkgconfig=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } freetype_pkgconfig=no else FREETYPE_CFLAGS=$pkg_cv_FREETYPE_CFLAGS FREETYPE_LIBS=$pkg_cv_FREETYPE_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } freetype_pkgconfig=yes fi if test "x$freetype_pkgconfig" = "xyes"; then ft_REQUIRES="freetype2 >= $FREETYPE_MIN_VERSION $ft_REQUIRES" else if test -z "$FREETYPE_CONFIG"; then # Extract the first word of "freetype-config", so it can be a program name with args. set dummy freetype-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FREETYPE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" ;; esac fi FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG if test -n "$FREETYPE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 $as_echo "$FREETYPE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "x$FREETYPE_CONFIG" = "xno" ; then use_ft='no (freetype-config not found in path or $FREETYPE_CONFIG)' else { $as_echo "$as_me:${as_lineno-$LINENO}: checking freetype2 libtool version" >&5 $as_echo_n "checking freetype2 libtool version... " >&6; } FREETYPE_VERSION=`$FREETYPE_CONFIG --version` VERSION_DEC=`echo $FREETYPE_VERSION | awk -F. '{printf("%d\n", 10000*$1 + 100*$2 + $3)};'` MIN_VERSION_DEC=`echo $FREETYPE_MIN_VERSION | awk -F. '{printf("%d\n", 10000*$1 + 100*$2 + $3)};'` if test $VERSION_DEC -lt $MIN_VERSION_DEC; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_VERSION - Too old" >&5 $as_echo "$FREETYPE_VERSION - Too old" >&6; } use_ft="no ($FREETYPE_VERSION found; version $FREETYPE_MIN_VERSION from release $FREETYPE_MIN_RELEASE required)" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_VERSION - OK" >&5 $as_echo "$FREETYPE_VERSION - OK" >&6; } ft_NONPKGCONFIG_CFLAGS=`$FREETYPE_CONFIG --cflags` ft_NONPKGCONFIG_LIBS=`$FREETYPE_CONFIG --libs` fi fi fi fi ft_CFLAGS="$FREETYPE_CFLAGS $FONTCONFIG_CFLAGS" ft_LIBS="$FREETYPE_LIBS $FONTCONFIG_LIBS" cairo_cv_backend_ft_use=$use_ft cairo_cv_backend_ft_cache_version=4 cairo_cv_backend_ft_requires=$ft_REQUIRES cairo_cv_backend_ft_cflags=$ft_CFLAGS cairo_cv_backend_ft_libs=$ft_LIBS cairo_cv_backend_ft_nonpkgconfig_cflags=$ft_NONPKGCONFIG_CFLAGS cairo_cv_backend_ft_nonpkgconfig_libs=$ft_NONPKGCONFIG_LIBS cairo_cv_backend_ft_base=$ft_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's FreeType font backend could be enabled" >&5 $as_echo_n "checking whether cairo's FreeType font backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_ft_use" >&5 $as_echo "$cairo_cv_backend_ft_use" >&6; } use_ft=$cairo_cv_backend_ft_use ft_BASE=$cairo_cv_backend_ft_base ft_REQUIRES="$cairo_cv_backend_ft_requires " ft_CFLAGS="$cairo_cv_backend_ft_cflags " ft_LIBS="$cairo_cv_backend_ft_libs " ft_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_ft_nonpkgconfig_cflags " ft_NONPKGCONFIG_LIBS="$cairo_cv_backend_ft_nonpkgconfig_libs " # null the ones that only have space test "x$ft_REQUIRES" = "x " && ft_REQUIRES="" test "x$ft_CFLAGS" = "x " && ft_CFLAGS="" test "x$ft_LIBS" = "x " && ft_LIBS="" test "x$ft_NONPKGCONFIG_CFLAGS" = "x " && ft_NONPKGCONFIG_CFLAGS="" test "x$ft_NONPKGCONFIG_LIBS" = "x " && ft_NONPKGCONFIG_LIBS="" case $enable_ft in yes) if test "x$use_ft" = xyes; then : else as_fn_error $? "requested FreeType font backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-freetype: $use_ft, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_ft" = xyes; then CAIRO_FEATURES="FT_FONT $CAIRO_FEATURES" CAIRO_REQUIRES="$ft_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$ft_NONPKGCONFIG_CFLAGS$ft_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$ft_NONPKGCONFIG_LIBS$ft_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$ft_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$ft_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-ft.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,ft,g" \ -e "s,@Backend_Name@,FreeType font,g" \ -e "s,@BACKEND_BASE@,$ft_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$ft_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$ft_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$ft_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="FT_FONT $CAIRO_NO_FEATURES" fi fi if test "x$use_ft" = xyes; then CAIRO_HAS_FT_FONT_TRUE= CAIRO_HAS_FT_FONT_FALSE='#' else CAIRO_HAS_FT_FONT_TRUE='#' CAIRO_HAS_FT_FONT_FALSE= fi if test "x$use_ft" = "xyes"; then temp_save_libs="$LIBS" temp_save_cflags="$CFLAGS" LIBS="$LIBS $ft_LIBS" CFLAGS="$CFLAGS $ft_CFLAGS" ac_fn_c_check_member "$LINENO" "FT_Bitmap_Size" "y_ppem" "ac_cv_member_FT_Bitmap_Size_y_ppem" "#include #include FT_FREETYPE_H " if test "x$ac_cv_member_FT_Bitmap_Size_y_ppem" = xyes; then : HAVE_FT_BITMAP_SIZE_Y_PPEM=1 else HAVE_FT_BITMAP_SIZE_Y_PPEM=0 fi cat >>confdefs.h <<_ACEOF #define HAVE_FT_BITMAP_SIZE_Y_PPEM $HAVE_FT_BITMAP_SIZE_Y_PPEM _ACEOF for ac_func in FT_GlyphSlot_Embolden FT_Load_Sfnt_Table do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$temp_save_libs" CFLAGS="$temp_save_cflags" fi # Check whether --enable-pthread was given. if test "${enable_pthread+set}" = set; then : enableval=$enable_pthread; use_pthread=$enableval else use_pthread=auto fi have_pthread=no if test "x$use_pthread" != "xno"; then for ac_header in pthread.h do : ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default" if test "x$ac_cv_header_pthread_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_PTHREAD_H 1 _ACEOF have_pthread=yes else have_pthread=no fi done fi if test "x$have_pthread" = "xyes"; then HAVE_PTHREAD_TRUE= HAVE_PTHREAD_FALSE='#' else HAVE_PTHREAD_TRUE='#' HAVE_PTHREAD_FALSE= fi if test "x$have_pthread" = xno -a "x$use_pthread" = xyes; then as_fn_error $? "pthread requested but not found" "$LINENO" 5 fi # Check whether --enable-ps was given. if test "${enable_ps+set}" = set; then : enableval=$enable_ps; enable_ps=$enableval else enable_ps=yes fi if test "x$enable_ps" = xno; then use_ps="no (disabled, use --enable-ps to enable)" else if test "x$cairo_cv_backend_ps_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_ps_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PostScript backend" >&5 $as_echo_n "checking for cairo's PostScript backend... " >&6; } if ${cairo_cv_backend_ps_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_ps=yes ps_REQUIRES=$ac_env_ps_REQUIRES_value ps_CFLAGS=$ac_env_ps_CFLAGS_value ps_LIBS=$ac_env_ps_LIBS_value ps_NONPKGCONFIG_CFLAGS=$ac_env_ps_NONPKGCONFIG_CFLAGS_value ps_NONPKGCONFIG_LIBS=$ac_env_ps_NONPKGCONFIG_LIBS_value ps_BASE=cairo # The ps backend requires zlib. use_ps=$have_libz ps_NONPKGCONFIG_LIBS=-lz cairo_cv_backend_ps_use=$use_ps cairo_cv_backend_ps_cache_version=4 cairo_cv_backend_ps_requires=$ps_REQUIRES cairo_cv_backend_ps_cflags=$ps_CFLAGS cairo_cv_backend_ps_libs=$ps_LIBS cairo_cv_backend_ps_nonpkgconfig_cflags=$ps_NONPKGCONFIG_CFLAGS cairo_cv_backend_ps_nonpkgconfig_libs=$ps_NONPKGCONFIG_LIBS cairo_cv_backend_ps_base=$ps_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PostScript backend could be enabled" >&5 $as_echo_n "checking whether cairo's PostScript backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_ps_use" >&5 $as_echo "$cairo_cv_backend_ps_use" >&6; } use_ps=$cairo_cv_backend_ps_use ps_BASE=$cairo_cv_backend_ps_base ps_REQUIRES="$cairo_cv_backend_ps_requires " ps_CFLAGS="$cairo_cv_backend_ps_cflags " ps_LIBS="$cairo_cv_backend_ps_libs " ps_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_ps_nonpkgconfig_cflags " ps_NONPKGCONFIG_LIBS="$cairo_cv_backend_ps_nonpkgconfig_libs " # null the ones that only have space test "x$ps_REQUIRES" = "x " && ps_REQUIRES="" test "x$ps_CFLAGS" = "x " && ps_CFLAGS="" test "x$ps_LIBS" = "x " && ps_LIBS="" test "x$ps_NONPKGCONFIG_CFLAGS" = "x " && ps_NONPKGCONFIG_CFLAGS="" test "x$ps_NONPKGCONFIG_LIBS" = "x " && ps_NONPKGCONFIG_LIBS="" case $enable_ps in yes) if test "x$use_ps" = xyes; then : else as_fn_error $? "requested PostScript backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-ps: $use_ps, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_ps" = xyes; then CAIRO_FEATURES="PS_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$ps_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$ps_NONPKGCONFIG_CFLAGS$ps_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$ps_NONPKGCONFIG_LIBS$ps_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$ps_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$ps_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-ps.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,ps,g" \ -e "s,@Backend_Name@,PostScript,g" \ -e "s,@BACKEND_BASE@,$ps_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$ps_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$ps_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$ps_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="PS_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_ps" = xyes; then CAIRO_HAS_PS_SURFACE_TRUE= CAIRO_HAS_PS_SURFACE_FALSE='#' else CAIRO_HAS_PS_SURFACE_TRUE='#' CAIRO_HAS_PS_SURFACE_FALSE= fi test_ps=no if test "x$use_ps" = "xyes"; then # Extract the first word of "gs", so it can be a program name with args. set dummy gs; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_GS+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$GS"; then ac_cv_prog_GS="$GS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_GS="gs" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi GS=$ac_cv_prog_GS if test -n "$GS"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GS" >&5 $as_echo "$GS" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$GS"; then $as_echo "#define CAIRO_CAN_TEST_PS_SURFACE 1" >>confdefs.h test_ps="yes" else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PS backend will not be tested since ghostscript is not available" >&5 $as_echo "$as_me: WARNING: PS backend will not be tested since ghostscript is not available" >&2;} test_ps="no (requires ghostscript)" fi fi if test "x$test_ps" = "xyes"; then CAIRO_CAN_TEST_PS_SURFACE_TRUE= CAIRO_CAN_TEST_PS_SURFACE_FALSE='#' else CAIRO_CAN_TEST_PS_SURFACE_TRUE='#' CAIRO_CAN_TEST_PS_SURFACE_FALSE= fi # Check whether --enable-pdf was given. if test "${enable_pdf+set}" = set; then : enableval=$enable_pdf; enable_pdf=$enableval else enable_pdf=yes fi if test "x$enable_pdf" = xno; then use_pdf="no (disabled, use --enable-pdf to enable)" else if test "x$cairo_cv_backend_pdf_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_pdf_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's PDF backend" >&5 $as_echo_n "checking for cairo's PDF backend... " >&6; } if ${cairo_cv_backend_pdf_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_pdf=yes pdf_REQUIRES=$ac_env_pdf_REQUIRES_value pdf_CFLAGS=$ac_env_pdf_CFLAGS_value pdf_LIBS=$ac_env_pdf_LIBS_value pdf_NONPKGCONFIG_CFLAGS=$ac_env_pdf_NONPKGCONFIG_CFLAGS_value pdf_NONPKGCONFIG_LIBS=$ac_env_pdf_NONPKGCONFIG_LIBS_value pdf_BASE=cairo # The pdf backend requires zlib. use_pdf=$have_libz pdf_NONPKGCONFIG_LIBS=-lz cairo_cv_backend_pdf_use=$use_pdf cairo_cv_backend_pdf_cache_version=4 cairo_cv_backend_pdf_requires=$pdf_REQUIRES cairo_cv_backend_pdf_cflags=$pdf_CFLAGS cairo_cv_backend_pdf_libs=$pdf_LIBS cairo_cv_backend_pdf_nonpkgconfig_cflags=$pdf_NONPKGCONFIG_CFLAGS cairo_cv_backend_pdf_nonpkgconfig_libs=$pdf_NONPKGCONFIG_LIBS cairo_cv_backend_pdf_base=$pdf_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's PDF backend could be enabled" >&5 $as_echo_n "checking whether cairo's PDF backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_pdf_use" >&5 $as_echo "$cairo_cv_backend_pdf_use" >&6; } use_pdf=$cairo_cv_backend_pdf_use pdf_BASE=$cairo_cv_backend_pdf_base pdf_REQUIRES="$cairo_cv_backend_pdf_requires " pdf_CFLAGS="$cairo_cv_backend_pdf_cflags " pdf_LIBS="$cairo_cv_backend_pdf_libs " pdf_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_pdf_nonpkgconfig_cflags " pdf_NONPKGCONFIG_LIBS="$cairo_cv_backend_pdf_nonpkgconfig_libs " # null the ones that only have space test "x$pdf_REQUIRES" = "x " && pdf_REQUIRES="" test "x$pdf_CFLAGS" = "x " && pdf_CFLAGS="" test "x$pdf_LIBS" = "x " && pdf_LIBS="" test "x$pdf_NONPKGCONFIG_CFLAGS" = "x " && pdf_NONPKGCONFIG_CFLAGS="" test "x$pdf_NONPKGCONFIG_LIBS" = "x " && pdf_NONPKGCONFIG_LIBS="" case $enable_pdf in yes) if test "x$use_pdf" = xyes; then : else as_fn_error $? "requested PDF backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-pdf: $use_pdf, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_pdf" = xyes; then CAIRO_FEATURES="PDF_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$pdf_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$pdf_NONPKGCONFIG_CFLAGS$pdf_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$pdf_NONPKGCONFIG_LIBS$pdf_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$pdf_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$pdf_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-pdf.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,pdf,g" \ -e "s,@Backend_Name@,PDF,g" \ -e "s,@BACKEND_BASE@,$pdf_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$pdf_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$pdf_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$pdf_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="PDF_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_pdf" = xyes; then CAIRO_HAS_PDF_SURFACE_TRUE= CAIRO_HAS_PDF_SURFACE_FALSE='#' else CAIRO_HAS_PDF_SURFACE_TRUE='#' CAIRO_HAS_PDF_SURFACE_FALSE= fi POPPLER_VERSION_REQUIRED=0.8.0 test_pdf=no if test "x$use_pdf" = "xyes"; then poppler_DEPENDENCY="poppler-glib >= $POPPLER_VERSION_REQUIRED" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for POPPLER" >&5 $as_echo_n "checking for POPPLER... " >&6; } if test -n "$POPPLER_CFLAGS"; then pkg_cv_POPPLER_CFLAGS="$POPPLER_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$poppler_DEPENDENCY pango gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "$poppler_DEPENDENCY pango gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POPPLER_CFLAGS=`$PKG_CONFIG --cflags "$poppler_DEPENDENCY pango gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$POPPLER_LIBS"; then pkg_cv_POPPLER_LIBS="$POPPLER_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$poppler_DEPENDENCY pango gtk+-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "$poppler_DEPENDENCY pango gtk+-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_POPPLER_LIBS=`$PKG_CONFIG --libs "$poppler_DEPENDENCY pango gtk+-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then POPPLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$poppler_DEPENDENCY pango gtk+-2.0" 2>&1` else POPPLER_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$poppler_DEPENDENCY pango gtk+-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$POPPLER_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_pdf="no (requires $poppler_DEPENDENCY)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_pdf="no (requires $poppler_DEPENDENCY)" else POPPLER_CFLAGS=$pkg_cv_POPPLER_CFLAGS POPPLER_LIBS=$pkg_cv_POPPLER_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } save_cflags="$CFLAGS" save_libs="$LIBS" CFLAGS="$CFLAGS $POPPLER_CFLAGS" LIBS="$LIBS $POPPLER_LIBS" for ac_func in poppler_page_render_to_pixbuf do : ac_fn_c_check_func "$LINENO" "poppler_page_render_to_pixbuf" "ac_cv_func_poppler_page_render_to_pixbuf" if test "x$ac_cv_func_poppler_page_render_to_pixbuf" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_POPPLER_PAGE_RENDER_TO_PIXBUF 1 _ACEOF test_pdf=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_pdf="no (requires $poppler_DEPENDENCY)" fi done CFLAGS="$save_cflags" LIBS="$save_libs" fi if test "x$test_pdf" = "xyes"; then $as_echo "#define CAIRO_CAN_TEST_PDF_SURFACE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available" >&5 $as_echo "$as_me: WARNING: PDF backend will not be tested since poppler >= $POPPLER_VERSION_REQUIRED is not available" >&2;} fi fi if test "x$test_pdf" = "xyes"; then CAIRO_CAN_TEST_PDF_SURFACE_TRUE= CAIRO_CAN_TEST_PDF_SURFACE_FALSE='#' else CAIRO_CAN_TEST_PDF_SURFACE_TRUE='#' CAIRO_CAN_TEST_PDF_SURFACE_FALSE= fi if test "x$use_ps" = "xyes" -o "x$use_pdf" = "xyes"; then CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE= CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE='#' else CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE='#' CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE= fi # Check whether --enable-svg was given. if test "${enable_svg+set}" = set; then : enableval=$enable_svg; enable_svg=$enableval else enable_svg=yes fi if test "x$enable_svg" = xno; then use_svg="no (disabled, use --enable-svg to enable)" else if test "x$cairo_cv_backend_svg_cache_version" != "x4"; then # cached results for this backend (if any) are stale. force rechecking. unset cairo_cv_backend_svg_use fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cairo's SVG backend" >&5 $as_echo_n "checking for cairo's SVG backend... " >&6; } if ${cairo_cv_backend_svg_use+:} false; then : $as_echo_n "(cached) " >&6 else echo use_svg=yes svg_REQUIRES=$ac_env_svg_REQUIRES_value svg_CFLAGS=$ac_env_svg_CFLAGS_value svg_LIBS=$ac_env_svg_LIBS_value svg_NONPKGCONFIG_CFLAGS=$ac_env_svg_NONPKGCONFIG_CFLAGS_value svg_NONPKGCONFIG_LIBS=$ac_env_svg_NONPKGCONFIG_LIBS_value svg_BASE=cairo if test "x$use_png" != "xyes"; then use_svg="no (requires --enable-png)" fi cairo_cv_backend_svg_use=$use_svg cairo_cv_backend_svg_cache_version=4 cairo_cv_backend_svg_requires=$svg_REQUIRES cairo_cv_backend_svg_cflags=$svg_CFLAGS cairo_cv_backend_svg_libs=$svg_LIBS cairo_cv_backend_svg_nonpkgconfig_cflags=$svg_NONPKGCONFIG_CFLAGS cairo_cv_backend_svg_nonpkgconfig_libs=$svg_NONPKGCONFIG_LIBS cairo_cv_backend_svg_base=$svg_BASE { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cairo's SVG backend could be enabled" >&5 $as_echo_n "checking whether cairo's SVG backend could be enabled... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_backend_svg_use" >&5 $as_echo "$cairo_cv_backend_svg_use" >&6; } use_svg=$cairo_cv_backend_svg_use svg_BASE=$cairo_cv_backend_svg_base svg_REQUIRES="$cairo_cv_backend_svg_requires " svg_CFLAGS="$cairo_cv_backend_svg_cflags " svg_LIBS="$cairo_cv_backend_svg_libs " svg_NONPKGCONFIG_CFLAGS="$cairo_cv_backend_svg_nonpkgconfig_cflags " svg_NONPKGCONFIG_LIBS="$cairo_cv_backend_svg_nonpkgconfig_libs " # null the ones that only have space test "x$svg_REQUIRES" = "x " && svg_REQUIRES="" test "x$svg_CFLAGS" = "x " && svg_CFLAGS="" test "x$svg_LIBS" = "x " && svg_LIBS="" test "x$svg_NONPKGCONFIG_CFLAGS" = "x " && svg_NONPKGCONFIG_CFLAGS="" test "x$svg_NONPKGCONFIG_LIBS" = "x " && svg_NONPKGCONFIG_LIBS="" case $enable_svg in yes) if test "x$use_svg" = xyes; then : else as_fn_error $? "requested SVG backend could not be enabled" "$LINENO" 5 fi ;; auto) ;; *) as_fn_error $? "invalid argument passed to --enable-svg: $use_svg, should be one of [no/auto/yes]" "$LINENO" 5 ;; esac if test "x$use_svg" = xyes; then CAIRO_FEATURES="SVG_SURFACE $CAIRO_FEATURES" CAIRO_REQUIRES="$svg_REQUIRES$CAIRO_REQUIRES" CAIRO_CFLAGS="$svg_NONPKGCONFIG_CFLAGS$svg_CFLAGS$CAIRO_CFLAGS" CAIRO_LIBS="$svg_NONPKGCONFIG_LIBS$svg_LIBS$CAIRO_LIBS" CAIRO_NONPKGCONFIG_CFLAGS="$svg_NONPKGCONFIG_CFLAGS$CAIRO_NONPKGCONFIG_CFLAGS" CAIRO_NONPKGCONFIG_LIBS="$svg_NONPKGCONFIG_LIBS$CAIRO_NONPKGCONFIG_LIBS" outfile=`echo src/cairo-svg.pc | sed -e s/_/-/g` { $as_echo "$as_me:${as_lineno-$LINENO}: creating $outfile" >&5 $as_echo "$as_me: creating $outfile" >&6;} mkdir -p src if sed \ -e "s,@backend_name@,svg,g" \ -e "s,@Backend_Name@,SVG,g" \ -e "s,@BACKEND_BASE@,$svg_BASE,g" \ -e "s,@BACKEND_REQUIRES@,$svg_REQUIRES,g" \ -e "s%@BACKEND_NONPKGCONFIG_LIBS@%$svg_NONPKGCONFIG_LIBS%g" \ -e "s,@BACKEND_NONPKGCONFIG_CFLAGS@,$svg_NONPKGCONFIG_CFLAGS,g" \ -e "s,@prefix@,$prefix,g" \ -e "s,@exec_prefix@,$exec_prefix,g" \ -e "s,@libdir@,$libdir,g" \ -e "s,@includedir@,$includedir,g" \ -e "s,@VERSION@,$VERSION,g" \ $srcdir/src/cairo-backend.pc.in > $outfile; then : else rm -f "$outfile" as_fn_error $? "failed creating $outfile" "$LINENO" 5 fi else CAIRO_NO_FEATURES="SVG_SURFACE $CAIRO_NO_FEATURES" fi fi if test "x$use_svg" = xyes; then CAIRO_HAS_SVG_SURFACE_TRUE= CAIRO_HAS_SVG_SURFACE_FALSE='#' else CAIRO_HAS_SVG_SURFACE_TRUE='#' CAIRO_HAS_SVG_SURFACE_FALSE= fi LIBRSVG_VERSION_REQUIRED=2.15.0 test_svg=no if test "x$use_svg" = "xyes"; then librsvg_DEPENDENCY="librsvg-2.0 >= $LIBRSVG_VERSION_REQUIRED" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBRSVG" >&5 $as_echo_n "checking for LIBRSVG... " >&6; } if test -n "$LIBRSVG_CFLAGS"; then pkg_cv_LIBRSVG_CFLAGS="$LIBRSVG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$librsvg_DEPENDENCY gdk-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "$librsvg_DEPENDENCY gdk-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBRSVG_CFLAGS=`$PKG_CONFIG --cflags "$librsvg_DEPENDENCY gdk-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBRSVG_LIBS"; then pkg_cv_LIBRSVG_LIBS="$LIBRSVG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$librsvg_DEPENDENCY gdk-2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "$librsvg_DEPENDENCY gdk-2.0") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBRSVG_LIBS=`$PKG_CONFIG --libs "$librsvg_DEPENDENCY gdk-2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBRSVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$librsvg_DEPENDENCY gdk-2.0" 2>&1` else LIBRSVG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$librsvg_DEPENDENCY gdk-2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBRSVG_PKG_ERRORS" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_svg="no (requires $librsvg_DEPENDENCY)" elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_svg="no (requires $librsvg_DEPENDENCY)" else LIBRSVG_CFLAGS=$pkg_cv_LIBRSVG_CFLAGS LIBRSVG_LIBS=$pkg_cv_LIBRSVG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } save_cflags="$CFLAGS" save_libs="$LIBS" CFLAGS="$CFLAGS $LIBRSVG_CFLAGS" LIBS="$LIBS $LIBRSVG_LIBS" for ac_func in rsvg_pixbuf_from_file do : ac_fn_c_check_func "$LINENO" "rsvg_pixbuf_from_file" "ac_cv_func_rsvg_pixbuf_from_file" if test "x$ac_cv_func_rsvg_pixbuf_from_file" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_RSVG_PIXBUF_FROM_FILE 1 _ACEOF test_svg=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; }; test_svg="no (requires $librsvg_DEPENDENCY)" fi done CFLAGS="$save_cflags" LIBS="$save_libs" fi if test "x$test_svg" = "xyes"; then $as_echo "#define CAIRO_CAN_TEST_SVG_SURFACE 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available" >&5 $as_echo "$as_me: WARNING: SVG backend will not be tested since librsvg >= $LIBRSVG_VERSION_REQUIRED is not available" >&2;} fi fi if test "x$test_svg" = "xyes"; then CAIRO_CAN_TEST_SVG_SURFACE_TRUE= CAIRO_CAN_TEST_SVG_SURFACE_FALSE='#' else CAIRO_CAN_TEST_SVG_SURFACE_TRUE='#' CAIRO_CAN_TEST_SVG_SURFACE_FALSE= fi cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache for ac_header in stdint.h signal.h inttypes.h sys/int_types.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "$ac_includes_default" if test "x$ac_cv_type_uint64_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT64_T 1 _ACEOF fi ac_fn_c_check_type "$LINENO" "uint128_t" "ac_cv_type_uint128_t" "$ac_includes_default" if test "x$ac_cv_type_uint128_t" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_UINT128_T 1 _ACEOF fi for ac_header in sched.h do : ac_fn_c_check_header_mongrel "$LINENO" "sched.h" "ac_cv_header_sched_h" "$ac_includes_default" if test "x$ac_cv_header_sched_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCHED_H 1 _ACEOF for ac_func in sched_getaffinity do : ac_fn_c_check_func "$LINENO" "sched_getaffinity" "ac_cv_func_sched_getaffinity" if test "x$ac_cv_func_sched_getaffinity" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_SCHED_GETAFFINITY 1 _ACEOF $as_echo "#define HAVE_SCHED_GETAFFINITY 1" >>confdefs.h fi done fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_yield in -lrt" >&5 $as_echo_n "checking for sched_yield in -lrt... " >&6; } if ${ac_cv_lib_rt_sched_yield+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lrt $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sched_yield (); int main () { return sched_yield (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_rt_sched_yield=yes else ac_cv_lib_rt_sched_yield=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_sched_yield" >&5 $as_echo "$ac_cv_lib_rt_sched_yield" >&6; } if test "x$ac_cv_lib_rt_sched_yield" = xyes; then : RT_LIBS=-lrt else RT_LIBS= fi CAIROPERF_LIBS=$RT_LIBS for ac_header in libgen.h do : ac_fn_c_check_header_mongrel "$LINENO" "libgen.h" "ac_cv_header_libgen_h" "$ac_includes_default" if test "x$ac_cv_header_libgen_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBGEN_H 1 _ACEOF fi done MAYBE_WARN="-Wall -Wextra \ -Wsign-compare -Werror-implicit-function-declaration \ -Wpointer-arith -Wwrite-strings -Wstrict-prototypes \ -Wmissing-prototypes -Wmissing-declarations -Wnested-externs \ -Wpacked -Wswitch-enum -Wmissing-format-attribute \ -Wstrict-aliasing=2 -Winit-self -Wunsafe-loop-optimizations \ -Wdeclaration-after-statement -Wold-style-definition \ -Wno-missing-field-initializers -Wno-unused-parameter \ -Wno-attributes -Wno-long-long -Winline" # invalidate cached value if MAYBE_WARN has changed if test "x$cairo_cv_warn_maybe" != "x$MAYBE_WARN"; then unset cairo_cv_warn_cflags fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supported warning flags" >&5 $as_echo_n "checking for supported warning flags... " >&6; } if ${cairo_cv_warn_cflags+:} false; then : $as_echo_n "(cached) " >&6 else echo WARN_CFLAGS="" # Some warning options are not supported by all versions of # gcc, so test all desired options against the current # compiler. # # Note that there are some order dependencies # here. Specifically, an option that disables a warning will # have no net effect if a later option then enables that # warnings, (perhaps implicitly). So we put some grouped # options (-Wall and -Wextra) up front and the -Wno options # last. for W in $MAYBE_WARN; do { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports $W" >&5 $as_echo_n "checking whether $CC supports $W... " >&6; } cairo_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $W" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cairo_cc_flag=yes else cairo_cc_flag=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$cairo_save_CFLAGS" if test "x$cairo_cc_flag" = "xyes"; then WARN_CFLAGS="$WARN_CFLAGS $W" else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 $as_echo "$cairo_cc_flag" >&6; } done cairo_cv_warn_cflags=$WARN_CFLAGS cairo_cv_warn_maybe=$MAYBE_WARN { $as_echo "$as_me:${as_lineno-$LINENO}: checking which warning flags were supported" >&5 $as_echo_n "checking which warning flags were supported... " >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_warn_cflags" >&5 $as_echo "$cairo_cv_warn_cflags" >&6; } WARN_CFLAGS="$cairo_cv_warn_cflags" CAIRO_CFLAGS="$CAIRO_CFLAGS $WARN_CFLAGS" # We only wish to enable attribute(warn_unused_result) if we can prevent # gcc from generating thousands of warnings about the misapplication of the # attribute to void functions and variables. { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to enable unused result warnings" >&5 $as_echo_n "checking how to enable unused result warnings... " >&6; } warn_unused_result="" if echo $WARN_CFLAGS | grep -e '-Wno-attributes' >/dev/null; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ __attribute__((__warn_unused_result__)) int f (int i) { return i; } int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : warn_unused_result="__attribute__((__warn_unused_result__))" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi cat >>confdefs.h <<_ACEOF #define WARN_UNUSED_RESULT $warn_unused_result _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $warn_unused_result" >&5 $as_echo "$warn_unused_result" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports -fno-strict-aliasing" >&5 $as_echo_n "checking whether $CC supports -fno-strict-aliasing... " >&6; } cairo_save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fno-strict-aliasing" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cairo_cc_flag=yes else cairo_cc_flag=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS="$cairo_save_CFLAGS" if test "x$cairo_cc_flag" = "xyes"; then CAIRO_CFLAGS="$CAIRO_CFLAGS -fno-strict-aliasing" else : fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cc_flag" >&5 $as_echo "$cairo_cc_flag" >&6; } # Check whether --with-html-dir was given. if test "${with_html_dir+set}" = set; then : withval=$with_html_dir; else with_html_dir='${datadir}/gtk-doc/html' fi HTML_DIR="$with_html_dir" # Check whether --enable-gtk-doc was given. if test "${enable_gtk_doc+set}" = set; then : enableval=$enable_gtk_doc; else enable_gtk_doc=no fi have_gtk_doc=no if test x$enable_gtk_doc = xyes; then if test -z "$PKG_CONFIG"; then # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test "$PKG_CONFIG" != "no" && $PKG_CONFIG --exists gtk-doc; then have_gtk_doc=yes fi gtk_doc_min_version=1.6 if test "$have_gtk_doc" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking gtk-doc version >= $gtk_doc_min_version" >&5 $as_echo_n "checking gtk-doc version >= $gtk_doc_min_version... " >&6; } if $PKG_CONFIG --atleast-version $gtk_doc_min_version gtk-doc; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } have_gtk_doc=no fi fi if test "$have_gtk_doc" != yes; then enable_gtk_doc=no fi fi if test x$enable_gtk_doc = xyes; then ENABLE_GTK_DOC_TRUE= ENABLE_GTK_DOC_FALSE='#' else ENABLE_GTK_DOC_TRUE='#' ENABLE_GTK_DOC_FALSE= fi if test -n "$LIBTOOL"; then GTK_DOC_USE_LIBTOOL_TRUE= GTK_DOC_USE_LIBTOOL_FALSE='#' else GTK_DOC_USE_LIBTOOL_TRUE='#' GTK_DOC_USE_LIBTOOL_FALSE= fi case `$PKG_CONFIG --version` in 0.?|0.?.?|0.1[0-7]|0.1[0-7].?) PKGCONFIG_REQUIRES="Requires"; ;; *) PKGCONFIG_REQUIRES="Requires.private"; ;; esac MMX_CFLAGS="-mmmx -Winline --param inline-unit-growth=10000 --param large-function-growth=10000" have_mmx_intrinsics=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for MMX/SSE intrinsics in the compiler" >&5 $as_echo_n "checking for MMX/SSE intrinsics in the compiler... " >&6; } xserver_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $MMX_CFLAGS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined(__GNUC__) && (__GNUC__ < 3 || (__GNUC__ == 3 && __GNUC_MINOR__ < 4)) #error "Need GCC >= 3.4 for MMX intrinsics" #endif #include int main () { __m64 v = _mm_cvtsi32_si64 (1); __m64 w = _mm_slli_si64 (v, 1); v = _mm_or_si64 (v, w); return _mm_cvtsi64_si32 (v); } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_mmx_intrinsics=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CFLAGS=$xserver_save_CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_mmx_intrinsics" >&5 $as_echo "$have_mmx_intrinsics" >&6; } cairo_has_lcov=no # Check whether --enable-gcov was given. if test "${enable_gcov+set}" = set; then : enableval=$enable_gcov; use_gcov=$enableval else use_gcov=no fi if test "x$use_gcov" = "xyes"; then if test "$GCC" != "yes"; then as_fn_error $? "GCC is required for --enable-gcov" "$LINENO" 5 fi # Extract the first word of "shtool", so it can be a program name with args. set dummy shtool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_SHTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$SHTOOL"; then ac_cv_prog_SHTOOL="$SHTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_SHTOOL="shtool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi SHTOOL=$ac_cv_prog_SHTOOL if test -n "$SHTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SHTOOL" >&5 $as_echo "$SHTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi case `$SHTOOL path $CC` in *ccache*) gcc_ccache=yes;; *) gcc_ccache=no;; esac if test "$gcc_ccache" = "yes" && (test -z "$CCACHE_DISABLE" || test "$CCACHE_DISABLE" != "1"); then as_fn_error $? "ccache must be disabled when --enable-gcov option is used. You can disable ccache by setting environment variable CCACHE_DISABLE=1." "$LINENO" 5 fi ltp_version_list="1.4 1.5" # Extract the first word of "lcov", so it can be a program name with args. set dummy lcov; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LTP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LTP"; then ac_cv_prog_LTP="$LTP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LTP="lcov" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LTP=$ac_cv_prog_LTP if test -n "$LTP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP" >&5 $as_echo "$LTP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "genhtml", so it can be a program name with args. set dummy genhtml; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LTP_GENHTML+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LTP_GENHTML"; then ac_cv_prog_LTP_GENHTML="$LTP_GENHTML" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LTP_GENHTML="genhtml" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LTP_GENHTML=$ac_cv_prog_LTP_GENHTML if test -n "$LTP_GENHTML"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LTP_GENHTML" >&5 $as_echo "$LTP_GENHTML" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "$LTP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ltp version" >&5 $as_echo_n "checking for ltp version... " >&6; } if ${cairo_cv_ltp_version+:} false; then : $as_echo_n "(cached) " >&6 else cairo_cv_ltp_version=invalid ltp_version=`$LTP -v 2>/dev/null | $SED -e 's/^.* //'` for ltp_check_version in $ltp_version_list; do if test "$ltp_version" = "$ltp_check_version"; then cairo_cv_ltp_version="$ltp_check_version (ok)" fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cairo_cv_ltp_version" >&5 $as_echo "$cairo_cv_ltp_version" >&6; } fi case $cairo_cv_ltp_version in ""|invalid) ;; *) cairo_has_lcov=yes ;; esac if test "x$cairo_has_lcov" != "xyes"; then as_fn_error $? "To enable code coverage reporting you must have one of the following LTP versions installed: $ltp_version_list. Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again." "$LINENO" 5 fi if test -z "$LTP_GENHTML"; then as_fn_error $? "Could not find genhtml from the LTP package. Please install the Linux Test Project [http://ltp.sourceforge.net/], and try again." "$LINENO" 5 fi $as_echo "#define HAVE_GCOV 1" >>confdefs.h CFLAGS=`echo "$CFLAGS" | $SED -e 's/-O[0-9]*//g'` CAIRO_CFLAGS=`echo "$CAIRO_CFLAGS" | $SED -e 's/-O[0-9]*//g'` CAIRO_CFLAGS="$CAIRO_CFLAGS -O0 -fprofile-arcs -ftest-coverage" CAIRO_LDADD="$CAIRO_LDADD -lgcov" fi if test "x$cairo_has_lcov" = "xyes"; then CAIRO_HAS_LCOV_TRUE= CAIRO_HAS_LCOV_FALSE='#' else CAIRO_HAS_LCOV_TRUE='#' CAIRO_HAS_LCOV_FALSE= fi # Check whether --enable-test-surfaces was given. if test "${enable_test_surfaces+set}" = set; then : enableval=$enable_test_surfaces; use_test_surfaces=$enableval else use_test_surfaces=no fi if test "x$use_test_surfaces" = "xyes"; then CAIRO_HAS_TEST_SURFACES_TRUE= CAIRO_HAS_TEST_SURFACES_FALSE='#' else CAIRO_HAS_TEST_SURFACES_TRUE='#' CAIRO_HAS_TEST_SURFACES_FALSE= fi if test "x$use_test_surfaces" = "xyes"; then $as_echo "#define CAIRO_HAS_TEST_SURFACES 1" >>confdefs.h fi # Check whether --enable-some-floating-point was given. if test "${enable_some_floating_point+set}" = set; then : enableval=$enable_some_floating_point; if test "x$enableval" = "xno"; then # A value of 'no' for $enableval means that they want to disable, which # means 'yes' for $disable_some_floating_point. disable_some_floating_point=yes fi else disable_some_floating_point=no fi if test "x$disable_some_floating_point" = "xyes"; then DISABLE_SOME_FLOATING_POINT_TRUE= DISABLE_SOME_FLOATING_POINT_FALSE='#' else DISABLE_SOME_FLOATING_POINT_TRUE='#' DISABLE_SOME_FLOATING_POINT_FALSE= fi if test "x$disable_some_floating_point" = "xyes"; then $as_echo "#define DISABLE_SOME_FLOATING_POINT 1" >>confdefs.h fi ac_config_commands="$ac_config_commands src/cairo-features.h" ac_config_commands="$ac_config_commands src/cairo-no-features.h" ac_config_files="$ac_config_files Makefile src/Makefile src/cairo.pc" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_XLIB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XLIB_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_XLIB_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_XLIB_XRENDER_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XLIB_XRENDER_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_XLIB_XRENDER_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_XCB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_XCB_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_XCB_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_QUARTZ_SURFACE_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_QUARTZ_FONT_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_FONT_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_FONT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_QUARTZ_IMAGE_SURFACE_TRUE}" && test -z "${CAIRO_HAS_QUARTZ_IMAGE_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_QUARTZ_IMAGE_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${OS_WIN32_TRUE}" && test -z "${OS_WIN32_FALSE}"; then as_fn_error $? "conditional \"OS_WIN32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_WIN32_SURFACE_TRUE}" && test -z "${CAIRO_HAS_WIN32_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_WIN32_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_WIN32_FONT_TRUE}" && test -z "${CAIRO_HAS_WIN32_FONT_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_WIN32_FONT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_WIN32_PRINTING_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_OS2_SURFACE_TRUE}" && test -z "${CAIRO_HAS_OS2_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_OS2_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_BEOS_SURFACE_TRUE}" && test -z "${CAIRO_HAS_BEOS_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_BEOS_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_PNG_FUNCTIONS_TRUE}" && test -z "${CAIRO_HAS_PNG_FUNCTIONS_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_PNG_FUNCTIONS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_GLITZ_SURFACE_TRUE}" && test -z "${CAIRO_HAS_GLITZ_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_GLITZ_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_GLITZ_AGL_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_GLITZ_AGL_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_GLITZ_EGL_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_GLITZ_EGL_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_GLITZ_GLX_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_GLITZ_GLX_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_GLITZ_WGL_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_GLITZ_WGL_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_DIRECTFB_SURFACE_TRUE}" && test -z "${CAIRO_HAS_DIRECTFB_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_DIRECTFB_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_FT_FONT_TRUE}" && test -z "${CAIRO_HAS_FT_FONT_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_FT_FONT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PTHREAD_TRUE}" && test -z "${HAVE_PTHREAD_FALSE}"; then as_fn_error $? "conditional \"HAVE_PTHREAD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_PS_SURFACE_TRUE}" && test -z "${CAIRO_HAS_PS_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_PS_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_PS_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_PS_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_PS_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_PDF_SURFACE_TRUE}" && test -z "${CAIRO_HAS_PDF_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_PDF_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_PDF_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_PDF_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_PDF_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_MULTI_PAGE_SURFACES_TRUE}" && test -z "${CAIRO_HAS_MULTI_PAGE_SURFACES_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_MULTI_PAGE_SURFACES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_SVG_SURFACE_TRUE}" && test -z "${CAIRO_HAS_SVG_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_SVG_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_CAN_TEST_SVG_SURFACE_TRUE}" && test -z "${CAIRO_CAN_TEST_SVG_SURFACE_FALSE}"; then as_fn_error $? "conditional \"CAIRO_CAN_TEST_SVG_SURFACE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_LCOV_TRUE}" && test -z "${CAIRO_HAS_LCOV_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_LCOV\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${CAIRO_HAS_TEST_SURFACES_TRUE}" && test -z "${CAIRO_HAS_TEST_SURFACES_FALSE}"; then as_fn_error $? "conditional \"CAIRO_HAS_TEST_SURFACES\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${DISABLE_SOME_FLOATING_POINT_TRUE}" && test -z "${DISABLE_SOME_FLOATING_POINT_FALSE}"; then as_fn_error $? "conditional \"DISABLE_SOME_FLOATING_POINT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by cairo $as_me 1.6.4, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ cairo config.status 1.6.4 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' CAIRO_FEATURES='$CAIRO_FEATURES' CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' CAIRO_VERSION_MAJOR=$CAIRO_VERSION_MAJOR CAIRO_VERSION_MINOR=$CAIRO_VERSION_MINOR CAIRO_VERSION_MICRO=$CAIRO_VERSION_MICRO CAIRO_NO_FEATURES='$CAIRO_NO_FEATURES' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "src/cairo-features.h") CONFIG_COMMANDS="$CONFIG_COMMANDS src/cairo-features.h" ;; "src/cairo-no-features.h") CONFIG_COMMANDS="$CONFIG_COMMANDS src/cairo-no-features.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cairo.pc") CONFIG_FILES="$CONFIG_FILES src/cairo.pc" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="CXX " # ### BEGIN LIBTOOL CONFIG # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; "src/cairo-features.h":C) featuresfile=src/cairo-features.h outfile=$featuresfile.tmp { $as_echo "$as_me:${as_lineno-$LINENO}: creating $featuresfile" >&5 $as_echo "$as_me: creating $featuresfile" >&6;} cat > $outfile <<_EOF /* Generated by configure. Do not edit */ #ifndef CAIRO_FEATURES_H #define CAIRO_FEATURES_H #ifdef __cplusplus # define CAIRO_BEGIN_DECLS extern "C" { # define CAIRO_END_DECLS } #else # define CAIRO_BEGIN_DECLS # define CAIRO_END_DECLS #endif #ifndef cairo_public # define cairo_public #endif #define CAIRO_VERSION_MAJOR $CAIRO_VERSION_MAJOR #define CAIRO_VERSION_MINOR $CAIRO_VERSION_MINOR #define CAIRO_VERSION_MICRO $CAIRO_VERSION_MICRO #define CAIRO_VERSION_STRING "$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" _EOF for FEATURE in $CAIRO_FEATURES; do echo "#define CAIRO_HAS_$FEATURE 1" >> $outfile done echo '' >> $outfile for FEATURE in $CAIRO_NO_FEATURES; do echo "/*#undef CAIRO_HAS_$FEATURE */" >> $outfile done echo '' >> $outfile echo '#endif' >> $outfile if cmp -s $outfile $featuresfile; then { $as_echo "$as_me:${as_lineno-$LINENO}: $featuresfile is unchanged" >&5 $as_echo "$as_me: $featuresfile is unchanged" >&6;} rm -f $outfile else mv $outfile $featuresfile fi ;; "src/cairo-no-features.h":C) nofeaturesfile=src/cairo-no-features.h outfile=$nofeaturesfile.tmp { $as_echo "$as_me:${as_lineno-$LINENO}: creating $nofeaturesfile" >&5 $as_echo "$as_me: creating $nofeaturesfile" >&6;} cat > $outfile <<_EOF /* Generated by configure. Do not edit */ #ifndef CAIRO_NO_FEATURES_H #define CAIRO_NO_FEATURES_H #include /* This is a dummy header, to trick gtk-doc only */ _EOF for FEATURE in $CAIRO_NO_FEATURES; do echo "#define CAIRO_HAS_$FEATURE 1" >> $outfile done echo '' >> $outfile echo '#endif' >> $outfile if cmp -s $outfile $nofeaturesfile; then { $as_echo "$as_me:${as_lineno-$LINENO}: $nofeaturesfile is unchanged" >&5 $as_echo "$as_me: $nofeaturesfile is unchanged" >&6;} rm -f $outfile else mv $outfile $nofeaturesfile fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi V="$CAIRO_VERSION_MAJOR.$CAIRO_VERSION_MINOR.$CAIRO_VERSION_MICRO" echo "" echo "cairo (version $V) will be compiled with the following surface backends:" echo " image: yes (always builtin)" echo " Xlib: $use_xlib" echo " Xlib Xrender: $use_xlib_xrender" echo " Quartz: $use_quartz" echo " Quartz-image: $use_quartz_image" echo " XCB: $use_xcb" echo " Win32: $use_win32" echo " OS2: $use_os2" echo " PostScript: $use_ps" echo " PDF: $use_pdf" echo " SVG: $use_svg" echo " glitz: $use_glitz" echo " BeOS: $use_beos" echo " DirectFB: $use_directfb" echo "" echo "the following font backends:" echo " FreeType: $use_ft" echo " Win32: $use_win32_font" echo " Quartz: $use_quartz_font" echo "" echo "the following features:" echo " PNG functions: $use_png" echo "" echo "and the following debug options:" echo " gcov support: $use_gcov" echo " test surfaces: $use_test_surfaces" echo " ps testing: $test_ps" echo " pdf testing: $test_pdf" echo " svg testing: $test_svg" if test x"$use_win32" = "xyes"; then echo " win32 printing testing: $test_win32_printing" fi echo "" echo "using CFLAGS:" echo $CAIRO_CFLAGS echo "" if test x"$use_ft" != "xyes" && \ test x"$use_win32_font" != "xyes" && \ test x"$use_quartz_font" != "xyes" ; then as_fn_error $? "Cairo requires at least one font backend. Please install freetype and fontconfig, then try again: http://freetype.org/ http://fontconfig.org/ " "$LINENO" 5 fi WARNING_MESSAGE=' *** The @BACKEND@ backend is still under active development and *** is included in this release only as a preview. It does not *** fully work yet and incompatible changes may yet be made *** to @BACKEND@-backend specific API. ' if test x"$use_glitz" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/Glitz/' fi if test x"$use_xcb" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/XCB/' fi if test x"$use_quartz_image" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/Quartz Image/' fi if test x"$use_os2" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's,@BACKEND@,OS/2,' fi if test x"$use_beos" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/BeOS/' fi if test x"$use_directfb" = "xyes" ; then echo "$WARNING_MESSAGE" | sed 's/@BACKEND@/DirectFB/' fi libgdiplus-2.11/cairo/ChangeLog.pre-1.40000664000175000017500000170714712225470635014501 00000000000000commit 5dfa8c23f13f5cafac5cf56f34888a6e01dc79ba Author: Carl Worth Date: Tue Mar 6 01:25:17 2007 -0800 NEWS: Note the x86 nature of the quoted performance results And mention that embedded systems often did even better. NEWS | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) commit d7df4d4d4c52c0934bec0c8edad96bb2ea82dc04 Author: Carl Worth Date: Tue Mar 6 01:20:45 2007 -0800 Increment cairo version to 1.4.0 configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit d0d2c4030741619accd1eb554531bb6a97dd7ae4 Author: Carl Worth Date: Tue Mar 6 01:20:03 2007 -0800 Clarify that extra elements in cairo_path_data is only available in cairo >= 1.4 src/cairo.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 0578929fa4add0cf366e200a5bd6b9f2dfcd0b79 Author: Carl Worth Date: Tue Mar 6 01:09:02 2007 -0800 NEWS: Add release notes for 1.4.0 release NEWS | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 250 insertions(+), 1 deletions(-) commit 66d1dc8b9c3d7c1e26321bdb621ef55779c2fd6d Author: Carl Worth Date: Mon Mar 5 23:55:05 2007 -0800 Update AUTHORS with 47 (!) new authors since 1.0 AUTHORS | 52 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 47 insertions(+), 5 deletions(-) commit 2f4ddc85a50641a7f6e1f467fa94610875f8ed02 Author: Carl Worth Date: Mon Mar 5 22:48:27 2007 -0800 Mark 5 tests that are currently failing as XFAIL (that is, not to be fixed before 1.4) The 5 additional bugs that will be shipped with 1.4 are ft-text-vertical-layout-type1 radial-gradient surface-pattern surface-pattern-scale-down surface-pattern-scale-up Most of these are non-issues, (unbundled font for ft-text-vertical-layout-type1), or very minor issues (radial-gradient and surface-pattern). The only things in here that look like a real bug are the surface-pattern-scale-down and surface-pattern-scale-up tests where the xlib backend results have some non-1.0 alpha that is very unexpected. test/Makefile.am | 5 +++++ test/radial-gradient.c | 3 ++- test/surface-pattern-scale-down.c | 3 ++- test/surface-pattern-scale-up.c | 3 ++- test/surface-pattern.c | 3 ++- 5 files changed, 13 insertions(+), 4 deletions(-) commit aa883123d2af905c846a8c0a67ff63fa6b16cd2b Author: Carl Worth Date: Mon Mar 5 16:48:05 2007 -0800 Optimize filling of a path that is a single device-axis-aligned rectangle. It turns out that this case is extremely common and worth avoiding the overhead of the path iteration and tessellation code. The optimization here works only for device-axis-aligned rectangles It should be possible to generalize this to catch more cases, (such as any convex quadrilateral with 4 or fewer points). This fix results in a 1.4-1.8x speedup for the rectangles perf case: image-rgb rectangles-512 7.80 1.22% -> 4.35 1.62%: 1.79x speedup ▊ image-rgba rectangles-512 7.71 4.77% -> 4.37 0.30%: 1.77x speedup ▊ xlib-rgba rectangles-512 8.78 5.02% -> 5.58 5.54%: 1.57x speedup ▋ xlib-rgb rectangles-512 11.87 2.71% -> 8.75 0.08%: 1.36x speedup ■Which conveniently overcomes the ~ 1.3x slowdown we had been seeing for this case since 1.2. Now, compared to 1.2.6 we see only a speedup: image-rgba rectangles-512 6.19 0.29% -> 4.37 0.30%: 1.42x speedup ▎ image-rgb rectangles-512 6.12 1.68% -> 4.35 1.62%: 1.41x speedup ▎ xlib-rgba rectangles-512 7.48 1.07% -> 5.58 5.54%: 1.34x speedup ■xlib-rgb rectangles-512 10.35 1.03% -> 8.75 0.08%: 1.18x speedup ■src/cairo-path-fill.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 93 insertions(+), 0 deletions(-) commit e15bb8efe62a4d2ffd1df31b092ca1fdd2743e43 Author: Brian Ewins Date: Tue Mar 6 00:40:56 2007 +0000 [quartz] remove unnecessary flushes Removing calls to CGContextFlush; these were slowing down the mac and on other platforms it is up to the client to flush the surface. src/cairo-quartz-surface.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) commit 393908c34dbf2484b811b84581984563a7115e38 Author: Behdad Esfahbod Date: Mon Mar 5 19:22:41 2007 -0500 [test] Modify extend-reflect to need a smaller reference image test/extend-reflect-ref.png | Bin 589279 -> 153571 bytes test/extend-reflect.c | 17 ++++++----------- 2 files changed, 6 insertions(+), 11 deletions(-) commit 4716ed760c1cc8095587af130964fbc3432ed14d Author: Behdad Esfahbod Date: Mon Mar 5 19:15:35 2007 -0500 [test] Remove some ref images from random-intersections Each one is larger than 100kb, so paint background black to reuse same ref image for rgb24 and argb32 cases. Also remove Quartz ref images for now. test/Makefile.am | 3 --- test/random-intersections-ps-argb32-ref.png | Bin 107578 -> 89416 bytes test/random-intersections-quartz-ref.png | Bin 203877 -> 0 bytes test/random-intersections-quartz-rgb24-ref.png | Bin 179204 -> 0 bytes test/random-intersections-ref.png | Bin 177153 -> 132210 bytes test/random-intersections-rgb24-ref.png | Bin 132210 -> 0 bytes test/random-intersections.c | 4 ++++ 7 files changed, 4 insertions(+), 3 deletions(-) commit feba319413bde73f8c1454fc0f3a1b3af03dfde4 Author: Behdad Esfahbod Date: Mon Mar 5 19:02:59 2007 -0500 [test] Remove unused variable test/clip-operator.c | 2 -- test/operator-clear.c | 2 -- test/operator-source.c | 2 -- 3 files changed, 0 insertions(+), 6 deletions(-) commit e1a598211b1944bad6b32148da052208d9b58093 Author: Emmanuel Pacaud Date: Mon Mar 5 16:03:40 2007 -0800 Use the offset attribute to improve cairo-svg handling of EXTEND_REPEAT and EXTEND_REFLECT With this change, the cairo-svg output is perfectly fine with CAIRO_EXTEND_REPEAT, but is still very slightly wrong with CAIRO_EXTEND_REFLECT, (though *much* better than it was before this fix). src/cairo-svg-surface.c | 30 +++++++++++++++++++++++------- 1 files changed, 23 insertions(+), 7 deletions(-) commit 47f2bf4e28b80102f10505916be2bf4c01ce9354 Author: Emmanuel Pacaud Date: Mon Mar 5 15:57:28 2007 -0800 Remove broken special-casing of radial gradient fx,fy under CAIRO_EXTEND_NONE Carl can't explain why he added this special-case, and removing it eliminates one failure case from the radial-gradient test matrix. src/cairo-svg-surface.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-) commit a724f816e17bfe3d9abefb1f6dcfe30480a0d143 Author: Brian Ewins Date: Mon Mar 5 23:19:24 2007 +0000 [quartz,atsui] separate the quartz surface and atsui font backend Make it possible to use the --enable-quartz and --enable-atsui independently. Quartz on its own will use the ft font backend. configure.in | 17 +++++++---------- src/cairo-atsui-font.c | 12 ++++++------ src/cairo-quartz-private.h | 8 +++++--- src/cairo-quartz-surface.c | 8 +++++++- 4 files changed, 25 insertions(+), 20 deletions(-) commit 83fcce0e93071cffe20377ab3fe6281204b2f80d Author: Behdad Esfahbod Date: Mon Mar 5 17:56:57 2007 -0500 [quartz] Make utility functions static src/cairo-quartz-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit d25548d679b8a7fce12c9a55e728539e408c75a1 Author: Behdad Esfahbod Date: Mon Mar 5 17:11:39 2007 -0500 In cairo_append_path(), allow excess path_data elements src/cairo-path.c | 8 ++++---- src/cairo.h | 11 +++++++++-- 2 files changed, 13 insertions(+), 6 deletions(-) commit 3ab9ca54aa490438dbbfae7b5f1cde0bd98352cd Author: Behdad Esfahbod Date: Mon Mar 5 16:33:46 2007 -0500 In cairo_text_path(), bail out if zero glyphs src/cairo.c | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) commit 4f138e4af56da60a83fd187f87cde19544ba3ab1 Author: Behdad Esfahbod Date: Mon Mar 5 16:28:31 2007 -0500 Uniform object handling in _reference(), _destroy(), and _get_reference_count() All three now regard NULL and nil inputs the same. This is new for _get_reference_count(). It now returns 0 on NULL too, like it does on nil objects. src/cairo-font.c | 12 +++--------- src/cairo-pattern.c | 12 +++--------- src/cairo-scaled-font.c | 12 +++--------- src/cairo-surface.c | 12 +++--------- src/cairo.c | 12 +++--------- 5 files changed, 15 insertions(+), 45 deletions(-) commit cc12c5acc41f452edff3f4ad8fafe1aebf1810aa Author: Behdad Esfahbod Date: Mon Mar 5 16:19:28 2007 -0500 Make cairo_text_path() set current point correctly This fixes the bitmap-text test that I just made reveal a bug. src/cairo.c | 38 +++++++++++++++++++++++++++++++++----- 1 files changed, 33 insertions(+), 5 deletions(-) commit b63f5ae58f6617b9a2c9f3434bc1c9f3c72612ac Author: Behdad Esfahbod Date: Mon Mar 5 16:15:09 2007 -0500 [test] In the bitmap-font test, break cairo_text_path() call into two such that it checks current-point handling after that call. It fails now, because cairo_text_path does not set current-point explicitly. test/bitmap-font.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit a487d094212d6bc4a06d5bfc774ba6d575165aa5 Author: Behdad Esfahbod Date: Mon Mar 5 15:59:43 2007 -0500 Rename all mutex variables to start with an underscore since they are not static in some of the implementations (win32, ...) src/cairo-beos-surface.cpp | 12 ++++++------ src/cairo-font.c | 24 ++++++++++++------------ src/cairo-ft-font.c | 12 ++++++------ src/cairo-os2-surface.c | 30 +++++++++++++++--------------- src/cairo-scaled-font.c | 12 ++++++------ src/cairo-win32-surface.c | 18 +++++++++--------- src/cairoint.h | 2 +- 7 files changed, 55 insertions(+), 55 deletions(-) commit c8b84a4735c46a33620260de0618296df1e12574 Author: Behdad Esfahbod Date: Mon Mar 5 15:46:19 2007 -0500 [beos] Update mutex initializers This should be the last one. We are going to move to a central mutex initialization scheme right after 1.4.0 is out. src/cairo-beos-surface.cpp | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit b8e2888fbed2aefa368d9bab4010c1e807d6389f Author: Behdad Esfahbod Date: Mon Mar 5 15:45:45 2007 -0500 [OS2] Add mutex initializer for cairo_font_face_mutex src/cairo-os2-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 403b4b7c163e78446035ec5144ad9e3674577d5d Author: Behdad Esfahbod Date: Mon Mar 5 15:39:09 2007 -0500 [OS2] Remove unused mutex cairo_toy_font_face_hash_table_mutex src/cairo-os2-surface.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) commit 6358ec539df67ec7725b0687c16f2175386f1b0b Author: Behdad Esfahbod Date: Mon Mar 5 15:38:52 2007 -0500 [WIN32] Make cairo_ft_unscaled_font_map_mutex initialization conditional of ft src/cairo-win32-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 972f7d9fc8d40fb5c698e1a94fba4f28600b215d Author: Behdad Esfahbod Date: Mon Mar 5 15:36:51 2007 -0500 [WIN32] Remove unused mutex cairo_toy_font_face_hash_table_mutex src/cairo-win32-surface.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) commit 0cdb96544eda163de050c65f7e7cd413b21f61cc Author: Behdad Esfahbod Date: Mon Mar 5 15:10:35 2007 -0500 [SVG] Cast -1 values to unsigned to indicate we really did mean to type them src/cairo-svg-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bbc341614455b22210c818eca01cf4618989565c Author: Behdad Esfahbod Date: Mon Mar 5 14:51:25 2007 -0500 [ROADMAP] Remove 1.3.14 items, add 1.4.2 ones ROADMAP | 20 +++++++++++++------- 1 files changed, 13 insertions(+), 7 deletions(-) commit d6ac9b47704d671c192da509571b3721756c1347 Author: Dave Yeo Date: Mon Mar 5 13:36:32 2007 -0500 [test] Fix build on Win32 test/Makefile.am | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit ffa86b17abbaa2190a4d7eadcc555aac6770bd6c Author: Mathias Hasselmann Date: Sun Mar 4 16:39:00 2007 -0500 [test/pdiff] Fix build problem with certain flavors of make test/pdiff/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 325e75239098e640ed05ade39ec2b9f74ae30d3d Author: Hans Breuer Date: Sat Mar 3 22:50:16 2007 -0800 Fix mutex initialization for win32 (missing cairo_font_face_mutex) We've currently got a problem where it's easy to add a mutex for a POSIX system and easy to forget to add its intialization for other systems. Behdad has cooked up a plan for fixing this properly: http://lists.freedesktop.org/archives/cairo/2007-February/009679.html In the meantime, we'll just kkeping breaking things, and patches like this will be needed to fix up our mistakes. This fix closes the following bug report: cairo_font_face_mutex missing from cairo-win32-surface.c https://bugs.freedesktop.org/show_bug.cgi?id=10175 src/cairo-win32-surface.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 5f2b5f1f92d74fbc2d8f97fb547e160e370d4c40 Author: Brian Ewins Date: Sun Mar 4 03:01:22 2007 +0000 [configure.in] --enable-quartz should require atsui and no xlib Recent changes have made quartz and atsui interdependent. It is also no longer possible to build quartz with xlib enabled due to a redefinition of the 'Picture' symbol. This change makes '--enable-atsui' unnecessary and refuses to switch on quartz when it cannot be built because xlib is enabled. configure.in | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) commit 1720d0b9508b70ac0c5f2436c3b80a2ab801f138 Author: Behdad Esfahbod Date: Sat Mar 3 15:42:09 2007 -0500 [Makefile.am] --enable-test-surfaces in distcheck Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 79acd268d9ac91f0e9f03467b220241cda3457a5 Author: Behdad Esfahbod Date: Sat Mar 3 15:41:32 2007 -0500 [Makefile.am] Remove releasing instructions that are in RELEASING already Makefile.am | 15 ++------------- 1 files changed, 2 insertions(+), 13 deletions(-) commit f9f71457a5d1e002f7f6b08232892ba61fef8ead Author: Behdad Esfahbod Date: Sat Mar 3 15:37:45 2007 -0500 [RELEASING] Update announcement mail instructions RELEASING | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit 454c6a62a93d4d9e933a4e401997a16f1b0a569b Author: Behdad Esfahbod Date: Sat Mar 3 15:35:25 2007 -0500 [RELEASING] Note that two versions should be added to bugzilla RELEASING | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 57e1b6fa98d688b72dd3617e8313ea35f8ce78e1 Author: Behdad Esfahbod Date: Sat Mar 3 15:34:19 2007 -0500 [RELEASING] Reorder pushing tag and commits We should push the tag only after pushing the actually release commit. RELEASING | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 052acc95e9c354981eea0968c5727e4a0568a959 Author: Behdad Esfahbod Date: Sat Mar 3 15:32:42 2007 -0500 [RELEASING] Fix git-tag invocation Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9f0a1648b7886714e5c742119083414fcc92dc82 Author: Behdad Esfahbod Date: Sat Mar 3 00:22:53 2007 -0500 [configure.in] Increase version to 1.3.17 post-release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b3e1fd8c1cbfc4db88bec4bb52821ed9380dbb4f Author: Behdad Esfahbod Date: Sat Mar 3 00:07:34 2007 -0500 [configure.in] Increase version to 1.3.16 in preparation for release configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit c6541b9ac23bcd88202049960ee5a7503a4f0449 Author: Behdad Esfahbod Date: Sat Mar 3 00:07:03 2007 -0500 [RELEASING] Add note about ChangeLog sanity RELEASING | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 9aecd7c815b81b61ff408d51bdf8e1c6663a3954 Author: Behdad Esfahbod Date: Sat Mar 3 00:05:40 2007 -0500 [test] Include romedalen.png in dist, oops test/Makefile.am | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit 2f497c25f98cdb4be60b7391a672280ae09f1d67 Author: Behdad Esfahbod Date: Fri Mar 2 23:59:55 2007 -0500 [Makefile.am] Check for ChangeLog sanity in release-publish Makefile.am | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit eb8214c9602319d716b8cd39a1c5dd1dd278b96e Author: Behdad Esfahbod Date: Fri Mar 2 23:49:27 2007 -0500 [ChangeLog.mk] Adapt to latest git-describe output format ChangeLog.mk | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) commit 8a69a327952173a714dfbe1e8967ebb7bdbbacbd Author: Behdad Esfahbod Date: Fri Mar 2 23:21:39 2007 -0500 [test] Update list of refrerence images test/Makefile.am | 392 ++++++++++++++++++++++++++++++------------------------ 1 files changed, 216 insertions(+), 176 deletions(-) commit 55d480612754dca652b5324d815e0429c745fec3 Author: Behdad Esfahbod Date: Fri Mar 2 22:52:38 2007 -0500 [NEWS] Add note about documentation improvements NEWS | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 77b27fd06b9f0e7ff5dedd4b41327e456d33e3cf Author: Behdad Esfahbod Date: Fri Mar 2 22:45:50 2007 -0500 [doc] Update templates doc/public/tmpl/cairo-font.sgml | 33 +++++++++----- doc/public/tmpl/cairo-pattern.sgml | 37 +++++++++++++++- doc/public/tmpl/cairo-scaled-font.sgml | 31 +++++++++++++ doc/public/tmpl/cairo-surface.sgml | 74 +++++++++++++++++-------------- doc/public/tmpl/cairo-text.sgml | 33 +++++++++----- doc/public/tmpl/cairo.sgml | 40 +++++++++++++++++ 6 files changed, 188 insertions(+), 60 deletions(-) commit 1082fed6929a696455f27821819c6af4f575156d Author: Behdad Esfahbod Date: Fri Mar 2 22:42:17 2007 -0500 [doc] Docuemnt all symbols but cairo_filter_t and cairo_operator_t Lets see if this is enough to push Carl Worth document those two. src/cairo-font.c | 5 ++- src/cairo-pattern.c | 3 ++ src/cairo-scaled-font.c | 3 ++ src/cairo-surface.c | 3 ++ src/cairo.c | 3 ++ src/cairo.h | 74 +++++++++++++++++++++++++++++++++++++++++++++- 6 files changed, 88 insertions(+), 3 deletions(-) commit e37b6ca3e2c55256debf1fdfde83934fa9b28c1d Author: Behdad Esfahbod Date: Fri Mar 2 22:03:27 2007 -0500 Beautify cairo.h src/cairo.h | 42 +++++++++++++++++++++--------------------- 1 files changed, 21 insertions(+), 21 deletions(-) commit 9be961eb0c8c85b04287a5b85f7fd72dac160949 Author: Behdad Esfahbod Date: Fri Mar 2 22:01:15 2007 -0500 [doc] Some documentation love src/cairo-font.c | 2 +- src/cairo-pattern.c | 19 +++++++++++ src/cairo-surface.c | 6 ++- src/cairo-win32-font.c | 24 +++++++++++++- src/cairo-win32-surface.c | 1 + src/cairo.c | 76 ++++++++++++++++++++++++++++++++++++++++----- src/cairo.h | 40 +++++++++++++++++++++++- 7 files changed, 154 insertions(+), 14 deletions(-) commit 8a6308e1448f402bd4f32b18ba2c60a4bcdbbe6f Author: Behdad Esfahbod Date: Fri Mar 2 22:00:25 2007 -0500 [doc] Update list of header files to ignore doc/public/Headers.mk | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit fed13e77e1de071ddaaf829aced10b02f6bc8c90 Author: Behdad Esfahbod Date: Fri Mar 2 16:49:47 2007 -0500 [NEWS] Fix typos NEWS | 14 ++++++-------- 1 files changed, 6 insertions(+), 8 deletions(-) commit ab1887f4b08784789f39396b3012dffede845466 Author: Vladimir Vukicevic Date: Fri Mar 2 13:30:31 2007 -0800 [quartz] Bug 3939 - Fix Quartz backend endianness problem Add kCGBitmapByteOrder32Host to CGImageCreate call in release_dest_image of Quartz surface. src/cairo-quartz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2640aa7e99453f17e9a2cb9084e0760d767cfeab Author: Carl Worth Date: Fri Mar 2 13:18:11 2007 -0800 Add notes for 1.3.16 Now, maybe we won't actually make a 1.3.16 snapshot, but these are all the things that will be new in 1.4.0 compared to 1.3.14. NEWS | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 139 insertions(+), 0 deletions(-) commit a0bc2ada784f24ca784617ac18b470745e8152c0 Author: Behdad Esfahbod Date: Fri Mar 2 15:45:02 2007 -0500 [test] Support passing extra valgrind flags using EXTRA_VALGRIND_FLAGS make variable or CAIRO_EXTRA_VALGRIND_FLAGS env variable. test/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit cd43c03d162efc87a1845c7ffbadfab00ac23d1f Author: Carl Worth Date: Fri Mar 2 12:30:53 2007 -0800 Fix leak of an output stream in cairo_type1_font_destroy src/cairo-type1-fallback.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 8c579ef8354720c06db702db1e6e2aaab0efed82 Author: Carl Worth Date: Fri Mar 2 12:30:14 2007 -0800 More tightening of test cleanup to avoid valgrind complaints. test/cairo-test.c | 8 ++++---- test/fallback-resolution.c | 2 ++ test/font-face-get-type.c | 2 ++ test/pdf-features.c | 9 +-------- test/ps-features.c | 9 +-------- test/pthread-show-text.c | 8 +------- 6 files changed, 11 insertions(+), 27 deletions(-) commit 9854d01a8d3a1f9f6148dfd6e22623c4586aaa96 Author: Carl Worth Date: Fri Mar 2 11:32:47 2007 -0800 Fix leak in pattern-getters test (missing cairo_pattern_destroy) test/pattern-getters.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b52dda62fea0745cc28d6149dc4688ade524b4df Author: Carl Worth Date: Fri Mar 2 11:31:13 2007 -0800 Augment cairo_test_init with cairo_test_fini to avoid leak Without this, any tests that were using cairo_test_init rather than cairo_test would end up leaking a FILE* for the log file. So this keeps valgrind much more happy with the test suite. test/cairo-test.c | 8 +++++++- test/cairo-test.h | 14 +++++++++----- test/copy-path.c | 2 ++ test/create-for-stream.c | 2 ++ test/in-fill-empty-trapezoid.c | 2 ++ test/multi-page.c | 2 ++ test/pattern-get-type.c | 2 ++ test/svg-clip.c | 2 ++ test/svg-surface.c | 2 ++ test/truetype-tables.c | 2 ++ test/xlib-surface.c | 32 +++++++++++++------------------- 11 files changed, 45 insertions(+), 25 deletions(-) commit 7d6e21c7e298e1795f36fdf021d61ef4ed0ca0fa Author: Carl Worth Date: Fri Mar 2 11:29:40 2007 -0800 Add even more XrmGetFileDatabase leaks to the valgrind suppressions file test/.valgrind-suppressions | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+), 0 deletions(-) commit e054314e5ec1f3fbdc97ed2175dd3d26d7581a5f Author: Carl Worth Date: Fri Mar 2 09:34:46 2007 -0800 Add a couple of missing test cases to .gitignore test/.gitignore | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 02f2ece88dbceaf2466bd61410dd8e88a4c95e08 Author: Carl Worth Date: Fri Mar 2 09:32:14 2007 -0800 Fix leak in pdiff lpyramid This was a leak in the test suite only, (and then only when tests failed). test/pdiff/lpyramid.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6da7f140334835be9a972db75de78d99b8bd24b1 Author: Carl Worth Date: Fri Mar 2 03:49:11 2007 -0800 Fix INVALID_RESTORE case to avoid crashes Previously, an INVALID_RESTORE error would leave cr->gstate as NULL, (which is generally impossible/invalid). This seems safe enough as most cairo functions check cr->status first and bail if anything looks fishy. However, the many cairo_get functions happily march along in spite of any current error. We could instrument all of those functions to check for the error status and return some dummy value in that case. But it's much easier to get the same basic effect by simply creating a non-NULL cr->gstate which will hold all those dummy values, and we can eliminate the crashes without having to touch up every cairo_get function. This fixes the bug reported here: evolution crash to _cairo_gstate_backend_to_user() https://bugs.freedesktop.org/show_bug.cgi?id=9906 It also eliminates the crash that was added to the nil-surface test with the previous commit. src/cairo.c | 10 +++++++++- 1 files changed, 9 insertions(+), 1 deletions(-) commit 36590fd4702cc24acacd20e4394c902e44be46c6 Author: Carl Worth Date: Fri Mar 2 03:43:46 2007 -0800 Add test of cairo_get_* after INVALID_RESTORE to nil-surface This new test demonstrates a crash condition as reported here: evolution crash to _cairo_gstate_backend_to_user() https://bugs.freedesktop.org/show_bug.cgi?id=9906 test/nil-surface.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) commit 712447856dc5cf559fcdbceaf902a39fd5eddef9 Author: Carl Worth Date: Fri Mar 2 03:15:35 2007 -0800 Fix yet another backend (quartz) for the gradient renaming So it looks like it took us three commits before we finally got all of the users of inner/outer switched to c1/c2. Hopefully someday we'll have the compiler passing over all of cairo's source code even if the backends aren't available to be run on a particular system. src/cairo-quartz-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 4e0f0d9425e2677e75681b2416e7ee4c4e87440c Author: Carl Worth Date: Fri Mar 2 03:11:10 2007 -0800 Don't crash if backend->create_similar returns a nil surface This fixes the bug reported here: cairo crashes in cairo_create_simular if nil surface returned by other->backend->create_similar https://bugs.freedesktop.org/show_bug.cgi?id=9844 src/cairo-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit b0c086fce45a72ea3bf0052641de63bf08e5e5d5 Author: Carl Worth Date: Fri Mar 2 02:51:53 2007 -0800 Update documentation for cairo_get_scaled_font and cairo_get_font_face There was some leftover cut-and-paste description of get_font_face in the documentation for get_scaled_font. That turned out to be a good thing as it alerted me to the fact that the get_font_face documentation was stale as well. Add description of the 'nil' object return values, rather than NULL. src/cairo.c | 32 +++++++++++++++++++++++--------- 1 files changed, 23 insertions(+), 9 deletions(-) commit 5f386bb15a234983090beb4f85dfee200dac1b4b Author: Jeff Muizelaar Date: Wed Feb 28 13:37:21 2007 -0500 Use a closed interval when eliminating outliers from performance measurements When choosing the samples that are not outliers we use a half-open interval (outlier_min <= x < outlier_max). This causes all of the samples to be discarded when the interquartile range is 0 because none of them are less than outlier_max. Fix the problem and make the test more consistent by using a closed interval (outliner_min <= x <= outlier_max). perf/cairo-stats.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d48f31370172cddb85ae17a12faed2abf651ee83 Author: Jinghua Luo Date: Fri Mar 2 18:37:06 2007 +0800 glitz: fix build error. Rename radial gradient inner/outer to c1/c2. src/cairo-glitz-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit c12a4571affe9fdd2bb4620c448aded43584bb54 Author: Carl Worth Date: Fri Mar 2 00:37:21 2007 -0800 Cast -1 values to unsigned to quiet the compiler. Marking the magic values to indicate we really did mean to type them. src/cairo-pattern.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 3685a66b5b9cb0af10b44985dc1e9ef1c82ad77b Author: Carl Worth Date: Fri Mar 2 00:22:57 2007 -0800 Cast away a const to quiet a compiler warning. src/cairo-ps-surface.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit d48bb4fbe876a93199ba48fcf5f32734fbe18ba9 Author: Carl Worth Date: Thu Mar 1 23:34:34 2007 -0800 Implement CAIRO_MUTEX_INIT with memcpy instead of pthread_mutex_init The trick here is that with the weak symbol support for pthreads, pthread_mutex_init can be a NOP leaving the mutex uninitialized. Then, if some pthread-using library is dynamically loaded, the non-NOP pthread functions get used and we end up trying to lock an uninitialized mutex. This should fix the bugs reported here: Cairo 1.3.14 deadlocks in cairo_scaled_font_glyph_extents or _cairo_ft_unscaled_font_lock_face https://bugs.freedesktop.org/show_bug.cgi?id=10035 src/cairoint.h | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit df2d42ac7fb71997abd406fb5716c0bd85037c04 Merge: ec11ca3... 97dbbae... Author: Carl Worth Date: Thu Mar 1 17:08:03 2007 -0800 Merge branch 'radial-gradient-fixes' into cairo commit ec11ca33a7ebcc752218e63c57f861de6e23a86a Author: Behdad Esfahbod Date: Thu Mar 1 19:14:40 2007 -0500 [PS/PDF] Mark CAIRO_EXTEND_PAD for surface patterns as natively supported since the image surface does not implement that case either, so image fallbacks have no benefit. src/cairo-pdf-surface.c | 12 +++++++----- src/cairo-ps-surface.c | 12 +++++++----- 2 files changed, 14 insertions(+), 10 deletions(-) commit 4ee6cda6e5e69361d3ca247322c92d0ae30e0458 Author: Behdad Esfahbod Date: Thu Mar 1 19:13:19 2007 -0500 [test] Move .la dependencies around test/Makefile.am | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit ff06ea1abf2dcfe28a4c1f192782bc85aebfdd92 Author: Behdad Esfahbod Date: Thu Mar 1 19:12:58 2007 -0500 [boilerplate] Add correct dependency on libcairo.la boilerplate/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 4b1f450f4cf056b4cc28502dcf72eaf54f257c3a Author: Behdad Esfahbod Date: Thu Mar 1 18:36:27 2007 -0500 [test] Add more valgrind suppressions test/.valgrind-suppressions | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) commit dcdcb7ac2acf39c54da855b6a2af4d02a7165a24 Author: Behdad Esfahbod Date: Thu Mar 1 18:36:16 2007 -0500 Fix leak in rectilinear stroking code The code was not cleaning up after itself when rejecting a path as rectilinear. src/cairo-path-stroke.c | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) commit 2acd5b52774e2324df3e6b5b07a0d2790df3a60b Author: Behdad Esfahbod Date: Thu Mar 1 18:34:53 2007 -0500 [test] Add leak-revealing path to rectilinear-stroke Based on this thread: http://lists.freedesktop.org/archives/cairo/2007-March/009860.html test/rectilinear-stroke.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 97dbbae62182c2e40f5f98278e08c92e14b92731 Author: Carl Worth Date: Thu Mar 1 15:17:19 2007 -0800 SVG: Support CAIRO_EXTEND_NONE for radial gradients. This is as simple as adding transparent color stops on either end. src/cairo-svg-surface.c | 31 +++++++++++++++++++++++++++---- 1 files changed, 27 insertions(+), 4 deletions(-) commit bd2cd2c868864d5ec2a2c2e4bf16ff406be8afe2 Author: Behdad Esfahbod Date: Thu Mar 1 18:14:33 2007 -0500 [test] Plug a leak in the test suite test/buffer-diff.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 7de96a1faabfc2aa84dac38f5b63c2ba3538bb3c Author: Behdad Esfahbod Date: Thu Mar 1 18:00:23 2007 -0500 [xlib] Drop XrmFinalize() stuff. That didn't ever exist in any public X server configure.in | 4 ---- src/cairo-xlib-screen.c | 5 ----- 2 files changed, 0 insertions(+), 9 deletions(-) commit fe68e8aa32cc5a9f4d9f9302644ca66d8b691d65 Author: Carl Worth Date: Wed Feb 28 00:41:47 2007 -0800 Fix gradient walker to not reset needlessly Previously the gradient walker was doing excessive resets, (such as on every pixel in constant-colored regions or outside the gradient with CAIRO_EXTEND_NONE). Don't do that. pixman/src/fbcompose.c | 17 ++++++++++------- 1 files changed, 10 insertions(+), 7 deletions(-) commit 9a5dfe1415dce9d726c93cd08c532f26512a70ee Author: Carl Worth Date: Thu Mar 1 14:53:48 2007 -0800 Fix implementation of radial gradients for inner radius != 0 The previous implementation fell apart quite badly when neither radius value was equal to 0.0. I derived the math from scratch, (much thanks to Vincent Torri for guiding me to a simpler derivation than I was doing originally), and it's working much better now without being any slower, (in fact, cairo-perf shows speedup of 1.05x to 1.58x on my laptop here). This work also provides groundwork for defining the behavior of radial gradients where neither circle is wholly contained within the other, (though we haven't done that definition yet---it will require a new test case and a very little bit of work on the implementation). This is a fix for the following bug report: Radial Gradients with nonzero inner radius misplace stops https://bugs.freedesktop.org/show_bug.cgi?id=7685 pixman/src/fbcompose.c | 196 ++++++++++++++++++++++++++++++++++++----------- pixman/src/icimage.c | 22 ++---- pixman/src/icimage.h | 13 ++-- pixman/src/icint.h | 1 + 4 files changed, 165 insertions(+), 67 deletions(-) commit 0439f4c4f7e7374b4f9699f664fc0e157628b190 Author: Carl Worth Date: Sun Feb 25 16:01:10 2007 +0100 Rename radial gradient inner/outer to c1/c2 The inner/outer names were totally bogus. It is quite legitimate to have the first circle's radius be larger than that of the second. pixman/src/icimage.c | 12 ++++++------ pixman/src/pixman.h | 4 ++-- src/cairo-pattern.c | 36 ++++++++++++++++++------------------ src/cairo-pdf-surface.c | 12 ++++++------ src/cairo-svg-surface.c | 12 ++++++------ 5 files changed, 38 insertions(+), 38 deletions(-) commit d65455ed3800f9ec3115bbed96a5b2328ee60b57 Author: Carl Worth Date: Fri Feb 23 07:12:03 2007 +0100 Add radial-gradient test case Embarrassingly enough, the test suite previously never called into cairo_pattern_create_radial at all. Unsurprisingly, this has led to bugs creeping into the radial gradient implementation. test/.gitignore | 1 + test/Makefile.am | 1 + test/radial-gradient-ref.png | Bin 0 -> 91159 bytes test/radial-gradient.c | 110 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 0 deletions(-) commit 17f6174bb2b877447e524715792c7adc84fb25e4 Author: Behdad Esfahbod Date: Thu Mar 1 13:50:23 2007 -0500 [TODO] Add cairo_surface_copy_page() TODO | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit c9ddb86e67154624f08a30599ba6f8d77f731b3a Author: Behdad Esfahbod Date: Thu Mar 1 13:49:13 2007 -0500 [paginated] Also increase page number in copy_page src/cairo-paginated-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit dc0043383b24425282ce38ba06422991c37c1d7e Author: Adrian Johnson Date: Thu Mar 1 23:39:10 2007 +1030 PDF: Ensure ToUnicode CMap name is unique and remove an unused printf argument. src/cairo-pdf-surface.c | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit 7d03fe94d76eee7b3e4bcc274effaa26bc9bd9af Author: Behdad Esfahbod Date: Wed Feb 28 17:08:23 2007 -0500 [RELEASING] Add notifying desktop-devel-list RELEASING | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 1dd647e26552961d2823ce4ee7cbd354450adf60 Author: Behdad Esfahbod Date: Wed Feb 28 16:55:30 2007 -0500 [TODO] Add/remove items TODO | 49 +++++++++++++++----------------------- boilerplate/cairo-boilerplate.c | 1 + 2 files changed, 20 insertions(+), 30 deletions(-) commit d0fe666a6ab1664af36a7b242d763c72f4e9f81b Author: Behdad Esfahbod Date: Wed Feb 28 14:58:57 2007 -0500 Revert the solid-pattern cache This reverts the following commits: 2715f2098127d04d2f9e304580a26cd0842c0e64 67e3b3c53bdd69e4d3503eed2db66953f1ac038c See this thread for an analysis of the problems it caused: http://lists.freedesktop.org/archives/cairo/2007-February/009825.html In short, a single cache for all backends doesn't work, as one thread using any backend can cause an unused xlib pattern to be evicted from the cache, and trigger an xlib call while the display is being used from another thread. Xlib is not prepared for this. src/cairo-color.c | 7 --- src/cairo-debug.c | 2 - src/cairo-directfb-surface.c | 12 +----- src/cairo-glitz-surface.c | 24 +----------- src/cairo-pattern.c | 91 +++-------------------------------------- src/cairo-surface.c | 26 ------------ src/cairo-win32-surface.c | 13 +------ src/cairo-xcb-surface.c | 17 +------- src/cairo-xlib-surface.c | 17 +------- src/cairoint.h | 15 ------- 10 files changed, 12 insertions(+), 212 deletions(-) commit 5f5afac8f470ae13ab2827f04e05ca585d69b898 Author: Behdad Esfahbod Date: Wed Feb 28 14:32:11 2007 -0500 [boilerplate/test-paginated] Issue a show_page before writing buffer This is needed since cairo-test does not issue a show_page now, and the one coming from paginated layer is too late (around finish). The way we force the show_page is kinda funny. That is, we create a temporary cairo_t and call cairo_show_page() on it. But works. boilerplate/cairo-boilerplate.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit efe8c82738bd417402a18871c40cf831e4df31e4 Author: Behdad Esfahbod Date: Wed Feb 28 14:19:18 2007 -0500 [paginated] Also do an automatic show page if nothing ever drawn That is, we always emit at least one page of output. Otherwise our PS/PDF/SVG files would be corrupt, and output with zero pages does not make much sense. src/cairo-paginated-surface.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 07d61af8093be501e93d64cc7df69f95ecb83b6c Author: Behdad Esfahbod Date: Wed Feb 28 13:46:27 2007 -0500 [paginated] Automatically issue a final cairo_show_page() This means, PS/PDF/SVG do not need the final cairo_show_page() anymore. If there is any drawing in the page, a cairo_show_page() is done automatically. src/cairo-paginated-surface.c | 18 +++++++++++++----- test/cairo-test.c | 2 -- 2 files changed, 13 insertions(+), 7 deletions(-) commit d30178b3dcebcdd89dc773881fc1b9097f1f50a7 Author: Behdad Esfahbod Date: Tue Feb 27 20:22:05 2007 -0500 [doc] Add new APIs to cairo-sections.txt doc/public/cairo-sections.txt | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) commit ef53465a032a74fd50b7edaef19cae08586f44d4 Author: Behdad Esfahbod Date: Tue Feb 27 20:18:16 2007 -0500 Slim-hidden cairo_scale() src/cairo.c | 1 + src/cairoint.h | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit ed75e24898a5ccd7836596122b9a801294122874 Author: Behdad Esfahbod Date: Tue Feb 27 20:09:22 2007 -0500 Implement cairo_get_scaled_font() TODO | 2 -- doc/public/cairo-sections.txt | 7 ++++--- src/cairo-gstate.c | 15 +++++++++++++++ src/cairo-scaled-font.c | 2 +- src/cairo.c | 30 ++++++++++++++++++++++++++++++ src/cairo.h | 3 +++ src/cairoint.h | 5 +++++ test/font-face-get-type.c | 14 ++++++++++++-- 8 files changed, 70 insertions(+), 8 deletions(-) commit d64b194a45d90b24d1cc01de0fa2cb4edc3a240b Author: Behdad Esfahbod Date: Tue Feb 27 20:03:26 2007 -0500 [quartz] Remove comment syntax that is recognized by gtkdoc from regular comments src/cairo-quartz-surface.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) commit 65ab63cb8dc1da949dc831691cf1db5b6b92d749 Author: Behdad Esfahbod Date: Tue Feb 27 19:45:10 2007 -0500 [cairo.c] Reorder some function implementations for clarity src/cairo.c | 56 ++++++++++++++++++++++++++++---------------------------- 1 files changed, 28 insertions(+), 28 deletions(-) commit ed933a199c07997cf1dfb5ef2e345d754e2433f3 Author: Behdad Esfahbod Date: Tue Feb 27 19:43:18 2007 -0500 [cairo.h] Reorder function prototypes a bit for clarity src/cairo.h | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit 153465bfe5346b9e1ebdbd4f794bd11868ee7458 Author: Behdad Esfahbod Date: Tue Feb 27 19:28:37 2007 -0500 [test] Add ref images for new tests test/surface-pattern-scale-down-pdf-argb32-ref.png | Bin 0 -> 1565 bytes test/surface-pattern-scale-down-ps-argb32-ref.png | Bin 0 -> 1400 bytes test/surface-pattern-scale-down-ref.png | Bin 0 -> 1784 bytes test/surface-pattern-scale-down.c | 3 +-- test/surface-pattern-scale-up-pdf-argb32-ref.png | Bin 0 -> 3886 bytes test/surface-pattern-scale-up-ps-argb32-ref.png | Bin 0 -> 1011 bytes test/surface-pattern-scale-up-ref.png | Bin 0 -> 3825 bytes test/surface-pattern-scale-up.c | 3 +-- test/surface-pattern.c | 3 +-- 9 files changed, 3 insertions(+), 6 deletions(-) commit e2ce27db302a185e6e80ead699c01e43921939ca Author: Behdad Esfahbod Date: Tue Feb 27 18:47:47 2007 -0500 [PS/PDF] Fix xstep/ystep values for CAIRO_EXTEND_NONE This fixes the fallback-resolution test, as well as the two of surface-pattern-scale-up and surface-pattern-scale-down. src/cairo-pdf-surface.c | 36 +++++++++++++++--------------------- src/cairo-ps-surface.c | 43 ++++++++++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 36 deletions(-) commit de0a6522b00822305fa5a0e32c4821628425ebdc Author: Behdad Esfahbod Date: Tue Feb 27 17:33:17 2007 -0500 [test] Add tests that show xstep/ystep failures in PS/PDF backends with surface patterns. One test scaled the pattern up, another scales down. We observe that both PS and PDF are broken when scaling down. This is the reason that PDF is failing in the fallback-resolution test too. test/.gitignore | 2 + test/Makefile.am | 2 + test/surface-pattern-scale-down.c | 69 +++++++++++++++++++++++++++++++++++++ test/surface-pattern-scale-up.c | 69 +++++++++++++++++++++++++++++++++++++ 4 files changed, 142 insertions(+), 0 deletions(-) commit 4c1d788219ae62bb9e8a7723d5a73d70eb42e69a Author: Behdad Esfahbod Date: Tue Feb 27 13:33:53 2007 -0500 [Makefile.am] Remove ChangeLog.cache-* in distclean ChangeLog.mk | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 7185c00e15aecf14d1957ba2e4f386ecb4e2a635 Author: Behdad Esfahbod Date: Fri Feb 23 16:21:28 2007 -0500 [PS] Add note about possible need for fix. src/cairo-ps-surface.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit aa3ebdbd01eb27e205b44728f9f5d9332c5ad450 Author: Behdad Esfahbod Date: Fri Feb 23 16:19:04 2007 -0500 [TODO] More TODO items TODO | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) commit 38b590d8b7f1f955653bca5cf4cceb723e173ade Author: Behdad Esfahbod Date: Fri Feb 23 16:18:00 2007 -0500 [SVG] Fix warnings src/cairo-svg-surface.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 69edcd4623ae4e1ef16c5a8d16a5ebd0c79d685f Author: Behdad Esfahbod Date: Fri Feb 23 16:15:44 2007 -0500 [SVG] Rename a local variable for clarity src/cairo-svg-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 11b3f43e927919a46909900a63386a1af788529a Author: Behdad Esfahbod Date: Fri Feb 23 16:14:37 2007 -0500 [TODO] Add various TODO items src/cairo-image-surface.c | 1 + src/cairo-pattern.c | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit 2d908e6a957c8b1e7f369621aaace2fc7277a941 Author: Behdad Esfahbod Date: Thu Feb 22 18:24:19 2007 -0500 [test] Add a new, XFAIL, extend-pad test test/.gitignore | 1 + test/Makefile.am | 3 ++ test/extend-pad-ref.png | Bin 0 -> 616 bytes test/extend-pad.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 78 insertions(+), 0 deletions(-) commit 289ac33fa28216cc6cc3e3d415cc4ff96cb17e12 Author: Behdad Esfahbod Date: Thu Feb 22 18:23:10 2007 -0500 [PS] Fix surface patterns with transforms Previously we were generating an image object with the desired transform and then a pattern with only a translation. This means, the pattern was alwasys axis-aligned. Obviously this does not work correctly with repeated rotated patterns. We now use an identity matrix for the image and put all the pattern transformation (well, it's inverse) into the pattern. This fixes the issue nicely. The surface-pattern test is still failing even with a reference image, because the gs rendering of the normal case and the device-offset=25 case are different and both have seams. src/cairo-ps-surface.c | 42 ++++++++++--------------------- test/surface-pattern-ps-argb32-ref.png | Bin 0 -> 2520 bytes 2 files changed, 14 insertions(+), 28 deletions(-) commit 16013ced09c8d6e2a967b9192f8545716a423504 Author: Behdad Esfahbod Date: Thu Feb 22 18:07:22 2007 -0500 [test] Remove non-existing test extend-pad test/Makefile.am | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit c87edd9e10c2a60e11c8cd954860fb03f6425132 Author: Behdad Esfahbod Date: Thu Feb 22 16:03:47 2007 -0500 [test] Update surface-pattern test to include transformations The surface-pattern test was very naive, painting a surface pattern repeated at identity size. With the new test, the surface pattern is scaled and rotated. This reveals a serious bug in the PS backend. test/surface-pattern-pdf-argb32-ref.png | Bin 0 -> 14880 bytes test/surface-pattern-ref.png | Bin 194 -> 11439 bytes test/surface-pattern-svg-ref.png | Bin 0 -> 17663 bytes test/surface-pattern.c | 94 ++++++++++++++----------------- 4 files changed, 43 insertions(+), 51 deletions(-) commit 7c39276366f91de151c775fa8293783f39247896 Author: Behdad Esfahbod Date: Thu Feb 22 13:40:55 2007 -0500 [PS/PDF] Accept CAIRO_EXTEND_REFLECT surface patterns natively With the hack in _cairo_pattern_acquire_surface to return a 2x2 surface for reflected patterns, we can now accept REFLECT surface patterns natively in all backends. SVG was already doing that. The PDF case needed some changes to go through _cairo_pattern_acquire_surface. A similar change to the recent change in SVG. src/cairo-pdf-surface.c | 19 +++++++++++++++---- src/cairo-ps-surface.c | 4 ++-- 2 files changed, 17 insertions(+), 6 deletions(-) commit 3405fb870e520bcc5588602317693837b59d1ee4 Author: Behdad Esfahbod Date: Thu Feb 22 13:10:34 2007 -0500 [test] Increase size of extend-reflect test to see that pattern repeats test/Makefile.am | 1 + test/extend-reflect-ref.png | Bin 287611 -> 589279 bytes test/extend-reflect.c | 2 +- 3 files changed, 2 insertions(+), 1 deletions(-) commit 63c011bb6bcbe484915b5bb28da087b14bd572a6 Author: Behdad Esfahbod Date: Wed Feb 21 18:29:25 2007 -0500 [surface] Copy device_transform_inverse in _cairo_surface_clone_similar src/cairo-surface.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 3516d8092b6297b8e4a3919c09e47f2bd4dd600a Author: Behdad Esfahbod Date: Wed Feb 21 18:13:16 2007 -0500 [SVG] Use _cairo_pattern_acquire_surface instead of _cairo_surface_acquire_source_image This change is required for the upcoming hack to support CAIRO_EXTEND_REFLECT. In short, the idea is that the surface returned by _cairo_pattern_acquire_surface may look different from the one returned by _cairo_surface_acquire_source_image, to support some pattern modes not supported by the backends directly. src/cairo-svg-surface.c | 23 +++++++++++++++-------- 1 files changed, 15 insertions(+), 8 deletions(-) commit 8d812ae9a670b2eeff4f0508e2c8c082e7900a7c Author: Behdad Esfahbod Date: Thu Feb 22 14:13:33 2007 -0500 [cairo-pattern] Correctly delegate device_transform so tests pass again src/cairo-pattern.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 7cbfb9556d869310c48c106a9929c292110685ce Author: Behdad Esfahbod Date: Thu Feb 22 12:56:05 2007 -0500 [cairo-pattern] Fall back on cairo_surface_create_similar in _cairo_pattern_acquire_surface_for_surface This was needed for SVG backend because it does not implement clone_similar. However, I'm worried about possible infinite recursion here. Not sure what to do. src/cairo-pattern.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 5562050bcf68923986b597f3aca1e285a466fa6c Author: Behdad Esfahbod Date: Wed Feb 21 18:16:34 2007 -0500 Support CAIRO_EXTEND_REFLECT on surface patterns We do this through a hack, that is, we make _cairo_pattern_acquire_surface to return a surface that has four copies of the original surface painted such that this image can be simply repeated to get the effect of reflecting the original surface. This fixes the formerly XFAIL test extend-reflect. src/cairo-pattern.c | 58 ++++++++++++++++++++++++++++++++++++++++++- test/Makefile.am | 2 +- test/extend-reflect-ref.png | Bin 287611 -> 287611 bytes test/extend-reflect.c | 4 +-- 4 files changed, 59 insertions(+), 5 deletions(-) commit 81935bb13120898a8581d8266041d3292558710a Author: Behdad Esfahbod Date: Wed Feb 21 18:06:02 2007 -0500 [PS] Update surface_pattern_supported() from PDF The PS backend was accepting all surface patterns, just to ASSERT_NOT_REACHED later if extend type of the pattern was PAD or REFLECT. That didn't make sense and was causing crash for PAD (surprisingly not for REFLECT. Not sure why). So now it rejects those types of surface patterns, just like the PDF surface does. src/cairo-ps-surface.c | 24 +++++++++++++++++++++++- 1 files changed, 23 insertions(+), 1 deletions(-) commit 4e30919f30e7618dbb62d7de2931efaac26c1785 Author: Behdad Esfahbod Date: Wed Feb 21 18:03:52 2007 -0500 [cairo-surface] Do not err on CAIRO_EXTEND_PAD and CAIRO_EXTEND_REFLECT for surface patterns. Right before releasing cairo 1.2, Carl and I decided to return error on CAIRO_EXTEND_PAD and CAIRO_EXTEND_REFLECT for surface patterns, as they are not implemented and one was causing crashes. Well, that was probably the worst decision we could make (other than ignoring the problem). A much better decision would have been to make them act like CAIRO_EXTEND_NONE and CAIRO_EXTEND_REPEAT respectively. Anyway, remove the error paths. src/cairo-surface.c | 30 ------------------------------ 1 files changed, 0 insertions(+), 30 deletions(-) commit a57bc6b6973a270ef85d73089ebd9d10b3bc5aa8 Author: Behdad Esfahbod Date: Wed Feb 21 17:59:28 2007 -0500 [test] Add ref image for extend-reflect test/extend-reflect-ref.png | Bin 0 -> 287611 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 5a72aac5982015a2b237afeb13164e0c5f5185ed Author: Vladimir Vukicevic Date: Fri Feb 23 14:24:04 2007 -0800 [core] put back REF_COUNT_INVALID to be -1, fix finish Previous commit broke cairo_surface_finish, since it was checking for ref_count == CAIRO_REF_COUNT_INVALID and bailing. But, that condition was reached from destroy, so finish was bailing out early. src/cairo-font.c | 3 +++ src/cairo-pattern.c | 3 +++ src/cairo-scaled-font.c | 3 +++ src/cairo-surface.c | 3 +++ src/cairo.c | 3 +++ src/cairoint.h | 2 +- 6 files changed, 16 insertions(+), 1 deletions(-) commit cf7311852298e7d86d065a12fa962ba10fe60dcc Author: Vladimir Vukicevic Date: Fri Feb 23 13:05:18 2007 -0800 [core] Add user_data and reference count getters to all objects user_data setters/getters were added to public refcounted objects that were missing them (cairo_t, pattern, scaled_font). Also, a refcount getter (cairo_*_get_reference_count) was added to all public refcounted objects. src/cairo-font.c | 18 +++++++++++ src/cairo-pattern.c | 76 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo-private.h | 2 + src/cairo-scaled-font.c | 78 +++++++++++++++++++++++++++++++++++++++++++++- src/cairo-surface.c | 17 ++++++++++ src/cairo.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 45 +++++++++++++++++++++++++++ src/cairoint.h | 17 ++++++---- 8 files changed, 319 insertions(+), 9 deletions(-) commit 67e3b3c53bdd69e4d3503eed2db66953f1ac038c Author: Behdad Esfahbod Date: Fri Feb 23 10:59:57 2007 -0500 [xlib/xcb] Check for same_screen in is_compatible Two drawables can be used in an X and Render operation only if they share the same screen. Previously we were only checking for the same display in is_compatible. Check for the same screen now. src/cairo-xcb-surface.c | 2 +- src/cairo-xlib-surface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit a1e5b91588a4f51c03487b480f13c100d07f64f8 Author: Adrian Johnson Date: Fri Feb 23 22:55:29 2007 +1030 Subsetting: Add check for malloc() error src/cairo-scaled-font-subsets.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) commit 27312591fe7ce14f65aac88ee7206ddcf3cbd0b1 Author: Adrian Johnson Date: Fri Feb 23 22:14:42 2007 +1030 Win32: Fix _cairo_win32_scaled_font_map_glyphs_to_unicode return type src/cairo-win32-font.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) commit 3b168e45510e02caf54e4b3cd0df76df6420d304 Author: Behdad Esfahbod Date: Thu Feb 22 23:14:58 2007 -0500 [FreeType] Truely return unhinted advance width if metrics hinting is off David Turner said: The returned 26.6 advance is always rounded, even with FT_LOAD_NO_HINTING. You can however retrieve the linearly scaled value as a 16.16 fixed float number through face->glyph->linearHoriAdvance. This works even with hinted glyphs. src/cairo-ft-font.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) commit 0ff5192e4cb5b1113bed3c9cf1c0275065aafd14 Author: Behdad Esfahbod Date: Wed Feb 21 15:57:21 2007 -0500 [Makefile.am] Include boilerplate/ in SUBDIRS Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1bc1f8ef46a27aa21f8d29b39e645ee5a0e95cda Author: Emmanuel Pacaud Date: Wed Feb 21 23:23:32 2007 +0100 Set overflow to visible for symbols. It makes viewers implementing correctly the SVG specification show texts. src/cairo-svg-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7d91c8a2cb3f2a5e0afe0d0c90956add51a4e27c Author: Behdad Esfahbod Date: Wed Feb 21 15:47:43 2007 -0500 [test] Fix syntax typo in text-rotate test/text-rotate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 155a1b48f6c8265ad5dd594354b66b3e8341bade Author: Behdad Esfahbod Date: Wed Feb 21 13:52:17 2007 -0500 [test] Remove text-rotate test from XFAIL as the bugs are fixed now All missing is subpixel text positioning, but we don't need an XFAIL test to remind us for that. test/Makefile.am | 6 +++--- test/text-rotate-ps-argb32-ref.png | Bin 0 -> 7198 bytes test/text-rotate-ref.png | Bin 12300 -> 17775 bytes test/text-rotate-rgb24-ref.png | Bin 5640 -> 0 bytes test/text-rotate-svg-ref.png | Bin 0 -> 18301 bytes test/text-rotate.c | 12 +++++++++++- 6 files changed, 14 insertions(+), 4 deletions(-) commit b54174e917e273143455661d565412fb9a185bfb Author: Behdad Esfahbod Date: Wed Feb 21 13:43:08 2007 -0500 [PS] Fix rotated image pattern emission by correcting setting the bbox The bug was that the bounding box of the image was computed by transforming the vector (width,height) and then using 0,0,width,height as the bounding box. This is obviously wrong. We use _cairo_matrix_transform_bounding_box() now. This fixes the XFAIL test rotate-image-surface-paint. src/cairo-ps-surface.c | 31 ++++++++++++++------- test/Makefile.am | 1 - test/rotate-image-surface-paint-ps-argb32-ref.png | Bin 0 -> 276 bytes 3 files changed, 21 insertions(+), 11 deletions(-) commit 6ae4a4fd71b030376ec373f2a787eac32b21d7f3 Author: Behdad Esfahbod Date: Wed Feb 21 12:57:09 2007 -0500 [test] Remove ft-text-vertical-layout-type1 from XFAIL and update reference images. This test was fixed some time ago where I disabled type1 subsetting for vertical layouts, then turned XFAIL again when Carl Worth didn't have the same fonts as me. I've not updated reference images to work on FC6 and hoping that it works for Carl too. test/Makefile.am | 1 - test/ft-text-vertical-layout-type1-ref.png | Bin 3970 -> 3960 bytes test/ft-text-vertical-layout-type1-svg-ref.png | Bin 3948 -> 3934 bytes 3 files changed, 0 insertions(+), 1 deletions(-) commit c6a067f967f9b92328e7d1ca2a4eba6fb4c6dfdf Author: Behdad Esfahbod Date: Wed Feb 21 11:50:24 2007 -0500 [test] Add test case for bug #7965 to the get-path-extents test test/get-path-extents.c | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) commit 363b1a40b5719582c670bdb9e7cd8087bcbf9666 Author: Vladimir Vukicevic Date: Tue Feb 20 16:18:27 2007 -0800 [quartz] Remove (disabled) support for rendering via AGL/CGGL src/cairo-quartz-private.h | 10 ---- src/cairo-quartz-surface.c | 106 +------------------------------------------ src/cairo-quartz.h | 11 ----- 3 files changed, 3 insertions(+), 124 deletions(-) commit e4a1410514471c2cb290d691ca77c4ab24a6541c Author: Vladimir Vukicevic Date: Tue Feb 20 16:16:18 2007 -0800 [quartz] Rename public function parameter from surf -> surface src/cairo-quartz-surface.c | 8 ++++---- src/cairo-quartz.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) commit 28c1e46b8e082f65fc94c984ea3b66df5adaa529 Author: Vladimir Vukicevic Date: Tue Feb 20 13:22:11 2007 -0800 [quartz] rename test override images from nquartz to quartz test/caps-joins-alpha-nquartz-ref.png | Bin 2466 -> 0 bytes test/caps-joins-alpha-quartz-ref.png | Bin 0 -> 2466 bytes test/clip-nesting-nquartz-ref.png | Bin 1067 -> 0 bytes test/clip-nesting-nquartz-rgb24-ref.png | Bin 956 -> 0 bytes test/clip-nesting-quartz-ref.png | Bin 0 -> 1067 bytes test/clip-nesting-quartz-rgb24-ref.png | Bin 0 -> 956 bytes test/clip-push-group-nquartz-ref.png | Bin 203 -> 0 bytes test/clip-push-group-quartz-ref.png | Bin 0 -> 203 bytes test/clip-twice-nquartz-ref.png | Bin 1171 -> 0 bytes test/clip-twice-nquartz-rgb24-ref.png | Bin 1111 -> 0 bytes test/clip-twice-quartz-ref.png | Bin 0 -> 1171 bytes test/clip-twice-quartz-rgb24-ref.png | Bin 0 -> 1111 bytes test/dash-caps-joins-nquartz-ref.png | Bin 4727 -> 0 bytes test/dash-caps-joins-quartz-ref.png | Bin 0 -> 4727 bytes test/degenerate-path-nquartz-rgb24-ref.png | Bin 188 -> 0 bytes test/degenerate-path-quartz-rgb24-ref.png | Bin 0 -> 188 bytes test/fill-and-stroke-alpha-add-nquartz-ref.png | Bin 603 -> 0 bytes test/fill-and-stroke-alpha-add-quartz-ref.png | Bin 0 -> 603 bytes test/fill-and-stroke-alpha-nquartz-ref.png | Bin 550 -> 0 bytes test/fill-and-stroke-alpha-quartz-ref.png | Bin 0 -> 550 bytes test/fill-and-stroke-nquartz-ref.png | Bin 286 -> 0 bytes test/fill-and-stroke-nquartz-rgb24-ref.png | Bin 264 -> 0 bytes test/fill-and-stroke-quartz-ref.png | Bin 0 -> 286 bytes test/fill-and-stroke-quartz-rgb24-ref.png | Bin 0 -> 264 bytes test/fill-degenerate-sort-order-nquartz-ref.png | Bin 2470 -> 0 bytes ...ill-degenerate-sort-order-nquartz-rgb24-ref.png | Bin 2098 -> 0 bytes test/fill-degenerate-sort-order-quartz-ref.png | Bin 0 -> 2470 bytes ...fill-degenerate-sort-order-quartz-rgb24-ref.png | Bin 0 -> 2098 bytes test/fill-rule-nquartz-ref.png | Bin 2079 -> 0 bytes test/fill-rule-nquartz-rgb24-ref.png | Bin 1790 -> 0 bytes test/fill-rule-quartz-ref.png | Bin 0 -> 2079 bytes test/fill-rule-quartz-rgb24-ref.png | Bin 0 -> 1790 bytes test/new-sub-path-nquartz-ref.png | Bin 386 -> 0 bytes test/new-sub-path-nquartz-rgb24-ref.png | Bin 357 -> 0 bytes test/new-sub-path-quartz-ref.png | Bin 0 -> 386 bytes test/new-sub-path-quartz-rgb24-ref.png | Bin 0 -> 357 bytes test/operator-clear-nquartz-ref.png | Bin 1195 -> 0 bytes test/operator-clear-nquartz-rgb24-ref.png | Bin 1244 -> 0 bytes test/operator-clear-quartz-ref.png | Bin 0 -> 1195 bytes test/operator-clear-quartz-rgb24-ref.png | Bin 0 -> 1244 bytes test/random-intersections-nquartz-ref.png | Bin 203877 -> 0 bytes test/random-intersections-nquartz-rgb24-ref.png | Bin 179204 -> 0 bytes test/random-intersections-quartz-ref.png | Bin 0 -> 203877 bytes test/random-intersections-quartz-rgb24-ref.png | Bin 0 -> 179204 bytes test/rel-path-nquartz-ref.png | Bin 212 -> 0 bytes test/rel-path-nquartz-rgb24-ref.png | Bin 228 -> 0 bytes test/rel-path-quartz-ref.png | Bin 0 -> 212 bytes test/rel-path-quartz-rgb24-ref.png | Bin 0 -> 228 bytes test/source-clip-scale-nquartz-ref.png | Bin 148 -> 0 bytes test/source-clip-scale-quartz-ref.png | Bin 0 -> 148 bytes test/trap-clip-nquartz-ref.png | Bin 5814 -> 0 bytes test/trap-clip-nquartz-rgb24-ref.png | Bin 5385 -> 0 bytes test/trap-clip-quartz-ref.png | Bin 0 -> 5814 bytes test/trap-clip-quartz-rgb24-ref.png | Bin 0 -> 5385 bytes 54 files changed, 0 insertions(+), 0 deletions(-) commit be451cd83d8178bfaf28a1c7dec59601d97cff8d Author: Vladimir Vukicevic Date: Tue Feb 20 12:54:03 2007 -0800 [quartz] rename NQUARTZ -> QUARTZ in defines perf/cairo-perf.c | 1 - src/cairo-quartz-private.h | 4 +++- src/cairo-quartz-surface.c | 18 +++++++++--------- src/cairo-quartz.h | 10 +++++----- 4 files changed, 17 insertions(+), 16 deletions(-) commit 4c201723ce8139c2e6620881583bc08e3aa1bad7 Author: Vladimir Vukicevic Date: Tue Feb 20 12:15:35 2007 -0800 [quartz] Rename nquartz to quartz boilerplate/cairo-boilerplate.c | 47 +- configure.in | 7 - src/Makefile.am | 6 - src/cairo-atsui-font.c | 33 +- src/cairo-nquartz-surface.c | 1864 -------------------------------------- src/cairo-nquartz.h | 80 -- src/cairo-quartz-private.h | 30 +- src/cairo-quartz-surface.c | 1899 ++++++++++++++++++++++++++++++++++++--- src/cairo-quartz.h | 39 +- src/cairo.h | 1 - test/get-clip.c | 3 +- 11 files changed, 1819 insertions(+), 2190 deletions(-) commit 641f0919d53691e561aa665d31cc43524d861215 Author: Adrian Johnson Date: Wed Feb 21 00:32:07 2007 +1030 PDF/PS: Don't embed multiple copies of the same font cairo-scaled-font-subsets stores two sets of subsets - scaled and unscaled. The first time each glyph is mapped, _cairo_scaled_glyph_lookup() is called to determine if the glyph is bitmap or outline. Outline glyphs are put in the unscaled subsets. Bitmap glyphs are put in the scaled subsets. The unscaled subsets hash table keyed is the scaled_font->font_face to ensure only one font for each font face is created. The scaled subsets hash table is keyed by scaled_font. _cairo_scaled_font_subsets_create() now takes two arguments to specify the maximum size of the scaled and unscaled subsets. If the unscaled max size is set to 0 all glyphs are mapped to scaled subsets. A separate foreach function is provided for scaled and unscaled subsets. The PDF and PS backends iterate over the unscaled subsets to emit CFF, TrueType, and Type1 fonts. The scaled subsets are iterated to emit Type3 bitmap fonts. src/cairo-pdf-surface.c | 24 +++- src/cairo-ps-surface.c | 24 +++- src/cairo-scaled-font-subsets-private.h | 61 +++++++- src/cairo-scaled-font-subsets.c | 235 +++++++++++++++++++++++++------ src/cairo-svg-surface.c | 8 +- 5 files changed, 288 insertions(+), 64 deletions(-) commit f65c33edbecc1f0e285814995dc1a51748310e36 Author: Behdad Esfahbod Date: Tue Feb 20 01:00:53 2007 -0500 [win32] Make win32-surface compile without win32-font Hacking on the win32 code, thanks to winelib. Yay! src/cairo-win32-surface.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 2335a23a16d84e6ebdde7afbeb1fbceb3bdbe6b6 Author: Behdad Esfahbod Date: Tue Feb 20 01:00:17 2007 -0500 [test/Makefile.am] Document why svg2png and pdf2png use LDADD This is to make librsvg and poppler to use the compiled cairo instead of whatever is on the system, such that the test suite does not depend on a good version of cairo being installed already. test/Makefile.am | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 8133530ae5848b0a34c299e0c71360931fe383df Author: Behdad Esfahbod Date: Tue Feb 20 00:57:25 2007 -0500 [configure] Improve win32 detection We now test for windows.h availability to automatically enable win32 backends. This nicely enables compiling cairo against libwine by just setting CC=winegcc LD=winegcc during configure. This currently only generates static libs though. configure.in | 27 ++++++++++++++++++--------- src/Makefile.am | 7 +++++-- 2 files changed, 23 insertions(+), 11 deletions(-) commit 0fcd6cfe0edff25ad3d11af056ba611bd8d9d8c8 Author: Jeff Smith Date: Mon Feb 19 16:06:57 2007 -0500 Clean up some inconsistent spacing in the stroking code src/cairo-path-stroke.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 89010db3ad3ce0a9afaf28fd313da86ebc864c7c Author: Jeff Smith Date: Mon Feb 19 16:06:57 2007 -0500 Add or reword several comments in the stroking code src/cairo-path-stroke.c | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) commit adb573d0bafd7b555bda0effcbd94b9144981ad6 Author: Jeff Smith Date: Mon Feb 19 16:06:57 2007 -0500 Minor changes to shorten the stroking code src/cairo-path-stroke.c | 26 +++++++++----------------- 1 files changed, 9 insertions(+), 17 deletions(-) commit fb29fddd40aeb4c2f1a42f88eddec5c06adf0583 Author: Jeff Muizelaar Date: Mon Feb 19 16:06:57 2007 -0500 Rename tmp to step_length because that is what it actually is. src/cairo-path-stroke.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit afd5f92195335a88d7c1ff181a1bd03ca01b424f Author: Jeff Muizelaar Date: Mon Feb 19 16:06:57 2007 -0500 Fix several issues with dashed stroking code, particularly 'leaky-dash' Adds some state, 'dash_starts_on', to keep track of whether a dashed path starts with dash_on or not. This fixes the 'leaky-dash' bug (#4863) and some other degenerate cases. The new version is, in my opinion, considerably cleaner and more understandable than the old code. Finally, the rewrite changes the behaviour of dashing to add degenerate caps around corners that start at the same place as a dash begins. This matches the behaviour seen in acroread. This rewrite is based on an initial rewrite done by Jeff Smith. src/cairo-path-stroke.c | 85 +++++++++++++++++-------------------- test/Makefile.am | 1 - test/dash-caps-joins-ref.png | Bin 4680 -> 4718 bytes test/dash-scale-ref.png | Bin 7791 -> 7908 bytes test/leaky-dash-ps-argb32-ref.png | Bin 0 -> 286 bytes test/leaky-dash-ref.png | Bin 241 -> 243 bytes 6 files changed, 39 insertions(+), 47 deletions(-) commit 78ae474d96b48ccba3d18dc26c416ebd6daab502 Author: Jeff Muizelaar Date: Mon Feb 19 16:06:56 2007 -0500 Rename has_sub_path to has_initial_sub_path has_initial_sub_path more accurately describes the condition we want to track. This flag is used to indicate when an initial sub_path needs capping but has no associated slope and thus no associated faces. src/cairo-path-stroke.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit 9f3fb4f753eabc84f19d808df64a718991269670 Author: Jeff Muizelaar Date: Mon Feb 19 16:06:56 2007 -0500 Add a comment about the point choice when capping degenerate paths src/cairo-path-stroke.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit a1a4d6966e1d9c8ccf84c9972a4f9560553948f6 Author: Jeff Smith Date: Mon Feb 19 16:06:56 2007 -0500 Modify how _cairo_stroker_add_caps handles zero-length sub-paths For zero-length sub-paths, _cairo_stroker_add_caps sets up a dummy face, then lets later parts of the function add the caps. src/cairo-path-stroke.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) commit 849a9ef81b99d05d8f3ceb4f73bf5e52c90b24af Author: Jeff Smith Date: Mon Feb 19 16:06:56 2007 -0500 Change type of cairo_stroker_t's dash_on from int to cairo_bool_t src/cairo-path-stroke.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 74ded42327e87b40de434a28620d0a3fc8e4d249 Author: Jeff Muizelaar Date: Mon Feb 19 16:06:56 2007 -0500 Add a new dashing test This new dashing test, based on some code from Jeff Smith, does a pretty good job exploring all the cases that the dashing code needs to deal with. test/Makefile.am | 2 + test/dash-state-ps-argb32-ref.png | Bin 0 -> 8652 bytes test/dash-state-ref.png | Bin 0 -> 9389 bytes test/dash-state.c | 72 +++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 0 deletions(-) commit 1c1697398c5ef17e38bc031e8c067113a6c10287 Author: Jeff Muizelaar Date: Mon Feb 19 16:06:56 2007 -0500 Add two new test cases to degenerate-path test These new cases deal with degenerate paths at the end of dashed paths. They currently fail. test/degenerate-path-ps-argb32-ref.png | Bin 303 -> 390 bytes test/degenerate-path-ref.png | Bin 216 -> 257 bytes test/degenerate-path-rgb24-ref.png | Bin 189 -> 224 bytes test/degenerate-path.c | 23 ++++++++++++++++++++++- 4 files changed, 22 insertions(+), 1 deletions(-) commit 9927dde5334322c97942982f9bf632e74502d628 Author: Adrian Johnson Date: Sat Feb 17 10:55:14 2007 +1030 TrueType: fix bug #9998 - build error with gcc 2.95 src/cairo-truetype-subset-private.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 9bae496a0a057bb0de70b078ee5cde265663dc86 Author: Brian Ewins Date: Thu Feb 15 23:08:40 2007 +0000 [ATSUI] implement load_truetype_table Implements load truetype table, allowing selection of text and searching in pdfs generated using the atsui font backend. src/cairo-atsui-font.c | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletions(-) commit 16e20568a502b86d96c3087515e663bb7996f167 Author: Adrian Johnson Date: Fri Feb 16 08:38:26 2007 +1030 TrueType: Add post table and 3,0 cmap encoding Commit 05ff2c77da86c7be95924f9af4d3ad944afbbf66 contained a fix for the acroread printing problem. However this patch caused a problem for the Mac Preview PDF viewer. http://lists.freedesktop.org/archives/cairo/2007-February/009615.html This patch fixes the Mac Preview problem. The patch - Adds a platform 3, encoding 0 cmap table - Adds a post table that maps the glyph names in the PDF truetype font dictionary (/g0 /g1 /g2 ...) to glyph indices in the font. src/cairo-truetype-subset-private.h | 1 + src/cairo-truetype-subset.c | 69 +++++++++++++++++++++++++++++++---- 2 files changed, 63 insertions(+), 7 deletions(-) commit 2715f2098127d04d2f9e304580a26cd0842c0e64 Author: Jorn Baayen Date: Wed Feb 14 18:28:56 2007 -0800 [cairo-pattern] Cache surface for solid patterns We use a small cache of size 16 for surfaces created for solid patterns. This mainly helps with the X backends where we don't have to create a pattern for every operation, so we save a lot on X traffic. Xft uses a similar cache, so cairo's text rendering traffic with the xlib backend now completely matches that of Xft. The cache uses an static index variable, which itself acts like a cache of size 1, remembering the most recently used solid pattern. So repeated lookups for the same pattern hit immediately. If that fails, the cache is searched linearly, and if that fails too, a new surface is created and a random member of the cache is evicted. Only surfaces that are "compatible" are used. The definition of compatible is backend specific. For the xlib backend, it means that the two surfaces are allocated on the same display. Implementations for compatibility are provided for all backends that it makes sense. src/cairo-color.c | 7 +++ src/cairo-debug.c | 2 + src/cairo-directfb-surface.c | 12 +++++- src/cairo-glitz-surface.c | 24 +++++++++++- src/cairo-pattern.c | 91 ++++++++++++++++++++++++++++++++++++++--- src/cairo-surface.c | 26 ++++++++++++ src/cairo-win32-surface.c | 13 ++++++- src/cairo-xcb-surface.c | 17 +++++++- src/cairo-xlib-surface.c | 17 +++++++- src/cairoint.h | 15 +++++++ 10 files changed, 212 insertions(+), 12 deletions(-) commit b31179478bf8c18245917caa1bee19bb61f336c1 Author: Carl Worth Date: Wed Feb 14 00:48:42 2007 -0800 Bump cairo version to 1.3.15 after making the 1.3.14 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 90e453fc22398f31996a6fdbeec6da98e25a160e Author: Carl Worth Date: Wed Feb 14 00:34:18 2007 -0800 Increment cairo version to 1.3.14 (and libtool versioning to 12:4:10) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 513f21140bae549e088909333598e73e5dac4a44 Author: Carl Worth Date: Wed Feb 14 00:32:54 2007 -0800 NEWS: Add notes for the 1.3.14 snapshot NEWS | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 56 insertions(+), 0 deletions(-) commit 51ca187d3e5d613a583daf4fa5b244157e3a2c4f Author: Carl Worth Date: Tue Feb 13 23:55:03 2007 -0800 Mark test/rotate-image-surface-paint as XFAIL This test has always failed with the ps backend since the test was initially written. test/Makefile.am | 1 + test/rotate-image-surface-paint.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) commit 9966551dc7640ae7901ffed0e15f0fbf7e603d5d Author: Carl Worth Date: Tue Feb 13 23:49:26 2007 -0800 Fix cairo_ft_unscaled_font_t to have a lock_count again not an is_locked Boolean This was inadvertently changed as part of fdffde8b9e7a2308b822ddef7b02a8e85cc8ba1e With the Boolean, pango-using programs that locked the same unscaled_font multiple times would crash with a message such as: cairo-ft-font.c:569: _cairo_ft_unscaled_font_unlock_face: Assertion `unscaled->is_locked' failed. src/cairo-ft-font.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 7adab2866be21207a15f07aab01fb17edd0e661f Author: Carl Worth Date: Tue Feb 13 22:05:57 2007 -0800 Add missing call to set_scale of unscaled_font in scaled_glyph init This fixes a regression introduced with commit: 25a370d7992d7f70d8cf79f1b328e40437b40ac4 This was showing up as a failure of the bitmap-font test case with the ps, pdf, and svg backends. src/cairo-ft-font.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 17b4496ae9df539c48c830b21c4477e763ba4e5d Author: Jinghua Luo Date: Wed Feb 14 11:52:11 2007 +0800 type1-subset: fix error handling. This fixes potenial memory leak and leaving font face locked on error. src/cairo-type1-subset.c | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) commit 01a133167c48e7985515ae29f4a87de7952d1373 Author: Dan Amelang Date: Sun Feb 11 00:16:52 2007 -0800 Update Win32 makefiles Since the last time these makefiles were last updated some new source files have been added and one renamed. In addition, a "clean" rule needed to be added to the pixman makefile. And the "clean" rule in the main cairo makefile wasn't working properly for me. pixman/src/Makefile.win32 | 2 ++ src/Makefile.win32 | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) commit b8987dd12c3269c1d7978338cd356b9fe3ad420e Author: Carl Worth Date: Tue Feb 13 16:47:30 2007 -0800 ROADMAP: Note that text spacing issues for win32 are fixed ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f0a16b5bddc5c162c78ae976093fe8bb2b756e04 Author: Dan Amelang Date: Sun Feb 11 03:34:27 2007 -0800 Fix Win32 text spacing problem Thanks to Jordan Miner for reporting the problem and a fix. src/cairo-win32-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit aad1374caab3a05893c9f1f2605131edd9f62409 Author: Carl Worth Date: Sat Feb 10 09:39:24 2007 -0800 Rename cairo_toy_font_face_hash_table_mutex to cairo_font_face_mutex The new name more accurately reflects its recently expanded role. src/cairo-font.c | 31 +++++++++++++++++++------------ 1 files changed, 19 insertions(+), 12 deletions(-) commit e107b70b4d282d78ebe32f4d2381fcf98df324f6 Author: Carl Worth Date: Sat Feb 10 09:39:09 2007 -0800 Add locking to cairo_font_face_reference/destroy The reference count of cairo_font_face_t is rather intimately tied, (for toy font faces), with the cairo_font_face_hash_table, so we expand the existing cairo_toy_font_face_hash_table_mutex to cover the manipulation of font_face->ref_count as well. This commit eliminates an assertion failure that is (occasionally) exposed by the pthread-show-text test case: lt-pthread-show-text: cairo-hash.c:196: _cairo_hash_table_destroy: Assertion `hash_table->live_entries == 0' failed. src/cairo-font.c | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-) commit d6d1767f9a89bf7e16288d0a90e5fafc5ad2d9d6 Author: Carl Worth Date: Sat Feb 10 09:38:13 2007 -0800 Increase pthread-show-text thread count and add cairo_select_font_face to expose more bugs. test/pthread-show-text.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit fdffde8b9e7a2308b822ddef7b02a8e85cc8ba1e Author: Carl Worth Date: Sat Feb 10 09:14:07 2007 -0800 Add mutex to implement _cairo_ft_unscaled_font_lock_face and _cairo_ft_unscaled_font_unlock_face Previously we just had an integer counter here, but that is not sufficient as multiple cairo_scaled_font_t objects, (which are implicitly shared through the font caches), can reference the same cairo_ft_unscaled_font_t so real locking is needed here. This commit eliminates an assertion failure exposed by the pthread-show-text test case: lt-pthread-show-text: cairo-ft-font.c:562: _cairo_ft_unscaled_font_unlock_face: Assertion `unscaled->lock > 0' failed. src/cairo-ft-font.c | 82 +++++++++++++++++++++++++++++++++------------------ 1 files changed, 53 insertions(+), 29 deletions(-) commit 25a370d7992d7f70d8cf79f1b328e40437b40ac4 Author: Carl Worth Date: Tue Feb 13 10:40:53 2007 -0800 Avoid public cairo_ft_scaled_font_lock_face for internal use We're planning to change the implementation of the public function, (which will remove some locking safety), so use the safe, locked _cairo_ft_unscaled_font_lock_face for internal use instead. src/cairo-ft-font.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 7e1301ffb066b04d95dc71144d86e660f0155bba Author: Carl Worth Date: Sat Feb 10 09:12:38 2007 -0800 Add missing _cairo_ft_unscaled_font_unlock_face to _cairo_ft_scaled_font_create src/cairo-ft-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6f7cfdf5c79c3c09a0241ae25ff540fb0d893d31 Author: Adrian Johnson Date: Tue Feb 13 23:53:38 2007 +1030 PDF: Add missing character code to Differences array src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 88cae7766d6006e4169da1dcddc14a52e210cae5 Author: Adrian Johnson Date: Tue Feb 13 23:29:05 2007 +1030 output-stream: coding style fix src/cairo-output-stream.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 88f7ea4ad7926b135c987d3d75c029310c328010 Author: Adrian Johnson Date: Tue Feb 13 22:52:53 2007 +1030 CFF: Fix Visual C++ compile problem Don't use structure intitialization for assigning structure values. Add a new field to cff_charset_t to point to the sids charset array instead of casting it into the data field. src/cairo-cff-subset.c | 25 ++++++++++++++----------- 1 files changed, 14 insertions(+), 11 deletions(-) commit ac01dcb5ad077d8ea08a93348fc23d4a891abaae Author: Adrian Johnson Date: Sun Feb 11 23:14:40 2007 +1030 PDF: Remove dead code The function _cairo_pdf_surface_write_fonts is the original PDF TrueType font embedding function that was disabled in commit f500cef19f049a4a0ed296172618db2f26794932 shortly before Type3 font support was added. TrueType font embedding was later reintroduced as new code making this function obsolete. src/cairo-pdf-surface.c | 108 ----------------------------------------------- 1 files changed, 0 insertions(+), 108 deletions(-) commit d6f15b26009ff8e1d52a037265bcaa80c5ce6735 Author: Adrian Johnson Date: Sun Feb 11 22:20:58 2007 +1030 Output-stream: Omit the minus sign from negative zero src/cairo-output-stream.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit a2fefcc9e962e81a00fb16ae3d1bc29d9e61eaa0 Author: Adrian Johnson Date: Sun Feb 11 21:57:43 2007 +1030 PDF: Compress Type3 fonts src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9f47879ae31f003be3b32f9ecb3efb3486d72cc7 Author: Adrian Johnson Date: Sun Feb 11 21:50:46 2007 +1030 PDF: Fix Type3 font metrics to make text selection work src/cairo-pdf-surface.c | 66 +++++++++++++++++++++++++++++++++++++++------- 1 files changed, 56 insertions(+), 10 deletions(-) commit 9dce321a113871ade7de244d3abf9ed08f43dd85 Author: Brian Ewins Date: Sun Feb 11 01:42:22 2007 +0000 [ATSUI] scale fonts using font size not font matrix Mozilla bug #327522 - fonts scaled up over 16pt on mac had nonsensical extents. The scaling was being done using the font matrix, it turns out this does not work for 16x scaling and up. This patch switches back to using the font size to scale fonts, with emboldening and condensing effects applied separately using the font matrix. src/cairo-atsui-font.c | 22 +++++++++------------- 1 files changed, 9 insertions(+), 13 deletions(-) commit eec62c297589ca20f4128c889ecad9e96736a07f Author: Brian Ewins Date: Sat Feb 10 00:20:40 2007 +0000 Unreleased lock typo in cairo-scaled-font.c One path through _cairo_scaled_font_text_to_glyphs grabbed the mutex but didn't release it, causing hangs in all text rendering on the mac. src/cairo-scaled-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a37f21cb17a24643f7513dff06bc2b5fd38e2583 Author: Eugeniy Meshcheryakov Date: Thu Feb 8 15:29:58 2007 -0800 [PS/PDF/SVG] Return a write_error nil surface on write errors src/cairo-pdf-surface.c | 4 +++- src/cairo-ps-surface.c | 4 +++- src/cairo-surface.c | 1 + src/cairo-svg-surface.c | 4 +++- src/cairoint.h | 1 + 5 files changed, 11 insertions(+), 3 deletions(-) commit bf3cbe7660f03f6b4139f4cf79a4007c682a84bd Author: Eugeniy Meshcheryakov Date: Thu Feb 8 15:28:14 2007 -0800 [cairo-surface] Use a macro definition for all nil surfaces src/cairo-surface.c | 139 ++++++++++++++------------------------------------- 1 files changed, 38 insertions(+), 101 deletions(-) commit aea0831d24c3fca59b9eb9dd8acce9d9cdd13f26 Author: Kalle Vahlman Date: Thu Feb 8 15:07:45 2007 -0800 [cairoint] Make it compile with libpng disabled src/cairoint.h | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit 4773b8a6d25e4b228471ad48616c08367ee84809 Author: Peter Weilbacher Date: Thu Feb 8 20:34:26 2007 +0100 Oops, correct typo in previous commit FALSA -> FALSE src/cairoint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e711700d5d766b4b923a10bfaabb57163b55a21d Author: Peter Weilbacher Date: Thu Feb 8 20:29:18 2007 +0100 Correct scaled font mutex definitions for OS/2 Using a zero without brackets to quiet remaining GCC compilation warning. Use FALSE so that the mutex does not block on creation. src/cairoint.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 2d1db24d1e7f3967b7ab498ce0ed29508c08a04b Author: Adrian Johnson Date: Wed Feb 7 23:10:47 2007 +1030 PDF: Another fix for TrueType metrics Not all TrueType fonts have an em size of 2048. src/cairo-pdf-surface.c | 20 ++++++++++---------- src/cairo-scaled-font-subsets-private.h | 6 +++--- src/cairo-truetype-subset.c | 22 +++++++++++++--------- 3 files changed, 26 insertions(+), 22 deletions(-) commit 274dfa4598bcb11b9f8330d23934a4ef1797fdbf Author: Adrian Johnson Date: Wed Feb 7 22:35:59 2007 +1030 PDF: Make text selection and extraction work - Add a to_unicode array to the scaled_font_subsets for mapping glyphs to unicode characters - Add a function to the TrueType subsetting for performing a reverse cmap for mapping glyph indices to unicode characters. - Add a new scaled font backend function for mapping glyph indices to unicode characters. Provide FreeType and Win32 implementations of the font backend mapping function. - Modify the PDF backend to embed ToUnicode streams into each font. The unicode mapping is obtained by first trying the reverse cmap. If this fails the font backend mapping function is called. src/cairo-atsui-font.c | 2 + src/cairo-ft-font.c | 33 +++++++ src/cairo-pdf-surface.c | 126 +++++++++++++++++++++++++-- src/cairo-scaled-font-subsets-private.h | 29 ++++--- src/cairo-scaled-font-subsets.c | 15 +++- src/cairo-truetype-subset-private.h | 23 +++++ src/cairo-truetype-subset.c | 144 +++++++++++++++++++++++++++++++ src/cairo-win32-font.c | 17 ++++ src/cairoint.h | 18 ++++ 9 files changed, 385 insertions(+), 22 deletions(-) commit 97a2522e0bbe8464028b9b42c79e0b3559b532be Author: Carl Worth Date: Tue Feb 6 21:19:30 2007 -0800 Add missing locking to _cairo_scaled_font_text_to_glyphs We recently added locking to cairo_scaled_font_glyph_extents and to _cairo_surface_show_glyphs, but we had neglected the third separate entry point into scaled_font code that does cache-using glyph lookups, namely: _cairo_scaled_font_text_to_glyphs. These three separate functions are plainly visible in the implementation of cairo_show_text. src/cairo-scaled-font.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) commit 1503a41c7f115033b10470574027cffab0730687 Author: Carl Worth Date: Tue Feb 6 20:32:08 2007 -0800 Expand font_map locking to cover call to backend->scaled_font_create It seemed like a good idea to avoid holding the lock over the call into the backend. But the procedure in place was quite broken: LOCK Fail to find font in hash table UNLOCK Create font LOCK Insert font into hash table UNLOCK since while we're busy creating the font and unlocked, another thread can insert the font. Our paranoid hash table implementation noted the problem quite readily. This patch simply removes the internal UNLOCK/LOCK to hold the mutex over the whole procedure. src/cairo-scaled-font.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) commit fc3ce1e80a89aab4f1ec75946771f6c2a79f0b90 Author: Carl Worth Date: Tue Feb 6 20:41:58 2007 -0800 test/pthread-show-text: Increease iterations to expose locking bug With 50 iterations I'm seeing the following assertion failure: cairo-hash.c:477: _cairo_hash_table_insert: Assertion `NOT_REACHED' failed. Thanks to Jan Slupski for pointing out this bug. test/pthread-show-text.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit d07827ba2a225f880f4bbf6980872f5ae8898288 Author: Carl Worth Date: Tue Feb 6 19:06:23 2007 -0800 ROADMAP: Drop 1.3.6 which is already in the past and note 8379 fix and pixman gradient improvements ROADMAP | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) commit 672a668da1002dbcecda2e4805c6b54c86d4cff7 Author: Carl Worth Date: Tue Feb 6 19:05:07 2007 -0800 ROADMAP: Note that the 8801 locking bug is fixed. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit db3493bef7dba1e960f59563925fd9c5e75cb4ca Author: Carl Worth Date: Tue Feb 6 18:28:44 2007 -0800 Remove dead cff_dict_remove function I assume this was just a leftover that was meant to be removed earlier. If not, please feel free to bring it back again. src/cairo-cff-subset.c | 14 -------------- 1 files changed, 0 insertions(+), 14 deletions(-) commit 89cf8dbf522ce7ada0ee4cf9ea016ac2a89c8a75 Author: Carl Worth Date: Tue Feb 6 18:27:33 2007 -0800 Remove half-leftover debugging code from previous commit This was leading to link failures on CAIRO_LOCK_FILE, etc. src/cairoint.h | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 5d58e7ee66166b19e673c247fe41eae51f72fd92 Author: Carl Worth Date: Mon Feb 5 16:45:25 2007 -0800 Add scaled_font->mutex to allow locking for all subordinate objects A cairo_scaled_font_t can be implicitly shared among multiple threads as the same cairo_scaled_font_t can be returned from different calls to cairo_scaled_font_create. To retain the illusion that these different calls produce distinct objects, cairo must internally lock access when modifying them. Each glyph in the scaled font is represented by a cairo_surface_t which is used when rendering the glyph. Instead of attempting to push fine-grained locking of these surfaces down to the backend rendering functions, a simple per-cairo_scaled_font_t lock has been introduced which protects the entire rendering path against re-entrancy. Some care was required to ensure that existing re-entrancy was handled appropriately; these cases are in the wrapping surfaces (cairo-paginated, test-meta and test-paginated). Thanks to Vladimir Vukicev and Peter Weilbacher for testing/providing the mutex definitions for win32 and os2 (respectively). src/cairo-paginated-surface.c | 21 ++++++++++++-- src/cairo-scaled-font.c | 17 ++++++++--- src/cairo-surface.c | 19 ++++++++----- src/cairoint.h | 58 +++++++++++++++++++++++++++++++++++++++- src/test-meta-surface.c | 21 ++++++++++++-- src/test-paginated-surface.c | 19 ++++++++++++- 6 files changed, 132 insertions(+), 23 deletions(-) commit 765715ad93d3daad1b8b53f6ea9fee82737923ea Author: Carl Worth Date: Tue Feb 6 17:29:03 2007 -0800 Move scaled font holdovers magic from reference to create to fix race condition Previously, with the magic in _cairo_scaled_font_reference(), cairo_scaled_font_create() was releasing its lock just before calling into reference() which would re-acquire the lock. That left a window open during which a font we just discovered in the holdovers table could be destroyed before we had a chance to give it its initial reference back. src/cairo-scaled-font.c | 57 +++++++++++++++++++++------------------------- 1 files changed, 26 insertions(+), 31 deletions(-) commit 9c359d61fc5df3e925e4b63503d60dc8fe8be6b3 Author: Carl Worth Date: Tue Feb 6 17:40:17 2007 -0800 Avoid holding lock when calling _cairo_scaled_font_fini As in the previous commit with the backend->scaled_font_create function, we also don't want to hold the lock when calling into the backend's fini function. src/cairo-scaled-font.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) commit 258175ffcd89dcc949c3dc6ee3cd660d057a1966 Author: Carl Worth Date: Tue Feb 6 17:21:22 2007 -0800 Don't hold mutex over backend->scaled_font_create This also allows some cleanup of the error-handling in cairo_scaled_font_create, (no more goto statements). src/cairo-scaled-font.c | 48 +++++++++++++++++++++++----------------------- 1 files changed, 24 insertions(+), 24 deletions(-) commit fc660511ec7a51be909e5ed940354d39ef7ad633 Author: Adrian Johnson Date: Wed Feb 7 11:05:33 2007 +1030 PDF: Correct the y value of Td in show_glyphs This bug would occur if the y coordinate of all the glyphs in a single cairo_show_glyphs() call was not the same. src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 908469b5fcdc311a89868ab44baa85d0744985d1 Author: Soren Sandmann Pedersen Date: Tue Feb 6 16:37:45 2007 -0500 Apply patch from Marco Gritti and Jordan Crouse to correctly detect AMD CPU's. Bug 9615. pixman/src/fbpict.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 9d3f537423b3cc0cb6a4b2607e9307c1eef9e074 Author: Soren Sandmann Pedersen Date: Tue Feb 6 16:27:42 2007 -0500 Remove left-over assert and some alpha checks from fbCompositeSrc_8888x0565mmx(). Bug 9893. pixman/src/fbmmx.c | 52 +++++++++++++--------------------------------------- 1 files changed, 13 insertions(+), 39 deletions(-) commit a8f8efb750fd3a8857c7f519b8645e578f75442b Author: Adrian Johnson Date: Mon Feb 5 18:29:30 2007 +1030 PS: Correct the TrueType Encoding and Charstrings The offsets and count was out by one as a result of the change to include .notdef on the TrueType font. src/cairo-ps-surface.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 28e3a20d79c3390547d3e53435c06442ca8ac8a2 Author: Adrian Johnson Date: Sun Feb 4 23:47:28 2007 +1030 PDF: Fix TrueType font metrics src/cairo-pdf-surface.c | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-) commit 05ff2c77da86c7be95924f9af4d3ad944afbbf66 Author: Adrian Johnson Date: Sun Feb 4 19:00:16 2007 +1030 PDF: Add Encoding dictionary to TrueType fonts This is a fix for the bugs reported here http://lists.freedesktop.org/archives/cairo/2006-December/008984.html http://lists.freedesktop.org/archives/cairo/2007-January/009387.html Cairo PDFs will not print correctly from Adobe Reader. The symptoms are that all the glyphs on the page are replaced with the same glyph. According to the PDF Reference an Encoding dictionary is not required for the symbolic fonts used by cairo. However including the Encoding dictionary fixes the printing problem. src/cairo-pdf-surface.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-) commit 3f8d5f505af4d7569ce38452f1be5d40bf6a00b4 Author: Adrian Johnson Date: Sun Feb 4 18:21:50 2007 +1030 TrueType: Include notdef glyph in the subset Required by the TrueType specification. src/cairo-truetype-subset.c | 23 ++++++++++++++++------- 1 files changed, 16 insertions(+), 7 deletions(-) commit d22ba141e6c78bf1fc3dfc02c9aaf6d725233444 Author: Adrian Johnson Date: Sun Feb 4 16:54:57 2007 +1030 TrueType Subsetting: Whitespace change src/cairo-truetype-subset.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit e4a5011a2787bbb7ced338aaff2752aa23ac7892 Author: Adrian Johnson Date: Sun Feb 4 16:51:44 2007 +1030 TrueType Subsetting: Add comment src/cairo-truetype-subset.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit 7d05b9bdd328c7ec0422f45893fa0e0d6e9bb135 Author: Eugeniy Meshcheryakov Date: Sun Feb 4 16:26:18 2007 +1030 TrueType Subsetting: Sort table directory The TrueType specification requires the table directory to be sorted by tag. src/cairo-truetype-subset.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) commit 8b3176158351e62185294d512030c7af1ec4fabc Author: Eugeniy Meshcheryakov Date: Sun Feb 4 16:22:12 2007 +1030 TrueType Subsetting: Correct the checksum calculation of 'head' table Checksum field should be zero before calculating checksum. src/cairo-truetype-subset.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 0bf5e18b14f2bbaf3be3b31c4eb54ea3183f488a Author: Eugeniy Meshcheryakov Date: Sun Feb 4 16:19:05 2007 +1030 TrueType Subsetting : Correct the checksum calculation src/cairo-truetype-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2bd590b64987b7f0eb7310666ac20a8309e32842 Author: Carl Worth Date: Fri Feb 2 16:43:27 2007 -0800 ROADMAP: Note that linear gradient bug is fixed. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ae4f37e0a32c3e231c38434846e80fd90162d888 Author: David Turner Date: Fri Feb 2 10:30:24 2007 +0100 fixing gradient repeat mode computations This fixes the regression of linear gradient as demonstrated by the recently added linear-gradient-reflect test. pixman/src/fbcompose.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit 0b7ba5ccfa21265c1b36919ff08bd3a1f0d1075b Author: T Rowley Date: Fri Feb 2 16:36:12 2007 -0800 Add linear-gradient-reflect test case This testcase works before the e9bef30d2bcdf41c7b7f20b3517839c37e752f75 landing, and has visual artifacts afterwards. test/Makefile.am | 2 + test/linear-gradient-reflect-ref.png | Bin 0 -> 216 bytes test/linear-gradient-reflect.c | 74 ++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 0 deletions(-) commit 1757b49ebda3ec464a442d8c4f5ba39c88c1e3e5 Author: Carl Worth Date: Thu Feb 1 16:17:29 2007 -0800 ROADMAP: Add bug about broken cairo_show_text on win32 ROADMAP | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c621201a41639be8ba9ee735c2859aa117ba4216 Author: Carl Worth Date: Thu Feb 1 16:05:59 2007 -0800 Don't finish a finished surface in cairo_surface_destroy Calling cairo_surface_finish from cairo_surface_destroy was triggering an error due to finish being called twice. The error was usually hidden as the surface would still eventually be destroyed. But it did clutter things up quite badly if a user was trying to break on _cairo_error to track down a problem. Thanks again to Stuart Parmenter for pointing out the problem. src/cairo-surface.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 159359325d4f8306feef6bebabecb31cbf0b9bf5 Author: Carl Worth Date: Thu Feb 1 15:22:27 2007 -0800 Fix crashes in cairo_surface_finish for NULL or nil Thanks to Stuart Parmenter for alerting us of this bug. src/cairo-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 26ef4746e66dccd8e0eb651db3e7f2826c068029 Author: Carl Worth Date: Thu Feb 1 15:21:12 2007 -0800 Add two tests of cairo_surface_finish to test/nil-surface.c This tests calling cairo_surface_finish with either NULL or with a nil surface, (either currently causes a crash). test/nil-surface.c | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit 382e021ccb657ab1e342e0d0eee402ff5eb89e5d Author: Dan Amelang Date: Wed Jan 31 11:53:06 2007 -0800 Add "rectangles" perf test This test draws many small, solid pixel-aligned rectangles one at a time. perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/rectangles.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 0 deletions(-) commit 7abfb39709342fc3d95269ad2d76a5e1e8f8d38f Author: Eugeniy Meshcheryakov Date: Sun Jan 28 19:01:38 2007 +1030 CFF Subsetting: Add charset data to embedded font Current code for subsetting CFF fonts does not write charset information into it. According to spec this means that font have ISOAdobe charset. This charset contains only 228 names (excluding .notdef). This is not enough for subfonts with 256 glyphs and causes bugs when viewing generated PDFs. src/cairo-cff-subset.c | 253 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 252 insertions(+), 1 deletions(-) commit a63ceef06c2c015c8e5f0ad7b756ff6801996096 Author: Carl Worth Date: Fri Jan 26 18:03:18 2007 -0800 Fix _cairo_pattern_acquire_surface_for_surface to not clone outside surface extents Rotation and other transformations would cause extents to be computed which were outside the bounds of the surface to be cloned, (and for non repeating patterns). Now we simply restrict the computed extents to the surface extents. This fixes the xlib failure of the recent rotate-image-surface-paint test, (the apparently distinct ps failure remains). ROADMAP | 2 +- src/cairo-pattern.c | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) commit ebc1cd91f80ee154c02651b2db034a4335ca021c Author: Carl Worth Date: Sat Jan 20 00:50:38 2007 -0800 Add rotate-image-surface-paint test case This test exercises a clone_similar extents bug noticed by Benjamin Otte. As expected, the xlib backend fails due to that bug, (and interestingly, the ps backend is showing a failure as well). test/.gitignore | 1 + test/Makefile.am | 1 + test/rotate-image-surface-paint-pdf-argb32-ref.png | Bin 0 -> 209 bytes test/rotate-image-surface-paint-ref.png | Bin 0 -> 232 bytes test/rotate-image-surface-paint-svg-ref.png | Bin 0 -> 248 bytes test/rotate-image-surface-paint.c | 97 ++++++++++++++++++++ 6 files changed, 99 insertions(+), 0 deletions(-) commit 691f9d1c0c4c98f6e6aa7b2f41fa0b8670e6205d Author: Vladimir Vukicevic Date: Wed Jan 24 17:34:57 2007 -0800 [mmx] avoid casts between int32 and __m64 types The MS compiler doesn't like this; _mm_cvtsi32_si64 and _mm_cvtsi64_si32 must be used. pixman/src/fbmmx.c | 10 ++++------ 1 files changed, 4 insertions(+), 6 deletions(-) commit 8ff70d6b9106b2dc57e903104237285a7062c2f0 Author: Vladimir Vukicevic Date: Wed Jan 24 16:47:48 2007 -0800 [win32] regression with win32 glyph y-offsets (mozbug#365021) src/cairo-win32-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0231d18a57dd31d9d619d53b70e71c1b916e0d75 Author: Vladimir Vukicevic Date: Wed Jan 24 16:46:36 2007 -0800 [atsui] add function prototype for a public 10.4 function that's src/cairo-atsui-font.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 50136a78063137ebca16bcb839bec33e2917824e Author: Eugeniy Meshcheryakov Date: Wed Jan 24 15:51:00 2007 -0500 [PDF-CFF] Fix bad /LastChar value for CFF fonts in PDF backend PDF backend sets /LastChar value in Type1C font dictionary incorrectly. acroread then complains about incorrect /Widths in font. The last char is numchars - 1, since it's zero-based. src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bb02b4e5ec40ac37462f487f2ad74b0123814277 Merge: 48c2896... 3b77512... Author: Michael Emmel Date: Tue Jan 23 22:22:20 2007 -0800 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit 48c2896f694872a55a43e12fc375bde2ce2650a9 Author: Michael Emmel Date: Tue Jan 23 22:17:24 2007 -0800 Turned off acclerated rectangle drawing in dfb backend causes bugs in gtk src/cairo-directfb-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 3b7751279c034caf2f86464cd1936d7ce1736ccc Author: Behdad Esfahbod Date: Mon Jan 22 14:42:48 2007 -0500 [pixman/src/fbmmx.c] Add comment around M64 /* cast to void* in the middle to shut gcc up warning about * "dereferencing type-punned pointers". */ pixman/src/fbmmx.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit c316b7220dcd59653533a487d81c5e3d71729218 Author: Brian Ewins Date: Mon Jan 22 01:13:50 2007 +0000 [ATSUI] Some glyph operations cannot be 'unsupported'. (#9530) The atsui font backend returned the internal 'unsupported' error code for errors in operations that do not have fallbacks. Now that the underlying cause, deleted glyphs, has been fixed, I'm changing the status code returned to the public 'no memory' one; it should be the only condition triggering the failure now. src/cairo-atsui-font.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) commit 49b9f0c082944029af8dab84da87f7746c5f72b9 Author: Brian Ewins Date: Mon Jan 22 01:10:52 2007 +0000 [ATSUI] out-of-range glyphs should be treated as deleted. (#9530) Glyphs outside the range 0x0-0xffff are not valid in atsui, but scaled_glyph stores unsigned long. Ensure that invalid values do not cause errors. src/cairo-atsui-font.c | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) commit 4dfa5d33e451886b05cf767ae5a538e152ec534d Author: Brian Ewins Date: Mon Jan 22 01:09:49 2007 +0000 [ATSUI] Handle deleted glyphs correctly. (#9530) This code ensures that deleted glyphs are not drawn. src/cairo-atsui-font.c | 36 +++++++++++++++++++++++++++++++----- 1 files changed, 31 insertions(+), 5 deletions(-) commit 1a9d3b5185f454a63bc96c2e570c931c3ecabbb5 Author: Behdad Esfahbod Date: Sun Jan 21 15:11:31 2007 -0500 [configure.in] Use AC_MSG_RESULT in PKG_CHECK_MODULES's second branch If PKG_CHECK_MODULES fails, it does not print out any check results and so, no newlines. This is kinda silly, at least in the case that no second branch is provided, but I think that's the way it is, to let users decide what to print. We now just do a AC_MSG_RESULT(no) and continue with what we used to do. Inspired by Tor Lillqvist's similar change in Pango. configure.in | 38 ++++++++++++++++++++++++-------------- 1 files changed, 24 insertions(+), 14 deletions(-) commit 6aa8e80cc722774191c4418c9a2cd434c0538508 Author: Behdad Esfahbod Date: Sun Jan 21 15:06:02 2007 -0500 [pixman/src/fbmmx.c] Hide "dereferencing type-punned pointer" warnings The warning happens all the place when the code converts from ullong to __m64. The way the conversion is done is a C idiom: 1) get a pointer to the value, 2) convert it to the suitable pointer type for the target, 3) dereference it. That is "*(__m64*)(&m)" in this case. This is necessarily (as opposed to just casting to target type) because the two types may not be "compatible" from the compiler's point of view. Example of types that are not compatbile is structs vs anything. The "dereferencing type-punned pointer will break strict-aliasing rules" from gcc exactly means: "some code may be assuming that pointers with different types do not compare equal (or otherwise share the same target object). If you case a pointer to a different type and dereference it, it may happen here." However, in our usecase, it's clear that the compiler cannot make any false assumptions. So we just go ahead and hide it by using a middle cast to "void *". Since the compiler does not many any aliasing assumptions about generic pointers, it will not warn either. (Though the problems if any, will still occure. So this is not an ideal solution to this problem and should be used very carefully, to no hide useful warnings for when things go loose on some weird architecture.) Another solution would have been to use gcc's "may_alias" function attribute, but trying to define a may_alias version of __m64 hit a bug in gcc. That is, try replacing "__m64" with "m64" and define: typedef __m64 m64 __attribute__((may_alias)); and see it fail to compile. This seems to be because of the special vector type that __m64 has. pixman/src/fbmmx.c | 34 ++++++++++++++++++---------------- 1 files changed, 18 insertions(+), 16 deletions(-) commit 1a8d0a33ce589367f0e46006caecb544a3945048 Author: Behdad Esfahbod Date: Sat Jan 20 13:01:35 2007 -0500 PDF: Fix approximate diagonal in recent commit Use x+y as an upper bound for sqrt(x*x+y*y), not x*y. src/cairo-pdf-surface.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 1e52ce5a0981aac72452f1f7d7988e6382b0abcc Author: Carl Worth Date: Sat Jan 20 03:20:30 2007 -0800 doc tmpl churn doc/public/tmpl/cairo.sgml | 11 ----------- 1 files changed, 0 insertions(+), 11 deletions(-) commit 53358ddc73b985b5cf6493dc48c54073fd7c59fc Author: Carl Worth Date: Sat Jan 20 03:20:18 2007 -0800 configure.in: Increment version to 1.3.13 after making the 1.3.12 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c34a1a75fdb886b7a69875fb92d30c6dfd9d39cb Author: Carl Worth Date: Sat Jan 20 03:04:31 2007 -0800 configure.in: Increment cairo version to 1.3.12 configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 26e6c73aab3fbfb4e2c893b4064cd8e85dc25346 Author: Carl Worth Date: Sat Jan 20 02:58:15 2007 -0800 NEWS: Add notes for 1.3.12 snapshot NEWS | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 93 insertions(+), 0 deletions(-) commit 87b3ac10af6b18d57236ae7e595e84e11e12eaad Author: Carl Worth Date: Sat Jan 20 02:01:29 2007 -0800 cairo-wideint: Fix to eliminate comparison of signed and unsigned values src/cairo-wideint.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit d6bb0d772018809caaa215d562292c8aeb2990d3 Author: Carl Worth Date: Sat Jan 20 01:47:06 2007 -0800 .gitignore: Add text-glyph-range test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit b06222b99091796486cc0f938dd7487c66dd8420 Author: Carl Worth Date: Sat Jan 20 00:56:07 2007 -0800 ROADMAP: Add 3 bugs to fix before the next snapshot ROADMAP | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 6c40575a225e3d6d138adae9d492881b8358f881 Author: Carl Worth Date: Fri Jan 19 23:23:32 2007 -0800 Fix two misspellings in a recent comment. src/cairo-pdf-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 5f9d70a56158e468683dba953d6eaceea4dfd644 Author: Carl Worth Date: Fri Jan 19 23:11:09 2007 -0800 PDF: Fix CAIRO_EXTEND_NONE for source surface patterns The former workaround for the lack of non-repeating patterns in PDF (as far as we can tell) was broken for a source pattern matrix that resulted in scaling the source surface pattern down. This was demonstrated by the failure of the scale-down-source-surface-paint test which now passes. The old code would have also allowed for bogus repeated pattern instances to appear if the source surface pattern was translated sufficiently far off the destination surface in just the right direction. This bug is also fixed. src/cairo-pdf-surface.c | 41 +++++++++++++++++++++++++++++++++-------- 1 files changed, 33 insertions(+), 8 deletions(-) commit 2f6d184e6659e91909ed933d36bef441f1b5df4d Author: Kalle Vahlman Date: Sat Jan 13 12:36:03 2007 +0200 Add --use-ms option to cairo-perf-diff-files This allows for comparing perf files generation on different hardware platforms, (since the ticks can be very different on different hardware). perf/cairo-perf-diff-files.c | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) commit 8354906381b2ccc3211214bad55c1f505d3dce3a Author: M Joonas Pihlaja Date: Sat Dec 16 22:21:36 2006 +0200 Make UTF-8 output from cairo-perf-diff-files optional This patch adds options to disable the UTF-8 change bars and replace them with ASCII '*' gfx. The motivation is that UTF-8 really does some damage to some terminals, and some always forget to pipe stuff through a pager to make it safe. The new options for cairo-perf-diff-files are: --no-utf --no-bars perf/cairo-perf-diff-files.c | 135 ++++++++++++++++++++++++++++++------------ 1 files changed, 98 insertions(+), 37 deletions(-) commit d91d5d12f3a40beebefcd8a5d8b912f5492e112b Author: Carl Worth Date: Fri Jan 19 15:52:06 2007 -0800 Add new scale-down-source-surface-paint test This new test case demonstrates a bug in the PDF backend, (source surface patterns are repeated even with a pattern extend of NONE). Thanks to Romuald and Claudio Saavedra for pointing out the bug. test/.gitignore | 1 + test/Makefile.am | 2 + test/scale-down-source-surface-paint-ref.png | Bin 0 -> 133 bytes test/scale-down-source-surface-paint.c | 72 ++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 0 deletions(-) commit d08502d939b44956591f2865a73264713427194b Merge: eefcfbf... 28d6a22... Author: Vladimir Vukicevic Date: Thu Jan 18 16:50:41 2007 -0800 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo commit eefcfbf5a168569518a8dcf099b5f41b570f504b Author: Vladimir Vukicevic Date: Thu Jan 18 16:49:42 2007 -0800 [nquartz] add test reference files for nquartz backend test/caps-joins-alpha-nquartz-ref.png | Bin 0 -> 2466 bytes test/clip-nesting-nquartz-ref.png | Bin 0 -> 1067 bytes test/clip-nesting-nquartz-rgb24-ref.png | Bin 0 -> 956 bytes test/clip-push-group-nquartz-ref.png | Bin 0 -> 203 bytes test/clip-twice-nquartz-ref.png | Bin 0 -> 1171 bytes test/clip-twice-nquartz-rgb24-ref.png | Bin 0 -> 1111 bytes test/dash-caps-joins-nquartz-ref.png | Bin 0 -> 4727 bytes test/degenerate-path-nquartz-rgb24-ref.png | Bin 0 -> 188 bytes test/fill-and-stroke-alpha-add-nquartz-ref.png | Bin 0 -> 603 bytes test/fill-and-stroke-alpha-nquartz-ref.png | Bin 0 -> 550 bytes test/fill-and-stroke-nquartz-ref.png | Bin 0 -> 286 bytes test/fill-and-stroke-nquartz-rgb24-ref.png | Bin 0 -> 264 bytes test/fill-degenerate-sort-order-nquartz-ref.png | Bin 0 -> 2470 bytes ...ill-degenerate-sort-order-nquartz-rgb24-ref.png | Bin 0 -> 2098 bytes test/fill-rule-nquartz-ref.png | Bin 0 -> 2079 bytes test/fill-rule-nquartz-rgb24-ref.png | Bin 0 -> 1790 bytes test/new-sub-path-nquartz-ref.png | Bin 0 -> 386 bytes test/new-sub-path-nquartz-rgb24-ref.png | Bin 0 -> 357 bytes test/operator-clear-nquartz-ref.png | Bin 0 -> 1195 bytes test/operator-clear-nquartz-rgb24-ref.png | Bin 0 -> 1244 bytes test/random-intersections-nquartz-ref.png | Bin 0 -> 203877 bytes test/random-intersections-nquartz-rgb24-ref.png | Bin 0 -> 179204 bytes test/rel-path-nquartz-ref.png | Bin 0 -> 212 bytes test/rel-path-nquartz-rgb24-ref.png | Bin 0 -> 228 bytes test/source-clip-scale-nquartz-ref.png | Bin 0 -> 148 bytes test/trap-clip-nquartz-ref.png | Bin 0 -> 5814 bytes test/trap-clip-nquartz-rgb24-ref.png | Bin 0 -> 5385 bytes 27 files changed, 0 insertions(+), 0 deletions(-) commit 7b67c20a013ed45a10676cb129794ccfb66dc04c Author: Vladimir Vukicevic Date: Thu Jan 18 16:49:14 2007 -0800 [nquartz] use pattern snapshots, and correctly setup/teardown source Use a snapshot for the pattern, to avoid the pattern being freed undreneath us before we actually render (as when rendering to a CG PDF context). Also correctly return UNSUPPORTED from setup source, avoiding brokenness when the source isn't torn down correctly. src/cairo-nquartz-surface.c | 81 ++++++++++++++++++++++++++++++++++++------- 1 files changed, 68 insertions(+), 13 deletions(-) commit 28d6a228f030dbec05ab5b0ba680db272df67c49 Author: Carl Worth Date: Thu Jan 18 13:01:53 2007 -0800 Fix cairo_get_dash and cairo_get_dash_count APIs Make these functions consistent with other cairo_get functions by making cairo_get_dash_count return the count directly, and removing the cairo_status_t return value from cairo_get_dash. src/cairo.c | 37 +++++++++++-------------------------- src/cairo.h | 6 +++--- test/get-and-set.c | 17 ++++++----------- 3 files changed, 20 insertions(+), 40 deletions(-) commit bc7072064e421e4c5e5043aada6cae1d8250938f Author: Carl Worth Date: Wed Jan 17 15:07:12 2007 -0800 cairo-path-fixed: Don't add redundant, succesive MOVE_TO operations to the path Instead, we can simply tweak the argument value for the last MOVE_TO operation that's already at the end of the path. This helps backends like pdf that are currently emitting all of the redundant MOVE_TO operations in the output. src/cairo-path-fixed.c | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit d9df44d8071d038060e0cc987871c185f7733a3d Merge: 4e1c2b1... b02b86d... Author: Vladimir Vukicevic Date: Wed Jan 17 15:08:21 2007 -0800 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo commit 4e1c2b1ad84a695662dea9fbe60a975c928eb277 Author: Robert O'Callahan Date: Wed Jan 17 15:07:31 2007 -0800 Rename cairo_copy_clip_rectangles to cairo_copy_clip_rectangle_list src/cairo-clip-private.h | 2 +- src/cairo-clip.c | 2 +- src/cairo-gstate.c | 4 ++-- src/cairo.c | 6 +++--- src/cairo.h | 2 +- src/cairoint.h | 2 +- test/get-clip.c | 26 +++++++++++++------------- 7 files changed, 22 insertions(+), 22 deletions(-) commit b02b86da5c6c82f9b653698f8480855a35777155 Author: Adrian Johnson Date: Sun Sep 24 00:55:20 2006 +0930 PDF: Compress the content stream Use cairo-deflate-stream to compress all content streams emitted by the PDF surface. src/cairo-pdf-surface.c | 32 +++++++++++++++++++++++++++++--- 1 files changed, 29 insertions(+), 3 deletions(-) commit 7f246462eb3cc2576387755fa2d554394e86225c Author: Adrian Johnson Date: Sun Sep 24 00:52:01 2006 +0930 Add cairo-deflate-stream.c Add a new stream type that compresses the stream using the zlib deflate method. This is intended for use by the PDF surface. src/Makefile.am | 1 + src/cairo-deflate-stream.c | 142 +++++++++++++++++++++++++++++++++++++ src/cairo-output-stream-private.h | 4 + 3 files changed, 147 insertions(+), 0 deletions(-) commit b3440e85305af4f5ceef9437af7c26d3232dc55a Author: Adrian Johnson Date: Sun Sep 24 00:48:36 2006 +0930 PDF: Use Td where possible instead of Tm for positioning glyphs This avoids emitting the font matrix for every single glyph. src/cairo-pdf-surface.c | 38 ++++++++++++++++++++++++++------------ 1 files changed, 26 insertions(+), 12 deletions(-) commit 5c2136ea7c3aea1ae90b46b0dd645a4e1b5cc9a1 Author: Dan Williams Date: Wed Jan 17 15:47:24 2007 -0500 Implement pixman fbCompositeSrc_8888x0565mmx MMX-accelerate for fbCompositeSrc_8888x0565. Upstream X bug for the same issue: http://bugs.freedesktop.org/show_bug.cgi?id=9682 pixman/src/fbmmx.c | 122 +++++++++++++++++++++++++++++++++++++++++++++ pixman/src/fbmmx.h | 13 +++++ pixman/src/fbpict.c | 14 +++++- pixman/src/pixman-remap.h | 1 + 4 files changed, 148 insertions(+), 2 deletions(-) commit a2ec383ff128617d33efa5760ec4b5f9688e8a13 Author: Pavel Roskin Date: Sun Aug 13 01:57:56 2006 -0400 Clean up _fbOnes() The implementation of _FbOnes in iccolor.c would not work on 64-bit longs correctly. Fortunately, it's only used on integers, so make it explicit in the declaration. Use an inline function for the gcc builtin implementation to make sure that it's never used with arguments of incorrect size. There is no __INT_MIN__ in gcc 4.1.1, but it's not an issue now because the argument is 32-bit. Signed-off-by: Pavel Roskin pixman/src/iccolor.c | 4 ++-- pixman/src/icint.h | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) commit 9e332eadad00e115fdcdbc816608a0537f5a9b9c Author: Brian Ewins Date: Tue Jan 16 01:25:53 2007 +0000 [test] Test handling of out-of-range glyph indexes. (#9530) Adds a test for missing and out-of-range glyph indexes. The expected ATSUI renderings are added as references, please replace these with FT renderings when they become available. test/Makefile.am | 4 + test/text-glyph-range-ref.png | Bin 0 -> 1810 bytes test/text-glyph-range-rgb24-ref.png | Bin 0 -> 1645 bytes test/text-glyph-range.c | 133 +++++++++++++++++++++++++++++++++++ 4 files changed, 137 insertions(+), 0 deletions(-) commit 9cabf5b5f7dd840f91b5be29567cf11cf40fc998 Author: Behdad Esfahbod Date: Mon Jan 15 00:26:20 2007 -0500 [TODO] Move some items from ROADMAP, and some new ones, into TODO ROADMAP | 17 ----------------- TODO | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 23 deletions(-) commit 1002d016834926a771aa0a6cc4bdf83cb009173a Author: Kjartan Maraas Date: Thu Jan 11 17:59:16 2007 -0500 Remove unused variables (#7963) src/cairo-pdf-surface.c | 3 +-- src/cairo-ps-surface.c | 3 +-- src/cairo-svg-surface.c | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) commit eff6d3c7a013476a7e4cf56c05ad95c9f01fe793 Author: Behdad Esfahbod Date: Sun Dec 17 15:49:50 2006 -0500 [cairo-type1-subset] Do not use an array of pointers, to reduce .data size We use a string pool plus lookup indices tables now, generated by perl code embedded before the tables. The table in question is the default PS encoding table, so no changes are expected in the future. src/cairo-type1-subset.c | 107 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 105 insertions(+), 2 deletions(-) commit cf1d95e714d0814e52910c4306d090ef6d989093 Author: Soeren Sandmann Date: Tue Jan 9 15:05:29 2007 -0800 Add SRC and IN implementations to avoid CompositeGeneral in some cases hit by PDF rendering The patch implements a few more operations with special cases MMX code. On my laptop, applying the patch to cairo speeds up the benchmark (rendering page 14 of a PDF file[*]) from 20.9 seconds to 14.9 seconds, which is an improvement of 28.6%. [*] http://people.redhat.com/jakub/prelink.pdf This also benefits the recently added unaligned_clip perf case: image-rgb unaligned_clip-100 0.11 -> 0.06: 1.65x speedup ▋ image-rgba unaligned_clip-100 0.11 -> 0.06: 1.64x speedup ▋ pixman/src/fbmmx.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++ pixman/src/fbmmx.h | 43 ++++++++++ pixman/src/fbpict.c | 98 ++++++++++++++++++++++- 3 files changed, 366 insertions(+), 1 deletions(-) commit d5531c4f506caa9ad66fbeef1822a7036d4dd528 Author: Carl Worth Date: Tue Jan 9 14:27:32 2007 -0800 Add unaligned_clip perf case courtesy of Jeff Muizelaar Conflicts: perf/Makefile.am perf/cairo-perf.c perf/cairo-perf.h perf/Makefile.am | 9 +++--- perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/unaligned-clip.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 4 deletions(-) commit 504cbdae37232d65f5c1f8913e55ac63397ad4f0 Author: Brian Ewins Date: Thu Jan 4 03:12:53 2007 +0000 [ATSUI] [2/2] Implement CAIRO_SCALED_GLYPH_INFO_SURFACE support.(#9467) All non-quartz surfaces need to fall back to using glyph surfaces, in order to clip correctly. This second patch implements glyph surface support, correcting the unclipped text seen in the clip-operator test. src/cairo-atsui-font.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 111 insertions(+), 2 deletions(-) commit 77171cb8e23704db3eeddfe92cc4e0e83d02b36b Author: Brian Ewins Date: Thu Jan 4 02:16:47 2007 +0000 [ATSUI] [1/2] Implement CAIRO_SCALED_GLYPH_INFO_SURFACE support.(#9467) All non-quartz surfaces need to fall back to using glyph surfaces, in order to clip correctly. The bug being fixed is visible in the clip-operator test. This first patch takes out direct rendering support for non-quartz surfaces, causing all image tests to fail. src/cairo-atsui-font.c | 77 +++++++++++++++++++++++++++-------------------- 1 files changed, 44 insertions(+), 33 deletions(-) commit 116ae23fc64a8477a116bd6f3b60c7b5404af1c5 Author: Jinghua Luo Date: Mon Jan 8 16:51:28 2007 +0800 Glitz: position large glyph correctly. I introduced this bug while fixing test glyph-cache-pressure (commit 3b1d0d3519a7d0328f897927d3534f10750d30db). I also changed GLYPH_CACHE_MAX_HEIGHT and GLYPH_CACHE_MAX_HEIGHT to 96, then we still can cache at least 28 glyphes per font(512 ^ 2 / 96 ^ 2). This make us not hit slow path too much and improve performance a lot. src/cairo-glitz-surface.c | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) commit aed4029a104d22cbd363ab9e365320980d22bc86 Author: Brian Ewins Date: Thu Jan 4 02:13:05 2007 +0000 [ATSUI] Refactor code for creating CGBitmapContexts from cairo surfaces. No changes to test output. This just prepares code for reuse when implementing support for CAIRO_SCALED_GLYPH_INFO_SURFACE. src/cairo-atsui-font.c | 85 +++++++++++++++++++++++++++--------------------- 1 files changed, 48 insertions(+), 37 deletions(-) commit 9a005c6221cc279e65d94956c74028a84baf1716 Author: Brian Ewins Date: Thu Jan 4 02:09:16 2007 +0000 [ATSUI] correct the rotation of glyph paths. (#9378) This fixes a bug visible in the text-rotate test when CAIRO_TEST_GENERATE_REFERENCE_IMAGE is defined. src/cairo-atsui-font.c | 92 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 65 insertions(+), 27 deletions(-) commit 58265f3508959298eabab55ec28dc6d9516eedc3 Author: Brian Ewins Date: Thu Jan 4 05:54:52 2007 +0000 [ATSUI] Select Bitstream Vera and CSS font families reliably. Previously the code selected using the family name; this intermittently selected a bold or italic face instead of the regular one. The new approach is to select the desired font instance directly if possible, and only use the family lookup if that fails. This isn't 100% correct but should always provide the correct font instance for CSS generic font families. The bug was sometimes reproducible with the select-font-face test. src/cairo-atsui-font.c | 56 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 40 insertions(+), 16 deletions(-) commit 22e271d687ad871a4e8a069ee2945c42062c1cb4 Author: Brian Ewins Date: Thu Jan 4 15:06:48 2007 +0000 [perf/cairo-perf-diff] Pass CAIRO_AUTOGEN_OPTIONS to autogen. Makes it was possible to run cairo-perf-diff with different configurations, eg with quartz enabled. perf/cairo-perf-diff | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit d30b1bf157126668c4309731022b2ded2ad09571 Author: Brian Ewins Date: Thu Jan 4 01:36:32 2007 +0000 [ATSUI] Scale glyphs using _cairo_matrix_compute_scale_factor (#9350) This bug shows up in the text-rotate test. src/cairo-atsui-font.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) commit ded08256ef7fdc9e9468342cf5635c5e99d4d64d Author: Behdad Esfahbod Date: Sun Jan 7 02:08:15 2007 -0500 Spell check the docs doc/public/tmpl/cairo-version.sgml | 10 +++++----- src/cairo-array.c | 2 +- src/cairo-cache.c | 12 ++++++------ src/cairo-font-options.c | 6 +++--- src/cairo-ft-font.c | 6 +++--- src/cairo-gstate.c | 4 ++-- src/cairo-image-surface.c | 4 ++-- src/cairo-lzw.c | 2 +- src/cairo-meta-surface.c | 2 +- src/cairo-path-stroke.c | 4 ++-- src/cairo-pattern.c | 10 +++++----- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 4 ++-- src/cairo-scaled-font.c | 4 ++-- src/cairo-surface.c | 2 +- src/cairo-type1-fallback.c | 4 ++-- src/cairo-unicode.c | 4 ++-- src/cairo-wideint.c | 2 +- src/cairo-win32-surface.c | 4 ++-- 19 files changed, 44 insertions(+), 44 deletions(-) commit caa3c2e1e7901031488f5dae243a755a4e4daec9 Author: Alp Toker Date: Sun Jan 7 02:03:30 2007 +0000 Fix various code/comment typos pixman/src/pixregion.c | 2 +- src/cairo-matrix.c | 2 +- src/cairo-pdf-surface.c | 20 ++++++++++---------- src/cairo-win32-surface.c | 2 +- src/cairo-xcb-surface.c | 4 ++-- src/cairo-xlib-surface.c | 10 +++++----- 6 files changed, 20 insertions(+), 20 deletions(-) commit c96a71e709e537f690da6d4a184aa4c64fe11028 Author: Carl Worth Date: Fri Jan 5 15:56:06 2007 -0800 Restrict _clip_and_composite_trapezoids to destination extents This is a fix for a huge performance bug (as measured by perf/long-lines). Previously, if no explicit clip was set, _clip_and_composite_trapezoids would allocate a mask as large as the trapezoids and rasterize into it. With this fix, it restricts the mask by the extents of the destination surface. This doesn't address the identical performance problem with the xlib backend, which is due to a very similar bug in the X server. image-rgb long-lines-uncropped-100 465.42 -> 5.03: 92.66x speedup █████████████████████████████████████████████▉ image-rgba long-lines-uncropped-100 460.80 -> 5.02: 91.87x speedup █████████████████████████████████████████████■src/cairo-surface-fallback.c | 28 ++++++++++++++++++---------- 1 files changed, 18 insertions(+), 10 deletions(-) commit cc11c264ec0c7d6586c9349bcdbe3f4156e7ab6e Author: Carl Worth Date: Wed Jan 3 16:27:52 2007 -0800 Add long-lines perf case This shows some very bad slowness for lines that are mostly offscreen (like 100x slower than just drawing the visible portion). perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/long-lines.c | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 120 insertions(+), 0 deletions(-) commit 11dd9eab693297961b988a73e22bf4d5850eb485 Author: Behdad Esfahbod Date: Thu Jan 4 23:35:51 2007 -0500 [src/Makefile.am] Don't remove cairo-features.h in "make clean" That's generated by configure, so it should be removed by "make distclean". src/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit d4a58b2437a21794562d874f3d390e0e59688bc0 Author: Jonathan Watt Date: Thu Jan 4 16:46:22 2007 +0100 Remove WINVER from public header file src/cairo-win32-surface.c | 10 ++++++++++ src/cairo-win32.h | 10 ---------- 2 files changed, 10 insertions(+), 10 deletions(-) commit e6369f9478e84e32ca19d5f204dbe3eee828c429 Author: Peter Weilbacher Date: Thu Jan 4 00:11:44 2007 +0100 Fix for OS/2 display drivers that cannot handle 32bit output (feed them a 24bit buffer instead). src/cairo-os2-surface.c | 70 ++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 60 insertions(+), 10 deletions(-) commit 26b06516a77fbbe88f2eb081e2763c1434959137 Author: Dan Amelang Date: Sat Dec 30 21:14:14 2006 -0800 Use the "-" option (instead of "-a") when calling "strings" This is needed to fix the AX_C_FLOAT_WORDS_BIGENDIAN macro on Mac OS X 10.2, which was brought up here: https://bugs.freedesktop.org/show_bug.cgi?id=9124 acinclude.m4 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit eafd6e454a85c807f2addf7768046fea58aea3f9 Author: Behdad Esfahbod Date: Thu Dec 28 20:01:18 2006 -0500 In _cairo_scaled_font_text_to_glyphs, bail if text is zero-length (#5177) src/cairo-scaled-font.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit ab29396ef9f68f5534f927b2b5bb0a7ffac86509 Author: Behdad Esfahbod Date: Thu Dec 28 19:51:20 2006 -0500 [test] Add new test text-zero-len (#5177) The test passes an empty string to cairo_show_text, cairo_text_path, and cairo_text_extents, and NULL and an invalid pointer, with zero num_glyphs to cairo_show_glyphs, cairo_glyph_path, and cairo_glyph_extents. test/.gitignore | 1 + test/Makefile.am | 2 + test/text-zero-len-ref.png | Bin 0 -> 130 bytes test/text-zero-len.c | 88 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 0 deletions(-) commit 2d30161e8922e66b276341810c21ce1b740f6699 Author: Jinghua Luo Date: Sun Dec 24 18:31:02 2006 +0800 glitz: fix all compiler warnings in glitz backend. src/cairo-glitz-surface.c | 31 +++++++++++++++++++++++-------- 1 files changed, 23 insertions(+), 8 deletions(-) commit 8fd7328ebb77b0a641cf30bded85e482ea63ad97 Author: Behdad Esfahbod Date: Sat Dec 23 17:08:04 2006 -0500 Don't call into backends if num_glyphs is zero (#5177) Just return success in _cairo_scaled_font_show_glyphs() and _cairo_surface_show_glyphs() if num_glyphs is zero. src/cairo-scaled-font.c | 3 +++ src/cairo-surface.c | 3 +++ 2 files changed, 6 insertions(+), 0 deletions(-) commit 3212fc4f0fcc66ec3a93994f253c1477eb434572 Author: Behdad Esfahbod Date: Sat Dec 23 16:55:44 2006 -0500 [cairo-scaled-font] Skip invisible glyphs (like space) in glyph_extents() (#9422) When computing extents for an array of glyphs, just taking min/max of x/y for the bounding box of each glyph doesn't work. The reason being that an invisible glyph (like the space glyph) should not modify the resulting extents, but it will. So now we skip invisible glyphs. src/cairo-scaled-font.c | 58 +++++++++++++++++++++++++++++----------------- 1 files changed, 36 insertions(+), 22 deletions(-) commit 8368fa2fcfcf851b9a5b070d22905472f1f76234 Author: Brian Ewins Date: Sat Dec 23 15:44:16 2006 -0500 [test/text-rotate] Use the same text for measuring and printing test/text-rotate.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 261d6b805c77dacb27d29d054e48ed548f1fbcc5 Author: Brian Ewins Date: Sat Dec 23 15:33:52 2006 -0500 [ATSUI] Compute glyph extents from the bounding boxes of their paths (#9350) src/cairo-atsui-font.c | 156 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 116 insertions(+), 40 deletions(-) commit ee01bd9e173b6d36d6255553d0fcf1b54027dffd Author: Carl Worth Date: Sat Dec 23 00:47:40 2006 -0800 Bump version to 1.3.11 after making 1.3.10 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b35cfde7f0e2896ccc1453f9716cb9b61c42cf94 Author: Carl Worth Date: Sat Dec 23 00:35:14 2006 -0800 Increment cairo version to 1.3.10 (and libtool versioning to 12:3:10) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit d6895af9f165a033fc7e53233994a0885c2f817f Author: Carl Worth Date: Sat Dec 23 00:29:21 2006 -0800 NEWS: Add notes for 1.3.10 snapshot NEWS | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 59 insertions(+), 0 deletions(-) commit f46fcd1847031b46a73780177f9cb16033169a44 Author: Carl Worth Date: Sat Dec 23 00:29:01 2006 -0800 Annoying template churn doc/public/tmpl/cairo-text.sgml | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit c08bd4ec377c6b97c9edb75a25101beb9568fd5e Author: Carl Worth Date: Sat Dec 23 00:03:31 2006 -0800 Ignore another test case binary test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit ba531642f79d492ecbad8f086f1e44b56e157e36 Author: Carl Worth Date: Tue Dec 19 21:34:16 2006 -0800 Add optimization for rectilinear stroke This custom stroking code allows backends to use optimized region-based drawing operations for rectilinear strokes. This results in a 5-25x performance improvement when drawing rectilinear shapes: image-rgb box-outline-stroke-100 0.18 -> 0.01: 25.58x speedup ████████████████████████▋ image-rgba box-outline-stroke-100 0.18 -> 0.01: 25.57x speedup ████████████████████████▋ xlib-rgb box-outline-stroke-100 0.49 -> 0.06: 8.67x speedup ███████▋ xlib-rgba box-outline-stroke-100 0.22 -> 0.04: 5.39x speedup ████■In other words, using cairo_stroke instead of cairo_fill to draw the same shape was 5-15x slower before, but is 1.2-2x faster now. src/cairo-path-fixed-private.h | 3 +- src/cairo-path-fixed.c | 4 + src/cairo-path-stroke.c | 318 +++++++++++++++++++++++- src/cairo.c | 11 +- test/ft-text-vertical-layout-type3-ref.png | Bin 3933 -> 3934 bytes test/ft-text-vertical-layout-type3-svg-ref.png | Bin 3956 -> 3957 bytes 6 files changed, 329 insertions(+), 7 deletions(-) commit b1189118532a1fe93e126843af739809d38a62bd Author: Carl Worth Date: Fri Dec 22 17:11:08 2006 -0800 Put ft-text-vertical-layout-type1 back on the XFAIL list I must not have the right font available, (test result is coming out looking like the result of ft-text-vertical-layout-type3, Vera?). We should switch this test to load a bundled font, (should do that for all font-using tests, too). test/Makefile.am | 1 + test/ft-text-vertical-layout-type1.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) commit 7b1509f4f37118d14bd5d70365d1608ead5e2819 Author: Carl Worth Date: Tue Dec 19 13:13:11 2006 -0800 Reimplement path.has_current point as a 1-bit bitfield src/cairo-path-fixed-private.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9d2d3b95e359cd2829c8d02a378dbfec2065e832 Author: Carl Worth Date: Thu Dec 21 08:20:20 2006 -0800 Add new rectilinear-stroke test This is in preparation for an optimized implementation of cairo_stroke for rectilinear paths. test/.gitignore | 1 + test/Makefile.am | 2 + test/rectilinear-stroke-ref.png | Bin 0 -> 213 bytes test/rectilinear-stroke.c | 138 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 0 deletions(-) commit 39ce31ade64e1c3b9e5880134ab77ca96f48f1b9 Author: Jinghua Luo Date: Fri Dec 22 22:05:20 2006 +0800 Glitz: fix a potential use after free bug in _cairo_glitz_surface_old_show_glyphs. There is a race condition between glyph unlocking and glyph cache thawing. Moving down _cairo_scaled_font_thaw_cache a few lines fixes the problem and make crashes go away. src/cairo-glitz-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 344901a1a128b7e843c3bff0a4a12c36be7acbc8 Author: Behdad Esfahbod Date: Wed Dec 20 18:03:33 2006 -0500 [test] Fix typo in test comment, again test/ft-text-vertical-layout-type1.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 473ae3aa9510b750f54cbf889180e3c4784da1b7 Author: Carl Worth Date: Mon Dec 18 17:00:17 2006 -0800 Rename remaining cairo_path_data to cairo_path in function names, etc. src/cairo-path-private.h | 19 ++-- src/cairo-path.c | 237 +++++++++++++++++++++++----------------------- src/cairo.c | 10 +- 3 files changed, 134 insertions(+), 132 deletions(-) commit def0e6d41d1a9108693db112f95d76bb6cfd0aaa Author: Carl Worth Date: Mon Dec 18 16:37:53 2006 -0800 Rename cairo-path-data.c to cairo-path.c (and similar) src/Makefile.am | 4 +- src/cairo-path-data-private.h | 58 ----- src/cairo-path-data.c | 497 ----------------------------------------- src/cairo-path-private.h | 58 +++++ src/cairo-path.c | 497 +++++++++++++++++++++++++++++++++++++++++ src/cairo.c | 2 +- 6 files changed, 558 insertions(+), 558 deletions(-) commit 13c143bb52cab62a7a857a38a8463a8fa56f4632 Author: Carl Worth Date: Mon Dec 18 16:33:32 2006 -0800 Rename cairo-path.c to cairo-path-fixed.c src/Makefile.am | 2 +- src/cairo-path-fixed.c | 639 ++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-path.c | 639 ------------------------------------------------ 3 files changed, 640 insertions(+), 640 deletions(-) commit 267afe7be398db4ab90956660828ed25cfd19acf Author: Carl Worth Date: Mon Dec 18 16:05:42 2006 -0800 test/.gitignore: Ignore binarries for some recently added tests test/.gitignore | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit f3b9f486cd763c7805ec041319817cfb8c51128a Author: Brian Ewins Date: Sun Dec 17 22:26:02 2006 -0500 [ATSUI] Use screen metrics instead of ideal metrics to compute glyph extents The glyph extent computation was totally busted. It was using "logical" extents and it was not correctly handling rotations, etc. It all looks a lot better now. src/cairo-atsui-font.c | 32 +++++++++++++++++--------------- 1 files changed, 17 insertions(+), 15 deletions(-) commit c6ec6ed696f55f65abbcfccb1e9d2c5678cf491a Author: Behdad Esfahbod Date: Sun Dec 17 18:42:05 2006 -0500 [tests/ft-text-vertical-layout-type3] Remove comment that this emits Type3 font This test used to be named -truetype, which reflected the type of font used in the test, in contrast to the -type1 test that uses a Type1 font. However, we renamed this test to -type3 to emphasize the fact that a TrueType subset is not emitted for vertical fonts and a Type3 fallback font is generated. Now things have changed: we try generating a Type1 fallback font which is what is happening for this test. Moreover, the -typ1 test also is generating a Type1 fallback font since the Type1 subset font is not useful for vertical fonts. test/ft-text-vertical-layout-type3.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 50efd71935d0aa8d5b780b3ea2c3fd4c5333ca82 Author: Behdad Esfahbod Date: Sun Dec 17 18:35:16 2006 -0500 [type1-subset] Return UNSUPPORTED for vertical fonts This fixes the last problem with vertical fonts in PS/PDF. As such, remove ft-text-vertical-layout-type1 test from XFAIL and add PS-specific ref image to pass. src/cairo-type1-subset.c | 3 +++ test/Makefile.am | 2 +- ...ft-text-vertical-layout-type1-ps-argb32-ref.png | Bin 0 -> 1877 bytes 3 files changed, 4 insertions(+), 1 deletions(-) commit 207e38e8ba009a5e4d7994ee490d478c6a695336 Author: Behdad Esfahbod Date: Sun Dec 17 18:25:48 2006 -0500 [PS] Fix typo in comment emitted for Type1 fallback font subsets src/cairo-ps-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0bea2ce7f7e9c4b46d1125b07ed719fbb8b7102c Author: Behdad Esfahbod Date: Sun Dec 17 14:31:39 2006 -0500 [pdiff] Define _GNU_SOURCE to get correct symbols out of math.h does not define __USE_ISOC99 otherwise. test/pdiff/pdiff.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2ca6a767ee067742205ee76f891e36c8ec36135e Author: Behdad Esfahbod Date: Sun Dec 17 14:24:57 2006 -0500 [pdiff] Don't use float math functions if not using gcc with C99 The float version of many math functions were introduced in C99, and were causing compile failure on systems like OS X. We now define them to their double variant if __USE_ISOC99 is not defined. We may want to expand it later to cover non-gcc compilers too, but since this is pdiff only, it's not really important. test/pdiff/pdiff.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit 0d9b2d041578c183b026b90c3760ce8dc59e2834 Author: Behdad Esfahbod Date: Sun Dec 17 14:09:15 2006 -0500 [configure] Use AC_C_INLINE to correctly define inline Previously we were defining a symbol INLINE and use that in one place, while other places were using straight inline. With the AC_C_INLINE macro we can just leave it to autoconf to correctly choose what inline should be defined to. configure.in | 1 + src/cairo-png.c | 2 +- src/cairoint.h | 7 +------ 3 files changed, 3 insertions(+), 7 deletions(-) commit 294d1a3c4e1865763ba1c9ac8d55827cd470280b Author: Behdad Esfahbod Date: Sun Dec 17 01:06:16 2006 -0500 [test] Add ft-text-vertical-layout-type3-ps-argb32-ref.png The PS output for ft-text-vertical-layout-type3 looks correct, except for some antialiasing mismatch. Ading ref image to fix this, and so, remove the test from XFAIL. test/Makefile.am | 4 ++-- ...ft-text-vertical-layout-type3-ps-argb32-ref.png | Bin 0 -> 1879 bytes 2 files changed, 2 insertions(+), 2 deletions(-) commit cab3f84ad334050739e6fa05e8dbc2a7dcb9eca7 Author: Behdad Esfahbod Date: Sat Dec 16 18:48:59 2006 -0500 [test] Fix typo in test comment test/ft-text-vertical-layout-type1.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 46add53973de5ba4ae4d6d02d1dd87e5487336c3 Author: Behdad Esfahbod Date: Sat Dec 16 18:46:54 2006 -0500 [cairo-gstate] Don't bypass glyph transformation if font_matrix has translation (#9365) We have tests for this (ft-text-vertical-*), but unfortunately they didn't prevent the regression here because they have been marked XFAIL, since we didn't quite fix them for PS. src/cairo-gstate.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 57589a90490f9bb9e4926c0b138eb95f16db374b Author: Behdad Esfahbod Date: Sat Dec 16 18:18:47 2006 -0500 [pdiff] Use CAIRO_CFLAGS, to make sure warnings are enabled test/pdiff/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8f2ad0affd4fe4821992e87487bc2737e9c538e5 Author: Behdad Esfahbod Date: Sat Dec 16 18:16:46 2006 -0500 [pdiff] Fix compiler warnings, that were causing crashes test/pdiff/pdiff.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit be6edd64a3f45f7fb33f7d57b71b1ef467b474e1 Author: Brian Ewins Date: Sat Dec 16 15:43:46 2006 -0500 [ATSUI] Round glyph locations to nearest pixel This is what cairo_scaled_font_show_glyphs() does, as well as backends like xlib and win32. src/cairo-atsui-font.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) commit bf1c2ef1e2b6cffffb0f02fe5cb8df0728026642 Author: Brian Ewins Date: Sat Dec 16 15:40:21 2006 -0500 [ATSUI] Support disabling antialiased text src/cairo-atsui-font.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 4c95e2b7bf15c2c12498ae07a16d95ae98501431 Author: M Joonas Pihlaja Date: Sat Dec 16 20:00:56 2006 +0200 New performance test case "mosaic" for splines. perf/Makefile.am | 4 +- perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/mosaic.c | 168 ++ perf/mosaic.h | 4387 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 4560 insertions(+), 1 deletions(-) commit fe21f9d8ca1e509952b1dd84a5c0430953ca663a Author: Frederic Crozat Date: Sat Dec 16 13:55:21 2006 -0500 [check-defs.sh] Fix make check for OPD platforms Make symbol checks work on OPD platform (such as IA64 or PPC64). src/check-def.sh | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit fa618df6e216f9418d4769ba01cd305f3f12a113 Merge: 2b946cb... 81a620f... Author: Carl Worth Date: Thu Dec 14 21:10:21 2006 -0800 Merge branch 'master' of git.cairographics.org:/git/cairo into cairo commit 2b946cba0e2e0bc1ddfda2aad87f1e482568c1b1 Author: Carl Worth Date: Thu Dec 14 21:09:45 2006 -0800 Bump cairo version to 1.3.9 after making 1.3.8 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 129b55f5fcc4c2ae5b63ac6eb73fce8a708e4874 Author: Carl Worth Date: Thu Dec 14 20:44:25 2006 -0800 Increment cairo version to 1.3.8 (and libtool versioning to 12:2:10) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8fa86e897091ad8ce4c286896df56d44892040ee Author: Carl Worth Date: Thu Dec 14 20:43:31 2006 -0800 NEWS: Add notes for cairo 1.3.8 snapshot NEWS | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) commit 81a620fb66a1eb341fefaad26c9d452e494890cb Author: Jonathan Watt Date: Fri Dec 15 04:52:28 2006 +0100 revert accidental mode changes in my previous commit 0 files changed, 0 insertions(+), 0 deletions(-) commit 15e8486ef1558b8049a4c7a5c2f50a7e4a2599da Merge: bf78be6... 8b31038... Author: U-JONATHAN-X60S\jonathan Date: Fri Dec 15 02:31:13 2006 +0100 Merge branch 'master' of git://git.cairographics.org/git/cairo commit bf78be63fc35dc13899209ee818f37fe3f564fed Author: U-JONATHAN-X60S\jonathan Date: Fri Dec 15 00:48:54 2006 +0100 Fix a couple of character spacing issues on Windows src/cairo-win32-surface.c | 105 +++++++++++++++++++++++++-------------------- src/cairo-win32.h | 10 ++++ src/cairoint.h | 10 +++- 3 files changed, 76 insertions(+), 49 deletions(-) commit 8b31038b9fb7f8fc3eb2729c3d14de5c0b130873 Author: Carl Worth Date: Thu Dec 14 10:16:34 2006 -0800 Fix a couple of more stale images holding up 'make distcheck' test/Makefile.am | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit e9bef30d2bcdf41c7b7f20b3517839c37e752f75 Author: David Turner Date: Thu Dec 14 06:55:58 2006 -0800 Optimize gradient computations We update the test suite reference images where needed, (pdiff avoided a few, but most still needed updating). We take advantage of the need for new reference images to shrink some of the giant tests to speed them up a bit. This optimization provides a 2x improvement in linear gradient generation performance (numbers from an x86 laptop): image-rgb paint_linear_rgba_source-512 26.13 -> 11.13: 2.35x speedup █■image-rgb paint_linear_rgba_source-256 6.47 -> 2.76: 2.34x speedup █■image-rgba paint_linear_rgb_over-256 6.51 -> 2.86: 2.28x speedup █▎ image-rgb paint_linear_rgba_over-512 28.62 -> 13.70: 2.09x speedup █■image-rgba fill_linear_rgb_over-256 3.24 -> 1.94: 1.66x speedup ▋ image-rgb stroke_linear_rgba_over-256 5.68 -> 4.10: 1.39x speedup ■pixman/src/fbcompose.c | 425 +++++++++++++++++++++++---------- test/clip-operator-ref.png | Bin 36956 -> 8262 bytes test/clip-operator-rgb24-ref.png | Bin 16507 -> 3258 bytes test/clip-operator.c | 6 +- test/mask-ref.png | Bin 87899 -> 8381 bytes test/mask-rgb24-ref.png | Bin 71010 -> 7041 bytes test/mask-svg-argb32-ref.png | Bin 87728 -> 8405 bytes test/mask-svg-rgb24-ref.png | Bin 81753 -> 0 bytes test/mask.c | 6 +- test/operator-clear-ref.png | Bin 4933 -> 1084 bytes test/operator-clear-rgb24-ref.png | Bin 4218 -> 965 bytes test/operator-clear.c | 6 +- test/operator-source-ref.png | Bin 19763 -> 4422 bytes test/operator-source-rgb24-ref.png | Bin 14666 -> 3201 bytes test/operator-source.c | 6 +- test/text-pattern-ref.png | Bin 1721 -> 1717 bytes test/text-pattern-rgb24-ref.png | Bin 1418 -> 1414 bytes test/trap-clip-ref.png | Bin 71832 -> 5723 bytes test/trap-clip-rgb24-ref.png | Bin 63049 -> 5365 bytes test/trap-clip-svg-argb32-ref.png | Bin 71728 -> 0 bytes test/trap-clip.c | 6 +- test/unbounded-operator-ref.png | Bin 11964 -> 2777 bytes test/unbounded-operator-rgb24-ref.png | Bin 6047 -> 1315 bytes test/unbounded-operator.c | 6 +- 24 files changed, 316 insertions(+), 145 deletions(-) commit af9cce6aa295327b5256f55900b3debf9112b6ca Author: Carl Worth Date: Thu Dec 14 09:18:26 2006 -0800 Fix 'make distcheck' after recent file removals pixman/src/Makefile.am | 3 +-- test/Makefile.am | 20 -------------------- 2 files changed, 1 insertions(+), 22 deletions(-) commit 4888a02666972e9c09d9ffd9854538191cf59d77 Author: Carl Worth Date: Thu Dec 14 04:56:19 2006 -0800 test: Remove ps-specific reference images no longer needed thanks to pdiff test/caps-joins-ps-argb32-ref.png | Bin 1463 -> 0 bytes test/caps-sub-paths-ps-argb32-ref.png | Bin 240 -> 0 bytes test/close-path-ps-argb32-ref.png | Bin 311 -> 0 bytes test/dash-offset-negative-ps-argb32-ref.png | Bin 204 -> 0 bytes test/glyph-cache-pressure-ps-argb32-ref.png | Bin 1672 -> 0 bytes test/infinite-join-ps-argb32-ref.png | Bin 220 -> 0 bytes test/leaky-polygon-ps-argb32-ref.png | Bin 355 -> 0 bytes test/line-width-ps-argb32-ref.png | Bin 244 -> 0 bytes test/select-font-face-ps-argb32-ref.png | Bin 1333 -> 0 bytes test/show-text-current-point-ps-argb32-ref.png | Bin 1479 -> 0 bytes test/transforms-ps-argb32-ref.png | Bin 420 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) commit 5e0818d79d13f5942485b411a04a4eebd56d36f8 Author: Carl Worth Date: Thu Dec 14 04:33:08 2006 -0800 test: Remove svg-specific reference images no longer needed thanks to pdiff This doesn't get rid of all the SVG reference images, but it does clean up quite a few. test/fill-and-stroke-alpha-svg-ref.png | Bin 509 -> 0 bytes test/glyph-cache-pressure-svg-ref.png | Bin 3165 -> 0 bytes test/mask-ctm-svg-rgb24-ref.png | Bin 118 -> 0 bytes test/mask-surface-ctm-svg-rgb24-ref.png | Bin 118 -> 0 bytes test/push-group-svg-rgb24-ref.png | Bin 2887 -> 0 bytes test/select-font-face-svg-ref.png | Bin 2430 -> 0 bytes test/set-source-svg-rgb24-ref.png | Bin 104 -> 0 bytes test/show-text-current-point-svg-ref.png | Bin 2398 -> 0 bytes test/trap-clip-svg-rgb24-ref.png | Bin 73082 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) commit c426e71141d75dbfd39730bf9c4847309fcd9d9e Author: Carl Worth Date: Thu Dec 14 04:17:07 2006 -0800 Hook up pdiff to the test suite now that its written in C test/Makefile.am | 2 ++ test/buffer-diff.c | 30 ++++++++++++++++++++++++++++++ test/cairo-test.c | 12 +++++------- 3 files changed, 37 insertions(+), 7 deletions(-) commit 305cbd8e71a2d21a2c71ed2c382daa5bfcec3992 Author: Carl Worth Date: Thu Dec 14 04:14:24 2006 -0800 pdiff: Remove casts since we're out of the land of X++ where void* is stupidly broken test/pdiff/lpyramid.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) commit f175b23559f3ba759d222538fd28922c1cbe2196 Author: Carl Worth Date: Thu Dec 14 03:49:31 2006 -0800 pdiff: Rename everything to .c and fix an last littele C++ isms. The only things we had missed were a few new/delete pairs, and some obvious header file fixups, (like not doing ). test/pdiff/CompareArgs.cpp | 114 ------------- test/pdiff/Makefile.am | 6 +- test/pdiff/PerceptualDiff.cpp | 101 ------------ test/pdiff/args.c | 119 ++++++++++++++ test/pdiff/args.cpp | 118 -------------- test/pdiff/args.h | 2 +- test/pdiff/lpyramid.c | 113 +++++++++++++ test/pdiff/lpyramid.cpp | 113 ------------- test/pdiff/pdiff.c | 361 +++++++++++++++++++++++++++++++++++++++++ test/pdiff/pdiff.cpp | 347 --------------------------------------- test/pdiff/pdiff.h | 16 +- test/pdiff/perceptualdiff.c | 101 ++++++++++++ 12 files changed, 706 insertions(+), 805 deletions(-) commit 18a4fa448fcdb6a72f427e997ee2b234f96a56f7 Author: Carl Worth Date: Thu Dec 14 03:25:51 2006 -0800 pdiff: Replace CompareArgs class with args_t struct This gets rid of nearly the last vestiges of C++ from the pdiff code. test/pdiff/CompareArgs.cpp | 4 +- test/pdiff/CompareArgs.h | 41 -------------- test/pdiff/Makefile.am | 4 +- test/pdiff/PerceptualDiff.cpp | 39 +++++++------ test/pdiff/args.cpp | 118 +++++++++++++++++++++++++++++++++++++++++ test/pdiff/args.h | 46 ++++++++++++++++ 6 files changed, 190 insertions(+), 62 deletions(-) commit 871aba6c80b8f3101eac51cc055ad9ca26770a95 Author: Carl Worth Date: Thu Dec 14 03:16:18 2006 -0800 pdiff: Fix return value from perceptualdiff program test/pdiff/PerceptualDiff.cpp | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 2174ee247554feef6a24792390d858b12fd44acd Author: Carl Worth Date: Thu Dec 14 03:15:14 2006 -0800 pdiff: Remove all uses of std::string test/pdiff/CompareArgs.cpp | 18 ++++++------------ test/pdiff/CompareArgs.h | 1 - test/pdiff/PerceptualDiff.cpp | 24 ++++++++---------------- 3 files changed, 14 insertions(+), 29 deletions(-) commit 91b156b82e0219b2b851c218813f24024cad7c69 Author: Carl Worth Date: Thu Dec 14 03:02:48 2006 -0800 pdiff: Remove RGBAImage classes now that we're just using cairo image surfaces test/pdiff/CompareArgs.cpp | 1 - test/pdiff/CompareArgs.h | 3 - test/pdiff/Makefile.am | 4 +- test/pdiff/PerceptualDiff.cpp | 1 - test/pdiff/RGBAImage.cpp | 144 ----------------------------------------- test/pdiff/RGBAImage.h | 105 ------------------------------ test/pdiff/pdiff.cpp | 80 +++++++++++++++++++---- test/pdiff/pdiff.h | 2 + 8 files changed, 69 insertions(+), 271 deletions(-) commit 4c812c38e4ec9885b9451185127e5c8877354d75 Author: Carl Worth Date: Thu Dec 14 02:10:35 2006 -0800 pdiff: Remove hideous C++ reference passing test/pdiff/pdiff.cpp | 26 +++++++++++++------------- 1 files changed, 13 insertions(+), 13 deletions(-) commit 2457756afd66b69840640eff3aaf72e7ea0f64e8 Author: Carl Worth Date: Thu Dec 14 02:08:30 2006 -0800 pdiff: Remove intermingled statements and declarations test/pdiff/pdiff.cpp | 74 +++++++++++++++++++++++++++++-------------------- 1 files changed, 44 insertions(+), 30 deletions(-) commit e947f5a4bdf4a4134faa8961406a10f32cf4e2d6 Author: Carl Worth Date: Thu Dec 14 01:09:05 2006 -0800 pdiff: Add .gitignore for perceptualdiff binary test/pdiff/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit bb4d4dc77117ded253d1f507e771de7f98c69fb8 Author: Carl Worth Date: Thu Dec 14 01:06:42 2006 -0800 pdiff: Remove old, unused Yee_Compare interface test/pdiff/Makefile.am | 2 +- test/pdiff/Metric.cpp | 295 ------------------------------------------------ test/pdiff/pdiff.cpp | 281 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+), 296 deletions(-) commit 53c3a2f75b7f065b4c769ad087bbc9aaaaf6d7ee Author: Carl Worth Date: Thu Dec 14 01:00:43 2006 -0800 pdiff: Rewrite main program to use cairo-based pdiff_compare interface test/pdiff/CompareArgs.cpp | 23 ++++++++----------- test/pdiff/CompareArgs.h | 5 ++- test/pdiff/Makefile.am | 1 - test/pdiff/Metric.cpp | 35 ++++++++++++++--------------- test/pdiff/Metric.h | 32 --------------------------- test/pdiff/PerceptualDiff.cpp | 47 ++++++++++++++++++++++++++++++---------- 6 files changed, 65 insertions(+), 78 deletions(-) commit 358645d6eb68b4eaf79159e7aefa01bca4cb0acf Author: Carl Worth Date: Thu Dec 14 00:42:52 2006 -0800 pdiff: Rip out unused ImgDiff code, (dropping -output option) test/pdiff/CompareArgs.cpp | 7 ------- test/pdiff/CompareArgs.h | 1 - test/pdiff/Metric.cpp | 11 ----------- test/pdiff/PerceptualDiff.cpp | 14 -------------- test/pdiff/README.txt | 4 ++-- 5 files changed, 2 insertions(+), 35 deletions(-) commit 4438fb6dca1b4b6c0a30d66508339c3997ee94a4 Author: Carl Worth Date: Thu Dec 14 00:38:39 2006 -0800 pdiff: Move function that depends on command-line argument class to same file as main test/pdiff/Metric.cpp | 61 ----------------------------------------- test/pdiff/Metric.h | 9 +++++- test/pdiff/PerceptualDiff.cpp | 54 ++++++++++++++++++++++++++++++++++++ test/pdiff/RGBAImage.h | 2 +- 4 files changed, 62 insertions(+), 64 deletions(-) commit c7379fcea478fbd3fc5e09a10828586e641e2375 Author: Carl Worth Date: Thu Dec 14 00:30:54 2006 -0800 pdiff: Rewrite Laplacian pyramid code from C++ to C test/pdiff/LPyramid.cpp | 87 ------------------------------- test/pdiff/LPyramid.h | 38 -------------- test/pdiff/Makefile.am | 4 +- test/pdiff/Metric.cpp | 22 ++++---- test/pdiff/PerceptualDiff.cpp | 2 +- test/pdiff/lpyramid.cpp | 113 +++++++++++++++++++++++++++++++++++++++++ test/pdiff/lpyramid.h | 32 ++++++++++++ 7 files changed, 159 insertions(+), 139 deletions(-) commit 29456d38658b8ba7267fadeac9820a68227df787 Author: Carl Worth Date: Thu Dec 14 00:13:23 2006 -0800 pdiff: Convert C++-style comments to good old-fashioned C-style comments test/pdiff/CompareArgs.cpp | 2 +- test/pdiff/CompareArgs.h | 20 ++++++++++---------- test/pdiff/LPyramid.cpp | 12 ++++++------ test/pdiff/LPyramid.h | 4 ++-- test/pdiff/Metric.cpp | 24 +++++++++++++----------- test/pdiff/Metric.h | 5 +++-- test/pdiff/RGBAImage.cpp | 6 +++--- test/pdiff/RGBAImage.h | 2 +- 8 files changed, 39 insertions(+), 36 deletions(-) commit 34a6af3c55cf8bba292cec8dc42fdc1917759a08 Author: Carl Worth Date: Wed Dec 13 18:10:21 2006 -0800 pdiff: Delete all trailing whitespace. test/pdiff/CompareArgs.cpp | 4 +- test/pdiff/CompareArgs.h | 4 +- test/pdiff/LPyramid.cpp | 4 +- test/pdiff/LPyramid.h | 4 +- test/pdiff/Metric.cpp | 52 ++++++++++++++++++++-------------------- test/pdiff/PerceptualDiff.cpp | 2 +- test/pdiff/RGBAImage.cpp | 8 +++--- test/pdiff/RGBAImage.h | 2 +- 8 files changed, 40 insertions(+), 40 deletions(-) commit d421a856d08fba2fa0fdbd362d947497a952b347 Author: Carl Worth Date: Wed Dec 13 18:08:25 2006 -0800 pdiff: Re-indent all code I've given up on trying to preserve the old code formatting for compatibility. We're not planning on augmenting the algorithm itself, just integrating it into cairo. So I don't expect to make changes that we'll be all that interested in pushing upstream. test/pdiff/CompareArgs.cpp | 162 +++++++------- test/pdiff/CompareArgs.h | 46 ++-- test/pdiff/LPyramid.cpp | 100 ++++---- test/pdiff/LPyramid.h | 38 ++-- test/pdiff/Metric.cpp | 514 ++++++++++++++++++++-------------------- test/pdiff/PerceptualDiff.cpp | 52 ++-- test/pdiff/RGBAImage.cpp | 168 +++++++------- test/pdiff/RGBAImage.h | 86 ++++---- test/pdiff/pdiff.h | 20 +- 9 files changed, 593 insertions(+), 593 deletions(-) commit 4f6611ef6cac3928427b6fc28dab40829ef0d748 Author: Carl Worth Date: Wed Dec 13 17:40:59 2006 -0800 pdiff: Fix line endings test/pdiff/LPyramid.cpp | 174 +++++++++++++++++++++++----------------------- test/pdiff/LPyramid.h | 76 ++++++++++---------- 2 files changed, 125 insertions(+), 125 deletions(-) commit ccb3a6c4deadeaecf133dce6f1b152507ab5a14f Author: Carl Worth Date: Tue Dec 12 16:49:27 2006 -0800 pdiff: Compile pdiff algorithm as a libtool convenience library The convenience library provides a pdiff_compare function with a cairo interface into the perceptual diff algorithm. test/Makefile.am | 2 +- test/pdiff/Makefile.am | 14 +++++++++----- test/pdiff/Metric.cpp | 18 ++++++++++++++++++ test/pdiff/RGBAImage.h | 2 +- test/pdiff/pdiff.h | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 7 deletions(-) commit 55f776876d231a035cdc5da9bb90cbba14f19248 Author: Carl Worth Date: Tue Dec 12 16:37:35 2006 -0800 test: Rework buffer_diff interface as new compare_surfaces This is a slightly kinder interface that accepts cairo_image_surface_t pointers rather than pointers to the raw image data and width, height, stride. This brings us closer to hooking up the pdiff code. test/buffer-diff.c | 28 +++++++++++++--------------- test/buffer-diff.h | 15 ++++++--------- 2 files changed, 19 insertions(+), 24 deletions(-) commit 0d7870b6bf13edfe513e2de25a5814a0a1b78c79 Author: Carl Worth Date: Tue Dec 12 16:15:08 2006 -0800 pdiff: Teach pdiff code to accept cairo image surfaces This is a second small step in enabling cairo's test suite and the pdiff code to start working together. test/pdiff/CompareArgs.cpp | 49 ++++++++++++++------------------- test/pdiff/CompareArgs.h | 1 + test/pdiff/Makefile.am | 1 + test/pdiff/RGBAImage.h | 64 ++++++++++++++++++++++++++++++++++++++----- 4 files changed, 79 insertions(+), 36 deletions(-) commit a87f494d4b91f3acc78d6d7dd737939633f28d71 Author: Dan Amelang Date: Tue Dec 12 16:34:50 2006 -0800 Don't use the GNU-only grep option "-a" We now use strings first, then grep to find the magic value, as suggested by various people in the reports for the bugs that this fixes: https://bugs.freedesktop.org/show_bug.cgi?id=9247 https://bugs.freedesktop.org/show_bug.cgi?id=9124 acinclude.m4 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 41e01d95edd7eb573a8b79acd0ab2b9de8cdab40 Author: Carl Worth Date: Tue Dec 12 03:13:38 2006 -0800 pdiff: Factor out a comparison function that doesn't read the 'args' structure This is one small step in "libifying" pdiff which will make it easier to share this code inside cairo's test suite. test/pdiff/Metric.cpp | 112 +++++++++++++++++++++++++++++++----------------- 1 files changed, 72 insertions(+), 40 deletions(-) commit b50b8db6d7d3d0a887ee18ad5e8e0455ed794429 Author: Carl Worth Date: Tue Dec 12 02:17:19 2006 -0800 test: Simplify buffer_diff by handling device offset in advance In a manner similar to flattening in advance, we now extract the sub- surface of interest (when testing with device offsets) before calling into the buffer_diff functions. This allows these functions to accept a single stride value once again instead of one for each of the three images. test/buffer-diff.c | 103 ++++++++++++++++++++++++++++++++------------------- test/buffer-diff.h | 8 +--- test/xlib-surface.c | 4 -- 3 files changed, 67 insertions(+), 48 deletions(-) commit 1781e6018c17909311295a9cc74b70500c6b4d0a Author: Behdad Esfahbod Date: Mon Dec 11 03:31:10 2006 -0500 [Xlib] Rewrite an optimized cairo_xlib_show_glyphs() The old implementation was a very naive one that used to generate one XRender glyph element per glyph. That is, position glyphs individually. This was raised here: http://lists.freedesktop.org/archives/cairo/2006-December/008835.html The new implmentation is a free rewriting of the Xft logic, that is, compressing glyphs with "natural" advance into elements, but with various optimizations and improvements. In short, it works like this: glyphs are looped over, skipping those that are not desired, and computing offset from "current position". Whenever a glyph has non-zero offsets from the current position, a new element should be started. All these are used to compute the request size in the render protocol. Whenever the request size may exceed the max request size, or at the end, glyphs are flushed. For this to work, we now set non-zero glyph advances when sending glyphs to the server. Notable optimizations and improvements include: - Reusing the input glyph array (with double glyph positions) as a working array to compute glyph offsets. - Reusing the input glyph array as the output glyph-index array to be passed to XRender. - Marking glyphs to be skipped as so, avoiding a copy of the glyph array, which is what the old code was doing. - Skip glyphs with positions "out-of-range". That is, those with positions that would cause an overflow in Xrender's glyph offset calculations. On my Fedora desktop on Pentium 4, and on a Nokia 770, it shows a 6% speedup on the timetext test. src/cairo-xlib-surface.c | 477 +++++++++++++++++++++++++--------------------- 1 files changed, 257 insertions(+), 220 deletions(-) commit 198c1439ab21b1b19310335d93242709d1398ff3 Author: Behdad Esfahbod Date: Mon Dec 11 03:16:50 2006 -0500 Cache rounded glyph advance values This is done in cairo_scaled_glyph_t->x/y_advance. The value is mostly useful for raster backends, for example to set as default advance of a glyph, and later on optimize glyph positionings that use the default advance. src/cairo-scaled-font.c | 10 ++++++++++ src/cairoint.h | 2 ++ 2 files changed, 12 insertions(+), 0 deletions(-) commit e7ed9eee767c85853d6d2fb823ff3317c490948c Author: Behdad Esfahbod Date: Mon Dec 11 03:13:34 2006 -0500 [cairo-gstate] Use a local buffer on the stack for small glyph operations We duplicate the incoming glyph array for two reasons: 1) applying transformations, and 2) to let the lower level functions have a glyph array they can modify. By using a 2kb array on the stack we can avoid malloc() for requests of less than 100 glyphs. The size of the array can be tuned by setting CAIRO_STACK_BUFFER_SIZE. src/cairo-gstate.c | 30 +++++++++++++++++++++++------- 1 files changed, 23 insertions(+), 7 deletions(-) commit da60bc45f295b15c62089874fb30cedc1d70bcd2 Author: Behdad Esfahbod Date: Mon Dec 11 03:10:05 2006 -0500 [cairoint] Define CAIRO_STACK_BUFFER_SIZE (defaults to 2kb) This is the suggested size in bytes of buffers allocated on the stack per function, mostly used for glyph rendering. We typically use a local buffer on the stack to avoid mallocing for small requests. Requests that do not fit are malloc()ed automatically. The default value should be enough for about a 100-glyph cairo_show_glyphs() operation. src/cairoint.h | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-) commit 5a9642c5746fd677aed35ce620ce90b1029b1a0c Author: Behdad Esfahbod Date: Mon Dec 11 01:39:51 2006 -0500 Add/remove const to cairo_glyph_t* arguments consistently The rule is: cairo_glyph_t* is always passed as const for measurement purposes. This was not reflected in our public api previously. Fixed Showing glyphs used to have cairo_glyph_t* always as const. With this changed, it is only const on cairo_t and cairo_gstate_t operations. cairo_surface_t, cairo_scaled_font_t, and individual backends receive cairo_glyph_t* as non-const. The desired semantics is that they may modify the contents of the array as long as they do not return CAIRO_STATUS_UNSUPPORTED. This makes it possible to avoid copying the glyph array again and again, and edit it in-place. Backends are in fact free to use the array as a generic buffer as they see fit. src/cairo-analysis-surface.c | 2 +- src/cairo-atsui-font.c | 2 +- src/cairo-directfb-surface.c | 2 +- src/cairo-glitz-surface.c | 2 +- src/cairo-gstate.c | 12 ++++++------ src/cairo-meta-surface.c | 2 +- src/cairo-nquartz-surface.c | 2 +- src/cairo-paginated-surface.c | 2 +- src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-scaled-font.c | 4 ++-- src/cairo-surface-fallback-private.h | 2 +- src/cairo-surface-fallback.c | 4 ++-- src/cairo-surface.c | 4 ++-- src/cairo-svg-surface.c | 2 +- src/cairo-win32-font.c | 2 +- src/cairo-win32-surface.c | 2 +- src/cairo-xcb-surface.c | 4 ++-- src/cairo-xlib-surface.c | 4 ++-- src/cairo.c | 4 ++-- src/cairo.h | 6 +++--- src/cairoint.h | 28 +++++++++++----------------- src/test-meta-surface.c | 2 +- src/test-paginated-surface.c | 2 +- 24 files changed, 47 insertions(+), 53 deletions(-) commit 70695f5c62b89b417c1e8b42451470a5a8920bf3 Author: Behdad Esfahbod Date: Sun Dec 10 02:32:52 2006 -0500 [FreeType] Remove "UNSUPPORTED" show_glyphs stub and NULL its entry The fallback paths always assume UNSUPPORTED if a method is NULL, so, no need for a method to just return UNSUPPORTED. src/cairo-ft-font.c | 19 +------------------ 1 files changed, 1 insertions(+), 18 deletions(-) commit fea60c7283172be5efb42332a96fe322466bd6ed Author: Dan Amelang Date: Sat Dec 9 18:54:47 2006 -0800 Change _cairo_lround to correctly handle edge cases previously missed A nice side effect of this new approach is that the valid input range was expanded back to (INT_MIN, INT_MAX]. No performance regressions observed. Also included is documentation about the internal mysteries of _cairo_lround, as previously promised. src/cairo.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 179 insertions(+), 26 deletions(-) commit cc75159587a4479951da354cfa282d81c74b0377 Author: Behdad Esfahbod Date: Fri Dec 8 16:10:57 2006 -0500 [FreeType] Do not return large structs from functions Pass cairo_ft_options_t around by pointer, not by value. That's what we do with cairo_font_options_t anyway, and there is no reason to not do the same here. (makes -Waggregate-return warnings go away btw). src/cairo-ft-font.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-) commit beadc7da864c974558b8e98723e9d2533baab630 Author: Behdad Esfahbod Date: Fri Dec 8 15:42:24 2006 -0500 [docs] Update templates doc/public/tmpl/cairo-pattern.sgml | 76 +++++++++++++++++++++ doc/public/tmpl/cairo-status.sgml | 50 +++++++------- doc/public/tmpl/cairo-surface.sgml | 114 ++++++++++++++++---------------- doc/public/tmpl/cairo-text.sgml | 1 + doc/public/tmpl/cairo-win32-fonts.sgml | 18 +++++ doc/public/tmpl/cairo-win32.sgml | 21 ++++++ doc/public/tmpl/cairo.sgml | 69 +++++++++++++++++++ 7 files changed, 267 insertions(+), 82 deletions(-) commit cdd79c104dd940077b1f3193c31272f9a4673bb5 Author: Behdad Esfahbod Date: Fri Dec 8 15:41:52 2006 -0500 [docs] Generate index of new symbols in 1.4 doc/public/cairo-docs.xml | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 16c7587f2dcab5abbbe62505e64c1ac9441dfb8e Author: Behdad Esfahbod Date: Fri Dec 8 15:40:59 2006 -0500 [slim] Define slim macros to dummy prototypes for non-gcc compilers (#9150) src/cairoint.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6122c30930525c0d672166eab8b05e0951c7b039 Author: Behdad Esfahbod Date: Fri Dec 8 15:38:34 2006 -0500 [pixman] Remove unused slim_internal.h pixman/src/slim_internal.h | 103 -------------------------------------------- 1 files changed, 0 insertions(+), 103 deletions(-) commit 734b321aab3df046716a54cfdcefbe42fa6b1a8b Author: Behdad Esfahbod Date: Thu Dec 7 00:14:37 2006 -0500 [doc] Minor wording improvement. doc/public/tmpl/cairo-version.sgml | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit eedd86165efed065bf79469b1cf57c0127012b98 Author: Behdad Esfahbod Date: Thu Dec 7 00:08:09 2006 -0500 [docs] Document CAIRO_VERSION_STRING. doc/public/tmpl/cairo-version.sgml | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 9b87fab8ce283e966da7ac850980397cb9e199cc Author: Behdad Esfahbod Date: Wed Dec 6 23:52:22 2006 -0500 [docs] Hook various new API into cairo-sections.txt doc/public/cairo-sections.txt | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) commit 0e028ee0f3bfb95d8483bb4c84b84c4bd53b8c53 Author: Behdad Esfahbod Date: Wed Dec 6 23:40:08 2006 -0500 [doc/public/Makefile.am] Move the list of private headers generatable Move the list of private headers into separate file Headers.mk that Makefile.am includes (using automake). To update the list, just remove Headers.mk and make. doc/public/Headers.mk | 31 +++++++++++++++++++++++++ doc/public/Makefile.am | 59 +++++++++++++++++++---------------------------- 2 files changed, 55 insertions(+), 35 deletions(-) commit b8e1f3778e61e3c5a809f610a1af97ea56a9960e Author: Behdad Esfahbod Date: Wed Dec 6 23:38:20 2006 -0500 [docs] Document various CAIRO_VERSION_* macros doc/public/tmpl/cairo-version.sgml | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) commit fd03991a6a78d849e2184f53a2b1b6915a6a64d0 Author: M Joonas Pihlaja Date: Thu Dec 7 04:46:07 2006 +0200 test: random-intersections The purpose of this test case is to help make sure that changes to the trapezoid generation or intersection computation in the tessellator don't break it. test/Makefile.am | 4 ++ test/random-intersections-ps-argb32-ref.png | Bin 0 -> 107578 bytes test/random-intersections-ref.png | Bin 0 -> 177153 bytes test/random-intersections-rgb24-ref.png | Bin 0 -> 132210 bytes test/random-intersections.c | 79 +++++++++++++++++++++++++++ 5 files changed, 83 insertions(+), 0 deletions(-) commit 6301f92d2af2fd7928352965bcab42bab9deb59d Author: M Joonas Pihlaja Date: Thu Dec 7 02:30:41 2006 +0200 Rework the in-fill-empty-trapezoid test to not use the cairo_test() framework. As suggested by Behdad Esfahbod, we can not use the cairo_test() framework when it is getting in the way. The test itself doesn't depend on any particular backend. http://lists.freedesktop.org/archives/cairo/2006-December/008809.html test/Makefile.am | 2 - test/in-fill-empty-trapezoid-ref.png | Bin 108 -> 0 bytes test/in-fill-empty-trapezoid-rgb24-ref.png | Bin 107 -> 0 bytes test/in-fill-empty-trapezoid.c | 54 ++++++++++++++++------------ 4 files changed, 31 insertions(+), 25 deletions(-) commit c13a1a2ed0ce8ba2b43e4e70c66cdc5b98e80eb4 Author: M Joonas Pihlaja Date: Thu Dec 7 01:42:07 2006 +0200 Replace point sampling in the fill-degenerate-sort-order with rendering. Clean up the test to not even check the ps backend as per: http://lists.freedesktop.org/archives/cairo/2006-December/008806.html boilerplate/cairo-boilerplate.c | 3 ++ test/fill-degenerate-sort-order-ref.png | Bin 643 -> 2397 bytes test/fill-degenerate-sort-order-rgb24-ref.png | Bin 611 -> 2060 bytes test/fill-degenerate-sort-order.c | 32 ++---------------------- 4 files changed, 6 insertions(+), 29 deletions(-) commit 565a715d119d00ac141d1b235dab7985ed78113a Author: M Joonas Pihlaja Date: Thu Dec 7 01:16:43 2006 +0200 Change license of tessellator tests to the MIT license. The blurb for the fill-degenerate-sort-order, fill-missed-stop and in-fill-empty-trapezoid tests changed to this one: http://www.opensource.org/licenses/mit-license.php c.f. http://lists.freedesktop.org/archives/cairo/2006-December/008806.html test/fill-degenerate-sort-order.c | 35 ++++++++++++++++++----------------- test/fill-missed-stop.c | 35 ++++++++++++++++++----------------- test/in-fill-empty-trapezoid.c | 35 ++++++++++++++++++----------------- 3 files changed, 54 insertions(+), 51 deletions(-) commit e857ac325a048799016196bc65ce6ff279c01431 Author: M Joonas Pihlaja Date: Thu Dec 7 00:52:43 2006 +0200 tessellator bug fix: linking fails on x86_64 due to superfluous inline attribute. Remove inline attribute from cairo_bo_event_compare_abstract() to fix the linking issue reported by Jinghua Luo on the mailing list: http://lists.freedesktop.org/archives/cairo/2006-November/008574.html src/cairo-bentley-ottmann.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 16c0db0d6843184e79b73a3613f65c0cc06a684d Author: Behdad Esfahbod Date: Wed Dec 6 19:02:09 2006 -0500 [test] Break the "make clean" target into serveral rm calls Some systems cannot handle very long list of arguments. Carl was hitting this for "make clean". Break it out into several rm calls triggered by the clean-local target. test/Makefile.am | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) commit 3cf994779580fe3355356c00e20a93ddb676355e Author: Behdad Esfahbod Date: Wed Dec 6 18:52:45 2006 -0500 [.gitignore] Add big-trap test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 4b43a3a1c4d4f4659e604cea1d79e1b5e18ce107 Author: Peter Weilbacher Date: Thu Dec 7 00:27:29 2006 +0100 Add OS/2 backend and its requirement to INSTALL and README, following the example of BeOS. INSTALL | 1 + README | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 652f73f0907c0d4b4bee155a73acb4a6a0cf5f37 Author: Carl Worth Date: Wed Dec 6 13:40:52 2006 -0800 Bump version to 1.3.7 after making 1.3.6 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 648ef4487dfa43f20fb2c73e7b8e567f8a25497a Author: Carl Worth Date: Wed Dec 6 13:22:24 2006 -0800 Increment cairo version to 1.3.6 (and libtool versioning to 12:1:10) configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f0459b3c53d3319822ef6e5f8bc118e742dcbf5f Author: Carl Worth Date: Wed Dec 6 13:20:04 2006 -0800 NEWS: Add notes for 1.3.6 snapshot NEWS | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 65 insertions(+), 0 deletions(-) commit e840c120ddc5ad3adeba95c2baf5262aae57d9d1 Author: Carl Worth Date: Wed Dec 6 13:19:30 2006 -0800 Fix 'make distcheck' by mentioning test/pdiff in DIST_SUBDIRS test/Makefile.am | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b83f9e766a0925a59f0db488ef8c905f3fcbcbe4 Author: Carl Worth Date: Wed Dec 6 13:17:41 2006 -0800 ROADMAP: Note that the Banker's rounding bug is fixed ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ce58f874fe25334961807a2cecf6066b18569c05 Author: Dan Amelang Date: Tue Dec 5 23:45:15 2006 -0800 Change _cairo_lround to use arithmetic rounding This fixes the text rendering bug reported here: https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=217819 No performance impact on x86. On the 770, I see minor speedups in text_solid and text_image (~1.05x). src/cairo.c | 57 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 45 insertions(+), 12 deletions(-) commit d0eff3919646e8a4c9981c349e33060fdb27c94e Author: M Joonas Pihlaja Date: Wed Dec 6 05:53:53 2006 +0200 tessellator: input validation and guard bit removal This patch removes the guard bits from the tessellator internal coordinates and reworks the input validation to make sure that the tessellator code should never die on an assert. When the extent of a polygon exceeds a width or height of 2^31-1, then the rightmost (resp. bottommost) points are clamped to within 2^31-1 of the leftmost (resp. topmost) point of the polygon. The clamping produces bad rendering for really large polygons, and needs to be fixed in a saner manner. Cleaned up as per http://lists.freedesktop.org/archives/cairo/2006-December/008806.html src/cairo-bentley-ottmann.c | 147 +++++++++++++++++++++++-------------------- 1 files changed, 78 insertions(+), 69 deletions(-) commit f8ba74917296be226f7a957ad1a26685bb6d846c Author: M Joonas Pihlaja Date: Tue Dec 5 22:56:22 2006 +0200 tessellator: offset working coordinates to be nonnegative This patch improves the translation invariance of the tessellator by offsetting all input coordinates to be nonnegative and paves the way for future optimisations using the coordinate range. Also changes the assertions to make sure that it is safe to add the guard bits. This needs to be changed to do something sensible about input coordinates that are too large instead of croaking. The plan is to steal the guard bits from the least significant instead of the most significant user bits, and having all coordinates nonnegative will make the rounding involved there easier. src/cairo-bentley-ottmann.c | 126 ++++++++++++++++++++++++++++++++---------- 1 files changed, 96 insertions(+), 30 deletions(-) commit 633c51b4426f5405db0eac5edb81651b7e1491ef Author: M Joonas Pihlaja Date: Tue Dec 5 21:55:50 2006 +0200 tessellator bug fix: in-fill-empty-trapezoid The cairo_in_fill() function sometimes gives false positives when it samples a point on the edge of an empty trapezoid. This patch alleviates the bug (but doesn't fix it completely), for the common(?) case where the left and right edges of the empty trapezoid have equal top and bottom points. src/cairo-bentley-ottmann.c | 31 +++++++++++++++++++++---------- 1 files changed, 21 insertions(+), 10 deletions(-) commit e6c8febca7a24f6cf4138a25c96a36e4e7721a92 Author: M Joonas Pihlaja Date: Tue Dec 5 21:38:25 2006 +0200 tessellator bug fix: fill-missed-stop Fixes the regression exhibited by the test fill-missed-stop, where the tessellator would sometimes extend a trapezoid too far below the end of the right edge. src/cairo-bentley-ottmann.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 614117e487f36c66f2a479c96e1cb4daef625608 Author: M Joonas Pihlaja Date: Tue Dec 5 21:31:23 2006 +0200 tessellator bug fix: fill-degenerate-sort-order Fixes the regression fill-degenerate-sort-order, where confusion arises in the event order for collinear edges. Also fixes (or at least hides) the issues with zrusin-another sometimes generating different trapezoids depending on the state of the random number generator in cairo-skiplist.c. src/cairo-bentley-ottmann.c | 40 +++++++++++++++++++++++++++++----------- 1 files changed, 29 insertions(+), 11 deletions(-) commit 48b42efcfee470a1224d6ad0646525964ac640c6 Author: M Joonas Pihlaja Date: Tue Dec 5 13:02:47 2006 +0200 test: check for tessellator regression from missed stop events The new tessellator contains a regression where stop events that aren't followed by start events sometimes cause the trapezoid to the left of an edge to be too high. test/Makefile.am | 4 ++ test/fill-missed-stop-ps-argb32-ref.png | Bin 0 -> 564 bytes test/fill-missed-stop-ref.png | Bin 0 -> 466 bytes test/fill-missed-stop-rgb24-ref.png | Bin 0 -> 394 bytes test/fill-missed-stop.c | 89 +++++++++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 0 deletions(-) commit e94e0a1ca262ef67b527b13a5e9691ad42a43204 Author: M Joonas Pihlaja Date: Tue Dec 5 12:20:17 2006 +0200 test: check if cairo_in_fill() is reporting false positives for empty trapezoids. cairo_in_fill() may report true if a query point lands on an edge of an empty trapezoid. test/Makefile.am | 3 + test/in-fill-empty-trapezoid-ref.png | Bin 0 -> 108 bytes test/in-fill-empty-trapezoid-rgb24-ref.png | Bin 0 -> 107 bytes test/in-fill-empty-trapezoid.c | 89 ++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 0 deletions(-) commit 00d7b6acdd263f7b46ea98c4a5b777fc93a65be5 Author: M Joonas Pihlaja Date: Tue Dec 5 11:21:14 2006 +0200 test: tessellator event comparator test case for degenerate edges. There's currently a regression bug in the tessellation code from switching to the new tessellator. The bug is caused by confusion in the comparator used to order events when there are degenerate edges. This test is derived from the zrusin-another performance test case. test/Makefile.am | 3 + test/fill-degenerate-sort-order-ref.png | Bin 0 -> 643 bytes test/fill-degenerate-sort-order-rgb24-ref.png | Bin 0 -> 611 bytes test/fill-degenerate-sort-order.c | 110 +++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 0 deletions(-) commit c92f23caa549651a05863ecda19c55c112350528 Author: Carl Worth Date: Tue Dec 5 11:14:49 2006 -0800 ROADMAP: Add _cairo_lround bug for 1.3.6. Note some completed items for 1.4.0 ROADMAP | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) commit 4057a98f88947730bb0678f361278cc71cc33751 Author: M Joonas Pihlaja Date: Tue Dec 5 05:46:26 2006 +0200 cairo-perf-diff-files: Don't segfault reading cooked perf reports. Fixes cairo-perf-diff-files for non-raw cairo-perf reports. Similar to the patch on the mailing list, only applied to the caller of _cairo_stats_compute(): http://lists.freedesktop.org/archives/cairo/2006-December/008720.html perf/cairo-perf-diff-files.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit a4f5463cdd5e2b088cd009de332db821ef0bd806 Author: Mathieu Lacage Date: Tue Dec 5 03:59:11 2006 +0200 bugfix: fix cairo-wideint.c uint64_t usage and const return qualifiers These patches were sent to the cairo mailing list by Mathieu Lacage : http://lists.freedesktop.org/archives/cairo/2006-December/008741.html _cairo_uint_96by64_32x64_divrem(): fixes misuse of the uint64_t type and cairo-wideint-private.h functions. http://lists.freedesktop.org/archives/cairo/2006-December/008742.html Remove const qualifiers from return types from cairo-wideint.c functions. http://lists.freedesktop.org/archives/cairo/2006-December/008747.html Fixes a typo in cairo-wideint-private.h: _cairo_uint128_to_int128_ had an extra trailing underscore. src/cairo-wideint-private.h | 2 +- src/cairo-wideint.c | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) commit 94e086b7b9f4129bde3e32b7005e2a33788f334a Author: Dan Amelang Date: Sat Dec 2 11:24:35 2006 -0800 [configure] Fix --disable-some-floating-point to force value to 'no' if none given As suggested by Behdad here: http://lists.freedesktop.org/archives/cairo/2006-December/008700.html configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 392f27bf2b210aec6f511e5dba890d5f4c3b8802 Author: Dan Amelang Date: Sat Dec 2 11:02:36 2006 -0800 [configure] Add -a option to grep calls in AX_C_FLOAT_WORDS_BIGENDIAN This fixes bug #9124 reported here: https://bugs.freedesktop.org/show_bug.cgi?id=9124 acinclude.m4 | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 3dbe468fd6071adfba5f608da788502f1840af36 Author: Dan Amelang Date: Fri Dec 1 14:12:16 2006 -0800 [perf] Provide watered-down implementations of getline and strndup for building on non-GNU toolchains. perf/cairo-perf-diff-files.c | 58 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 55 insertions(+), 3 deletions(-) commit d5fcbfc29f2ae6eacdab1d00d9e7ce8d1cf39431 Author: Dan Amelang Date: Fri Dec 1 12:46:55 2006 -0800 Purge cairo-test of all calls to round() Although round() is in the C99 standard, it isn't available in all toolchains on which cairo is compiled (VC++, for example). test/clip-operator.c | 4 ++-- test/operator-clear.c | 4 ++-- test/operator-source.c | 4 ++-- test/unbounded-operator.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) commit cb9a3c264086d0d11b74c504e5d3f891f929b00e Author: Dan Amelang Date: Fri Dec 1 12:41:55 2006 -0800 Add configure option --disable-some-floating-point See discussion here: http://lists.freedesktop.org/archives/cairo/2006-November/008602.html configure.in | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) commit 7fb4e978735bd7c9f3cff970ac6757feff3e74bb Author: Carl Worth Date: Thu Nov 30 09:15:00 2006 -0800 BIBLIOGRAPHY: Add Joseph O'Rourke's book as recommended by Rafael Villar Burke BIBLIOGRAPHY | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit 7fbe594d3d04137daca4d3c3a28057b71b03f33d Author: Carl Worth Date: Thu Nov 30 08:43:27 2006 -0800 Add a textbook recommendation to the bibliography Thanks to Mathieu Lacage for the recommendation of: "Computational Geometry, Algorithms and Applications", M. de Berg, M. van Kreveld, M. Overmars, M. Schwarzkopf BIBLIOGRAPHY | 21 +++++++++++++++++---- 1 files changed, 17 insertions(+), 4 deletions(-) commit 170d35b034150b69717e52dd85f0f93c392d9f3c Author: Carl Worth Date: Wed Nov 29 23:01:30 2006 -0800 pdiff: Add missing newlins at end of files. test/pdiff/CompareArgs.h | 2 +- test/pdiff/LPyramid.cpp | 1 - test/pdiff/LPyramid.h | 2 +- test/pdiff/Metric.cpp | 2 +- test/pdiff/Metric.h | 2 +- test/pdiff/RGBAImage.h | 2 +- 6 files changed, 5 insertions(+), 6 deletions(-) commit c863315285911d38b64b8429e279c5e55d0089b8 Author: Carl Worth Date: Tue Nov 21 14:19:35 2006 -0800 Hook up Makefiles for perceptualdiff. configure.in | 1 + test/pdiff/Makefile.am | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) commit 6e06b68452ec68b7ab227c54284f28a605512ce4 Author: Carl Worth Date: Tue Nov 21 14:19:55 2006 -0800 Remove all libtiff-related code by #ifdef test/pdiff/CompareArgs.cpp | 8 ++++++++ test/pdiff/RGBAImage.cpp | 3 +++ 2 files changed, 11 insertions(+), 0 deletions(-) commit 2b92556abe440e9834174aed7395e2827f62897c Author: Carl Worth Date: Wed Nov 29 22:55:00 2006 -0800 Use uint32_t instead of the non-standard uint32 test/pdiff/RGBAImage.cpp | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 812fd53499d308ff881751e57c1e3287498ddd0f Author: Carl Worth Date: Tue Nov 21 12:15:16 2006 -0800 Add perceptualdiff program totest/pdiff. The perceptualdiff program was written by Hector Yee with contributions from Scott Corley and Mick Weiss. It is hosted at http://pdiff.sourceforge.net The source code added here was obtained by: svn co https://svn.sourceforge.net/svnroot/pdiff/trunk pdiff which gave revision 22 of the source code. The perceptualdiff program is available under the terms of the GNU GPL, so I've added a note to COPYING about this program, (and the fact that it is auxiliary only, and does not affect the license of the implementation of cairo itself). COPYING | 21 +++- test/pdiff/CMakeLists.txt | 55 +++++++ test/pdiff/CompareArgs.cpp | 128 +++++++++++++++ test/pdiff/CompareArgs.h | 44 ++++++ test/pdiff/LPyramid.cpp | 88 +++++++++++ test/pdiff/LPyramid.h | 38 +++++ test/pdiff/Metric.cpp | 316 ++++++++++++++++++++++++++++++++++++++ test/pdiff/Metric.h | 26 +++ test/pdiff/PerceptualDiff.cpp | 45 ++++++ test/pdiff/README.txt | 45 ++++++ test/pdiff/RGBAImage.cpp | 141 +++++++++++++++++ test/pdiff/RGBAImage.h | 57 +++++++ test/pdiff/gpl.txt | 340 +++++++++++++++++++++++++++++++++++++++++ 13 files changed, 1341 insertions(+), 3 deletions(-) commit d9fd942e4774aa29967f908001b62dbc987d2f66 Author: Carl Worth Date: Wed Nov 29 17:18:50 2006 -0800 Add an initial BIBLIOGRAPHY for cairo BIBLIOGRAPHY | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+), 0 deletions(-) commit 8f08daade0430bf965050a81e654aac2a2375b07 Author: Carl Worth Date: Wed Nov 29 17:15:29 2006 -0800 RELEASING: Fix typo RELEASING | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit facffb7ea3e03d131a79486b80d4efc58c303b87 Author: Behdad Esfahbod Date: Tue Nov 28 19:41:52 2006 -0500 [configure] Remove the pkg-config minimum version requirement It was added in commit 157663e1fdf120a71c6cc8222b88d2915a5a73eb because there was a serious bug in the pkg.m4 file from pkg-config 0.18. However, it was fixed two days later. So, instead of requireing 0.18.1 or greater which is not available on Nokia 770 SDK, we just ignore the broken pkg-config 0.18. The problem only happens if one runs autogen.sh with against a broken pkg-config. Configuring tarballs is not affected. configure.in | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 72a4a9834626ddd05c57c6b3f59e936969f0eee9 Author: Behdad Esfahbod Date: Mon Nov 27 13:23:13 2006 -0500 [test|perf|boilerplate/Makefile.am] Add -I$(top_builddir)/src to INCLUDES needed to find cairo-features.h when building out of tree. boilerplate/Makefile.am | 1 + perf/Makefile.am | 1 + test/Makefile.am | 1 + 3 files changed, 3 insertions(+), 0 deletions(-) commit 9c3b161c7067d8eda7f8d1cfb36ca285e4e7fa35 Author: Carl Worth Date: Wed Nov 22 19:31:56 2006 -0800 Bump version to 1.3.5 after making 1.3.4 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 143c56cb12ee5d0b0fbc5e4039dd4fc88764254d Author: Carl Worth Date: Wed Nov 22 19:15:31 2006 -0800 Increment cairo version to 1.3.4 configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e9dd52a337082cebbab2224e3a09702ada8f8e87 Author: Carl Worth Date: Wed Nov 22 19:15:00 2006 -0800 NEWS: Add notes for 1.3.4 snapshot NEWS | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 152 insertions(+), 0 deletions(-) commit 3329abba391ebd502ba74b00ff02b7902a39945a Author: Carl Worth Date: Wed Nov 22 19:11:51 2006 -0800 Add Daniel Amelang and Joonas Pihlaja to the AUTHORS file AUTHORS | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit a8f6d27fba582cc8e935676d26c703fa7b253822 Author: Carl Worth Date: Wed Nov 22 18:42:48 2006 -0800 Add some missing cairo_private decorators src/cairo-freelist-private.h | 12 +++++++----- src/cairo-skiplist-private.h | 14 ++++++++------ src/cairoint.h | 4 ++-- 3 files changed, 17 insertions(+), 13 deletions(-) commit fac3684e686a259658151dac13907fa69f43f727 Author: Joonas Pihlaja Date: Wed Nov 22 08:30:28 2006 +0200 perf: new-tessellator: Deferred trapezoid generation (first try) src/Makefile.am | 2 + src/cairo-bentley-ottmann.c | 163 ++++++++++++++++++++++++++++++++++++------ src/cairo-freelist-private.h | 71 ++++++++++++++++++ src/cairo-freelist.c | 72 ++++++++++++++++++ 4 files changed, 285 insertions(+), 23 deletions(-) commit 6bd72ce74aba4a576e5aa76a5c92bd5557ae97f1 Author: Joonas Pihlaja Date: Mon Nov 20 04:19:17 2006 +0200 Sort pointers instead of cairo_bo_events in the tessellator. We were spending a lot of time in memcpy. src/cairo-bentley-ottmann.c | 54 +++++++++++++++++++++++++++---------------- 1 files changed, 34 insertions(+), 20 deletions(-) commit b177573b729401117a061cd6f07743fa81c01724 Author: Joonas Pihlaja Date: Mon Nov 20 03:56:07 2006 +0200 Make the skip list check for uniqueness. This patch removes a redundant call to skip_list_find() that was being used to detect duplicate intersection events. Instead, skip_list_insert() now takes an additional parameter letting it know what to do with duplicates. src/cairo-bentley-ottmann.c | 12 ++++-------- src/cairo-skiplist-private.h | 8 +++++--- src/cairo-skiplist.c | 25 +++++++++++++++---------- 3 files changed, 24 insertions(+), 21 deletions(-) commit 8bec0bac56785434f5e5860cf5f3560cac82ebb2 Author: Joonas Pihlaja Date: Mon Nov 20 03:45:26 2006 +0200 Malloc less using a free list of nodes. src/cairo-skiplist-private.h | 1 + src/cairo-skiplist.c | 45 ++++++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 8 deletions(-) commit de0e327b3d9aec50d970d8cfc881fb3949df59cc Author: Joonas Pihlaja Date: Mon Nov 20 03:14:20 2006 +0200 Tweak comparators. src/cairo-bentley-ottmann.c | 60 ++++++++++++++++++++---------------------- 1 files changed, 29 insertions(+), 31 deletions(-) commit 67359d7a58c14851936345417833b1e610987c19 Author: Joonas Pihlaja Date: Sat Nov 18 14:59:23 2006 +0200 Separate start and stop events from intersections (first try.) Don't use the skip list for start and stop events, but presort those first. src/cairo-bentley-ottmann.c | 119 ++++++++++++++++++++++++++++++++++-------- src/cairo-skiplist-private.h | 7 +++ src/cairo-skiplist.c | 10 ++++ 3 files changed, 114 insertions(+), 22 deletions(-) commit 97f02dca5d97c9ab815abf881525542ba86cbb11 Author: Joonas Pihlaja Date: Sat Nov 18 01:08:56 2006 +0200 Avoid a skip-list lookup when deactivating edges. src/cairo-bentley-ottmann.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 99f8a5313d336a2779689122feef03b874ed930e Author: Joonas Pihlaja Date: Sat Nov 18 01:01:04 2006 +0200 Special cases for skip list comparators. src/cairo-bentley-ottmann.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 files changed, 37 insertions(+), 2 deletions(-) commit fd8cd39cda7bfde429d840ffd7d5c78ac3045505 Author: Joonas Pihlaja Date: Fri Nov 17 12:24:44 2006 +0200 Use an LFSR instead of random(). src/cairo-skiplist.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 188 insertions(+), 1 deletions(-) commit d957e59744ba6fc482d3ddbce041877e703c0489 Author: Joonas Pihlaja Date: Wed Nov 15 19:58:54 2006 +0200 Replace the 128 bit divrem by a 96/64 bit one. src/cairo-bentley-ottmann.c | 78 +++++++++++++++++++++++-------------------- 1 files changed, 42 insertions(+), 36 deletions(-) commit 1da14262ea059836ae63b875c987fdb5c526db83 Author: Joonas Pihlaja Date: Wed Nov 15 19:57:04 2006 +0200 A 96 by 64 bit divrem that produces a 32 bit quotient and 64 bit remainder. src/cairo-wideint-private.h | 8 ++ src/cairo-wideint.c | 152 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 0 deletions(-) commit 762bd1330d5e3148ddd60949866227cb75b782d6 Author: Carl Worth Date: Fri Sep 22 17:28:00 2006 -0700 Make event_queue_insert ignore duplicate intersection events (not duplicate start/stop events) This fixes the failures of the new tessellator with the 3 tests: bitmap-font, rectangle-rounding-error, and close-path The problem was that identical edges from separate polygons were not being added to the event queue, (because of a check that was actually only intended to prevent an intersection event from being scheduled multiple times). src/cairo-bentley-ottmann.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) commit 4cd871b6f371e86c252c2fa8d8af481d822a1dec Author: Carl Worth Date: Wed Sep 20 10:47:58 2006 -0700 Switch from old tessellator to new tessellator src/Makefile.am | 3 +++ src/cairo-path-fill.c | 6 +++--- src/cairo-path-stroke.c | 2 +- src/cairo-pen.c | 2 +- src/cairo-traps.c | 7 +------ src/cairoint.h | 10 ++++++++++ 6 files changed, 19 insertions(+), 11 deletions(-) commit 0f7c488906128557807ca98aed5c442abf0a0b75 Author: Carl Worth Date: Wed Sep 20 10:47:01 2006 -0700 Adapt new tessellator to match the interface provided by the old tessellator. src/cairo-bentley-ottmann.c | 163 ++++++++++++++++++++++++++++++------------- 1 files changed, 114 insertions(+), 49 deletions(-) commit 8921f733995bc003c6977fd071f0be9e346e0f79 Author: Carl Worth Date: Wed Sep 20 10:41:42 2006 -0700 Add new tessellator (unused) in cairo-bentley-ottmann.c This is the implementation as it cooked in the new-tessellator branch available from: git://people.freedesktop.org/~cworth/cairo The file here comes from commit eee4faf79900be2c5fda1fddd49737681a9e37d6 in that branch. It's sitting here not hooked up to anything in cairo yet, and still with a main function with test cases, etc. src/cairo-bentley-ottmann.c | 1383 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1383 insertions(+), 0 deletions(-) commit c2509f8a721ec489e1b44fa8a68be165363787a7 Author: Carl Worth Date: Wed Sep 20 10:27:35 2006 -0700 Add skip list implementation (many thanks to Keith Packard) The files here are copied directly from the standalone skiplist module available from: git clone git://cworth.org/~cworth/skiplist In particular the files come from the double branch and the following commit on that branch: 8b5a439c68e220cf1514d9b3141a1dbdce8af585 Also of interest is the original skiplist module hosted by Keith Packard that is the original implementation on which these files were based. Since the cworth/skiplist branched off of keithp's, Keith has also now implemented a doubly-linked variant which might be interesting for further simplification of the code. See: git clone git://keithp.com/git/skiplist and the double-link branch there. src/cairo-skiplist-private.h | 87 +++++++++++++++ src/cairo-skiplist.c | 238 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 325 insertions(+), 0 deletions(-) commit 02804773e7ef521adfbd26f90f303879198acde5 Author: Carl Worth Date: Wed Nov 22 16:52:18 2006 -0800 give the big-trap test the XFAIL treatment. We'll need to rewrite this test (and the way cairo is compiled for testing) before it can exercise the bug of interest. In the meantime, let's just give it an "expected failure" status. test/Makefile.am | 1 + test/big-trap.c | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletions(-) commit fdbb820ece5e6ab970cf6a9b756eebf7283c0597 Author: Carl Worth Date: Wed Nov 22 16:43:45 2006 -0800 test: Use round to pass only integers to cairo_show_glyphs (in 3 more tests) This is the same fix as in the recent commit (166dffc96aa26b21f87f12af22b11630583cc85b) but for the same idiom that appears in the operator-clear, operator-source, and unbounded-operator tests. This fixes the failures that were introduced by the recent switch to _cairo_lround. test/operator-clear.c | 4 ++-- test/operator-source.c | 4 ++-- test/unbounded-operator.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) commit 11d21dbaa3604951f73b641e4d88723696157a8e Author: Dan Amelang Date: Tue Nov 21 14:50:29 2006 -0800 Change _cairo_matrix_to_pixman_matrix to use a pixman_transform_t as the template, thus avoiding a forced memcpy src/cairo-matrix.c | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) commit 8a5e296239d1cac705c3c397ab1fd7f7f2ff8d58 Author: Dan Amelang Date: Tue Nov 21 12:14:05 2006 -0800 Optimize _cairo_matrix_to_pixman_matrix for the common case of an identity matrix src/cairo-matrix.c | 35 ++++++++++++++++++++++++----------- 1 files changed, 24 insertions(+), 11 deletions(-) commit b7cd46ddc2a2523b4d33b22e07cdbdc09b90fa7d Author: Dan Amelang Date: Mon Nov 20 14:31:28 2006 -0800 Add and incorporate _cairo_gstate_transform_glyphs_to_backend After changing _cairo_gstate_show_glyphs and _cairo_gstate_glyph_path to use this function, we see a significant speedup due to the elimination of redundant FP calculations. src/cairo-gstate.c | 92 ++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 72 insertions(+), 20 deletions(-) commit 6cfb4a01e005cb0f4f797ff9aa02e80b3d755a9e Author: Dan Amelang Date: Mon Nov 20 14:08:46 2006 -0800 Refactor _cairo_matrix_is_integer_translation Now that we have _cairo_matrix_is_translation, we can change _cairo_matrix_is_integer_translation to use it and thus reduce code duplication. src/cairo-matrix.c | 42 +++++++++++++++++++----------------------- 1 files changed, 19 insertions(+), 23 deletions(-) commit ca79307bdf9bc8042c9afd570bf10d605d3dfc1e Author: Dan Amelang Date: Mon Nov 20 10:42:50 2006 -0800 Add _cairo_matrix_is_translation src/cairo-matrix.c | 7 +++++++ src/cairoint.h | 3 +++ 2 files changed, 10 insertions(+), 0 deletions(-) commit 57fba8d9b6915fe4b0f506ecb2ef18a9002de370 Author: Daniel Amelang Date: Thu Nov 2 22:24:34 2006 -0800 Replace existing rounding code with _cairo_lround src/cairo-directfb-surface.c | 12 ++++++------ src/cairo-ft-font.c | 4 ++-- src/cairo-glitz-surface.c | 4 ++-- src/cairo-scaled-font.c | 14 ++++++-------- src/cairo-win32-font.c | 14 ++++++++------ src/cairo-win32-surface.c | 7 ++++--- src/cairo-xcb-surface.c | 28 ++++++++++++++-------------- src/cairo-xlib-surface.c | 16 ++++++++-------- 8 files changed, 50 insertions(+), 49 deletions(-) commit efb483c3a36f8168d52086c2f61162f5a0306c15 Author: Daniel Amelang Date: Thu Nov 2 22:22:17 2006 -0800 Add _cairo_lround for much faster rounding This function uses the same "magic number" approach as _cairo_fixed_from_double. src/cairo.c | 25 +++++++++++++++++++++++++ src/cairoint.h | 3 +++ 2 files changed, 28 insertions(+), 0 deletions(-) commit 166dffc96aa26b21f87f12af22b11630583cc85b Author: Carl Worth Date: Tue Nov 21 20:57:01 2006 -0800 test/clip-operator: Use round to pass only integers to cairo_show_glyphs We were previously passing half-integer values here, which will not be robust to changes in the rounding mode used for cairo_show_glyphs. Use round() to match the rounding expected by the reference images. test/clip-operator.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit eaaeba170d4c8313443412d88ee63311723b546d Author: Behdad Esfahbod Date: Tue Nov 21 19:05:16 2006 -0500 [SVG] Fix compiler warning cairo-svg-surface.c:980: warning: 'id' might be used uninitialized in this function src/cairo-svg-surface.c | 112 +++++++++++++++++++++++------------------------ 1 files changed, 55 insertions(+), 57 deletions(-) commit c6fceb6721a26d801be0fa8ed3028f9dc8b7dfed Author: Behdad Esfahbod Date: Tue Nov 21 17:52:58 2006 -0500 [PS] Rename n_glyphs to num_glyphs_unsigned Follow-up on my previous commit. Use a more descriptive name to avoid confusion between n_glyphs and num_glyphs. src/cairo-ps-surface.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) commit 75eeb889767468b374df5f0aa6fb7ba1fe6addf9 Author: Behdad Esfahbod Date: Tue Nov 21 12:10:36 2006 -0500 [PS] Eliminate compiler warnings about unoptimizable loops An innocient-looking loop like this: for (j = 0; j <= last; j++) something(); cannot be optimized, because it may loop forever! Imagine the case that last is MAXINT, the loop will never end. The correct way to write it is: for (j = 0; j < last+1; j++) something(); In this case, if last is MAXINT, the loop will never run. Not correct, but better than looping forever. Still better would be to correctly handle the MAXINT case (even though it doesn't make any sense to show MAXINT number of glyphs in one operation!) To do that, we can use the fact that the input num_glyphs is a signed. If there is one good thing about using signed int as input length, it's that you can use an unsigned looping variable to avoid looping forever. That is exactly what this patch does. src/cairo-ps-surface.c | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) commit 2dbb3dfd5f7e3d802f1c3c57b39f9d69b2b7ee1e Author: Emmanuel Pacaud Date: Tue Nov 21 14:43:43 2006 +0100 SVG: plug a memory leak What's the point in creating a memory stream if we overload the pointer a couple of lines below ? src/cairo-svg-surface.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit 12f8718a3ed40e51e3edd678874d0a13e0eaaa74 Author: Behdad Esfahbod Date: Tue Nov 21 00:10:03 2006 -0500 [SVG] Define enum _cairo_svg_version. src/cairo-svg.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 9cffc56228498e9d9fb1c047e1e1f2daaabac698 Author: Vladimir Vukicevic Date: Mon Nov 20 15:30:04 2006 -0800 [test] add big-trap test This test fills a single path (a trapezoid, even) that's larger than the 16.16 precision used in pixman and other code. It leads to memory scribbling and a crash. Note that there is no crash if a clip is not set. test/Makefile.am | 1 + test/big-trap.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 0 deletions(-) commit a91c1e3ea6c5d338f2d7cd61db5eede5076de3b2 Author: Carl Worth Date: Mon Nov 20 14:01:50 2006 -0800 Require librsvg 2.15.0 (was 2.14.0) for testing of SVG backend. Bryce Harrington saw off-by-one errors in output image size with a 2.14.x version of librsvg. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e5bd21136cc43f569cdf424d2fd47d8298b53fb6 Author: Carl Worth Date: Mon Nov 20 09:32:00 2006 -0800 Add const qualifier to cairo_path_t* parameter of cairo_append_path src/cairo-path-data-private.h | 4 ++-- src/cairo-path-data.c | 4 ++-- src/cairo.c | 4 ++-- src/cairo.h | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) commit 10920c1326362b4fadfa01019223647c23351127 Merge: 1ed3811... 2928f6e... Author: Emmanuel Pacaud Date: Sat Nov 18 12:59:12 2006 +0100 Merge branch 'svgprint' commit 1ed3811338a03068b7ce60f83fdd23fe01fec972 Author: Carl Worth Date: Fri Nov 17 17:50:14 2006 -0800 perf: Add box_outline test case. This test shows that drawing a 100x100 single-pixel wide box outline is currently 5 to 16 times slower when using the natural cairo_stroke() as compared to a rather awkward cairo_fill() of two rectangles. [ # ] backend-content test-size min(ticks) min(ms) median(ms) stddev. iterations [ 0] image-rgba box-outline-stroke-100 301321 0.218 0.219 0.39% 5 [ 1] image-rgba box-outline-fill-100 18178 0.013 0.013 0.43% 5 [ 0] xlib-rgba box-outline-stroke-100 379177 0.275 0.276 1.39% 6 [ 1] xlib-rgba box-outline-fill-100 83355 0.060 0.060 0.17% 5 perf/Makefile.am | 1 + perf/box-outline.c | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf.c | 1 + perf/cairo-perf.h | 2 + 4 files changed, 97 insertions(+), 0 deletions(-) commit a8faa0aef11abbd743ac9dc0b3127f9384325ee2 Author: Carl Worth Date: Fri Nov 17 17:48:39 2006 -0800 cairo-perf: When iteration count is given on command-line, never execute fewer perf/cairo-perf.c | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit a97b697d8fbba4ffc5a45a256603232ab5a4e86d Author: Carl Worth Date: Thu Nov 16 10:38:53 2006 -0800 ROADMAP: Set cairo 1.4 to early January for sake of Gnome 2.18 ROADMAP | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-) commit db603d66476a7a8e6b7e52b907212d289f9fbdb4 Author: Carl Worth Date: Wed Nov 15 15:33:52 2006 -0800 Increment cairo version to 1.3.3 after 1.3.2 snapshot configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 804e20b55d049a26fe4d96bb6d79890c65e43ab5 Author: Carl Worth Date: Wed Nov 15 13:32:15 2006 -0800 Update cairo version and libtool version for 1.3.2 snapshot configure.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit c63fd9437b69bd2ce5d9e0f5784d13a05ac7b867 Author: Carl Worth Date: Wed Nov 15 13:30:16 2006 -0800 NEWS: Add notes for 1.3.2 snapshot NEWS | 179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 179 insertions(+), 0 deletions(-) commit a2d625edc62f35b4fbcefa6986918060f23fa1e6 Author: Behdad Esfahbod Date: Thu Nov 2 19:52:03 2006 -0500 Add notes for the 1.2.6 release. NEWS | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 60 insertions(+), 0 deletions(-) commit eeb1fa42aa44e1422dcfcdc6eb772b764c3ced58 Author: Carl Worth Date: Tue Nov 14 14:44:03 2006 -0800 Add missing pattern-getters-ref.png to Makefile to avoid breaking distcheck target test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 28a9f1dd1407b0070a2ba1c780a6f763acb47810 Author: Carl Worth Date: Tue Nov 14 14:35:35 2006 -0800 Fix get-clip test for surfaces not implementing set_clip_region test/get-clip.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) commit 7b86cf513e9f6bdf68e391f6df6f859eba05ba9c Author: Carl Worth Date: Tue Nov 14 14:34:36 2006 -0800 Remove non-existent reference images from Makefile to avoid breaking distcheck target test/Makefile.am | 9 --------- 1 files changed, 0 insertions(+), 9 deletions(-) commit 0f7381b26eae74903754b4fb5c1220a8626df5f4 Author: Carl Worth Date: Tue Nov 14 13:27:52 2006 -0800 cairo-perf-diff: Run git-ls-tree from the correct directory Before this change, cairo-perf-diff would work correctly only if run from the top-level directory, (and if run from any other directory it would not pull in the latest boilerplate and perf files). perf/cairo-perf-diff | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit f3f6ea3092072defb958ee3a6b2271cb51b4a4ca Author: Behdad Esfahbod Date: Tue Nov 14 17:58:09 2006 -0500 Fix typo. src/cairo-traps.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 29b01f93ca9b29699420700ea9e2817898afa3ca Author: Carl Worth Date: Sat Nov 11 10:43:11 2006 -0800 Make miter join code use tessellate_convex_quad rather than tessellate_polygon This provides an additional 22-29% speedup on top of the previous fix for stroking paths with many miter joins: image-rgba world_map-800 459.73 0.27% -> 356.80 0.32%: 1.29x speedup ▎ image-rgb world_map-800 458.83 0.37% -> 358.08 0.41%: 1.28x speedup ▎ xlib-rgba world_map-800 566.57 0.23% -> 463.84 0.31%: 1.22x speedup ▎ xlib-rgb world_map-800 562.31 0.64% -> 460.51 0.83%: 1.22x speedup ▎ src/cairo-path-stroke.c | 20 +++++++------------- 1 files changed, 7 insertions(+), 13 deletions(-) commit 3d53f623faed4aed2517e207d77a6da7e3b74fbd Author: Carl Worth Date: Fri Nov 10 12:56:32 2006 -0800 Make _cairo_stroker_add_sub_edge use tessellate_convex_quad rather than tessellate_polygon This gives a 17-20% speedup for stroking polygons with many straight line segments as seen in the world_map test case: Speedups ======== image-rgba world_map-800 555.41 0.17% -> 460.69 0.20%: 1.21x speedup ▎ image-rgb world_map-800 554.91 0.25% -> 460.73 0.26%: 1.20x speedup ▎ xlib-rgb world_map-800 669.85 3.70% -> 570.31 0.24%: 1.17x speedup ■xlib-rgba world_map-800 663.71 0.46% -> 567.74 0.19%: 1.17x speedup ■src/cairo-path-stroke.c | 31 ++++++------------------------- 1 files changed, 6 insertions(+), 25 deletions(-) commit fefa7d9b993b1fc0759cfe1f8faff8dec9dc5c85 Author: Carl Worth Date: Fri Nov 10 12:53:33 2006 -0800 Rewrite tessellate_rectangle as tessellate_convex_quad to make it more useful Currently there aren't even any users of this code, (they had stopped using it when they realized what they really wanted was tessellate_convex_quad). src/cairo-traps.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++------- src/cairoint.h | 2 +- 2 files changed, 112 insertions(+), 17 deletions(-) commit e324bbcbc6ca86a714aa91fe5cd010a4ce4f1753 Author: Carl Worth Date: Fri Nov 10 12:37:01 2006 -0800 Add a status field to cairo_traps_t to enable less error checking src/cairo-traps.c | 148 +++++++++++++++++++++++------------------------------ src/cairoint.h | 2 + 2 files changed, 67 insertions(+), 83 deletions(-) commit 74f5fe241e6ce424a7d56a0ae48ddad202b82248 Author: Carl Worth Date: Mon Nov 13 14:44:07 2006 -0800 cairo-perf-diff: rsync only git-managed files from boilerplate/perf Previously, we were using rsync to recursively copy all files from boilerplate and perf when doing the performance tests. This had the fatal flaw that pre-built binaries would be hard coded to link against the cairo library from $CAIRO_DIR with an absolute path, (due to libtool rpath stuff). By only copying git-managed files, we only get source and the compiled binaries (or libtool wrappers) will now be hard-coded to link against the library under test. perf/cairo-perf-diff | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit 2928f6eb5f5bd207f8f41a628ad95d6552aa8246 Author: Emmanuel Pacaud Date: Sun Nov 12 20:49:34 2006 +0100 test/pixman-rotate.c: Don't issue a show_page, it's already done in cairo-test.c test/pixman-rotate.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit 4f02395267dc0cccef231e548a914329dce2831f Author: Emmanuel Pacaud Date: Sun Nov 12 20:45:50 2006 +0100 Use SVG multipage capability. test/fallback-resolution.c | 33 +++------------------------------ 1 files changed, 3 insertions(+), 30 deletions(-) commit ad6d3a8369569cefde4984c0102cacf56b159cc7 Author: Emmanuel Pacaud Date: Sun Nov 12 20:45:10 2006 +0100 Add SVGPrint support. It's only activated when svg version >= 1.2. Last page without a show page call is ignored if blank. src/cairo-svg-surface.c | 127 +++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 113 insertions(+), 14 deletions(-) commit 26b74049e79a6137e8556e1b3e5c3aedd780abb0 Author: Carl Worth Date: Fri Nov 10 10:31:14 2006 -0800 cairo-perf-diff: Use rsync instead of cp to avoid some unnecessary rebuilding perf/cairo-perf-diff | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f1f189b81a24730b7c5b5761165ab30bb8310bca Author: Carl Worth Date: Fri Nov 10 10:20:49 2006 -0800 cairo-perf-diff: Separate old and new build directories With the fancy new, incremental cairo-perf-diff we don't want to keep resetting the same working tree back and forth between the old and new versions and rebuilding everything all over again. So use two different build directories instead of one. This fixes the rebuild of the library itself, but the perf stuff is still being rebuilt, (since it's being re-copied each time). perf/cairo-perf-diff | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) commit d9b697c46ceb4849436df162d0574b08856680bb Author: Carl Worth Date: Fri Nov 10 10:04:01 2006 -0800 cairo-perf-diff: Allow incremental refinement of performance results cairo-perf-diff now accepts a -f command-line option to force it to re-generate performance results even if something exists in the cache already. It also now uses raw mode and appends to the cached file rather than rewriting the results. Finally, it also now allows a -- option on the command line and passes all the subsequent command-line options to cairo-perf. This is handy for limiting cairo-perf to run only on a subset of the tests of interest. perf/cairo-perf-diff | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 41 insertions(+), 9 deletions(-) commit 439bf81e56955ea543a890d5e89622745598c8ea Author: Carl Worth Date: Fri Nov 10 10:00:31 2006 -0800 Fix broken size calculation for xrealloc Another one of those "untested code == broken code" situations. perf/cairo-perf-diff-files.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit f6b400a292759a7d603843afa6030ebb01349855 Author: Carl Worth Date: Wed Nov 8 05:45:09 2006 -0800 perf: Add world-map performance test case. The map for this test case was originally demonstrated as a performance problem in this mozilla bug report: A very slow SVG file with s https://bugzilla.mozilla.org/show_bug.cgi?id=332413 I obtained permission from the creator of the original file to include the data here, (see comments in world-map.h for details). perf/Makefile.am | 2 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/world-map.c | 107 +++++++++++++++++++++++++++++ perf/world-map.h | 196 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 307 insertions(+), 0 deletions(-) commit 2d927eaefa1188d11c056a055321763faf43573e Author: Carl Worth Date: Wed Nov 8 05:40:17 2006 -0800 perf/Makefile.am: Add missing zrusin-another.h file to list perf/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 0d1340f7169920c901a0f6d6f8ecb4529e57ada4 Author: Carl Worth Date: Wed Nov 8 05:39:06 2006 -0800 perf: Eliminate CAIRO_STATS_MIN_VALID_SAMPLES We don't need this at this deep level since callers can now implement this limiting manually since stats.iterations is now returned. Also, this was interfering with the -i option to cairo-perf anyway. perf/cairo-perf.c | 7 ++----- perf/cairo-stats.c | 7 +------ perf/cairo-stats.h | 9 +-------- 3 files changed, 4 insertions(+), 19 deletions(-) commit 6d5df0e3e2e9804cede77cfd0d3659bd2d36a918 Author: Carl Worth Date: Tue Nov 7 13:06:01 2006 -0800 cairo-perf-diff-files: Add support for diffing "raw" files from "cairo-perf -r" perf/cairo-perf-diff-files.c | 161 +++++++++++++++++++++++++++++++++--------- 1 files changed, 128 insertions(+), 33 deletions(-) commit d1e1192090c56b5fa0794faae319cfaa88fc1788 Author: Carl Worth Date: Tue Nov 7 12:59:57 2006 -0800 cairo-perf: Print ticks_per_ms value in raw mode so raw analysis tools can report times perf/cairo-perf.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) commit 5393989272881f9128df3c4a3fc6bb2c08b06a1e Author: Carl Worth Date: Tue Nov 7 12:57:48 2006 -0800 perf: Move statistics code into new cairo-stats.h for sharing perf/Makefile.am | 6 ++- perf/cairo-perf.c | 106 +++------------------------------------------------ perf/cairo-perf.h | 6 ++- perf/cairo-stats.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++ perf/cairo-stats.h | 51 ++++++++++++++++++++++++ 5 files changed, 174 insertions(+), 103 deletions(-) commit 7673e3ac3fc36042efcbccc3836d8bc81bdb94b3 Author: Carl Worth Date: Tue Nov 7 12:50:52 2006 -0800 boilerplate: Add xrealloc function boilerplate/xmalloc.c | 12 ++++++++++++ boilerplate/xmalloc.h | 3 +++ 2 files changed, 15 insertions(+), 0 deletions(-) commit 1e4515c548bd2a1440c630d779a948e5b02890e9 Author: Vladimir Vukicevic Date: Tue Nov 7 13:15:28 2006 -0800 [win32] implement EXTEND_REPEAT in composite when possible Optimizes EXTEND_REPEAT, especially when DDBs are in use through the use of PatBlt or manually expanding out the repeated blits (up to a limit). Will still fall back to fallback code as necessary. src/cairo-win32-surface.c | 386 +++++++++++++++++++++++++++++++-------------- 1 files changed, 266 insertions(+), 120 deletions(-) commit 6db219c3a16bbbe736653946ea5a4758656a9cd9 Author: Vladimir Vukicevic Date: Fri Nov 3 10:04:28 2006 -0800 [win32] clean up win32_surface_composite Make sure that all operations are correct (the operations chosen are listed in cairo-win32-surface.c); in particular, deal with the extra byte present in FORMAT_RGB24 surfaces correctly. Also adds support for calling StretchDIBits to draw RGB24 cairo_image_surfaces directly. src/Makefile.win32 | 3 +- src/cairo-win32-private.h | 5 +- src/cairo-win32-surface.c | 318 +++++++++++++++++++++++++++++---------------- src/cairoint.h | 5 + test/Makefile.win32 | 1 - 5 files changed, 218 insertions(+), 114 deletions(-) commit 3e002a474b64c83f8768ba8918209eca9d7599a3 Author: Vladimir Vukicevic Date: Fri Nov 3 09:47:31 2006 -0800 [win32] Update pixman MMX code to work with MSVC Patch from Tor Lillqvist. pixman/src/Makefile.win32 | 3 +- pixman/src/fbmmx.c | 187 +++++++++++++++++++++++++++----------------- pixman/src/fbpict.c | 57 ++++++++++++++ 3 files changed, 174 insertions(+), 73 deletions(-) commit fc87d4148131ce01f645aec12a5e1b6d6b55d337 Author: Behdad Esfahbod Date: Tue Nov 7 15:07:33 2006 -0500 [configure] Err if a suitable pkg-config is not found configure.in | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit fc584e1fbb87752f6123fbc02c1c27e538dd13f0 Author: Carl Worth Date: Tue Nov 7 01:42:21 2006 -0800 Rewrite _cairo_matrix_transform_bounding_box to actually accept a box not a rectangle It turns out that all of the callers want a box anyway, so this simplfies the code in addition to being more honest to the name. (For those new to the convention, a "box" is an (x1,y2),(x2,y2) pair while a "rectangle" is an (x,y),(width,height) pair.) src/cairo-gstate.c | 9 ++------- src/cairo-matrix.c | 39 +++++++++++++++++---------------------- src/cairo-pattern.c | 19 ++++++++----------- src/cairoint.h | 4 ++-- 4 files changed, 29 insertions(+), 42 deletions(-) commit 777eaf326a56bb3b2ec3e6408309336d2bf6754f Author: Carl Worth Date: Tue Nov 7 01:33:40 2006 -0800 test/Makefile.am: Fix typo in EXTRA_DIST that was breaking distcheck test/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0564b5074c431c3e723d906769b5383eddae659d Author: Carl Worth Date: Tue Nov 7 01:29:38 2006 -0800 cairo-perf: Add command line options for test cases to run, listing tests, and new raw mode. perf/cairo-perf.c | 163 +++++++++++++++++++++++++++++++++++++++++++---------- perf/cairo-perf.h | 7 ++ 2 files changed, 139 insertions(+), 31 deletions(-) commit 49b72f004d4de50de86f7f350ce01aa5b48f35ae Author: Carl Worth Date: Mon Nov 6 23:56:19 2006 -0800 Add zrusin-another test cases (tessellate and fill). This new test case is the 0th polygon polygon from Zack Rusin's recent cairorender program as made avaialable here: http://ktown.kde.org/~zrusin/examples/cairorender.tar.bz2 This polygon contains about 1000 coordinates and looks like a hand-drawn version of the word another. perf/Makefile.am | 3 +- perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/zrusin-another.h | 668 +++++++++++++++++++++++++++++++++++++++++++++++++ perf/zrusin.c | 90 +++++++ 5 files changed, 762 insertions(+), 1 deletions(-) commit 52eb7134bd22c648a10e2b9b8c5d1409de309887 Author: Carl Worth Date: Fri Nov 3 15:32:57 2006 -0800 cairo-perf-diff: Use two-part hash to avoid stale data when perf suite changes. The perf tree's sha1 is now in the cache file name, so that if the performance suite itself ever changes then new data will be generated rather than using stale stuff from the cache. Also, we now use the src tree's sha1 rather than the commit's so that commits that don't change the src directory are also treated as identical, (which they really should be as far as performance of the library itself is concerned). perf/cairo-perf-diff | 18 +++++++++++++++--- perf/cairo-perf.c | 2 +- 2 files changed, 16 insertions(+), 4 deletions(-) commit e760d0927ee5b732392284fc19fda225f137f909 Author: Carl Worth Date: Fri Nov 3 14:58:30 2006 -0800 Don't rely on NQUARTZ or OS2 surface types unless they exist. This allows the cairo-perf stuff to build on older checkouts, (such as 1.2.4), so that we can usefully do things like: cairo-perf-diff 1.2.4 HEAD perf/cairo-perf.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 4cd50965a1935bf934f39f9e35b7d1a055ae7e16 Author: Dan Amelang Date: Sun Oct 29 21:31:23 2006 -0800 Change _cairo_fixed_from_double to use the "magic number" technique See long thread here: http://lists.freedesktop.org/archives/cairo/2006-October/008285.html This patch provides a 3x performance improvement (on x86) for the conversion of floating-point to fixed-point values as measured by the recent pattern_create_radial performance test: image-rgba pattern_create_radial-16 8.98 3.36% -> 2.97 1.03%: 3.38x speedup ██■image-rgb pattern_create_radial-16 8.94 3.21% -> 2.97 0.18%: 3.36x speedup ██■xlib-rgb pattern_create_radial-16 9.55 3.17% -> 3.64 0.51%: 2.93x speedup █▉ xlib-rgba pattern_create_radial-16 9.63 3.53% -> 3.69 0.66%: 2.91x speedup █▉ src/cairo-fixed.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 47 insertions(+), 1 deletions(-) commit 5376e474255b80d084dd250cab6ea5c14220a3f3 Author: Dan Amelang Date: Sun Oct 29 21:30:08 2006 -0800 Add autoconf macro AX_C_FLOAT_WORDS_BIGENDIAN The symbol that this macro defines (FLOAT_WORDS_BIGENDIAN) can be used to make double arithmetic tricks portable. acinclude.m4 | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ configure.in | 1 + 2 files changed, 66 insertions(+), 0 deletions(-) commit 941b517024c79dfd157337565477b0a440924702 Author: Carl Worth Date: Fri Nov 3 13:26:48 2006 -0800 cairo-perf-diff: Build and run latest cairo-perf program rather than whatever was in the old checkout perf/cairo-perf-diff | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit e2ede57fbb8d729f066bc592e33bae23a11fa4d9 Author: Carl Worth Date: Fri Nov 3 12:40:09 2006 -0800 cairo-perf-diff: Fix to still function if run from the top-level directory containing .git perf/cairo-perf-diff | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 8e74f9f945f4a498ec64930ddd46cc89129812bc Author: Jinghua Luo Date: Mon Nov 6 12:21:25 2006 +0800 glitz: fix a memory leak in _cairo_glitz_surface_composite_trapezoids. src/cairo-glitz-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit e759959fd6a59d439fe5fe147326401619cb939b Author: Behdad Esfahbod Date: Thu Nov 2 21:15:41 2006 -0500 [Makefile.am] Pass tag message to git-tag in release-publish (cherry picked from 7cac87c8041f63fac2e0a2f5a29e36ed80d8d51a commit) Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 91ffb36faa121ccfaa57d8857c239dd3a6bb3e95 Author: Behdad Esfahbod Date: Thu Nov 2 21:13:49 2006 -0500 [Makefile.am] Minor fixes in release-publish output (cherry picked from 953332d128120e7c4f4197390984be11a80a368b commit) Makefile.am | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 16bc72feafac4f78552cd003680ae7133562b6f4 Author: Carl Worth Date: Thu Nov 2 17:16:52 2006 -0800 Increment CAIRO_VERSION to 1.3.1 now that a 1.2.6 release exists configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 5500c59b9be9f7f32e8b3d0d9b5fa775e50fbe98 Author: Carl Worth Date: Thu Nov 2 12:27:17 2006 -0800 Remove typo (mean vs median) This didn't end up making a difference in practice since the median is assigned again later on. perf/cairo-perf.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit b717e987776d60cbc37434f7c918ad438e29b1a4 Author: Carl Worth Date: Thu Nov 2 12:21:26 2006 -0800 cairo-perf: Change outlier elimination and report minimum times. Instead of just discarding the worst 15% of the results, we now do IQR-based detection and elimination of outliers. Also, instead of reporting mean times we now report minimum and median times. We still do compute the mean and standard deviation for the detection of when results seem stable for early bailout. And we do still report the standard deviation. A statistician might complain that it looks funny to report the median and the standard deviation together, (instead of median and average absolute deviation from the median, say), but I liked the standard deviation since it is always larger, so it might ensure better separatation if we use it to determine when two sets of results are sufficiently different to be interesting. perf/cairo-perf-diff-files.c | 43 +++++++++---------- perf/cairo-perf.c | 92 +++++++++++++++++++++++++++++++++-------- 2 files changed, 94 insertions(+), 41 deletions(-) commit d2d0d11bdefa012d65364b24477bb86c8475ca86 Author: Dan Amelang Date: Tue Oct 31 23:47:35 2006 -0800 Add new perf test "pattern_create_radial" This test is really just for hammering the double to fixed-point conversion (in _cairo_fixed_from_double) that happens as doubles from API calls gets translated into internal cairo fixed-point numbers. perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/pattern_create_radial.c | 98 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+), 0 deletions(-) commit a618fd2cf90575ac7695b614328f1123db86b372 Author: Carl Worth Date: Fri Oct 27 00:51:24 2006 -0700 cairo-perf-diff: Simplify git usage and just run cairo-perf that gets built with cairo revision Many thanks to Josh Triplett for help with theses fixes: 1. Simplify the usage of git to eliminate the fragile and nasty stuff we were doing previously, (such as manually symlinking things under .git rather than just using git-clone -s). 2. Don't try running latest cairo-perf with LD_LIBRARY_PATH pointing to built cairo version. Apparently stupid libtool and its use of rpath is foiling us here. Instead just run whatever cairo-perf gets built as part of the source that gets checked out. This second point means that cairo-perf-diff won't yet be useful for comparing the performance of old cairo revisions that pre-date cairo-perf. I've since been reasing and we might be able to use --disable-rpath to the configure script to get what we want. perf/cairo-perf-diff | 22 ++++++---------------- 1 files changed, 6 insertions(+), 16 deletions(-) commit 504ea250f7c052525cf28536c767d4f9f57e7cc9 Author: Jamey Sharp Date: Sun Oct 29 13:48:14 2006 -0800 XCB/perf: implement boilerplate_xcb_synchronize for fair performance tests. It sure was nice when some tests showed XCB to be 1300 times faster than Xlib though... boilerplate/cairo-boilerplate.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-) commit bc983700c463671128822e2eb9f74cbe834a1c1b Author: Behdad Esfahbod Date: Sun Oct 29 14:49:06 2006 -0500 [autogen.sh] Make sed script portable autogen.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7442b4086667ed67d9086e817af3d3c081a2b6f1 Author: Jamey Sharp Date: Sun Oct 29 11:18:09 2006 -0800 perf: cairo-perf-diff-files.c should generate cairo-perf-diff-files ... rather than overwriting the new cairo-perf-diff script, which should (by the way) be included in dist tarballs. perf/Makefile.am | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit b0f5af3b473e5d58e0fc07a38948c83897e1b1fc Author: Jamey Sharp Date: Sun Oct 29 10:59:30 2006 -0800 Add clip-push-group to .gitignore. test/.gitignore | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit a34ba73136a1b34c413eff78a44c28a6f1ba80f6 Author: Christian Biesinger Date: Fri Oct 27 23:50:57 2006 +0200 [beos] Allow a pixel error of 1 for BeOS tests That allows us to delete the BeOS-specific reference images. boilerplate/cairo-boilerplate.c | 9 ++++++--- test/mask-beos-bitmap-argb32-ref.png | Bin 87641 -> 0 bytes test/mask-beos-bitmap-rgb24-ref.png | Bin 71028 -> 0 bytes test/mask-beos-rgb24-ref.png | Bin 71028 -> 0 bytes test/set-source-beos-bitmap-rgb24-ref.png | Bin 124 -> 0 bytes test/set-source-beos-rgb24-ref.png | Bin 124 -> 0 bytes test/trap-clip-beos-bitmap-rgb24-ref.png | Bin 63088 -> 0 bytes test/trap-clip-beos-rgb24-ref.png | Bin 63088 -> 0 bytes 8 files changed, 6 insertions(+), 3 deletions(-) commit 2ec0237051cd4f756a8205cb9ecafc7bfe285a06 Author: Christian Biesinger Date: Fri Oct 27 23:47:15 2006 +0200 [beos] make tests compile again boilerplate/cairo-test-beos.cpp | 44 +++++++++++++++++++++++++++++--------- boilerplate/cairo-test-beos.h | 16 ++++++++++--- 2 files changed, 45 insertions(+), 15 deletions(-) commit e29aea745aa2c23ac9d60612813d5e415e1f8e57 Author: Christian Biesinger Date: Fri Oct 27 12:07:26 2006 +0200 [win32] Add parentheses around & operator This fixes a GCC warning. Also, it fixes a bug: The precedence of & is not what you might expect. src/cairo-win32-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 61bf9b009b47312c20d54198790542cd20fc5576 Author: Carl Worth Date: Thu Oct 26 15:52:21 2006 -0700 Make xlib and xcb backends tolerant of single-bit errors in the test suite output. boilerplate/cairo-boilerplate.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) commit 05a259d49368fb128b99d99f3776f8783df9d4ed Author: Christian Biesinger Date: Thu Oct 26 21:40:35 2006 +0200 [beos] Fix build error Rename cairo_rectangle_fixed_t to cairo_rectangle_int16_t as needed per commit 746f66c3fce6de39ac9afa7be8bcf8f74c750e85. src/cairo-beos-surface.cpp | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) commit acac0c19667d2166e2a26b07445fa78640dc8a33 Author: Ian Osgood Date: Thu Oct 26 09:56:13 2006 -0700 don't squish tiny images in test/index.html test/make-html.pl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit bd0f9919086f2978eb1df22cd5c1fffb7621d33f Author: Adrian Johnson Date: Fri Oct 27 00:00:24 2006 +0930 Add OpenType/CFF Subsetting src/Makefile.am | 1 + src/cairo-cff-subset.c | 1452 +++++++++++++++++++++++++++++++ src/cairo-pdf-surface.c | 107 +++ src/cairo-scaled-font-subsets-private.h | 40 + src/cairo-truetype-subset-private.h | 1 + 5 files changed, 1601 insertions(+), 0 deletions(-) commit e4c3da80806804574c99170b1df3cb92f6493283 Author: Adrian Johnson Date: Thu Oct 26 23:41:57 2006 +0930 PS: Use xshow/yshow/xyshow for strings of glyphs Optimize show glyphs by looking for strings of glyphs from the same subset and use the xyshow operator to display. As a further optimization the xshow and yshow operators are used for displaying horizontal and vertical text. src/cairo-ps-surface.c | 149 +++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 121 insertions(+), 28 deletions(-) commit e1ded5b1e042c8cefa7f136228d5a63a7bdf84b5 Author: Behdad Esfahbod Date: Wed Oct 25 21:40:08 2006 -0400 [PDF] Set CTM before path construction The previous order is undefined according to the PDF spec. The resulting PDF was being misrendered using OS X Preview viewer. This was reported in this thread: http://lists.freedesktop.org/archives/cairo/2006-October/008271.html src/cairo-pdf-surface.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit a9f51c29733a5124e0d04d8dcc00d55ff3aeb05a Author: Carl Worth Date: Wed Oct 25 17:15:22 2006 -0700 Add new cairo-perf-diff for finding the performance difference between any 2 revisions. The old cairo-perf-diff is now named cairo-perf-diff-files, but the new one calls out to it and can still be used in an identical way. The new cairo-perf-diff can also be used to see what the performance impact of a single commit is like so: cairo-perf-diff HEAD or between two commits: cairo-perf-diff 1.2.4 HEAD The script is careful to always run the latest cairo-perf program even when testing old versions of the library. Also, the output from any given performance run is cached so it gets less painful to run as the cache gets primed (the cache is in .perf next to .git). The script is still a bit fragile in spots. In particular it depends on cairo-perf being built in advance but doesn't do anythin to ensure that happens. perf/.gitignore | 2 +- perf/Makefile.am | 7 +- perf/cairo-perf-diff | 106 +++++++++ perf/cairo-perf-diff-files.c | 482 ++++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf-diff.c | 482 ------------------------------------------ 5 files changed, 594 insertions(+), 485 deletions(-) commit c7b9f84744cd3fe4a6c9dead1e128d91f9cfc3cb Author: Behdad Esfahbod Date: Wed Oct 25 16:07:15 2006 -0400 Require automake 1.7 again We are not using the slash-in-SUBDIRS feature of automake 1.9 anymore, so bump required version down. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f85aca4c3ff02a38b83da48b618e420b79b29c37 Author: Behdad Esfahbod Date: Wed Oct 25 16:06:42 2006 -0400 Make autogen.sh extract required versions from configure.in autogen.sh | 42 ++++++++++++++++++++++++++---------------- configure.in | 19 +++++++++++-------- 2 files changed, 37 insertions(+), 24 deletions(-) commit 838ff68cd5d866ca373af95f43afe0219fdd6159 Author: Behdad Esfahbod Date: Wed Oct 25 15:44:03 2006 -0400 [perf] Remove SUBDIRS=../boilerplate and add explicit dependencies This is quite like what I just did in test/. We can now require an older version of automake as we used to. perf/Makefile.am | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 02096f66f365c109ddf41432b9a818726d45cbae Author: Carl Worth Date: Wed Oct 25 12:51:35 2006 -0700 Fix typo src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7955fe63cc6bdb3a525535c7f052ea354cc7497c Author: Carl Worth Date: Wed Oct 25 12:51:17 2006 -0700 Fix offset/extent bug in ps output for repeating source surface patterns The bug was exposed by the recent addition of the paint-repeat test. The ps output was crashing various interpreters by using infinite extents for repeating patterns. Fixing that was easy enough, but the offset of the repeating pattern was still being lost. The fix for both involved imitating the style of emit_surface_pattern as it exists in cairo-pdf-surface.c, (though the details are quite different due to differences in the models of PS and PDF). src/cairo-ps-surface.c | 84 ++++++++++++++++++++++++++++++++--------------- 1 files changed, 57 insertions(+), 27 deletions(-) commit 76f816c765a19a4fcda0500b5495bb969d014958 Author: Carl Worth Date: Wed Oct 25 10:44:53 2006 -0700 test/paint-repeat: Use offset larger than source surface for better stress testing test/paint-repeat.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 06d3786b2c76e05939bff1065a57db3059ccbc95 Author: Carl Worth Date: Wed Oct 25 10:43:19 2006 -0700 Add new paint-repeat test I added this test originally to make it easier to debug some recent bugs, (the test suite did have some repeating in the checkered backgrounds, but with an offset of 0, and then also in trap clip with an offset larger than the surface itself). This test exercises repeating more directly. It also triggers a bug in the PostScript backend that I've not yet investigated. So the test does fail currently. test/.gitignore | 1 + test/Makefile.am | 2 + test/paint-repeat-ref.png | Bin 0 -> 145 bytes test/paint-repeat.c | 66 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 0 deletions(-) commit 7421e8af0ca3b5c80dd3c7b145c639196f6036a5 Author: Behdad Esfahbod Date: Wed Oct 25 15:28:36 2006 -0400 [test] Make sure tests are not relinked unnecessarily What was causing it was making all tests depend on all, to make sure ../boilerplate is built first. I'm not making all tests depend on ../boilerplate/libcairoboilerplate.la and ../src/libcairo.ls and added rules to build those (by changing dir and making them). test/Makefile.am | 11 +++++++---- 1 files changed, 7 insertions(+), 4 deletions(-) commit 7e9aad228971a81783e09edfef58c5165a3c932e Author: Carl Worth Date: Wed Oct 25 10:32:37 2006 -0700 Fix repeating source surface patterns with xlib backend. This broke with the clone_similar optimization in 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 The optimization added an interest rectangle to clone_similar, but with a repeating source pattern, the interest rectangle might not intersect the extents of the surface at all. The test suite caught this with the trap-clip case. The fix here is to clone the entire surface if the pattern has an extend mode of REPEAT. src/cairo-pattern.c | 54 ++++++++++++++++++++++++++++++++------------------ src/cairoint.h | 10 +++++++++ 2 files changed, 44 insertions(+), 20 deletions(-) commit 804e5b58cd3a4032bfa1d0c8cccac92a70c3c635 Author: Jinghua Luo Date: Wed Oct 25 13:29:06 2006 +0800 glitz: further fix for clone_similar. Don't try to get pixels outside image extent. The failure number of tests cut down to 19 with this fix, not too bad;). src/cairo-glitz-surface.c | 19 +++++++++++++++++-- 1 files changed, 17 insertions(+), 2 deletions(-) commit 69f740913d6841708831668ef2a3bf124f373031 Author: Ian Osgood Date: Tue Oct 24 08:24:30 2006 -0700 bug: wrong xcb_copy_area param order src/cairo-xcb-surface.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 8381e53cc741af73fddebe61d9a0b28a8329c18b Author: Carl Worth Date: Mon Oct 23 20:44:29 2006 -0700 8711: Fix transformed source surface patterns with xlib backend. This broke with the clone_similar optimization in 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 The optimization added an interest rectangle to clone_similar, but the acquire_surface path was neglecting to transform its rectangle by the pattern matrix. The test suite did catch this, but apparently we were too distracted by the performance improvements to notice. Only backends other than image that implemented clone_similar would be affected by the bug, (which meant I only saw xlib failures in my testing). This fixes bug #8711 src/cairo-pattern.c | 23 +++++++++++++++++++++++ 1 files changed, 23 insertions(+), 0 deletions(-) commit 670b3ce2432154cc0611a31c5b5e37c8a3ddf1f5 Author: Carl Worth Date: Mon Oct 23 11:57:16 2006 -0700 test: Update reference images due to previous change to _cairo_color_compute_shorts The previous change was in b62710d4f8602203d848daf2d444865b611fff09 We just forgot to update the reference images at the time so there have been false failure results in the test suite until now. test/caps-joins-alpha-ref.png | Bin 2434 -> 2463 bytes test/fill-and-stroke-alpha-add-ref.png | Bin 588 -> 591 bytes test/fill-and-stroke-alpha-ref.png | Bin 532 -> 519 bytes test/linear-gradient-ref.png | Bin 1023 -> 1021 bytes test/mask-ref.png | Bin 87890 -> 87899 bytes test/mask-rgb24-ref.png | Bin 70978 -> 71010 bytes test/operator-source-ref.png | Bin 19726 -> 19763 bytes test/operator-source-rgb24-ref.png | Bin 14701 -> 14666 bytes test/paint-source-alpha-pdf-argb32-ref.png | Bin 475 -> 471 bytes test/paint-source-alpha-ref.png | Bin 258 -> 256 bytes test/paint-with-alpha-ref.png | Bin 268 -> 256 bytes test/push-group-ref.png | Bin 2996 -> 3005 bytes test/push-group-rgb24-ref.png | Bin 2840 -> 2849 bytes test/set-source-ref.png | Bin 120 -> 120 bytes test/set-source.c | 4 +--- test/trap-clip-ref.png | Bin 71753 -> 71832 bytes 16 files changed, 1 insertions(+), 3 deletions(-) commit 9e4a48557ee42f13c427adfd7e097942ef315006 Author: Adrian Johnson Date: Mon Oct 23 23:17:06 2006 +0930 type1 fallback: ensure all functions perform correct status checking src/cairo-type1-fallback.c | 58 ++++++++++++++++++++++++++++--------------- 1 files changed, 38 insertions(+), 20 deletions(-) commit bd5d7c1fb2331c487c934c20f6067455e0a4ca3d Author: Christian Biesinger Date: Sun Oct 22 20:08:07 2006 +0200 Don't return an uninitialized value if _cairo_output_stream_create fails src/cairo-type1-fallback.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 2313f69066152034ac977776bee88f0c77b76aca Author: Christian Biesinger Date: Sun Oct 22 20:07:57 2006 +0200 Fix prototype warning by including cairo-test-directfb.h boilerplate/cairo-test-directfb.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 153f2d1cad171eba7b63d6ceefea2a26ffd8b532 Author: Christian Biesinger Date: Sun Oct 22 20:07:25 2006 +0200 Actually return a value from _cairo_type1_fallback_init_* src/cairo-type1-fallback.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit d6ebe07be214461b6d456ebdbdc5acfd432e0178 Author: Christian Biesinger Date: Sun Oct 22 12:47:43 2006 +0200 Add missing ) in comment configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit f29a1920b0447be9e0fe21afc2d3a3d03fd097fc Author: Jinghua Luo Date: Sun Oct 22 12:31:40 2006 +0800 glitz: my previous changes in _cairo_glitz_surface_create_similar is incorrect. src/cairo-glitz-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1a90d28c3f70d6347746779354713c3de515f3c4 Author: Ian Osgood Date: Sat Oct 21 11:57:03 2006 -0700 XCB: make create_internal match Xlib minus font options and buggy repeat plus some cleanup and removal of more Xlib diffs src/cairo-xcb-surface.c | 149 +++++++++++++++++++++-------------------------- 1 files changed, 66 insertions(+), 83 deletions(-) commit 343d9ef030a6a15f779f12e13a03a9451d2fff8b Author: Jinghua Luo Date: Sat Oct 21 17:27:28 2006 +0800 glitz: don't go fackback path for bitmap glyphs. Test case bitmap font still passes with changes and improves performance a lot. src/cairo-glitz-surface.c | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 3b1d0d3519a7d0328f897927d3534f10750d30db Author: Jinghua Luo Date: Sat Oct 21 17:23:11 2006 +0800 glitz: fix test case glyph-cache-pressure. Glitz backend need freeze glyph cache as xlib backend otherwise it'll crash, let's fix it now. src/cairo-glitz-surface.c | 47 ++++++++++++++------------------------------ 1 files changed, 15 insertions(+), 32 deletions(-) commit f3c58350713b46c6e0e26a40898dc4da85e10279 Author: Jinghua Luo Date: Sat Oct 21 17:18:51 2006 +0800 glitz: fix for clone similar. This corrects mosts of changes in clone similar commit. But it's still a problem in _cairo_glitz_surface_set_image, it'll crash if source region is outside image extents. src/cairo-glitz-surface.c | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) commit 2ef9c7d9e8fcd0bda138f2b1965b3b06491cae00 Author: Jinghua Luo Date: Sat Oct 21 17:07:19 2006 +0800 glitz: fix a crash in _cairo_glitz_surface_get_image. The previous changes in _cairo_glitz_surface_get_image causes test clip-fill-rule-pixel-aligned and clip-fill-rule fail with a pretty crash, this fix that. src/cairo-glitz-surface.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) commit a34a4a2bd745c07f0d6034acf066252ae55fbb81 Author: Ian Osgood Date: Fri Oct 20 11:17:03 2006 -0700 XCB: bring composite, trapezoids up-to-date with Xlib Categorize & recategorize Distinguish DO_COPYAREA and DO_XTILE Create trapezoid mask Fixup unbounded src/cairo-xcb-surface.c | 268 ++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 241 insertions(+), 27 deletions(-) commit b1944e1672ee6faa034dba4d8cf730886c35e848 Author: Carl Worth Date: Thu Oct 19 15:48:13 2006 -0700 Fix bug in _cairo_clip_init_deep_copy (fixes clip-push-group crash) Thanks to Miklós Erdélyi for reporting the original problem and suggesting the fix. src/cairo-clip.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit f894ebf98022ecf5844cd50840e916d6ddbea0bf Author: Carl Worth Date: Thu Oct 19 15:45:53 2006 -0700 clip-push-group: Adjust test slightly to ensure mask-based clip is not anchored at the origin This should help us test if there's an offset problem in copying the mask-based clip during cairo_push_group. test/clip-push-group-ref.png | Bin 200 -> 199 bytes test/clip-push-group.c | 3 ++- 2 files changed, 2 insertions(+), 1 deletions(-) commit f880f5e57bc44c2c2e70a80f0df21ea89084cd8c Author: Carl Worth Date: Thu Oct 19 15:43:02 2006 -0700 test: Add clip-push-group to demonstrate crash in cairo_push_group The crash happens anytime mask-based clipping is in effect at the time of cairo_push_group. The crash was first reported here: http://lists.freedesktop.org/archives/cairo/2006-August/007698.html test/Makefile.am | 2 + test/clip-push-group-ref.png | Bin 0 -> 200 bytes test/clip-push-group.c | 74 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 0 deletions(-) commit 8d2f0367527cb23f5902db0526b69b7d83b97f9c Author: Ian Osgood Date: Thu Oct 19 13:42:04 2006 -0700 XCB: implement subimage_copy fix Needs further testing and review. src/cairo-xcb-surface.c | 80 +++++++++++++++++++++++++++++++++++++--------- 1 files changed, 64 insertions(+), 16 deletions(-) commit 8d7a02ed58e06584eb09575e6ca11d0a81094ab6 Author: Christopher (Monty) Montgomery Date: Wed Oct 18 17:06:23 2006 -0700 Add extents to clone_similar (fixing subimage_copy performance bug) This fixes a huge performance bug (entire image was being pushed to X server in order to copy a tiny piece of it). I see up to 50x improvement from subimage_copy (which was designed to expose this problem) but also a 5x improvement in some text performance cases. xlib-rgba subimage_copy-512 3.93 2.46% -> 0.07 2.71%: 52.91x faster ███████████████████████████████████████████████████▉ xlib-rgb subimage_copy-512 4.03 1.97% -> 0.09 2.61%: 44.74x faster ███████████████████████████████████████████▊ xlib-rgba subimage_copy-256 1.02 2.25% -> 0.07 0.56%: 14.42x faster █████████████■xlib-rgba text_image_rgb_over-256 63.21 1.53% -> 11.87 2.17%: 5.33x faster ████■xlib-rgba text_image_rgba_over-256 62.31 0.72% -> 11.87 2.82%: 5.25x faster ████▎ xlib-rgba text_image_rgba_source-256 67.97 0.85% -> 16.48 2.23%: 4.13x faster ███■xlib-rgba text_image_rgb_source-256 68.82 0.55% -> 16.93 2.10%: 4.07x faster ███■xlib-rgba subimage_copy-128 0.19 1.72% -> 0.06 0.85%: 3.10x faster ██■src/cairo-clip.c | 7 ++++++- src/cairo-directfb-surface.c | 18 +++++++++++++----- src/cairo-glitz-surface.c | 30 ++++++++++++++++++++++-------- src/cairo-image-surface.c | 4 ++++ src/cairo-nquartz-surface.c | 9 +++++++-- src/cairo-pattern.c | 38 ++++++++++++++++++++------------------ src/cairo-surface.c | 14 ++++++++++++-- src/cairo-xcb-surface.c | 9 +++++++++ src/cairo-xlib-surface.c | 18 ++++++++++++++---- src/cairoint.h | 8 ++++++++ 10 files changed, 115 insertions(+), 40 deletions(-) commit 99e2e99a78e492196a76e76cb47e463223db3012 Author: Carl Worth Date: Wed Oct 18 15:47:18 2006 -0700 Use zero-size change bar for a speedup/slowdown of 1.0 Also use speedup/slowdown rather than faster/slower in the output perf/cairo-perf-diff.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) commit 40e1c0246da1e79b70d4b89b7735e6fec329c56e Author: Carl Worth Date: Wed Oct 18 15:18:11 2006 -0700 Add neglected reference images for infinite-join test test/.gitignore | 1 + test/Makefile.am | 2 ++ test/infinite-join-ps-argb32-ref.png | Bin 0 -> 220 bytes test/infinite-join-ref.png | Bin 0 -> 194 bytes 4 files changed, 3 insertions(+), 0 deletions(-) commit e21c155e73569f6533dd01bdd7ec62461e7f215f Merge: a53eabf... 10cd23d... Author: Carl Worth Date: Wed Oct 18 15:03:04 2006 -0700 Merge branch '8379' into cairo commit 10cd23d51fbfc99d6e3e401440eebb56df3b3327 Author: Carl Worth Date: Thu Sep 21 15:17:59 2006 -0700 Fix infinite-join test case (bug #8379) The trick for this was to carefully ensure that the pen always has at least 4 vertices. There was a previous attempt at this in the code already but the test case had a combination of matrix and radius that resulted in a value that was just able to sneak past the previous check. src/cairo-pen.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 5b7a7f39ad8b726e9ee582bcd10500a1e5b16554 Author: Carl Worth Date: Wed Oct 18 15:01:58 2006 -0700 test/infinite-join: Modify to draw something visible, and make the output a more reasonable size. The modification was performed with care to ensure that the bug is still exercised. Also, reference images are added. test/infinite-join.c | 15 +++++++++++---- 1 files changed, 11 insertions(+), 4 deletions(-) commit a53eabf0a505bcf01e52af1b47b194a482eddf51 Author: Carl Worth Date: Wed Oct 18 12:14:38 2006 -0700 Add cairo-perf-diff program for comparing two cairo-perf reports. perf/.gitignore | 1 + perf/Makefile.am | 6 +- perf/cairo-perf-diff.c | 478 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 483 insertions(+), 2 deletions(-) commit 5c7798a646ecad59dfabac1f9afb96006470054e Author: Carl Worth Date: Wed Oct 18 12:10:00 2006 -0700 perf: Print ticks as well as ms in output. The ticks value is a bit more reliable since it won't exhibit variation due to estimating the CPU frequency like the ms value will. perf/cairo-perf.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit bb3d4b2f88dca258389d7ca4cae51a5b64c0dfc9 Author: Carl Worth Date: Tue Oct 17 19:18:22 2006 -0700 cairo-perf: Remove wasted whitespace in output. Squelch wanring. perf/cairo-perf.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit d8c23d5ed747fa216d8070accdb80d665033233b Author: Carl Worth Date: Tue Oct 17 17:53:43 2006 -0700 perf: Change minimum size of paint test to 256 The paint tests at sizes less than 256 were just too fast to be significant. perf/cairo-perf.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c1f134fa13928f31c903d513920448b127749a4b Merge: 968ceee... 157663e... Author: Ian Osgood Date: Wed Oct 18 08:15:47 2006 -0700 Merge branch 'master' of git+ssh://iano@git.cairographics.org/git/cairo commit 968ceeec1d2223e823ec56883bc00da512549ea5 Author: Ian Osgood Date: Wed Oct 18 08:14:55 2006 -0700 XCB: find_standard_format using wrong enumeration. Requires latest xcb/util/renderutil library from git. boilerplate/cairo-boilerplate.c | 8 ++++---- src/cairo-xcb-surface.c | 20 ++++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) commit 157663e1fdf120a71c6cc8222b88d2915a5a73eb Author: Behdad Esfahbod Date: Wed Oct 18 10:59:10 2006 -0400 [configure.in] Require pkg-config 0.19. (#8686) configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e2a0c57c1fc20f3e2ee641273b5f059ca221d265 Author: Ian Osgood Date: Tue Oct 17 08:09:29 2006 -0700 XCB: glyph rendering support todo: get_font_options, testing src/cairo-xcb-surface.c | 926 ++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 885 insertions(+), 41 deletions(-) commit 25353fdb57cd987fff01538be2c0fd27e7155879 Author: Jamey Sharp Date: Mon Oct 16 11:44:08 2006 -0700 XCB: Move slim_hidden_def to cairo-xcb-surface.c, not cairo-xcb-xrender.h. I didn't understand that the _def does not need to be public any more than the _proto does. src/cairo-xcb-surface.c | 1 + src/cairo-xcb-xrender.h | 1 - 2 files changed, 1 insertions(+), 1 deletions(-) commit aa017161a59bd643f3b369875ae3ba54e4a6c425 Author: Ian Osgood Date: Thu Oct 12 20:17:22 2006 -0700 Move XCB sections next to XLIB sections. configure.in | 16 ++++++++-------- src/Makefile.am | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) commit 8dabfc7ffe36649f85873043f8fc4f06714e5845 Author: Jamey Sharp Date: Mon Oct 16 11:23:38 2006 -0700 XCB: Add the have_clip_rects field to cairo_xcb_surface, to match the Xlib surface. Correction to my previous commit. *sigh* src/cairo-xcb-surface.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 7988f2cc6ac596de61ef4378df66cbafece5f747 Author: Ian Osgood Date: Mon Oct 16 07:20:15 2006 -0700 XCB: Remove unnecessary differences with the Xlib surface. src/cairo-xcb-surface.c | 84 ++++++++++++++++++++++++----------------------- 1 files changed, 43 insertions(+), 41 deletions(-) commit b62710d4f8602203d848daf2d444865b611fff09 Author: Carl Worth Date: Wed Aug 30 14:43:21 2006 -0700 Bug #7497: Change _cairo_color_compute_shorts to not rely on any particular floating-point epsilon value. src/cairo-color.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) commit 71037f3612da9d11431567c05c17807499ab1746 Author: Carl Worth Date: Mon Oct 16 09:07:40 2006 -0700 Rename wait_for_rendering to syncrhonize We're not using this call both before and after rendering so the old name just didn't make sense anymore. boilerplate/cairo-boilerplate.c | 6 +++--- boilerplate/cairo-boilerplate.h | 2 +- perf/cairo-perf.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) commit 6c9508340620c5981393a3455304e774712ddc83 Author: Christian Biesinger Date: Mon Oct 16 17:51:41 2006 +0200 Fix win32 build when pthreads are available _cairo_win32_initialize always needs a definition. src/cairo-win32-surface.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) commit 7d136864382f8b17e6c672892a00d4bb0ea3ed90 Author: Christian Biesinger Date: Mon Oct 16 17:27:23 2006 +0200 [win32] Add missing void This fixes a GCC compile warning src/cairo-win32-private.h | 2 +- src/cairo-win32-surface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) commit 445251cc79d87b73a2ccd7891f9a5a33b89927a4 Author: Jamey Sharp Date: Sun Oct 15 17:23:58 2006 -0700 [slim] hide cairo_version_string() Adrian's recent commits broke PLT hiding by calling cairo_version_string from inside cairo. Add slim_hidden_def and slim_hidden_proto for it. src/cairo.c | 1 + src/cairoint.h | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit 830804c7aec0334953bdc6f4704da6d404fc030a Author: Adrian Johnson Date: Sun Oct 15 23:11:30 2006 +0930 PDF: Add cairo version to document info dictionary src/cairo-pdf-surface.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 5aaa1988c7e27ed7acd002ee0fb8d344444b46dd Author: Adrian Johnson Date: Sun Oct 15 23:11:01 2006 +0930 PS: Add cairo version to PS header src/cairo-ps-surface.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 753763ff258760688ef5a594a204fa8f2be7e4a4 Author: Adrian Johnson Date: Sun Oct 15 23:09:35 2006 +0930 Type1 subsetting: Don't put .notdef in Encoding when there are 256 glyphs Type1 subsetting adds the .notdef glyph to the subset because the Type 1 spec requires that it be defined. However if the subset already has 256 glyphs, this will cause the Encoding vector to have 257 entries which ghostscript does not like. src/cairo-type1-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 216c759d463ca407e1baea4090c782074567cbe2 Author: Adrian Johnson Date: Sun Oct 15 23:07:38 2006 +0930 Type 1 fallback fonts - use binary encoding in PDF files PDF files require that embedded Type 1 fonts have the encrypted portion of the font encoded in binary. src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-scaled-font-subsets-private.h | 32 +++++++++++++++++++++++---- src/cairo-type1-fallback.c | 36 +++++++++++++++++++++++++------ 4 files changed, 58 insertions(+), 14 deletions(-) commit d1fb02b5b93c9a456411e9eb56f3ee136b33d9e7 Author: Adrian Johnson Date: Sun Oct 15 23:02:20 2006 +0930 Correct an unsigned to signed conversion problem in truetype subsetting bbox src/cairo-truetype-subset.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 9ee0c15941b029ea3fb4fbf30e78bb917b7f8c66 Author: Adrian Johnson Date: Sun Oct 15 22:48:43 2006 +0930 cairo-type1-fallback.c: return correct error status src/cairo-type1-fallback.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit f7068de7f78890df9fbadba8b15d1c3b58166c2d Author: Jamey Sharp Date: Thu Oct 12 23:43:45 2006 -0700 Update .gitignore in boilerplate and test. boilerplate/.gitignore | 1 + test/.gitignore | 4 ++++ 2 files changed, 5 insertions(+), 0 deletions(-) commit 2d30e58ccd14ae707afcc311f49e32fe6d6d4061 Author: Jamey Sharp Date: Thu Oct 12 23:42:50 2006 -0700 XCB: update cairo-boilerplate to test for an error connection rather than NULL. boilerplate/cairo-boilerplate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 02e7b892bcb75a69eb28902e7f67e2e7778bfe7b Merge: 151e29d... 648f4bc... Author: Michael Emmel Date: Thu Oct 12 20:40:11 2006 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit 151e29d8070986b9e60b4c70ebedb25e9fe71ab8 Author: Michael Emmel Date: Thu Oct 12 20:39:26 2006 -0700 Fixed test to compile boilerplate/cairo-test-directfb.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 29f483326f127ec60e26801732da2486eb84b7ef Author: Michael Emmel Date: Thu Oct 12 20:39:16 2006 -0700 Fixed test to compile boilerplate/cairo-test-directfb.c | 75 +++++++++++++++++++++++-------------- 1 files changed, 47 insertions(+), 28 deletions(-) commit e521562ebf9c827508b997acda2d4292014d6938 Author: Michael Emmel Date: Thu Oct 12 20:38:47 2006 -0700 Fixed directfb test code boilerplate/cairo-boilerplate.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 648f4bc830ab7cc89ffa2ba03d2757d0979a5671 Author: Carl Worth Date: Thu Oct 12 15:12:01 2006 -0700 perf: Make iterations adaptive (bailing as soon as std. deviation is <= 3% for 5 consecutive iterations This makes the entire performance test suite about 10 times faster on my system. And I don't think that the results are significantly worse, (many tests are stable after only 5 iterations while some still run to 100 iterations without reaching our stability criteria). perf/cairo-perf.c | 30 +++++++++++++++++++++++------- 1 files changed, 23 insertions(+), 7 deletions(-) commit 78ad834d81b1fb2a49150ce224a5f25b5190b5a4 Author: Carl Worth Date: Thu Oct 12 14:21:55 2006 -0700 Fix typo of , instead of || which was causing a test to be ignored Thanks to a gcc warning for catching this one, (statement with no effect, or similar). test/pattern-getters.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 20375d5cef560e7277635a0bdba3872f31cb4479 Author: Jamey Sharp Date: Wed Oct 11 22:20:27 2006 -0700 XCB: add slim_hidden_proto and slim_hidden_def for cairo_xcb_surface_create_with_xrender_format. src/cairo-xcb-surface.c | 2 ++ src/cairo-xcb-xrender.h | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) commit 339fe5c7b0d694c547c27a6a98ef8448f1ff2e43 Author: Ian Osgood Date: Wed Oct 11 21:32:32 2006 -0700 Replace static fn with xcb-renderutil library fn. boilerplate/cairo-boilerplate.c | 99 ++------------------------------------- 1 files changed, 5 insertions(+), 94 deletions(-) commit 7d0ff885df7029f96568ac7fad3f15b002bec1b3 Author: Ian Osgood Date: Sat Sep 30 13:23:06 2006 -0700 Update XCB names for XCB 1.0 RC2 release. New names are in line with cairo naming standards. XIDs are now typedefs not structs. xcb_generate_id replaces *_new functions. Also fixed all warnings (one const, new enums in switch statements). boilerplate/cairo-boilerplate.c | 56 ++++---- configure.in | 2 +- src/cairo-xcb-surface.c | 303 ++++++++++++++++++++------------------- src/cairo-xcb-xrender.h | 12 +- src/cairo-xcb.h | 14 +- 5 files changed, 194 insertions(+), 193 deletions(-) commit 38dcddd79ef95b04bf8d6ff8336cb997875df41b Author: Christian Biesinger Date: Tue Oct 10 12:38:33 2006 -0700 fix comment: pixman_private needs to be before the type of a variable Makes the documentation match the code. Compare also commit 34d11aa3c45ba672b34d0a17f672f907305f3893 pixman/src/slim_internal.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit f6a2811c87def7b1bc70a2014d93df8feab2e2f4 Author: Behdad Esfahbod Date: Sun Oct 8 17:07:17 2006 -0400 [slim] hide cairo_glitz_surface_create() (#8551) src/Makefile.am | 2 +- src/cairo-glitz-private.h | 41 +++++++++++++++++++++++++++++++++++++++++ src/cairo-glitz-surface.c | 2 ++ 3 files changed, 44 insertions(+), 1 deletions(-) commit a13d58ff3af5ed85313b5af651c1d69f5e38fa06 Author: Behdad Esfahbod Date: Sun Oct 8 17:06:44 2006 -0400 [slim] hide cairo_pattern_status() #8551 src/cairo-pattern.c | 1 + src/cairoint.h | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) commit d7c2f7e2d74c7e383f6933b974066221bcc5faa5 Author: Carl Worth Date: Thu Oct 5 15:14:14 2006 -0700 perf: Rename finalize to synchronize as it is used in both start() and stop() now perf/cairo-perf-posix.c | 20 ++++++++++---------- perf/cairo-perf-win32.c | 20 ++++++++++---------- perf/cairo-perf.c | 4 ++-- perf/cairo-perf.h | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) commit 8af5e14fd8056408bc46698b7186655ec8e60062 Author: Carl Worth Date: Thu Oct 5 15:07:52 2006 -0700 perf: Do backend synchronization in cairo_perf_timer_start as well as cairo_perf_timer_stop perf/cairo-perf-posix.c | 20 +++++++++++--------- perf/cairo-perf-win32.c | 12 +++++++----- 2 files changed, 18 insertions(+), 14 deletions(-) commit 5412343a77b7b336886ed763a3518ff4602f27aa Author: Carl Worth Date: Thu Oct 5 12:13:48 2006 -0700 perf: Add subimage_copy test to demonstrate performance bug found by monty perf/Makefile.am | 1 + perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/subimage_copy.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+), 0 deletions(-) commit 9285a1f7fe88db760b7cf49c87ac9be613f21630 Author: Carl Worth Date: Wed Oct 4 18:35:16 2006 -0700 perf: Add text test perf/Makefile.am | 3 +- perf/cairo-perf.c | 1 + perf/cairo-perf.h | 1 + perf/text.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 1 deletions(-) commit f1db0135476a039ea43dfd67c56763b05aea2ec4 Author: Carl Worth Date: Wed Oct 4 18:34:09 2006 -0700 Fix typo that was resulting in device glyph_extents of INT16_MAX in some cases. src/cairo-scaled-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2041db91968c7c06cdb2e454f572c50d75144d29 Author: Behdad Esfahbod Date: Thu Oct 5 11:51:25 2006 -0400 [Makefile.am] Pass srcdir down to the tests src/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit bda77f505c911aea8ce684cb22a1469d1b7a9049 Author: Carl Worth Date: Wed Oct 4 16:35:20 2006 -0700 perf: Bail if cairo_status returns non-success at the end of a test. perf/cairo-perf.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) commit d15b8f2d6e0b0c2279fb0b17368f1110396e4bf8 Author: Carl Worth Date: Wed Oct 4 16:32:14 2006 -0700 perf: Add linear and radial gradients to the coverage perf/cairo-perf-cover.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 71 insertions(+), 1 deletions(-) commit 933d84572849a7ad61aca2c381f11a572fa9e9b7 Author: Carl Worth Date: Wed Oct 4 16:17:46 2006 -0700 Shorten test names in output (drop unneeded _source and _surface) perf/cairo-perf-cover.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit fb61fe82d3b360f09f2984bd3ac7de6720f75662 Author: Carl Worth Date: Wed Oct 4 16:16:03 2006 -0700 perf: Add stroke and fill tests perf/Makefile.am | 2 ++ perf/cairo-perf.c | 8 +++++--- perf/cairo-perf.h | 5 ++--- perf/fill.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ perf/stroke.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+), 6 deletions(-) commit d52256df7c0147c29246dfc930644b6bdbff3c3f Author: Carl Worth Date: Wed Oct 4 15:39:05 2006 -0700 perf: Move iteration over sources and operators from paint to new cairo-perf-cover This will finally allow us to very easily add lots of other tests that will similarly involve iterating over the various sources and operators of interest. perf/Makefile.am | 1 + perf/cairo-perf-cover.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf.c | 9 --- perf/cairo-perf.h | 13 ++++- perf/paint.c | 133 +------------------------------------- 5 files changed, 180 insertions(+), 142 deletions(-) commit ad02773e9babe935250b810f8f9f490eb3d02a64 Author: Carl Worth Date: Wed Oct 4 15:24:19 2006 -0700 Remove unused variable src/cairo-gstate.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 783b69a8d33f913949247cc3ba018c35a4a83aa7 Author: Carl Worth Date: Wed Oct 4 15:00:57 2006 -0700 Rename the create_for_status pattern to create_in_error. src/cairo-path-data-private.h | 2 +- src/cairo-path-data.c | 2 +- src/cairo-pattern.c | 4 ++-- src/cairo.c | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) commit 01502471e31aa28a910039a918ff2aec3810d3c1 Author: Carl Worth Date: Wed Oct 4 14:58:06 2006 -0700 Add new _cairo_pattern_create_for_status so that patterns properly propagate errors. In particular, many possible error values on a surface provided to cairo_pattern_create_for_surface were previously being swallowed and a nil pattern was returned that erroneously reported CAIRO_STATUS_NO_MEMORY. src/cairo-pattern.c | 52 +++++++++++++++----------------------------------- 1 files changed, 16 insertions(+), 36 deletions(-) commit c9c259903d03e35fe98781fc6fedf326c40c0c4c Author: Carl Worth Date: Wed Oct 4 15:23:36 2006 -0700 Cast to squelch warning message src/cairo-pattern.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 4d2b54a271f722de9802ca68246ce6afba89f830 Author: Carl Worth Date: Wed Oct 4 14:56:33 2006 -0700 Fix cairo_image_surface_create to report INVALID_FORMAT errors. This adds a new nil cairo_image_surface to hold CAIRO_STATUS_INVALID_FORMAT. Previously the detected error was being lost and a nil surface was returned that erroneously reported CAIRO_STATUS_NO_MEMORY. src/cairo-image-surface.c | 52 +++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 50 insertions(+), 2 deletions(-) commit 7d5fb687af2ec2da94a10200309fa362d694d23f Author: Carl Worth Date: Wed Oct 4 14:13:54 2006 -0700 perf/paint: Test image surface as well as similar surface sources perf/cairo-perf.c | 4 +- perf/paint.c | 85 ++++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 64 insertions(+), 25 deletions(-) commit 94759a14daac63d05e5399982be56e73abf552c4 Author: Carl Worth Date: Wed Oct 4 13:54:39 2006 -0700 perf/paint: Use loops for sources and operators rather than open coding. This looks a bit more complicated for now, but will scaled much better to provide complete coverage as we extend the cases covered. perf/paint.c | 73 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 54 insertions(+), 19 deletions(-) commit 37bc39d82c8d2c2cd8b04ea554925102b4831856 Author: Carl Worth Date: Wed Oct 4 13:35:27 2006 -0700 perf/paint: Dramatically simplify now that we don't need one callback per run. This commit begins to show the benefits of the reorganization from the last few commits. Specifically, we don't need a callback for every run anymore, and now that the cairo_t* is available to the paint entry function and the size changes only on the outer loop, (rather than inside cairo_perf_run), there's no need for the ugly, static cache for the source surface. perf/paint.c | 146 +++++++++++++--------------------------------------------- 1 files changed, 33 insertions(+), 113 deletions(-) commit d0aae4dbcf6d3ca67a4a7b364fba80f719af2ac1 Author: Carl Worth Date: Wed Oct 4 13:23:50 2006 -0700 perf: Make cairo_t* available to perf functions perf/README | 27 +++++++++++++-------------- perf/cairo-perf.c | 2 +- perf/cairo-perf.h | 2 +- perf/paint.c | 2 +- perf/tessellate.c | 2 +- 5 files changed, 17 insertions(+), 18 deletions(-) commit 4406ab1b9e8a618aae4d709a370d4ace0e9897e9 Author: Carl Worth Date: Wed Oct 4 12:55:54 2006 -0700 perf: Move the per-size loop from cairo_perf_run to main The motivation here is to have the cairo_t context available to the perf funcs before they call into cairo_perf_run, (so that they can do one-time setup of source etc. for several runs). perf/cairo-perf.c | 95 ++++++++++++++++++++++++++++------------------------- 1 files changed, 50 insertions(+), 45 deletions(-) commit 251bed86400f72a4ec90618d0d41566ab9969cfa Author: Carl Worth Date: Tue Oct 3 17:27:27 2006 -0700 perf/paint: Make all sizes use a consistent number of iterations This effectively reverts the change made in: 3c407aa80a43e1724e732482ada5ad6718fe33ae The justification is that we want to be able to see the trends of increasing the image size while keeping the test the same. But changing the number of iterations in a size- specific way interferes with that. Also, the standard deviation is almost always better this way, (though it now varies more by size). And as a bonus, the total time required to run the suite is now less. perf/paint.c | 19 +------------------ 1 files changed, 1 insertions(+), 18 deletions(-) commit 1e0e2075090c181dcd9f431833a8a9c2665d763e Author: Behdad Esfahbod Date: Mon Oct 2 14:35:35 2006 -0400 [check-headers.sh] Don't use '\>' regexp syntax src/check-headers.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3b58d92f5a449e7d5edf39484465e2ce6acf4874 Author: Carl Worth Date: Fri Sep 29 17:47:01 2006 -0700 Add missing 'Since: 1.4' tags to documentation of 'clip getter' functions. The following documented symbols were missing this tag: cairo_clip_extents cairo_copy_clip_rectangles CAIRO_STATUS_INVALID_INDEX cairo_rectangle_t cairo_rectangle_list_t src/cairo.c | 4 ++++ src/cairo.h | 6 +++++- 2 files changed, 9 insertions(+), 1 deletions(-) commit 9cacced88fa9dbaa53ff8dec6ff31c8e56c85f08 Author: Carl Worth Date: Fri Sep 29 17:44:34 2006 -0700 Add documentation for cairo_rectangle_list_destroy src/cairo-clip.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) commit 34d11aa3c45ba672b34d0a17f672f907305f3893 Author: Alfred Peng Date: Fri Sep 29 17:17:27 2006 -0700 Use pixman_private consistently as prefix not suffix pixman/src/icint.h | 2 +- pixman/src/icrop.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) commit c1495742f76ce380aaa48389bc331723b7a3a141 Author: Alfred Peng Date: Fri Sep 29 17:16:47 2006 -0700 Add Sun Pro C definition of pixman_private pixman/src/slim_internal.h | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 28cc64aa20cd15f78109f4481bd1c08627c87e46 Author: Carl Worth Date: Fri Sep 29 17:08:53 2006 -0700 Fix dependency of 'make doc' so that necessary header files are built first. Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit deef1a667536ec67ff1d7b42a1f8179e1eac4715 Author: Carl Worth Date: Fri Sep 29 16:59:27 2006 -0700 Rename docs-publish target to doc-publish in order to be consistent with the doc target. Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e6575fb3c76ec2cda742e05c24958a7000d488dd Author: Carl Worth Date: Fri Sep 29 16:58:51 2006 -0700 Fix Makefile bug preventing 'make doc' from succeeding doc/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit beb778f482645650b129762a0a37400c12a04b32 Author: Carl Worth Date: Fri Sep 29 16:56:36 2006 -0700 Use consistent wording to document cairo_in_fill, cairo_in_stroke, cairo_fill_extents, and cairo_stroke_extents. src/cairo.c | 32 ++++++++++++++++++++------------ 1 files changed, 20 insertions(+), 12 deletions(-) commit 516ca57dd835da17fb6b43f00d1b1f37f25f49c4 Author: Carl Worth Date: Fri Sep 29 16:55:22 2006 -0700 tmpl: obnoxious churn doc/public/tmpl/cairo-image.sgml | 1 - doc/public/tmpl/cairo-status.sgml | 48 ++++++++------- doc/public/tmpl/cairo-surface.sgml | 112 ++++++++++++++++++------------------ 3 files changed, 82 insertions(+), 79 deletions(-) commit b99d41a0b075ec405d14ea8b6bbcaa50aa35e890 Author: Carl Worth Date: Fri Sep 29 16:46:39 2006 -0700 Fix typo in documentation of cairo_in_fill (thanks to Jonathan Watt) and clarify a bit. src/cairo.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) commit 3c19a6413cf77d86d75501f531af08b13db1f411 Author: Carl Worth Date: Fri Sep 29 16:42:44 2006 -0700 perf: Rework the suite to allow multiple performance tests to be defined in one file. perf/README | 66 ++++++++++++++-------- perf/cairo-perf.c | 159 +++++++++++++++++++++++++++++------------------------ perf/cairo-perf.h | 23 ++++---- perf/paint.c | 32 +++++++--- perf/tessellate.c | 22 +++++-- 5 files changed, 176 insertions(+), 126 deletions(-) commit cd6b44e9c924d230c9647e63553198a947f53307 Author: Vladimir Vukicevic Date: Fri Sep 29 14:44:00 2006 -0700 [test] Fix composite-integer-translate-over test This test wasn't translating by an integer, but instead by 5.5. Fixed test and reference image. ...osite-integer-translate-over-pdf-argb32-ref.png | Bin 12946 -> 0 bytes test/composite-integer-translate-over-ref.png | Bin 15397 -> 16385 bytes test/composite-integer-translate-over-svg-ref.png | Bin 15465 -> 0 bytes test/composite-integer-translate-over.c | 27 ++++++++++++++++++- 4 files changed, 25 insertions(+), 2 deletions(-) commit b05400b5590ab0303ef5802ac4952633e2b14d18 Author: Vladimir Vukicevic Date: Thu Sep 28 14:58:49 2006 -0700 [nquartz] Return correct values from operation setup function Leftovers from an old half-completed patch that was breaking the world. This fixes the world, or at least one tiny part of it. src/cairo-nquartz-surface.c | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) commit 17eeacfba844ea5f9592dff4621e6f721c27d6c5 Author: Robert O'Callahan Date: Mon Sep 25 16:24:33 2006 -0700 Remove redundant call to _cairo_surface_get_extents We called it just above with the same parameters. src/cairo-surface-fallback.c | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) commit e4dc73ab1cafeb8dd77d3ee3dc92d9a92be69542 Author: Carl Worth Date: Mon Sep 25 16:16:35 2006 -0700 Rename test from stale path-data name to copy-path test/Makefile.am | 6 +- test/copy-path-ps-argb32-ref.png | Bin 0 -> 442 bytes test/copy-path-ref.png | Bin 0 -> 579 bytes test/copy-path.c | 234 ++++++++++++++++++++++++++++++++++++++ test/path-data-ps-argb32-ref.png | Bin 442 -> 0 bytes test/path-data-ref.png | Bin 579 -> 0 bytes test/path-data.c | 234 -------------------------------------- 7 files changed, 237 insertions(+), 237 deletions(-) commit 5f833c134bd002853b9d1458b58350cfb1d40a94 Author: Carl Worth Date: Mon Sep 25 16:03:02 2006 -0700 Fix cairo_copy_path and cairo_copy_path_flat to propagate errors. One of these functions was already documented to be doing this, and the other one should have been. Now the documentation and behavior for both are consistent, (and the path-data test case verifies this). src/cairo-path-data-private.h | 3 +++ src/cairo-path-data.c | 16 ++++++++++++++++ src/cairo.c | 16 ++++++++++------ test/path-data.c | 28 +++++++++++++++++++++++++++- 4 files changed, 56 insertions(+), 7 deletions(-) commit f9165638bf485591abae52b759fba82caf048dc5 Author: Kristian Høgsberg Date: Tue Sep 26 17:33:29 2006 -0400 Compute right index when looking up left side bearing. When looking up the short entries in the second part of the hmtx table, compute the size of the first part correctly. Fix from Adrian, see: https://bugs.freedesktop.org/show_bug.cgi?id=8180#c12 src/cairo-truetype-subset.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-) commit 7c3062240ac036c8091ee9f0acce0aa3ea9df8ea Author: Behdad Esfahbod Date: Tue Sep 26 13:54:03 2006 -0400 [configure] Print out whether SVG and PDF surfaces can be tested configure.in | 8 ++++++-- src/check-def.sh | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) commit 191e108b93ef6d39832e78323a18cc4c795c7ca3 Author: Robert O'Callahan Date: Mon Sep 25 23:22:45 2006 -0700 Add clip getters API + tests Add new public API methods: void cairo_clip_extents (cairo_t *cr, double *x1, double *y1, double *x2, double *y2); cairo_rectangle_list_t *cairo_copy_clip_rectangles (cairo_t *); void cairo_rectangle_list_destroy (cairo_rectangle_list_t *); Also add 'get-clip' and 'get-path-extents' tests. src/cairo-clip-private.h | 5 + src/cairo-clip.c | 127 +++++++++++++++++++++- src/cairo-gstate.c | 34 ++++++ src/cairo.c | 63 +++++++++++ src/cairo.h | 36 ++++++- src/cairoint.h | 10 ++ test/Makefile.am | 2 + test/Makefile.win32 | 2 + test/get-clip.c | 277 ++++++++++++++++++++++++++++++++++++++++++++++ test/get-path-extents.c | 199 +++++++++++++++++++++++++++++++++ 10 files changed, 753 insertions(+), 2 deletions(-) commit a8ca155f83098c02fb8d3acc57b0492d5b753d54 Author: Robert O'Callahan Date: Mon Sep 25 23:16:54 2006 -0700 Fix stroke/fill extents bounding boxes Correctly return the transformed bounding box for stroke/fill extents, instead of just transforming the two corners separately. src/cairo-gstate.c | 75 +++++++++++++++++++++++++++++++++------------------ src/cairo.c | 26 ++++++++++++++++++ src/cairoint.h | 6 ++++ 3 files changed, 80 insertions(+), 27 deletions(-) commit 37fa632e59b7325041f689bf1a56e08d04379c96 Author: Robert O'Callahan Date: Mon Sep 25 23:14:43 2006 -0700 Fix _cairo_matrix_transform_bounding_box to return tightness info Add return is_tight value to the internal function, indicating whether the transformed bounds still remain axis-aligned. src/cairo-matrix.c | 18 +++++++++++++++++- src/cairoint.h | 3 ++- 2 files changed, 19 insertions(+), 2 deletions(-) commit de1915ffd2fe7f973529104a1041b33f2abfdfed Author: Carl Worth Date: Mon Sep 25 10:44:08 2006 -0700 ROADMAP: Add a couple of URLs for user-font API discussion ROADMAP | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit b146255fa45807a195fb3a7eb55d6c593bd1a5c9 Author: Carl Worth Date: Thu Sep 21 15:30:23 2006 -0700 ROADMAP: Add infinite-join bug (#8379) to the list for 1.4 ROADMAP | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 5492a7c7618a747130b844a509fb79b886f1bc54 Author: Carl Worth Date: Thu Sep 21 15:15:02 2006 -0700 Add assert statement so the infinite-join test simply exits rather than looping infinitely. src/cairo-pen.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 8744929030ed8d42c271d9abb202975f62de166c Author: Carl Worth Date: Thu Sep 21 15:13:47 2006 -0700 Add test case from bug #8379 demonstrating infinite loop during round join test/Makefile.am | 1 + test/infinite-join.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 0 deletions(-) commit 303b52919519854b9b5bbc38a9ac115e422dddad Author: Vladimir Vukicevic Date: Tue Sep 19 12:17:34 2006 -0700 dash and pattern getter functions Adds API functions for inspecting the current dash state, as well as the contents of pattern objects: cairo_get_dash cairo_get_dash_count cairo_pattern_get_rgba cairo_pattern_get_surface cairo_pattern_get_color_stop_rgba cairo_pattern_get_color_stop_count cairo_pattern_get_linear_points cairo_pattern_get_radial_circles src/cairo-pattern.c | 238 +++++++++++++++++++++++++++++++++++++++++- src/cairo.c | 63 +++++++++++- src/cairo.h | 40 +++++++- test/Makefile.am | 1 + test/Makefile.win32 | 1 + test/get-and-set.c | 39 ++++++- test/pattern-getters-ref.png | Bin 0 -> 107 bytes test/pattern-getters.c | 175 +++++++++++++++++++++++++++++++ 8 files changed, 546 insertions(+), 11 deletions(-) commit a56b962428c487d1c341f86e6719bad86374386c Author: Vladimir Vukicevic Date: Tue Sep 19 12:10:12 2006 -0700 Add win32 output files to gitignore boilerplate/.gitignore | 7 +++++++ perf/.gitignore | 7 +++++++ pixman/src/.gitignore | 3 +++ src/.gitignore | 7 +++++++ test/.gitignore | 6 ++++++ 5 files changed, 30 insertions(+), 0 deletions(-) commit 8a9b99e596a93049abeb8bbbe502f895df72f678 Author: Vladimir Vukicevic Date: Thu Sep 14 12:59:31 2006 -0700 [perf] Change perf output format, report times in ms, add a few paint tests This changes the perf test output format to be a little more human friendly, reporting times in ms instead of seconds. It also adds a test number that could be used in the future for specifying an explicit test to run (test number, target surface, test name, and size uniquiely identify a test). Also adds a few paint tests. perf/Makefile.win32 | 16 +++++++ perf/cairo-perf.c | 45 +++++++++++++------ perf/cairo-perf.h | 13 +++++- perf/paint.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 173 insertions(+), 19 deletions(-) commit e42905b01bd5bab11008b7d6a78bc263ae2f9f5d Author: Vladimir Vukicevic Date: Wed Sep 13 16:12:52 2006 -0700 [win32,perf] Fix cairo-perf-win32 Make cairo-perf work on win32 perf/cairo-perf-win32.c | 14 +++++++++++++- 1 files changed, 13 insertions(+), 1 deletions(-) commit 82b710ebc214c46df6666ede486c0174b335bfdb Author: Carl Worth Date: Tue Sep 19 10:13:36 2006 -0700 Add missing pixman_private to _FbOnes when a function. This was thanks to a report from crucible (run #2113) since it tested with older versions of gcc (3.3.6) than most of the cairo developers use, (so we had been getting the _FbOnes macro not the function). pixman/src/icint.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 42a0c6bd59e41c22a88386b389af36f37418de82 Author: Behdad Esfahbod Date: Tue Sep 19 13:05:29 2006 -0400 check-def.sh: Only allow _cairo_.*_test_.* symbols, not all _cairo.* ones src/check-def.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ae355453d849f870fc67cae0442db49548df0103 Author: Behdad Esfahbod Date: Mon Sep 18 13:32:41 2006 -0400 cairo-nquartz.h: Add missing cairo_public decorators. src/cairo-nquartz.h | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 6c01b2ffb3c7a023f3932328b8067f4f5b83936c Author: Behdad Esfahbod Date: Mon Sep 18 13:32:19 2006 -0400 cairo-directfb.h: Add missing cairo_public decorators src/cairo-directfb.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 7bb72f645325960e0bef4595ed7e9f1bb391796c Author: Behdad Esfahbod Date: Mon Sep 18 13:32:00 2006 -0400 cairo-pdf.h: Add missing cairo_public decorators src/cairo-pdf.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 01f10fb27a675ff26bb0c0ca6748479215e6d6bd Author: Behdad Esfahbod Date: Mon Sep 18 13:28:29 2006 -0400 check-headers.sh: Add a test for cairo_public decorators in public headers Test fails currently because of bug 8313 and similar issues. src/Makefile.am | 2 +- src/check-headers.sh | 21 +++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletions(-) commit 38ed0eeb5bedb4af32bfc42b7f2b99b1805c8c17 Author: Behdad Esfahbod Date: Fri Sep 15 15:35:12 2006 -0400 [ROADMAP] Add polling API ROADMAP | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit b9cbfba7d234c1cb66968d99cf527e1305febfea Author: Behdad Esfahbod Date: Fri Sep 15 15:34:44 2006 -0400 [ROADMAP] Check RGB16_565 deprecated ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2fd0ad948931f4be43c81d2c4c56d264605bd737 Author: Peter Weilbacher Date: Fri Sep 15 11:18:47 2006 +0200 OS/2 build changes configure.in | 18 ++++++++++++++++++ src/Makefile.am | 8 ++++++++ src/cairo.h | 4 +++- src/cairoint.h | 11 +++++++++++ 4 files changed, 40 insertions(+), 1 deletions(-) commit 8c6baacefacbfb9e826d05ae253ead60d4e8e146 Author: Peter Weilbacher Date: Fri Sep 15 11:18:14 2006 +0200 OS/2 backend files src/cairo-os2-private.h | 77 ++++ src/cairo-os2-surface.c | 1135 +++++++++++++++++++++++++++++++++++++++++++++++ src/cairo-os2.h | 201 +++++++++ 3 files changed, 1413 insertions(+), 0 deletions(-) commit edfceea853dd6ae189843f138478c7d43fb98367 Author: Carl Worth Date: Wed Sep 13 15:25:07 2006 -0700 Fix typo in error message (enhacement -> enhancement) src/cairo-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 3623da441a2b9dcec1effef71a41967ad5ff1363 Author: Vladimir Vukicevic Date: Wed Sep 13 14:48:40 2006 -0700 [nquartz] Initial commit of native quartz surface Inital commit of Native Quartz surface. The main missing functionality is mask() support (which is just a noop right now, except for the simple solid-alpha case). boilerplate/cairo-boilerplate.c | 44 + configure.in | 7 + src/Makefile.am | 8 + src/cairo-atsui-font.c | 122 ++- src/cairo-nquartz-surface.c | 1797 +++++++++++++++++++++++++++++++++++++++ src/cairo-nquartz.h | 80 ++ src/cairo-quartz-private.h | 9 + src/cairo.h | 3 +- 8 files changed, 2037 insertions(+), 33 deletions(-) commit f1bd0b9f9815ac838f30216d810bdd4eb2b67997 Author: Stuart Parmenter Date: Tue Sep 12 16:27:40 2006 -0700 [win32] correct win32 show_glyphs for non-y-aligned text Correctly calculate destination glyph coordinates for win32_show_glyphs. src/cairo-win32-font.c | 16 ++++++++++++++++ src/cairo-win32-surface.c | 27 ++++++++++++++++++++++----- src/cairo-win32.h | 8 ++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) commit 016653812640cddcc51d0500d62c5c65b33bdd04 Author: Vladimir Vukicevic Date: Tue Sep 12 16:08:40 2006 -0700 [win32] Support for DDBs, AlphaBlend fix Add support for the win32 surface using DDBs for similar surfaces and the like when the orignal surface is created from a DC, or when a DDB is explicitly created. A DIB is still created if alpha is required. Also fixes a case where blitting win32 RGB24 -> ARGB32 surfaces was causing alpha to leak into the ARGB32 surface instead of being set to fully opaque. src/cairo-win32-private.h | 22 ++- src/cairo-win32-surface.c | 529 +++++++++++++++++++++++++++++++++++++-------- src/cairo-win32.h | 9 + 3 files changed, 466 insertions(+), 94 deletions(-) commit 924bbd06f35f55886f808a7a9d3ee08e479389ad Author: Vladimir Vukicevic Date: Mon Sep 11 12:36:41 2006 -0700 Check for valid path status value before calling _cairo_set_error cairo_status_t is a signed type, so we need to check for invalid codes that are < 0 as well. Also removes the MSVC goop in path-data.c that was attempting to work around the assert earlier. src/cairo.c | 3 ++- test/path-data.c | 11 ----------- 2 files changed, 2 insertions(+), 12 deletions(-) commit bcc13ede9b820dd640748d9dc2ec9d15130427be Author: Carl Worth Date: Mon Sep 11 11:12:47 2006 -0700 Move the REPLACED/DEPRECATED_BY macros from cairo.h to cairo-deprecated.h src/cairo-deprecated.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++ src/cairo.h | 86 ------------------------------------------ 2 files changed, 98 insertions(+), 86 deletions(-) commit 79aed8c5fc82439f6724e8820ebcdaa585657574 Author: Carl Worth Date: Sat Sep 9 15:05:56 2006 -0700 Deprecated CAIRO_FORMAT_RGB16_565. Add cairo-deprecated.h . src/Makefile.am | 1 + src/cairo-deprecated.h | 41 +++++++++++++++++++++++++++++++++++++++++ src/cairo-image-surface.c | 5 ----- src/cairo-xlib-surface.c | 2 -- src/cairo.h | 17 +++++++---------- 5 files changed, 49 insertions(+), 17 deletions(-) commit cb6aed0a816cc5f09bb5660d4961ca196243eb10 Author: Carl Worth Date: Sat Sep 9 20:17:08 2006 -0700 perf: Make xlib testing wait for the X server to finish rendering. We do this by adding a new cairo_perf_timer_set_finalize function and in the case of the xlib backend passing a callback to that function that does a 1x1 XGetImage. boilerplate/cairo-boilerplate.c | 17 +++++++++++++++-- boilerplate/cairo-boilerplate.h | 4 ++++ perf/cairo-perf-posix.c | 12 ++++++++++++ perf/cairo-perf.c | 1 + perf/cairo-perf.h | 7 +++++++ 5 files changed, 39 insertions(+), 2 deletions(-) commit e1a8a8b65a41691521d89fba7737c093dfdf7926 Author: Vladimir Vukicevic Date: Sat Sep 9 23:54:40 2006 -0700 [win32] Set win32 assertion failure handlers for tests to stderr assert() will default to displaying a dialog box, which makes it hard to run tests automatically. Set the reporting mode to only report to stderr in cairo_test(), and in path-data, since that triggers an early assert. test/cairo-test.c | 7 +++++++ test/path-data.c | 11 +++++++++++ 2 files changed, 18 insertions(+), 0 deletions(-) commit 00d5a2ed48d999a29708d4750c034bbf1b91de12 Author: Vladimir Vukicevic Date: Sat Sep 9 23:29:17 2006 -0700 [win32] Makefile.win32: use correct (/MD) runtime library flag everywhere There was a bad mix of LIBCMT (the static runtime lib) and MSVCRT (the dynamic one) before, because LIBCMT is the default. This specifies /MD everywhere. Makefile.win32 | 3 ++- boilerplate/Makefile.win32 | 2 +- pixman/src/Makefile.win32 | 2 +- src/Makefile.win32 | 4 ++-- test/Makefile.win32 | 6 ++---- 5 files changed, 8 insertions(+), 9 deletions(-) commit d78fd375d3f99a5bb4a4799ce5d90a2a946a854c Author: Vladimir Vukicevic Date: Sat Sep 9 22:18:47 2006 -0700 [win32] Makefile.win32: fix test and add html targets Add html target to toplevel and test/ Makefile.win32 Makefile.win32 | 13 ++++++++++++- test/Makefile.win32 | 10 ++++++++++ 2 files changed, 22 insertions(+), 1 deletions(-) commit 5ab72579ef2a9fce1aedf3068825ccba683b6e79 Author: Vladimir Vukicevic Date: Sat Sep 9 19:52:48 2006 -0700 Correctly acquire/release mutex in _cairo_scaled_font_map_destroy _cairo_scaled_font_map_destroy needs to both lock/unlock the mutex, not just unlock it. src/cairo-scaled-font.c | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit d3076a1843bc2f05bab0df913d0c27f125bea162 Merge: dfe3e20... 78b8555... Author: Vladimir Vukicevic Date: Sat Sep 9 18:57:57 2006 -0700 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo into cairo-master commit dfe3e20a4a44db71270dd50b2e4bac84ff97dbb8 Author: Vladimir Vukicevic Date: Sat Sep 9 18:56:58 2006 -0700 [win32] Fix boilerplate for win32 surfaces to use new _with_dib function Create test surfaces for win32 using _with_dib instead of creating the dib locally; also test CONTENT_COLOR and CONTENT_COLOR_ALPHA. boilerplate/cairo-boilerplate.c | 46 +++++++++----------------------------- 1 files changed, 11 insertions(+), 35 deletions(-) commit 9735cb9a246627c9e4710c0f7d2955e3e0fbec69 Author: Vladimir Vukicevic Date: Sat Sep 9 18:55:46 2006 -0700 Improve make-html.pl, add self-contained output format Setting CAIRO_TEST_SHOW_INLINE in the environment before running make-html.pl will generate a html file with all the logs and necessary images inlined as data URI's. test/make-html.pl | 100 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 81 insertions(+), 19 deletions(-) commit 78b8555c9a7181ebee59a6fbdefe671d97dc9535 Author: Carl Worth Date: Sat Sep 9 17:31:49 2006 -0700 perf: Don't skip COLOR tests perf/cairo-perf.c | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) commit d3a5d90665f82dd7a58bc22ccede6f2c73d0f900 Author: Carl Worth Date: Sat Sep 9 17:31:19 2006 -0700 boilerplate-xlib: New perf-specific surface creation for xlib backend. When testing the xlib backend do different things for TEST vs. PERF: TEST: Always use pixmap, call Xsynchronize. PERF: Use pixmap for COLOR_ALPHA and DefaultVisual window for COLOR. boilerplate/cairo-boilerplate.c | 137 ++++++++++++++++++++++++++++++--------- 1 files changed, 106 insertions(+), 31 deletions(-) commit aeca64f6cdbf6af154a4fb8b19cb40ee0ecd0bd8 Author: Carl Worth Date: Sat Sep 9 16:40:58 2006 -0700 boilerplate: Allow targets to distinguish between test and perf. Add a new cairo_boilerplate_mode_t so that the boilerplate targets can do slightly different things if being tested for correctness vs. being run for performance. boilerplate/cairo-boilerplate.c | 143 +++++++++++++++++++++------------------ boilerplate/cairo-boilerplate.h | 16 +++-- perf/cairo-perf.c | 1 + test/cairo-test.c | 1 + 4 files changed, 91 insertions(+), 70 deletions(-) commit 97f26c523590dcb208a7c0e4d00fd66f4ca58605 Merge: 0e59041... 416e945... Author: Vladimir Vukicevic Date: Sat Sep 9 17:09:03 2006 -0700 Merge branch 'master' of git+ssh://git.cairographics.org/git/cairo into cairo-master commit 0e59041321e49e1eae330567e0c7d27e7d71699d Author: Vladimir Vukicevic Date: Sat Sep 9 17:08:18 2006 -0700 [win32] win32-specific Makefiles for building with MSVC This patch adds a bunch of makefiles for building cairo with Visual C++. gnu make is still required, and make must be run from a command prompt that has the Visual C++ paths set up, as well as has the cygwin environment in the path. Run 'make -f Makefile.win32'. Makefile.win32 | 18 +++++++ boilerplate/Makefile.win32 | 18 +++++++ pixman/src/Makefile.win32 | 34 ++++++++++++++ src/Makefile.win32 | 107 ++++++++++++++++++++++++++++++++++++++++++++ test/Makefile.win32 | 102 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 279 insertions(+), 0 deletions(-) commit 3c5a02c3edf300494cebfe746292b1eeeea08595 Author: Vladimir Vukicevic Date: Sat Sep 9 17:06:21 2006 -0700 [win32] Misc win32 compilation fixes Fix win32/MSVC defines for snprintf, inline, and M_PI src/cairoint.h | 5 +++++ test/cairo-test.h | 6 ++++++ 2 files changed, 11 insertions(+), 0 deletions(-) commit dbd0fa193c77a6cb112b4862c72c3a18209a755e Author: Vladimir Vukicevic Date: Sat Sep 9 17:05:00 2006 -0700 [win32] Make cairo as a win32 static library possible This adds a win32 initialization function that is called from all surface creation and font creation functions to ensure that the win32 mutexes are initialized. src/cairo-win32-font.c | 10 ++++++++++ src/cairo-win32-private.h | 3 +++ src/cairo-win32-surface.c | 29 ++++++++++++++++++++++++----- 3 files changed, 37 insertions(+), 5 deletions(-) commit 416e94532b1584b2ff23dd270c70ab900d55c326 Author: Carl Worth Date: Sat Sep 9 16:04:19 2006 -0700 test/bitmap-font: Fix arguments to FcFreeTypeQuery to avoid warnings. test/bitmap-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit a37e6675333da8f0c5ebe4b8d199f74b8ec30b43 Author: Carl Worth Date: Sat Sep 9 16:03:41 2006 -0700 Use unsigned consistently to avoid compiler warning. boilerplate/cairo-boilerplate.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 195fd5cde610377ffb34c98fed308b2e4d881cbc Author: Carl Worth Date: Sat Sep 9 14:55:57 2006 -0700 boilerplate: Rename cairo_test_target_t to cairo_boilerplate_target_t boilerplate/cairo-boilerplate.c | 4 ++-- boilerplate/cairo-boilerplate.h | 18 +++++++++--------- perf/cairo-perf.c | 12 ++++++------ test/cairo-test.c | 28 ++++++++++++++-------------- 4 files changed, 31 insertions(+), 31 deletions(-) commit 99360bd35d77e1a3f536e72f5729455580c980c2 Author: Behdad Esfahbod Date: Fri Sep 8 15:12:07 2006 -0400 cairo_show_glphs: Mark glyphs argument as const. src/cairo-gstate.c | 2 +- src/cairo.c | 2 +- src/cairo.h | 2 +- src/cairoint.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) commit c475d2ca69fa8fbdf1c50f1d5d1b6b558b8fd6cd Author: Carl Worth Date: Thu Sep 7 17:46:21 2006 -0700 Fix bitmap-font test failure by not generating a type1 font for a bitmap font. This was simply a matter of ensuring that the UNSUPPORTED return value was checked for and propagated all the way out of cairo-type1-fallback.c src/cairo-type1-fallback.c | 35 ++++++++++++++++++++++++----------- 1 files changed, 24 insertions(+), 11 deletions(-) commit f6bd76a4b26848fb5cc8e40e65f4393d3bd684ae Author: Carl Worth Date: Thu Sep 7 17:36:36 2006 -0700 type1: Enforce pre-allocation usage and fail-proof behavior of charstring_encode functions These functions were previously returning a status value that was almost never being checked. Instead we now make these functions void and enforce a usage pattern that the destination array must be pre-grown to accomodate the results. This is verified with a couple of assert statements. The pre-allocation was already happening with all but one call. That call is now also fixed up. src/cairo-type1-fallback.c | 49 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 42 insertions(+), 7 deletions(-) commit 942cd2e026431bd5ae347c264fb3a0469eb53cf4 Author: Carl Worth Date: Thu Sep 7 17:33:35 2006 -0700 Add _cairo_array_size to allow querying the allocated size src/cairo-array.c | 12 ++++++++++++ src/cairoint.h | 3 +++ 2 files changed, 15 insertions(+), 0 deletions(-) commit 8796b19b5d2e203f5f8724cef1d3ae8d2d02fc85 Author: Carl Worth Date: Thu Sep 7 17:09:37 2006 -0700 cairo-type1-fallback.c: Regularize some whitespace. src/cairo-type1-fallback.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 8364251db55c2451eca9b8162aa32ae00f433251 Author: Carl Worth Date: Thu Sep 7 17:07:54 2006 -0700 cairo_type1_font_create: Fix missing NO_MEMORY check and cleanup style. src/cairo-type1-fallback.c | 42 +++++++++++++++++++++++++++--------------- 1 files changed, 27 insertions(+), 15 deletions(-) commit 75ac7ee171d4bbe2b590e444bde9eb95138a2452 Author: Carl Worth Date: Thu Sep 7 16:54:31 2006 -0700 Remove font->status from cairo_type1_font_t This object doesn't act like a status-holding object, (there are no "if (status) return;" inertness-enforcing statements for example), so it shouldn't pretend like it is. src/cairo-type1-fallback.c | 76 ++++++++++++++++++++++---------------------- 1 files changed, 38 insertions(+), 38 deletions(-) commit c28c33a5888bc1ec4ce2067a7215b7f74d4323d1 Author: Carl Worth Date: Thu Sep 7 16:42:04 2006 -0700 Check status value of output_stream object at time of destroy src/cairo-ps-surface.c | 2 ++ src/cairo-type1-fallback.c | 4 +++- 2 files changed, 5 insertions(+), 1 deletions(-) commit 179f7defdffb254936592a02208c338c13466253 Author: Carl Worth Date: Thu Sep 7 16:10:40 2006 -0700 Use new return value from _cairo_output_stream_destroy This is a little simpler than the old idiom of calling _cairo_output_stream_get_status just before calling _cairo_output_stream_destroy. I had hoped this technique would apply in more cases, but many cases want to separate the two actions anyway to do conditional assignment of the status value, (in order to not overwrite an earlier error value). src/cairo-pdf-surface.c | 3 +-- src/cairo-svg-surface.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) commit 89e7d5d4208bd943c884d4261dc7484ac654132c Author: Carl Worth Date: Thu Sep 7 16:01:07 2006 -0700 Make _cairo_output_stream_destroy return the stream's status as a last gasp. src/cairo-output-stream-private.h | 12 +++++++++--- src/cairo-output-stream.c | 26 ++++++++++++++++---------- 2 files changed, 25 insertions(+), 13 deletions(-) commit 3a92ab69c89d227bdfbb1bd5d609b83a59fc013f Author: Carl Worth Date: Thu Sep 7 13:09:25 2006 -0700 test: Report details errors when image output files cannot be found. test/buffer-diff.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) commit d598cd8d61863ff91f505241a773595aec7e8445 Author: Nicholas Miell Date: Wed Sep 6 15:45:00 2006 -0700 Fix the AMD64 final link by removing SLIM from pixman In order for SLIM's PLT indirection avoidance to work, everything in the library that makes internal function calls needs to see the relevant slim_hidden_proto() macro in addition to the function's prototype. However, external headers used by clients of the shared library should not use the SLIM macros at all. Pixman is a rather odd case -- it's mostly independent from cairo, so it has it's own public interface, but it's built as a part of cairo instead of its own shared library. This means that cairo would need to see all of pixman's slim_hidden_proto() macros in order to function and it doesn't currently, which results in a link failure on AMD64 systems and on i386 systems (I think, I haven't actually verified this) it produces a shared object that isn't actally sharable. I have no idea why exactly the link failure only showed up as a result of commit e06246b9b1015eb89112f628d5820fcb350a7335. I think it has something to do with the pixman functions no longer having PLT entries at all, but the exact interaction isn't clear to me. However, all of these pixman functions aren't part of the cairo ABI (which is why they were marked pixman_private in the first place), which means that the SLIMification of pixman is largely pointless -- they aren't externally visible, so they don't need PLT entries at all. Furthermore, while pixman may eventually be shared among cairo and X, I'm told that this sharing will be source-level only, which means it won't ever be an actual shared library and thus won't ever need SLIM at all. So, I just removed all use of SLIM in pixman (leaving behind slim_internal.h for the future edification of anyone who cares).This fixes the AMD64 link failure and passes the check-plt & check-def parts of make check. Signed-off-by: Nicholas Miell pixman/src/fbpict.c | 1 - pixman/src/iccolor.c | 1 - pixman/src/icformat.c | 1 - pixman/src/icimage.c | 4 ---- pixman/src/icint.h | 13 ------------- pixman/src/icrect.c | 1 - pixman/src/pixregion.c | 8 -------- 7 files changed, 0 insertions(+), 29 deletions(-) commit 203d70a562ce3ffca51069aecda01a9f2bb61ff5 Author: Nicholas Miell Date: Wed Sep 6 14:43:44 2006 -0700 Make the SLIM macros robust in the face of macro-renamed symbols This doesn't actually fix the AMD64 link failure, but it does make the foo/EXT_foo/INT_foo symbol names generated by the slim_hidden_proto() and slim_hidden_def() macros consistent in the face of the meddling of pixman-remap.h. Signed-off-by: Nicholas Miell pixman/src/slim_internal.h | 5 +++-- src/cairoint.h | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) commit 404e88ea6a08371280fb9fbc1f903e16ac868bf4 Author: Behdad Esfahbod Date: Wed Sep 6 17:46:29 2006 -0400 configure.in: Require automake version 1.9 here too configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 8a25471c2535206343e46ea90ac8875fed948363 Author: Carl Worth Date: Wed Sep 6 14:19:32 2006 -0700 autogen.sh: Require automake version 1.9 This is the first version of automake to support a slash in SUBDIRS, (as used by the recent addition of cairo/boilerplate). Thanks to Frederic Peters for pointing this out (fixes bug #8152). autogen.sh | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit b5a64138bb9be97b96e6bf248c559e8d3c6d4ac1 Author: Behdad Esfahbod Date: Wed Sep 6 16:39:18 2006 -0400 [x86-64] check-plt.sh: match on JU?MP_SLO as on x86-64 "SLOT" is truncated src/check-plt.sh | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e25add77df1cc6c89ded371f7f63b36073cb1389 Author: Behdad Esfahbod Date: Wed Sep 6 13:58:31 2006 -0400 Add boilerplate/.gitignore | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit cd1b6650648b5a688b4b6c2d696d9434c824a13f Author: Behdad Esfahbod Date: Wed Sep 6 13:54:12 2006 -0400 Add scripts to sanity check the shared object for exported and PLT symbols src/check-def.sh checks that the list of symbols exported is the same as the list of symbols in cairo.def, ie. symbols in public header files. (except for symbols starting with _cairo) src/check-plt.sh checks that no PLT entries exist for local function calls. This makes sure we keep the 'slim' annotations uptodate. These two are defined as tests in src/ and will be run during "make distcheck". However, they are skipped if the commands 'nm' and 'readelf' are not found. (We don't really rely on any functionality of eu-readelf, so using readelf proper which should be more commonlly installed.) RELEASING | 36 +++++++----------------------------- src/Makefile.am | 3 +++ src/check-def.sh | 31 +++++++++++++++++++++++++++++++ src/check-plt.sh | 17 +++++++++++++++++ 4 files changed, 58 insertions(+), 29 deletions(-) commit 3d398b1a214a4e30806773a5198db0dace061608 Author: Behdad Esfahbod Date: Wed Sep 6 13:49:53 2006 -0400 [test/Makefile] Unset DIST_SUBDIRS test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c4d863afad7f45a0360c732b5b6d1c29064dc1f5 Author: Behdad Esfahbod Date: Wed Sep 6 13:49:27 2006 -0400 [perf/Makefile] Unset DIST_SUBDIRS perf/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6b377b62ac45b92e08e7dee2378d50d87f0ab410 Author: Behdad Esfahbod Date: Wed Sep 6 13:49:02 2006 -0400 Update perf/.gitignore | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 94c361cd2a775a94a6e770ea81f6e81edf6165b4 Author: Behdad Esfahbod Date: Wed Sep 6 13:47:37 2006 -0400 [Makefile] Add perf to DIST_SUBDIRS Makefile.am | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 8c9ea020cab66c9f133571db2b56f96d4c28cdbd Author: Behdad Esfahbod Date: Wed Sep 6 12:45:07 2006 -0400 [Makefile] Fix typo boilerplate/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit a7844338da31785e8bc4261feaf4ea16adc6abdb Author: Carl Worth Date: Wed Sep 6 05:17:01 2006 -0700 perf: Add tessellate test case (in -16, -64, and -256 varieties) perf/.gitignore | 1 + perf/Makefile.am | 3 +- perf/cairo-perf.c | 3 + perf/cairo-perf.h | 3 + perf/tessellate.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 175 insertions(+), 1 deletions(-) commit 221c02098f81d16b642693356afb1f4cf7fca5fd Author: Carl Worth Date: Wed Sep 6 05:09:19 2006 -0700 perf: Allow CAIRO_TEST_TARGET to limit targets tested. Also, don't print the image size for a test if there is only one. perf/cairo-perf.c | 17 ++++++++++++++--- 1 files changed, 14 insertions(+), 3 deletions(-) commit b866069210e2a86ab54770b3c762c8f31b75a55e Author: Carl Worth Date: Wed Sep 6 05:07:08 2006 -0700 perf: Handle 32-bit wraparound of performance counter perf/cairo-perf-posix.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit b64645c567182795b050f909673aea523ae6f505 Author: Carl Worth Date: Wed Sep 6 03:32:07 2006 -0700 perf: Fix cairo_perf_ticks_per_second to avoid wraparound perf/cairo-perf-posix.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d9082d59db90a4373ec52d932b87234e3c39b21b Author: Carl Worth Date: Wed Sep 6 01:37:13 2006 -0700 Prefer CPU performance counters (if available) over gettimeofday. I've seen this improve the std. deviation often by a factor of 2 and occasionally up to a factor of 10. It is sometimes not much better, but never seems to be appreciably worse compared to using gettimeofday. Thanks to David A. Schleef and his liboil for the implementation. perf/cairo-perf-posix.c | 124 ++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 116 insertions(+), 8 deletions(-) commit 1085d99bc3c2f12ae37be0489deedac2475ab376 Author: Carl Worth Date: Wed Sep 6 00:56:56 2006 -0700 perf/README: Update due to cairo_perf_timer API changes perf/README | 18 ++++++------------ 1 files changed, 6 insertions(+), 12 deletions(-) commit 3c407aa80a43e1724e732482ada5ad6718fe33ae Author: Carl Worth Date: Wed Sep 6 00:53:52 2006 -0700 perf-paint: Spend more iterations on smaller sizes to balance testing. The values here are chosen to try to equalize the standard deviation of the various tests. perf/paint.c | 22 ++++++++++++++++++---- 1 files changed, 18 insertions(+), 4 deletions(-) commit 3519887f1838a8ea67784eecec31feb9a37b4828 Author: Carl Worth Date: Wed Sep 6 00:52:06 2006 -0700 perf: Move sorting and discarding outside of compute_stats. Adjust discard to slowest 15% only. perf/cairo-perf.c | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) commit d31037e421e275cd1d6d1440d6b5bdb817f992bc Author: Carl Worth Date: Wed Sep 6 00:15:49 2006 -0700 perf: Report times not rates. Interface in integers not doubles. boilerplate/cairo-boilerplate.h | 31 +++++++++++++++++++++++++++++++ perf/cairo-perf-posix.c | 15 ++++++++++----- perf/cairo-perf-win32.c | 12 ++++++++---- perf/cairo-perf.c | 23 ++++++++++++----------- perf/cairo-perf.h | 12 +++++++++--- perf/paint.c | 8 ++++---- 6 files changed, 74 insertions(+), 27 deletions(-) commit 9d0d38e0a0307580ba69a96e239507cc9559cd99 Author: Carl Worth Date: Tue Sep 5 22:58:33 2006 -0700 perf: Rename functions in line with cairo's naming guidelines perf/cairo-perf-posix.c | 24 ++++++++++++------------ perf/cairo-perf-win32.c | 20 ++++++++++---------- perf/cairo-perf.c | 2 +- perf/cairo-perf.h | 10 ++++------ perf/paint.c | 6 +++--- 5 files changed, 30 insertions(+), 32 deletions(-) commit 9f51fcc888c4b036c535a6a4042ae8c6859f3261 Author: Carl Worth Date: Tue Sep 5 22:53:12 2006 -0700 perf: Fold cairo-perf-timer.h into cairo-perf.h perf/Makefile.am | 4 +- perf/cairo-perf-posix.c | 74 +++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf-timer-posix.c | 74 ----------------------------------------- perf/cairo-perf-timer-win32.c | 71 --------------------------------------- perf/cairo-perf-timer.h | 51 ---------------------------- perf/cairo-perf-win32.c | 71 +++++++++++++++++++++++++++++++++++++++ perf/cairo-perf.h | 18 +++++++++- 7 files changed, 164 insertions(+), 199 deletions(-) commit 499a3a7c4772bb0f446f89a9c6e9430bd31c1218 Author: Carl Worth Date: Tue Sep 5 22:50:25 2006 -0700 perf: Remove unused alarm functions perf/cairo-perf-timer-posix.c | 29 ----------------------------- perf/cairo-perf-timer-win32.c | 20 -------------------- perf/cairo-perf-timer.h | 10 ---------- perf/cairo-perf.c | 2 -- perf/cairo-perf.h | 2 -- 5 files changed, 0 insertions(+), 63 deletions(-) commit df8cc10073b0cacd198eda5a24f2b2f61a0a7085 Author: Benjamin Otte Date: Tue Sep 5 22:48:38 2006 -0700 perf: Make cairo_perf_timer structure private. Make timer functions void. perf/cairo-perf-timer-posix.c | 22 +++++++++++++++------- perf/cairo-perf-timer-win32.c | 20 ++++++++++++++------ perf/cairo-perf-timer.h | 17 ++++------------- perf/paint.c | 7 +++---- 4 files changed, 36 insertions(+), 30 deletions(-) commit 1bb6f9fb10dfdb59779ec159569ed6a44c4e8e5f Author: Benjamin Otte Date: Tue Sep 5 22:36:56 2006 -0700 perf: Add yield and fix double comparison - add a yield () function that's called before every test. It reduced the std dev slightly for me - fix double comparisons to not just compare the integer part perf/cairo-perf-timer-posix.c | 12 ++++++++++++ perf/cairo-perf-timer-win32.c | 7 +++++++ perf/cairo-perf-timer.h | 5 +++++ perf/cairo-perf.c | 10 ++++++++-- 4 files changed, 32 insertions(+), 2 deletions(-) commit bcb7863f00b4cfdf0985993067fc32d07b81540b Author: Carl Worth Date: Tue Sep 5 22:25:21 2006 -0700 Move target tolerance to cairo_test_target structure (should let single-pixel SVG errors pass) Previously we were setting the target tolerance based on the surface type. But that doesn't work as multiple backends will provide a surface of type meta. So instead we put the tolerance as a value in the cairo_test_target data structure. With this change, some single-pixel errors of 1 in the SVG backend should now be ignored. boilerplate/cairo-boilerplate.c | 68 +++++++++++++++++++++----------------- boilerplate/cairo-boilerplate.h | 1 + test/cairo-test.c | 40 +---------------------- 3 files changed, 40 insertions(+), 69 deletions(-) commit 4620b929ae84dfa08c1c9a4072e114f6b38e1bd9 Author: Carl Worth Date: Tue Sep 5 17:12:43 2006 -0700 RELEASING: Add note on checking for local symbol PLT entries. RELEASING | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+), 0 deletions(-) commit 60c4add26abe6b624d7569f35fa846d529ccea18 Author: Carl Worth Date: Tue Sep 5 16:52:34 2006 -0700 slim_hidden_proto: Move smeicolon from definition to use for consistency and legibility src/cairo-ft-private.h | 6 +- src/cairo-xlib-private.h | 2 +- src/cairoint.h | 166 +++++++++++++++++++++--------------------- src/test-fallback-surface.c | 2 +- 4 files changed, 88 insertions(+), 88 deletions(-) commit d7f08794ef194d0b86a749381472bfeb0a32d993 Author: Carl Worth Date: Tue Sep 5 16:48:49 2006 -0700 Add many missing slim_hidden calls to bypass PLT entries for local use of public functions src/cairo-font-options.c | 9 +++++ src/cairo-font.c | 2 + src/cairo-ft-font.c | 3 ++ src/cairo-ft-private.h | 7 +++- src/cairo-image-surface.c | 4 ++ src/cairo-matrix.c | 1 + src/cairo-pattern.c | 8 ++++ src/cairo-png.c | 1 + src/cairo-scaled-font.c | 9 +++++ src/cairo-surface.c | 10 +++++ src/cairo-xlib-private.h | 7 ++++ src/cairo-xlib-surface.c | 1 + src/cairo.c | 12 ++++++ src/cairoint.h | 84 +++++++++++++++++++++++++++++++++++------- src/test-fallback-surface.c | 3 ++ 15 files changed, 145 insertions(+), 16 deletions(-) commit e06246b9b1015eb89112f628d5820fcb350a7335 Author: Carl Worth Date: Tue Sep 5 16:45:01 2006 -0700 pixman: Add pixman_private decorations to hide pixman symbols from public interface pixman/src/fbmmx.h | 21 +++++++++ pixman/src/icimage.h | 2 +- pixman/src/pixman.h | 108 +++++++++++++++++++++++++---------------------- pixman/src/renderedge.h | 10 ++-- 4 files changed, 85 insertions(+), 56 deletions(-) commit d716020db272839717ff71d91534f3125029b47a Author: Adrian Johnson Date: Tue Sep 5 15:57:47 2006 -0400 Generate Type 1 fonts from glyph outlines This patch generates Type 1 fonts for the PS/PDF backends when TrueType or Type 1 subsetting fails. This has the advantage over the current Type 3 fallback of reduced font size and better quality rendering in some PDF viewers. xpdf shows a large improvement in text display quality with this patch. src/Makefile.am | 1 + src/cairo-pdf-surface.c | 93 +++-- src/cairo-ps-surface.c | 32 ++ src/cairo-scaled-font-subsets-private.h | 31 ++ src/cairo-type1-fallback.c | 682 +++++++++++++++++++++++++++++++ 5 files changed, 809 insertions(+), 30 deletions(-) commit ad78eb7692f6d080430bceb7b358403f6e91a637 Author: Adrian Johnson Date: Tue Sep 5 14:53:33 2006 -0400 Improve error checking in TrueType subsetting TrueType subsetting will SEGV when using OpenType fonts with CFF outlines. src/cairo-truetype-subset.c | 36 ++++++++++++++++++++++++------------ 1 files changed, 24 insertions(+), 12 deletions(-) commit 49fa8d353b2926760fa92684546b2fc79985c782 Author: Adrian Johnson Date: Tue Sep 5 14:19:48 2006 -0400 Correct the value of /LastChar in the PDF Type 1 font dictionary. src/cairo-pdf-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d81de15804f210afe9905a4163a5e34ff2be5b5b Author: Adrian Johnson Date: Tue Sep 5 14:19:26 2006 -0400 Fix Type 1 embedding in PDF PDF Files with Type 1 fonts fail to open in any version of ghostscript prior to 8.54. The problem is the hex encoding of the encrypted portion of the font. The PDF reference says this should only be in binary. src/cairo-pdf-surface.c | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-scaled-font-subsets-private.h | 4 +++- src/cairo-type1-subset.c | 11 ++++++----- 4 files changed, 11 insertions(+), 8 deletions(-) commit e5a9c2330867ae11befa8a966aa0a50c31c82a32 Author: Behdad Esfahbod Date: Sat Sep 2 19:51:54 2006 -0400 [configure] Invalidate cached warning flags if list of flags changes such that one doesn't need to remove config.cache when when we add new warning flags to be checked. configure.in | 34 ++++++++++++++++++++++++---------- 1 files changed, 24 insertions(+), 10 deletions(-) commit 7c97a787ebce4880d6b9fe47a13ad018ff2ecd31 Author: Carl Worth Date: Fri Sep 1 16:10:25 2006 -0700 bug 8104: Eliminate unused variables. Replicate assert statement to identify branch of interest. src/cairo-ft-font.c | 9 ++------- 1 files changed, 2 insertions(+), 7 deletions(-) commit 0a1aef157ef6cfea8608e7d037583c29cb2da5fe Author: Carl Worth Date: Thu Aug 31 18:25:04 2006 -0700 perf/README: Fix typo perf/README | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 91d55417053d3c0b615787432ff0a618e76f864f Author: Carl Worth Date: Thu Aug 31 18:11:25 2006 -0700 perf: Add README file explaining how to add a new test perf/README | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 92 insertions(+), 0 deletions(-) commit 2fa0228d63713f6274ca3228f236f1ee362ba11f Author: Carl Worth Date: Thu Aug 31 17:43:40 2006 -0700 Two big improvements to bring the std. deviation down to where we want it. 1. Remove all the alarm/signal code, which just isn't doing what we want for some reason. Instead, for now we'll simply run for a fixed number of iterations, (perhaps we can tune that per test later). 2. Before computing mean and stdandard deviation of runs, sort them all and discard the top and bottom 20% of the values. Now the standard deviation for the paint test is generally 2% or less. perf/cairo-perf.c | 29 +++++++++++++++++++---------- perf/cairo-perf.h | 30 ------------------------------ perf/paint.c | 12 +++++++----- 3 files changed, 26 insertions(+), 45 deletions(-) commit 6ae6d91c0c3a2f8fdff39c1c84fbef3aa45bf958 Author: Carl Worth Date: Thu Aug 31 14:08:43 2006 -0700 perf: Switch from alarm to setitimer for more fine-grained control of timers perf/cairo-perf-timer-posix.c | 17 +++++++++++++++-- perf/cairo-perf-timer-win32.c | 2 +- perf/cairo-perf-timer.h | 2 +- perf/cairo-perf.c | 4 ++-- perf/cairo-perf.h | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) commit 2ebb9af4346c5e60d2497cfb9c5809d0c8045878 Author: Benjamin Otte Date: Thu Aug 31 13:30:10 2006 -0700 boilerplate: Fix compilation for glitz. boilerplate/Makefile.am | 14 ++++++++++++++ boilerplate/cairo-boilerplate.c | 1 + test/Makefile.am | 13 ------------- 3 files changed, 15 insertions(+), 13 deletions(-) commit 19a5b8b9b53219dc8ae508a2fcd7b2ca617bc9b8 Author: Carl Worth Date: Thu Aug 31 13:22:17 2006 -0700 perf: Run for multiple iterations and print std. deviation perf/cairo-perf.c | 61 ++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 49 insertions(+), 12 deletions(-) commit 689e9c446eb0ec69cb560fa44f4a1f6a0b28cb17 Author: Carl Worth Date: Thu Aug 31 12:34:21 2006 -0700 perf: Add indication of content to output perf/cairo-perf.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-) commit 7917e1201fd38089111bb7723256747ae32347e0 Author: Carl Worth Date: Thu Aug 31 11:53:16 2006 -0700 perf: Fix typo in backend blackballing so that image tests now run perf/cairo-perf.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 0c741675e1d43168f42ee530486bfa4b8ec54920 Author: Carl Worth Date: Thu Aug 31 11:51:28 2006 -0700 Make perf interface return a rate. Start print target and test names. perf/cairo-perf.c | 18 ++++++++++++------ perf/cairo-perf.h | 4 ++-- perf/paint.c | 12 ++++++------ 3 files changed, 20 insertions(+), 14 deletions(-) commit fd13e874a778eeac4e2d358cc19b040aa20bcdf3 Author: Carl Worth Date: Thu Aug 31 11:42:51 2006 -0700 perf: Drop separate setup function from each test case. We are already doing loop measurement internally, so each function can already do any setup it needs without it affecting the measurement. perf/cairo-perf.c | 6 ++---- perf/cairo-perf.h | 3 +-- perf/paint.c | 31 ++++++++++++++++++------------- 3 files changed, 21 insertions(+), 19 deletions(-) commit 578b74473de4c70f907db38eac6f8e9039d72aa1 Author: Carl Worth Date: Thu Aug 31 11:31:21 2006 -0700 perf: More consistency improvements for names. Rename bench_timer_t to cairo_perf_timer_t. Rename PERF_LOOP macros to CAIRO_PERF_LOOP Rename DECL_PERF_FUNC to CAIRO_PERF_DECL perf/cairo-perf-timer-posix.c | 6 +++--- perf/cairo-perf-timer-win32.c | 6 +++--- perf/cairo-perf-timer.h | 17 ++++++++++++++--- perf/cairo-perf.h | 27 ++++++++------------------- perf/paint.c | 8 ++++---- 5 files changed, 32 insertions(+), 32 deletions(-) commit cf75da4842ca1191719e9f100c6af901a14dda5c Author: Carl Worth Date: Thu Aug 31 11:25:04 2006 -0700 perf: Rename timer-alarm files to cairo-perf-timer perf/Makefile.am | 12 +++--- perf/cairo-perf-timer-posix.c | 70 +++++++++++++++++++++++++++++++++++++ perf/cairo-perf-timer-win32.c | 76 +++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf-timer.h | 54 +++++++++++++++++++++++++++++ perf/cairo-perf.h | 2 +- perf/timer-alarm-posix.c | 70 ------------------------------------- perf/timer-alarm-win32.c | 76 ----------------------------------------- perf/timer-alarm.h | 54 ----------------------------- 8 files changed, 207 insertions(+), 207 deletions(-) commit 7ad6e941017e070bf7d93afba4de5c49cd1ff533 Author: Behdad Esfahbod Date: Thu Aug 31 14:21:51 2006 -0400 [test] Use FcFreeTypeQuery test/bitmap-font.c | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit 7f6e901a236ed267d396310fc56fa6bde697bfa2 Author: Carl Worth Date: Thu Aug 31 11:19:48 2006 -0700 perf: More simplification of PERF_LOOP macros. Here we drop both the start_timing and stop_timing functions, foliding their contents into main, PERF_LOOP_INIT and PERF_LOOP_FINI. perf/cairo-perf.c | 23 ++++------------------- perf/cairo-perf.h | 28 +++++++++++++--------------- 2 files changed, 17 insertions(+), 34 deletions(-) commit b9f629d54239c43eef4746293bcffd58ada442f2 Author: Carl Worth Date: Thu Aug 31 11:02:20 2006 -0700 perf: Don't require a separate counter from the timer for perf loops. perf/cairo-perf.c | 14 +++-------- perf/cairo-perf.h | 58 +++++++++++++++++++++++++++------------------- perf/paint.c | 7 ++--- perf/timer-alarm-posix.c | 4 +- perf/timer-alarm-win32.c | 6 ++-- perf/timer-alarm.h | 11 -------- 6 files changed, 46 insertions(+), 54 deletions(-) commit 13bcba68ae6f0d29b82def09e7a6e356266dc2e7 Author: Carl Worth Date: Thu Aug 31 10:39:24 2006 -0700 perf: Collapse timing.[ch] down into cairo-perf.[ch] perf/Makefile.am | 2 - perf/cairo-perf.c | 40 +++++++++++++++++++++++---- perf/cairo-perf.h | 49 ++++++++++++++++++++++++++++----- perf/paint.c | 1 - perf/timer-alarm-posix.c | 2 +- perf/timer-alarm-win32.c | 3 -- perf/timing.c | 56 ------------------------------------- perf/timing.h | 68 ---------------------------------------------- 8 files changed, 77 insertions(+), 144 deletions(-) commit a60ed68daebc15e87ededbca80211508f624bcb6 Author: Carl Worth Date: Thu Aug 31 10:33:24 2006 -0700 perf: Remove unused util.c perf/util.c | 177 ----------------------------------------------------------- 1 files changed, 0 insertions(+), 177 deletions(-) commit 739c4767673ace4f566d395d770924617ddebaff Author: Carl Worth Date: Thu Aug 31 10:27:20 2006 -0700 Initial hookup of Vlad's timer/alarm code boilerplate/cairo-boilerplate.h | 1 + perf/Makefile.am | 9 +++ perf/cairo-bench.h | 110 --------------------------------------- perf/cairo-perf.h | 6 +-- perf/paint.c | 9 +++- perf/timer-alarm-posix.c | 70 +++++++++++++++++++++++++ perf/timer-alarm-win32.c | 79 ++++++++++++++++++++++++++++ perf/timer-alarm.h | 65 +++++++++++++++++++++++ perf/timing.c | 56 ++++++++++++++++++++ perf/timing.h | 68 ++++++++++++++++++++++++ perf/util.c | 12 +++-- 11 files changed, 364 insertions(+), 121 deletions(-) commit 3d279da6214d43de05eba4af381e451cec3cfd72 Author: Vladimir Vukicevic Date: Thu Aug 31 09:01:23 2006 -0700 Add useful pieces from Vladimir's cairo-bench perf/cairo-bench.h | 110 ++++++++++++++++++++++++++++++++ perf/util.c | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 285 insertions(+), 0 deletions(-) commit 851dd63719d51f9b839784ba2761a1e2b2ecfbe5 Author: Behdad Esfahbod Date: Thu Aug 31 13:18:37 2006 -0400 [test] Use $(srcdir) to find valgrind supressions test/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2c16aa63044afe75c00518c2cb7e5ba6288e905a Author: Carl Worth Date: Thu Aug 31 08:53:58 2006 -0700 perf: Don't measure meta-surface-backed surface types. boilerplate/cairo-boilerplate.h | 3 +++ perf/.gitignore | 1 - perf/cairo-perf.c | 37 +++++++++++++++++++++++++++++++++++++ test/cairo-test.h | 8 -------- 4 files changed, 40 insertions(+), 9 deletions(-) commit 4915e0baa761f1179023f2ad5d5cd3dd6aeaba2f Author: Carl Worth Date: Thu Aug 31 08:36:29 2006 -0700 boilerplate: Fix missing include of config.h which was preventing many backends from being tested boilerplate/cairo-boilerplate.c | 26 +++++++++++++++----------- boilerplate/cairo-boilerplate.h | 4 ++++ test/cairo-test.c | 15 --------------- 3 files changed, 19 insertions(+), 26 deletions(-) commit 8d834c3a34a17de0e03841501ea107dee7b373d0 Author: Carl Worth Date: Thu Aug 31 08:35:39 2006 -0700 Require librsvg >= 2.14.0 to test SVG backend configure.in | 12 +++++++----- 1 files changed, 7 insertions(+), 5 deletions(-) commit e153c55dffca6b95a8ad9c731156a579f8979f42 Author: Carl Worth Date: Thu Aug 31 07:19:05 2006 -0700 perf: Add initial skeleton of performance monitoring suite Makefile.am | 2 + configure.in | 1 + perf/.gitignore | 2 + perf/Makefile.am | 26 +++++++++++++++++++ perf/cairo-perf.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ perf/cairo-perf.h | 45 +++++++++++++++++++++++++++++++++ perf/paint.c | 49 ++++++++++++++++++++++++++++++++++++ 7 files changed, 197 insertions(+), 0 deletions(-) commit d1834cca192fe6f8e429be0461fab6914e04024d Author: Carl Worth Date: Thu Aug 31 04:01:10 2006 -0700 test: Ignore single-bit errors for SVG backend. The interface of the various buffer/image_diff functions is improved to provide the maximum pixel difference in addition to the number of pixels that differ. This value can then be used to compare against a per-backend tolerance. Currently I've set the SVG backend's tolerance to 1 to handle some issues we're currently seeing of single-bit differences on different systems, (but we're not exactly sure why yet). Also I improved the image_diff routines to properly report a status value on failure rather than the bogus value of -1 for pixels_changed. Makefile.am | 2 +- test/buffer-diff.c | 96 ++++++++++++++++++++++++++++++++------------------- test/buffer-diff.h | 63 +++++++++++++++++++++++++-------- test/cairo-test.c | 67 +++++++++++++++++++++++++++++++----- test/imagediff.c | 19 +++++++--- test/xlib-surface.c | 75 ++++++++++++++++++++++----------------- 6 files changed, 222 insertions(+), 100 deletions(-) commit d52a1f762d33f3ada919b581e0d62f8ba1c2314c Author: Carl Worth Date: Thu Aug 31 01:39:06 2006 -0700 Move test-specific stuff out of boilerplate/ and back into test/ This now gives us two separate libtool convenience libraries, so they have to have separate names now: libcairoboilerplate.la and libcairotest.la. boilerplate/Makefile.am | 14 +- boilerplate/buffer-diff.c | 306 -------------------- boilerplate/buffer-diff.h | 80 ------ boilerplate/cairo-test.c | 683 --------------------------------------------- boilerplate/cairo-test.h | 136 --------- boilerplate/xmalloc.c | 6 +- test/Makefile.am | 13 +- test/buffer-diff.c | 306 ++++++++++++++++++++ test/buffer-diff.h | 80 ++++++ test/cairo-test.c | 683 +++++++++++++++++++++++++++++++++++++++++++++ test/cairo-test.h | 136 +++++++++ 11 files changed, 1225 insertions(+), 1218 deletions(-) commit 95475218858792ccb20ac6ad28db22e233c783d7 Author: Carl Worth Date: Wed Aug 30 23:41:48 2006 -0700 boilerplate: Remove custom read/write-png code in favor of using cairo surfaces Also combine image_diff and image_diff_flattened into a single function boilerplate/Makefile.am | 4 - boilerplate/buffer-diff.c | 260 ++++++++++++++++----------------------- boilerplate/cairo-boilerplate.c | 2 +- boilerplate/cairo-boilerplate.h | 10 ++- boilerplate/cairo-test.c | 2 - boilerplate/read-png.c | 196 ----------------------------- boilerplate/read-png.h | 45 ------- boilerplate/write-png.c | 99 --------------- boilerplate/write-png.h | 35 ----- test/imagediff.c | 2 - 10 files changed, 119 insertions(+), 536 deletions(-) commit 37ce7058906a9a8c7e80bf4ed59c17ec912087cf Author: Carl Worth Date: Wed Aug 30 22:56:36 2006 -0700 Separate the sharable stuff out of cairo-test.c into cairo-boilerplate.c boilerplate/Makefile.am | 3 +- boilerplate/cairo-boilerplate.c | 1511 +++++++++++++++++++++++++++++++++++++++ boilerplate/cairo-boilerplate.h | 80 ++ boilerplate/cairo-test.c | 1484 +-------------------------------------- boilerplate/cairo-test.h | 13 +- 5 files changed, 1607 insertions(+), 1484 deletions(-) commit a0ca4369ff71ca76e593ea8db3e728218814814d Author: Carl Worth Date: Wed Aug 30 22:33:53 2006 -0700 Add boilerplate/README explaining its purpose boilerplate/README | 14 ++++++++++++++ 1 files changed, 14 insertions(+), 0 deletions(-) commit 5ef4c991f6ad00a37fc0645a38ba2cb9f832d9f1 Author: Carl Worth Date: Wed Aug 30 15:38:15 2006 -0700 test: Add link to test log file in HTML output test/make-html.pl | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 7f4e83ceeba912167df05f62ddd0798b112979a3 Author: Carl Worth Date: Wed Aug 30 15:34:27 2006 -0700 Split libcairotest files out from test/ and into boilerplate/ The idea here is to setup boilerplate to allow code sharing between test/ and the upcoming perf/ .gitignore | 5 + boilerplate/Makefile.am | 35 + boilerplate/buffer-diff.c | 348 ++++++ boilerplate/buffer-diff.h | 80 ++ boilerplate/cairo-test-beos.cpp | 236 ++++ boilerplate/cairo-test-beos.h | 26 + boilerplate/cairo-test-directfb.c | 123 +++ boilerplate/cairo-test-directfb.h | 23 + boilerplate/cairo-test.c | 2147 +++++++++++++++++++++++++++++++++++++ boilerplate/cairo-test.h | 143 +++ boilerplate/read-png.c | 196 ++++ boilerplate/read-png.h | 45 + boilerplate/write-png.c | 99 ++ boilerplate/write-png.h | 35 + boilerplate/xmalloc.c | 58 + boilerplate/xmalloc.h | 37 + configure.in | 1 + test/Makefile.am | 33 +- test/buffer-diff.c | 348 ------ test/buffer-diff.h | 80 -- test/cairo-test-beos.cpp | 236 ---- test/cairo-test-beos.h | 26 - test/cairo-test-directfb.c | 123 --- test/cairo-test-directfb.h | 23 - test/cairo-test.c | 2147 ------------------------------------- test/cairo-test.h | 143 --- test/read-png.c | 196 ---- test/read-png.h | 45 - test/write-png.c | 99 -- test/write-png.h | 35 - test/xmalloc.c | 58 - test/xmalloc.h | 37 - 32 files changed, 3642 insertions(+), 3624 deletions(-) commit a5f068e10d72c20a55d20ca9f79508361d13fb80 Author: Behdad Esfahbod Date: Wed Aug 30 13:17:08 2006 -0400 [test] Add 128 to any diff component such that differences are visible test/buffer-diff.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) commit 3252ad5ca630fe292babc061c01b8759ef49cde4 Author: Behdad Esfahbod Date: Mon Aug 28 22:44:15 2006 -0400 [PNG] Mark status volatile to fix gcc warning src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b6e5f2b0fef00352930dfcc47a13f330a13b1d68 Author: Behdad Esfahbod Date: Mon Aug 28 22:30:38 2006 -0400 [xlib] Bug 7593: rewrite loop to be more readable, and fix warnings Basically, it's evil to write a loop like: while ((c -= 4) > 0) { ... } for one reason that doesn't work if c is unsigned. And when c is signed, if for some reason c is about -MAXINT, then it will overflow and not work as expected. It's much safer (and more gcc warning friendly) to rewrite it as: unsigned int c; while (c >= 4) { ... c -= 4; } src/cairo-xlib-surface.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 06a962886806be5e68061e24223c617980ac8248 Author: Carl Worth Date: Mon Aug 28 19:00:48 2006 -0700 Eliminate conditions checking for unsigned or enum values less than 0. src/cairo-array.c | 2 +- src/cairo-svg-surface.c | 4 ++-- src/cairoint.h | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) commit 7d1399a4bb0d8d74a4294700e6040accccefff2a Author: Carl Worth Date: Mon Aug 28 18:58:27 2006 -0700 Put static first to avoid compiler warning. src/cairo-type1-subset.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1b7ced6614d809262cca08e7c5141b7ce740bfca Author: Behdad Esfahbod Date: Mon Aug 28 18:47:37 2006 -0700 Bug #7593: Avoid unsigned loop control variable to eliminate infinite, memory-scribbling loop. Behdad chased this bug down when looking into bug #7593. This bug is what finally motivated us to figure out how to get -Wextra (for the "always true" comparisons of unsigned variables against negative values). src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 50003615f28862f68b609aa290ebffee24d5d643 Author: Carl Worth Date: Mon Aug 28 18:54:35 2006 -0700 Add -Wextra (as well as -Wno-missing-field-initializers -Wno-unused-parameter) We'd been wanting some of the warnings in -Wextra for a long time, but we had failed in tryingto squelch some of the undesired warnings. We finally figured out how to do this correctly by simply ordering the warnings correctly. configure.in | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) commit 5492946b0ced9b3e97f94ef097ee745c8a59df42 Author: Behdad Esfahbod Date: Wed Aug 23 12:29:49 2006 -0400 [image] Print out cairo version in the unsupported-format message src/cairo-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 96c8f92883322a785fa9fa55de93b8eb56afab64 Author: Behdad Esfahbod Date: Tue Aug 22 22:00:58 2006 -0400 [test] bufferdiff: take abs of the pixel diffs. Oops! test/buffer-diff.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 988b5dcb7e50d9e08ff94cb98f6d9c91915bb9b4 Author: Behdad Esfahbod Date: Mon Aug 21 23:27:17 2006 -0400 [ROADMAP] Remove 1.2.4 stuff out of the way ROADMAP | 13 +------------ 1 files changed, 1 insertions(+), 12 deletions(-) commit edf6f24e1b9673655f2b1c6e2060f9f2e46833e9 Author: Behdad Esfahbod Date: Mon Aug 21 23:25:40 2006 -0400 [TODO] Add cairo_get_scaled_font TODO | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 3d6aec7334881168277877e7d69514568d08c322 Author: Behdad Esfahbod Date: Mon Aug 21 23:24:49 2006 -0400 [ROADMAP] Add glyph cache inspection to 1.4 roadmap ROADMAP | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 782e3eb65b143a6e658eda69ba15da3ac432c711 Author: Adrian Johnson Date: Mon Aug 21 12:52:56 2006 -0400 Get correct unhinted outlines on win32. The documentation for GetGlyphOutline() states that outline returned is grid fitted and if an application requires an unmodified outline it can request an outline for a font whose size is equal to the font's em unit. This seems to suggest that the solution to this bug would be to obtain the unmodified outline data and scale it to the required size. https://bugs.freedesktop.org/show_bug.cgi?id=7603 src/cairo-win32-font.c | 86 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 61 insertions(+), 25 deletions(-) commit 6de226be0e879709c4068cb7836d485e75928287 Author: Yevgen Muntyan Date: Mon Aug 21 03:52:40 2006 -0400 Define WINVER if it's not defined. (bug 6456) src/cairoint.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 6ed1613b5175ea9c431fff2df2cd1cf2e2edbf93 Author: Behdad Esfahbod Date: Sun Aug 20 13:44:56 2006 -0400 [Makefile.am] Remove unnecessary parantheses that were causing trouble with old bash Reported by Tor Lillqvist src/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 047251db4337583075f6888fceecfb0c383d658a Author: Carl Worth Date: Fri Aug 18 18:30:31 2006 -0700 Increment version to 1.2.5 after making the 1.2.4 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 54755b2d9891981d813384bccde84998def96abf Author: Carl Worth Date: Fri Aug 18 18:19:10 2006 -0700 Remove stray ] that was breaking RELEASE_OR_PUBLISH and many make targets (release-publish, etc.) Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit fadde879fbf8547aaa55e80d21611e7674cd5f8f Author: Carl Worth Date: Fri Aug 18 17:36:42 2006 -0700 Update version to 1.2.4 and libtool version to 11:2:9. configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 43a25b818749d31268a60e2fcdaa11a73e41f7fd Author: Carl Worth Date: Fri Aug 18 17:35:33 2006 -0700 NEWS: Add notes for the 1.2.4 release. NEWS | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 68 insertions(+), 0 deletions(-) commit 790a359f89303875d58ff514d62ecff981836c86 Author: Carl Worth Date: Fri Aug 18 16:46:57 2006 -0700 EXTRA_DIST: Add missing source-clip-scale-svg-ref.png test/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit 4f5bb53032d6d0509ef86bcc152ce2b52be49d38 Author: Carl Worth Date: Fri Aug 18 16:35:58 2006 -0700 Ignore ChangeLog* in addition to ChangeLog .gitignore | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 2860af3ce230cde87cc4623d1eb4a920b71bc0d6 Author: Carl Worth Date: Fri Aug 18 16:35:27 2006 -0700 bitmap-font: Add missing pdf-specific reference image test/Makefile.am | 3 +-- test/bitmap-font-pdf-argb32-ref.png | Bin 0 -> 1064 bytes 2 files changed, 1 insertions(+), 2 deletions(-) commit b8b507c0920ddef35363ba1d75e4ba0ca141a028 Author: Carl Worth Date: Fri Aug 18 16:12:43 2006 -0700 Use &image->base as appropriate to avoid warnings. src/cairo-pdf-surface.c | 4 ++-- src/cairo-ps-surface.c | 4 ++-- src/cairo-svg-surface.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) commit 5f94275a4b667d8b1f41f87f1a6b84b3fa3f0616 Author: Carl Worth Date: Fri Aug 18 16:09:53 2006 -0700 Update .gitignore due to recent rename. test/.gitignore | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit d04b8148c2ccf714eb3f31855ca8b61d518423c6 Author: Behdad Esfahbod Date: Fri Aug 18 18:55:52 2006 -0400 [TODO] Add some items from memory TODO | 13 +++++++++++++ 1 files changed, 13 insertions(+), 0 deletions(-) commit 33b62f47a451cb3ee70e7343976f5d1f06adb443 Author: Carl Worth Date: Fri Aug 18 15:08:58 2006 -0700 Move unscheduled features and bugs from ROADMAP to TODO ROADMAP | 101 +------------------------------------------ TODO | 146 +++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 103 insertions(+), 144 deletions(-) commit d1be19e1604f77a0a156bea6d40914aa672c6d81 Author: Carl Worth Date: Fri Aug 18 15:02:24 2006 -0700 Add notes on reporting bugs to BUGS file and move bugs listed there to ROADMAP instead. BUGS | 101 ++++++++++++++++++++++++++++++++++++++++---------------------- ROADMAP | 51 ++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 36 deletions(-) commit 76fca1898c395a576dadffb35de0253b79b669c5 Author: Carl Worth Date: Fri Aug 18 14:30:01 2006 -0700 EXTRA_DIST: Add several files to the tar file releases, (BUGS, CODING_STYLE, ROADMAP, etc. Makefile.am | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit ab092a9a5db70ac16e782cf0d7d3629cc902cc1e Author: Carl Worth Date: Fri Aug 18 14:25:53 2006 -0700 ROADMAP: Remove stray conflict marker ROADMAP | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) commit 328024cc25cba67c939cf51da6ab6409635fa227 Author: Carl Worth Date: Fri Aug 18 14:23:14 2006 -0700 ROADMAP: Punt the AIX -lpthread bug off of the 1.2.4 roadmap. ROADMAP | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 3cf3d4343b6f403b55014f2d259483e1fb688741 Author: Carl Worth Date: Fri Aug 18 14:22:08 2006 -0700 Mark ft-text-vertical-layout tests as XFAIL since we'repunting these from the 1.2.4 release. ROADMAP | 6 +++++- test/Makefile.am | 2 ++ 2 files changed, 7 insertions(+), 1 deletions(-) commit ccdaaf7b950ea68c1149e2649e8379e564b636d8 Author: Behdad Esfahbod Date: Fri Aug 18 17:18:34 2006 -0400 [ROADMAP] Mark xlib detection problem as fixed ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0e78e7144353703cbd28aae6a67cd9ca261f1d68 Author: Behdad Esfahbod Date: Fri Aug 18 17:17:28 2006 -0400 [configure] Check for x11 pkg-config module before using AC_PATH_XTRA Fixes bug 7491. configure.in | 19 +++++++++++-------- 1 files changed, 11 insertions(+), 8 deletions(-) commit 0c6c0a9e0b3e8cd1caa25a2ee65b8384840295b3 Author: Behdad Esfahbod Date: Fri Aug 18 17:02:24 2006 -0400 [configure] Use _NONPKGCONFIG_LIBS if no xrender pkg-config modele is found configure.in | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) commit 84a9ca1835998a11b78f5989ce927166c2baa00f Author: Carl Worth Date: Fri Aug 18 13:07:08 2006 -0700 Rename ft-text-vertical-layout-truetype to ft-text-vertical-layout-type3 test/Makefile.am | 8 +- test/ft-text-vertical-layout-truetype-ref.png | Bin 3933 -> 0 bytes test/ft-text-vertical-layout-truetype-svg-ref.png | Bin 3956 -> 0 bytes test/ft-text-vertical-layout-truetype.c | 154 --------------------- test/ft-text-vertical-layout-type3-ref.png | Bin 0 -> 3933 bytes test/ft-text-vertical-layout-type3-svg-ref.png | Bin 0 -> 3956 bytes test/ft-text-vertical-layout-type3.c | 154 +++++++++++++++++++++ 7 files changed, 157 insertions(+), 159 deletions(-) commit aa2260cfbbf5fd5c923409962814c6795e5ecc41 Author: Behdad Esfahbod Date: Fri Aug 18 15:49:38 2006 -0400 [ROADMAP] Add using alloca ROADMAP | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 9c2d9d590b218db7edd74cb1ab7e24799bbb62eb Author: Behdad Esfahbod Date: Fri Aug 18 12:04:16 2006 -0400 [test] text-rotate: Update ref images to make image pass again after the font_options change we made in the test suite a while back. test/text-rotate-ref.png | Bin 12446 -> 12300 bytes test/text-rotate-rgb24-ref.png | Bin 16508 -> 5640 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 861f1cb4f70cdbd7702eaf642b999a21ad01037d Merge: c2d92d4... fbb1758... Author: Carl Worth Date: Fri Aug 18 07:56:52 2006 -0700 Merge branch 'jrmuizel-stroking-fixes' into cairo Conflicts: test/dash-caps-joins-ps-argb32-ref.png test/degenerate-path-ps-argb32-ref.png test/degenerate-path.c commit c2d92d4397f7ed7a8b7fdfa24a4e339ecb0d6d69 Author: Carl Worth Date: Fri Aug 18 06:32:43 2006 -0700 ROADMAP: Mark the close path bug as fixed. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit c78c0110179f8f832e9096ad5e26f5887100cd59 Author: Carl Worth Date: Fri Aug 18 06:31:15 2006 -0700 Don't set current point to (0,0) in close_path. The setting of current point to (0,0) is actually harmless, but it definitely looks like a bug, (since after close_path the current point is really the last move point). We don't keep track of last move point here, nor do we even need to. So we can be consistent with _cairo_path_fixed_close_path by not adjusting current point at all, (the subsequent move_to coming right behind the close_path will fix up the current point). src/cairo-path-data.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) commit 53f74e59faf1af78f2f0741ccf1f23aa5dad4efc Author: Carl Worth Date: Fri Aug 18 06:27:45 2006 -0700 Fix close-path failure by adding explicit move_to after close_path. Besides the bug fix, this is a user-visible change since the new move_to element after the close_path element can be seen in the results of cairo_copy_path, so we document that here. We are also careful to fix up _cairo_path_fixed_line_to to defer to _cairo_path_fixed_move_to to avoid letting the last_move_point state get stale. This avoids introducing the second bug that is also tested by the close-path test case. src/cairo-path.c | 15 +++++++++++---- src/cairo.c | 8 ++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) commit 200a2d811efab2e48d6b584b9da202effaddf99f Author: Carl Worth Date: Fri Aug 18 06:15:02 2006 -0700 close-path: New test case to demonstrate corner case discovered by Tim Rowley The bug shows up when doing cairo_copy_path_flat for a path that has a curve_to immediately after a close_path. When the curve is flattened the flattener is using (0,0) as the initial point rather than the proper close_to point. This test also serves to ensure a similar bug doesn't crop up when closing a path that begins with an implicit move_to, (as from cairo_arc). In that bug the path state may have no last-move-point and the path is closed to (0,0). This bug is not present currently, but did appear during the development of a fix for the bug above. test/.gitignore | 1 + test/Makefile.am | 3 + test/close-path-ps-argb32-ref.png | Bin 0 -> 311 bytes test/close-path-ref.png | Bin 0 -> 312 bytes test/close-path.c | 84 +++++++++++++++++++++++++++++++++++++ 5 files changed, 88 insertions(+), 0 deletions(-) commit 8330f4dbd123da57850756a194ba9f7558e6f9cc Author: Behdad Esfahbod Date: Thu Aug 17 22:12:21 2006 -0400 [ROADMAP] Mark Type1 on win32 as done ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 64dd7a8203b6e393d9f763d49eea6dfb7bd13e0d Author: Behdad Esfahbod Date: Thu Aug 17 22:10:27 2006 -0400 [SVG] Make dependent on --enable-png (and increase cache-version to 2) ROADMAP | 2 +- configure.in | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) commit 6f8cf53b1e1ccdbe1ab6a275656b19c6e5120e40 Author: Behdad Esfahbod Date: Thu Aug 17 22:02:02 2006 -0400 [test] Don't use signals if signal.h is not available configure.in | 2 +- test/cairo-test.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletions(-) commit 474daa449325850b6427fb0d3fe511ca6d7c12ac Author: Behdad Esfahbod Date: Thu Aug 17 22:01:33 2006 -0400 [PNG] Include png.h after cairoint.h to avoid macro problems (bug 7744) src/cairo-png.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit da1019c9138695cb838a54f8b871bbfd0e8996d7 Author: Adrian Johnson Date: Thu Aug 17 21:46:38 2006 -0400 Only use GGO_GLYPH_INDEX for truetype and opentype fonts on win32. src/cairo-win32-font.c | 52 +++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 43 insertions(+), 9 deletions(-) commit 9878a033531e6b96b5f27e69e10e90dee7440cd9 Author: Carl Worth Date: Thu Aug 17 17:48:40 2006 -0700 Add (primitive) bitmap glyph tracing to fix bug #7889 ROADMAP | 4 +- src/cairo-scaled-font.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 96 insertions(+), 4 deletions(-) commit e4e5002c48ec9cea37b4347689f193b54439383e Author: Carl Worth Date: Thu Aug 17 17:45:14 2006 -0700 bitmap-font: Add cairo_text_path;fill to demonstrate bug #7889 test/bitmap-font.c | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) commit 0bfa6d4f33b8ddb5dc55bbe419c15df4af856ff9 Author: Carl Worth Date: Thu Aug 17 15:23:32 2006 -0700 Fix assertion failures in bitmap-font test by coercing A8 images to A1 There are still some problems in the resulting output: PDF: Rotated font ends up being blurry in final PNG (not too important) PS and SVG: There's an incorrect offset being applied somewhere. src/cairo-image-surface.c | 26 ++++++++++++++++++++++++++ src/cairo-pdf-surface.c | 9 ++++++++- src/cairo-ps-surface.c | 9 ++++++++- src/cairo-svg-surface.c | 10 +++++++++- src/cairoint.h | 4 ++++ 5 files changed, 55 insertions(+), 3 deletions(-) commit e8e7ccf602fdaa2f2e98743f96589f5b7b3faf17 Author: Carl Worth Date: Thu Aug 17 13:54:06 2006 -0700 Add rotation to bitmap-font to demonstrate failure of bug #7888 test/bitmap-font-ref.png | Bin 552 -> 950 bytes test/bitmap-font-rgb24-ref.png | Bin 513 -> 890 bytes test/bitmap-font.c | 11 ++++++++++- 3 files changed, 10 insertions(+), 1 deletions(-) commit 751ff78ff2acba36614bae17744427c385413264 Author: Behdad Esfahbod Date: Thu Aug 17 20:50:24 2006 -0400 [ROADMAP] Add close_path behavior to 1.2.4. ROADMAP | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit d7b52a8f448e39518a03b92acdf5db10c5527669 Author: Carl Worth Date: Thu Aug 17 16:14:21 2006 -0700 Add long-lines to the XFAIL list, (we're not fixing it before 1.2.4) test/Makefile.am | 1 + test/long-lines.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletions(-) commit 74f6afcdd694d679535d28835740469a08f8ef72 Author: Carl Worth Date: Thu Aug 17 16:11:58 2006 -0700 ROADMAP: Add fix of EXTEND_PAD and deprecation of FORMAT_RGB16_565 to 1.4 roadmap. ROADMAP | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 75b9395d0744ff77da588a101271ff765a177b27 Author: Carl Worth Date: Thu Aug 17 13:47:32 2006 -0700 ROADMAP: Note that source-clip-scale is fixed ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ccf60202d32aa6ade83231e7255ca20e38f216be Author: Carl Worth Date: Thu Aug 17 13:34:26 2006 -0700 Add SVG-specific reference image for source-clip-scale test The difference here is that the SVG backend uses a meta-surface for its similar surface, so there are no rasterization/filtering artefacts when scaling the source surface. test/source-clip-scale-svg-ref.png | Bin 0 -> 119 bytes 1 files changed, 0 insertions(+), 0 deletions(-) commit 72e25648c4c4bc82ddd938aa4e05887a293f0d8b Author: Vladimir Vukicevic Date: Thu Aug 17 13:28:58 2006 -0700 pixman: Use pSourceClip rather than pCompositeClip when fetching This fixes the source-clip-scale test failures for most backends. pixman/src/fbcompose.c | 38 +++++++++++++++++++------------------- 1 files changed, 19 insertions(+), 19 deletions(-) commit 64d2feb9f62d32f8189ea6a43420782e0c4a9373 Author: Carl Worth Date: Thu Aug 17 10:37:46 2006 -0700 Harmonize implementations of source-clip and source-clip-scale to make similarities more evident. test/.gitignore | 1 + test/source-clip-ref.png | Bin 180 -> 133 bytes test/source-clip-scale-ref.png | Bin 243 -> 161 bytes test/source-clip-scale.c | 56 ++++++++++++++++----------------------- test/source-clip.c | 38 +++++++++++++-------------- 5 files changed, 42 insertions(+), 53 deletions(-) commit 524507c39f2f495af426a8c41c6311efe3eb633f Author: Carl Worth Date: Wed Aug 16 16:18:18 2006 -0700 Rename src-clip test to source-clip-scale test/Makefile.am | 3 +- test/source-clip-scale-ref.png | Bin 0 -> 243 bytes test/source-clip-scale.c | 100 ++++++++++++++++++++++++++++++++++++++++ test/src-clip-ref.png | Bin 243 -> 0 bytes test/src-clip.c | 100 ---------------------------------------- 5 files changed, 102 insertions(+), 101 deletions(-) commit afb50580ce0eaefe466ff63a2e0e597f35317f6b Author: Vladimir Vukicevic Date: Wed Aug 16 16:04:24 2006 -0700 Add src-clip test case to demonstrate bug with clipping applying to a source surface. test/Makefile.am | 1 + test/src-clip-ref.png | Bin 0 -> 243 bytes test/src-clip.c | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 0 deletions(-) commit 540db69aefd9874d71af6102c5f9572288de09be Author: Behdad Esfahbod Date: Thu Aug 17 15:28:47 2006 -0400 [ROADMAP] Add more entries for 1.2.4. ROADMAP | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) commit 6122cc85c8f71b1ba2df3ab86907768edebe1781 Author: Behdad Esfahbod Date: Wed Aug 16 20:07:06 2006 -0400 [test] Add $(LDADD) to svg2png_LDADD, to link to correct cairo Previously it was using the cairo found in system. test/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 30cd66fe9a017af9ab2e5b25a13ff70b66b62d17 Author: Behdad Esfahbod Date: Wed Aug 16 19:43:55 2006 -0400 [test] Add ft-text-vertical-layout-truetype. test/ft-text-vertical-layout-truetype-ref.png | Bin 0 -> 3933 bytes test/ft-text-vertical-layout-truetype-svg-ref.png | Bin 0 -> 3956 bytes test/ft-text-vertical-layout-truetype.c | 154 +++++++++++++++++++++ 3 files changed, 154 insertions(+), 0 deletions(-) commit 158e1602119d6cb1169a15b41c4fcac7edf735ab Author: Behdad Esfahbod Date: Wed Aug 16 19:43:41 2006 -0400 [.gitignore] Add truetype-tables test/.gitignore | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit cbcf1ddd646cfe9a9f7b993d2b69ca1faa353f45 Author: Behdad Esfahbod Date: Wed Aug 16 14:27:40 2006 -0400 [test] New torture tests ft-text-vertical-layout-truetype/type1 that combine vertical layout with font_matrix rotation and translation. Currently Type3 and Type1 font paths both show broken behavior. The type1 test uses "Nimbus Sans L" as the font. test/.gitignore | 5 +- test/Makefile.am | 15 ++- test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 715 -> 0 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 611 -> 0 bytes test/ft-text-vertical-layout-ref.png | Bin 829 -> 0 bytes test/ft-text-vertical-layout-svg-ref.png | Bin 770 -> 0 bytes test/ft-text-vertical-layout-type1-ref.png | Bin 0 -> 3970 bytes test/ft-text-vertical-layout-type1-svg-ref.png | Bin 0 -> 3948 bytes test/ft-text-vertical-layout-type1.c | 154 +++++++++++++++++++++++ test/ft-text-vertical-layout.c | 136 -------------------- 10 files changed, 167 insertions(+), 143 deletions(-) commit c385922c198012c46f0c7638ce0ac36a41b9a014 Author: Behdad Esfahbod Date: Tue Aug 15 14:15:47 2006 -0400 [ROADMAP] Add two assertion failures to 1.2.4 plans ROADMAP | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 89008ad1c7dc7539d1b41315f18910af7e638b75 Author: Behdad Esfahbod Date: Tue Aug 15 13:53:08 2006 -0400 [FreeType] Use _cairo_ft_scaled_font_is_vertical where appropriate instead of poking at the loadflags. src/cairo-ft-font.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit b7bc263842a798d657a95e539e1693372448837f Author: Behdad Esfahbod Date: Tue Aug 15 08:33:20 2006 -0400 [FreeType] Fix vertical metrics adjustment to work with non-identity shapes src/cairo-ft-font.c | 29 ++++++++++++++++++----------- 1 files changed, 18 insertions(+), 11 deletions(-) commit d47388ad759b0a1a0869655a87d9b5eb6ae2445d Author: Behdad Esfahbod Date: Tue Aug 15 07:29:18 2006 -0400 [PS] Set correct ImageMatrix in _cairo_ps_surface_emit_bitmap_glyph_data which should be set to device_transform_inverse, not device_transform. Moreover, no negation is needed anymore, as that has been working around the inverse matrix :-). src/cairo-ps-surface.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) commit 91eb56998c416cc21a1bbe2a6e66e85316ef4ddb Author: Behdad Esfahbod Date: Tue Aug 15 05:49:21 2006 -0400 [test] ft-text-vertical-layout: Update ref images test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 720 -> 715 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 613 -> 611 bytes test/ft-text-vertical-layout-ref.png | Bin 832 -> 829 bytes test/ft-text-vertical-layout-svg-ref.png | Bin 778 -> 770 bytes 4 files changed, 0 insertions(+), 0 deletions(-) commit 4b3fadefc835cf627c3887a72d8cbb117d7ad5f7 Author: Behdad Esfahbod Date: Tue Aug 15 05:48:12 2006 -0400 [FreeType] Fix comment about font coordinate src/cairo-ft-font.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) commit db779b5121ae548753b4559bd59b269e489c6567 Author: Behdad Esfahbod Date: Tue Aug 15 05:27:59 2006 -0400 [test] ft-text-vertical-layout: Use the string "i-W" to better show vertical metrics test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 804 -> 720 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 644 -> 613 bytes test/ft-text-vertical-layout-ref.png | Bin 907 -> 832 bytes test/ft-text-vertical-layout-svg-ref.png | Bin 880 -> 778 bytes test/ft-text-vertical-layout.c | 12 ++++++------ 5 files changed, 6 insertions(+), 6 deletions(-) commit f183b835b111d23e838889178aa8106ec84663b3 Author: Behdad Esfahbod Date: Tue Aug 15 04:59:48 2006 -0400 Respect font_matrix translation in _cairo_gstate_glyph_path src/cairo-gstate.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 17ec33aa4f33919377d241bce01e2c395b2aa1b8 Author: Emmanuel Pacaud Date: Mon Aug 14 20:19:15 2006 +0200 New test for long line bug. This shows at least an issue in cairo_fixed_from_double where values > 32767 are converted to -32768, instead of being clamped to 32767. test/.gitignore | 1 + test/Makefile.am | 2 + test/long-lines-ref.png | Bin 0 -> 247 bytes test/long-lines.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 0 deletions(-) commit 09e1eb04ca06aa5c188dc3bdad0dadadaa9fe31f Author: Behdad Esfahbod Date: Mon Aug 14 00:15:44 2006 -0400 [ROADMAP] Update. Adding 1.2.4 milestone and a few other items ROADMAP | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) commit c802cd2d62be5fd0b11d6da10360788f20b721c6 Author: Behdad Esfahbod Date: Sun Aug 13 20:16:22 2006 -0400 [Type1] Synch comments in the encoding table src/cairo-type1-subset.c | 126 +++++++++++++++++++++++++++++----------------- 1 files changed, 80 insertions(+), 46 deletions(-) commit e5f36a54daf376f34596a285402a3e30ee0a6a64 Author: Pavel Roskin Date: Sun Aug 13 05:09:28 2006 -0400 [Type1] Use NULL instead of 0 Using NULL is encouraged for pointers. While fixing that, it turned out that the comments indicating the current index were wrong, so I'm fixing them too. src/cairo-type1-subset.c | 33 ++++++++++++++++++++------------- 1 files changed, 20 insertions(+), 13 deletions(-) commit fdd7518b8be1975ae8f804eba7cf4738bd957e4a Author: Pavel Roskin Date: Sun Aug 13 05:02:46 2006 -0400 Update nil surface structs to the surface struct Quite a few fields were missing, but all zero, so didn't matter practically, but comments were out of synch. src/cairo-surface.c | 30 +++++++++++++++++++++++++++--- 1 files changed, 27 insertions(+), 3 deletions(-) commit a06af40c35ba8b5d9a0688cefc7eb8bd2e31e92d Author: Pavel Roskin Date: Sun Aug 13 04:47:11 2006 -0400 [test] Fix warnings in tests on 64-bit systems Cast argiments from size_t to int. size_t is 64-bit on 64-bit systems, which causes a warning. The actual data should fit 32 bit comfortably. test/cairo-test.c | 2 +- test/clip-operator.c | 4 ++-- test/operator-clear.c | 4 ++-- test/operator-source.c | 4 ++-- test/trap-clip.c | 4 ++-- test/truetype-tables.c | 2 +- test/unbounded-operator.c | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) commit 58963a2bf962559d579a84edde9af13d9f51d014 Author: Pavel Roskin Date: Sun Aug 13 04:44:39 2006 -0400 [test] Allow overriding Valgrind flags on the command line Don't hardcode Valgrind flags in tests/Makefile.am so that tests/Makefile doesn't need to be rebuilt to use different flags. Not everybody is looking for memory leaks. test/Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit b29cc61facbe75ff3afea58308e93b86d25cb03d Author: Pavel Roskin Date: Sun Aug 13 04:41:43 2006 -0400 [pixman] Don't cast pointers to integers This causes warnings on 64-bit platforms that may indicate very serious problems. Fortunately, not in this case. pixman/src/fbmmx.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit abd16e47d6331bd3811c908e524b4dcb6bd23bf0 Author: Jens Granseuer Date: Fri Aug 11 13:06:37 2006 -0400 [configure] Let env-vars override backend CFLAGS/LIBS (bug 7838) In particular, $png_REQUIRES can be used now to set the name of the pkg-config module that contains libpng. configure.in | 31 ++++++++++++++++++------------- 1 files changed, 18 insertions(+), 13 deletions(-) commit 97524a8fdb899de1ae4a3e920fb7bda6d76c5571 Author: Jens Granseuer Date: Fri Aug 11 11:51:10 2006 -0400 [warnings] Only use supported compiler warning flags Also cache the result. configure.in | 53 +++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 37 insertions(+), 16 deletions(-) commit 22eee1db000ac03a8cbd0b0bdb689b6d3a127737 Author: Kjartan Maraas Date: Fri Aug 11 11:18:24 2006 -0400 [warnings] Fixes for sparse. This fixes a lot of instances of 0 vs NULL pixman/src/fbcompose.c | 20 ++++++++++---------- pixman/src/icimage.c | 22 +++++++++++----------- pixman/src/icutil.c | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) commit ab3b400bda61a8fc48bb74dc3134237ddce4a81f Author: Behdad Esfahbod Date: Fri Aug 11 00:43:24 2006 -0400 [Makefile.am] Move ChangeLog creation voodoo to ChangeLog.mk ChangeLog.mk | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Makefile.am | 83 +--------------------------------------------------------- 2 files changed, 83 insertions(+), 82 deletions(-) commit affc9c71acc1ea206dee0a4056c4f5b307fc7f38 Author: Behdad Esfahbod Date: Fri Aug 11 00:24:01 2006 -0400 [Makefile.am] Add $(AM_MAKEFLAGS) to recursive make invocations Makefile.am | 21 ++++++++++----------- doc/Makefile.am | 2 +- test/Makefile.am | 14 +++++++------- 3 files changed, 18 insertions(+), 19 deletions(-) commit c04ccc95fa3cd4272889b1e66e4de5e1bef53ae0 Author: Behdad Esfahbod Date: Thu Aug 10 23:49:50 2006 -0400 [ChangeLog] Make ChangeLog creation faster by caching partial results The ChangeLog.pre-* files once generated, cannot be outdated and don't need update anymore, but the main ChangeLog needs update everytime a git operation is performed (commit, checkout, etc.) Previously, we were forcing a ChangeLog recreation by making it a phony target. Now, we break it into two parts: One up to the latest tag (as returned by git-describe), and another from there. The former is, again, up-to-date when it exists. The latter, we make it depend on .git. And since the latter is pretty short anyway, you get a very first regeneration of it when you change your repo (and that only happens during 'make dist' by the way.) Makefile.am | 41 ++++++++++++++++++++++++++++++++--------- 1 files changed, 32 insertions(+), 9 deletions(-) commit 9b5c5b75701e8f8d5270d248c0eaac07aa5eb52a Author: Behdad Esfahbod Date: Thu Aug 10 20:41:05 2006 -0400 [ChangeLog] Remove 'fmt' formatting of the ChangeLogs We assume that people write wrapped commit messages, which is true these days but was not back in the CVS days. Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 91a59251806c3836cbc58b009aae8b016feab5a4 Author: Behdad Esfahbod Date: Thu Aug 10 20:36:16 2006 -0400 Create multiple ChangeLog files segmented around major releases For an imaginary cairo-3.6.4 version, we now will generate the following ChangeLog files: ChangeLog ChangeLog.pre-3.4 ChangeLog.pre-3.2 ChangeLog.pre-3.0 ChangeLog.pre-2.0 ChangeLog.pre-1.0 Makefile.am | 64 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 50 insertions(+), 14 deletions(-) commit ee885c76af0c715ffd316d4c7cc1b61db46af1ae Author: Behdad Esfahbod Date: Thu Aug 10 18:54:18 2006 -0400 [test] Update EXTRA_DIST after beos_bitmap -> beos-bitmap change test/Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 915448e50f18d518c065dbde6d8857e4c91d2a51 Author: Behdad Esfahbod Date: Thu Aug 10 15:35:36 2006 -0400 [test] Add target check-ref-dups that lists reference images having duplicate sha1sum hash This is useful to review every once in a while to drop duplicate images that can be dropped. For example, if there are two identical images one named some-test-svg-rgb24-ref.png and other some-test-svg-argb32-ref.png, those two can be replaced with some-test-svg-ref.png. test/.gitignore | 1 + test/Makefile.am | 14 +++++++------- 2 files changed, 8 insertions(+), 7 deletions(-) commit cecf396f6fe8424ec80f6f143df3622b92a5522e Author: Behdad Esfahbod Date: Thu Aug 10 15:11:46 2006 -0400 [test] Point out to the test log file on failures test/cairo-test.c | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 15074cbb04498b59af4f3d9d3f2e99a2113e6730 Author: Behdad Esfahbod Date: Thu Aug 10 14:58:33 2006 -0400 [test] Behave better if no ref image was found for a test test/cairo-test.c | 30 ++++++++++++++++++++---------- 1 files changed, 20 insertions(+), 10 deletions(-) commit 67ff765e30af538a7955267c046af446dd8844ed Author: Behdad Esfahbod Date: Thu Aug 10 13:53:24 2006 -0400 [test] Rename beos_bitmap target to beos-bitmap. Same for directfb-bitmap. test/cairo-test.c | 6 +++--- test/mask-beos-bitmap-argb32-ref.png | Bin 0 -> 87641 bytes test/mask-beos-bitmap-rgb24-ref.png | Bin 0 -> 71028 bytes test/mask-beos_bitmap-argb32-ref.png | Bin 87641 -> 0 bytes test/mask-beos_bitmap-rgb24-ref.png | Bin 71028 -> 0 bytes test/set-source-beos-bitmap-rgb24-ref.png | Bin 0 -> 124 bytes test/set-source-beos_bitmap-rgb24-ref.png | Bin 124 -> 0 bytes test/trap-clip-beos-bitmap-rgb24-ref.png | Bin 0 -> 63088 bytes test/trap-clip-beos_bitmap-rgb24-ref.png | Bin 63088 -> 0 bytes 9 files changed, 3 insertions(+), 3 deletions(-) commit c6869b741578be8d93053c8313f71e87061d0202 Author: Behdad Esfahbod Date: Thu Aug 10 13:21:57 2006 -0400 [ROADMAP] Add generating EPS. ROADMAP | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) commit 1af80b70c08654faeb9c6d041d37ca10d6008fe5 Author: Behdad Esfahbod Date: Thu Aug 10 13:10:24 2006 -0400 Test for libz only once and reuse result for PS and PDF This causes configure to check for libz even if PS/PDF are disabled or their results is already cached. But that's not much of a problem as if the cache is enabled, libz results are cached too. configure.in | 16 +++++++--------- 1 files changed, 7 insertions(+), 9 deletions(-) commit d1520a99d4f9be9206cfcb5febb606eaeb4ccaa9 Author: Behdad Esfahbod Date: Thu Aug 10 13:05:26 2006 -0400 Remove the ft_load_sfnt_table check from PS/PDF/SVG backends and make sure that _cairo_ft_load_truetype_table returns UNSUPPORTED if the version of FreeType used doesn't support FT_Load_Sfnt_Table. configure.in | 16 +--------------- src/cairo-ft-font.c | 3 +++ 2 files changed, 4 insertions(+), 15 deletions(-) commit aea83b908d020e26732753830bb3056e6702a774 Author: Behdad Esfahbod Date: Thu Aug 10 12:47:47 2006 -0400 Fix typos in configure.in for PS/PDF/SVG backends configure.in | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) commit dc8da1ca06971677e203718db1429f82fe3f05bd Author: Behdad Esfahbod Date: Thu Aug 10 12:47:11 2006 -0400 Save configure cache after checking all backends This makes sure that backend enabling results are cached even if a later test in configure fails. configure.in | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) commit 6d0e3260444a2d5b6fb0cb223ac79f1c0e7b3a6e Author: Behdad Esfahbod Date: Thu Aug 10 12:45:35 2006 -0400 Don't link to -lm unconditionally in cairo.pc Reuse $LIBM results. configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 24374ad61379273945cda913884b562513d86ed2 Author: Behdad Esfahbod Date: Thu Aug 10 12:44:35 2006 -0400 Implement configure cache versioning for backend enabling results such that removing config.cache is not needed as frequently as it is currently. We just detect and stale the cache results for our own backends. If the user installs missing libraries, they still need to remove the cache manually. Note that everytime a change is made to configure.in and may change the results of at least one CAIRO_BACKEND_ENABLE call, the cairo_cache_version number should be increased. configure.in | 16 +++++++++++++--- 1 files changed, 13 insertions(+), 3 deletions(-) commit c3c706873ef6a0e1318b1d4b4d4b6841758ea18d Author: Carl Worth Date: Tue Aug 8 16:56:20 2006 -0700 ROADMAP: Remove 1.2.2 stuff now that that release is out the door ROADMAP | 29 +---------------------------- 1 files changed, 1 insertions(+), 28 deletions(-) commit 27842ff06f0f4cb764516e91ad51c8a92078e0fa Author: Carl Worth Date: Tue Aug 8 16:51:48 2006 -0700 NEWS: Fix some misspellings NEWS | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit c96e1b6d8ff06eba7b09b5ff3c60fe09d56eb80c Author: Carl Worth Date: Tue Aug 8 16:32:26 2006 -0700 README: Update backend list. PDF, PS, and SVG are no longer experimental. And DirectFB and BeOS now exist as well. README | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) commit 38b42c50252198afac2480a24085f01722d1b471 Author: Carl Worth Date: Tue Aug 8 16:23:07 2006 -0700 Increment CAIRO_VERSION to 1.2.3 after making the 1.2.2 release configure.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ac1c748868bdf4ca6fd195b184ec90827f6e8c94 Author: Carl Worth Date: Tue Aug 8 16:06:57 2006 -0700 Update version to 1.2.2 and libtool version to 11:1:9. configure.in | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6b3e674211f12e1a30a23c2698f314f6317bd54a Author: Carl Worth Date: Tue Aug 8 16:04:54 2006 -0700 NEWS: Add notes for cairo 1.2.2 NEWS | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 157 insertions(+), 0 deletions(-) commit 5b2c84549f72d449d5c44034e15babbd29d290e8 Author: Carl Worth Date: Tue Aug 8 14:30:20 2006 -0700 RELEASING: Add --stat option to recommended git-log command RELEASING | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit e3c7840d2283a8e30242c9749e991f02e93b878a Author: Carl Worth Date: Tue Aug 8 14:29:29 2006 -0700 Fix EXTRA_DIST so that 'make distcheck' works again test/Makefile.am | 56 ++++++++++++----------------------------------------- 1 files changed, 13 insertions(+), 43 deletions(-) commit d5d529c0f349962f8c96e2005d67e0c3dd57fbc9 Author: Carl Worth Date: Tue Aug 8 14:28:48 2006 -0700 gtk-doc template file churn doc/public/tmpl/cairo-font-options.sgml | 134 +++++++++ doc/public/tmpl/cairo-font.sgml | 67 +++++ doc/public/tmpl/cairo-ft.sgml | 45 +++ doc/public/tmpl/cairo-image.sgml | 69 +++++ doc/public/tmpl/cairo-matrix.sgml | 119 ++++++++ doc/public/tmpl/cairo-paths.sgml | 194 +++++++++++++ doc/public/tmpl/cairo-pattern.sgml | 182 ++++++++++++ doc/public/tmpl/cairo-pdf.sgml | 28 ++- doc/public/tmpl/cairo-png.sgml | 40 +++ doc/public/tmpl/cairo-ps.sgml | 53 ++++- doc/public/tmpl/cairo-scaled-font.sgml | 113 ++++++++ doc/public/tmpl/cairo-status.sgml | 16 + doc/public/tmpl/cairo-surface.sgml | 170 +++++++++++ doc/public/tmpl/cairo-svg.sgml | 53 ++++- doc/public/tmpl/cairo-text.sgml | 133 +++++++++- doc/public/tmpl/cairo-transforms.sgml | 104 +++++++ doc/public/tmpl/cairo-version.sgml | 37 +++ doc/public/tmpl/cairo-win32-fonts.sgml | 45 +++ doc/public/tmpl/cairo-win32.sgml | 29 ++ doc/public/tmpl/cairo-xlib-xrender.sgml | 14 + doc/public/tmpl/cairo-xlib.sgml | 110 ++++++++ doc/public/tmpl/cairo.sgml | 465 +++++++++++++++++++++++++++++++ 22 files changed, 2216 insertions(+), 4 deletions(-) commit ca99478d4309ee66bfd0196d3d53991a46fa8367 Author: Carl Worth Date: Tue Aug 8 12:48:56 2006 -0700 Fix some memory leaks in a few of the tests. test/push-group.c | 2 ++ test/text-antialias-gray.c | 2 ++ test/text-antialias-none.c | 2 ++ test/zero-alpha.c | 2 ++ 4 files changed, 8 insertions(+), 0 deletions(-) commit d6e204b9d58069ba34969e6f23cf0bdb4c73b9e1 Author: Carl Worth Date: Tue Aug 8 12:48:20 2006 -0700 Add a variation of an existing valgrind suppression test/.valgrind-suppressions | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) commit 16c18aea52f668caf9cd0b9774f8fa209468662f Author: Behdad Esfahbod Date: Tue Aug 8 15:30:56 2006 -0400 [PDF] Fix leak: free glyphs src/cairo-pdf-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit ac4922bd07db7a513b6dbe5443e95221d7827f79 Author: Behdad Esfahbod Date: Tue Aug 8 15:27:21 2006 -0400 [TrueType] Zero out padding memory in generated TrueType subset to make the output deterministic and fix valgrind errors. src/cairo-truetype-subset.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 356e646dc66f3df0d97e2c26e9328650df745c1e Author: Behdad Esfahbod Date: Tue Aug 8 13:39:17 2006 -0400 [FreeType] Unset and set to FC_RGBA_NONE the FC_RGBA attribute on pattern if we don't want it. This stuff is tricky, but I hope to explain: In your fontconfig configuration, you may match on "font", or on "pattern". Turning subpixel on typically looks like: unknown rgb This works good enough, and if you set to ANTIALIAS_GRAY, this will not override that. Now one may forget to match on "font" target, or intentionally match on the pattern. That happens before cairo font options are substituted in the pattern. So, to give a hint of subpixel in your config file, you can write: rgb You don't really need to check for current values, as FcConfigSubstitute is run before merging cairo_font_options_t in. What this patch does, is to reset pattern's rgba property if the font options explicitly ask for ANTIALIAS_GRAY. This is the only place in cairo-ft-font.c that we use FcPatternDel, so I thought some explanation is needed. src/cairo-ft-font.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit db06681b487873788b51a6766894fc619eb8d8f2 Author: Alfred Peng Date: Tue Aug 8 10:57:33 2006 -0700 Fix leaks in failure paths in pixman gradient creation pixman/src/icimage.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 6ff531c1823421ff60d084f94e7221cfb1d3c9b7 Author: Behdad Esfahbod Date: Tue Aug 8 13:13:18 2006 -0400 [TrueType] Add comment block describing why we only use int16_t src/cairo-truetype-subset-private.h | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) commit 23f388861803ca18746da2573424014c333fb63b Author: Behdad Esfahbod Date: Tue Aug 8 07:38:34 2006 -0400 [TrueType] More leak fixes src/cairo-truetype-subset.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit 519bd3d3e972a88adea5bcf6ea7f582fe69c305c Author: Behdad Esfahbod Date: Tue Aug 8 07:24:01 2006 -0400 [TrueType] Fix leaks. src/cairo-truetype-subset.c | 22 ++++++++++++++-------- 1 files changed, 14 insertions(+), 8 deletions(-) commit 501e5cc8839e104ec21a5aba61cff3580d34f26b Author: Behdad Esfahbod Date: Tue Aug 8 06:12:13 2006 -0400 Restructure subpixel_order handling such that the code doesn't look suspicious! Shouldn't make /any/ difference at all in any case. src/cairo-ft-font.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) commit 89fc22de871d61517a4955875f12326b4dc3389a Author: Behdad Esfahbod Date: Tue Aug 8 06:08:53 2006 -0400 [fontconfig] Set FC_RGBA_NONE on the pattern if we don't want subpixel. otherwise, it looks like "I don't care" and fontconfig configuration is allowed to decide to turn subpixel on. This fixes the bug that subpixel colors where showing up in fallback images in PS/PDF/SVG backends, observed in the test fallback-resolution. src/cairo-ft-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 1f854fcf32e6909e4c52779f093132d8c749c285 Author: Behdad Esfahbod Date: Tue Aug 8 06:04:01 2006 -0400 Set antialiasing to gray in default font options for PS/PDF/SVG This only affects the image fallback in those backends, and avoids getting colored pixels there if user's fontconfig configuration turns subpixel on. This doesn't quite fix that problem though, more changes are needed/coming. src/cairo-pdf-surface.c | 1 + src/cairo-ps-surface.c | 1 + src/cairo-svg-surface.c | 7 ++++--- 3 files changed, 6 insertions(+), 3 deletions(-) commit 2d483e0785b18a8bb51f5b1c1a0267029f68a64a Author: Carl Worth Date: Tue Aug 8 02:24:48 2006 -0700 test-paginated: Fix memory leak within _test_paginated_surface_create_for_data src/test-paginated-surface.c | 12 +++++++++++- 1 files changed, 11 insertions(+), 1 deletions(-) commit cb5edb6c35f7c80d1f91172b98f25ee33f21bce9 Author: Carl Worth Date: Tue Aug 8 01:38:24 2006 -0700 Eliminate warning due to the test suite's private 'FLATTENEND' format value test/cairo-test.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletions(-) commit f089a07679535959fe7b12acb0550ff16d560788 Author: Behdad Esfahbod Date: Tue Aug 8 04:36:13 2006 -0400 Fix misplaced volatile keyword test/cairo-test.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 9d542a29cba71fe4b4067fa9a9c0fe98a7d8a7a8 Author: Carl Worth Date: Tue Aug 8 01:30:40 2006 -0700 Disable warning options that are not available in gcc 3.3.5 at least. We'll want to turn these back on eventually with a nice conditional check on the appropriate version of gcc. configure.in | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) commit c3b912d7db34c5881cf14725b7d29266cbf24877 Author: Carl Worth Date: Tue Aug 8 01:16:49 2006 -0700 Eliminate most compiler warnings from the test suite src/cairo-paginated-surface.c | 2 +- test/bitmap-font.c | 2 +- test/buffer-diff.c | 2 +- test/cairo-test.c | 16 ++++++++++------ test/cairo-test.h | 3 ++- test/clip-operator.c | 2 +- test/create-for-stream.c | 4 +++- test/degenerate-path.c | 2 +- test/fallback-resolution.c | 2 +- test/mask.c | 2 +- test/multi-page.c | 2 +- test/operator-clear.c | 2 +- test/operator-source.c | 2 +- test/pdf-features.c | 4 ++-- test/ps-features.c | 4 ++-- test/push-group.c | 1 - test/read-png.c | 4 ++-- test/svg-surface.c | 2 ++ test/trap-clip.c | 2 +- test/unbounded-operator.c | 2 +- test/write-png.c | 2 +- 21 files changed, 36 insertions(+), 28 deletions(-) commit c7d11ad2b4778cb7399eae990a410cb72568af11 Author: Carl Worth Date: Tue Aug 8 00:43:09 2006 -0700 Remove stale SVG-specific reference images for pixman-rotate test test/pixman-rotate-svg-argb32-ref.png | Bin 258 -> 0 bytes test/pixman-rotate-svg-rgb24-ref.png | Bin 358 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 401f0ce3c444e263f03055174791e993e6270c39 Merge: 77fd0ef... 02b54ca... Author: Carl Worth Date: Tue Aug 8 00:19:51 2006 -0700 Merge branch 'surface-font-options' into cairo commit 77fd0efa9a055c13e685f4c6b01597ae67a36fb7 Author: Behdad Esfahbod Date: Tue Aug 8 02:58:50 2006 -0400 Fix few remaining compiler warnings, revealed by -O3 pixman/src/ictri.c | 6 +++--- src/cairo-lzw.c | 11 +++++------ src/cairo-type1-subset.c | 8 ++++---- 3 files changed, 12 insertions(+), 13 deletions(-) commit 02b54ca6200b3e5a914b293dd4a0d56f432a5a9b Author: Carl Worth Date: Wed Aug 2 11:18:14 2006 -0400 Improve docs for cairo_surface_create_similar() src/cairo-surface.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit 9136c217703d1d6aab1742f522aa0279517fb36a Author: Behdad Esfahbod Date: Tue Aug 1 20:40:54 2006 -0400 Update reference images, mostly PDF and SVG Also replace some SVG ref images for rgb24 and argb32 with a single one where the two have been similar. test/caps-joins-alpha-svg-argb32-ref.png | Bin 2454 -> 0 bytes test/caps-joins-alpha-svg-ref.png | Bin 0 -> 2454 bytes test/caps-joins-alpha-svg-rgb24-ref.png | Bin 2454 -> 0 bytes ...osite-integer-translate-over-svg-argb32-ref.png | Bin 15465 -> 0 bytes test/composite-integer-translate-over-svg-ref.png | Bin 0 -> 15465 bytes ...posite-integer-translate-over-svg-rgb24-ref.png | Bin 15465 -> 0 bytes test/fill-and-stroke-alpha-svg-argb32-ref.png | Bin 509 -> 0 bytes test/fill-and-stroke-alpha-svg-ref.png | Bin 0 -> 509 bytes test/fill-and-stroke-alpha-svg-rgb24-ref.png | Bin 509 -> 0 bytes test/font-matrix-translation-svg-ref.png | Bin 0 -> 970 bytes test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 725 -> 804 bytes test/ft-text-vertical-layout-ref.png | Bin 907 -> 907 bytes test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 799 -> 0 bytes test/ft-text-vertical-layout-svg-ref.png | Bin 0 -> 880 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 808 -> 0 bytes test/glyph-cache-pressure-pdf-argb32-ref.png | Bin 2879 -> 0 bytes test/glyph-cache-pressure-svg-argb32-ref.png | Bin 3635 -> 0 bytes test/glyph-cache-pressure-svg-ref.png | Bin 0 -> 3165 bytes test/glyph-cache-pressure-svg-rgb24-ref.png | Bin 3165 -> 0 bytes test/linear-gradient-svg-argb32-ref.png | Bin 1000 -> 0 bytes test/linear-gradient-svg-ref.png | Bin 0 -> 1000 bytes test/linear-gradient-svg-rgb24-ref.png | Bin 1000 -> 0 bytes test/paint-source-alpha-svg-argb32-ref.png | Bin 505 -> 0 bytes test/paint-source-alpha-svg-ref.png | Bin 0 -> 505 bytes test/paint-source-alpha-svg-rgb24-ref.png | Bin 505 -> 0 bytes test/paint-with-alpha-svg-argb32-ref.png | Bin 516 -> 0 bytes test/paint-with-alpha-svg-ref.png | Bin 0 -> 516 bytes test/paint-with-alpha-svg-rgb24-ref.png | Bin 516 -> 0 bytes test/pixman-rotate-svg-argb32-ref.png | Bin 0 -> 258 bytes test/pixman-rotate-svg-rgb24-ref.png | Bin 0 -> 358 bytes test/rectangle-rounding-error-ps-argb32-ref.png | Bin 258 -> 0 bytes test/select-font-face-pdf-argb32-ref.png | Bin 2237 -> 0 bytes test/select-font-face-ps-argb32-ref.png | Bin 1443 -> 1333 bytes test/select-font-face-ref.png | Bin 2481 -> 2473 bytes test/select-font-face-svg-argb32-ref.png | Bin 3064 -> 0 bytes test/select-font-face-svg-ref.png | Bin 0 -> 2430 bytes test/select-font-face-svg-rgb24-ref.png | Bin 3064 -> 0 bytes test/show-text-current-point-pdf-argb32-ref.png | Bin 2157 -> 0 bytes test/show-text-current-point-svg-argb32-ref.png | Bin 4236 -> 0 bytes test/show-text-current-point-svg-ref.png | Bin 0 -> 2398 bytes test/show-text-current-point-svg-rgb24-ref.png | Bin 2398 -> 0 bytes test/text-antialias-gray-pdf-argb32-ref.png | Bin 950 -> 0 bytes test/text-antialias-gray-ps-argb32-ref.png | Bin 310 -> 0 bytes test/text-antialias-gray-svg-argb32-ref.png | Bin 1077 -> 0 bytes test/text-antialias-gray-svg-rgb24-ref.png | Bin 1033 -> 0 bytes test/text-antialias-none-pdf-argb32-ref.png | Bin 950 -> 0 bytes test/text-antialias-none-ps-argb32-ref.png | Bin 310 -> 0 bytes test/text-antialias-none-svg-argb32-ref.png | Bin 1077 -> 0 bytes test/text-antialias-none-svg-rgb24-ref.png | Bin 1033 -> 0 bytes test/text-antialias-subpixel-pdf-argb32-ref.png | Bin 950 -> 0 bytes test/text-antialias-subpixel-ps-argb32-ref.png | Bin 310 -> 0 bytes test/text-antialias-subpixel-svg-argb32-ref.png | Bin 1077 -> 0 bytes test/text-antialias-subpixel-svg-rgb24-ref.png | Bin 1033 -> 0 bytes test/text-pattern-pdf-argb32-ref.png | Bin 1632 -> 0 bytes test/text-pattern-ps-argb32-ref.png | Bin 1681 -> 0 bytes test/text-pattern-svg-argb32-ref.png | Bin 1708 -> 1749 bytes test/unantialiased-shapes-ps-argb32-ref.png | Bin 4076 -> 0 bytes test/unantialiased-shapes-svg-argb32-ref.png | Bin 19689 -> 0 bytes test/unantialiased-shapes-svg-rgb24-ref.png | Bin 19689 -> 0 bytes 59 files changed, 0 insertions(+), 0 deletions(-) commit 56791ab31d484452cd1ddefd653590095d9f6191 Author: Behdad Esfahbod Date: Tue Aug 8 02:46:38 2006 -0400 Make "make html" not trigger test reruns "make index.html" can still be used to force up-to-date test results, causing test reruns if necessary. test/Makefile.am | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-) commit caba7f6bda9ba7c1a0738f3b34996c50bde60697 Author: Behdad Esfahbod Date: Tue Aug 8 02:17:43 2006 -0400 Document a few more functions cairo_show_page cairo_copy_page cairo_in_stroke cairo_in_fill src/cairo.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 42 insertions(+), 0 deletions(-) commit 789785cd357de14af23a4d2ae8ca49c4838426b9 Author: Carl Worth Date: Mon Aug 7 11:58:35 2006 -0700 Document CAIRO_FORMAT_RGB16_565 as deprecated. src/cairo.h | 13 ++++++++++--- 1 files changed, 10 insertions(+), 3 deletions(-) commit fdc805a52949bf3b040bfef57d170025010816c6 Author: Behdad Esfahbod Date: Mon Aug 7 22:28:59 2006 -0400 More doc syntax update src/cairo-scaled-font.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit bbc9a1290a964edf50f571be8766b38df10adac7 Author: Behdad Esfahbod Date: Mon Aug 7 22:27:15 2006 -0400 Update doc syntax Annoying, but a function doc should have a body, not only "Returns", or gtk-doc will not pick it up. src/cairo-font.c | 5 ++++- src/cairo-pattern.c | 5 ++++- src/cairo-scaled-font.c | 5 ++++- src/cairo-surface.c | 5 ++++- 4 files changed, 16 insertions(+), 4 deletions(-) commit fef0251d15814ce9f135b548579e51c6e4a0653d Author: Behdad Esfahbod Date: Mon Aug 7 22:15:15 2006 -0400 Add cairo-truetype-subset-private.h to list of ignored headers doc/public/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) commit c2ea56e5e075f9e75350b3c54956a70e6fb9a58c Author: Behdad Esfahbod Date: Mon Aug 7 21:37:16 2006 -0400 Add test truetype-tables that checks sizeof truetype tables test/Makefile.am | 1 + test/truetype-tables.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 0 deletions(-) commit 50be7951c981468a3a2acf2cd77931a46ca1e824 Author: Behdad Esfahbod Date: Mon Aug 7 21:23:08 2006 -0400 Split the TrueType table definitions into a private header file such that we can test the struct sizes in a test. src/Makefile.am | 1 + src/cairo-truetype-subset-private.h | 159 +++++++++++++++++++++++++++++++++++ src/cairo-truetype-subset.c | 126 +-------------------------- 3 files changed, 165 insertions(+), 121 deletions(-) commit ec895202e008356492ae0c9e40c9f40c6bf8cbb3 Author: Behdad Esfahbod Date: Mon Aug 7 21:13:48 2006 -0400 Remove the __attribute__ ((packed)) and the need for it as it's not portable and lack of it could seriously break the truetype subsetting code. Now, instead of using int32_t and int64_t, we use multiple int16_t items, to avoid any alignments. Fortunately, we are not using any of the fields involved, so no code changes necessary. src/cairo-truetype-subset.c | 58 +++++++++++++++++++++++++----------------- 1 files changed, 34 insertions(+), 24 deletions(-) commit 20c3ff96de05365ee65301ccd3c43e7bcb19f49b Author: Carl Worth Date: Mon Aug 7 15:18:38 2006 -0700 Fix some signed/unsigned comparison warnings that cropped up during the warnings-cleanup branch src/cairo-meta-surface-private.h | 2 +- src/cairo-pdf-surface.c | 6 +++--- src/cairo-ps-surface.c | 5 ++--- src/cairo-scaled-font-subsets-private.h | 2 +- src/cairo-svg-surface.c | 2 +- src/cairo-truetype-subset.c | 14 +++++++------- src/cairo-type1-subset.c | 4 ++-- 7 files changed, 17 insertions(+), 18 deletions(-) commit 959b85e98c8a0f546c9117da83f84c99ed00370f Merge: f1c70a0... 7ee94c0... Author: Carl Worth Date: Mon Aug 7 15:06:47 2006 -0700 Merge branch 'warnings-cleanup' into cairo Conflicts: src/cairo-font-subset.c commit f1c70a01391705a22dd882f2a88c6dffbc08f0fe Author: Behdad Esfahbod Date: Mon Aug 7 17:32:02 2006 -0400 Mark x86_64 subsetting as fixed in ROADMAP. ROADMAP | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 7ee94c0285b0f7352506622d16aff9339ba65d0c Author: Carl Worth Date: Mon Jul 31 12:03:40 2006 -0700 Squelch an annoying -Wswitch-enum warning by not using switch src/cairo-pattern.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit 43b579d757ded66f71da8a0e215abd7bccdfd695 Author: Carl Worth Date: Mon Jul 31 11:47:45 2006 -0700 Add -Wswitch-enum compiler flag and fix all trivial warnings configure.in | 2 +- pixman/src/fbpict.c | 11 +++++++++++ src/cairo-ft-font.c | 5 +++++ src/cairo-image-surface.c | 9 +++++++++ src/cairo-pattern.c | 2 +- src/cairo-pdf-surface.c | 6 +++++- src/cairo-xlib-surface.c | 12 ++++++++++++ 7 files changed, 44 insertions(+), 3 deletions(-) commit d1f9bef30ea7268fee74af50c0e9325e1ec0929c Author: Behdad Esfahbod Date: Mon Aug 7 14:24:32 2006 -0700 Add -Wunsafe-loop-optimizations compiler flag and fix all warnings configure.in | 1 + pixman/src/fbmmx.c | 8 ++++---- src/cairo-xlib-surface.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) commit 744ef3bf698f9109e82244c5889d0d809b2df70c Author: Behdad Esfahbod Date: Mon Aug 7 13:47:01 2006 -0700 Add several compiler warning flags (no code changes needed) The flags added here are as follows: -Werror-implicit-function-declaration Wstrict-aliasing=2 -Wwrite-strings Winit-self Wpacked Wmissing-format-attribute -Wdeclaration-after-statement configure.in | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-) commit 00711022089936e08b8651591629ca344a3fa71e Author: Behdad Esfahbod Date: Mon Aug 7 13:13:33 2006 -0700 Add -Wwrite-strings compiler flag and fix all warnings configure.in | 2 +- src/cairo-ps-surface.c | 2 +- src/cairo-xlib-surface.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) commit 9ae66174e774b57f16ad791452ed44efc2770a59 Author: Carl Worth Date: Fri Aug 4 16:06:59 2006 -0700 Fix bug 7294 by adding pixman BGR formats and internal cairo BGR formats. This approach to fixing the bug is valid since there is code in pixman for rendering to BGR images, (which is why cairo 1.0 worked with BGR X servers for example). But, since we don't want to advertise additional image formats we implement this through a new cairo_internal_format_t. This is rather fragile since we don't want to leak any internal formats nor do we ever want an internal format to be used somewhere a real format is expected, (and trigger a CAIRO_FORMAT_VALID assertion failure). More comments than code are added here to help compensate for the fragility and to give some guidance in fixing this mess in a better way in the future. pixman/src/icformat.c | 12 +++++++++ pixman/src/pixman.h | 4 ++- src/cairo-image-surface.c | 48 ++++++++++++++++++++++++++++-------- src/cairo-xlib-surface.c | 3 ++ src/cairoint.h | 59 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 114 insertions(+), 12 deletions(-) commit f4b12e497b7ac282b2f6831b8fb68deebc412e60 Author: Adrian Johnson Date: Mon Aug 7 11:07:08 2006 -0700 Make truetype subsetting work on x86_64 This fixes the bug reported against GTK+ here: http://bugzilla.gnome.org/show_bug.cgi?id=349826 ROADMAP | 2 +- src/cairo-truetype-subset.c | 195 ++++++++++++++++++++++--------------------- 2 files changed, 99 insertions(+), 98 deletions(-) commit 7724c575b028140fd671d4ef853096a24112146f Author: Declan Naughton Date: Mon Aug 7 10:33:15 2006 -0700 Fix typos in internal documentation. src/cairo-arc.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit caa9abc9ee33b660f158ac9f5d420bb39c0b47cb Author: Carl Worth Date: Mon Aug 7 10:28:40 2006 -0700 Fix file handle leak in failure path (bug 7616) src/cairo-output-stream.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 04757a3aa8deeff3265719ebe01b021638990ec6 Author: Alfred Peng Date: Mon Aug 7 08:41:13 2006 -0700 Add definition of cairo_private for some Sun compilers. In addition to helping us preserve a sharp line between which symbols are part of the public API and which are private parts of the implementation, this can also help mozilla avoid clashes between its modified, internal copy of cairo and the system version of cairo. See the mozilla bug here: https://bugzilla.mozilla.org/show_bug.cgi?id=341874 src/cairoint.h | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit e2fddcccb43d06486d3680a19cfdd5a54963fcbd Author: Chris Wilson Date: Fri Aug 4 17:16:35 2006 -0700 Fix memory leak in _cairo_surface_show_glyphs (bug 7766) src/cairo-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit aec39338033196f2942e9ff0ef6beffd6612030e Author: Carl Worth Date: Fri Aug 4 16:54:25 2006 -0700 ROADMAP: Mark 7533 as fixed and add broken truetype subsetting on x86_64 ROADMAP | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 761b30792d56f635fe1fb8641fdee21587505475 Author: Dominic Lachowicz Date: Fri Aug 4 16:39:40 2006 -0700 Add binary garbage to PDF header as recommended in section 3.4.1 of PDF Reference v1.6 src/cairo-pdf-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit 2815d9ad38f2df45c58fbeb38591afba28b4917b Author: Carl Worth Date: Thu Aug 3 19:28:11 2006 -0700 Use base pointer to avoid compiler warning. src/cairo-ft-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1feb4291cf7813494355459bb547eec604c54ffb Author: Carl Worth Date: Thu Aug 3 19:25:53 2006 -0700 Apply device_transform during meta-surface replay to fix bug 7533 src/cairo-meta-surface.c | 86 +++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 77 insertions(+), 9 deletions(-) commit 8c953167ba045ffdfc25ac4f19faff83720f2473 Author: Carl Worth Date: Thu Aug 3 17:48:25 2006 -0700 Simplify common set_clip operation in meta-surface replay. src/cairo-meta-surface.c | 32 ++++++++------------------------ 1 files changed, 8 insertions(+), 24 deletions(-) commit 34a0b728fb0e19a4d03152318a002362791c30d1 Author: Behdad Esfahbod Date: Thu Aug 3 00:20:35 2006 -0400 Fail FreeType load_truetype_table on vertical fonts as we don't do it right now. Failing disables the subsetting for vertical fonts, like it was being done before the recent changes to the TrueType subsetter. src/cairo-ft-font.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit 2c0959141ae89bde6c773933b41f4d965d6a1ae7 Author: Carl Worth Date: Wed Aug 2 16:40:23 2006 -0700 Update ROADMAP now that several of the 1.2.2-targeted bugs are fixed ROADMAP | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit 30f004d55ad7c426e979964a49e7a8c8d8db31f3 Author: Kristian Høgsberg Date: Wed Aug 2 19:29:17 2006 -0400 Rename truetype subset function to _cairo_truetype_*. Used to be _cairo_pdf_ft_*, a left over from when this code was specific to the PDF backend. src/cairo-truetype-subset.c | 256 ++++++++++++++++++++++--------------------- 1 files changed, 133 insertions(+), 123 deletions(-) commit f664a3b7a087272a27eb893b7ee5a1775eb92c4d Author: Kristian Høgsberg Date: Wed Aug 2 19:14:19 2006 -0400 Renamed cairo-font-subset.c to cairo-truetype-subset.c src/Makefile.am | 2 +- src/cairo-font-subset.c | 957 ------------------------------------------- src/cairo-truetype-subset.c | 957 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 958 insertions(+), 958 deletions(-) commit a0989f427be87c60415963dd6822b3c5c3781691 Author: Adrian Johnson Date: Wed Aug 2 19:12:51 2006 -0400 Remove freetype dependency for truetype subsetting code. Add a load_truetype_table function to cairo_scaled_font_backend_t and use it to load the truetype sfnt tables. Implement this with freetype for the freetype font backend and use GetFontData for win32. Atsui remains unimplemented, and still falls back to type3 fonts. src/Makefile.am | 4 +- src/cairo-atsui-font.c | 1 + src/cairo-font-subset.c | 451 ++++++++++++++++++++++++++++------------------ src/cairo-ft-font.c | 26 +++ src/cairo-pdf-surface.c | 5 +- src/cairo-ps-surface.c | 6 +- src/cairo-svg-surface.c | 1 - src/cairo-win32-font.c | 28 +++ src/cairoint.h | 6 + 9 files changed, 347 insertions(+), 181 deletions(-) commit c05dd48ac1afe0e4f3ec0c24797a9fbc3f98ce85 Merge: e0bec64... 0da4b93... Author: Michael Emmel Date: Wed Aug 2 14:32:50 2006 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit e0bec64c98f98fb2d4b460e8641b1b09f808d233 Author: Michael Emmel Date: Wed Aug 2 14:32:24 2006 -0700 Fixed debug statement that broke compile src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0da4b9319f53379e0ae61b90337f49bd0f0fc9c5 Author: Kristian Høgsberg Date: Wed Aug 2 15:18:56 2006 -0400 Drop unused src/cairo-font-subset-private.h. src/Makefile.am | 1 - src/cairo-font-subset-private.h | 68 --------------------------------------- 2 files changed, 0 insertions(+), 69 deletions(-) commit 067d97eb1793a6b0d0dddfbd0b54117844511a94 Author: Adrian Johnson Date: Wed Aug 2 15:17:09 2006 -0400 This patch fixes the problem where the postscript output does not print when the size of the embedded truetype font exceeds 64k. src/cairo-font-subset-private.h | 3 +- src/cairo-font-subset.c | 60 +++++++++++++++++++++++++++--- src/cairo-ps-surface.c | 27 ++++++++++---- src/cairo-scaled-font-subsets-private.h | 2 + 4 files changed, 77 insertions(+), 15 deletions(-) commit 127704c225d4b9f2a4c72749f59a8dfcaecfddc6 Author: Behdad Esfahbod Date: Tue Aug 1 20:39:56 2006 -0400 Look for per-target reference image too test/cairo-test.c | 96 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 70 insertions(+), 26 deletions(-) commit fc715ffd80f5ec9ac57e3b110dd20298029a6350 Author: Behdad Esfahbod Date: Tue Aug 1 18:21:27 2006 -0400 New PS ref images, matching the recent png16m->pngalpha driver change test/caps-joins-ps-argb32-ref.png | Bin 995 -> 1463 bytes test/caps-sub-paths-ps-argb32-ref.png | Bin 170 -> 240 bytes test/clip-fill-rule-ps-argb32-ref.png | Bin 280 -> 322 bytes test/clip-nesting-ps-argb32-ref.png | Bin 488 -> 651 bytes test/clip-twice-ps-argb32-ref.png | Bin 460 -> 575 bytes test/dash-caps-joins-ps-argb32-ref.png | Bin 1247 -> 2189 bytes test/dash-offset-negative-ps-argb32-ref.png | Bin 170 -> 204 bytes test/dash-scale-ps-argb32-ref.png | Bin 2950 -> 6318 bytes test/dash-zero-length-ps-argb32-ref.png | Bin 272 -> 319 bytes test/degenerate-path-ps-argb32-ref.png | Bin 197 -> 264 bytes test/fill-and-stroke-ps-argb32-ref.png | Bin 243 -> 310 bytes test/fill-rule-ps-argb32-ref.png | Bin 1078 -> 2253 bytes test/font-matrix-translation-ps-argb32-ref.png | Bin 0 -> 785 bytes test/ft-text-antialias-none-ps-argb32-ref.png | Bin 335 -> 335 bytes test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 298 -> 644 bytes test/glyph-cache-pressure-ps-argb32-ref.png | Bin 591 -> 1672 bytes test/leaky-polygon-ps-argb32-ref.png | Bin 233 -> 355 bytes test/line-width-ps-argb32-ref.png | Bin 201 -> 244 bytes test/line-width-scale-ps-argb32-ref.png | Bin 1599 -> 3903 bytes test/new-sub-path-ps-argb32-ref.png | Bin 316 -> 559 bytes test/path-data-ps-argb32-ref.png | Bin 322 -> 442 bytes test/select-font-face-ps-argb32-ref.png | Bin 481 -> 1443 bytes test/show-text-current-point-ps-argb32-ref.png | Bin 602 -> 1479 bytes test/transforms-ps-argb32-ref.png | Bin 287 -> 420 bytes 24 files changed, 0 insertions(+), 0 deletions(-) commit 3e24f516a2f5435306ee8491e7955177b960a797 Author: Behdad Esfahbod Date: Tue Aug 1 16:13:29 2006 -0400 Change the text string "cd" to "AB" in test to match the other string that is drawn. The reason, one is draw using show_text, the other using text_path. The difference is more emphasized when rendering the same string. test/ft-text-vertical-layout-ref.png | Bin 834 -> 907 bytes test/ft-text-vertical-layout.c | 2 +- 2 files changed, 1 insertions(+), 1 deletions(-) commit 3d95919fab2e47dea9e7b266849db7a4c05eb9a7 Author: Behdad Esfahbod Date: Tue Aug 1 15:27:11 2006 -0400 Switch from ghostscript's png16m driver to pngalpha for PS->PNG again. We have switched back and forth quite a few times. This time I'm switching because with pngalpha we get gray antialiased text and graphics while with png16m all we get is no antialiasing. This is definitely a bug in the png16m driver, but I won't wait until it gets fixed upstream. Previously Carl Worth switched to pngalpha and reverted it immediately in commit c4fc7b06b53c811ddc20def91aaccd756c28a924. I've now fixed image-diff to work with the output of pngalpha, so we can switch. It requires lots of reference image updates, but still doesn't help with reducing the number of PS-specific reference images we need. test/cairo-test.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 5a23fd70a0af5c2b0cb990b89ebc5ed7a01aae82 Author: Behdad Esfahbod Date: Tue Aug 1 15:20:39 2006 -0400 Change the way diff images highlight differences. Previously it was using the equation 128+diff/3, which results in lots of gray and de-emphasized difference. Now it's using MIN(255,diff*4) which more emphasizes the real difference. test/buffer-diff.c | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) commit d85f30e789c74cc8f1d83ba609d8b02886686440 Author: Behdad Esfahbod Date: Tue Aug 1 15:18:19 2006 -0400 Make image_diff_flattened flatten the first image too. This is useful to use the ghostscript pngalpha driver for example. test/buffer-diff.c | 34 ++++++++++++++++++++++++++-------- 1 files changed, 26 insertions(+), 8 deletions(-) commit 556a4d8405a4f53e465425ccc1f6506e51b29344 Author: Behdad Esfahbod Date: Tue Aug 1 15:16:10 2006 -0400 Add vector_ignored_tests that is tests ignored for ps/pdf/svg that includes all tests depending on CAIRO_ANTIALIAS_NONE and CAIRO_ANTIALIAS_SUBPIXEL. This removes separate pdf_ignored_tests and svg_ignored_tests arrays that were out of synch and otherwise the same. test/cairo-test.c | 43 ++++++++++++++++++++++--------------------- 1 files changed, 22 insertions(+), 21 deletions(-) commit 226178539ad72ffa414925e094297e12c566083d Author: Behdad Esfahbod Date: Mon Jul 31 16:05:34 2006 -0400 Add comments about CAIRO_ENABLE_BACKEND. configure.in | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) commit 2fa709d6af58713f7b362748a728a6f8c983d2ec Author: Behdad Esfahbod Date: Mon Jul 31 15:17:15 2006 -0400 Set font options in the test context and make tests not do that This should help with not requiring many backend-specific reference images, and some should be removed now. test/cairo-test.c | 10 ++++++++++ test/clip-operator.c | 9 --------- test/font-matrix-translation.c | 9 --------- test/ft-font-create-for-ft-face.c | 2 ++ test/ft-text-antialias-none.c | 3 +-- test/ft-text-vertical-layout.c | 5 +---- test/glyph-cache-pressure.c | 10 ---------- test/operator-clear.c | 9 --------- test/operator-source.c | 9 --------- test/select-font-face.c | 11 ----------- test/show-glyphs-many.c | 9 --------- test/show-text-current-point.c | 10 ---------- test/text-antialias-gray.c | 5 +---- test/text-antialias-none.c | 5 +---- test/text-antialias-subpixel.c | 8 ++------ test/text-pattern.c | 9 --------- test/text-rotate.c | 3 +-- test/unbounded-operator.c | 9 --------- 18 files changed, 19 insertions(+), 116 deletions(-) commit 9fcb3c32c1f16fe6ab913e27eb54d18b7d9a06b0 Author: Behdad Esfahbod Date: Mon Jul 31 14:50:50 2006 -0400 Set fallback resolution in create_similar. Update docs to reflect that. src/cairo-surface.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) commit a61ac1aeedca3a032b9d53715afb5d52c06efec0 Author: Behdad Esfahbod Date: Mon Jul 31 14:47:10 2006 -0400 Set font_options on image surfaces we create. This may not be really necessary as we only create image surfaces as temporary surfaces and their font options should not be sampled normally. src/cairo-paginated-surface.c | 37 ++++++++++++++++++++++++++++--------- 1 files changed, 28 insertions(+), 9 deletions(-) commit b3341b4eda274036a74eea3187d47ef257688828 Author: Behdad Esfahbod Date: Mon Jul 31 14:45:54 2006 -0400 Let backends return NULL in create_similar to take the fallback path. Make xlib backend use it. src/cairo-surface.c | 5 +++-- src/cairo-xlib-surface.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) commit bdb4e1edadb78a2118ff70b28163f8bd4317f1ec Author: Behdad Esfahbod Date: Mon Jul 31 14:44:42 2006 -0400 Implement per-surface font options. New internal function _cairo_surface_set_font_options is used to set them. cairo_surface_create_similar propagates the font options of the other surface into the newly created surface. Fixes bugs with font options in fallback images and bug 4106. src/cairo-surface.c | 55 +++++++++++++++++++++++++++++++++++++++++++++----- src/cairoint.h | 12 +++++++++++ 2 files changed, 61 insertions(+), 6 deletions(-) commit a8a0082c53d060e07c10c6efda9bb808e354fd59 Author: Behdad Esfahbod Date: Mon Jul 31 14:41:27 2006 -0400 Remove dummy create_similar in PS/PDF and let fallback do the same which is simply creating an image surface. src/cairo-pdf-surface.c | 15 +-------------- src/cairo-ps-surface.c | 15 +-------------- 2 files changed, 2 insertions(+), 28 deletions(-) commit 72b51b6f0c49f9eac7d8ef4caff59733312b1ca6 Author: Ian Osgood Date: Wed Jun 21 07:06:20 2006 -0700 XCB: implement set_clip_region src/cairo-xcb-surface.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 93 insertions(+), 1 deletions(-) commit 2eeb338590957a90bdebfc6a00fc05323e76f9ee Author: Jamey Sharp Date: Mon Jun 12 17:47:55 2006 -0700 XCB: Use xcb-renderutil where cairo-xlib used libXrender. configure.in | 2 +- src/cairo-xcb-surface.c | 199 ++++++++++------------------------------------- 2 files changed, 41 insertions(+), 160 deletions(-) commit 6b0d3433b7073ece1f7959475e6058911dc382ad Author: Jamey Sharp Date: Mon Jul 31 08:53:57 2006 -0700 XCB: XCBRenderTRAP was renamed to XCBRenderTRAPEZOID. src/cairo-xcb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 88675958efbe57c7cc5135d6fb73e99f42d848d8 Author: Behdad Esfahbod Date: Mon Jul 31 01:03:15 2006 -0400 Remove config.cache in autogen.sh. autogen.sh | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit eb9caf083353f3430f786da717b6c56b13f82ecb Author: Carl Worth Date: Fri Jul 28 16:59:54 2006 -0700 Add -Wsign-compare compiler flag and fix all warnings configure.in | 2 +- pixman/src/fbpict.c | 2 +- pixman/src/icformat.c | 12 ++++++------ pixman/src/pixman.h | 10 +++++----- src/cairo-array.c | 6 +++--- src/cairo-font-subset.c | 2 +- src/cairo-gstate.c | 2 +- src/cairo-hash.c | 2 +- src/cairo-image-surface.c | 2 +- src/cairo-output-stream.c | 2 +- src/cairo-path-stroke.c | 4 ++-- src/cairo-pattern.c | 4 ++-- src/cairo-pdf-surface.c | 7 +++---- src/cairo-png.c | 8 ++++---- src/cairo-ps-surface.c | 2 +- src/cairo-scaled-font-subsets.c | 6 +++--- src/cairo-scaled-font.c | 2 +- src/cairo-svg-surface.c | 6 +++--- src/cairo-xlib-surface.c | 2 +- src/cairoint.h | 16 ++++++++-------- 20 files changed, 49 insertions(+), 50 deletions(-) commit 5e0f46cdebb5e086b344cc09b4537982a07e45cd Author: Behdad Esfahbod Date: Fri Jul 28 15:41:11 2006 -0700 Standardize on unsigned for ref_count type and add CAIRO_REF_COUNT_INVALID The CAIRO_REF_COUNT_INVALID macro simply hides the ((unsigned int)-1) cast to avoid warnings about comparison between signed and unsigned values. src/cairo-font.c | 8 ++++---- src/cairo-pattern.c | 12 ++++++------ src/cairo-scaled-font.c | 6 +++--- src/cairo-surface.c | 12 ++++++------ src/cairo.c | 6 +++--- src/cairoint.h | 8 +++++--- 6 files changed, 27 insertions(+), 25 deletions(-) commit 84b37568e1485c461df663f875ba5546b44e5c5c Author: Behdad Esfahbod Date: Fri Jul 28 15:13:00 2006 -0700 Add -Wold-style-definition compiler falg and fix all warnings. configure.in | 2 +- pixman/src/pixregion.c | 53 +++++++++++++++++++---------------------------- 2 files changed, 23 insertions(+), 32 deletions(-) commit 811f7af1b2cf659b3a3c9b0749c65742207cb946 Author: Behdad Esfahbod Date: Fri Jul 28 18:18:50 2006 -0400 s/dist-hook/dist-hook-local/ Should drop spurious make warning. gtk-doc.make | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 84114949488c7b9a2ae60edb33903b541ce1dadf Author: Behdad Esfahbod Date: Fri Jul 28 15:12:10 2006 -0400 Move font-matrix translation and device transform from surface to gstate Fixes the bug that paginated backends had font-matrix translation applied twice, AND removes a second copy of the glyphs. It's essentially similar to what cworth did for stroke/fill/clip in this commit: bd92eb7f3c58fdcbe05f67b9a879798246c616bc Reviewed by: Carl Worth src/cairo-gstate.c | 10 +++++--- src/cairo-surface.c | 54 ++++++++++++++++---------------------------------- 2 files changed, 23 insertions(+), 41 deletions(-) commit 2f7da1aafb5ca050446fe3645eac3f95b9636b19 Author: Carl Worth Date: Fri Jul 28 10:51:24 2006 -0700 INSTALL: Mention DYLD_LIBRARY_PATH for mac OS X INSTALL | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit e5f4b922618ca2e56d6a66e20761e78d42211ec9 Author: Behdad Esfahbod Date: Thu Jul 27 15:20:14 2006 -0400 Make "double *dash" argument const in cairo_set_dash src/cairo-gstate.c | 2 +- src/cairo.c | 8 ++++---- src/cairo.h | 8 ++++---- src/cairoint.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) commit e92d693e073dc5fba871b615909206f0049ead41 Author: Behdad Esfahbod Date: Thu Jul 27 14:58:46 2006 -0400 Make "CAIRO_TEST_TARGET=... make check" work again Do a funny transition of CAIRO_TEST_TARGET through TARGETS such that one can limit tested targets both through CAIRO_TEST_TARGET env var and TARGETS make var on the command line. test/Makefile.am | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) commit 6ced3edb69f5f5a25a5c40c0bad7dc638cc216cb Author: Behdad Esfahbod Date: Fri Jul 21 18:46:16 2006 -0400 Don't make doc upon make install. gtk-doc.make | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 280823173dce520a43eb54c0b18d2e2eae6a55a0 Author: Carl Worth Date: Thu Jul 27 00:57:53 2006 -0700 Update ROADMAP with 1.2.2 and 1.4 plans now that 1.2.0 is out ROADMAP | 209 ++++++++++++++++++--------------------------------------------- 1 files changed, 59 insertions(+), 150 deletions(-) commit 456cdb3058f3b416109a9600167cd8842300ae14 Author: Carl Worth Date: Wed Jul 26 15:48:56 2006 -0700 Elide size-zero glyphs from calls to XRender functions. There appears to be a bug in some X servers which is triggered by rendering 1-bit glyphs with zero size via the functions XRenderAddGlyphs and XRenderCompositeText8 (and likely its variants). We avoid this bug by making a copy of the glyphs array which does not include any of the size-zero glyphs so that the X server never sees them. src/cairo-xlib-surface.c | 28 ++++++++++++++++++++++------ 1 files changed, 22 insertions(+), 6 deletions(-) commit 8601c2c68306c956744399099a941363d446b906 Merge: cd2f50e... b719188... Author: Michael Emmel Date: Thu Jul 20 23:04:37 2006 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit cd2f50e6c421d35c3d5b0d76ed0fdd03a033b2c2 Author: Michael Emmel Date: Thu Jul 20 23:01:06 2006 -0700 Check for zero before freeing region src/cairo-directfb-surface.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit b7191885c88068dad57d68ced69a752d1162b12c Author: Vladimir Vukicevic Date: Mon Jul 17 11:33:47 2006 -0700 [xlib] Remove XSync implementation of surface_flush Remove the xlib implementation of surface_flush which just called XSync before. src/cairo-xlib-surface.c | 10 +--------- 1 files changed, 1 insertions(+), 9 deletions(-) commit fbb1758ba8384650157b2bbbc93d161b0c2a05f0 Author: Jeff Muizelaar Date: Sun Jun 25 16:12:38 2006 +0200 Fix degenerate-path stroking with dashed lines. This draws dashed degenerate-paths if the dash is on at the point of the path and otherwise draws nothing. src/cairo-path-stroke.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) commit fdebc369d28f70ceba228d3131753225b2dbf844 Author: Jeff Muizelaar Date: Sun Jun 25 15:48:48 2006 +0200 Modify degenerate-path test case to test dashed degenerate paths. test/degenerate-path-ps-argb32-ref.png | Bin 197 -> 220 bytes test/degenerate-path-ref.png | Bin 193 -> 216 bytes test/degenerate-path-rgb24-ref.png | Bin 174 -> 189 bytes test/degenerate-path.c | 54 ++++++++++++++++++++++++++------ 4 files changed, 44 insertions(+), 10 deletions(-) commit b607cdff98e621a6650bccef20f9877a0e7aa1d9 Author: Jeff Muizelaar Date: Sat Jul 15 14:39:26 2006 -0400 Test closed dashed paths where the first and last sub-path do not join. This tests the situation reported by Keith Wells where the start point of a closed dashed path was not being properly capped. test/dash-caps-joins-ps-argb32-ref.png | Bin 1247 -> 2205 bytes test/dash-caps-joins-ref.png | Bin 2583 -> 4680 bytes test/dash-caps-joins.c | 45 +++++++++++++++++++------------ 3 files changed, 27 insertions(+), 18 deletions(-) commit 84840e6bba6e72aa88fad7a0ee929e8955ba9051 Author: Behdad Esfahbod Date: Fri Jul 14 21:42:41 2006 -0400 Use font matrix offset to reposition glyph origin instead of adjusting advance As the font matrix includes translation, which is otherwise unused for glyph transformation, the interpretation of translation is fairly arbitrary. For 1.2.0, we choose to have this translation affect the glyph advance with the thought that it could be used to do letter spacing/kerning. That is fairly useless in practice, and a far more useful interpretation is to relocate the origin of each glyph. This patch uses the translation in the font matrix as an offset for the glyph origin in user space. It turns out glyph extents were already correctly shifted. The end result with this patch is to have cairo match the 1.0 behaviour for font matrix translations, but now we know why :-) Explanation above courtesy of Keith Packard. src/cairo-scaled-font.c | 6 +++--- src/cairo-surface.c | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) commit 47d3c5a2c63478288345235f26533f2d6059e815 Author: Behdad Esfahbod Date: Fri Jul 14 20:06:34 2006 -0400 Flush stdout after writing \r, to remove artifacts. test/cairo-test.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit c70edff0842bc6f7238e17a5fe92dddceec283d3 Author: Carl Worth Date: Fri Jul 14 12:45:48 2006 -0700 Add font-matrix-translation test case. test/.gitignore | 1 + test/Makefile.am | 1 + test/font-matrix-translation-ref.png | Bin 0 -> 1006 bytes test/font-matrix-translation.c | 113 ++++++++++++++++++++++++++++++++++ 4 files changed, 115 insertions(+), 0 deletions(-) commit b390e2c45632a4974b85a6a5ea414e249adb62a3 Author: Carl Worth Date: Thu Jul 13 16:01:57 2006 -0700 pixman-rotate: remove stale svg backend reference images test/pixman-rotate-svg-argb32-ref.png | Bin 258 -> 0 bytes test/pixman-rotate-svg-rgb24-ref.png | Bin 358 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 2b30f85cade33653afddf536aa7e775dd360f501 Author: Carl Worth Date: Thu Jul 13 15:56:12 2006 -0700 ft-text-vertical-layout: Update stale reference images test/ft-text-vertical-layout-pdf-argb32-ref.png | Bin 956 -> 725 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 808 -> 808 bytes 2 files changed, 0 insertions(+), 0 deletions(-) commit 5d64efdbb8fc4e17d4fa44d21068870cd2aea7ce Merge: 9907813... 6a5d66f... Author: Michael Emmel Date: Fri Jul 14 09:37:22 2006 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit 9907813d575cefdda20c77d69ad911fa70d2cf4c Author: Michael Emmel Date: Fri Jul 14 09:36:35 2006 -0700 Fixed debug message to use new member name src/cairo-directfb-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 6a5d66f651b7fe94e74ee803a452bac5b54c95ca Author: Behdad Esfahbod Date: Thu Jul 13 18:53:25 2006 -0400 Go back to "!!!CRASHED!!!" message now that there's no confusion. test/cairo-test.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 6c7099b0ccc926b4f427c3cceb1fed5534c693ec Author: Behdad Esfahbod Date: Thu Jul 13 18:49:52 2006 -0400 Only generate HTML for log files passed on the command line. With the make bits already in place, this means that make retest creates HTML for only the retested tests. test/make-html.pl | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 4b22cb41a9c1fbfc310ae7fd024ceffdb4bf3947 Author: Carl Worth Date: Thu Jul 13 15:23:06 2006 -0700 Use 'FAIL' instead of 'UNEXPECTED FAILURE' in test output. There's no ambiguity anymore due to duplicated printing, so go back to the classic, and easier to read wording. test/cairo-test.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b2d04d7f1a14c961ea10b76581436ae07dfe6ef5 Author: Carl Worth Date: Thu Jul 13 15:21:02 2006 -0700 Rename no_fail_on_stdout to eliminate confusing negative inside a Boolean variable name test/cairo-test.c | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) commit ff1280ce98ecc9ddee7b63e21eaec3d47ed3df8b Author: Carl Worth Date: Thu Jul 13 15:08:19 2006 -0700 cairo-test.c: Prefer FALSE and TRUE for cairo_bool_t values. test/cairo-test.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit ebc736730615021b07b851b41c6de79248ca00e4 Author: Behdad Esfahbod Date: Thu Jul 13 18:17:39 2006 -0400 Fix test result formatting. test/cairo-test.c | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit 3f7593612f52f88eabb87de0c1efbf86bf31e8c2 Author: Carl Worth Date: Thu Jul 13 15:00:16 2006 -0700 Make the various test and check targets depend on all as well. Makefile.am | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 307a17f78cd2adda8a59ef16385df3be5786d2bd Merge: 5ed64e3... 1409b8b... Author: Michael Emmel Date: Thu Jul 13 12:17:25 2006 -0700 Merge branch 'master' of ssh+git://git.cairographics.org/git/cairo commit 5ed64e3915a45785696fd741b69a03cc5050be88 Author: Michael Emmel Date: Thu Jul 13 12:15:42 2006 -0700 Rewrote to remove intermediate surfaces src/cairo-directfb-surface.c | 402 +++++++++++++++++++----------------------- 1 files changed, 178 insertions(+), 224 deletions(-) commit 1409b8be0ca00a0904b1732661915d3eba753a51 Author: Behdad Esfahbod Date: Thu Jul 13 14:33:41 2006 -0400 Fix Name tag in backend .pc files to include "cairo-". src/cairo-backend.pc.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b2668e944d1819f2b8f9973f1f42b1ca36bb193d Author: Behdad Esfahbod Date: Thu Jul 13 14:02:58 2006 -0400 Use cairo_bool_t. test/cairo-test.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 510d23acef9fc75eb968795191091cbc1d33bc09 Author: Behdad Esfahbod Date: Thu Jul 13 13:39:04 2006 -0400 Fix doc typo. src/cairo.h | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 601c0503f7906151698929051852d13c377cfef1 Author: Behdad Esfahbod Date: Thu Jul 13 13:30:52 2006 -0400 Send grep errors to hell^Wnull. test/Makefile.am | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit 09dfae5fbf34fb19b283973df7112b14638d6466 Author: Behdad Esfahbod Date: Thu Jul 13 13:22:49 2006 -0400 Don't write FAIL messages on stdout if both stdout/err are going to screen. test/cairo-test.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) commit 778c4730a86296bf0a71080cf7008d7291792256 Author: Kent Worsnop Date: Thu Jul 13 10:20:12 2006 -0700 PDF: Fix for dash-no-dash test case, (so that dashing can be turned off) src/cairo-pdf-surface.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) commit d2d9a74c77d6bbc51502cee2288fd7d76c30f926 Author: Carl Worth Date: Wed Jul 12 14:49:14 2006 -0700 Add dash-no-dash test case to demonstrate PDF failure to turn off dashing. test/.gitignore | 3 +- test/Makefile.am | 8 ++- test/dash-no-dash-ref.png | Bin 0 -> 152 bytes test/dash-no-dash.c | 95 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 4 deletions(-) commit f3d45d17902cb109dacf30d826ea8f93408473ba Author: Carl Worth Date: Thu Jul 13 10:04:55 2006 -0700 Eliminate a few simple compiler warnings test/cairo-test.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 65d0431b98e7e8d966bbcb43a542a86a9c95e0dc Author: Carl Worth Date: Thu Jul 13 10:04:19 2006 -0700 Add retest and recheck targets to the top-level Makefile Makefile.am | 6 +++++- 1 files changed, 5 insertions(+), 1 deletions(-) commit da0f348350c3ca28d40601aefbca12903632cc18 Author: Behdad Esfahbod Date: Thu Jul 13 13:16:10 2006 -0400 ***cworth finds them [the background colors] a bit too bright test/make-html.pl | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit cf1b23a4c57d436098619443068611a48b88187e Author: Behdad Esfahbod Date: Thu Jul 13 12:58:24 2006 -0400 Add prototype for draw in each test file and remove it from the header. test/a8-mask.c | 2 ++ test/bitmap-font.c | 2 ++ test/cairo-test.h | 1 - test/caps-joins-alpha.c | 2 ++ test/caps-joins.c | 2 ++ test/caps-sub-paths.c | 2 ++ test/clip-all.c | 2 ++ test/clip-fill-rule-pixel-aligned.c | 2 ++ test/clip-fill-rule.c | 2 ++ test/clip-nesting.c | 2 ++ test/clip-operator.c | 2 ++ test/clip-twice.c | 2 ++ test/composite-integer-translate-over-repeat.c | 2 ++ test/composite-integer-translate-over.c | 2 ++ test/composite-integer-translate-source.c | 2 ++ test/create-from-png-stream.c | 2 ++ test/create-from-png.c | 2 ++ test/dash-caps-joins.c | 2 ++ test/dash-offset-negative.c | 2 ++ test/dash-scale.c | 2 ++ test/dash-zero-length.c | 2 ++ test/degenerate-path.c | 2 ++ test/device-offset-positive.c | 2 ++ test/device-offset.c | 2 ++ test/extend-reflect.c | 2 ++ test/fill-and-stroke-alpha-add.c | 2 ++ test/fill-and-stroke-alpha.c | 2 ++ test/fill-and-stroke.c | 2 ++ test/fill-rule.c | 2 ++ test/filter-nearest-offset.c | 2 ++ test/ft-font-create-for-ft-face.c | 2 ++ test/ft-text-antialias-none.c | 2 ++ test/ft-text-vertical-layout.c | 2 ++ test/get-and-set.c | 2 ++ test/get-group-target.c | 2 ++ test/glyph-cache-pressure.c | 2 ++ test/gradient-alpha.c | 2 ++ test/leaky-dash.c | 2 ++ test/leaky-polygon.c | 2 ++ test/line-width-scale.c | 2 ++ test/line-width.c | 2 ++ test/linear-gradient.c | 2 ++ test/mask-ctm.c | 2 ++ test/mask-surface-ctm.c | 2 ++ test/mask.c | 2 ++ test/move-to-show-surface.c | 2 ++ test/new-sub-path.c | 2 ++ test/nil-surface.c | 2 ++ test/operator-clear.c | 2 ++ test/operator-source.c | 2 ++ test/paint-source-alpha.c | 2 ++ test/paint-with-alpha.c | 2 ++ test/paint.c | 2 ++ test/path-data.c | 2 ++ test/pixman-rotate.c | 2 ++ test/push-group.c | 2 ++ test/rectangle-rounding-error.c | 2 ++ test/rel-path.c | 2 ++ test/scale-source-surface-paint.c | 2 ++ test/select-font-face.c | 2 ++ test/select-font-no-show-text.c | 2 ++ test/self-copy.c | 2 ++ test/self-intersecting.c | 2 ++ test/set-source.c | 2 ++ test/show-glyphs-many.c | 2 ++ test/show-text-current-point.c | 2 ++ test/source-clip.c | 2 ++ test/source-surface-scale-paint.c | 2 ++ test/surface-finish-twice.c | 2 ++ test/surface-pattern.c | 2 ++ test/text-antialias-gray.c | 2 ++ test/text-antialias-none.c | 2 ++ test/text-antialias-subpixel.c | 2 ++ test/text-cache-crash.c | 2 ++ test/text-pattern.c | 2 ++ test/text-rotate.c | 2 ++ test/transforms.c | 2 ++ test/translate-show-surface.c | 2 ++ test/trap-clip.c | 2 ++ test/unantialiased-shapes.c | 2 ++ test/unbounded-operator.c | 2 ++ test/zero-alpha.c | 2 ++ 82 files changed, 162 insertions(+), 1 deletions(-) commit f8eeca97684f7c8eba7b918c34fe5ccbf32e2f5f Author: Behdad Esfahbod Date: Thu Jul 13 11:48:42 2006 -0400 Tiny doc typo fix. src/cairo.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 0ac2bbbf52737b2e368de269651c56dab90c928a Author: Behdad Esfahbod Date: Thu Jul 13 11:27:05 2006 -0400 Improve test HTML generation: - Make "make retest" not generate all .log files. - Format improvements in the generated HTML file. test/Makefile.am | 27 +++++++++++++++++++-------- test/cairo-test.c | 16 ++++++++-------- test/make-html.pl | 49 ++++++++++++++++++++++++++++--------------------- 3 files changed, 55 insertions(+), 37 deletions(-) commit f79a9f5a5259f33284d5e63ef2ddac0be4ea7d41 Author: Behdad Esfahbod Date: Wed Jul 12 04:27:55 2006 -0400 Improve backend .pc files generation: - Add all non-pkgconfig libs to Libs.private in cairo.pc - Make cairo-xlib-xrender.pc Require cairo-xlib.pc configure.in | 56 ++++++++++++++++++++++++++++------------------ src/Makefile.am | 2 +- src/cairo-backend.pc.in | 2 +- src/cairo.pc.in | 5 ++- 4 files changed, 39 insertions(+), 26 deletions(-) commit 973d3a3d1466830dcaa94e9fe39fa6fdf510fbbc Author: Behdad Esfahbod Date: Tue Jul 11 22:19:39 2006 -0400 More test suite infrastructure improvements: - Remove cairo_test_expect_failure. cairo-test.c now checks env var CAIRO_XFAIL_TESTS to see if the running test is expected to fail. The reason for expected failure is appended to the test description. - Test description is written out. - Failed/crashed tests also write a line out to stderr (in red), so one can now redirect stdout to /dev/null to only see failures. - cairo_test() has been changed to not take the draw function anymore, instead, draw function is now part of the test struct. - "make check" doesn't allow limiting backends to test using env var anymore. To limit backends to test, one should use the TARGETS variable on the make command line. - "make check-valgrind" now writes its log to valgrind-log instead of valgrind.log, to not interfere with test log file processing. test/.gitignore | 1 + test/Makefile.am | 9 ++- test/README | 6 +- test/a8-mask.c | 9 +- test/bitmap-font.c | 5 +- test/cairo-test.c | 98 +++++++++++++++++------- test/cairo-test.h | 24 ++---- test/caps-joins-alpha.c | 5 +- test/caps-joins.c | 5 +- test/caps-sub-paths.c | 5 +- test/clip-all.c | 5 +- test/clip-fill-rule-pixel-aligned.c | 5 +- test/clip-fill-rule.c | 5 +- test/clip-nesting.c | 5 +- test/clip-operator.c | 7 +- test/clip-twice.c | 5 +- test/composite-integer-translate-over-repeat.c | 5 +- test/composite-integer-translate-over.c | 5 +- test/composite-integer-translate-source.c | 5 +- test/create-for-stream.c | 29 +++++--- test/create-from-png-stream.c | 5 +- test/create-from-png.c | 5 +- test/dash-caps-joins.c | 5 +- test/dash-offset-negative.c | 5 +- test/dash-scale.c | 5 +- test/dash-zero-length.c | 5 +- test/degenerate-path.c | 5 +- test/device-offset-positive.c | 5 +- test/device-offset.c | 5 +- test/extend-reflect.c | 9 +- test/fallback-resolution.c | 6 +- test/fill-and-stroke-alpha-add.c | 5 +- test/fill-and-stroke-alpha.c | 5 +- test/fill-and-stroke.c | 5 +- test/fill-rule.c | 5 +- test/filter-nearest-offset.c | 9 +- test/ft-font-create-for-ft-face.c | 5 +- test/ft-text-antialias-none.c | 5 +- test/ft-text-vertical-layout.c | 5 +- test/get-and-set.c | 7 +- test/get-group-target.c | 5 +- test/glyph-cache-pressure.c | 5 +- test/gradient-alpha.c | 5 +- test/leaky-dash.c | 9 +- test/leaky-polygon.c | 5 +- test/line-width-scale.c | 5 +- test/line-width.c | 5 +- test/linear-gradient.c | 5 +- test/mask-ctm.c | 5 +- test/mask-surface-ctm.c | 5 +- test/mask.c | 7 +- test/move-to-show-surface.c | 5 +- test/multi-page.c | 8 +- test/new-sub-path.c | 5 +- test/nil-surface.c | 5 +- test/operator-clear.c | 7 +- test/operator-source.c | 7 +- test/paint-source-alpha.c | 5 +- test/paint-with-alpha.c | 5 +- test/paint.c | 5 +- test/path-data.c | 5 +- test/pdf-features.c | 2 +- test/pixman-rotate.c | 5 +- test/ps-features.c | 2 +- test/push-group.c | 5 +- test/rectangle-rounding-error.c | 5 +- test/rel-path.c | 5 +- test/scale-source-surface-paint.c | 5 +- test/select-font-face.c | 5 +- test/select-font-no-show-text.c | 7 +- test/self-copy.c | 5 +- test/self-intersecting.c | 9 +- test/set-source.c | 5 +- test/show-glyphs-many.c | 5 +- test/show-text-current-point.c | 5 +- test/source-clip.c | 5 +- test/source-surface-scale-paint.c | 5 +- test/surface-finish-twice.c | 5 +- test/surface-pattern.c | 5 +- test/svg-clip.c | 2 +- test/svg-surface.c | 10 +- test/text-antialias-gray.c | 5 +- test/text-antialias-none.c | 5 +- test/text-antialias-subpixel.c | 5 +- test/text-cache-crash.c | 7 +- test/text-pattern.c | 5 +- test/text-rotate.c | 9 +- test/transforms.c | 5 +- test/translate-show-surface.c | 5 +- test/trap-clip.c | 7 +- test/unantialiased-shapes.c | 5 +- test/unbounded-operator.c | 7 +- test/xlib-surface.c | 2 +- test/zero-alpha.c | 5 +- 94 files changed, 386 insertions(+), 260 deletions(-) commit 94bdbc15f79308269f1bcd74b3d8899f8458babc Author: Behdad Esfahbod Date: Tue Jul 11 17:27:08 2006 -0400 Improve test suite build infrastructure - Add new target recheck, that checks only failed tests - Add targets test and retest, and make html after (re)checking - Make targets html and index.html lazy, only update if any tests changed - Improve build system such that checking one test (using TESTS=...) doesn't build all tests - Remove pixman-rotate from XFAIL Makefile.am | 4 ++- test/Makefile.am | 69 ++++++++++++++++++++++++++++++++++++++++++-------- test/cairo-test.c | 7 +++-- test/pixman-rotate.c | 3 +- 4 files changed, 66 insertions(+), 17 deletions(-) commit c45a9321759e5cc0fcf6eda85f91d09ebb4db0d2 Author: Behdad Esfahbod Date: Tue Jul 11 16:07:13 2006 -0400 Use Bitstream Vera Sans and Latin text in ft-text-vertical. We don't really rely on the Japanese text and font, as FreeType synthesizes vertical metrics for all fonts. test/ft-text-vertical-layout-ps-argb32-ref.png | Bin 349 -> 298 bytes test/ft-text-vertical-layout-ref.png | Bin 1130 -> 834 bytes test/ft-text-vertical-layout-svg-argb32-ref.png | Bin 1021 -> 799 bytes test/ft-text-vertical-layout-svg-rgb24-ref.png | Bin 1098 -> 808 bytes test/ft-text-vertical-layout.c | 4 ++-- 5 files changed, 2 insertions(+), 2 deletions(-) commit fe647ca42b24ff844dd0d94642adaf46ea7a28dd Author: Behdad Esfahbod Date: Tue Jul 11 15:18:14 2006 -0400 Oops. Fix doc format. src/cairo.h | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) commit 90a46affe626c9afafd687ac2d71a57f4583e216 Author: Behdad Esfahbod Date: Tue Jul 11 13:36:52 2006 -0400 Add note to docs for some enums about possible future additions. src/cairo.h | 17 +++++++++++++++++ 1 files changed, 17 insertions(+), 0 deletions(-) commit d27a00874bc044b4c9aefacbc850d5f7ee106b6f Author: Behdad Esfahbod Date: Tue Jul 11 09:23:18 2006 -0400 Disable PDF backend if zlib not found. Explicitly add -lm to CAIRO_LIBS configure.in | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) commit e0ad1aa995bcec4246c0b8ab0d5a5a79871ce235 Author: Behdad Esfahbod Date: Mon Jul 10 13:45:51 2006 -0400 Change version number of Sun's Xorg server with buggy repeat from 60800000 to 60900000. (#7483, pointed by Brian Cameron) src/cairo-xlib-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit b006bf9d2c7d39c413527017fc792a38b598555a Author: Behdad Esfahbod Date: Mon Jul 10 11:52:58 2006 -0400 Add change stat to ChangeLog. Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit ccb54b35ed2252ae9ece95204a5ad7b43cde936e Author: Behdad Esfahbod Date: Mon Jul 10 10:35:42 2006 -0400 Small doc fix. src/cairo.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) commit defa23206cfa83ad4460a868f78289ba7f7c1c53 Author: Behdad Esfahbod Date: Mon Jul 10 10:26:19 2006 -0400 Fix nil surface initializations for surface type. (#7322) src/cairo-surface.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit a1143d120fbc142fc6ae15f394cfbe400a4a0b3e Author: Behdad Esfahbod Date: Sat Jul 8 21:04:21 2006 -0400 Generate index of new symbols in 1.2. doc/public/cairo-docs.xml | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) commit 6efd145882155971be85b23807bd5c52d1025cc3 Author: Behdad Esfahbod Date: Sat Jul 8 17:52:24 2006 -0400 Better creation rules for cairo.def. src/Makefile.am | 39 +++++++++++++-------------------------- 1 files changed, 13 insertions(+), 26 deletions(-) commit f3f374fb8066e09da1948674decadc6c764f2a1b Author: Behdad Esfahbod Date: Sat Jul 8 16:39:52 2006 -0400 Include cairo-svg.h in cairo_win32_api_headers. (bug 7462) src/Makefile.am | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) commit a443a4215869b3556d9d703c80061879020064ad Author: Behdad Esfahbod Date: Thu Jul 6 23:06:14 2006 -0400 Fix doc typo. src/cairo-matrix.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 731925f00a7391755cabb9253c9a9f2b2dccbdb8 Author: Behdad Esfahbod Date: Thu Jul 6 23:05:13 2006 -0400 Fix doc syntax. src/cairo-matrix.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) commit 9c37cac22b071f9fb00f9000779bb988df6e010c Author: Behdad Esfahbod Date: Thu Jul 6 17:52:13 2006 -0400 Fix typo when printing error for unsupported X formats. It was mistakenly marking Green and Blue swapped. src/cairo-image-surface.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 807cb2fd8e4867d5aab7bd2c887e17160cf9a22f Author: David Reveman Date: Thu Jul 6 13:50:41 2006 -0400 Ignore color for CAIRO_OPERATOR_CLEAR in glitz backend. src/cairo-glitz-surface.c | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) commit 95016b3274f4eedf6bd917a5b8bf8f6745c54581 Author: Behdad Esfahbod Date: Thu Jul 6 13:48:18 2006 -0400 Make CAIRO_TEST_TARGET="" make check pass tests. test/cairo-test.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) commit f90182fe2ad383bf240e2b02003fd7cd0a7e90ff Author: Behdad Esfahbod Date: Thu Jul 6 13:42:25 2006 -0400 Update test/README test/README | 50 +++++++++++++++++++++++++++++++++++++------------- 1 files changed, 37 insertions(+), 13 deletions(-) commit 83dcbe05b5bce6619e650d63be58a35fcb1609c1 Author: Behdad Esfahbod Date: Wed Jul 5 04:29:54 2006 +0200 For check-valgrind, call the version of libtool in our source distribution, not the one found in PATH. test/Makefile.am | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 1cb0bc40a3ab9373d19c186d98059007f288fa13 Author: Behdad Esfahbod Date: Wed Jul 5 04:22:32 2006 +0200 Do not use sighandler_t. Bug 7401. test/cairo-test.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) commit 91ad3ae78400d2d942354b8cde514480dffc5090 Author: Jonathon Jongsma Date: Tue Jul 4 16:23:24 2006 -0500 Fix documentation typo in cairo_scaled_font_get_font_options() src/cairo-scaled-font.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 94c5537924da3a6b00b106eda80e61a6f4a9a1f0 Author: Jonathon Jongsma Date: Tue Jul 4 14:58:58 2006 -0500 Fix a typo in cairo_font_extents_t documentation src/cairo.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) commit 57a644fb04bfd4831aa1ec1e5f82c989bbf90c8c Author: Carl Worth Date: Sat Jul 1 05:06:11 2006 +0200 RELEASING: Mention README as the source for blurbs RELEASING | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) commit 7bff2eb81905b2d1d01f087612fe8c1354166a94 Author: Carl Worth Date: Sat Jul 1 04:37:50 2006 +0200 Increment CAIRO_VERSION to 1.2.1 after making the 1.2.0 release RELEASING | 2 +- configure.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) libgdiplus-2.11/configure0000775000175000017500000164516112225470231012441 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for libgdiplus 2.11. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org and $0: https://bugzilla.xamarin.com/enter_bug.cgi?product=Class%20Libraries&component=libgdiplus $0: about your system, including any error possibly output $0: before this message. Then install a modern shell, or $0: manually run the script under such a shell if you do $0: have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='libgdiplus' PACKAGE_TARNAME='libgdiplus' PACKAGE_VERSION='2.11' PACKAGE_STRING='libgdiplus 2.11' PACKAGE_BUGREPORT='https://bugzilla.xamarin.com/enter_bug.cgi?product=Class%20Libraries&component=libgdiplus' PACKAGE_URL='' ac_unique_file="README" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" enable_option_checking=no ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS CAIRO_DIR GDIPLUS_PKG_REQ GDIPLUS_PKG_CFLAGS GDIPLUS_PKG_LIBS GDIPLUS_CFLAGS GDIPLUS_LIBS HAVE_LIBEXIF_FALSE HAVE_LIBEXIF_TRUE LIBEXIF_LIBS LIBEXIF_CFLAGS FREETYPE_CONFIG FREETYPE2_LIBS FREETYPE2_CFLAGS FONTCONFIG_CONFIG FONTCONFIG_LIBS FONTCONFIG_CFLAGS PANGO_LIBS PANGO_CFLAGS subdirs CAIRO_LIBS CAIRO_CFLAGS BASE_DEPENDENCIES_LIBS BASE_DEPENDENCIES_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG CPP OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTOOL MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_os target_vendor target_cpu target host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_shared enable_static with_pic enable_fast_install enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock with_pango with_libexif with_libjpeg with_libtiff with_libgif ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR BASE_DEPENDENCIES_CFLAGS BASE_DEPENDENCIES_LIBS CAIRO_CFLAGS CAIRO_LIBS PANGO_CFLAGS PANGO_LIBS FONTCONFIG_CFLAGS FONTCONFIG_LIBS FREETYPE2_CFLAGS FREETYPE2_LIBS LIBEXIF_CFLAGS LIBEXIF_LIBS' ac_subdirs_all='pixman cairo' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures libgdiplus 2.11 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/libgdiplus] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] --target=TARGET configure for building compilers for TARGET [HOST] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of libgdiplus 2.11:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot=DIR Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-pango --without-libexif disable EXIF support --with-libjpeg=PREFIX Prefix where libjpeg is installed, or 'no' to disable --with-libtiff=PREFIX Prefix where libtiff is installed, or 'no' to disable --with-libgif=PREFIX Prefix where libgif is installed, or 'no' to disable Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility PKG_CONFIG_PATH directories to add to pkg-config's search path PKG_CONFIG_LIBDIR path overriding pkg-config's built-in search path BASE_DEPENDENCIES_CFLAGS C compiler flags for BASE_DEPENDENCIES, overriding pkg-config BASE_DEPENDENCIES_LIBS linker flags for BASE_DEPENDENCIES, overriding pkg-config CAIRO_CFLAGS C compiler flags for CAIRO, overriding pkg-config CAIRO_LIBS linker flags for CAIRO, overriding pkg-config PANGO_CFLAGS C compiler flags for PANGO, overriding pkg-config PANGO_LIBS linker flags for PANGO, overriding pkg-config FONTCONFIG_CFLAGS C compiler flags for FONTCONFIG, overriding pkg-config FONTCONFIG_LIBS linker flags for FONTCONFIG, overriding pkg-config FREETYPE2_CFLAGS C compiler flags for FREETYPE2, overriding pkg-config FREETYPE2_LIBS linker flags for FREETYPE2, overriding pkg-config LIBEXIF_CFLAGS C compiler flags for LIBEXIF, overriding pkg-config LIBEXIF_LIBS linker flags for LIBEXIF, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF libgdiplus configure 2.11 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ( $as_echo "## -------------------------------------------------------------------------------------------------------- ## ## Report this to https://bugzilla.xamarin.com/enter_bug.cgi?product=Class%20Libraries&component=libgdiplus ## ## -------------------------------------------------------------------------------------------------------- ##" ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by libgdiplus $as_me 2.11, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 $as_echo_n "checking target system type... " >&6; } if ${ac_cv_target+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$target_alias" = x; then ac_cv_target=$ac_cv_host else ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 $as_echo "$ac_cv_target" >&6; } case $ac_cv_target in *-*-*) ;; *) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;; esac target=$ac_cv_target ac_save_IFS=$IFS; IFS='-' set x $ac_cv_target shift target_cpu=$1 target_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: target_os=$* IFS=$ac_save_IFS case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac # The aliases save the names the user supplied, while $host etc. # will get canonicalized. test -n "$target_alias" && test "$program_prefix$program_suffix$program_transform_name" = \ NONENONEs,x,x, && program_prefix=${target_alias}- am__api_version='1.11' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; esac # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='libgdiplus' VERSION='2.11' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' ac_config_headers="$ac_config_headers config.h" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.2' macro_revision='1.3337' ltmain="$ac_aux_dir/ltmain.sh" # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case "$ECHO" in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from `make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok `-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" else lt_nm_to_check="${ac_tool_prefix}nm" if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. tmp_nm="$ac_dir/$lt_tmp_nm" if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then # Check to see if the nm accepts a BSD-compat flag. # Adding the `sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in */dev/null* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS="$lt_save_ifs" done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test "$lt_cv_path_NM" != "no"; then NM="$lt_cv_path_NM" else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols" ;; *) DUMPBIN=: ;; esac fi if test "$DUMPBIN" != ":"; then NM="$DUMPBIN" fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring="ABCD" case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8 ; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n $lt_cv_sys_max_cmd_len ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5 $as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } # Try some XSI features xsi_shell=no ( _lt_dummy="a/b/c" test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ = c,a/b,b/c, \ && eval 'test $(( 1 + 1 )) -eq 2 \ && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ && xsi_shell=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5 $as_echo "$xsi_shell" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5 $as_echo_n "checking whether the shell understands \"+=\"... " >&6; } lt_shell_append=no ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ >/dev/null 2>&1 \ && lt_shell_append=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5 $as_echo "$lt_shell_append" >&6; } if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test "$GCC" != yes; then reload_cmds=false fi ;; darwin*) if test "$GCC" = yes; then reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # `unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # which responds to the $file_magic_cmd with a given extended regex. # If you have `file' or equivalent on your system and you're not sure # whether `pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) 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]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) 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]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh # decide which to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd="$ECHO" ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -ne 0; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test "x$lt_cv_ar_at_file" = xno; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test "$host_cpu" = ia64; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" 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'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function # and D for any global variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ " {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ " s[1]~/^[@?]/{print s[1], s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) /* DATA imports from DLLs on WIN32 con't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined(__osf__) /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS="conftstm.$ac_objext" CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext}; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test "$pipe_works" = yes; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case ${with_sysroot} in #( yes) if test "$GCC" = yes; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5 $as_echo "${with_sysroot}" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE="32" ;; *ELF-64*) HPUX_IA64_MODE="64" ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test "$lt_cv_prog_gnu_ld" = yes; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; ppc64-*linux*|powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; ppc*-*linux*|powerpc*-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; *-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD="${LD-ld}_sol2" fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks="$enable_libtool_lock" if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test "x$lt_cv_path_mainfest_tool" != xyes; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test $_lt_result -eq 0; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; 10.[012]*) _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test "$lt_cv_apple_cc_single_mod" = "yes"; then _lt_dar_single_mod='$single_module' fi if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' fi if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS="$lt_save_ifs" ;; esac else enable_shared=yes fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS="$lt_save_ifs" ;; esac else enable_static=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for lt_pkg in $withval; do IFS="$lt_save_ifs" if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS="$lt_save_ifs" ;; esac else pic_mode=default fi test -z "$pic_mode" && pic_mode=default # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," for pkg in $enableval; do IFS="$lt_save_ifs" if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS="$lt_save_ifs" ;; esac else enable_fast_install=yes fi # This can be used to rebuild libtool when needed LIBTOOL_DEPS="$ltmain" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a `.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld="$lt_cv_prog_gnu_ld" old_CC="$CC" old_CFLAGS="$CFLAGS" # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o for cc_temp in $compiler""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/${ac_tool_prefix}file; then lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD="$MAGIC_CMD" lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/file; then lt_cv_path_MAGIC_CMD="$ac_dir/file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS="$lt_save_ifs" MAGIC_CMD="$lt_save_MAGIC_CMD" ;; esac fi MAGIC_CMD="$lt_cv_path_MAGIC_CMD" if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the `-m68020' flag to GCC prevents building anything better, # like `-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64 which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms which do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test x"$lt_cv_prog_compiler_pic_works" = xyes; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test x"$lt_cv_prog_compiler_static_works" = xyes; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test "$hard_links" = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' link_all_deplibs=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='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' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test "$host_os" = linux-dietlibc; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test "$tmp_diet" = no then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='${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' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='${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' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='${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' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' fi case $cc_basename in xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test "x$supports_anon_versioning" = xyes; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag="" else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm # Also, AIX nm treats weak defined symbols like other global # defined symbols, whereas GNU nm marks them as "W". if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test "$aix_use_runtimelinking" = yes; then shared_flag="$shared_flag "'${wl}-G' fi link_all_deplibs=no else # not using gcc if test "$host_cpu" = ia64; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then shared_flag='${wl}-G' else shared_flag='${wl}-bM:SRE' fi fi fi export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$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" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$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" else # Determine the default libpath from the value encoded in an # empty executable. if test "${lt_cv_aix_libpath+set}" = set; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_="/usr/lib:/lib" fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' if test "$with_gnu_ld" = yes; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$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' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$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)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile="$lt_outputfile.exe" lt_tool_outputfile="$lt_tool_outputfile.exe" ;; esac~ if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test "$lt_cv_ld_force_load" = "yes"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag="$_lt_dar_allow_undefined" case $cc_basename in ifort*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test "$_lt_dar_can_shared" = "yes"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" archive_expsym_cmds="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}" module_expsym_cmds="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}" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test "$GCC" = yes; then archive_cmds='$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' else archive_cmds='$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' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='${wl}-E' ;; hpux10*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$GCC" = yes && test "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test x"$lt_cv_prog_compiler__b" = xyes; then archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then archive_cmds='$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' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test "$lt_cv_irix_exported_symbol" = yes; then archive_expsym_cmds='$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' fi else archive_cmds='$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' archive_expsym_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' export_dynamic_flag_spec='${wl}-E' else case $host_os in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-R$libdir' ;; *) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported archive_cmds='$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' old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' archive_cmds='$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' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$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' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $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' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test "$GCC" = yes; then wlarc='${wl}' archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $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' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='${wl}' archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='${wl}-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We can NOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='${wl}-z,text' allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='${wl}-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test x$host_vendor = xsni; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='${wl}-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test "$enable_shared" = yes && test "$GCC" = yes; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; *) lt_sed_strip_eq="s,=/,/,g" ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path/$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" else test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo="/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's,/\([A-Za-z]:\),\1,g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=".so" postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='${libname}${release}${shared_ext}$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test "$host_cpu" = ia64; then # AIX 5 supports IA64 library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line `#! .'. This would cause the generated library to # depend on `.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # AIX (on Power*) has no versioning support, so currently we can not hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. if test "$aix_use_runtimelinking" = yes; then # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' else # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='${libname}${release}.a $libname.a' soname_spec='${libname}${release}${shared_ext}$major' fi shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. 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' ;; esac ;; beos*) library_names_spec='${libname}${shared_ext}' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' library_names_spec='${libname}.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec="$LIB" if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=yes sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' if test "X$HPUX_IA64_MODE" = X32; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then 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' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec="/usr/lib" need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in openbsd3.3 | openbsd3.3.*) need_version=yes ;; *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no ;; *) shlibpath_overrides_runpath=yes ;; esac else shlibpath_overrides_runpath=yes fi ;; os2*) libname_spec='$name' shrext_cmds=".dll" need_lib_prefix=no library_names_spec='$libname${shared_ext} $libname.a' dynamic_linker='OS/2 ld.exe' shlibpath_var=LIBPATH ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='${libname}${release}${shared_ext}$major' library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test "$with_gnu_ld" = yes; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec ;then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=freebsd-elf need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" fi if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test "X$hardcode_automatic" = "Xyes" ; then # We can hardcode non-existent directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test "$hardcode_action" = relink || test "$inherit_rpath" = yes; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || test "$enable_shared" = no; then # Fast installation is not necessary enable_fast_install=needless fi if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen="load_add_on" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else lt_cv_dlopen="dyld" lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen="shl_load" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen="dlopen" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" fi fi fi fi fi fi ;; esac if test "x$lt_cv_dlopen" != xno; then enable_dlopen=yes else enable_dlopen=no fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS="$CPPFLAGS" test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS="$LDFLAGS" wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS="$LIBS" LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisbility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS="$save_CPPFLAGS" LDFLAGS="$save_LDFLAGS" LIBS="$save_LIBS" ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP" ; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report which library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test "$can_build_shared" = "no" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test "$enable_shared" = yes && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test "$enable_shared" = yes || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" ac_config_commands="$ac_config_commands libtool" # Only expand once: { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$PKG_CONFIG" = "xno"; then as_fn_error $? "You need to install pkg-config" "$LINENO" 5 fi GLIB_REQUIRED_VERSION="2.2.3" if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BASE_DEPENDENCIES" >&5 $as_echo_n "checking for BASE_DEPENDENCIES... " >&6; } if test -n "$BASE_DEPENDENCIES_CFLAGS"; then pkg_cv_BASE_DEPENDENCIES_CFLAGS="$BASE_DEPENDENCIES_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BASE_DEPENDENCIES_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= $GLIB_REQUIRED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$BASE_DEPENDENCIES_LIBS"; then pkg_cv_BASE_DEPENDENCIES_LIBS="$BASE_DEPENDENCIES_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= \$GLIB_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "glib-2.0 >= $GLIB_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_BASE_DEPENDENCIES_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= $GLIB_REQUIRED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then BASE_DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED_VERSION" 2>&1` else BASE_DEPENDENCIES_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "glib-2.0 >= $GLIB_REQUIRED_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$BASE_DEPENDENCIES_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (glib-2.0 >= $GLIB_REQUIRED_VERSION) were not met: $BASE_DEPENDENCIES_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables BASE_DEPENDENCIES_CFLAGS and BASE_DEPENDENCIES_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables BASE_DEPENDENCIES_CFLAGS and BASE_DEPENDENCIES_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else BASE_DEPENDENCIES_CFLAGS=$pkg_cv_BASE_DEPENDENCIES_CFLAGS BASE_DEPENDENCIES_LIBS=$pkg_cv_BASE_DEPENDENCIES_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi GDIPLUS_LIBS="`pkg-config --libs glib-2.0 `" GDIPLUS_CFLAGS="`pkg-config --cflags glib-2.0 `" # libgdiplus bundles its own cairo 1.6.4 but if the system cairo is more recent then we use it instead CAIRO_BUNDLED_VERSION="1.6.4" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CAIRO" >&5 $as_echo_n "checking for CAIRO... " >&6; } if test -n "$CAIRO_CFLAGS"; then pkg_cv_CAIRO_CFLAGS="$CAIRO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo > \$CAIRO_BUNDLED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo > $CAIRO_BUNDLED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_CFLAGS=`$PKG_CONFIG --cflags "cairo > $CAIRO_BUNDLED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$CAIRO_LIBS"; then pkg_cv_CAIRO_LIBS="$CAIRO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cairo > \$CAIRO_BUNDLED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "cairo > $CAIRO_BUNDLED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_CAIRO_LIBS=`$PKG_CONFIG --libs "cairo > $CAIRO_BUNDLED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then CAIRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "cairo > $CAIRO_BUNDLED_VERSION" 2>&1` else CAIRO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "cairo > $CAIRO_BUNDLED_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$CAIRO_PKG_ERRORS" >&5 cairo_v=internal elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } cairo_v=internal else CAIRO_CFLAGS=$pkg_cv_CAIRO_CFLAGS CAIRO_LIBS=$pkg_cv_CAIRO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } cairo_v=system fi # Optional use (experimental and unsupported) of Pango's text rendering on top of Cairo # Check whether --with-pango was given. if test "${with_pango+set}" = set; then : withval=$with_pango; text_v=pango else text_v=cairo fi if test $cairo_v = "internal"; then # force subdirectories (cairo, specifically) to build their static # libraries using position independent code. ac_configure_args="$ac_configure_args --with-pic=yes" # disable the PNG, PDF and SVG surface backends of Cairo (unrequired for GDI+) # cairo 1.6.4 bug - we can't disable PDF and keep PS backend - reported at https://bugs.freedesktop.org/show_bug.cgi?id=15532 # ac_configure_args="$ac_configure_args --disable-png --disable-pdf --disable-svg" ac_configure_args="$ac_configure_args --disable-png --disable-svg" # gdiplus mac note; if we have quartz and ft fonts, quartz is the default and gdi+ assumes the latter everywhere, force it out # of the internal build ac_configure_args="$ac_configure_args --disable-quartz-font" subdirs="$subdirs pixman cairo" CAIRO_DIR="pixman cairo" CAIRO_LIBS='$(top_builddir)/cairo/src/libcairo.la' CAIRO_CFLAGS='-I$(top_builddir)/pixman/pixman -I$(top_srcdir)/pixman/pixman -I$(top_builddir)/cairo/src -I$(top_srcdir)/cairo/src' cairo_info+="$CAIRO_BUNDLED_VERSION (internal)" $as_echo "#define USE_INCLUDED_CAIRO 1" >>confdefs.h if test $text_v = "pango"; then as_fn_error $? "\"Pango text rendering is only possible with --with-cairo=system\"" "$LINENO" 5 fi else CAIRO_DIR="" CAIRO_LIBS="`pkg-config --libs cairo `" CAIRO_CFLAGS="`pkg-config --cflags cairo `" cairo_info="`pkg-config --modversion cairo ` (system)" GDIPLUS_PKG_REQ="cairo" if test $text_v = "pango"; then PANGO_REQUIRED_VERSION="1.10" pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PANGO" >&5 $as_echo_n "checking for PANGO... " >&6; } if test -n "$PANGO_CFLAGS"; then pkg_cv_PANGO_CFLAGS="$PANGO_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango >= \$PANGO_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "pango >= $PANGO_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGO_CFLAGS=`$PKG_CONFIG --cflags "pango >= $PANGO_REQUIRED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$PANGO_LIBS"; then pkg_cv_PANGO_LIBS="$PANGO_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"pango >= \$PANGO_REQUIRED_VERSION\""; } >&5 ($PKG_CONFIG --exists --print-errors "pango >= $PANGO_REQUIRED_VERSION") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_PANGO_LIBS=`$PKG_CONFIG --libs "pango >= $PANGO_REQUIRED_VERSION" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then PANGO_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "pango >= $PANGO_REQUIRED_VERSION" 2>&1` else PANGO_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "pango >= $PANGO_REQUIRED_VERSION" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$PANGO_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (pango >= $PANGO_REQUIRED_VERSION) were not met: $PANGO_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables PANGO_CFLAGS and PANGO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details." "$LINENO" 5 elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables PANGO_CFLAGS and PANGO_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details" "$LINENO" 5; } else PANGO_CFLAGS=$pkg_cv_PANGO_CFLAGS PANGO_LIBS=$pkg_cv_PANGO_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi PANGO_LIBS="`pkg-config --libs pangocairo `" PANGO_CFLAGS="`pkg-config --cflags pangocairo `" $as_echo "#define USE_PANGO_RENDERING 1" >>confdefs.h GDIPLUS_PKG_REQ="$GDIPLUS_PKG_REQ pangocairo-1.0" fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $CAIRO_LIBS $PANGO_LIBS" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $CAIRO_CFLAGS $PANGO_CFLAGS" # Fall back to using fontconfig/freetype-config if their .pc is not found pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FONTCONFIG" >&5 $as_echo_n "checking for FONTCONFIG... " >&6; } if test -n "$FONTCONFIG_CFLAGS"; then pkg_cv_FONTCONFIG_CFLAGS="$FONTCONFIG_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags "fontconfig" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FONTCONFIG_LIBS"; then pkg_cv_FONTCONFIG_LIBS="$FONTCONFIG_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fontconfig\""; } >&5 ($PKG_CONFIG --exists --print-errors "fontconfig") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FONTCONFIG_LIBS=`$PKG_CONFIG --libs "fontconfig" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "fontconfig" 2>&1` else FONTCONFIG_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "fontconfig" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FONTCONFIG_PKG_ERRORS" >&5 fontconfig_pkgconfig=no elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fontconfig_pkgconfig=no else FONTCONFIG_CFLAGS=$pkg_cv_FONTCONFIG_CFLAGS FONTCONFIG_LIBS=$pkg_cv_FONTCONFIG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fontconfig_pkgconfig=yes fi if test "x$FONTCONFIG" = "xno"; then # Extract the first word of "fontconfig-config", so it can be a program name with args. set dummy fontconfig-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FONTCONFIG_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FONTCONFIG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FONTCONFIG_CONFIG="$FONTCONFIG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FONTCONFIG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FONTCONFIG_CONFIG" && ac_cv_path_FONTCONFIG_CONFIG="no" ;; esac fi FONTCONFIG_CONFIG=$ac_cv_path_FONTCONFIG_CONFIG if test -n "$FONTCONFIG_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FONTCONFIG_CONFIG" >&5 $as_echo "$FONTCONFIG_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$FONTCONFIG_CONFIG" = "xyes"; then FONTCONFIG_CFLAGS="`fontconfig-config --cflags`" FONTCONFIG_LIBS="`fontconfig-config --libs`" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FcInit in -lfontconfig" >&5 $as_echo_n "checking for FcInit in -lfontconfig... " >&6; } if ${ac_cv_lib_fontconfig_FcInit+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfontconfig $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char FcInit (); int main () { return FcInit (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_fontconfig_FcInit=yes else ac_cv_lib_fontconfig_FcInit=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_fontconfig_FcInit" >&5 $as_echo "$ac_cv_lib_fontconfig_FcInit" >&6; } if test "x$ac_cv_lib_fontconfig_FcInit" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBFONTCONFIG 1 _ACEOF LIBS="-lfontconfig $LIBS" fi for ac_func in FcFini do : ac_fn_c_check_func "$LINENO" "FcFini" "ac_cv_func_FcFini" if test "x$ac_cv_func_FcFini" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_FCFINI 1 _ACEOF fi done pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FREETYPE2" >&5 $as_echo_n "checking for FREETYPE2... " >&6; } if test -n "$FREETYPE2_CFLAGS"; then pkg_cv_FREETYPE2_CFLAGS="$FREETYPE2_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE2_CFLAGS=`$PKG_CONFIG --cflags "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$FREETYPE2_LIBS"; then pkg_cv_FREETYPE2_LIBS="$FREETYPE2_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"freetype2\""; } >&5 ($PKG_CONFIG --exists --print-errors "freetype2") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_FREETYPE2_LIBS=`$PKG_CONFIG --libs "freetype2" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then FREETYPE2_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "freetype2" 2>&1` else FREETYPE2_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "freetype2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$FREETYPE2_PKG_ERRORS" >&5 freetype2_pkgconfig=no] elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } freetype2_pkgconfig=no] else FREETYPE2_CFLAGS=$pkg_cv_FREETYPE2_CFLAGS FREETYPE2_LIBS=$pkg_cv_FREETYPE2_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } freetype2_pkgconfig=yes fi if test "x$FREETYPE2" = "xno"; then # Extract the first word of "freetype-config", so it can be a program name with args. set dummy freetype-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_FREETYPE_CONFIG+:} false; then : $as_echo_n "(cached) " >&6 else case $FREETYPE_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_FREETYPE_CONFIG="$FREETYPE_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_FREETYPE_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_FREETYPE_CONFIG" && ac_cv_path_FREETYPE_CONFIG="no" ;; esac fi FREETYPE_CONFIG=$ac_cv_path_FREETYPE_CONFIG if test -n "$FREETYPE_CONFIG"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE_CONFIG" >&5 $as_echo "$FREETYPE_CONFIG" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$FREETYPE_CONFIG" = "xyes"; then FREETYPE2_CFLAGS="`freetype-config --cflags`" FREETYPE2_LIBS="`freetype-config --libs`" fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $FONTCONFIG_LIBS $FREETYPE2_LIBS" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $FONTCONFIG_CFLAGS $FREETYPE2_CFLAGS" for ac_header in byteswap.h do : ac_fn_c_check_header_mongrel "$LINENO" "byteswap.h" "ac_cv_header_byteswap_h" "$ac_includes_default" if test "x$ac_cv_header_byteswap_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_BYTESWAP_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking host threading settings" >&5 $as_echo_n "checking host threading settings... " >&6; } case "$host" in *-*-mingw*|*-*-cygwin*) cat >>confdefs.h <<_ACEOF #define CYGWIN 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gettext in -lintl" >&5 $as_echo_n "checking for gettext in -lintl... " >&6; } if ${ac_cv_lib_intl_gettext+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gettext (); int main () { return gettext (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_gettext=yes else ac_cv_lib_intl_gettext=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_gettext" >&5 $as_echo "$ac_cv_lib_intl_gettext" >&6; } if test "x$ac_cv_lib_intl_gettext" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBINTL 1 _ACEOF LIBS="-lintl $LIBS" fi ;; *-*-*netbsd*) cat >>confdefs.h <<_ACEOF #define BSDOS 1 _ACEOF ;; *-*-*freebsd*) cat >>confdefs.h <<_ACEOF #define BSDOS 1 _ACEOF CFLAGS="-D_THREAD_SAFE $CFLAGS" ;; *-*-*openbsd*) cat >>confdefs.h <<_ACEOF #define BSDOS 1 _ACEOF CFLAGS="$CFLAGS" LIBS="$LIBS" ;; *-*-linux*) cat >>confdefs.h <<_ACEOF #define LINUX 1 _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi ;; *-*-solaris*) cat >>confdefs.h <<_ACEOF #define SOLARIS 1 _ACEOF cat >>confdefs.h <<_ACEOF #define _REENTRANT 1 _ACEOF CFLAGS="-pthreads $CFLAGS" ;; *-*-darwin*) cat >>confdefs.h <<_ACEOF #define OSX 1 _ACEOF CFLAGS="-no-cpp-precomp $CFLAGS" LDFLAGS="-flat_namespace -undefined suppress $LDFLAGS" no_x=yes ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: Unrecognized host $host" >&5 $as_echo "Unrecognized host $host" >&6; } cat >>confdefs.h <<_ACEOF #define OTHEROS 1 _ACEOF ;; esac # Add xrender here so that we don't fail to find glib if we won't have xrender.pc if test "x$no_x" != "xyes"; then GDIPLUS_LIBS="$GDIPLUS_LIBS `pkg-config --libs xrender `" GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS `pkg-config --cflags xrender `" fi # Apparently for BSD special handling needs to happen # See http://archives/neohapsis.com/archives/openbsd/2001-11/2142.html # by Miod Vallat { $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler recognizes -pthread" >&5 $as_echo_n "checking if compiler recognizes -pthread... " >&6; } if ${myapp_cv_gcc_pthread+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -pthread" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { void *p = pthread_create; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : myapp_cv_gcc_pthread=yes else myapp_cv_gcc_pthread=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CFLAGS=$ac_save_CFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $myapp_cv_gcc_pthread" >&5 $as_echo "$myapp_cv_gcc_pthread" >&6; } if test $myapp_cv_gcc_pthread = yes then myapp_threads="" CFLAGS="$CFLAGS -pthread" else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : myapp_threads=-lpthread else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lc_r" >&5 $as_echo_n "checking for pthread_create in -lc_r... " >&6; } if ${ac_cv_lib_c_r_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lc_r $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_c_r_pthread_create=yes else ac_cv_lib_c_r_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_create" >&5 $as_echo "$ac_cv_lib_c_r_pthread_create" >&6; } if test "x$ac_cv_lib_c_r_pthread_create" = xyes; then : myapp_threads=-lc_r fi fi fi # sigsetjmp is a macro on some platforms, so can't use AC_CHECK_FUNCS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5 $as_echo_n "checking for sigsetjmp... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { sigjmp_buf env; sigsetjmp(env, 0); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : gdip_ok=yes else gdip_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdip_ok" >&5 $as_echo "$gdip_ok" >&6; } if test "$gdip_ok" = "yes"; then $as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h fi # when possible hide stuff we don't want to export { $as_echo "$as_me:${as_lineno-$LINENO}: checking for visibility __attribute__" >&5 $as_echo_n "checking for visibility __attribute__... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { void __attribute__ ((visibility ("hidden"))) doit (void) {} void main () { doit (); } ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : have_visibility_hidden=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else have_visibility_hidden=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext case "$host" in i*86-*-*) case $host_os in solaris*) # On solaris 10 x86, gcc prints a warning saying 'visibility attribute not supported on this configuration; ignored', but linking fails. have_visibility_hidden=no esac ;; esac if test "x$have_visibility_hidden" = "xyes"; then $as_echo "#define HAVE_VISIBILITY_HIDDEN 1" >>confdefs.h fi # Check whether --with-libexif was given. if test "${with_libexif+set}" = set; then : withval=$with_libexif; fi # Check whether --with-libjpeg was given. if test "${with_libjpeg+set}" = set; then : withval=$with_libjpeg; libjpeg_prefix="$withval" else libjpeg_prefix="${prefix}" fi if test x$with_libjpeg != xno && test -z "$LIBJPEG"; then JPEG_CFLAGS="-I${libjpeg_prefix}/include" JPEG_LIBS="-L${libjpeg_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$JPEG_CFLAGS save_libs=$LIBS; LIBS=$JPEG_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_destroy_decompress in -ljpeg" >&5 $as_echo_n "checking for jpeg_destroy_decompress in -ljpeg... " >&6; } if ${ac_cv_lib_jpeg_jpeg_destroy_decompress+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ljpeg $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char jpeg_destroy_decompress (); int main () { return jpeg_destroy_decompress (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_jpeg_jpeg_destroy_decompress=yes else ac_cv_lib_jpeg_jpeg_destroy_decompress=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_destroy_decompress" >&5 $as_echo "$ac_cv_lib_jpeg_jpeg_destroy_decompress" >&6; } if test "x$ac_cv_lib_jpeg_jpeg_destroy_decompress" = xyes; then : jpeg_ok=yes else jpeg_ok=no { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JPEG loader will not be built (JPEG library not found) ***" >&5 $as_echo "$as_me: WARNING: *** JPEG loader will not be built (JPEG library not found) ***" >&2;} fi if test "$jpeg_ok" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeglib.h" >&5 $as_echo_n "checking for jpeglib.h... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #undef PACKAGE #undef VERSION #undef HAVE_STDLIB_H #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : jpeg_ok=yes else jpeg_ok=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $jpeg_ok" >&5 $as_echo "$jpeg_ok" >&6; } if test "$jpeg_ok" = yes; then JPEG='jpeg'; LIBJPEG='-L${libjpeg_prefix}/lib -ljpeg' else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** JPEG loader will not be built (JPEG header file not found) ***" >&5 $as_echo "$as_me: WARNING: *** JPEG loader will not be built (JPEG header file not found) ***" >&2;} fi fi CFLAGS=$save_cflags LIBS=$save_libs fi if test x$JPEG != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBJPEG" $as_echo "#define HAVE_LIBJPEG 1" >>confdefs.h else jpeg_ok="no (Get it from http://freshmeat.net/projects/libjpeg)" fi # Check whether --with-libtiff was given. if test "${with_libtiff+set}" = set; then : withval=$with_libtiff; libtiff_prefix="$withval" else libtiff_prefix="${prefix}" fi if test x$with_libtiff != xno && test -z "$LIBTIFF"; then TIFF_CFLAGS="-I${libjpeg_prefix}/include -I${libtiff_prefix}/include" TIFF_LIBS="-L${libjpeg_prefix}/lib -L${libtiff_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$TIFF_CFLAGS save_libs=$LIBS; LIBS=$TIFF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFReadScanline in -ltiff" >&5 $as_echo_n "checking for TIFFReadScanline in -ltiff... " >&6; } if ${ac_cv_lib_tiff_TIFFReadScanline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFReadScanline (); int main () { return TIFFReadScanline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff_TIFFReadScanline=yes else ac_cv_lib_tiff_TIFFReadScanline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFReadScanline" >&5 $as_echo "$ac_cv_lib_tiff_TIFFReadScanline" >&6; } if test "x$ac_cv_lib_tiff_TIFFReadScanline" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" if test "x$ac_cv_header_tiffio_h" = xyes; then : TIFF='tiff'; LIBTIFF='-ltiff'; tiff_ok=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&5 $as_echo "$as_me: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFWriteScanline in -ltiff" >&5 $as_echo_n "checking for TIFFWriteScanline in -ltiff... " >&6; } if ${ac_cv_lib_tiff_TIFFWriteScanline+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff -ljpeg -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFWriteScanline (); int main () { return TIFFWriteScanline (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff_TIFFWriteScanline=yes else ac_cv_lib_tiff_TIFFWriteScanline=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff_TIFFWriteScanline" >&5 $as_echo "$ac_cv_lib_tiff_TIFFWriteScanline" >&6; } if test "x$ac_cv_lib_tiff_TIFFWriteScanline" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" if test "x$ac_cv_header_tiffio_h" = xyes; then : TIFF='tiff'; LIBTIFF='-ltiff -ljpeg -lz'; tiff_ok=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&5 $as_echo "$as_me: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIFFFlushData in -ltiff34" >&5 $as_echo_n "checking for TIFFFlushData in -ltiff34... " >&6; } if ${ac_cv_lib_tiff34_TIFFFlushData+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltiff34 -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char TIFFFlushData (); int main () { return TIFFFlushData (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_tiff34_TIFFFlushData=yes else ac_cv_lib_tiff34_TIFFFlushData=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_tiff34_TIFFFlushData" >&5 $as_echo "$ac_cv_lib_tiff34_TIFFFlushData" >&6; } if test "x$ac_cv_lib_tiff34_TIFFFlushData" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default" if test "x$ac_cv_header_tiffio_h" = xyes; then : TIFF='tiff'; LIBTIFF='-ltiff34 -ljpeg -lz'; tiff_ok=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&5 $as_echo "$as_me: WARNING: *** TIFF loader will not be built (TIFF header files not found) ***" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** TIFF plug-in will not be built (TIFF library not found) ***" >&5 $as_echo "$as_me: WARNING: *** TIFF plug-in will not be built (TIFF library not found) ***" >&2;} fi fi fi CFLAGS=$save_cflags LIBS=$save_libs fi if test x$TIFF != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBTIFF" $as_echo "#define HAVE_LIBTIFF 1" >>confdefs.h else tiff_ok="no (Get it from http://www.libtiff.org/)" fi # Check whether --with-libgif was given. if test "${with_libgif+set}" = set; then : withval=$with_libgif; libgif_prefix="$withval" else libgif_prefix="${prefix}" fi if test x$with_libgif != xno && test -z "$LIBGIF"; then GIF_CFLAGS="-I${libgif_prefix}/include" GIF_LIBS="-L${libgif_prefix}/lib" save_cflags=$CFLAGS; CFLAGS=$GIF_CFLAGS save_libs=$LIBS; LIBS=$GIF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpenFileName in -lgif" >&5 $as_echo_n "checking for DGifOpenFileName in -lgif... " >&6; } if ${ac_cv_lib_gif_DGifOpenFileName+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgif $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFileName (); int main () { return DGifOpenFileName (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_gif_DGifOpenFileName=yes else ac_cv_lib_gif_DGifOpenFileName=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gif_DGifOpenFileName" >&5 $as_echo "$ac_cv_lib_gif_DGifOpenFileName" >&6; } if test "x$ac_cv_lib_gif_DGifOpenFileName" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "gif_lib.h" "ac_cv_header_gif_lib_h" "$ac_includes_default" if test "x$ac_cv_header_gif_lib_h" = xyes; then : GIF='gif'; LIBGIF='-lgif'; gif_ok=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** GIF loader will not be built (giflibrary not found) ***" >&5 $as_echo "$as_me: WARNING: *** GIF loader will not be built (giflibrary not found) ***" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** GIF loader will not be built (giflibrary not found) ***" >&5 $as_echo "$as_me: WARNING: *** GIF loader will not be built (giflibrary not found) ***" >&2;} fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DGifOpenFileName in -lungif" >&5 $as_echo_n "checking for DGifOpenFileName in -lungif... " >&6; } if ${ac_cv_lib_ungif_DGifOpenFileName+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lungif $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char DGifOpenFileName (); int main () { return DGifOpenFileName (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ungif_DGifOpenFileName=yes else ac_cv_lib_ungif_DGifOpenFileName=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ungif_DGifOpenFileName" >&5 $as_echo "$ac_cv_lib_ungif_DGifOpenFileName" >&6; } if test "x$ac_cv_lib_ungif_DGifOpenFileName" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "gif_lib.h" "ac_cv_header_gif_lib_h" "$ac_includes_default" if test "x$ac_cv_header_gif_lib_h" = xyes; then : GIF='ungif'; LIBGIF='-lungif'; gif_ok=yes else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** GIF loader will not be built (ungiflibrary not found) ***" >&5 $as_echo "$as_me: WARNING: *** GIF loader will not be built (ungiflibrary not found) ***" >&2;} fi else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** GIF loader will not be built (ungiflibrary not found) ***" >&5 $as_echo "$as_me: WARNING: *** GIF loader will not be built (ungiflibrary not found) ***" >&2;} fi CFLAGS=$save_cflags LIBS=$save_libs fi if test x$GIF != x; then GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBGIF" $as_echo "#define HAVE_LIBGIF 1" >>confdefs.h else gif_ok="no (See http://sourceforge.net/projects/libgif)" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpng14" >&5 $as_echo_n "checking for libpng14... " >&6; } if $PKG_CONFIG --exists libpng14 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } PNG='png' PNG_DEP_CFLAGS_PACKAGES=libpng14 LIBPNG=`$PKG_CONFIG --libs libpng14` else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libpng12" >&5 $as_echo_n "checking for libpng12... " >&6; } if $PKG_CONFIG --exists libpng12 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } PNG='png' PNG_DEP_CFLAGS_PACKAGES=libpng12 LIBPNG=`$PKG_CONFIG --libs libpng12` else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_read_info in -lpng" >&5 $as_echo_n "checking for png_read_info in -lpng... " >&6; } if ${ac_cv_lib_png_png_read_info+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpng -lz -lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char png_read_info (); int main () { return png_read_info (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_png_png_read_info=yes else ac_cv_lib_png_png_read_info=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_read_info" >&5 $as_echo "$ac_cv_lib_png_png_read_info" >&6; } if test "x$ac_cv_lib_png_png_read_info" = xyes; then : ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default" if test "x$ac_cv_header_png_h" = xyes; then : png_ok=yes else png_ok=no fi else as_fn_error $? "*** libpng12 not found. See http://www.libpng.org/pub/png/libpng.html." "$LINENO" 5 fi if test "$png_ok" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_structp in png.h" >&5 $as_echo_n "checking for png_structp in png.h... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { png_structp pp; png_infop info; png_colorp cmap; png_create_read_struct; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : png_ok=yes else png_ok=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $png_ok" >&5 $as_echo "$png_ok" >&6; } if test "$png_ok" = yes; then PNG='png'; LIBPNG='-lpng -lz' else as_fn_error but it is too old. See http://www.libpng.org/pub/png/libpng.html. "*** libpng12 found" "$LINENO" 5 fi else as_fn_error $? "*** libpng12 not found. See http://www.libpng.org/pub/png/libpng.html." "$LINENO" 5 fi fi fi GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBPNG" $as_echo "#define HAVE_LIBPNG 1" >>confdefs.h if test x$with_libexif != xno && test -z "$LIBEXIF"; then pkg_failed=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBEXIF" >&5 $as_echo_n "checking for LIBEXIF... " >&6; } if test -n "$LIBEXIF_CFLAGS"; then pkg_cv_LIBEXIF_CFLAGS="$LIBEXIF_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexif\""; } >&5 ($PKG_CONFIG --exists --print-errors "libexif") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBEXIF_CFLAGS=`$PKG_CONFIG --cflags "libexif" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBEXIF_LIBS"; then pkg_cv_LIBEXIF_LIBS="$LIBEXIF_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexif\""; } >&5 ($PKG_CONFIG --exists --print-errors "libexif") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBEXIF_LIBS=`$PKG_CONFIG --libs "libexif" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test $pkg_failed = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then LIBEXIF_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libexif" 2>&1` else LIBEXIF_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libexif" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBEXIF_PKG_ERRORS" >&5 libexif_pkgconfig=no] elif test $pkg_failed = untried; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } libexif_pkgconfig=no] else LIBEXIF_CFLAGS=$pkg_cv_LIBEXIF_CFLAGS LIBEXIF_LIBS=$pkg_cv_LIBEXIF_LIBS { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } libexif_pkgconfig=yes fi if test x$libexif_pkgconfig = xyes ; then GDIPLUS_CFLAGS="$GDIPLUS_CFLAGS $LIBEXIF_CFLAGS" GDIPLUS_LIBS="$GDIPLUS_LIBS $LIBEXIF_LIBS" $as_echo "#define HAVE_LIBEXIF 1" >>confdefs.h else libexif_pkgconfig="No. Get it from http://libexif.sourceforge.net/" fi else libexif_pkgconfig="No. You disabled it." fi if test x$libexif_pkgconfig = xyes; then HAVE_LIBEXIF_TRUE= HAVE_LIBEXIF_FALSE='#' else HAVE_LIBEXIF_TRUE='#' HAVE_LIBEXIF_FALSE= fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : x11_failed=false else x11_failed=true fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if $x11_failed; then as_fn_error $? "\"Failed to compile with X11/Xlib.h include. You must fix your compiler paths\"" "$LINENO" 5 fi GDIPLUS_PKG_LIBS="$GDIPLUS_LIBS" GDIPLUS_PKG_CFLAGS="$GDIPLUS_CFLAGS" ac_config_files="$ac_config_files Makefile libgdiplus.pc libgdiplus0.spec src/Makefile tests/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_LIBEXIF_TRUE}" && test -z "${HAVE_LIBEXIF_FALSE}"; then as_fn_error $? "conditional \"HAVE_LIBEXIF\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by libgdiplus $as_me 2.11, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ libgdiplus config.status 2.11 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ nm_file_list_spec \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ sys_lib_dlsearch_path_spec; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' xsi_shell='$xsi_shell' lt_shell_append='$lt_shell_append' # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' TIMESTAMP='$TIMESTAMP' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "libgdiplus.pc") CONFIG_FILES="$CONFIG_FILES libgdiplus.pc" ;; "libgdiplus0.spec") CONFIG_FILES="$CONFIG_FILES libgdiplus0.spec" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options which allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}" ; then setopt NO_GLOB_SUBST fi cfgfile="${ofile}T" trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. # Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, # 2006, 2007, 2008, 2009, 2010, 2011 Free Software # Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # This file is part of GNU Libtool. # # GNU Libtool is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of # the License, or (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Libtool; see the file COPYING. If not, a copy # can be downloaded from http://www.gnu.org/licenses/gpl.html, or # obtained by writing to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # The names of the tagged configurations supported by this script. available_tags="" # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and in which our libraries should be installed. lt_sysroot=$lt_sysroot # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # ### END LIBTOOL CONFIG _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test "X${COLLECT_NAMES+set}" != Xset; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain="$ac_aux_dir/ltmain.sh" # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) if test x"$xsi_shell" = xyes; then sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ func_dirname ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ } # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_basename ()$/,/^} # func_basename /c\ func_basename ()\ {\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ func_dirname_and_basename ()\ {\ \ case ${1} in\ \ */*) func_dirname_result="${1%/*}${2}" ;;\ \ * ) func_dirname_result="${3}" ;;\ \ esac\ \ func_basename_result="${1##*/}"\ } # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ func_stripname ()\ {\ \ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ \ # positional parameters, so assign one to ordinary parameter first.\ \ func_stripname_result=${3}\ \ func_stripname_result=${func_stripname_result#"${1}"}\ \ func_stripname_result=${func_stripname_result%"${2}"}\ } # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ func_split_long_opt ()\ {\ \ func_split_long_opt_name=${1%%=*}\ \ func_split_long_opt_arg=${1#*=}\ } # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ func_split_short_opt ()\ {\ \ func_split_short_opt_arg=${1#??}\ \ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ } # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ func_lo2o ()\ {\ \ case ${1} in\ \ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ \ *) func_lo2o_result=${1} ;;\ \ esac\ } # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_xform ()$/,/^} # func_xform /c\ func_xform ()\ {\ func_xform_result=${1%.*}.lo\ } # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_arith ()$/,/^} # func_arith /c\ func_arith ()\ {\ func_arith_result=$(( $* ))\ } # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_len ()$/,/^} # func_len /c\ func_len ()\ {\ func_len_result=${#1}\ } # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$lt_shell_append" = xyes; then sed -e '/^func_append ()$/,/^} # func_append /c\ func_append ()\ {\ eval "${1}+=\\${2}"\ } # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ func_append_quoted ()\ {\ \ func_quote_for_eval "${2}"\ \ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ } # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: # Save a `func_append' function call where possible by direct use of '+=' sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: else # Save a `func_append' function call even when '+=' is not available sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ && mv -f "$cfgfile.tmp" "$cfgfile" \ || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") test 0 -eq $? || _lt_function_replace_fail=: fi if test x"$_lt_function_replace_fail" = x":"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5 $as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} fi mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error $? "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "---" echo "Configuration summary" echo "" echo " * Installation prefix = $prefix" echo " * Cairo = $cairo_info" echo " * Text = $text_v" echo " * EXIF tags = $libexif_pkgconfig" echo " * Codecs supported:" echo "" echo " - TIFF: $tiff_ok" echo " - JPEG: $jpeg_ok" echo " - GIF: $gif_ok" echo " - PNG: yes" echo "" echo " NOTE: if any of the above say 'no' you may install the" echo " corresponding development packages for them, rerun" echo " autogen.sh to include them in the build." echo "" echo "---" libgdiplus-2.11/libgdiplus.pc.in0000664000175000017500000000044012225470167013611 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libgdiplus Description: GDI+ implementation Version: @VERSION@ Requires: glib-2.0 gmodule-2.0 gthread-2.0 Libs: -L${libdir} -lgdiplus @GDIPLUS_PKG_LIBS@ Cflags: -I${includedir} @GDIPLUS_PKG_CFLAGS@